This is doc/gccint.info, produced by makeinfo version 4.13 from
/tmp/build-mingw64-toolchain-digit/src/gcc-4.8.1/gcc/doc/gccint.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
* gccint: (gccint).            Internals of the GNU Compiler Collection.
END-INFO-DIR-ENTRY
 This file documents the internals 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: gccint.info,  Node: Top,  Next: Contributing,  Up: (DIR)

Introduction
************

This manual documents 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.  It corresponds to the compilers
(GCC) version 4.8.1.  The use of the GNU compilers is documented in a
separate manual.  *Note Introduction: (gcc)Top.

 This manual is mainly a reference manual rather than a tutorial.  It
discusses how to contribute to GCC (*note Contributing::), the
characteristics of the machines supported by GCC as hosts and targets
(*note Portability::), how GCC relates to the ABIs on such systems
(*note Interface::), and the characteristics of the languages for which
GCC front ends are written (*note Languages::).  It then describes the
GCC source tree structure and build system, some of the interfaces to
GCC front ends, and how support for a target system is implemented in
GCC.

 Additional tutorial information is linked to from
`http://gcc.gnu.org/readings.html'.

* Menu:

* Contributing::    How to contribute to testing and developing GCC.
* Portability::     Goals of GCC's portability features.
* Interface::       Function-call interface of GCC output.
* Libgcc::          Low-level runtime library used by GCC.
* Languages::       Languages for which GCC front ends are written.
* Source Tree::     GCC source tree structure and build system.
* Testsuites::      GCC testsuites.
* Options::         Option specification files.
* Passes::          Order of passes, what they do, and what each file is for.
* GENERIC::         Language-independent representation generated by Front Ends
* GIMPLE::          Tuple representation used by Tree SSA optimizers
* Tree SSA::        Analysis and optimization of GIMPLE
* RTL::             Machine-dependent low-level intermediate representation.
* Control Flow::    Maintaining and manipulating the control flow graph.
* Loop Analysis and Representation:: Analysis and representation of loops
* Machine Desc::    How to write machine description instruction patterns.
* Target Macros::   How to write the machine description C macros and functions.
* Host Config::     Writing the `xm-MACHINE.h' file.
* Fragments::       Writing the `t-TARGET' and `x-HOST' files.
* Collect2::        How `collect2' works; how it finds `ld'.
* Header Dirs::     Understanding the standard header file directories.
* Type Information:: GCC's memory management; generating type information.
* Plugins::         Extending the compiler with plugins.
* LTO::             Using Link-Time Optimization.

* 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.
* Concept Index::   Index of concepts and symbol names.


File: gccint.info,  Node: Contributing,  Next: Portability,  Prev: Top,  Up: Top

1 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: gccint.info,  Node: Portability,  Next: Interface,  Prev: Contributing,  Up: Top

2 GCC and Portability
*********************

GCC itself aims to be portable to any machine where `int' is at least a
32-bit type.  It aims to target machines with a flat (non-segmented)
byte addressed data address space (the code address space can be
separate).  Target ABIs may have 8, 16, 32 or 64-bit `int' type.  `char'
can be wider than 8 bits.

 GCC gets most of the information about the target machine from a
machine description which gives an algebraic formula for each of the
machine's instructions.  This is a very clean way to describe the
target.  But when the compiler needs information that is difficult to
express in this fashion, ad-hoc parameters have been defined for
machine descriptions.  The purpose of portability is to reduce the
total work needed on the compiler; it was not of interest for its own
sake.

 GCC does not contain machine dependent code, but it does contain code
that depends on machine parameters such as endianness (whether the most
significant byte has the highest or lowest address of the bytes in a
word) and the availability of autoincrement addressing.  In the
RTL-generation pass, it is often necessary to have multiple strategies
for generating code for a particular kind of syntax tree, strategies
that are usable for different combinations of parameters.  Often, not
all possible cases have been addressed, but only the common ones or
only the ones that have been encountered.  As a result, a new target
may require additional strategies.  You will know if this happens
because the compiler will call `abort'.  Fortunately, the new
strategies can be added in a machine-independent fashion, and will
affect only the target machines that need them.


File: gccint.info,  Node: Interface,  Next: Libgcc,  Prev: Portability,  Up: Top

3 Interfacing to GCC Output
***************************

GCC is normally configured to use the same function calling convention
normally in use on the target system.  This is done with the
machine-description macros described (*note Target Macros::).

 However, returning of structure and union values is done differently on
some target machines.  As a result, functions compiled with PCC
returning such types cannot be called from code compiled with GCC, and
vice versa.  This does not cause trouble often because few Unix library
routines return structures or unions.

 GCC code returns structures and unions that are 1, 2, 4 or 8 bytes
long in the same registers used for `int' or `double' return values.
(GCC typically allocates variables of such types in registers also.)
Structures and unions of other sizes are returned by storing them into
an address passed by the caller (usually in a register).  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.  This is slower than the method used by GCC, and
fails to be reentrant.

 On some target machines, such as RISC machines and the 80386, the
standard system convention is to pass to the subroutine the address of
where to return the value.  On these machines, GCC has been configured
to be compatible with the standard compiler, when this method is used.
It may not be compatible for structures of 1, 2, 4 or 8 bytes.

 GCC uses the system's standard convention for passing arguments.  On
some machines, the first few arguments are passed in registers; in
others, all are passed on the stack.  It would be possible to use
registers for argument passing on any machine, and this would probably
result in a significant speedup.  But the result would be complete
incompatibility with code that follows the standard convention.  So this
change is practical only if you are switching to GCC as the sole C
compiler for the system.  We may implement register argument passing on
certain machines once we have a complete GNU system so that we can
compile the libraries with GCC.

 On some machines (particularly the SPARC), certain types of arguments
are passed "by invisible reference".  This means that the value is
stored in memory, and the address of the memory location is passed to
the subroutine.

 If you use `longjmp', beware of automatic variables.  ISO C says that
automatic variables that are not declared `volatile' have undefined
values after a `longjmp'.  And this is all GCC promises to do, because
it is very difficult to restore register variables correctly, and one
of GCC's features is that it can put variables in registers without
your asking it to.


File: gccint.info,  Node: Libgcc,  Next: Languages,  Prev: Interface,  Up: Top

4 The GCC low-level runtime library
***********************************

GCC provides a low-level runtime library, `libgcc.a' or `libgcc_s.so.1'
on some platforms.  GCC generates calls to routines in this library
automatically, whenever it needs to perform some operation that is too
complicated to emit inline code for.

 Most of the routines in `libgcc' handle arithmetic operations that the
target processor cannot perform directly.  This includes integer
multiply and divide on some machines, and all floating-point and
fixed-point operations on other machines.  `libgcc' also includes
routines for exception handling, and a handful of miscellaneous
operations.

 Some of these routines can be defined in mostly machine-independent C.
Others must be hand-written in assembly language for each processor
that needs them.

 GCC will also generate calls to C library routines, such as `memcpy'
and `memset', in some cases.  The set of routines that GCC may possibly
use is documented in *note Other Builtins: (gcc)Other Builtins.

 These routines take arguments and return values of a specific machine
mode, not a specific C type.  *Note Machine Modes::, for an explanation
of this concept.  For illustrative purposes, in this chapter the
floating point type `float' is assumed to correspond to `SFmode';
`double' to `DFmode'; and `long double' to both `TFmode' and `XFmode'.
Similarly, the integer types `int' and `unsigned int' correspond to
`SImode'; `long' and `unsigned long' to `DImode'; and `long long' and
`unsigned long long' to `TImode'.

* Menu:

* Integer library routines::
* Soft float library routines::
* Decimal float library routines::
* Fixed-point fractional library routines::
* Exception handling routines::
* Miscellaneous routines::


File: gccint.info,  Node: Integer library routines,  Next: Soft float library routines,  Up: Libgcc

4.1 Routines for integer arithmetic
===================================

The integer arithmetic routines are used on platforms that don't provide
hardware support for arithmetic operations on some modes.

4.1.1 Arithmetic functions
--------------------------

 -- Runtime Function: int __ashlsi3 (int A, int B)
 -- Runtime Function: long __ashldi3 (long A, int B)
 -- Runtime Function: long long __ashlti3 (long long A, int B)
     These functions return the result of shifting A left by B bits.

 -- Runtime Function: int __ashrsi3 (int A, int B)
 -- Runtime Function: long __ashrdi3 (long A, int B)
 -- Runtime Function: long long __ashrti3 (long long A, int B)
     These functions return the result of arithmetically shifting A
     right by B bits.

 -- Runtime Function: int __divsi3 (int A, int B)
 -- Runtime Function: long __divdi3 (long A, long B)
 -- Runtime Function: long long __divti3 (long long A, long long B)
     These functions return the quotient of the signed division of A and
     B.

 -- Runtime Function: int __lshrsi3 (int A, int B)
 -- Runtime Function: long __lshrdi3 (long A, int B)
 -- Runtime Function: long long __lshrti3 (long long A, int B)
     These functions return the result of logically shifting A right by
     B bits.

 -- Runtime Function: int __modsi3 (int A, int B)
 -- Runtime Function: long __moddi3 (long A, long B)
 -- Runtime Function: long long __modti3 (long long A, long long B)
     These functions return the remainder of the signed division of A
     and B.

 -- Runtime Function: int __mulsi3 (int A, int B)
 -- Runtime Function: long __muldi3 (long A, long B)
 -- Runtime Function: long long __multi3 (long long A, long long B)
     These functions return the product of A and B.

 -- Runtime Function: long __negdi2 (long A)
 -- Runtime Function: long long __negti2 (long long A)
     These functions return the negation of A.

 -- Runtime Function: unsigned int __udivsi3 (unsigned int A, unsigned
          int B)
 -- Runtime Function: unsigned long __udivdi3 (unsigned long A,
          unsigned long B)
 -- Runtime Function: unsigned long long __udivti3 (unsigned long long
          A, unsigned long long B)
     These functions return the quotient of the unsigned division of A
     and B.

 -- Runtime Function: unsigned long __udivmoddi4 (unsigned long A,
          unsigned long B, unsigned long *C)
 -- Runtime Function: unsigned long long __udivmodti4 (unsigned long
          long A, unsigned long long B, unsigned long long *C)
     These functions calculate both the quotient and remainder of the
     unsigned division of A and B.  The return value is the quotient,
     and the remainder is placed in variable pointed to by C.

 -- Runtime Function: unsigned int __umodsi3 (unsigned int A, unsigned
          int B)
 -- Runtime Function: unsigned long __umoddi3 (unsigned long A,
          unsigned long B)
 -- Runtime Function: unsigned long long __umodti3 (unsigned long long
          A, unsigned long long B)
     These functions return the remainder of the unsigned division of A
     and B.

4.1.2 Comparison functions
--------------------------

The following functions implement integral comparisons.  These functions
implement a low-level compare, upon which the higher level comparison
operators (such as less than and greater than or equal to) can be
constructed.  The returned values lie in the range zero to two, to allow
the high-level operators to be implemented by testing the returned
result using either signed or unsigned comparison.

 -- Runtime Function: int __cmpdi2 (long A, long B)
 -- Runtime Function: int __cmpti2 (long long A, long long B)
     These functions perform a signed comparison of A and B.  If A is
     less than B, they return 0; if A is greater than B, they return 2;
     and if A and B are equal they return 1.

 -- Runtime Function: int __ucmpdi2 (unsigned long A, unsigned long B)
 -- Runtime Function: int __ucmpti2 (unsigned long long A, unsigned
          long long B)
     These functions perform an unsigned comparison of A and B.  If A
     is less than B, they return 0; if A is greater than B, they return
     2; and if A and B are equal they return 1.

4.1.3 Trapping arithmetic functions
-----------------------------------

The following functions implement trapping arithmetic.  These functions
call the libc function `abort' upon signed arithmetic overflow.

 -- Runtime Function: int __absvsi2 (int A)
 -- Runtime Function: long __absvdi2 (long A)
     These functions return the absolute value of A.

 -- Runtime Function: int __addvsi3 (int A, int B)
 -- Runtime Function: long __addvdi3 (long A, long B)
     These functions return the sum of A and B; that is `A + B'.

 -- Runtime Function: int __mulvsi3 (int A, int B)
 -- Runtime Function: long __mulvdi3 (long A, long B)
     The functions return the product of A and B; that is `A * B'.

 -- Runtime Function: int __negvsi2 (int A)
 -- Runtime Function: long __negvdi2 (long A)
     These functions return the negation of A; that is `-A'.

 -- Runtime Function: int __subvsi3 (int A, int B)
 -- Runtime Function: long __subvdi3 (long A, long B)
     These functions return the difference between B and A; that is `A
     - B'.

4.1.4 Bit operations
--------------------

 -- Runtime Function: int __clzsi2 (int A)
 -- Runtime Function: int __clzdi2 (long A)
 -- Runtime Function: int __clzti2 (long long A)
     These functions return the number of leading 0-bits in A, starting
     at the most significant bit position.  If A is zero, the result is
     undefined.

 -- Runtime Function: int __ctzsi2 (int A)
 -- Runtime Function: int __ctzdi2 (long A)
 -- Runtime Function: int __ctzti2 (long long A)
     These functions return the number of trailing 0-bits in A, starting
     at the least significant bit position.  If A is zero, the result is
     undefined.

 -- Runtime Function: int __ffsdi2 (long A)
 -- Runtime Function: int __ffsti2 (long long A)
     These functions return the index of the least significant 1-bit in
     A, or the value zero if A is zero.  The least significant bit is
     index one.

 -- Runtime Function: int __paritysi2 (int A)
 -- Runtime Function: int __paritydi2 (long A)
 -- Runtime Function: int __parityti2 (long long A)
     These functions return the value zero if the number of bits set in
     A is even, and the value one otherwise.

 -- Runtime Function: int __popcountsi2 (int A)
 -- Runtime Function: int __popcountdi2 (long A)
 -- Runtime Function: int __popcountti2 (long long A)
     These functions return the number of bits set in A.

 -- Runtime Function: int32_t __bswapsi2 (int32_t A)
 -- Runtime Function: int64_t __bswapdi2 (int64_t A)
     These functions return the A byteswapped.


File: gccint.info,  Node: Soft float library routines,  Next: Decimal float library routines,  Prev: Integer library routines,  Up: Libgcc

4.2 Routines for floating point emulation
=========================================

The software floating point library is used on machines which do not
have hardware support for floating point.  It is also used whenever
`-msoft-float' is used to disable generation of floating point
instructions.  (Not all targets support this switch.)

 For compatibility with other compilers, the floating point emulation
routines can be renamed with the `DECLARE_LIBRARY_RENAMES' macro (*note
Library Calls::).  In this section, the default names are used.

 Presently the library does not support `XFmode', which is used for
`long double' on some architectures.

4.2.1 Arithmetic functions
--------------------------

 -- Runtime Function: float __addsf3 (float A, float B)
 -- Runtime Function: double __adddf3 (double A, double B)
 -- Runtime Function: long double __addtf3 (long double A, long double
          B)
 -- Runtime Function: long double __addxf3 (long double A, long double
          B)
     These functions return the sum of A and B.

 -- Runtime Function: float __subsf3 (float A, float B)
 -- Runtime Function: double __subdf3 (double A, double B)
 -- Runtime Function: long double __subtf3 (long double A, long double
          B)
 -- Runtime Function: long double __subxf3 (long double A, long double
          B)
     These functions return the difference between B and A; that is,
     A - B.

 -- Runtime Function: float __mulsf3 (float A, float B)
 -- Runtime Function: double __muldf3 (double A, double B)
 -- Runtime Function: long double __multf3 (long double A, long double
          B)
 -- Runtime Function: long double __mulxf3 (long double A, long double
          B)
     These functions return the product of A and B.

 -- Runtime Function: float __divsf3 (float A, float B)
 -- Runtime Function: double __divdf3 (double A, double B)
 -- Runtime Function: long double __divtf3 (long double A, long double
          B)
 -- Runtime Function: long double __divxf3 (long double A, long double
          B)
     These functions return the quotient of A and B; that is, A / B.

 -- Runtime Function: float __negsf2 (float A)
 -- Runtime Function: double __negdf2 (double A)
 -- Runtime Function: long double __negtf2 (long double A)
 -- Runtime Function: long double __negxf2 (long double A)
     These functions return the negation of A.  They simply flip the
     sign bit, so they can produce negative zero and negative NaN.

4.2.2 Conversion functions
--------------------------

 -- Runtime Function: double __extendsfdf2 (float A)
 -- Runtime Function: long double __extendsftf2 (float A)
 -- Runtime Function: long double __extendsfxf2 (float A)
 -- Runtime Function: long double __extenddftf2 (double A)
 -- Runtime Function: long double __extenddfxf2 (double A)
     These functions extend A to the wider mode of their return type.

 -- Runtime Function: double __truncxfdf2 (long double A)
 -- Runtime Function: double __trunctfdf2 (long double A)
 -- Runtime Function: float __truncxfsf2 (long double A)
 -- Runtime Function: float __trunctfsf2 (long double A)
 -- Runtime Function: float __truncdfsf2 (double A)
     These functions truncate A to the narrower mode of their return
     type, rounding toward zero.

 -- Runtime Function: int __fixsfsi (float A)
 -- Runtime Function: int __fixdfsi (double A)
 -- Runtime Function: int __fixtfsi (long double A)
 -- Runtime Function: int __fixxfsi (long double A)
     These functions convert A to a signed integer, rounding toward
     zero.

 -- Runtime Function: long __fixsfdi (float A)
 -- Runtime Function: long __fixdfdi (double A)
 -- Runtime Function: long __fixtfdi (long double A)
 -- Runtime Function: long __fixxfdi (long double A)
     These functions convert A to a signed long, rounding toward zero.

 -- Runtime Function: long long __fixsfti (float A)
 -- Runtime Function: long long __fixdfti (double A)
 -- Runtime Function: long long __fixtfti (long double A)
 -- Runtime Function: long long __fixxfti (long double A)
     These functions convert A to a signed long long, rounding toward
     zero.

 -- Runtime Function: unsigned int __fixunssfsi (float A)
 -- Runtime Function: unsigned int __fixunsdfsi (double A)
 -- Runtime Function: unsigned int __fixunstfsi (long double A)
 -- Runtime Function: unsigned int __fixunsxfsi (long double A)
     These functions convert A to an unsigned integer, rounding toward
     zero.  Negative values all become zero.

 -- Runtime Function: unsigned long __fixunssfdi (float A)
 -- Runtime Function: unsigned long __fixunsdfdi (double A)
 -- Runtime Function: unsigned long __fixunstfdi (long double A)
 -- Runtime Function: unsigned long __fixunsxfdi (long double A)
     These functions convert A to an unsigned long, rounding toward
     zero.  Negative values all become zero.

 -- Runtime Function: unsigned long long __fixunssfti (float A)
 -- Runtime Function: unsigned long long __fixunsdfti (double A)
 -- Runtime Function: unsigned long long __fixunstfti (long double A)
 -- Runtime Function: unsigned long long __fixunsxfti (long double A)
     These functions convert A to an unsigned long long, rounding
     toward zero.  Negative values all become zero.

 -- Runtime Function: float __floatsisf (int I)
 -- Runtime Function: double __floatsidf (int I)
 -- Runtime Function: long double __floatsitf (int I)
 -- Runtime Function: long double __floatsixf (int I)
     These functions convert I, a signed integer, to floating point.

 -- Runtime Function: float __floatdisf (long I)
 -- Runtime Function: double __floatdidf (long I)
 -- Runtime Function: long double __floatditf (long I)
 -- Runtime Function: long double __floatdixf (long I)
     These functions convert I, a signed long, to floating point.

 -- Runtime Function: float __floattisf (long long I)
 -- Runtime Function: double __floattidf (long long I)
 -- Runtime Function: long double __floattitf (long long I)
 -- Runtime Function: long double __floattixf (long long I)
     These functions convert I, a signed long long, to floating point.

 -- Runtime Function: float __floatunsisf (unsigned int I)
 -- Runtime Function: double __floatunsidf (unsigned int I)
 -- Runtime Function: long double __floatunsitf (unsigned int I)
 -- Runtime Function: long double __floatunsixf (unsigned int I)
     These functions convert I, an unsigned integer, to floating point.

 -- Runtime Function: float __floatundisf (unsigned long I)
 -- Runtime Function: double __floatundidf (unsigned long I)
 -- Runtime Function: long double __floatunditf (unsigned long I)
 -- Runtime Function: long double __floatundixf (unsigned long I)
     These functions convert I, an unsigned long, to floating point.

 -- Runtime Function: float __floatuntisf (unsigned long long I)
 -- Runtime Function: double __floatuntidf (unsigned long long I)
 -- Runtime Function: long double __floatuntitf (unsigned long long I)
 -- Runtime Function: long double __floatuntixf (unsigned long long I)
     These functions convert I, an unsigned long long, to floating
     point.

4.2.3 Comparison functions
--------------------------

There are two sets of basic comparison functions.

 -- Runtime Function: int __cmpsf2 (float A, float B)
 -- Runtime Function: int __cmpdf2 (double A, double B)
 -- Runtime Function: int __cmptf2 (long double A, long double B)
     These functions calculate a <=> b.  That is, if A is less than B,
     they return -1; if A is greater than B, they return 1; and if A
     and B are equal they return 0.  If either argument is NaN they
     return 1, but you should not rely on this; if NaN is a
     possibility, use one of the higher-level comparison functions.

 -- Runtime Function: int __unordsf2 (float A, float B)
 -- Runtime Function: int __unorddf2 (double A, double B)
 -- Runtime Function: int __unordtf2 (long double A, long double B)
     These functions return a nonzero value if either argument is NaN,
     otherwise 0.

 There is also a complete group of higher level functions which
correspond directly to comparison operators.  They implement the ISO C
semantics for floating-point comparisons, taking NaN into account.  Pay
careful attention to the return values defined for each set.  Under the
hood, all of these routines are implemented as

       if (__unordXf2 (a, b))
         return E;
       return __cmpXf2 (a, b);

where E is a constant chosen to give the proper behavior for NaN.
Thus, the meaning of the return value is different for each set.  Do
not rely on this implementation; only the semantics documented below
are guaranteed.

 -- Runtime Function: int __eqsf2 (float A, float B)
 -- Runtime Function: int __eqdf2 (double A, double B)
 -- Runtime Function: int __eqtf2 (long double A, long double B)
     These functions return zero if neither argument is NaN, and A and
     B are equal.

 -- Runtime Function: int __nesf2 (float A, float B)
 -- Runtime Function: int __nedf2 (double A, double B)
 -- Runtime Function: int __netf2 (long double A, long double B)
     These functions return a nonzero value if either argument is NaN,
     or if A and B are unequal.

 -- Runtime Function: int __gesf2 (float A, float B)
 -- Runtime Function: int __gedf2 (double A, double B)
 -- Runtime Function: int __getf2 (long double A, long double B)
     These functions return a value greater than or equal to zero if
     neither argument is NaN, and A is greater than or equal to B.

 -- Runtime Function: int __ltsf2 (float A, float B)
 -- Runtime Function: int __ltdf2 (double A, double B)
 -- Runtime Function: int __lttf2 (long double A, long double B)
     These functions return a value less than zero if neither argument
     is NaN, and A is strictly less than B.

 -- Runtime Function: int __lesf2 (float A, float B)
 -- Runtime Function: int __ledf2 (double A, double B)
 -- Runtime Function: int __letf2 (long double A, long double B)
     These functions return a value less than or equal to zero if
     neither argument is NaN, and A is less than or equal to B.

 -- Runtime Function: int __gtsf2 (float A, float B)
 -- Runtime Function: int __gtdf2 (double A, double B)
 -- Runtime Function: int __gttf2 (long double A, long double B)
     These functions return a value greater than zero if neither
     argument is NaN, and A is strictly greater than B.

4.2.4 Other floating-point functions
------------------------------------

 -- Runtime Function: float __powisf2 (float A, int B)
 -- Runtime Function: double __powidf2 (double A, int B)
 -- Runtime Function: long double __powitf2 (long double A, int B)
 -- Runtime Function: long double __powixf2 (long double A, int B)
     These functions convert raise A to the power B.

 -- Runtime Function: complex float __mulsc3 (float A, float B, float
          C, float D)
 -- Runtime Function: complex double __muldc3 (double A, double B,
          double C, double D)
 -- Runtime Function: complex long double __multc3 (long double A, long
          double B, long double C, long double D)
 -- Runtime Function: complex long double __mulxc3 (long double A, long
          double B, long double C, long double D)
     These functions return the product of A + iB and C + iD, following
     the rules of C99 Annex G.

 -- Runtime Function: complex float __divsc3 (float A, float B, float
          C, float D)
 -- Runtime Function: complex double __divdc3 (double A, double B,
          double C, double D)
 -- Runtime Function: complex long double __divtc3 (long double A, long
          double B, long double C, long double D)
 -- Runtime Function: complex long double __divxc3 (long double A, long
          double B, long double C, long double D)
     These functions return the quotient of A + iB and C + iD (i.e., (A
     + iB) / (C + iD)), following the rules of C99 Annex G.


File: gccint.info,  Node: Decimal float library routines,  Next: Fixed-point fractional library routines,  Prev: Soft float library routines,  Up: Libgcc

4.3 Routines for decimal floating point emulation
=================================================

The software decimal floating point library implements IEEE 754-2008
decimal floating point arithmetic and is only activated on selected
targets.

 The software decimal floating point library supports either DPD
(Densely Packed Decimal) or BID (Binary Integer Decimal) encoding as
selected at configure time.

4.3.1 Arithmetic functions
--------------------------

 -- Runtime Function: _Decimal32 __dpd_addsd3 (_Decimal32 A, _Decimal32
          B)
 -- Runtime Function: _Decimal32 __bid_addsd3 (_Decimal32 A, _Decimal32
          B)
 -- Runtime Function: _Decimal64 __dpd_adddd3 (_Decimal64 A, _Decimal64
          B)
 -- Runtime Function: _Decimal64 __bid_adddd3 (_Decimal64 A, _Decimal64
          B)
 -- Runtime Function: _Decimal128 __dpd_addtd3 (_Decimal128 A,
          _Decimal128 B)
 -- Runtime Function: _Decimal128 __bid_addtd3 (_Decimal128 A,
          _Decimal128 B)
     These functions return the sum of A and B.

 -- Runtime Function: _Decimal32 __dpd_subsd3 (_Decimal32 A, _Decimal32
          B)
 -- Runtime Function: _Decimal32 __bid_subsd3 (_Decimal32 A, _Decimal32
          B)
 -- Runtime Function: _Decimal64 __dpd_subdd3 (_Decimal64 A, _Decimal64
          B)
 -- Runtime Function: _Decimal64 __bid_subdd3 (_Decimal64 A, _Decimal64
          B)
 -- Runtime Function: _Decimal128 __dpd_subtd3 (_Decimal128 A,
          _Decimal128 B)
 -- Runtime Function: _Decimal128 __bid_subtd3 (_Decimal128 A,
          _Decimal128 B)
     These functions return the difference between B and A; that is,
     A - B.

 -- Runtime Function: _Decimal32 __dpd_mulsd3 (_Decimal32 A, _Decimal32
          B)
 -- Runtime Function: _Decimal32 __bid_mulsd3 (_Decimal32 A, _Decimal32
          B)
 -- Runtime Function: _Decimal64 __dpd_muldd3 (_Decimal64 A, _Decimal64
          B)
 -- Runtime Function: _Decimal64 __bid_muldd3 (_Decimal64 A, _Decimal64
          B)
 -- Runtime Function: _Decimal128 __dpd_multd3 (_Decimal128 A,
          _Decimal128 B)
 -- Runtime Function: _Decimal128 __bid_multd3 (_Decimal128 A,
          _Decimal128 B)
     These functions return the product of A and B.

 -- Runtime Function: _Decimal32 __dpd_divsd3 (_Decimal32 A, _Decimal32
          B)
 -- Runtime Function: _Decimal32 __bid_divsd3 (_Decimal32 A, _Decimal32
          B)
 -- Runtime Function: _Decimal64 __dpd_divdd3 (_Decimal64 A, _Decimal64
          B)
 -- Runtime Function: _Decimal64 __bid_divdd3 (_Decimal64 A, _Decimal64
          B)
 -- Runtime Function: _Decimal128 __dpd_divtd3 (_Decimal128 A,
          _Decimal128 B)
 -- Runtime Function: _Decimal128 __bid_divtd3 (_Decimal128 A,
          _Decimal128 B)
     These functions return the quotient of A and B; that is, A / B.

 -- Runtime Function: _Decimal32 __dpd_negsd2 (_Decimal32 A)
 -- Runtime Function: _Decimal32 __bid_negsd2 (_Decimal32 A)
 -- Runtime Function: _Decimal64 __dpd_negdd2 (_Decimal64 A)
 -- Runtime Function: _Decimal64 __bid_negdd2 (_Decimal64 A)
 -- Runtime Function: _Decimal128 __dpd_negtd2 (_Decimal128 A)
 -- Runtime Function: _Decimal128 __bid_negtd2 (_Decimal128 A)
     These functions return the negation of A.  They simply flip the
     sign bit, so they can produce negative zero and negative NaN.

4.3.2 Conversion functions
--------------------------

 -- Runtime Function: _Decimal64 __dpd_extendsddd2 (_Decimal32 A)
 -- Runtime Function: _Decimal64 __bid_extendsddd2 (_Decimal32 A)
 -- Runtime Function: _Decimal128 __dpd_extendsdtd2 (_Decimal32 A)
 -- Runtime Function: _Decimal128 __bid_extendsdtd2 (_Decimal32 A)
 -- Runtime Function: _Decimal128 __dpd_extendddtd2 (_Decimal64 A)
 -- Runtime Function: _Decimal128 __bid_extendddtd2 (_Decimal64 A)
 -- Runtime Function: _Decimal32 __dpd_truncddsd2 (_Decimal64 A)
 -- Runtime Function: _Decimal32 __bid_truncddsd2 (_Decimal64 A)
 -- Runtime Function: _Decimal32 __dpd_trunctdsd2 (_Decimal128 A)
 -- Runtime Function: _Decimal32 __bid_trunctdsd2 (_Decimal128 A)
 -- Runtime Function: _Decimal64 __dpd_trunctddd2 (_Decimal128 A)
 -- Runtime Function: _Decimal64 __bid_trunctddd2 (_Decimal128 A)
     These functions convert the value A from one decimal floating type
     to another.

 -- Runtime Function: _Decimal64 __dpd_extendsfdd (float A)
 -- Runtime Function: _Decimal64 __bid_extendsfdd (float A)
 -- Runtime Function: _Decimal128 __dpd_extendsftd (float A)
 -- Runtime Function: _Decimal128 __bid_extendsftd (float A)
 -- Runtime Function: _Decimal128 __dpd_extenddftd (double A)
 -- Runtime Function: _Decimal128 __bid_extenddftd (double A)
 -- Runtime Function: _Decimal128 __dpd_extendxftd (long double A)
 -- Runtime Function: _Decimal128 __bid_extendxftd (long double A)
 -- Runtime Function: _Decimal32 __dpd_truncdfsd (double A)
 -- Runtime Function: _Decimal32 __bid_truncdfsd (double A)
 -- Runtime Function: _Decimal32 __dpd_truncxfsd (long double A)
 -- Runtime Function: _Decimal32 __bid_truncxfsd (long double A)
 -- Runtime Function: _Decimal32 __dpd_trunctfsd (long double A)
 -- Runtime Function: _Decimal32 __bid_trunctfsd (long double A)
 -- Runtime Function: _Decimal64 __dpd_truncxfdd (long double A)
 -- Runtime Function: _Decimal64 __bid_truncxfdd (long double A)
 -- Runtime Function: _Decimal64 __dpd_trunctfdd (long double A)
 -- Runtime Function: _Decimal64 __bid_trunctfdd (long double A)
     These functions convert the value of A from a binary floating type
     to a decimal floating type of a different size.

 -- Runtime Function: float __dpd_truncddsf (_Decimal64 A)
 -- Runtime Function: float __bid_truncddsf (_Decimal64 A)
 -- Runtime Function: float __dpd_trunctdsf (_Decimal128 A)
 -- Runtime Function: float __bid_trunctdsf (_Decimal128 A)
 -- Runtime Function: double __dpd_extendsddf (_Decimal32 A)
 -- Runtime Function: double __bid_extendsddf (_Decimal32 A)
 -- Runtime Function: double __dpd_trunctddf (_Decimal128 A)
 -- Runtime Function: double __bid_trunctddf (_Decimal128 A)
 -- Runtime Function: long double __dpd_extendsdxf (_Decimal32 A)
 -- Runtime Function: long double __bid_extendsdxf (_Decimal32 A)
 -- Runtime Function: long double __dpd_extendddxf (_Decimal64 A)
 -- Runtime Function: long double __bid_extendddxf (_Decimal64 A)
 -- Runtime Function: long double __dpd_trunctdxf (_Decimal128 A)
 -- Runtime Function: long double __bid_trunctdxf (_Decimal128 A)
 -- Runtime Function: long double __dpd_extendsdtf (_Decimal32 A)
 -- Runtime Function: long double __bid_extendsdtf (_Decimal32 A)
 -- Runtime Function: long double __dpd_extendddtf (_Decimal64 A)
 -- Runtime Function: long double __bid_extendddtf (_Decimal64 A)
     These functions convert the value of A from a decimal floating type
     to a binary floating type of a different size.

 -- Runtime Function: _Decimal32 __dpd_extendsfsd (float A)
 -- Runtime Function: _Decimal32 __bid_extendsfsd (float A)
 -- Runtime Function: _Decimal64 __dpd_extenddfdd (double A)
 -- Runtime Function: _Decimal64 __bid_extenddfdd (double A)
 -- Runtime Function: _Decimal128 __dpd_extendtftd (long double A)
 -- Runtime Function: _Decimal128 __bid_extendtftd (long double A)
 -- Runtime Function: float __dpd_truncsdsf (_Decimal32 A)
 -- Runtime Function: float __bid_truncsdsf (_Decimal32 A)
 -- Runtime Function: double __dpd_truncdddf (_Decimal64 A)
 -- Runtime Function: double __bid_truncdddf (_Decimal64 A)
 -- Runtime Function: long double __dpd_trunctdtf (_Decimal128 A)
 -- Runtime Function: long double __bid_trunctdtf (_Decimal128 A)
     These functions convert the value of A between decimal and binary
     floating types of the same size.

 -- Runtime Function: int __dpd_fixsdsi (_Decimal32 A)
 -- Runtime Function: int __bid_fixsdsi (_Decimal32 A)
 -- Runtime Function: int __dpd_fixddsi (_Decimal64 A)
 -- Runtime Function: int __bid_fixddsi (_Decimal64 A)
 -- Runtime Function: int __dpd_fixtdsi (_Decimal128 A)
 -- Runtime Function: int __bid_fixtdsi (_Decimal128 A)
     These functions convert A to a signed integer.

 -- Runtime Function: long __dpd_fixsddi (_Decimal32 A)
 -- Runtime Function: long __bid_fixsddi (_Decimal32 A)
 -- Runtime Function: long __dpd_fixdddi (_Decimal64 A)
 -- Runtime Function: long __bid_fixdddi (_Decimal64 A)
 -- Runtime Function: long __dpd_fixtddi (_Decimal128 A)
 -- Runtime Function: long __bid_fixtddi (_Decimal128 A)
     These functions convert A to a signed long.

 -- Runtime Function: unsigned int __dpd_fixunssdsi (_Decimal32 A)
 -- Runtime Function: unsigned int __bid_fixunssdsi (_Decimal32 A)
 -- Runtime Function: unsigned int __dpd_fixunsddsi (_Decimal64 A)
 -- Runtime Function: unsigned int __bid_fixunsddsi (_Decimal64 A)
 -- Runtime Function: unsigned int __dpd_fixunstdsi (_Decimal128 A)
 -- Runtime Function: unsigned int __bid_fixunstdsi (_Decimal128 A)
     These functions convert A to an unsigned integer.  Negative values
     all become zero.

 -- Runtime Function: unsigned long __dpd_fixunssddi (_Decimal32 A)
 -- Runtime Function: unsigned long __bid_fixunssddi (_Decimal32 A)
 -- Runtime Function: unsigned long __dpd_fixunsdddi (_Decimal64 A)
 -- Runtime Function: unsigned long __bid_fixunsdddi (_Decimal64 A)
 -- Runtime Function: unsigned long __dpd_fixunstddi (_Decimal128 A)
 -- Runtime Function: unsigned long __bid_fixunstddi (_Decimal128 A)
     These functions convert A to an unsigned long.  Negative values
     all become zero.

 -- Runtime Function: _Decimal32 __dpd_floatsisd (int I)
 -- Runtime Function: _Decimal32 __bid_floatsisd (int I)
 -- Runtime Function: _Decimal64 __dpd_floatsidd (int I)
 -- Runtime Function: _Decimal64 __bid_floatsidd (int I)
 -- Runtime Function: _Decimal128 __dpd_floatsitd (int I)
 -- Runtime Function: _Decimal128 __bid_floatsitd (int I)
     These functions convert I, a signed integer, to decimal floating
     point.

 -- Runtime Function: _Decimal32 __dpd_floatdisd (long I)
 -- Runtime Function: _Decimal32 __bid_floatdisd (long I)
 -- Runtime Function: _Decimal64 __dpd_floatdidd (long I)
 -- Runtime Function: _Decimal64 __bid_floatdidd (long I)
 -- Runtime Function: _Decimal128 __dpd_floatditd (long I)
 -- Runtime Function: _Decimal128 __bid_floatditd (long I)
     These functions convert I, a signed long, to decimal floating
     point.

 -- Runtime Function: _Decimal32 __dpd_floatunssisd (unsigned int I)
 -- Runtime Function: _Decimal32 __bid_floatunssisd (unsigned int I)
 -- Runtime Function: _Decimal64 __dpd_floatunssidd (unsigned int I)
 -- Runtime Function: _Decimal64 __bid_floatunssidd (unsigned int I)
 -- Runtime Function: _Decimal128 __dpd_floatunssitd (unsigned int I)
 -- Runtime Function: _Decimal128 __bid_floatunssitd (unsigned int I)
     These functions convert I, an unsigned integer, to decimal
     floating point.

 -- Runtime Function: _Decimal32 __dpd_floatunsdisd (unsigned long I)
 -- Runtime Function: _Decimal32 __bid_floatunsdisd (unsigned long I)
 -- Runtime Function: _Decimal64 __dpd_floatunsdidd (unsigned long I)
 -- Runtime Function: _Decimal64 __bid_floatunsdidd (unsigned long I)
 -- Runtime Function: _Decimal128 __dpd_floatunsditd (unsigned long I)
 -- Runtime Function: _Decimal128 __bid_floatunsditd (unsigned long I)
     These functions convert I, an unsigned long, to decimal floating
     point.

4.3.3 Comparison functions
--------------------------

 -- Runtime Function: int __dpd_unordsd2 (_Decimal32 A, _Decimal32 B)
 -- Runtime Function: int __bid_unordsd2 (_Decimal32 A, _Decimal32 B)
 -- Runtime Function: int __dpd_unorddd2 (_Decimal64 A, _Decimal64 B)
 -- Runtime Function: int __bid_unorddd2 (_Decimal64 A, _Decimal64 B)
 -- Runtime Function: int __dpd_unordtd2 (_Decimal128 A, _Decimal128 B)
 -- Runtime Function: int __bid_unordtd2 (_Decimal128 A, _Decimal128 B)
     These functions return a nonzero value if either argument is NaN,
     otherwise 0.

 There is also a complete group of higher level functions which
correspond directly to comparison operators.  They implement the ISO C
semantics for floating-point comparisons, taking NaN into account.  Pay
careful attention to the return values defined for each set.  Under the
hood, all of these routines are implemented as

       if (__bid_unordXd2 (a, b))
         return E;
       return __bid_cmpXd2 (a, b);

where E is a constant chosen to give the proper behavior for NaN.
Thus, the meaning of the return value is different for each set.  Do
not rely on this implementation; only the semantics documented below
are guaranteed.

 -- Runtime Function: int __dpd_eqsd2 (_Decimal32 A, _Decimal32 B)
 -- Runtime Function: int __bid_eqsd2 (_Decimal32 A, _Decimal32 B)
 -- Runtime Function: int __dpd_eqdd2 (_Decimal64 A, _Decimal64 B)
 -- Runtime Function: int __bid_eqdd2 (_Decimal64 A, _Decimal64 B)
 -- Runtime Function: int __dpd_eqtd2 (_Decimal128 A, _Decimal128 B)
 -- Runtime Function: int __bid_eqtd2 (_Decimal128 A, _Decimal128 B)
     These functions return zero if neither argument is NaN, and A and
     B are equal.

 -- Runtime Function: int __dpd_nesd2 (_Decimal32 A, _Decimal32 B)
 -- Runtime Function: int __bid_nesd2 (_Decimal32 A, _Decimal32 B)
 -- Runtime Function: int __dpd_nedd2 (_Decimal64 A, _Decimal64 B)
 -- Runtime Function: int __bid_nedd2 (_Decimal64 A, _Decimal64 B)
 -- Runtime Function: int __dpd_netd2 (_Decimal128 A, _Decimal128 B)
 -- Runtime Function: int __bid_netd2 (_Decimal128 A, _Decimal128 B)
     These functions return a nonzero value if either argument is NaN,
     or if A and B are unequal.

 -- Runtime Function: int __dpd_gesd2 (_Decimal32 A, _Decimal32 B)
 -- Runtime Function: int __bid_gesd2 (_Decimal32 A, _Decimal32 B)
 -- Runtime Function: int __dpd_gedd2 (_Decimal64 A, _Decimal64 B)
 -- Runtime Function: int __bid_gedd2 (_Decimal64 A, _Decimal64 B)
 -- Runtime Function: int __dpd_getd2 (_Decimal128 A, _Decimal128 B)
 -- Runtime Function: int __bid_getd2 (_Decimal128 A, _Decimal128 B)
     These functions return a value greater than or equal to zero if
     neither argument is NaN, and A is greater than or equal to B.

 -- Runtime Function: int __dpd_ltsd2 (_Decimal32 A, _Decimal32 B)
 -- Runtime Function: int __bid_ltsd2 (_Decimal32 A, _Decimal32 B)
 -- Runtime Function: int __dpd_ltdd2 (_Decimal64 A, _Decimal64 B)
 -- Runtime Function: int __bid_ltdd2 (_Decimal64 A, _Decimal64 B)
 -- Runtime Function: int __dpd_lttd2 (_Decimal128 A, _Decimal128 B)
 -- Runtime Function: int __bid_lttd2 (_Decimal128 A, _Decimal128 B)
     These functions return a value less than zero if neither argument
     is NaN, and A is strictly less than B.

 -- Runtime Function: int __dpd_lesd2 (_Decimal32 A, _Decimal32 B)
 -- Runtime Function: int __bid_lesd2 (_Decimal32 A, _Decimal32 B)
 -- Runtime Function: int __dpd_ledd2 (_Decimal64 A, _Decimal64 B)
 -- Runtime Function: int __bid_ledd2 (_Decimal64 A, _Decimal64 B)
 -- Runtime Function: int __dpd_letd2 (_Decimal128 A, _Decimal128 B)
 -- Runtime Function: int __bid_letd2 (_Decimal128 A, _Decimal128 B)
     These functions return a value less than or equal to zero if
     neither argument is NaN, and A is less than or equal to B.

 -- Runtime Function: int __dpd_gtsd2 (_Decimal32 A, _Decimal32 B)
 -- Runtime Function: int __bid_gtsd2 (_Decimal32 A, _Decimal32 B)
 -- Runtime Function: int __dpd_gtdd2 (_Decimal64 A, _Decimal64 B)
 -- Runtime Function: int __bid_gtdd2 (_Decimal64 A, _Decimal64 B)
 -- Runtime Function: int __dpd_gttd2 (_Decimal128 A, _Decimal128 B)
 -- Runtime Function: int __bid_gttd2 (_Decimal128 A, _Decimal128 B)
     These functions return a value greater than zero if neither
     argument is NaN, and A is strictly greater than B.


File: gccint.info,  Node: Fixed-point fractional library routines,  Next: Exception handling routines,  Prev: Decimal float library routines,  Up: Libgcc

4.4 Routines for fixed-point fractional emulation
=================================================

The software fixed-point library implements fixed-point fractional
arithmetic, and is only activated on selected targets.

 For ease of comprehension `fract' is an alias for the `_Fract' type,
`accum' an alias for `_Accum', and `sat' an alias for `_Sat'.

 For illustrative purposes, in this section the fixed-point fractional
type `short fract' is assumed to correspond to machine mode `QQmode';
`unsigned short fract' to `UQQmode'; `fract' to `HQmode';
`unsigned fract' to `UHQmode'; `long fract' to `SQmode';
`unsigned long fract' to `USQmode'; `long long fract' to `DQmode'; and
`unsigned long long fract' to `UDQmode'.  Similarly the fixed-point
accumulator type `short accum' corresponds to `HAmode';
`unsigned short accum' to `UHAmode'; `accum' to `SAmode';
`unsigned accum' to `USAmode'; `long accum' to `DAmode';
`unsigned long accum' to `UDAmode'; `long long accum' to `TAmode'; and
`unsigned long long accum' to `UTAmode'.

4.4.1 Arithmetic functions
--------------------------

 -- Runtime Function: short fract __addqq3 (short fract A, short fract
          B)
 -- Runtime Function: fract __addhq3 (fract A, fract B)
 -- Runtime Function: long fract __addsq3 (long fract A, long fract B)
 -- Runtime Function: long long fract __adddq3 (long long fract A, long
          long fract B)
 -- Runtime Function: unsigned short fract __adduqq3 (unsigned short
          fract A, unsigned short fract B)
 -- Runtime Function: unsigned fract __adduhq3 (unsigned fract A,
          unsigned fract B)
 -- Runtime Function: unsigned long fract __addusq3 (unsigned long
          fract A, unsigned long fract B)
 -- Runtime Function: unsigned long long fract __addudq3 (unsigned long
          long fract A, unsigned long long fract B)
 -- Runtime Function: short accum __addha3 (short accum A, short accum
          B)
 -- Runtime Function: accum __addsa3 (accum A, accum B)
 -- Runtime Function: long accum __addda3 (long accum A, long accum B)
 -- Runtime Function: long long accum __addta3 (long long accum A, long
          long accum B)
 -- Runtime Function: unsigned short accum __adduha3 (unsigned short
          accum A, unsigned short accum B)
 -- Runtime Function: unsigned accum __addusa3 (unsigned accum A,
          unsigned accum B)
 -- Runtime Function: unsigned long accum __adduda3 (unsigned long
          accum A, unsigned long accum B)
 -- Runtime Function: unsigned long long accum __adduta3 (unsigned long
          long accum A, unsigned long long accum B)
     These functions return the sum of A and B.

 -- Runtime Function: short fract __ssaddqq3 (short fract A, short
          fract B)
 -- Runtime Function: fract __ssaddhq3 (fract A, fract B)
 -- Runtime Function: long fract __ssaddsq3 (long fract A, long fract B)
 -- Runtime Function: long long fract __ssadddq3 (long long fract A,
          long long fract B)
 -- Runtime Function: short accum __ssaddha3 (short accum A, short
          accum B)
 -- Runtime Function: accum __ssaddsa3 (accum A, accum B)
 -- Runtime Function: long accum __ssaddda3 (long accum A, long accum B)
 -- Runtime Function: long long accum __ssaddta3 (long long accum A,
          long long accum B)
     These functions return the sum of A and B with signed saturation.

 -- Runtime Function: unsigned short fract __usadduqq3 (unsigned short
          fract A, unsigned short fract B)
 -- Runtime Function: unsigned fract __usadduhq3 (unsigned fract A,
          unsigned fract B)
 -- Runtime Function: unsigned long fract __usaddusq3 (unsigned long
          fract A, unsigned long fract B)
 -- Runtime Function: unsigned long long fract __usaddudq3 (unsigned
          long long fract A, unsigned long long fract B)
 -- Runtime Function: unsigned short accum __usadduha3 (unsigned short
          accum A, unsigned short accum B)
 -- Runtime Function: unsigned accum __usaddusa3 (unsigned accum A,
          unsigned accum B)
 -- Runtime Function: unsigned long accum __usadduda3 (unsigned long
          accum A, unsigned long accum B)
 -- Runtime Function: unsigned long long accum __usadduta3 (unsigned
          long long accum A, unsigned long long accum B)
     These functions return the sum of A and B with unsigned saturation.

 -- Runtime Function: short fract __subqq3 (short fract A, short fract
          B)
 -- Runtime Function: fract __subhq3 (fract A, fract B)
 -- Runtime Function: long fract __subsq3 (long fract A, long fract B)
 -- Runtime Function: long long fract __subdq3 (long long fract A, long
          long fract B)
 -- Runtime Function: unsigned short fract __subuqq3 (unsigned short
          fract A, unsigned short fract B)
 -- Runtime Function: unsigned fract __subuhq3 (unsigned fract A,
          unsigned fract B)
 -- Runtime Function: unsigned long fract __subusq3 (unsigned long
          fract A, unsigned long fract B)
 -- Runtime Function: unsigned long long fract __subudq3 (unsigned long
          long fract A, unsigned long long fract B)
 -- Runtime Function: short accum __subha3 (short accum A, short accum
          B)
 -- Runtime Function: accum __subsa3 (accum A, accum B)
 -- Runtime Function: long accum __subda3 (long accum A, long accum B)
 -- Runtime Function: long long accum __subta3 (long long accum A, long
          long accum B)
 -- Runtime Function: unsigned short accum __subuha3 (unsigned short
          accum A, unsigned short accum B)
 -- Runtime Function: unsigned accum __subusa3 (unsigned accum A,
          unsigned accum B)
 -- Runtime Function: unsigned long accum __subuda3 (unsigned long
          accum A, unsigned long accum B)
 -- Runtime Function: unsigned long long accum __subuta3 (unsigned long
          long accum A, unsigned long long accum B)
     These functions return the difference of A and B; that is, `A - B'.

 -- Runtime Function: short fract __sssubqq3 (short fract A, short
          fract B)
 -- Runtime Function: fract __sssubhq3 (fract A, fract B)
 -- Runtime Function: long fract __sssubsq3 (long fract A, long fract B)
 -- Runtime Function: long long fract __sssubdq3 (long long fract A,
          long long fract B)
 -- Runtime Function: short accum __sssubha3 (short accum A, short
          accum B)
 -- Runtime Function: accum __sssubsa3 (accum A, accum B)
 -- Runtime Function: long accum __sssubda3 (long accum A, long accum B)
 -- Runtime Function: long long accum __sssubta3 (long long accum A,
          long long accum B)
     These functions return the difference of A and B with signed
     saturation;  that is, `A - B'.

 -- Runtime Function: unsigned short fract __ussubuqq3 (unsigned short
          fract A, unsigned short fract B)
 -- Runtime Function: unsigned fract __ussubuhq3 (unsigned fract A,
          unsigned fract B)
 -- Runtime Function: unsigned long fract __ussubusq3 (unsigned long
          fract A, unsigned long fract B)
 -- Runtime Function: unsigned long long fract __ussubudq3 (unsigned
          long long fract A, unsigned long long fract B)
 -- Runtime Function: unsigned short accum __ussubuha3 (unsigned short
          accum A, unsigned short accum B)
 -- Runtime Function: unsigned accum __ussubusa3 (unsigned accum A,
          unsigned accum B)
 -- Runtime Function: unsigned long accum __ussubuda3 (unsigned long
          accum A, unsigned long accum B)
 -- Runtime Function: unsigned long long accum __ussubuta3 (unsigned
          long long accum A, unsigned long long accum B)
     These functions return the difference of A and B with unsigned
     saturation;  that is, `A - B'.

 -- Runtime Function: short fract __mulqq3 (short fract A, short fract
          B)
 -- Runtime Function: fract __mulhq3 (fract A, fract B)
 -- Runtime Function: long fract __mulsq3 (long fract A, long fract B)
 -- Runtime Function: long long fract __muldq3 (long long fract A, long
          long fract B)
 -- Runtime Function: unsigned short fract __muluqq3 (unsigned short
          fract A, unsigned short fract B)
 -- Runtime Function: unsigned fract __muluhq3 (unsigned fract A,
          unsigned fract B)
 -- Runtime Function: unsigned long fract __mulusq3 (unsigned long
          fract A, unsigned long fract B)
 -- Runtime Function: unsigned long long fract __muludq3 (unsigned long
          long fract A, unsigned long long fract B)
 -- Runtime Function: short accum __mulha3 (short accum A, short accum
          B)
 -- Runtime Function: accum __mulsa3 (accum A, accum B)
 -- Runtime Function: long accum __mulda3 (long accum A, long accum B)
 -- Runtime Function: long long accum __multa3 (long long accum A, long
          long accum B)
 -- Runtime Function: unsigned short accum __muluha3 (unsigned short
          accum A, unsigned short accum B)
 -- Runtime Function: unsigned accum __mulusa3 (unsigned accum A,
          unsigned accum B)
 -- Runtime Function: unsigned long accum __muluda3 (unsigned long
          accum A, unsigned long accum B)
 -- Runtime Function: unsigned long long accum __muluta3 (unsigned long
          long accum A, unsigned long long accum B)
     These functions return the product of A and B.

 -- Runtime Function: short fract __ssmulqq3 (short fract A, short
          fract B)
 -- Runtime Function: fract __ssmulhq3 (fract A, fract B)
 -- Runtime Function: long fract __ssmulsq3 (long fract A, long fract B)
 -- Runtime Function: long long fract __ssmuldq3 (long long fract A,
          long long fract B)
 -- Runtime Function: short accum __ssmulha3 (short accum A, short
          accum B)
 -- Runtime Function: accum __ssmulsa3 (accum A, accum B)
 -- Runtime Function: long accum __ssmulda3 (long accum A, long accum B)
 -- Runtime Function: long long accum __ssmulta3 (long long accum A,
          long long accum B)
     These functions return the product of A and B with signed
     saturation.

 -- Runtime Function: unsigned short fract __usmuluqq3 (unsigned short
          fract A, unsigned short fract B)
 -- Runtime Function: unsigned fract __usmuluhq3 (unsigned fract A,
          unsigned fract B)
 -- Runtime Function: unsigned long fract __usmulusq3 (unsigned long
          fract A, unsigned long fract B)
 -- Runtime Function: unsigned long long fract __usmuludq3 (unsigned
          long long fract A, unsigned long long fract B)
 -- Runtime Function: unsigned short accum __usmuluha3 (unsigned short
          accum A, unsigned short accum B)
 -- Runtime Function: unsigned accum __usmulusa3 (unsigned accum A,
          unsigned accum B)
 -- Runtime Function: unsigned long accum __usmuluda3 (unsigned long
          accum A, unsigned long accum B)
 -- Runtime Function: unsigned long long accum __usmuluta3 (unsigned
          long long accum A, unsigned long long accum B)
     These functions return the product of A and B with unsigned
     saturation.

 -- Runtime Function: short fract __divqq3 (short fract A, short fract
          B)
 -- Runtime Function: fract __divhq3 (fract A, fract B)
 -- Runtime Function: long fract __divsq3 (long fract A, long fract B)
 -- Runtime Function: long long fract __divdq3 (long long fract A, long
          long fract B)
 -- Runtime Function: short accum __divha3 (short accum A, short accum
          B)
 -- Runtime Function: accum __divsa3 (accum A, accum B)
 -- Runtime Function: long accum __divda3 (long accum A, long accum B)
 -- Runtime Function: long long accum __divta3 (long long accum A, long
          long accum B)
     These functions return the quotient of the signed division of A
     and B.

 -- Runtime Function: unsigned short fract __udivuqq3 (unsigned short
          fract A, unsigned short fract B)
 -- Runtime Function: unsigned fract __udivuhq3 (unsigned fract A,
          unsigned fract B)
 -- Runtime Function: unsigned long fract __udivusq3 (unsigned long
          fract A, unsigned long fract B)
 -- Runtime Function: unsigned long long fract __udivudq3 (unsigned
          long long fract A, unsigned long long fract B)
 -- Runtime Function: unsigned short accum __udivuha3 (unsigned short
          accum A, unsigned short accum B)
 -- Runtime Function: unsigned accum __udivusa3 (unsigned accum A,
          unsigned accum B)
 -- Runtime Function: unsigned long accum __udivuda3 (unsigned long
          accum A, unsigned long accum B)
 -- Runtime Function: unsigned long long accum __udivuta3 (unsigned
          long long accum A, unsigned long long accum B)
     These functions return the quotient of the unsigned division of A
     and B.

 -- Runtime Function: short fract __ssdivqq3 (short fract A, short
          fract B)
 -- Runtime Function: fract __ssdivhq3 (fract A, fract B)
 -- Runtime Function: long fract __ssdivsq3 (long fract A, long fract B)
 -- Runtime Function: long long fract __ssdivdq3 (long long fract A,
          long long fract B)
 -- Runtime Function: short accum __ssdivha3 (short accum A, short
          accum B)
 -- Runtime Function: accum __ssdivsa3 (accum A, accum B)
 -- Runtime Function: long accum __ssdivda3 (long accum A, long accum B)
 -- Runtime Function: long long accum __ssdivta3 (long long accum A,
          long long accum B)
     These functions return the quotient of the signed division of A
     and B with signed saturation.

 -- Runtime Function: unsigned short fract __usdivuqq3 (unsigned short
          fract A, unsigned short fract B)
 -- Runtime Function: unsigned fract __usdivuhq3 (unsigned fract A,
          unsigned fract B)
 -- Runtime Function: unsigned long fract __usdivusq3 (unsigned long
          fract A, unsigned long fract B)
 -- Runtime Function: unsigned long long fract __usdivudq3 (unsigned
          long long fract A, unsigned long long fract B)
 -- Runtime Function: unsigned short accum __usdivuha3 (unsigned short
          accum A, unsigned short accum B)
 -- Runtime Function: unsigned accum __usdivusa3 (unsigned accum A,
          unsigned accum B)
 -- Runtime Function: unsigned long accum __usdivuda3 (unsigned long
          accum A, unsigned long accum B)
 -- Runtime Function: unsigned long long accum __usdivuta3 (unsigned
          long long accum A, unsigned long long accum B)
     These functions return the quotient of the unsigned division of A
     and B with unsigned saturation.

 -- Runtime Function: short fract __negqq2 (short fract A)
 -- Runtime Function: fract __neghq2 (fract A)
 -- Runtime Function: long fract __negsq2 (long fract A)
 -- Runtime Function: long long fract __negdq2 (long long fract A)
 -- Runtime Function: unsigned short fract __neguqq2 (unsigned short
          fract A)
 -- Runtime Function: unsigned fract __neguhq2 (unsigned fract A)
 -- Runtime Function: unsigned long fract __negusq2 (unsigned long
          fract A)
 -- Runtime Function: unsigned long long fract __negudq2 (unsigned long
          long fract A)
 -- Runtime Function: short accum __negha2 (short accum A)
 -- Runtime Function: accum __negsa2 (accum A)
 -- Runtime Function: long accum __negda2 (long accum A)
 -- Runtime Function: long long accum __negta2 (long long accum A)
 -- Runtime Function: unsigned short accum __neguha2 (unsigned short
          accum A)
 -- Runtime Function: unsigned accum __negusa2 (unsigned accum A)
 -- Runtime Function: unsigned long accum __neguda2 (unsigned long
          accum A)
 -- Runtime Function: unsigned long long accum __neguta2 (unsigned long
          long accum A)
     These functions return the negation of A.

 -- Runtime Function: short fract __ssnegqq2 (short fract A)
 -- Runtime Function: fract __ssneghq2 (fract A)
 -- Runtime Function: long fract __ssnegsq2 (long fract A)
 -- Runtime Function: long long fract __ssnegdq2 (long long fract A)
 -- Runtime Function: short accum __ssnegha2 (short accum A)
 -- Runtime Function: accum __ssnegsa2 (accum A)
 -- Runtime Function: long accum __ssnegda2 (long accum A)
 -- Runtime Function: long long accum __ssnegta2 (long long accum A)
     These functions return the negation of A with signed saturation.

 -- Runtime Function: unsigned short fract __usneguqq2 (unsigned short
          fract A)
 -- Runtime Function: unsigned fract __usneguhq2 (unsigned fract A)
 -- Runtime Function: unsigned long fract __usnegusq2 (unsigned long
          fract A)
 -- Runtime Function: unsigned long long fract __usnegudq2 (unsigned
          long long fract A)
 -- Runtime Function: unsigned short accum __usneguha2 (unsigned short
          accum A)
 -- Runtime Function: unsigned accum __usnegusa2 (unsigned accum A)
 -- Runtime Function: unsigned long accum __usneguda2 (unsigned long
          accum A)
 -- Runtime Function: unsigned long long accum __usneguta2 (unsigned
          long long accum A)
     These functions return the negation of A with unsigned saturation.

 -- Runtime Function: short fract __ashlqq3 (short fract A, int B)
 -- Runtime Function: fract __ashlhq3 (fract A, int B)
 -- Runtime Function: long fract __ashlsq3 (long fract A, int B)
 -- Runtime Function: long long fract __ashldq3 (long long fract A, int
          B)
 -- Runtime Function: unsigned short fract __ashluqq3 (unsigned short
          fract A, int B)
 -- Runtime Function: unsigned fract __ashluhq3 (unsigned fract A, int
          B)
 -- Runtime Function: unsigned long fract __ashlusq3 (unsigned long
          fract A, int B)
 -- Runtime Function: unsigned long long fract __ashludq3 (unsigned
          long long fract A, int B)
 -- Runtime Function: short accum __ashlha3 (short accum A, int B)
 -- Runtime Function: accum __ashlsa3 (accum A, int B)
 -- Runtime Function: long accum __ashlda3 (long accum A, int B)
 -- Runtime Function: long long accum __ashlta3 (long long accum A, int
          B)
 -- Runtime Function: unsigned short accum __ashluha3 (unsigned short
          accum A, int B)
 -- Runtime Function: unsigned accum __ashlusa3 (unsigned accum A, int
          B)
 -- Runtime Function: unsigned long accum __ashluda3 (unsigned long
          accum A, int B)
 -- Runtime Function: unsigned long long accum __ashluta3 (unsigned
          long long accum A, int B)
     These functions return the result of shifting A left by B bits.

 -- Runtime Function: short fract __ashrqq3 (short fract A, int B)
 -- Runtime Function: fract __ashrhq3 (fract A, int B)
 -- Runtime Function: long fract __ashrsq3 (long fract A, int B)
 -- Runtime Function: long long fract __ashrdq3 (long long fract A, int
          B)
 -- Runtime Function: short accum __ashrha3 (short accum A, int B)
 -- Runtime Function: accum __ashrsa3 (accum A, int B)
 -- Runtime Function: long accum __ashrda3 (long accum A, int B)
 -- Runtime Function: long long accum __ashrta3 (long long accum A, int
          B)
     These functions return the result of arithmetically shifting A
     right by B bits.

 -- Runtime Function: unsigned short fract __lshruqq3 (unsigned short
          fract A, int B)
 -- Runtime Function: unsigned fract __lshruhq3 (unsigned fract A, int
          B)
 -- Runtime Function: unsigned long fract __lshrusq3 (unsigned long
          fract A, int B)
 -- Runtime Function: unsigned long long fract __lshrudq3 (unsigned
          long long fract A, int B)
 -- Runtime Function: unsigned short accum __lshruha3 (unsigned short
          accum A, int B)
 -- Runtime Function: unsigned accum __lshrusa3 (unsigned accum A, int
          B)
 -- Runtime Function: unsigned long accum __lshruda3 (unsigned long
          accum A, int B)
 -- Runtime Function: unsigned long long accum __lshruta3 (unsigned
          long long accum A, int B)
     These functions return the result of logically shifting A right by
     B bits.

 -- Runtime Function: fract __ssashlhq3 (fract A, int B)
 -- Runtime Function: long fract __ssashlsq3 (long fract A, int B)
 -- Runtime Function: long long fract __ssashldq3 (long long fract A,
          int B)
 -- Runtime Function: short accum __ssashlha3 (short accum A, int B)
 -- Runtime Function: accum __ssashlsa3 (accum A, int B)
 -- Runtime Function: long accum __ssashlda3 (long accum A, int B)
 -- Runtime Function: long long accum __ssashlta3 (long long accum A,
          int B)
     These functions return the result of shifting A left by B bits
     with signed saturation.

 -- Runtime Function: unsigned short fract __usashluqq3 (unsigned short
          fract A, int B)
 -- Runtime Function: unsigned fract __usashluhq3 (unsigned fract A,
          int B)
 -- Runtime Function: unsigned long fract __usashlusq3 (unsigned long
          fract A, int B)
 -- Runtime Function: unsigned long long fract __usashludq3 (unsigned
          long long fract A, int B)
 -- Runtime Function: unsigned short accum __usashluha3 (unsigned short
          accum A, int B)
 -- Runtime Function: unsigned accum __usashlusa3 (unsigned accum A,
          int B)
 -- Runtime Function: unsigned long accum __usashluda3 (unsigned long
          accum A, int B)
 -- Runtime Function: unsigned long long accum __usashluta3 (unsigned
          long long accum A, int B)
     These functions return the result of shifting A left by B bits
     with unsigned saturation.

4.4.2 Comparison functions
--------------------------

The following functions implement fixed-point comparisons.  These
functions implement a low-level compare, upon which the higher level
comparison operators (such as less than and greater than or equal to)
can be constructed.  The returned values lie in the range zero to two,
to allow the high-level operators to be implemented by testing the
returned result using either signed or unsigned comparison.

 -- Runtime Function: int __cmpqq2 (short fract A, short fract B)
 -- Runtime Function: int __cmphq2 (fract A, fract B)
 -- Runtime Function: int __cmpsq2 (long fract A, long fract B)
 -- Runtime Function: int __cmpdq2 (long long fract A, long long fract
          B)
 -- Runtime Function: int __cmpuqq2 (unsigned short fract A, unsigned
          short fract B)
 -- Runtime Function: int __cmpuhq2 (unsigned fract A, unsigned fract B)
 -- Runtime Function: int __cmpusq2 (unsigned long fract A, unsigned
          long fract B)
 -- Runtime Function: int __cmpudq2 (unsigned long long fract A,
          unsigned long long fract B)
 -- Runtime Function: int __cmpha2 (short accum A, short accum B)
 -- Runtime Function: int __cmpsa2 (accum A, accum B)
 -- Runtime Function: int __cmpda2 (long accum A, long accum B)
 -- Runtime Function: int __cmpta2 (long long accum A, long long accum
          B)
 -- Runtime Function: int __cmpuha2 (unsigned short accum A, unsigned
          short accum B)
 -- Runtime Function: int __cmpusa2 (unsigned accum A, unsigned accum B)
 -- Runtime Function: int __cmpuda2 (unsigned long accum A, unsigned
          long accum B)
 -- Runtime Function: int __cmputa2 (unsigned long long accum A,
          unsigned long long accum B)
     These functions perform a signed or unsigned comparison of A and B
     (depending on the selected machine mode).  If A is less than B,
     they return 0; if A is greater than B, they return 2; and if A and
     B are equal they return 1.

4.4.3 Conversion functions
--------------------------

 -- Runtime Function: fract __fractqqhq2 (short fract A)
 -- Runtime Function: long fract __fractqqsq2 (short fract A)
 -- Runtime Function: long long fract __fractqqdq2 (short fract A)
 -- Runtime Function: short accum __fractqqha (short fract A)
 -- Runtime Function: accum __fractqqsa (short fract A)
 -- Runtime Function: long accum __fractqqda (short fract A)
 -- Runtime Function: long long accum __fractqqta (short fract A)
 -- Runtime Function: unsigned short fract __fractqquqq (short fract A)
 -- Runtime Function: unsigned fract __fractqquhq (short fract A)
 -- Runtime Function: unsigned long fract __fractqqusq (short fract A)
 -- Runtime Function: unsigned long long fract __fractqqudq (short
          fract A)
 -- Runtime Function: unsigned short accum __fractqquha (short fract A)
 -- Runtime Function: unsigned accum __fractqqusa (short fract A)
 -- Runtime Function: unsigned long accum __fractqquda (short fract A)
 -- Runtime Function: unsigned long long accum __fractqquta (short
          fract A)
 -- Runtime Function: signed char __fractqqqi (short fract A)
 -- Runtime Function: short __fractqqhi (short fract A)
 -- Runtime Function: int __fractqqsi (short fract A)
 -- Runtime Function: long __fractqqdi (short fract A)
 -- Runtime Function: long long __fractqqti (short fract A)
 -- Runtime Function: float __fractqqsf (short fract A)
 -- Runtime Function: double __fractqqdf (short fract A)
 -- Runtime Function: short fract __fracthqqq2 (fract A)
 -- Runtime Function: long fract __fracthqsq2 (fract A)
 -- Runtime Function: long long fract __fracthqdq2 (fract A)
 -- Runtime Function: short accum __fracthqha (fract A)
 -- Runtime Function: accum __fracthqsa (fract A)
 -- Runtime Function: long accum __fracthqda (fract A)
 -- Runtime Function: long long accum __fracthqta (fract A)
 -- Runtime Function: unsigned short fract __fracthquqq (fract A)
 -- Runtime Function: unsigned fract __fracthquhq (fract A)
 -- Runtime Function: unsigned long fract __fracthqusq (fract A)
 -- Runtime Function: unsigned long long fract __fracthqudq (fract A)
 -- Runtime Function: unsigned short accum __fracthquha (fract A)
 -- Runtime Function: unsigned accum __fracthqusa (fract A)
 -- Runtime Function: unsigned long accum __fracthquda (fract A)
 -- Runtime Function: unsigned long long accum __fracthquta (fract A)
 -- Runtime Function: signed char __fracthqqi (fract A)
 -- Runtime Function: short __fracthqhi (fract A)
 -- Runtime Function: int __fracthqsi (fract A)
 -- Runtime Function: long __fracthqdi (fract A)
 -- Runtime Function: long long __fracthqti (fract A)
 -- Runtime Function: float __fracthqsf (fract A)
 -- Runtime Function: double __fracthqdf (fract A)
 -- Runtime Function: short fract __fractsqqq2 (long fract A)
 -- Runtime Function: fract __fractsqhq2 (long fract A)
 -- Runtime Function: long long fract __fractsqdq2 (long fract A)
 -- Runtime Function: short accum __fractsqha (long fract A)
 -- Runtime Function: accum __fractsqsa (long fract A)
 -- Runtime Function: long accum __fractsqda (long fract A)
 -- Runtime Function: long long accum __fractsqta (long fract A)
 -- Runtime Function: unsigned short fract __fractsquqq (long fract A)
 -- Runtime Function: unsigned fract __fractsquhq (long fract A)
 -- Runtime Function: unsigned long fract __fractsqusq (long fract A)
 -- Runtime Function: unsigned long long fract __fractsqudq (long fract
          A)
 -- Runtime Function: unsigned short accum __fractsquha (long fract A)
 -- Runtime Function: unsigned accum __fractsqusa (long fract A)
 -- Runtime Function: unsigned long accum __fractsquda (long fract A)
 -- Runtime Function: unsigned long long accum __fractsquta (long fract
          A)
 -- Runtime Function: signed char __fractsqqi (long fract A)
 -- Runtime Function: short __fractsqhi (long fract A)
 -- Runtime Function: int __fractsqsi (long fract A)
 -- Runtime Function: long __fractsqdi (long fract A)
 -- Runtime Function: long long __fractsqti (long fract A)
 -- Runtime Function: float __fractsqsf (long fract A)
 -- Runtime Function: double __fractsqdf (long fract A)
 -- Runtime Function: short fract __fractdqqq2 (long long fract A)
 -- Runtime Function: fract __fractdqhq2 (long long fract A)
 -- Runtime Function: long fract __fractdqsq2 (long long fract A)
 -- Runtime Function: short accum __fractdqha (long long fract A)
 -- Runtime Function: accum __fractdqsa (long long fract A)
 -- Runtime Function: long accum __fractdqda (long long fract A)
 -- Runtime Function: long long accum __fractdqta (long long fract A)
 -- Runtime Function: unsigned short fract __fractdquqq (long long
          fract A)
 -- Runtime Function: unsigned fract __fractdquhq (long long fract A)
 -- Runtime Function: unsigned long fract __fractdqusq (long long fract
          A)
 -- Runtime Function: unsigned long long fract __fractdqudq (long long
          fract A)
 -- Runtime Function: unsigned short accum __fractdquha (long long
          fract A)
 -- Runtime Function: unsigned accum __fractdqusa (long long fract A)
 -- Runtime Function: unsigned long accum __fractdquda (long long fract
          A)
 -- Runtime Function: unsigned long long accum __fractdquta (long long
          fract A)
 -- Runtime Function: signed char __fractdqqi (long long fract A)
 -- Runtime Function: short __fractdqhi (long long fract A)
 -- Runtime Function: int __fractdqsi (long long fract A)
 -- Runtime Function: long __fractdqdi (long long fract A)
 -- Runtime Function: long long __fractdqti (long long fract A)
 -- Runtime Function: float __fractdqsf (long long fract A)
 -- Runtime Function: double __fractdqdf (long long fract A)
 -- Runtime Function: short fract __fracthaqq (short accum A)
 -- Runtime Function: fract __fracthahq (short accum A)
 -- Runtime Function: long fract __fracthasq (short accum A)
 -- Runtime Function: long long fract __fracthadq (short accum A)
 -- Runtime Function: accum __fracthasa2 (short accum A)
 -- Runtime Function: long accum __fracthada2 (short accum A)
 -- Runtime Function: long long accum __fracthata2 (short accum A)
 -- Runtime Function: unsigned short fract __fracthauqq (short accum A)
 -- Runtime Function: unsigned fract __fracthauhq (short accum A)
 -- Runtime Function: unsigned long fract __fracthausq (short accum A)
 -- Runtime Function: unsigned long long fract __fracthaudq (short
          accum A)
 -- Runtime Function: unsigned short accum __fracthauha (short accum A)
 -- Runtime Function: unsigned accum __fracthausa (short accum A)
 -- Runtime Function: unsigned long accum __fracthauda (short accum A)
 -- Runtime Function: unsigned long long accum __fracthauta (short
          accum A)
 -- Runtime Function: signed char __fracthaqi (short accum A)
 -- Runtime Function: short __fracthahi (short accum A)
 -- Runtime Function: int __fracthasi (short accum A)
 -- Runtime Function: long __fracthadi (short accum A)
 -- Runtime Function: long long __fracthati (short accum A)
 -- Runtime Function: float __fracthasf (short accum A)
 -- Runtime Function: double __fracthadf (short accum A)
 -- Runtime Function: short fract __fractsaqq (accum A)
 -- Runtime Function: fract __fractsahq (accum A)
 -- Runtime Function: long fract __fractsasq (accum A)
 -- Runtime Function: long long fract __fractsadq (accum A)
 -- Runtime Function: short accum __fractsaha2 (accum A)
 -- Runtime Function: long accum __fractsada2 (accum A)
 -- Runtime Function: long long accum __fractsata2 (accum A)
 -- Runtime Function: unsigned short fract __fractsauqq (accum A)
 -- Runtime Function: unsigned fract __fractsauhq (accum A)
 -- Runtime Function: unsigned long fract __fractsausq (accum A)
 -- Runtime Function: unsigned long long fract __fractsaudq (accum A)
 -- Runtime Function: unsigned short accum __fractsauha (accum A)
 -- Runtime Function: unsigned accum __fractsausa (accum A)
 -- Runtime Function: unsigned long accum __fractsauda (accum A)
 -- Runtime Function: unsigned long long accum __fractsauta (accum A)
 -- Runtime Function: signed char __fractsaqi (accum A)
 -- Runtime Function: short __fractsahi (accum A)
 -- Runtime Function: int __fractsasi (accum A)
 -- Runtime Function: long __fractsadi (accum A)
 -- Runtime Function: long long __fractsati (accum A)
 -- Runtime Function: float __fractsasf (accum A)
 -- Runtime Function: double __fractsadf (accum A)
 -- Runtime Function: short fract __fractdaqq (long accum A)
 -- Runtime Function: fract __fractdahq (long accum A)
 -- Runtime Function: long fract __fractdasq (long accum A)
 -- Runtime Function: long long fract __fractdadq (long accum A)
 -- Runtime Function: short accum __fractdaha2 (long accum A)
 -- Runtime Function: accum __fractdasa2 (long accum A)
 -- Runtime Function: long long accum __fractdata2 (long accum A)
 -- Runtime Function: unsigned short fract __fractdauqq (long accum A)
 -- Runtime Function: unsigned fract __fractdauhq (long accum A)
 -- Runtime Function: unsigned long fract __fractdausq (long accum A)
 -- Runtime Function: unsigned long long fract __fractdaudq (long accum
          A)
 -- Runtime Function: unsigned short accum __fractdauha (long accum A)
 -- Runtime Function: unsigned accum __fractdausa (long accum A)
 -- Runtime Function: unsigned long accum __fractdauda (long accum A)
 -- Runtime Function: unsigned long long accum __fractdauta (long accum
          A)
 -- Runtime Function: signed char __fractdaqi (long accum A)
 -- Runtime Function: short __fractdahi (long accum A)
 -- Runtime Function: int __fractdasi (long accum A)
 -- Runtime Function: long __fractdadi (long accum A)
 -- Runtime Function: long long __fractdati (long accum A)
 -- Runtime Function: float __fractdasf (long accum A)
 -- Runtime Function: double __fractdadf (long accum A)
 -- Runtime Function: short fract __fracttaqq (long long accum A)
 -- Runtime Function: fract __fracttahq (long long accum A)
 -- Runtime Function: long fract __fracttasq (long long accum A)
 -- Runtime Function: long long fract __fracttadq (long long accum A)
 -- Runtime Function: short accum __fracttaha2 (long long accum A)
 -- Runtime Function: accum __fracttasa2 (long long accum A)
 -- Runtime Function: long accum __fracttada2 (long long accum A)
 -- Runtime Function: unsigned short fract __fracttauqq (long long
          accum A)
 -- Runtime Function: unsigned fract __fracttauhq (long long accum A)
 -- Runtime Function: unsigned long fract __fracttausq (long long accum
          A)
 -- Runtime Function: unsigned long long fract __fracttaudq (long long
          accum A)
 -- Runtime Function: unsigned short accum __fracttauha (long long
          accum A)
 -- Runtime Function: unsigned accum __fracttausa (long long accum A)
 -- Runtime Function: unsigned long accum __fracttauda (long long accum
          A)
 -- Runtime Function: unsigned long long accum __fracttauta (long long
          accum A)
 -- Runtime Function: signed char __fracttaqi (long long accum A)
 -- Runtime Function: short __fracttahi (long long accum A)
 -- Runtime Function: int __fracttasi (long long accum A)
 -- Runtime Function: long __fracttadi (long long accum A)
 -- Runtime Function: long long __fracttati (long long accum A)
 -- Runtime Function: float __fracttasf (long long accum A)
 -- Runtime Function: double __fracttadf (long long accum A)
 -- Runtime Function: short fract __fractuqqqq (unsigned short fract A)
 -- Runtime Function: fract __fractuqqhq (unsigned short fract A)
 -- Runtime Function: long fract __fractuqqsq (unsigned short fract A)
 -- Runtime Function: long long fract __fractuqqdq (unsigned short
          fract A)
 -- Runtime Function: short accum __fractuqqha (unsigned short fract A)
 -- Runtime Function: accum __fractuqqsa (unsigned short fract A)
 -- Runtime Function: long accum __fractuqqda (unsigned short fract A)
 -- Runtime Function: long long accum __fractuqqta (unsigned short
          fract A)
 -- Runtime Function: unsigned fract __fractuqquhq2 (unsigned short
          fract A)
 -- Runtime Function: unsigned long fract __fractuqqusq2 (unsigned
          short fract A)
 -- Runtime Function: unsigned long long fract __fractuqqudq2 (unsigned
          short fract A)
 -- Runtime Function: unsigned short accum __fractuqquha (unsigned
          short fract A)
 -- Runtime Function: unsigned accum __fractuqqusa (unsigned short
          fract A)
 -- Runtime Function: unsigned long accum __fractuqquda (unsigned short
          fract A)
 -- Runtime Function: unsigned long long accum __fractuqquta (unsigned
          short fract A)
 -- Runtime Function: signed char __fractuqqqi (unsigned short fract A)
 -- Runtime Function: short __fractuqqhi (unsigned short fract A)
 -- Runtime Function: int __fractuqqsi (unsigned short fract A)
 -- Runtime Function: long __fractuqqdi (unsigned short fract A)
 -- Runtime Function: long long __fractuqqti (unsigned short fract A)
 -- Runtime Function: float __fractuqqsf (unsigned short fract A)
 -- Runtime Function: double __fractuqqdf (unsigned short fract A)
 -- Runtime Function: short fract __fractuhqqq (unsigned fract A)
 -- Runtime Function: fract __fractuhqhq (unsigned fract A)
 -- Runtime Function: long fract __fractuhqsq (unsigned fract A)
 -- Runtime Function: long long fract __fractuhqdq (unsigned fract A)
 -- Runtime Function: short accum __fractuhqha (unsigned fract A)
 -- Runtime Function: accum __fractuhqsa (unsigned fract A)
 -- Runtime Function: long accum __fractuhqda (unsigned fract A)
 -- Runtime Function: long long accum __fractuhqta (unsigned fract A)
 -- Runtime Function: unsigned short fract __fractuhquqq2 (unsigned
          fract A)
 -- Runtime Function: unsigned long fract __fractuhqusq2 (unsigned
          fract A)
 -- Runtime Function: unsigned long long fract __fractuhqudq2 (unsigned
          fract A)
 -- Runtime Function: unsigned short accum __fractuhquha (unsigned
          fract A)
 -- Runtime Function: unsigned accum __fractuhqusa (unsigned fract A)
 -- Runtime Function: unsigned long accum __fractuhquda (unsigned fract
          A)
 -- Runtime Function: unsigned long long accum __fractuhquta (unsigned
          fract A)
 -- Runtime Function: signed char __fractuhqqi (unsigned fract A)
 -- Runtime Function: short __fractuhqhi (unsigned fract A)
 -- Runtime Function: int __fractuhqsi (unsigned fract A)
 -- Runtime Function: long __fractuhqdi (unsigned fract A)
 -- Runtime Function: long long __fractuhqti (unsigned fract A)
 -- Runtime Function: float __fractuhqsf (unsigned fract A)
 -- Runtime Function: double __fractuhqdf (unsigned fract A)
 -- Runtime Function: short fract __fractusqqq (unsigned long fract A)
 -- Runtime Function: fract __fractusqhq (unsigned long fract A)
 -- Runtime Function: long fract __fractusqsq (unsigned long fract A)
 -- Runtime Function: long long fract __fractusqdq (unsigned long fract
          A)
 -- Runtime Function: short accum __fractusqha (unsigned long fract A)
 -- Runtime Function: accum __fractusqsa (unsigned long fract A)
 -- Runtime Function: long accum __fractusqda (unsigned long fract A)
 -- Runtime Function: long long accum __fractusqta (unsigned long fract
          A)
 -- Runtime Function: unsigned short fract __fractusquqq2 (unsigned
          long fract A)
 -- Runtime Function: unsigned fract __fractusquhq2 (unsigned long
          fract A)
 -- Runtime Function: unsigned long long fract __fractusqudq2 (unsigned
          long fract A)
 -- Runtime Function: unsigned short accum __fractusquha (unsigned long
          fract A)
 -- Runtime Function: unsigned accum __fractusqusa (unsigned long fract
          A)
 -- Runtime Function: unsigned long accum __fractusquda (unsigned long
          fract A)
 -- Runtime Function: unsigned long long accum __fractusquta (unsigned
          long fract A)
 -- Runtime Function: signed char __fractusqqi (unsigned long fract A)
 -- Runtime Function: short __fractusqhi (unsigned long fract A)
 -- Runtime Function: int __fractusqsi (unsigned long fract A)
 -- Runtime Function: long __fractusqdi (unsigned long fract A)
 -- Runtime Function: long long __fractusqti (unsigned long fract A)
 -- Runtime Function: float __fractusqsf (unsigned long fract A)
 -- Runtime Function: double __fractusqdf (unsigned long fract A)
 -- Runtime Function: short fract __fractudqqq (unsigned long long
          fract A)
 -- Runtime Function: fract __fractudqhq (unsigned long long fract A)
 -- Runtime Function: long fract __fractudqsq (unsigned long long fract
          A)
 -- Runtime Function: long long fract __fractudqdq (unsigned long long
          fract A)
 -- Runtime Function: short accum __fractudqha (unsigned long long
          fract A)
 -- Runtime Function: accum __fractudqsa (unsigned long long fract A)
 -- Runtime Function: long accum __fractudqda (unsigned long long fract
          A)
 -- Runtime Function: long long accum __fractudqta (unsigned long long
          fract A)
 -- Runtime Function: unsigned short fract __fractudquqq2 (unsigned
          long long fract A)
 -- Runtime Function: unsigned fract __fractudquhq2 (unsigned long long
          fract A)
 -- Runtime Function: unsigned long fract __fractudqusq2 (unsigned long
          long fract A)
 -- Runtime Function: unsigned short accum __fractudquha (unsigned long
          long fract A)
 -- Runtime Function: unsigned accum __fractudqusa (unsigned long long
          fract A)
 -- Runtime Function: unsigned long accum __fractudquda (unsigned long
          long fract A)
 -- Runtime Function: unsigned long long accum __fractudquta (unsigned
          long long fract A)
 -- Runtime Function: signed char __fractudqqi (unsigned long long
          fract A)
 -- Runtime Function: short __fractudqhi (unsigned long long fract A)
 -- Runtime Function: int __fractudqsi (unsigned long long fract A)
 -- Runtime Function: long __fractudqdi (unsigned long long fract A)
 -- Runtime Function: long long __fractudqti (unsigned long long fract
          A)
 -- Runtime Function: float __fractudqsf (unsigned long long fract A)
 -- Runtime Function: double __fractudqdf (unsigned long long fract A)
 -- Runtime Function: short fract __fractuhaqq (unsigned short accum A)
 -- Runtime Function: fract __fractuhahq (unsigned short accum A)
 -- Runtime Function: long fract __fractuhasq (unsigned short accum A)
 -- Runtime Function: long long fract __fractuhadq (unsigned short
          accum A)
 -- Runtime Function: short accum __fractuhaha (unsigned short accum A)
 -- Runtime Function: accum __fractuhasa (unsigned short accum A)
 -- Runtime Function: long accum __fractuhada (unsigned short accum A)
 -- Runtime Function: long long accum __fractuhata (unsigned short
          accum A)
 -- Runtime Function: unsigned short fract __fractuhauqq (unsigned
          short accum A)
 -- Runtime Function: unsigned fract __fractuhauhq (unsigned short
          accum A)
 -- Runtime Function: unsigned long fract __fractuhausq (unsigned short
          accum A)
 -- Runtime Function: unsigned long long fract __fractuhaudq (unsigned
          short accum A)
 -- Runtime Function: unsigned accum __fractuhausa2 (unsigned short
          accum A)
 -- Runtime Function: unsigned long accum __fractuhauda2 (unsigned
          short accum A)
 -- Runtime Function: unsigned long long accum __fractuhauta2 (unsigned
          short accum A)
 -- Runtime Function: signed char __fractuhaqi (unsigned short accum A)
 -- Runtime Function: short __fractuhahi (unsigned short accum A)
 -- Runtime Function: int __fractuhasi (unsigned short accum A)
 -- Runtime Function: long __fractuhadi (unsigned short accum A)
 -- Runtime Function: long long __fractuhati (unsigned short accum A)
 -- Runtime Function: float __fractuhasf (unsigned short accum A)
 -- Runtime Function: double __fractuhadf (unsigned short accum A)
 -- Runtime Function: short fract __fractusaqq (unsigned accum A)
 -- Runtime Function: fract __fractusahq (unsigned accum A)
 -- Runtime Function: long fract __fractusasq (unsigned accum A)
 -- Runtime Function: long long fract __fractusadq (unsigned accum A)
 -- Runtime Function: short accum __fractusaha (unsigned accum A)
 -- Runtime Function: accum __fractusasa (unsigned accum A)
 -- Runtime Function: long accum __fractusada (unsigned accum A)
 -- Runtime Function: long long accum __fractusata (unsigned accum A)
 -- Runtime Function: unsigned short fract __fractusauqq (unsigned
          accum A)
 -- Runtime Function: unsigned fract __fractusauhq (unsigned accum A)
 -- Runtime Function: unsigned long fract __fractusausq (unsigned accum
          A)
 -- Runtime Function: unsigned long long fract __fractusaudq (unsigned
          accum A)
 -- Runtime Function: unsigned short accum __fractusauha2 (unsigned
          accum A)
 -- Runtime Function: unsigned long accum __fractusauda2 (unsigned
          accum A)
 -- Runtime Function: unsigned long long accum __fractusauta2 (unsigned
          accum A)
 -- Runtime Function: signed char __fractusaqi (unsigned accum A)
 -- Runtime Function: short __fractusahi (unsigned accum A)
 -- Runtime Function: int __fractusasi (unsigned accum A)
 -- Runtime Function: long __fractusadi (unsigned accum A)
 -- Runtime Function: long long __fractusati (unsigned accum A)
 -- Runtime Function: float __fractusasf (unsigned accum A)
 -- Runtime Function: double __fractusadf (unsigned accum A)
 -- Runtime Function: short fract __fractudaqq (unsigned long accum A)
 -- Runtime Function: fract __fractudahq (unsigned long accum A)
 -- Runtime Function: long fract __fractudasq (unsigned long accum A)
 -- Runtime Function: long long fract __fractudadq (unsigned long accum
          A)
 -- Runtime Function: short accum __fractudaha (unsigned long accum A)
 -- Runtime Function: accum __fractudasa (unsigned long accum A)
 -- Runtime Function: long accum __fractudada (unsigned long accum A)
 -- Runtime Function: long long accum __fractudata (unsigned long accum
          A)
 -- Runtime Function: unsigned short fract __fractudauqq (unsigned long
          accum A)
 -- Runtime Function: unsigned fract __fractudauhq (unsigned long accum
          A)
 -- Runtime Function: unsigned long fract __fractudausq (unsigned long
          accum A)
 -- Runtime Function: unsigned long long fract __fractudaudq (unsigned
          long accum A)
 -- Runtime Function: unsigned short accum __fractudauha2 (unsigned
          long accum A)
 -- Runtime Function: unsigned accum __fractudausa2 (unsigned long
          accum A)
 -- Runtime Function: unsigned long long accum __fractudauta2 (unsigned
          long accum A)
 -- Runtime Function: signed char __fractudaqi (unsigned long accum A)
 -- Runtime Function: short __fractudahi (unsigned long accum A)
 -- Runtime Function: int __fractudasi (unsigned long accum A)
 -- Runtime Function: long __fractudadi (unsigned long accum A)
 -- Runtime Function: long long __fractudati (unsigned long accum A)
 -- Runtime Function: float __fractudasf (unsigned long accum A)
 -- Runtime Function: double __fractudadf (unsigned long accum A)
 -- Runtime Function: short fract __fractutaqq (unsigned long long
          accum A)
 -- Runtime Function: fract __fractutahq (unsigned long long accum A)
 -- Runtime Function: long fract __fractutasq (unsigned long long accum
          A)
 -- Runtime Function: long long fract __fractutadq (unsigned long long
          accum A)
 -- Runtime Function: short accum __fractutaha (unsigned long long
          accum A)
 -- Runtime Function: accum __fractutasa (unsigned long long accum A)
 -- Runtime Function: long accum __fractutada (unsigned long long accum
          A)
 -- Runtime Function: long long accum __fractutata (unsigned long long
          accum A)
 -- Runtime Function: unsigned short fract __fractutauqq (unsigned long
          long accum A)
 -- Runtime Function: unsigned fract __fractutauhq (unsigned long long
          accum A)
 -- Runtime Function: unsigned long fract __fractutausq (unsigned long
          long accum A)
 -- Runtime Function: unsigned long long fract __fractutaudq (unsigned
          long long accum A)
 -- Runtime Function: unsigned short accum __fractutauha2 (unsigned
          long long accum A)
 -- Runtime Function: unsigned accum __fractutausa2 (unsigned long long
          accum A)
 -- Runtime Function: unsigned long accum __fractutauda2 (unsigned long
          long accum A)
 -- Runtime Function: signed char __fractutaqi (unsigned long long
          accum A)
 -- Runtime Function: short __fractutahi (unsigned long long accum A)
 -- Runtime Function: int __fractutasi (unsigned long long accum A)
 -- Runtime Function: long __fractutadi (unsigned long long accum A)
 -- Runtime Function: long long __fractutati (unsigned long long accum
          A)
 -- Runtime Function: float __fractutasf (unsigned long long accum A)
 -- Runtime Function: double __fractutadf (unsigned long long accum A)
 -- Runtime Function: short fract __fractqiqq (signed char A)
 -- Runtime Function: fract __fractqihq (signed char A)
 -- Runtime Function: long fract __fractqisq (signed char A)
 -- Runtime Function: long long fract __fractqidq (signed char A)
 -- Runtime Function: short accum __fractqiha (signed char A)
 -- Runtime Function: accum __fractqisa (signed char A)
 -- Runtime Function: long accum __fractqida (signed char A)
 -- Runtime Function: long long accum __fractqita (signed char A)
 -- Runtime Function: unsigned short fract __fractqiuqq (signed char A)
 -- Runtime Function: unsigned fract __fractqiuhq (signed char A)
 -- Runtime Function: unsigned long fract __fractqiusq (signed char A)
 -- Runtime Function: unsigned long long fract __fractqiudq (signed
          char A)
 -- Runtime Function: unsigned short accum __fractqiuha (signed char A)
 -- Runtime Function: unsigned accum __fractqiusa (signed char A)
 -- Runtime Function: unsigned long accum __fractqiuda (signed char A)
 -- Runtime Function: unsigned long long accum __fractqiuta (signed
          char A)
 -- Runtime Function: short fract __fracthiqq (short A)
 -- Runtime Function: fract __fracthihq (short A)
 -- Runtime Function: long fract __fracthisq (short A)
 -- Runtime Function: long long fract __fracthidq (short A)
 -- Runtime Function: short accum __fracthiha (short A)
 -- Runtime Function: accum __fracthisa (short A)
 -- Runtime Function: long accum __fracthida (short A)
 -- Runtime Function: long long accum __fracthita (short A)
 -- Runtime Function: unsigned short fract __fracthiuqq (short A)
 -- Runtime Function: unsigned fract __fracthiuhq (short A)
 -- Runtime Function: unsigned long fract __fracthiusq (short A)
 -- Runtime Function: unsigned long long fract __fracthiudq (short A)
 -- Runtime Function: unsigned short accum __fracthiuha (short A)
 -- Runtime Function: unsigned accum __fracthiusa (short A)
 -- Runtime Function: unsigned long accum __fracthiuda (short A)
 -- Runtime Function: unsigned long long accum __fracthiuta (short A)
 -- Runtime Function: short fract __fractsiqq (int A)
 -- Runtime Function: fract __fractsihq (int A)
 -- Runtime Function: long fract __fractsisq (int A)
 -- Runtime Function: long long fract __fractsidq (int A)
 -- Runtime Function: short accum __fractsiha (int A)
 -- Runtime Function: accum __fractsisa (int A)
 -- Runtime Function: long accum __fractsida (int A)
 -- Runtime Function: long long accum __fractsita (int A)
 -- Runtime Function: unsigned short fract __fractsiuqq (int A)
 -- Runtime Function: unsigned fract __fractsiuhq (int A)
 -- Runtime Function: unsigned long fract __fractsiusq (int A)
 -- Runtime Function: unsigned long long fract __fractsiudq (int A)
 -- Runtime Function: unsigned short accum __fractsiuha (int A)
 -- Runtime Function: unsigned accum __fractsiusa (int A)
 -- Runtime Function: unsigned long accum __fractsiuda (int A)
 -- Runtime Function: unsigned long long accum __fractsiuta (int A)
 -- Runtime Function: short fract __fractdiqq (long A)
 -- Runtime Function: fract __fractdihq (long A)
 -- Runtime Function: long fract __fractdisq (long A)
 -- Runtime Function: long long fract __fractdidq (long A)
 -- Runtime Function: short accum __fractdiha (long A)
 -- Runtime Function: accum __fractdisa (long A)
 -- Runtime Function: long accum __fractdida (long A)
 -- Runtime Function: long long accum __fractdita (long A)
 -- Runtime Function: unsigned short fract __fractdiuqq (long A)
 -- Runtime Function: unsigned fract __fractdiuhq (long A)
 -- Runtime Function: unsigned long fract __fractdiusq (long A)
 -- Runtime Function: unsigned long long fract __fractdiudq (long A)
 -- Runtime Function: unsigned short accum __fractdiuha (long A)
 -- Runtime Function: unsigned accum __fractdiusa (long A)
 -- Runtime Function: unsigned long accum __fractdiuda (long A)
 -- Runtime Function: unsigned long long accum __fractdiuta (long A)
 -- Runtime Function: short fract __fracttiqq (long long A)
 -- Runtime Function: fract __fracttihq (long long A)
 -- Runtime Function: long fract __fracttisq (long long A)
 -- Runtime Function: long long fract __fracttidq (long long A)
 -- Runtime Function: short accum __fracttiha (long long A)
 -- Runtime Function: accum __fracttisa (long long A)
 -- Runtime Function: long accum __fracttida (long long A)
 -- Runtime Function: long long accum __fracttita (long long A)
 -- Runtime Function: unsigned short fract __fracttiuqq (long long A)
 -- Runtime Function: unsigned fract __fracttiuhq (long long A)
 -- Runtime Function: unsigned long fract __fracttiusq (long long A)
 -- Runtime Function: unsigned long long fract __fracttiudq (long long
          A)
 -- Runtime Function: unsigned short accum __fracttiuha (long long A)
 -- Runtime Function: unsigned accum __fracttiusa (long long A)
 -- Runtime Function: unsigned long accum __fracttiuda (long long A)
 -- Runtime Function: unsigned long long accum __fracttiuta (long long
          A)
 -- Runtime Function: short fract __fractsfqq (float A)
 -- Runtime Function: fract __fractsfhq (float A)
 -- Runtime Function: long fract __fractsfsq (float A)
 -- Runtime Function: long long fract __fractsfdq (float A)
 -- Runtime Function: short accum __fractsfha (float A)
 -- Runtime Function: accum __fractsfsa (float A)
 -- Runtime Function: long accum __fractsfda (float A)
 -- Runtime Function: long long accum __fractsfta (float A)
 -- Runtime Function: unsigned short fract __fractsfuqq (float A)
 -- Runtime Function: unsigned fract __fractsfuhq (float A)
 -- Runtime Function: unsigned long fract __fractsfusq (float A)
 -- Runtime Function: unsigned long long fract __fractsfudq (float A)
 -- Runtime Function: unsigned short accum __fractsfuha (float A)
 -- Runtime Function: unsigned accum __fractsfusa (float A)
 -- Runtime Function: unsigned long accum __fractsfuda (float A)
 -- Runtime Function: unsigned long long accum __fractsfuta (float A)
 -- Runtime Function: short fract __fractdfqq (double A)
 -- Runtime Function: fract __fractdfhq (double A)
 -- Runtime Function: long fract __fractdfsq (double A)
 -- Runtime Function: long long fract __fractdfdq (double A)
 -- Runtime Function: short accum __fractdfha (double A)
 -- Runtime Function: accum __fractdfsa (double A)
 -- Runtime Function: long accum __fractdfda (double A)
 -- Runtime Function: long long accum __fractdfta (double A)
 -- Runtime Function: unsigned short fract __fractdfuqq (double A)
 -- Runtime Function: unsigned fract __fractdfuhq (double A)
 -- Runtime Function: unsigned long fract __fractdfusq (double A)
 -- Runtime Function: unsigned long long fract __fractdfudq (double A)
 -- Runtime Function: unsigned short accum __fractdfuha (double A)
 -- Runtime Function: unsigned accum __fractdfusa (double A)
 -- Runtime Function: unsigned long accum __fractdfuda (double A)
 -- Runtime Function: unsigned long long accum __fractdfuta (double A)
     These functions convert from fractional and signed non-fractionals
     to fractionals and signed non-fractionals, without saturation.

 -- Runtime Function: fract __satfractqqhq2 (short fract A)
 -- Runtime Function: long fract __satfractqqsq2 (short fract A)
 -- Runtime Function: long long fract __satfractqqdq2 (short fract A)
 -- Runtime Function: short accum __satfractqqha (short fract A)
 -- Runtime Function: accum __satfractqqsa (short fract A)
 -- Runtime Function: long accum __satfractqqda (short fract A)
 -- Runtime Function: long long accum __satfractqqta (short fract A)
 -- Runtime Function: unsigned short fract __satfractqquqq (short fract
          A)
 -- Runtime Function: unsigned fract __satfractqquhq (short fract A)
 -- Runtime Function: unsigned long fract __satfractqqusq (short fract
          A)
 -- Runtime Function: unsigned long long fract __satfractqqudq (short
          fract A)
 -- Runtime Function: unsigned short accum __satfractqquha (short fract
          A)
 -- Runtime Function: unsigned accum __satfractqqusa (short fract A)
 -- Runtime Function: unsigned long accum __satfractqquda (short fract
          A)
 -- Runtime Function: unsigned long long accum __satfractqquta (short
          fract A)
 -- Runtime Function: short fract __satfracthqqq2 (fract A)
 -- Runtime Function: long fract __satfracthqsq2 (fract A)
 -- Runtime Function: long long fract __satfracthqdq2 (fract A)
 -- Runtime Function: short accum __satfracthqha (fract A)
 -- Runtime Function: accum __satfracthqsa (fract A)
 -- Runtime Function: long accum __satfracthqda (fract A)
 -- Runtime Function: long long accum __satfracthqta (fract A)
 -- Runtime Function: unsigned short fract __satfracthquqq (fract A)
 -- Runtime Function: unsigned fract __satfracthquhq (fract A)
 -- Runtime Function: unsigned long fract __satfracthqusq (fract A)
 -- Runtime Function: unsigned long long fract __satfracthqudq (fract A)
 -- Runtime Function: unsigned short accum __satfracthquha (fract A)
 -- Runtime Function: unsigned accum __satfracthqusa (fract A)
 -- Runtime Function: unsigned long accum __satfracthquda (fract A)
 -- Runtime Function: unsigned long long accum __satfracthquta (fract A)
 -- Runtime Function: short fract __satfractsqqq2 (long fract A)
 -- Runtime Function: fract __satfractsqhq2 (long fract A)
 -- Runtime Function: long long fract __satfractsqdq2 (long fract A)
 -- Runtime Function: short accum __satfractsqha (long fract A)
 -- Runtime Function: accum __satfractsqsa (long fract A)
 -- Runtime Function: long accum __satfractsqda (long fract A)
 -- Runtime Function: long long accum __satfractsqta (long fract A)
 -- Runtime Function: unsigned short fract __satfractsquqq (long fract
          A)
 -- Runtime Function: unsigned fract __satfractsquhq (long fract A)
 -- Runtime Function: unsigned long fract __satfractsqusq (long fract A)
 -- Runtime Function: unsigned long long fract __satfractsqudq (long
          fract A)
 -- Runtime Function: unsigned short accum __satfractsquha (long fract
          A)
 -- Runtime Function: unsigned accum __satfractsqusa (long fract A)
 -- Runtime Function: unsigned long accum __satfractsquda (long fract A)
 -- Runtime Function: unsigned long long accum __satfractsquta (long
          fract A)
 -- Runtime Function: short fract __satfractdqqq2 (long long fract A)
 -- Runtime Function: fract __satfractdqhq2 (long long fract A)
 -- Runtime Function: long fract __satfractdqsq2 (long long fract A)
 -- Runtime Function: short accum __satfractdqha (long long fract A)
 -- Runtime Function: accum __satfractdqsa (long long fract A)
 -- Runtime Function: long accum __satfractdqda (long long fract A)
 -- Runtime Function: long long accum __satfractdqta (long long fract A)
 -- Runtime Function: unsigned short fract __satfractdquqq (long long
          fract A)
 -- Runtime Function: unsigned fract __satfractdquhq (long long fract A)
 -- Runtime Function: unsigned long fract __satfractdqusq (long long
          fract A)
 -- Runtime Function: unsigned long long fract __satfractdqudq (long
          long fract A)
 -- Runtime Function: unsigned short accum __satfractdquha (long long
          fract A)
 -- Runtime Function: unsigned accum __satfractdqusa (long long fract A)
 -- Runtime Function: unsigned long accum __satfractdquda (long long
          fract A)
 -- Runtime Function: unsigned long long accum __satfractdquta (long
          long fract A)
 -- Runtime Function: short fract __satfracthaqq (short accum A)
 -- Runtime Function: fract __satfracthahq (short accum A)
 -- Runtime Function: long fract __satfracthasq (short accum A)
 -- Runtime Function: long long fract __satfracthadq (short accum A)
 -- Runtime Function: accum __satfracthasa2 (short accum A)
 -- Runtime Function: long accum __satfracthada2 (short accum A)
 -- Runtime Function: long long accum __satfracthata2 (short accum A)
 -- Runtime Function: unsigned short fract __satfracthauqq (short accum
          A)
 -- Runtime Function: unsigned fract __satfracthauhq (short accum A)
 -- Runtime Function: unsigned long fract __satfracthausq (short accum
          A)
 -- Runtime Function: unsigned long long fract __satfracthaudq (short
          accum A)
 -- Runtime Function: unsigned short accum __satfracthauha (short accum
          A)
 -- Runtime Function: unsigned accum __satfracthausa (short accum A)
 -- Runtime Function: unsigned long accum __satfracthauda (short accum
          A)
 -- Runtime Function: unsigned long long accum __satfracthauta (short
          accum A)
 -- Runtime Function: short fract __satfractsaqq (accum A)
 -- Runtime Function: fract __satfractsahq (accum A)
 -- Runtime Function: long fract __satfractsasq (accum A)
 -- Runtime Function: long long fract __satfractsadq (accum A)
 -- Runtime Function: short accum __satfractsaha2 (accum A)
 -- Runtime Function: long accum __satfractsada2 (accum A)
 -- Runtime Function: long long accum __satfractsata2 (accum A)
 -- Runtime Function: unsigned short fract __satfractsauqq (accum A)
 -- Runtime Function: unsigned fract __satfractsauhq (accum A)
 -- Runtime Function: unsigned long fract __satfractsausq (accum A)
 -- Runtime Function: unsigned long long fract __satfractsaudq (accum A)
 -- Runtime Function: unsigned short accum __satfractsauha (accum A)
 -- Runtime Function: unsigned accum __satfractsausa (accum A)
 -- Runtime Function: unsigned long accum __satfractsauda (accum A)
 -- Runtime Function: unsigned long long accum __satfractsauta (accum A)
 -- Runtime Function: short fract __satfractdaqq (long accum A)
 -- Runtime Function: fract __satfractdahq (long accum A)
 -- Runtime Function: long fract __satfractdasq (long accum A)
 -- Runtime Function: long long fract __satfractdadq (long accum A)
 -- Runtime Function: short accum __satfractdaha2 (long accum A)
 -- Runtime Function: accum __satfractdasa2 (long accum A)
 -- Runtime Function: long long accum __satfractdata2 (long accum A)
 -- Runtime Function: unsigned short fract __satfractdauqq (long accum
          A)
 -- Runtime Function: unsigned fract __satfractdauhq (long accum A)
 -- Runtime Function: unsigned long fract __satfractdausq (long accum A)
 -- Runtime Function: unsigned long long fract __satfractdaudq (long
          accum A)
 -- Runtime Function: unsigned short accum __satfractdauha (long accum
          A)
 -- Runtime Function: unsigned accum __satfractdausa (long accum A)
 -- Runtime Function: unsigned long accum __satfractdauda (long accum A)
 -- Runtime Function: unsigned long long accum __satfractdauta (long
          accum A)
 -- Runtime Function: short fract __satfracttaqq (long long accum A)
 -- Runtime Function: fract __satfracttahq (long long accum A)
 -- Runtime Function: long fract __satfracttasq (long long accum A)
 -- Runtime Function: long long fract __satfracttadq (long long accum A)
 -- Runtime Function: short accum __satfracttaha2 (long long accum A)
 -- Runtime Function: accum __satfracttasa2 (long long accum A)
 -- Runtime Function: long accum __satfracttada2 (long long accum A)
 -- Runtime Function: unsigned short fract __satfracttauqq (long long
          accum A)
 -- Runtime Function: unsigned fract __satfracttauhq (long long accum A)
 -- Runtime Function: unsigned long fract __satfracttausq (long long
          accum A)
 -- Runtime Function: unsigned long long fract __satfracttaudq (long
          long accum A)
 -- Runtime Function: unsigned short accum __satfracttauha (long long
          accum A)
 -- Runtime Function: unsigned accum __satfracttausa (long long accum A)
 -- Runtime Function: unsigned long accum __satfracttauda (long long
          accum A)
 -- Runtime Function: unsigned long long accum __satfracttauta (long
          long accum A)
 -- Runtime Function: short fract __satfractuqqqq (unsigned short fract
          A)
 -- Runtime Function: fract __satfractuqqhq (unsigned short fract A)
 -- Runtime Function: long fract __satfractuqqsq (unsigned short fract
          A)
 -- Runtime Function: long long fract __satfractuqqdq (unsigned short
          fract A)
 -- Runtime Function: short accum __satfractuqqha (unsigned short fract
          A)
 -- Runtime Function: accum __satfractuqqsa (unsigned short fract A)
 -- Runtime Function: long accum __satfractuqqda (unsigned short fract
          A)
 -- Runtime Function: long long accum __satfractuqqta (unsigned short
          fract A)
 -- Runtime Function: unsigned fract __satfractuqquhq2 (unsigned short
          fract A)
 -- Runtime Function: unsigned long fract __satfractuqqusq2 (unsigned
          short fract A)
 -- Runtime Function: unsigned long long fract __satfractuqqudq2
          (unsigned short fract A)
 -- Runtime Function: unsigned short accum __satfractuqquha (unsigned
          short fract A)
 -- Runtime Function: unsigned accum __satfractuqqusa (unsigned short
          fract A)
 -- Runtime Function: unsigned long accum __satfractuqquda (unsigned
          short fract A)
 -- Runtime Function: unsigned long long accum __satfractuqquta
          (unsigned short fract A)
 -- Runtime Function: short fract __satfractuhqqq (unsigned fract A)
 -- Runtime Function: fract __satfractuhqhq (unsigned fract A)
 -- Runtime Function: long fract __satfractuhqsq (unsigned fract A)
 -- Runtime Function: long long fract __satfractuhqdq (unsigned fract A)
 -- Runtime Function: short accum __satfractuhqha (unsigned fract A)
 -- Runtime Function: accum __satfractuhqsa (unsigned fract A)
 -- Runtime Function: long accum __satfractuhqda (unsigned fract A)
 -- Runtime Function: long long accum __satfractuhqta (unsigned fract A)
 -- Runtime Function: unsigned short fract __satfractuhquqq2 (unsigned
          fract A)
 -- Runtime Function: unsigned long fract __satfractuhqusq2 (unsigned
          fract A)
 -- Runtime Function: unsigned long long fract __satfractuhqudq2
          (unsigned fract A)
 -- Runtime Function: unsigned short accum __satfractuhquha (unsigned
          fract A)
 -- Runtime Function: unsigned accum __satfractuhqusa (unsigned fract A)
 -- Runtime Function: unsigned long accum __satfractuhquda (unsigned
          fract A)
 -- Runtime Function: unsigned long long accum __satfractuhquta
          (unsigned fract A)
 -- Runtime Function: short fract __satfractusqqq (unsigned long fract
          A)
 -- Runtime Function: fract __satfractusqhq (unsigned long fract A)
 -- Runtime Function: long fract __satfractusqsq (unsigned long fract A)
 -- Runtime Function: long long fract __satfractusqdq (unsigned long
          fract A)
 -- Runtime Function: short accum __satfractusqha (unsigned long fract
          A)
 -- Runtime Function: accum __satfractusqsa (unsigned long fract A)
 -- Runtime Function: long accum __satfractusqda (unsigned long fract A)
 -- Runtime Function: long long accum __satfractusqta (unsigned long
          fract A)
 -- Runtime Function: unsigned short fract __satfractusquqq2 (unsigned
          long fract A)
 -- Runtime Function: unsigned fract __satfractusquhq2 (unsigned long
          fract A)
 -- Runtime Function: unsigned long long fract __satfractusqudq2
          (unsigned long fract A)
 -- Runtime Function: unsigned short accum __satfractusquha (unsigned
          long fract A)
 -- Runtime Function: unsigned accum __satfractusqusa (unsigned long
          fract A)
 -- Runtime Function: unsigned long accum __satfractusquda (unsigned
          long fract A)
 -- Runtime Function: unsigned long long accum __satfractusquta
          (unsigned long fract A)
 -- Runtime Function: short fract __satfractudqqq (unsigned long long
          fract A)
 -- Runtime Function: fract __satfractudqhq (unsigned long long fract A)
 -- Runtime Function: long fract __satfractudqsq (unsigned long long
          fract A)
 -- Runtime Function: long long fract __satfractudqdq (unsigned long
          long fract A)
 -- Runtime Function: short accum __satfractudqha (unsigned long long
          fract A)
 -- Runtime Function: accum __satfractudqsa (unsigned long long fract A)
 -- Runtime Function: long accum __satfractudqda (unsigned long long
          fract A)
 -- Runtime Function: long long accum __satfractudqta (unsigned long
          long fract A)
 -- Runtime Function: unsigned short fract __satfractudquqq2 (unsigned
          long long fract A)
 -- Runtime Function: unsigned fract __satfractudquhq2 (unsigned long
          long fract A)
 -- Runtime Function: unsigned long fract __satfractudqusq2 (unsigned
          long long fract A)
 -- Runtime Function: unsigned short accum __satfractudquha (unsigned
          long long fract A)
 -- Runtime Function: unsigned accum __satfractudqusa (unsigned long
          long fract A)
 -- Runtime Function: unsigned long accum __satfractudquda (unsigned
          long long fract A)
 -- Runtime Function: unsigned long long accum __satfractudquta
          (unsigned long long fract A)
 -- Runtime Function: short fract __satfractuhaqq (unsigned short accum
          A)
 -- Runtime Function: fract __satfractuhahq (unsigned short accum A)
 -- Runtime Function: long fract __satfractuhasq (unsigned short accum
          A)
 -- Runtime Function: long long fract __satfractuhadq (unsigned short
          accum A)
 -- Runtime Function: short accum __satfractuhaha (unsigned short accum
          A)
 -- Runtime Function: accum __satfractuhasa (unsigned short accum A)
 -- Runtime Function: long accum __satfractuhada (unsigned short accum
          A)
 -- Runtime Function: long long accum __satfractuhata (unsigned short
          accum A)
 -- Runtime Function: unsigned short fract __satfractuhauqq (unsigned
          short accum A)
 -- Runtime Function: unsigned fract __satfractuhauhq (unsigned short
          accum A)
 -- Runtime Function: unsigned long fract __satfractuhausq (unsigned
          short accum A)
 -- Runtime Function: unsigned long long fract __satfractuhaudq
          (unsigned short accum A)
 -- Runtime Function: unsigned accum __satfractuhausa2 (unsigned short
          accum A)
 -- Runtime Function: unsigned long accum __satfractuhauda2 (unsigned
          short accum A)
 -- Runtime Function: unsigned long long accum __satfractuhauta2
          (unsigned short accum A)
 -- Runtime Function: short fract __satfractusaqq (unsigned accum A)
 -- Runtime Function: fract __satfractusahq (unsigned accum A)
 -- Runtime Function: long fract __satfractusasq (unsigned accum A)
 -- Runtime Function: long long fract __satfractusadq (unsigned accum A)
 -- Runtime Function: short accum __satfractusaha (unsigned accum A)
 -- Runtime Function: accum __satfractusasa (unsigned accum A)
 -- Runtime Function: long accum __satfractusada (unsigned accum A)
 -- Runtime Function: long long accum __satfractusata (unsigned accum A)
 -- Runtime Function: unsigned short fract __satfractusauqq (unsigned
          accum A)
 -- Runtime Function: unsigned fract __satfractusauhq (unsigned accum A)
 -- Runtime Function: unsigned long fract __satfractusausq (unsigned
          accum A)
 -- Runtime Function: unsigned long long fract __satfractusaudq
          (unsigned accum A)
 -- Runtime Function: unsigned short accum __satfractusauha2 (unsigned
          accum A)
 -- Runtime Function: unsigned long accum __satfractusauda2 (unsigned
          accum A)
 -- Runtime Function: unsigned long long accum __satfractusauta2
          (unsigned accum A)
 -- Runtime Function: short fract __satfractudaqq (unsigned long accum
          A)
 -- Runtime Function: fract __satfractudahq (unsigned long accum A)
 -- Runtime Function: long fract __satfractudasq (unsigned long accum A)
 -- Runtime Function: long long fract __satfractudadq (unsigned long
          accum A)
 -- Runtime Function: short accum __satfractudaha (unsigned long accum
          A)
 -- Runtime Function: accum __satfractudasa (unsigned long accum A)
 -- Runtime Function: long accum __satfractudada (unsigned long accum A)
 -- Runtime Function: long long accum __satfractudata (unsigned long
          accum A)
 -- Runtime Function: unsigned short fract __satfractudauqq (unsigned
          long accum A)
 -- Runtime Function: unsigned fract __satfractudauhq (unsigned long
          accum A)
 -- Runtime Function: unsigned long fract __satfractudausq (unsigned
          long accum A)
 -- Runtime Function: unsigned long long fract __satfractudaudq
          (unsigned long accum A)
 -- Runtime Function: unsigned short accum __satfractudauha2 (unsigned
          long accum A)
 -- Runtime Function: unsigned accum __satfractudausa2 (unsigned long
          accum A)
 -- Runtime Function: unsigned long long accum __satfractudauta2
          (unsigned long accum A)
 -- Runtime Function: short fract __satfractutaqq (unsigned long long
          accum A)
 -- Runtime Function: fract __satfractutahq (unsigned long long accum A)
 -- Runtime Function: long fract __satfractutasq (unsigned long long
          accum A)
 -- Runtime Function: long long fract __satfractutadq (unsigned long
          long accum A)
 -- Runtime Function: short accum __satfractutaha (unsigned long long
          accum A)
 -- Runtime Function: accum __satfractutasa (unsigned long long accum A)
 -- Runtime Function: long accum __satfractutada (unsigned long long
          accum A)
 -- Runtime Function: long long accum __satfractutata (unsigned long
          long accum A)
 -- Runtime Function: unsigned short fract __satfractutauqq (unsigned
          long long accum A)
 -- Runtime Function: unsigned fract __satfractutauhq (unsigned long
          long accum A)
 -- Runtime Function: unsigned long fract __satfractutausq (unsigned
          long long accum A)
 -- Runtime Function: unsigned long long fract __satfractutaudq
          (unsigned long long accum A)
 -- Runtime Function: unsigned short accum __satfractutauha2 (unsigned
          long long accum A)
 -- Runtime Function: unsigned accum __satfractutausa2 (unsigned long
          long accum A)
 -- Runtime Function: unsigned long accum __satfractutauda2 (unsigned
          long long accum A)
 -- Runtime Function: short fract __satfractqiqq (signed char A)
 -- Runtime Function: fract __satfractqihq (signed char A)
 -- Runtime Function: long fract __satfractqisq (signed char A)
 -- Runtime Function: long long fract __satfractqidq (signed char A)
 -- Runtime Function: short accum __satfractqiha (signed char A)
 -- Runtime Function: accum __satfractqisa (signed char A)
 -- Runtime Function: long accum __satfractqida (signed char A)
 -- Runtime Function: long long accum __satfractqita (signed char A)
 -- Runtime Function: unsigned short fract __satfractqiuqq (signed char
          A)
 -- Runtime Function: unsigned fract __satfractqiuhq (signed char A)
 -- Runtime Function: unsigned long fract __satfractqiusq (signed char
          A)
 -- Runtime Function: unsigned long long fract __satfractqiudq (signed
          char A)
 -- Runtime Function: unsigned short accum __satfractqiuha (signed char
          A)
 -- Runtime Function: unsigned accum __satfractqiusa (signed char A)
 -- Runtime Function: unsigned long accum __satfractqiuda (signed char
          A)
 -- Runtime Function: unsigned long long accum __satfractqiuta (signed
          char A)
 -- Runtime Function: short fract __satfracthiqq (short A)
 -- Runtime Function: fract __satfracthihq (short A)
 -- Runtime Function: long fract __satfracthisq (short A)
 -- Runtime Function: long long fract __satfracthidq (short A)
 -- Runtime Function: short accum __satfracthiha (short A)
 -- Runtime Function: accum __satfracthisa (short A)
 -- Runtime Function: long accum __satfracthida (short A)
 -- Runtime Function: long long accum __satfracthita (short A)
 -- Runtime Function: unsigned short fract __satfracthiuqq (short A)
 -- Runtime Function: unsigned fract __satfracthiuhq (short A)
 -- Runtime Function: unsigned long fract __satfracthiusq (short A)
 -- Runtime Function: unsigned long long fract __satfracthiudq (short A)
 -- Runtime Function: unsigned short accum __satfracthiuha (short A)
 -- Runtime Function: unsigned accum __satfracthiusa (short A)
 -- Runtime Function: unsigned long accum __satfracthiuda (short A)
 -- Runtime Function: unsigned long long accum __satfracthiuta (short A)
 -- Runtime Function: short fract __satfractsiqq (int A)
 -- Runtime Function: fract __satfractsihq (int A)
 -- Runtime Function: long fract __satfractsisq (int A)
 -- Runtime Function: long long fract __satfractsidq (int A)
 -- Runtime Function: short accum __satfractsiha (int A)
 -- Runtime Function: accum __satfractsisa (int A)
 -- Runtime Function: long accum __satfractsida (int A)
 -- Runtime Function: long long accum __satfractsita (int A)
 -- Runtime Function: unsigned short fract __satfractsiuqq (int A)
 -- Runtime Function: unsigned fract __satfractsiuhq (int A)
 -- Runtime Function: unsigned long fract __satfractsiusq (int A)
 -- Runtime Function: unsigned long long fract __satfractsiudq (int A)
 -- Runtime Function: unsigned short accum __satfractsiuha (int A)
 -- Runtime Function: unsigned accum __satfractsiusa (int A)
 -- Runtime Function: unsigned long accum __satfractsiuda (int A)
 -- Runtime Function: unsigned long long accum __satfractsiuta (int A)
 -- Runtime Function: short fract __satfractdiqq (long A)
 -- Runtime Function: fract __satfractdihq (long A)
 -- Runtime Function: long fract __satfractdisq (long A)
 -- Runtime Function: long long fract __satfractdidq (long A)
 -- Runtime Function: short accum __satfractdiha (long A)
 -- Runtime Function: accum __satfractdisa (long A)
 -- Runtime Function: long accum __satfractdida (long A)
 -- Runtime Function: long long accum __satfractdita (long A)
 -- Runtime Function: unsigned short fract __satfractdiuqq (long A)
 -- Runtime Function: unsigned fract __satfractdiuhq (long A)
 -- Runtime Function: unsigned long fract __satfractdiusq (long A)
 -- Runtime Function: unsigned long long fract __satfractdiudq (long A)
 -- Runtime Function: unsigned short accum __satfractdiuha (long A)
 -- Runtime Function: unsigned accum __satfractdiusa (long A)
 -- Runtime Function: unsigned long accum __satfractdiuda (long A)
 -- Runtime Function: unsigned long long accum __satfractdiuta (long A)
 -- Runtime Function: short fract __satfracttiqq (long long A)
 -- Runtime Function: fract __satfracttihq (long long A)
 -- Runtime Function: long fract __satfracttisq (long long A)
 -- Runtime Function: long long fract __satfracttidq (long long A)
 -- Runtime Function: short accum __satfracttiha (long long A)
 -- Runtime Function: accum __satfracttisa (long long A)
 -- Runtime Function: long accum __satfracttida (long long A)
 -- Runtime Function: long long accum __satfracttita (long long A)
 -- Runtime Function: unsigned short fract __satfracttiuqq (long long A)
 -- Runtime Function: unsigned fract __satfracttiuhq (long long A)
 -- Runtime Function: unsigned long fract __satfracttiusq (long long A)
 -- Runtime Function: unsigned long long fract __satfracttiudq (long
          long A)
 -- Runtime Function: unsigned short accum __satfracttiuha (long long A)
 -- Runtime Function: unsigned accum __satfracttiusa (long long A)
 -- Runtime Function: unsigned long accum __satfracttiuda (long long A)
 -- Runtime Function: unsigned long long accum __satfracttiuta (long
          long A)
 -- Runtime Function: short fract __satfractsfqq (float A)
 -- Runtime Function: fract __satfractsfhq (float A)
 -- Runtime Function: long fract __satfractsfsq (float A)
 -- Runtime Function: long long fract __satfractsfdq (float A)
 -- Runtime Function: short accum __satfractsfha (float A)
 -- Runtime Function: accum __satfractsfsa (float A)
 -- Runtime Function: long accum __satfractsfda (float A)
 -- Runtime Function: long long accum __satfractsfta (float A)
 -- Runtime Function: unsigned short fract __satfractsfuqq (float A)
 -- Runtime Function: unsigned fract __satfractsfuhq (float A)
 -- Runtime Function: unsigned long fract __satfractsfusq (float A)
 -- Runtime Function: unsigned long long fract __satfractsfudq (float A)
 -- Runtime Function: unsigned short accum __satfractsfuha (float A)
 -- Runtime Function: unsigned accum __satfractsfusa (float A)
 -- Runtime Function: unsigned long accum __satfractsfuda (float A)
 -- Runtime Function: unsigned long long accum __satfractsfuta (float A)
 -- Runtime Function: short fract __satfractdfqq (double A)
 -- Runtime Function: fract __satfractdfhq (double A)
 -- Runtime Function: long fract __satfractdfsq (double A)
 -- Runtime Function: long long fract __satfractdfdq (double A)
 -- Runtime Function: short accum __satfractdfha (double A)
 -- Runtime Function: accum __satfractdfsa (double A)
 -- Runtime Function: long accum __satfractdfda (double A)
 -- Runtime Function: long long accum __satfractdfta (double A)
 -- Runtime Function: unsigned short fract __satfractdfuqq (double A)
 -- Runtime Function: unsigned fract __satfractdfuhq (double A)
 -- Runtime Function: unsigned long fract __satfractdfusq (double A)
 -- Runtime Function: unsigned long long fract __satfractdfudq (double
          A)
 -- Runtime Function: unsigned short accum __satfractdfuha (double A)
 -- Runtime Function: unsigned accum __satfractdfusa (double A)
 -- Runtime Function: unsigned long accum __satfractdfuda (double A)
 -- Runtime Function: unsigned long long accum __satfractdfuta (double
          A)
     The functions convert from fractional and signed non-fractionals to
     fractionals, with saturation.

 -- Runtime Function: unsigned char __fractunsqqqi (short fract A)
 -- Runtime Function: unsigned short __fractunsqqhi (short fract A)
 -- Runtime Function: unsigned int __fractunsqqsi (short fract A)
 -- Runtime Function: unsigned long __fractunsqqdi (short fract A)
 -- Runtime Function: unsigned long long __fractunsqqti (short fract A)
 -- Runtime Function: unsigned char __fractunshqqi (fract A)
 -- Runtime Function: unsigned short __fractunshqhi (fract A)
 -- Runtime Function: unsigned int __fractunshqsi (fract A)
 -- Runtime Function: unsigned long __fractunshqdi (fract A)
 -- Runtime Function: unsigned long long __fractunshqti (fract A)
 -- Runtime Function: unsigned char __fractunssqqi (long fract A)
 -- Runtime Function: unsigned short __fractunssqhi (long fract A)
 -- Runtime Function: unsigned int __fractunssqsi (long fract A)
 -- Runtime Function: unsigned long __fractunssqdi (long fract A)
 -- Runtime Function: unsigned long long __fractunssqti (long fract A)
 -- Runtime Function: unsigned char __fractunsdqqi (long long fract A)
 -- Runtime Function: unsigned short __fractunsdqhi (long long fract A)
 -- Runtime Function: unsigned int __fractunsdqsi (long long fract A)
 -- Runtime Function: unsigned long __fractunsdqdi (long long fract A)
 -- Runtime Function: unsigned long long __fractunsdqti (long long
          fract A)
 -- Runtime Function: unsigned char __fractunshaqi (short accum A)
 -- Runtime Function: unsigned short __fractunshahi (short accum A)
 -- Runtime Function: unsigned int __fractunshasi (short accum A)
 -- Runtime Function: unsigned long __fractunshadi (short accum A)
 -- Runtime Function: unsigned long long __fractunshati (short accum A)
 -- Runtime Function: unsigned char __fractunssaqi (accum A)
 -- Runtime Function: unsigned short __fractunssahi (accum A)
 -- Runtime Function: unsigned int __fractunssasi (accum A)
 -- Runtime Function: unsigned long __fractunssadi (accum A)
 -- Runtime Function: unsigned long long __fractunssati (accum A)
 -- Runtime Function: unsigned char __fractunsdaqi (long accum A)
 -- Runtime Function: unsigned short __fractunsdahi (long accum A)
 -- Runtime Function: unsigned int __fractunsdasi (long accum A)
 -- Runtime Function: unsigned long __fractunsdadi (long accum A)
 -- Runtime Function: unsigned long long __fractunsdati (long accum A)
 -- Runtime Function: unsigned char __fractunstaqi (long long accum A)
 -- Runtime Function: unsigned short __fractunstahi (long long accum A)
 -- Runtime Function: unsigned int __fractunstasi (long long accum A)
 -- Runtime Function: unsigned long __fractunstadi (long long accum A)
 -- Runtime Function: unsigned long long __fractunstati (long long
          accum A)
 -- Runtime Function: unsigned char __fractunsuqqqi (unsigned short
          fract A)
 -- Runtime Function: unsigned short __fractunsuqqhi (unsigned short
          fract A)
 -- Runtime Function: unsigned int __fractunsuqqsi (unsigned short
          fract A)
 -- Runtime Function: unsigned long __fractunsuqqdi (unsigned short
          fract A)
 -- Runtime Function: unsigned long long __fractunsuqqti (unsigned
          short fract A)
 -- Runtime Function: unsigned char __fractunsuhqqi (unsigned fract A)
 -- Runtime Function: unsigned short __fractunsuhqhi (unsigned fract A)
 -- Runtime Function: unsigned int __fractunsuhqsi (unsigned fract A)
 -- Runtime Function: unsigned long __fractunsuhqdi (unsigned fract A)
 -- Runtime Function: unsigned long long __fractunsuhqti (unsigned
          fract A)
 -- Runtime Function: unsigned char __fractunsusqqi (unsigned long
          fract A)
 -- Runtime Function: unsigned short __fractunsusqhi (unsigned long
          fract A)
 -- Runtime Function: unsigned int __fractunsusqsi (unsigned long fract
          A)
 -- Runtime Function: unsigned long __fractunsusqdi (unsigned long
          fract A)
 -- Runtime Function: unsigned long long __fractunsusqti (unsigned long
          fract A)
 -- Runtime Function: unsigned char __fractunsudqqi (unsigned long long
          fract A)
 -- Runtime Function: unsigned short __fractunsudqhi (unsigned long
          long fract A)
 -- Runtime Function: unsigned int __fractunsudqsi (unsigned long long
          fract A)
 -- Runtime Function: unsigned long __fractunsudqdi (unsigned long long
          fract A)
 -- Runtime Function: unsigned long long __fractunsudqti (unsigned long
          long fract A)
 -- Runtime Function: unsigned char __fractunsuhaqi (unsigned short
          accum A)
 -- Runtime Function: unsigned short __fractunsuhahi (unsigned short
          accum A)
 -- Runtime Function: unsigned int __fractunsuhasi (unsigned short
          accum A)
 -- Runtime Function: unsigned long __fractunsuhadi (unsigned short
          accum A)
 -- Runtime Function: unsigned long long __fractunsuhati (unsigned
          short accum A)
 -- Runtime Function: unsigned char __fractunsusaqi (unsigned accum A)
 -- Runtime Function: unsigned short __fractunsusahi (unsigned accum A)
 -- Runtime Function: unsigned int __fractunsusasi (unsigned accum A)
 -- Runtime Function: unsigned long __fractunsusadi (unsigned accum A)
 -- Runtime Function: unsigned long long __fractunsusati (unsigned
          accum A)
 -- Runtime Function: unsigned char __fractunsudaqi (unsigned long
          accum A)
 -- Runtime Function: unsigned short __fractunsudahi (unsigned long
          accum A)
 -- Runtime Function: unsigned int __fractunsudasi (unsigned long accum
          A)
 -- Runtime Function: unsigned long __fractunsudadi (unsigned long
          accum A)
 -- Runtime Function: unsigned long long __fractunsudati (unsigned long
          accum A)
 -- Runtime Function: unsigned char __fractunsutaqi (unsigned long long
          accum A)
 -- Runtime Function: unsigned short __fractunsutahi (unsigned long
          long accum A)
 -- Runtime Function: unsigned int __fractunsutasi (unsigned long long
          accum A)
 -- Runtime Function: unsigned long __fractunsutadi (unsigned long long
          accum A)
 -- Runtime Function: unsigned long long __fractunsutati (unsigned long
          long accum A)
 -- Runtime Function: short fract __fractunsqiqq (unsigned char A)
 -- Runtime Function: fract __fractunsqihq (unsigned char A)
 -- Runtime Function: long fract __fractunsqisq (unsigned char A)
 -- Runtime Function: long long fract __fractunsqidq (unsigned char A)
 -- Runtime Function: short accum __fractunsqiha (unsigned char A)
 -- Runtime Function: accum __fractunsqisa (unsigned char A)
 -- Runtime Function: long accum __fractunsqida (unsigned char A)
 -- Runtime Function: long long accum __fractunsqita (unsigned char A)
 -- Runtime Function: unsigned short fract __fractunsqiuqq (unsigned
          char A)
 -- Runtime Function: unsigned fract __fractunsqiuhq (unsigned char A)
 -- Runtime Function: unsigned long fract __fractunsqiusq (unsigned
          char A)
 -- Runtime Function: unsigned long long fract __fractunsqiudq
          (unsigned char A)
 -- Runtime Function: unsigned short accum __fractunsqiuha (unsigned
          char A)
 -- Runtime Function: unsigned accum __fractunsqiusa (unsigned char A)
 -- Runtime Function: unsigned long accum __fractunsqiuda (unsigned
          char A)
 -- Runtime Function: unsigned long long accum __fractunsqiuta
          (unsigned char A)
 -- Runtime Function: short fract __fractunshiqq (unsigned short A)
 -- Runtime Function: fract __fractunshihq (unsigned short A)
 -- Runtime Function: long fract __fractunshisq (unsigned short A)
 -- Runtime Function: long long fract __fractunshidq (unsigned short A)
 -- Runtime Function: short accum __fractunshiha (unsigned short A)
 -- Runtime Function: accum __fractunshisa (unsigned short A)
 -- Runtime Function: long accum __fractunshida (unsigned short A)
 -- Runtime Function: long long accum __fractunshita (unsigned short A)
 -- Runtime Function: unsigned short fract __fractunshiuqq (unsigned
          short A)
 -- Runtime Function: unsigned fract __fractunshiuhq (unsigned short A)
 -- Runtime Function: unsigned long fract __fractunshiusq (unsigned
          short A)
 -- Runtime Function: unsigned long long fract __fractunshiudq
          (unsigned short A)
 -- Runtime Function: unsigned short accum __fractunshiuha (unsigned
          short A)
 -- Runtime Function: unsigned accum __fractunshiusa (unsigned short A)
 -- Runtime Function: unsigned long accum __fractunshiuda (unsigned
          short A)
 -- Runtime Function: unsigned long long accum __fractunshiuta
          (unsigned short A)
 -- Runtime Function: short fract __fractunssiqq (unsigned int A)
 -- Runtime Function: fract __fractunssihq (unsigned int A)
 -- Runtime Function: long fract __fractunssisq (unsigned int A)
 -- Runtime Function: long long fract __fractunssidq (unsigned int A)
 -- Runtime Function: short accum __fractunssiha (unsigned int A)
 -- Runtime Function: accum __fractunssisa (unsigned int A)
 -- Runtime Function: long accum __fractunssida (unsigned int A)
 -- Runtime Function: long long accum __fractunssita (unsigned int A)
 -- Runtime Function: unsigned short fract __fractunssiuqq (unsigned
          int A)
 -- Runtime Function: unsigned fract __fractunssiuhq (unsigned int A)
 -- Runtime Function: unsigned long fract __fractunssiusq (unsigned int
          A)
 -- Runtime Function: unsigned long long fract __fractunssiudq
          (unsigned int A)
 -- Runtime Function: unsigned short accum __fractunssiuha (unsigned
          int A)
 -- Runtime Function: unsigned accum __fractunssiusa (unsigned int A)
 -- Runtime Function: unsigned long accum __fractunssiuda (unsigned int
          A)
 -- Runtime Function: unsigned long long accum __fractunssiuta
          (unsigned int A)
 -- Runtime Function: short fract __fractunsdiqq (unsigned long A)
 -- Runtime Function: fract __fractunsdihq (unsigned long A)
 -- Runtime Function: long fract __fractunsdisq (unsigned long A)
 -- Runtime Function: long long fract __fractunsdidq (unsigned long A)
 -- Runtime Function: short accum __fractunsdiha (unsigned long A)
 -- Runtime Function: accum __fractunsdisa (unsigned long A)
 -- Runtime Function: long accum __fractunsdida (unsigned long A)
 -- Runtime Function: long long accum __fractunsdita (unsigned long A)
 -- Runtime Function: unsigned short fract __fractunsdiuqq (unsigned
          long A)
 -- Runtime Function: unsigned fract __fractunsdiuhq (unsigned long A)
 -- Runtime Function: unsigned long fract __fractunsdiusq (unsigned
          long A)
 -- Runtime Function: unsigned long long fract __fractunsdiudq
          (unsigned long A)
 -- Runtime Function: unsigned short accum __fractunsdiuha (unsigned
          long A)
 -- Runtime Function: unsigned accum __fractunsdiusa (unsigned long A)
 -- Runtime Function: unsigned long accum __fractunsdiuda (unsigned
          long A)
 -- Runtime Function: unsigned long long accum __fractunsdiuta
          (unsigned long A)
 -- Runtime Function: short fract __fractunstiqq (unsigned long long A)
 -- Runtime Function: fract __fractunstihq (unsigned long long A)
 -- Runtime Function: long fract __fractunstisq (unsigned long long A)
 -- Runtime Function: long long fract __fractunstidq (unsigned long
          long A)
 -- Runtime Function: short accum __fractunstiha (unsigned long long A)
 -- Runtime Function: accum __fractunstisa (unsigned long long A)
 -- Runtime Function: long accum __fractunstida (unsigned long long A)
 -- Runtime Function: long long accum __fractunstita (unsigned long
          long A)
 -- Runtime Function: unsigned short fract __fractunstiuqq (unsigned
          long long A)
 -- Runtime Function: unsigned fract __fractunstiuhq (unsigned long
          long A)
 -- Runtime Function: unsigned long fract __fractunstiusq (unsigned
          long long A)
 -- Runtime Function: unsigned long long fract __fractunstiudq
          (unsigned long long A)
 -- Runtime Function: unsigned short accum __fractunstiuha (unsigned
          long long A)
 -- Runtime Function: unsigned accum __fractunstiusa (unsigned long
          long A)
 -- Runtime Function: unsigned long accum __fractunstiuda (unsigned
          long long A)
 -- Runtime Function: unsigned long long accum __fractunstiuta
          (unsigned long long A)
     These functions convert from fractionals to unsigned
     non-fractionals; and from unsigned non-fractionals to fractionals,
     without saturation.

 -- Runtime Function: short fract __satfractunsqiqq (unsigned char A)
 -- Runtime Function: fract __satfractunsqihq (unsigned char A)
 -- Runtime Function: long fract __satfractunsqisq (unsigned char A)
 -- Runtime Function: long long fract __satfractunsqidq (unsigned char
          A)
 -- Runtime Function: short accum __satfractunsqiha (unsigned char A)
 -- Runtime Function: accum __satfractunsqisa (unsigned char A)
 -- Runtime Function: long accum __satfractunsqida (unsigned char A)
 -- Runtime Function: long long accum __satfractunsqita (unsigned char
          A)
 -- Runtime Function: unsigned short fract __satfractunsqiuqq (unsigned
          char A)
 -- Runtime Function: unsigned fract __satfractunsqiuhq (unsigned char
          A)
 -- Runtime Function: unsigned long fract __satfractunsqiusq (unsigned
          char A)
 -- Runtime Function: unsigned long long fract __satfractunsqiudq
          (unsigned char A)
 -- Runtime Function: unsigned short accum __satfractunsqiuha (unsigned
          char A)
 -- Runtime Function: unsigned accum __satfractunsqiusa (unsigned char
          A)
 -- Runtime Function: unsigned long accum __satfractunsqiuda (unsigned
          char A)
 -- Runtime Function: unsigned long long accum __satfractunsqiuta
          (unsigned char A)
 -- Runtime Function: short fract __satfractunshiqq (unsigned short A)
 -- Runtime Function: fract __satfractunshihq (unsigned short A)
 -- Runtime Function: long fract __satfractunshisq (unsigned short A)
 -- Runtime Function: long long fract __satfractunshidq (unsigned short
          A)
 -- Runtime Function: short accum __satfractunshiha (unsigned short A)
 -- Runtime Function: accum __satfractunshisa (unsigned short A)
 -- Runtime Function: long accum __satfractunshida (unsigned short A)
 -- Runtime Function: long long accum __satfractunshita (unsigned short
          A)
 -- Runtime Function: unsigned short fract __satfractunshiuqq (unsigned
          short A)
 -- Runtime Function: unsigned fract __satfractunshiuhq (unsigned short
          A)
 -- Runtime Function: unsigned long fract __satfractunshiusq (unsigned
          short A)
 -- Runtime Function: unsigned long long fract __satfractunshiudq
          (unsigned short A)
 -- Runtime Function: unsigned short accum __satfractunshiuha (unsigned
          short A)
 -- Runtime Function: unsigned accum __satfractunshiusa (unsigned short
          A)
 -- Runtime Function: unsigned long accum __satfractunshiuda (unsigned
          short A)
 -- Runtime Function: unsigned long long accum __satfractunshiuta
          (unsigned short A)
 -- Runtime Function: short fract __satfractunssiqq (unsigned int A)
 -- Runtime Function: fract __satfractunssihq (unsigned int A)
 -- Runtime Function: long fract __satfractunssisq (unsigned int A)
 -- Runtime Function: long long fract __satfractunssidq (unsigned int A)
 -- Runtime Function: short accum __satfractunssiha (unsigned int A)
 -- Runtime Function: accum __satfractunssisa (unsigned int A)
 -- Runtime Function: long accum __satfractunssida (unsigned int A)
 -- Runtime Function: long long accum __satfractunssita (unsigned int A)
 -- Runtime Function: unsigned short fract __satfractunssiuqq (unsigned
          int A)
 -- Runtime Function: unsigned fract __satfractunssiuhq (unsigned int A)
 -- Runtime Function: unsigned long fract __satfractunssiusq (unsigned
          int A)
 -- Runtime Function: unsigned long long fract __satfractunssiudq
          (unsigned int A)
 -- Runtime Function: unsigned short accum __satfractunssiuha (unsigned
          int A)
 -- Runtime Function: unsigned accum __satfractunssiusa (unsigned int A)
 -- Runtime Function: unsigned long accum __satfractunssiuda (unsigned
          int A)
 -- Runtime Function: unsigned long long accum __satfractunssiuta
          (unsigned int A)
 -- Runtime Function: short fract __satfractunsdiqq (unsigned long A)
 -- Runtime Function: fract __satfractunsdihq (unsigned long A)
 -- Runtime Function: long fract __satfractunsdisq (unsigned long A)
 -- Runtime Function: long long fract __satfractunsdidq (unsigned long
          A)
 -- Runtime Function: short accum __satfractunsdiha (unsigned long A)
 -- Runtime Function: accum __satfractunsdisa (unsigned long A)
 -- Runtime Function: long accum __satfractunsdida (unsigned long A)
 -- Runtime Function: long long accum __satfractunsdita (unsigned long
          A)
 -- Runtime Function: unsigned short fract __satfractunsdiuqq (unsigned
          long A)
 -- Runtime Function: unsigned fract __satfractunsdiuhq (unsigned long
          A)
 -- Runtime Function: unsigned long fract __satfractunsdiusq (unsigned
          long A)
 -- Runtime Function: unsigned long long fract __satfractunsdiudq
          (unsigned long A)
 -- Runtime Function: unsigned short accum __satfractunsdiuha (unsigned
          long A)
 -- Runtime Function: unsigned accum __satfractunsdiusa (unsigned long
          A)
 -- Runtime Function: unsigned long accum __satfractunsdiuda (unsigned
          long A)
 -- Runtime Function: unsigned long long accum __satfractunsdiuta
          (unsigned long A)
 -- Runtime Function: short fract __satfractunstiqq (unsigned long long
          A)
 -- Runtime Function: fract __satfractunstihq (unsigned long long A)
 -- Runtime Function: long fract __satfractunstisq (unsigned long long
          A)
 -- Runtime Function: long long fract __satfractunstidq (unsigned long
          long A)
 -- Runtime Function: short accum __satfractunstiha (unsigned long long
          A)
 -- Runtime Function: accum __satfractunstisa (unsigned long long A)
 -- Runtime Function: long accum __satfractunstida (unsigned long long
          A)
 -- Runtime Function: long long accum __satfractunstita (unsigned long
          long A)
 -- Runtime Function: unsigned short fract __satfractunstiuqq (unsigned
          long long A)
 -- Runtime Function: unsigned fract __satfractunstiuhq (unsigned long
          long A)
 -- Runtime Function: unsigned long fract __satfractunstiusq (unsigned
          long long A)
 -- Runtime Function: unsigned long long fract __satfractunstiudq
          (unsigned long long A)
 -- Runtime Function: unsigned short accum __satfractunstiuha (unsigned
          long long A)
 -- Runtime Function: unsigned accum __satfractunstiusa (unsigned long
          long A)
 -- Runtime Function: unsigned long accum __satfractunstiuda (unsigned
          long long A)
 -- Runtime Function: unsigned long long accum __satfractunstiuta
          (unsigned long long A)
     These functions convert from unsigned non-fractionals to
     fractionals, with saturation.


File: gccint.info,  Node: Exception handling routines,  Next: Miscellaneous routines,  Prev: Fixed-point fractional library routines,  Up: Libgcc

4.5 Language-independent routines for exception handling
========================================================

document me!

       _Unwind_DeleteException
       _Unwind_Find_FDE
       _Unwind_ForcedUnwind
       _Unwind_GetGR
       _Unwind_GetIP
       _Unwind_GetLanguageSpecificData
       _Unwind_GetRegionStart
       _Unwind_GetTextRelBase
       _Unwind_GetDataRelBase
       _Unwind_RaiseException
       _Unwind_Resume
       _Unwind_SetGR
       _Unwind_SetIP
       _Unwind_FindEnclosingFunction
       _Unwind_SjLj_Register
       _Unwind_SjLj_Unregister
       _Unwind_SjLj_RaiseException
       _Unwind_SjLj_ForcedUnwind
       _Unwind_SjLj_Resume
       __deregister_frame
       __deregister_frame_info
       __deregister_frame_info_bases
       __register_frame
       __register_frame_info
       __register_frame_info_bases
       __register_frame_info_table
       __register_frame_info_table_bases
       __register_frame_table


File: gccint.info,  Node: Miscellaneous routines,  Prev: Exception handling routines,  Up: Libgcc

4.6 Miscellaneous runtime library routines
==========================================

4.6.1 Cache control functions
-----------------------------

 -- Runtime Function: void __clear_cache (char *BEG, char *END)
     This function clears the instruction cache between BEG and END.

4.6.2 Split stack functions and variables
-----------------------------------------

 -- Runtime Function: void * __splitstack_find (void *SEGMENT_ARG, void
          *SP, size_t LEN, void **NEXT_SEGMENT, void **NEXT_SP, void
          **INITIAL_SP)
     When using `-fsplit-stack', this call may be used to iterate over
     the stack segments.  It may be called like this:
            void *next_segment = NULL;
            void *next_sp = NULL;
            void *initial_sp = NULL;
            void *stack;
            size_t stack_size;
            while ((stack = __splitstack_find (next_segment, next_sp,
                                               &stack_size, &next_segment,
                                               &next_sp, &initial_sp))
                   != NULL)
              {
                /* Stack segment starts at stack and is
                   stack_size bytes long.  */
              }

     There is no way to iterate over the stack segments of a different
     thread.  However, what is permitted is for one thread to call this
     with the SEGMENT_ARG and SP arguments NULL, to pass NEXT_SEGMENT,
     NEXT_SP, and INITIAL_SP to a different thread, and then to suspend
     one way or another.  A different thread may run the subsequent
     `__splitstack_find' iterations.  Of course, this will only work if
     the first thread is suspended while the second thread is calling
     `__splitstack_find'.  If not, the second thread could be looking
     at the stack while it is changing, and anything could happen.

 -- Variable: __morestack_segments
 -- Variable: __morestack_current_segment
 -- Variable: __morestack_initial_sp
     Internal variables used by the `-fsplit-stack' implementation.


File: gccint.info,  Node: Languages,  Next: Source Tree,  Prev: Libgcc,  Up: Top

5 Language Front Ends in GCC
****************************

The interface to front ends for languages in GCC, and in particular the
`tree' structure (*note GENERIC::), was initially designed for C, and
many aspects of it are still somewhat biased towards C and C-like
languages.  It is, however, reasonably well suited to other procedural
languages, and front ends for many such languages have been written for
GCC.

 Writing a compiler as a front end for GCC, rather than compiling
directly to assembler or generating C code which is then compiled by
GCC, has several advantages:

   * GCC front ends benefit from the support for many different target
     machines already present in GCC.

   * GCC front ends benefit from all the optimizations in GCC.  Some of
     these, such as alias analysis, may work better when GCC is
     compiling directly from source code then when it is compiling from
     generated C code.

   * Better debugging information is generated when compiling directly
     from source code than when going via intermediate generated C code.

 Because of the advantages of writing a compiler as a GCC front end,
GCC front ends have also been created for languages very different from
those for which GCC was designed, such as the declarative
logic/functional language Mercury.  For these reasons, it may also be
useful to implement compilers created for specialized purposes (for
example, as part of a research project) as GCC front ends.


File: gccint.info,  Node: Source Tree,  Next: Testsuites,  Prev: Languages,  Up: Top

6 Source Tree Structure and Build System
****************************************

This chapter describes the structure of the GCC source tree, and how
GCC is built.  The user documentation for building and installing GCC
is in a separate manual (`http://gcc.gnu.org/install/'), with which it
is presumed that you are familiar.

* Menu:

* Configure Terms:: Configuration terminology and history.
* Top Level::       The top level source directory.
* gcc Directory::   The `gcc' subdirectory.


File: gccint.info,  Node: Configure Terms,  Next: Top Level,  Up: Source Tree

6.1 Configure Terms and History
===============================

The configure and build process has a long and colorful history, and can
be confusing to anyone who doesn't know why things are the way they are.
While there are other documents which describe the configuration process
in detail, here are a few things that everyone working on GCC should
know.

 There are three system names that the build knows about: the machine
you are building on ("build"), the machine that you are building for
("host"), and the machine that GCC will produce code for ("target").
When you configure GCC, you specify these with `--build=', `--host=',
and `--target='.

 Specifying the host without specifying the build should be avoided, as
`configure' may (and once did) assume that the host you specify is also
the build, which may not be true.

 If build, host, and target are all the same, this is called a
"native".  If build and host are the same but target is different, this
is called a "cross".  If build, host, and target are all different this
is called a "canadian" (for obscure reasons dealing with Canada's
political party and the background of the person working on the build
at that time).  If host and target are the same, but build is
different, you are using a cross-compiler to build a native for a
different system.  Some people call this a "host-x-host", "crossed
native", or "cross-built native".  If build and target are the same,
but host is different, you are using a cross compiler to build a cross
compiler that produces code for the machine you're building on.  This
is rare, so there is no common way of describing it.  There is a
proposal to call this a "crossback".

 If build and host are the same, the GCC you are building will also be
used to build the target libraries (like `libstdc++').  If build and
host are different, you must have already built and installed a cross
compiler that will be used to build the target libraries (if you
configured with `--target=foo-bar', this compiler will be called
`foo-bar-gcc').

 In the case of target libraries, the machine you're building for is the
machine you specified with `--target'.  So, build is the machine you're
building on (no change there), host is the machine you're building for
(the target libraries are built for the target, so host is the target
you specified), and target doesn't apply (because you're not building a
compiler, you're building libraries).  The configure/make process will
adjust these variables as needed.  It also sets `$with_cross_host' to
the original `--host' value in case you need it.

 The `libiberty' support library is built up to three times: once for
the host, once for the target (even if they are the same), and once for
the build if build and host are different.  This allows it to be used
by all programs which are generated in the course of the build process.


File: gccint.info,  Node: Top Level,  Next: gcc Directory,  Prev: Configure Terms,  Up: Source Tree

6.2 Top Level Source Directory
==============================

The top level source directory in a GCC distribution contains several
files and directories that are shared with other software distributions
such as that of GNU Binutils.  It also contains several subdirectories
that contain parts of GCC and its runtime libraries:

`boehm-gc'
     The Boehm conservative garbage collector, used as part of the Java
     runtime library.

`config'
     Autoconf macros and Makefile fragments used throughout the tree.

`contrib'
     Contributed scripts that may be found useful in conjunction with
     GCC.  One of these, `contrib/texi2pod.pl', is used to generate man
     pages from Texinfo manuals as part of the GCC build process.

`fixincludes'
     The support for fixing system headers to work with GCC.  See
     `fixincludes/README' for more information.  The headers fixed by
     this mechanism are installed in `LIBSUBDIR/include-fixed'.  Along
     with those headers, `README-fixinc' is also installed, as
     `LIBSUBDIR/include-fixed/README'.

`gcc'
     The main sources of GCC itself (except for runtime libraries),
     including optimizers, support for different target architectures,
     language front ends, and testsuites.  *Note The `gcc'
     Subdirectory: gcc Directory, for details.

`gnattools'
     Support tools for GNAT.

`include'
     Headers for the `libiberty' library.

`intl'
     GNU `libintl', from GNU `gettext', for systems which do not
     include it in `libc'.

`libada'
     The Ada runtime library.

`libatomic'
     The runtime support library for atomic operations (e.g. for
     `__sync' and `__atomic').

`libcpp'
     The C preprocessor library.

`libdecnumber'
     The Decimal Float support library.

`libffi'
     The `libffi' library, used as part of the Java runtime library.

`libgcc'
     The GCC runtime library.

`libgfortran'
     The Fortran runtime library.

`libgo'
     The Go runtime library.  The bulk of this library is mirrored from
     the master Go repository (http://code.google.com/p/go/).

`libgomp'
     The GNU OpenMP runtime library.

`libiberty'
     The `libiberty' library, used for portability and for some
     generally useful data structures and algorithms.  *Note
     Introduction: (libiberty)Top, for more information about this
     library.

`libitm'
     The runtime support library for transactional memory.

`libjava'
     The Java runtime library.

`libmudflap'
     The `libmudflap' library, used for instrumenting pointer and array
     dereferencing operations.

`libobjc'
     The Objective-C and Objective-C++ runtime library.

`libquadmath'
     The runtime support library for quad-precision math operations.

`libssp'
     The Stack protector runtime library.

`libstdc++-v3'
     The C++ runtime library.

`lto-plugin'
     Plugin used by `gold' if link-time optimizations are enabled.

`maintainer-scripts'
     Scripts used by the `gccadmin' account on `gcc.gnu.org'.

`zlib'
     The `zlib' compression library, used by the Java front end, as
     part of the Java runtime library, and for compressing and
     uncompressing GCC's intermediate language in LTO object files.

 The build system in the top level directory, including how recursion
into subdirectories works and how building runtime libraries for
multilibs is handled, is documented in a separate manual, included with
GNU Binutils.  *Note GNU configure and build system: (configure)Top,
for details.


File: gccint.info,  Node: gcc Directory,  Prev: Top Level,  Up: Source Tree

6.3 The `gcc' Subdirectory
==========================

The `gcc' directory contains many files that are part of the C sources
of GCC, other files used as part of the configuration and build
process, and subdirectories including documentation and a testsuite.
The files that are sources of GCC are documented in a separate chapter.
*Note Passes and Files of the Compiler: Passes.

* Menu:

* Subdirectories:: Subdirectories of `gcc'.
* Configuration::  The configuration process, and the files it uses.
* Build::          The build system in the `gcc' directory.
* Makefile::       Targets in `gcc/Makefile'.
* Library Files::  Library source files and headers under `gcc/'.
* Headers::        Headers installed by GCC.
* Documentation::  Building documentation in GCC.
* Front End::      Anatomy of a language front end.
* Back End::       Anatomy of a target back end.


File: gccint.info,  Node: Subdirectories,  Next: Configuration,  Up: gcc Directory

6.3.1 Subdirectories of `gcc'
-----------------------------

The `gcc' directory contains the following subdirectories:

`LANGUAGE'
     Subdirectories for various languages.  Directories containing a
     file `config-lang.in' are language subdirectories.  The contents of
     the subdirectories `c' (for C), `cp' (for C++), `objc' (for
     Objective-C), `objcp' (for Objective-C++), and `lto' (for LTO) are
     documented in this manual (*note Passes and Files of the Compiler:
     Passes.); those for other languages are not.  *Note Anatomy of a
     Language Front End: Front End, for details of the files in these
     directories.

`common'
     Source files shared between the compiler drivers (such as `gcc')
     and the compilers proper (such as `cc1').  If an architecture
     defines target hooks shared between those places, it also has a
     subdirectory in `common/config'.  *Note Target Structure::.

`config'
     Configuration files for supported architectures and operating
     systems.  *Note Anatomy of a Target Back End: Back End, for
     details of the files in this directory.

`doc'
     Texinfo documentation for GCC, together with automatically
     generated man pages and support for converting the installation
     manual to HTML.  *Note Documentation::.

`ginclude'
     System headers installed by GCC, mainly those required by the C
     standard of freestanding implementations.  *Note Headers Installed
     by GCC: Headers, for details of when these and other headers are
     installed.

`po'
     Message catalogs with translations of messages produced by GCC into
     various languages, `LANGUAGE.po'.  This directory also contains
     `gcc.pot', the template for these message catalogues, `exgettext',
     a wrapper around `gettext' to extract the messages from the GCC
     sources and create `gcc.pot', which is run by `make gcc.pot', and
     `EXCLUDES', a list of files from which messages should not be
     extracted.

`testsuite'
     The GCC testsuites (except for those for runtime libraries).
     *Note Testsuites::.


File: gccint.info,  Node: Configuration,  Next: Build,  Prev: Subdirectories,  Up: gcc Directory

6.3.2 Configuration in the `gcc' Directory
------------------------------------------

The `gcc' directory is configured with an Autoconf-generated script
`configure'.  The `configure' script is generated from `configure.ac'
and `aclocal.m4'.  From the files `configure.ac' and `acconfig.h',
Autoheader generates the file `config.in'.  The file `cstamp-h.in' is
used as a timestamp.

* Menu:

* Config Fragments::     Scripts used by `configure'.
* System Config::        The `config.build', `config.host', and
                         `config.gcc' files.
* Configuration Files::  Files created by running `configure'.


File: gccint.info,  Node: Config Fragments,  Next: System Config,  Up: Configuration

6.3.2.1 Scripts Used by `configure'
...................................

`configure' uses some other scripts to help in its work:

   * The standard GNU `config.sub' and `config.guess' files, kept in
     the top level directory, are used.

   * The file `config.gcc' is used to handle configuration specific to
     the particular target machine.  The file `config.build' is used to
     handle configuration specific to the particular build machine.
     The file `config.host' is used to handle configuration specific to
     the particular host machine.  (In general, these should only be
     used for features that cannot reasonably be tested in Autoconf
     feature tests.)  *Note The `config.build'; `config.host'; and
     `config.gcc' Files: System Config, for details of the contents of
     these files.

   * Each language subdirectory has a file `LANGUAGE/config-lang.in'
     that is used for front-end-specific configuration.  *Note The
     Front End `config-lang.in' File: Front End Config, for details of
     this file.

   * A helper script `configure.frag' is used as part of creating the
     output of `configure'.


File: gccint.info,  Node: System Config,  Next: Configuration Files,  Prev: Config Fragments,  Up: Configuration

6.3.2.2 The `config.build'; `config.host'; and `config.gcc' Files
.................................................................

The `config.build' file contains specific rules for particular systems
which GCC is built on.  This should be used as rarely as possible, as
the behavior of the build system can always be detected by autoconf.

 The `config.host' file contains specific rules for particular systems
which GCC will run on.  This is rarely needed.

 The `config.gcc' file contains specific rules for particular systems
which GCC will generate code for.  This is usually needed.

 Each file has a list of the shell variables it sets, with
descriptions, at the top of the file.

 FIXME: document the contents of these files, and what variables should
be set to control build, host and target configuration.


File: gccint.info,  Node: Configuration Files,  Prev: System Config,  Up: Configuration

6.3.2.3 Files Created by `configure'
....................................

Here we spell out what files will be set up by `configure' in the `gcc'
directory.  Some other files are created as temporary files in the
configuration process, and are not used in the subsequent build; these
are not documented.

   * `Makefile' is constructed from `Makefile.in', together with the
     host and target fragments (*note Makefile Fragments: Fragments.)
     `t-TARGET' and `x-HOST' from `config', if any, and language
     Makefile fragments `LANGUAGE/Make-lang.in'.

   * `auto-host.h' contains information about the host machine
     determined by `configure'.  If the host machine is different from
     the build machine, then `auto-build.h' is also created, containing
     such information about the build machine.

   * `config.status' is a script that may be run to recreate the
     current configuration.

   * `configargs.h' is a header containing details of the arguments
     passed to `configure' to configure GCC, and of the thread model
     used.

   * `cstamp-h' is used as a timestamp.

   * If a language `config-lang.in' file (*note The Front End
     `config-lang.in' File: Front End Config.) sets `outputs', then the
     files listed in `outputs' there are also generated.

 The following configuration headers are created from the Makefile,
using `mkconfig.sh', rather than directly by `configure'.  `config.h',
`bconfig.h' and `tconfig.h' all contain the `xm-MACHINE.h' header, if
any, appropriate to the host, build and target machines respectively,
the configuration headers for the target, and some definitions; for the
host and build machines, these include the autoconfigured headers
generated by `configure'.  The other configuration headers are
determined by `config.gcc'.  They also contain the typedefs for `rtx',
`rtvec' and `tree'.

   * `config.h', for use in programs that run on the host machine.

   * `bconfig.h', for use in programs that run on the build machine.

   * `tconfig.h', for use in programs and libraries for the target
     machine.

   * `tm_p.h', which includes the header `MACHINE-protos.h' that
     contains prototypes for functions in the target `MACHINE.c' file.
     The header `MACHINE-protos.h' can include prototypes of functions
     that use rtl and tree data structures inside appropriate `#ifdef
     RTX_CODE' and `#ifdef TREE_CODE' conditional code segements.  The
     `MACHINE-protos.h' is included after the `rtl.h' and/or `tree.h'
     would have been included.  The `tm_p.h' also includes the header
     `tm-preds.h' which is generated by `genpreds' program during the
     build to define the declarations and inline functions for the
     predicate functions.


File: gccint.info,  Node: Build,  Next: Makefile,  Prev: Configuration,  Up: gcc Directory

6.3.3 Build System in the `gcc' Directory
-----------------------------------------

FIXME: describe the build system, including what is built in what
stages.  Also list the various source files that are used in the build
process but aren't source files of GCC itself and so aren't documented
below (*note Passes::).


File: gccint.info,  Node: Makefile,  Next: Library Files,  Prev: Build,  Up: gcc Directory

6.3.4 Makefile Targets
----------------------

These targets are available from the `gcc' directory:

`all'
     This is the default target.  Depending on what your
     build/host/target configuration is, it coordinates all the things
     that need to be built.

`doc'
     Produce info-formatted documentation and man pages.  Essentially it
     calls `make man' and `make info'.

`dvi'
     Produce DVI-formatted documentation.

`pdf'
     Produce PDF-formatted documentation.

`html'
     Produce HTML-formatted documentation.

`man'
     Generate man pages.

`info'
     Generate info-formatted pages.

`mostlyclean'
     Delete the files made while building the compiler.

`clean'
     That, and all the other files built by `make all'.

`distclean'
     That, and all the files created by `configure'.

`maintainer-clean'
     Distclean plus any file that can be generated from other files.
     Note that additional tools may be required beyond what is normally
     needed to build GCC.

`srcextra'
     Generates files in the source directory that are not
     version-controlled but should go into a release tarball.

`srcinfo'
`srcman'
     Copies the info-formatted and manpage documentation into the source
     directory usually for the purpose of generating a release tarball.

`install'
     Installs GCC.

`uninstall'
     Deletes installed files, though this is not supported.

`check'
     Run the testsuite.  This creates a `testsuite' subdirectory that
     has various `.sum' and `.log' files containing the results of the
     testing.  You can run subsets with, for example, `make check-gcc'.
     You can specify specific tests by setting `RUNTESTFLAGS' to be the
     name of the `.exp' file, optionally followed by (for some tests)
     an equals and a file wildcard, like:

          make check-gcc RUNTESTFLAGS="execute.exp=19980413-*"

     Note that running the testsuite may require additional tools be
     installed, such as Tcl or DejaGnu.

 The toplevel tree from which you start GCC compilation is not the GCC
directory, but rather a complex Makefile that coordinates the various
steps of the build, including bootstrapping the compiler and using the
new compiler to build target libraries.

 When GCC is configured for a native configuration, the default action
for `make' is to do a full three-stage bootstrap.  This means that GCC
is built three times--once with the native compiler, once with the
native-built compiler it just built, and once with the compiler it
built the second time.  In theory, the last two should produce the same
results, which `make compare' can check.  Each stage is configured
separately and compiled into a separate directory, to minimize problems
due to ABI incompatibilities between the native compiler and GCC.

 If you do a change, rebuilding will also start from the first stage
and "bubble" up the change through the three stages.  Each stage is
taken from its build directory (if it had been built previously),
rebuilt, and copied to its subdirectory.  This will allow you to, for
example, continue a bootstrap after fixing a bug which causes the
stage2 build to crash.  It does not provide as good coverage of the
compiler as bootstrapping from scratch, but it ensures that the new
code is syntactically correct (e.g., that you did not use GCC extensions
by mistake), and avoids spurious bootstrap comparison failures(1).

 Other targets available from the top level include:

`bootstrap-lean'
     Like `bootstrap', except that the various stages are removed once
     they're no longer needed.  This saves disk space.

`bootstrap2'
`bootstrap2-lean'
     Performs only the first two stages of bootstrap.  Unlike a
     three-stage bootstrap, this does not perform a comparison to test
     that the compiler is running properly.  Note that the disk space
     required by a "lean" bootstrap is approximately independent of the
     number of stages.

`stageN-bubble (N = 1...4, profile, feedback)'
     Rebuild all the stages up to N, with the appropriate flags,
     "bubbling" the changes as described above.

`all-stageN (N = 1...4, profile, feedback)'
     Assuming that stage N has already been built, rebuild it with the
     appropriate flags.  This is rarely needed.

`cleanstrap'
     Remove everything (`make clean') and rebuilds (`make bootstrap').

`compare'
     Compares the results of stages 2 and 3.  This ensures that the
     compiler is running properly, since it should produce the same
     object files regardless of how it itself was compiled.

`profiledbootstrap'
     Builds a compiler with profiling feedback information.  In this
     case, the second and third stages are named `profile' and
     `feedback', respectively.  For more information, see *note
     Building with profile feedback: (gccinstall)Building.

`restrap'
     Restart a bootstrap, so that everything that was not built with
     the system compiler is rebuilt.

`stageN-start (N = 1...4, profile, feedback)'
     For each package that is bootstrapped, rename directories so that,
     for example, `gcc' points to the stageN GCC, compiled with the
     stageN-1 GCC(2).

     You will invoke this target if you need to test or debug the
     stageN GCC.  If you only need to execute GCC (but you need not run
     `make' either to rebuild it or to run test suites), you should be
     able to work directly in the `stageN-gcc' directory.  This makes
     it easier to debug multiple stages in parallel.

`stage'
     For each package that is bootstrapped, relocate its build directory
     to indicate its stage.  For example, if the `gcc' directory points
     to the stage2 GCC, after invoking this target it will be renamed
     to `stage2-gcc'.


 If you wish to use non-default GCC flags when compiling the stage2 and
stage3 compilers, set `BOOT_CFLAGS' on the command line when doing
`make'.

 Usually, the first stage only builds the languages that the compiler
is written in: typically, C and maybe Ada.  If you are debugging a
miscompilation of a different stage2 front-end (for example, of the
Fortran front-end), you may want to have front-ends for other languages
in the first stage as well.  To do so, set `STAGE1_LANGUAGES' on the
command line when doing `make'.

 For example, in the aforementioned scenario of debugging a Fortran
front-end miscompilation caused by the stage1 compiler, you may need a
command like

     make stage2-bubble STAGE1_LANGUAGES=c,fortran

 Alternatively, you can use per-language targets to build and test
languages that are not enabled by default in stage1.  For example,
`make f951' will build a Fortran compiler even in the stage1 build
directory.

 ---------- Footnotes ----------

 (1) Except if the compiler was buggy and miscompiled some of the files
that were not modified.  In this case, it's best to use `make restrap'.

 (2) Customarily, the system compiler is also termed the `stage0' GCC.


File: gccint.info,  Node: Library Files,  Next: Headers,  Prev: Makefile,  Up: gcc Directory

6.3.5 Library Source Files and Headers under the `gcc' Directory
----------------------------------------------------------------

FIXME: list here, with explanation, all the C source files and headers
under the `gcc' directory that aren't built into the GCC executable but
rather are part of runtime libraries and object files, such as
`crtstuff.c' and `unwind-dw2.c'.  *Note Headers Installed by GCC:
Headers, for more information about the `ginclude' directory.


File: gccint.info,  Node: Headers,  Next: Documentation,  Prev: Library Files,  Up: gcc Directory

6.3.6 Headers Installed by GCC
------------------------------

In general, GCC expects the system C library to provide most of the
headers to be used with it.  However, GCC will fix those headers if
necessary to make them work with GCC, and will install some headers
required of freestanding implementations.  These headers are installed
in `LIBSUBDIR/include'.  Headers for non-C runtime libraries are also
installed by GCC; these are not documented here.  (FIXME: document them
somewhere.)

 Several of the headers GCC installs are in the `ginclude' directory.
These headers, `iso646.h', `stdarg.h', `stdbool.h', and `stddef.h', are
installed in `LIBSUBDIR/include', unless the target Makefile fragment
(*note Target Fragment::) overrides this by setting `USER_H'.

 In addition to these headers and those generated by fixing system
headers to work with GCC, some other headers may also be installed in
`LIBSUBDIR/include'.  `config.gcc' may set `extra_headers'; this
specifies additional headers under `config' to be installed on some
systems.

 GCC installs its own version of `<float.h>', from `ginclude/float.h'.
This is done to cope with command-line options that change the
representation of floating point numbers.

 GCC also installs its own version of `<limits.h>'; this is generated
from `glimits.h', together with `limitx.h' and `limity.h' if the system
also has its own version of `<limits.h>'.  (GCC provides its own header
because it is required of ISO C freestanding implementations, but needs
to include the system header from its own header as well because other
standards such as POSIX specify additional values to be defined in
`<limits.h>'.)  The system's `<limits.h>' header is used via
`LIBSUBDIR/include/syslimits.h', which is copied from `gsyslimits.h' if
it does not need fixing to work with GCC; if it needs fixing,
`syslimits.h' is the fixed copy.

 GCC can also install `<tgmath.h>'.  It will do this when `config.gcc'
sets `use_gcc_tgmath' to `yes'.


File: gccint.info,  Node: Documentation,  Next: Front End,  Prev: Headers,  Up: gcc Directory

6.3.7 Building Documentation
----------------------------

The main GCC documentation is in the form of manuals in Texinfo format.
These are installed in Info format; DVI versions may be generated by
`make dvi', PDF versions by `make pdf', and HTML versions by `make
html'.  In addition, some man pages are generated from the Texinfo
manuals, there are some other text files with miscellaneous
documentation, and runtime libraries have their own documentation
outside the `gcc' directory.  FIXME: document the documentation for
runtime libraries somewhere.

* Menu:

* Texinfo Manuals::      GCC manuals in Texinfo format.
* Man Page Generation::  Generating man pages from Texinfo manuals.
* Miscellaneous Docs::   Miscellaneous text files with documentation.


File: gccint.info,  Node: Texinfo Manuals,  Next: Man Page Generation,  Up: Documentation

6.3.7.1 Texinfo Manuals
.......................

The manuals for GCC as a whole, and the C and C++ front ends, are in
files `doc/*.texi'.  Other front ends have their own manuals in files
`LANGUAGE/*.texi'.  Common files `doc/include/*.texi' are provided
which may be included in multiple manuals; the following files are in
`doc/include':

`fdl.texi'
     The GNU Free Documentation License.

`funding.texi'
     The section "Funding Free Software".

`gcc-common.texi'
     Common definitions for manuals.

`gpl_v3.texi'
     The GNU General Public License.

`texinfo.tex'
     A copy of `texinfo.tex' known to work with the GCC manuals.

 DVI-formatted manuals are generated by `make dvi', which uses
`texi2dvi' (via the Makefile macro `$(TEXI2DVI)').  PDF-formatted
manuals are generated by `make pdf', which uses `texi2pdf' (via the
Makefile macro `$(TEXI2PDF)').  HTML formatted manuals are generated by
`make html'.  Info manuals are generated by `make info' (which is run
as part of a bootstrap); this generates the manuals in the source
directory, using `makeinfo' via the Makefile macro `$(MAKEINFO)', and
they are included in release distributions.

 Manuals are also provided on the GCC web site, in both HTML and
PostScript forms.  This is done via the script
`maintainer-scripts/update_web_docs_svn'.  Each manual to be provided
online must be listed in the definition of `MANUALS' in that file; a
file `NAME.texi' must only appear once in the source tree, and the
output manual must have the same name as the source file.  (However,
other Texinfo files, included in manuals but not themselves the root
files of manuals, may have names that appear more than once in the
source tree.)  The manual file `NAME.texi' should only include other
files in its own directory or in `doc/include'.  HTML manuals will be
generated by `makeinfo --html', PostScript manuals by `texi2dvi' and
`dvips', and PDF manuals by `texi2pdf'.  All Texinfo files that are
parts of manuals must be version-controlled, even if they are generated
files, for the generation of online manuals to work.

 The installation manual, `doc/install.texi', is also provided on the
GCC web site.  The HTML version is generated by the script
`doc/install.texi2html'.


File: gccint.info,  Node: Man Page Generation,  Next: Miscellaneous Docs,  Prev: Texinfo Manuals,  Up: Documentation

6.3.7.2 Man Page Generation
...........................

Because of user demand, in addition to full Texinfo manuals, man pages
are provided which contain extracts from those manuals.  These man
pages are generated from the Texinfo manuals using
`contrib/texi2pod.pl' and `pod2man'.  (The man page for `g++',
`cp/g++.1', just contains a `.so' reference to `gcc.1', but all the
other man pages are generated from Texinfo manuals.)

 Because many systems may not have the necessary tools installed to
generate the man pages, they are only generated if the `configure'
script detects that recent enough tools are installed, and the
Makefiles allow generating man pages to fail without aborting the
build.  Man pages are also included in release distributions.  They are
generated in the source directory.

 Magic comments in Texinfo files starting `@c man' control what parts
of a Texinfo file go into a man page.  Only a subset of Texinfo is
supported by `texi2pod.pl', and it may be necessary to add support for
more Texinfo features to this script when generating new man pages.  To
improve the man page output, some special Texinfo macros are provided
in `doc/include/gcc-common.texi' which `texi2pod.pl' understands:

`@gcctabopt'
     Use in the form `@table @gcctabopt' for tables of options, where
     for printed output the effect of `@code' is better than that of
     `@option' but for man page output a different effect is wanted.

`@gccoptlist'
     Use for summary lists of options in manuals.

`@gol'
     Use at the end of each line inside `@gccoptlist'.  This is
     necessary to avoid problems with differences in how the
     `@gccoptlist' macro is handled by different Texinfo formatters.

 FIXME: describe the `texi2pod.pl' input language and magic comments in
more detail.


File: gccint.info,  Node: Miscellaneous Docs,  Prev: Man Page Generation,  Up: Documentation

6.3.7.3 Miscellaneous Documentation
...................................

In addition to the formal documentation that is installed by GCC, there
are several other text files in the `gcc' subdirectory with
miscellaneous documentation:

`ABOUT-GCC-NLS'
     Notes on GCC's Native Language Support.  FIXME: this should be
     part of this manual rather than a separate file.

`ABOUT-NLS'
     Notes on the Free Translation Project.

`COPYING'
`COPYING3'
     The GNU General Public License, Versions 2 and 3.

`COPYING.LIB'
`COPYING3.LIB'
     The GNU Lesser General Public License, Versions 2.1 and 3.

`*ChangeLog*'
`*/ChangeLog*'
     Change log files for various parts of GCC.

`LANGUAGES'
     Details of a few changes to the GCC front-end interface.  FIXME:
     the information in this file should be part of general
     documentation of the front-end interface in this manual.

`ONEWS'
     Information about new features in old versions of GCC.  (For recent
     versions, the information is on the GCC web site.)

`README.Portability'
     Information about portability issues when writing code in GCC.
     FIXME: why isn't this part of this manual or of the GCC Coding
     Conventions?

 FIXME: document such files in subdirectories, at least `config', `c',
`cp', `objc', `testsuite'.


File: gccint.info,  Node: Front End,  Next: Back End,  Prev: Documentation,  Up: gcc Directory

6.3.8 Anatomy of a Language Front End
-------------------------------------

A front end for a language in GCC has the following parts:

   * A directory `LANGUAGE' under `gcc' containing source files for
     that front end.  *Note The Front End `LANGUAGE' Directory: Front
     End Directory, for details.

   * A mention of the language in the list of supported languages in
     `gcc/doc/install.texi'.

   * A mention of the name under which the language's runtime library is
     recognized by `--enable-shared=PACKAGE' in the documentation of
     that option in `gcc/doc/install.texi'.

   * A mention of any special prerequisites for building the front end
     in the documentation of prerequisites in `gcc/doc/install.texi'.

   * Details of contributors to that front end in
     `gcc/doc/contrib.texi'.  If the details are in that front end's
     own manual then there should be a link to that manual's list in
     `contrib.texi'.

   * Information about support for that language in
     `gcc/doc/frontends.texi'.

   * Information about standards for that language, and the front end's
     support for them, in `gcc/doc/standards.texi'.  This may be a link
     to such information in the front end's own manual.

   * Details of source file suffixes for that language and `-x LANG'
     options supported, in `gcc/doc/invoke.texi'.

   * Entries in `default_compilers' in `gcc.c' for source file suffixes
     for that language.

   * Preferably testsuites, which may be under `gcc/testsuite' or
     runtime library directories.  FIXME: document somewhere how to
     write testsuite harnesses.

   * Probably a runtime library for the language, outside the `gcc'
     directory.  FIXME: document this further.

   * Details of the directories of any runtime libraries in
     `gcc/doc/sourcebuild.texi'.

   * Check targets in `Makefile.def' for the top-level `Makefile' to
     check just the compiler or the compiler and runtime library for the
     language.

 If the front end is added to the official GCC source repository, the
following are also necessary:

   * At least one Bugzilla component for bugs in that front end and
     runtime libraries.  This category needs to be added to the
     Bugzilla database.

   * Normally, one or more maintainers of that front end listed in
     `MAINTAINERS'.

   * Mentions on the GCC web site in `index.html' and `frontends.html',
     with any relevant links on `readings.html'.  (Front ends that are
     not an official part of GCC may also be listed on
     `frontends.html', with relevant links.)

   * A news item on `index.html', and possibly an announcement on the
     <gcc-announce@gcc.gnu.org> mailing list.

   * The front end's manuals should be mentioned in
     `maintainer-scripts/update_web_docs_svn' (*note Texinfo Manuals::)
     and the online manuals should be linked to from
     `onlinedocs/index.html'.

   * Any old releases or CVS repositories of the front end, before its
     inclusion in GCC, should be made available on the GCC FTP site
     `ftp://gcc.gnu.org/pub/gcc/old-releases/'.

   * The release and snapshot script `maintainer-scripts/gcc_release'
     should be updated to generate appropriate tarballs for this front
     end.

   * If this front end includes its own version files that include the
     current date, `maintainer-scripts/update_version' should be
     updated accordingly.

* Menu:

* Front End Directory::  The front end `LANGUAGE' directory.
* Front End Config::     The front end `config-lang.in' file.
* Front End Makefile::   The front end `Make-lang.in' file.


File: gccint.info,  Node: Front End Directory,  Next: Front End Config,  Up: Front End

6.3.8.1 The Front End `LANGUAGE' Directory
..........................................

A front end `LANGUAGE' directory contains the source files of that
front end (but not of any runtime libraries, which should be outside
the `gcc' directory).  This includes documentation, and possibly some
subsidiary programs built alongside the front end.  Certain files are
special and other parts of the compiler depend on their names:

`config-lang.in'
     This file is required in all language subdirectories.  *Note The
     Front End `config-lang.in' File: Front End Config, for details of
     its contents

`Make-lang.in'
     This file is required in all language subdirectories.  *Note The
     Front End `Make-lang.in' File: Front End Makefile, for details of
     its contents.

`lang.opt'
     This file registers the set of switches that the front end accepts
     on the command line, and their `--help' text.  *Note Options::.

`lang-specs.h'
     This file provides entries for `default_compilers' in `gcc.c'
     which override the default of giving an error that a compiler for
     that language is not installed.

`LANGUAGE-tree.def'
     This file, which need not exist, defines any language-specific tree
     codes.


File: gccint.info,  Node: Front End Config,  Next: Front End Makefile,  Prev: Front End Directory,  Up: Front End

6.3.8.2 The Front End `config-lang.in' File
...........................................

Each language subdirectory contains a `config-lang.in' file.  This file
is a shell script that may define some variables describing the
language:

`language'
     This definition must be present, and gives the name of the language
     for some purposes such as arguments to `--enable-languages'.

`lang_requires'
     If defined, this variable lists (space-separated) language front
     ends other than C that this front end requires to be enabled (with
     the names given being their `language' settings).  For example, the
     Java front end depends on the C++ front end, so sets
     `lang_requires=c++'.

`subdir_requires'
     If defined, this variable lists (space-separated) front end
     directories other than C that this front end requires to be
     present.  For example, the Objective-C++ front end uses source
     files from the C++ and Objective-C front ends, so sets
     `subdir_requires="cp objc"'.

`target_libs'
     If defined, this variable lists (space-separated) targets in the
     top level `Makefile' to build the runtime libraries for this
     language, such as `target-libobjc'.

`lang_dirs'
     If defined, this variable lists (space-separated) top level
     directories (parallel to `gcc'), apart from the runtime libraries,
     that should not be configured if this front end is not built.

`build_by_default'
     If defined to `no', this language front end is not built unless
     enabled in a `--enable-languages' argument.  Otherwise, front ends
     are built by default, subject to any special logic in
     `configure.ac' (as is present to disable the Ada front end if the
     Ada compiler is not already installed).

`boot_language'
     If defined to `yes', this front end is built in stage1 of the
     bootstrap.  This is only relevant to front ends written in their
     own languages.

`compilers'
     If defined, a space-separated list of compiler executables that
     will be run by the driver.  The names here will each end with
     `\$(exeext)'.

`outputs'
     If defined, a space-separated list of files that should be
     generated by `configure' substituting values in them.  This
     mechanism can be used to create a file `LANGUAGE/Makefile' from
     `LANGUAGE/Makefile.in', but this is deprecated, building
     everything from the single `gcc/Makefile' is preferred.

`gtfiles'
     If defined, a space-separated list of files that should be scanned
     by `gengtype.c' to generate the garbage collection tables and
     routines for this language.  This excludes the files that are
     common to all front ends.  *Note Type Information::.



File: gccint.info,  Node: Front End Makefile,  Prev: Front End Config,  Up: Front End

6.3.8.3 The Front End `Make-lang.in' File
.........................................

Each language subdirectory contains a `Make-lang.in' file.  It contains
targets `LANG.HOOK' (where `LANG' is the setting of `language' in
`config-lang.in') for the following values of `HOOK', and any other
Makefile rules required to build those targets (which may if necessary
use other Makefiles specified in `outputs' in `config-lang.in',
although this is deprecated).  It also adds any testsuite targets that
can use the standard rule in `gcc/Makefile.in' to the variable
`lang_checks'.

`all.cross'
`start.encap'
`rest.encap'
     FIXME: exactly what goes in each of these targets?

`tags'
     Build an `etags' `TAGS' file in the language subdirectory in the
     source tree.

`info'
     Build info documentation for the front end, in the build directory.
     This target is only called by `make bootstrap' if a suitable
     version of `makeinfo' is available, so does not need to check for
     this, and should fail if an error occurs.

`dvi'
     Build DVI documentation for the front end, in the build directory.
     This should be done using `$(TEXI2DVI)', with appropriate `-I'
     arguments pointing to directories of included files.

`pdf'
     Build PDF documentation for the front end, in the build directory.
     This should be done using `$(TEXI2PDF)', with appropriate `-I'
     arguments pointing to directories of included files.

`html'
     Build HTML documentation for the front end, in the build directory.

`man'
     Build generated man pages for the front end from Texinfo manuals
     (*note Man Page Generation::), in the build directory.  This target
     is only called if the necessary tools are available, but should
     ignore errors so as not to stop the build if errors occur; man
     pages are optional and the tools involved may be installed in a
     broken way.

`install-common'
     Install everything that is part of the front end, apart from the
     compiler executables listed in `compilers' in `config-lang.in'.

`install-info'
     Install info documentation for the front end, if it is present in
     the source directory.  This target should have dependencies on
     info files that should be installed.

`install-man'
     Install man pages for the front end.  This target should ignore
     errors.

`install-plugin'
     Install headers needed for plugins.

`srcextra'
     Copies its dependencies into the source directory.  This generally
     should be used for generated files such as Bison output files
     which are not version-controlled, but should be included in any
     release tarballs.  This target will be executed during a bootstrap
     if `--enable-generated-files-in-srcdir' was specified as a
     `configure' option.

`srcinfo'
`srcman'
     Copies its dependencies into the source directory.  These targets
     will be executed during a bootstrap if
     `--enable-generated-files-in-srcdir' was specified as a
     `configure' option.

`uninstall'
     Uninstall files installed by installing the compiler.  This is
     currently documented not to be supported, so the hook need not do
     anything.

`mostlyclean'
`clean'
`distclean'
`maintainer-clean'
     The language parts of the standard GNU `*clean' targets.  *Note
     Standard Targets for Users: (standards)Standard Targets, for
     details of the standard targets.  For GCC, `maintainer-clean'
     should delete all generated files in the source directory that are
     not version-controlled, but should not delete anything that is.

 `Make-lang.in' must also define a variable `LANG_OBJS' to a list of
host object files that are used by that language.


File: gccint.info,  Node: Back End,  Prev: Front End,  Up: gcc Directory

6.3.9 Anatomy of a Target Back End
----------------------------------

A back end for a target architecture in GCC has the following parts:

   * A directory `MACHINE' under `gcc/config', containing a machine
     description `MACHINE.md' file (*note Machine Descriptions: Machine
     Desc.), header files `MACHINE.h' and `MACHINE-protos.h' and a
     source file `MACHINE.c' (*note Target Description Macros and
     Functions: Target Macros.), possibly a target Makefile fragment
     `t-MACHINE' (*note The Target Makefile Fragment: Target
     Fragment.), and maybe some other files.  The names of these files
     may be changed from the defaults given by explicit specifications
     in `config.gcc'.

   * If necessary, a file `MACHINE-modes.def' in the `MACHINE'
     directory, containing additional machine modes to represent
     condition codes.  *Note Condition Code::, for further details.

   * An optional `MACHINE.opt' file in the `MACHINE' directory,
     containing a list of target-specific options.  You can also add
     other option files using the `extra_options' variable in
     `config.gcc'.  *Note Options::.

   * Entries in `config.gcc' (*note The `config.gcc' File: System
     Config.) for the systems with this target architecture.

   * Documentation in `gcc/doc/invoke.texi' for any command-line
     options supported by this target (*note Run-time Target
     Specification: Run-time Target.).  This means both entries in the
     summary table of options and details of the individual options.

   * Documentation in `gcc/doc/extend.texi' for any target-specific
     attributes supported (*note Defining target-specific uses of
     `__attribute__': Target Attributes.), including where the same
     attribute is already supported on some targets, which are
     enumerated in the manual.

   * Documentation in `gcc/doc/extend.texi' for any target-specific
     pragmas supported.

   * Documentation in `gcc/doc/extend.texi' of any target-specific
     built-in functions supported.

   * Documentation in `gcc/doc/extend.texi' of any target-specific
     format checking styles supported.

   * Documentation in `gcc/doc/md.texi' of any target-specific
     constraint letters (*note Constraints for Particular Machines:
     Machine Constraints.).

   * A note in `gcc/doc/contrib.texi' under the person or people who
     contributed the target support.

   * Entries in `gcc/doc/install.texi' for all target triplets
     supported with this target architecture, giving details of any
     special notes about installation for this target, or saying that
     there are no special notes if there are none.

   * Possibly other support outside the `gcc' directory for runtime
     libraries.  FIXME: reference docs for this.  The `libstdc++'
     porting manual needs to be installed as info for this to work, or
     to be a chapter of this manual.

 If the back end is added to the official GCC source repository, the
following are also necessary:

   * An entry for the target architecture in `readings.html' on the GCC
     web site, with any relevant links.

   * Details of the properties of the back end and target architecture
     in `backends.html' on the GCC web site.

   * A news item about the contribution of support for that target
     architecture, in `index.html' on the GCC web site.

   * Normally, one or more maintainers of that target listed in
     `MAINTAINERS'.  Some existing architectures may be unmaintained,
     but it would be unusual to add support for a target that does not
     have a maintainer when support is added.

   * Target triplets covering all `config.gcc' stanzas for the target,
     in the list in `contrib/config-list.mk'.


File: gccint.info,  Node: Testsuites,  Next: Options,  Prev: Source Tree,  Up: Top

7 Testsuites
************

GCC contains several testsuites to help maintain compiler quality.
Most of the runtime libraries and language front ends in GCC have
testsuites.  Currently only the C language testsuites are documented
here; FIXME: document the others.

* Menu:

* Test Idioms::     Idioms used in testsuite code.
* Test Directives:: Directives used within DejaGnu tests.
* Ada Tests::       The Ada language testsuites.
* C Tests::         The C language testsuites.
* libgcj Tests::    The Java library testsuites.
* LTO Testing::     Support for testing link-time optimizations.
* gcov Testing::    Support for testing gcov.
* profopt Testing:: Support for testing profile-directed optimizations.
* compat Testing::  Support for testing binary compatibility.
* Torture Tests::   Support for torture testing using multiple options.


File: gccint.info,  Node: Test Idioms,  Next: Test Directives,  Up: Testsuites

7.1 Idioms Used in Testsuite Code
=================================

In general, C testcases have a trailing `-N.c', starting with `-1.c',
in case other testcases with similar names are added later.  If the
test is a test of some well-defined feature, it should have a name
referring to that feature such as `FEATURE-1.c'.  If it does not test a
well-defined feature but just happens to exercise a bug somewhere in
the compiler, and a bug report has been filed for this bug in the GCC
bug database, `prBUG-NUMBER-1.c' is the appropriate form of name.
Otherwise (for miscellaneous bugs not filed in the GCC bug database),
and previously more generally, test cases are named after the date on
which they were added.  This allows people to tell at a glance whether
a test failure is because of a recently found bug that has not yet been
fixed, or whether it may be a regression, but does not give any other
information about the bug or where discussion of it may be found.  Some
other language testsuites follow similar conventions.

 In the `gcc.dg' testsuite, it is often necessary to test that an error
is indeed a hard error and not just a warning--for example, where it is
a constraint violation in the C standard, which must become an error
with `-pedantic-errors'.  The following idiom, where the first line
shown is line LINE of the file and the line that generates the error,
is used for this:

     /* { dg-bogus "warning" "warning in place of error" } */
     /* { dg-error "REGEXP" "MESSAGE" { target *-*-* } LINE } */

 It may be necessary to check that an expression is an integer constant
expression and has a certain value.  To check that `E' has value `V',
an idiom similar to the following is used:

     char x[((E) == (V) ? 1 : -1)];

 In `gcc.dg' tests, `__typeof__' is sometimes used to make assertions
about the types of expressions.  See, for example,
`gcc.dg/c99-condexpr-1.c'.  The more subtle uses depend on the exact
rules for the types of conditional expressions in the C standard; see,
for example, `gcc.dg/c99-intconst-1.c'.

 It is useful to be able to test that optimizations are being made
properly.  This cannot be done in all cases, but it can be done where
the optimization will lead to code being optimized away (for example,
where flow analysis or alias analysis should show that certain code
cannot be called) or to functions not being called because they have
been expanded as built-in functions.  Such tests go in
`gcc.c-torture/execute'.  Where code should be optimized away, a call
to a nonexistent function such as `link_failure ()' may be inserted; a
definition

     #ifndef __OPTIMIZE__
     void
     link_failure (void)
     {
       abort ();
     }
     #endif

will also be needed so that linking still succeeds when the test is run
without optimization.  When all calls to a built-in function should
have been optimized and no calls to the non-built-in version of the
function should remain, that function may be defined as `static' to
call `abort ()' (although redeclaring a function as static may not work
on all targets).

 All testcases must be portable.  Target-specific testcases must have
appropriate code to avoid causing failures on unsupported systems;
unfortunately, the mechanisms for this differ by directory.

 FIXME: discuss non-C testsuites here.


File: gccint.info,  Node: Test Directives,  Next: Ada Tests,  Prev: Test Idioms,  Up: Testsuites

7.2 Directives used within DejaGnu tests
========================================

* Menu:

* Directives::  Syntax and descriptions of test directives.
* Selectors:: Selecting targets to which a test applies.
* Effective-Target Keywords:: Keywords describing target attributes.
* Add Options:: Features for `dg-add-options'
* Require Support:: Variants of `dg-require-SUPPORT'
* Final Actions:: Commands for use in `dg-final'


File: gccint.info,  Node: Directives,  Next: Selectors,  Up: Test Directives

7.2.1 Syntax and Descriptions of test directives
------------------------------------------------

Test directives appear within comments in a test source file and begin
with `dg-'.  Some of these are defined within DejaGnu and others are
local to the GCC testsuite.

 The order in which test directives appear in a test can be important:
directives local to GCC sometimes override information used by the
DejaGnu directives, which know nothing about the GCC directives, so the
DejaGnu directives must precede GCC directives.

 Several test directives include selectors (*note Selectors::) which
are usually preceded by the keyword `target' or `xfail'.

7.2.1.1 Specify how to build the test
.....................................

`{ dg-do DO-WHAT-KEYWORD [{ target/xfail SELECTOR }] }'
     DO-WHAT-KEYWORD specifies how the test is compiled and whether it
     is executed.  It is one of:

    `preprocess'
          Compile with `-E' to run only the preprocessor.

    `compile'
          Compile with `-S' to produce an assembly code file.

    `assemble'
          Compile with `-c' to produce a relocatable object file.

    `link'
          Compile, assemble, and link to produce an executable file.

    `run'
          Produce and run an executable file, which is expected to
          return an exit code of 0.

     The default is `compile'.  That can be overridden for a set of
     tests by redefining `dg-do-what-default' within the `.exp' file
     for those tests.

     If the directive includes the optional `{ target SELECTOR }' then
     the test is skipped unless the target system matches the SELECTOR.

     If DO-WHAT-KEYWORD is `run' and the directive includes the
     optional `{ xfail SELECTOR }' and the selector is met then the
     test is expected to fail.  The `xfail' clause is ignored for other
     values of DO-WHAT-KEYWORD; those tests can use directive
     `dg-xfail-if'.

7.2.1.2 Specify additional compiler options
...........................................

`{ dg-options OPTIONS [{ target SELECTOR }] }'
     This DejaGnu directive provides a list of compiler options, to be
     used if the target system matches SELECTOR, that replace the
     default options used for this set of tests.

`{ dg-add-options FEATURE ... }'
     Add any compiler options that are needed to access certain
     features.  This directive does nothing on targets that enable the
     features by default, or that don't provide them at all.  It must
     come after all `dg-options' directives.  For supported values of
     FEATURE see *note Add Options::.

`{ dg-additional-options OPTIONS [{ target SELECTOR }] }'
     This directive provides a list of compiler options, to be used if
     the target system matches SELECTOR, that are added to the default
     options used for this set of tests.

7.2.1.3 Modify the test timeout value
.....................................

The normal timeout limit, in seconds, is found by searching the
following in order:

   * the value defined by an earlier `dg-timeout' directive in the test

   * variable TOOL_TIMEOUT defined by the set of tests

   * GCC,TIMEOUT set in the target board

   * 300

`{ dg-timeout N [{target SELECTOR }] }'
     Set the time limit for the compilation and for the execution of
     the test to the specified number of seconds.

`{ dg-timeout-factor X [{ target SELECTOR }] }'
     Multiply the normal time limit for compilation and execution of
     the test by the specified floating-point factor.

7.2.1.4 Skip a test for some targets
....................................

`{ dg-skip-if COMMENT { SELECTOR } [{ INCLUDE-OPTS } [{ EXCLUDE-OPTS }]] }'
     Arguments INCLUDE-OPTS and EXCLUDE-OPTS are lists in which each
     element is a string of zero or more GCC options.  Skip the test if
     all of the following conditions are met:
        * the test system is included in SELECTOR

        * for at least one of the option strings in INCLUDE-OPTS, every
          option from that string is in the set of options with which
          the test would be compiled; use `"*"' for an INCLUDE-OPTS list
          that matches any options; that is the default if INCLUDE-OPTS
          is not specified

        * for each of the option strings in EXCLUDE-OPTS, at least one
          option from that string is not in the set of options with
          which the test would be compiled; use `""' for an empty
          EXCLUDE-OPTS list; that is the default if EXCLUDE-OPTS is not
          specified

     For example, to skip a test if option `-Os' is present:

          /* { dg-skip-if "" { *-*-* }  { "-Os" } { "" } } */

     To skip a test if both options `-O2' and `-g' are present:

          /* { dg-skip-if "" { *-*-* }  { "-O2 -g" } { "" } } */

     To skip a test if either `-O2' or `-O3' is present:

          /* { dg-skip-if "" { *-*-* }  { "-O2" "-O3" } { "" } } */

     To skip a test unless option `-Os' is present:

          /* { dg-skip-if "" { *-*-* }  { "*" } { "-Os" } } */

     To skip a test if either `-O2' or `-O3' is used with `-g' but not
     if `-fpic' is also present:

          /* { dg-skip-if "" { *-*-* }  { "-O2 -g" "-O3 -g" } { "-fpic" } } */

`{ dg-require-effective-target KEYWORD [{ SELECTOR }] }'
     Skip the test if the test target, including current multilib flags,
     is not covered by the effective-target keyword.  If the directive
     includes the optional `{ SELECTOR }' then the effective-target
     test is only performed if the target system matches the SELECTOR.
     This directive must appear after any `dg-do' directive in the test
     and before any `dg-additional-sources' directive.  *Note
     Effective-Target Keywords::.

`{ dg-require-SUPPORT args }'
     Skip the test if the target does not provide the required support.
     These directives must appear after any `dg-do' directive in the
     test and before any `dg-additional-sources' directive.  They
     require at least one argument, which can be an empty string if the
     specific procedure does not examine the argument.  *Note Require
     Support::, for a complete list of these directives.

7.2.1.5 Expect a test to fail for some targets
..............................................

`{ dg-xfail-if COMMENT { SELECTOR } [{ INCLUDE-OPTS } [{ EXCLUDE-OPTS }]] }'
     Expect the test to fail if the conditions (which are the same as
     for `dg-skip-if') are met.  This does not affect the execute step.

`{ dg-xfail-run-if COMMENT { SELECTOR } [{ INCLUDE-OPTS } [{ EXCLUDE-OPTS }]] }'
     Expect the execute step of a test to fail if the conditions (which
     are the same as for `dg-skip-if') are met.

7.2.1.6 Expect the test executable to fail
..........................................

`{ dg-shouldfail COMMENT [{ SELECTOR } [{ INCLUDE-OPTS } [{ EXCLUDE-OPTS }]]] }'
     Expect the test executable to return a nonzero exit status if the
     conditions (which are the same as for `dg-skip-if') are met.

7.2.1.7 Verify compiler messages
................................

`{ dg-error REGEXP [COMMENT [{ target/xfail SELECTOR } [LINE] }]] }'
     This DejaGnu directive appears on a source line that is expected
     to get an error message, or else specifies the source line
     associated with the message.  If there is no message for that line
     or if the text of that message is not matched by REGEXP then the
     check fails and COMMENT is included in the `FAIL' message.  The
     check does not look for the string `error' unless it is part of
     REGEXP.

`{ dg-warning REGEXP [COMMENT [{ target/xfail SELECTOR } [LINE] }]] }'
     This DejaGnu directive appears on a source line that is expected
     to get a warning message, or else specifies the source line
     associated with the message.  If there is no message for that line
     or if the text of that message is not matched by REGEXP then the
     check fails and COMMENT is included in the `FAIL' message.  The
     check does not look for the string `warning' unless it is part of
     REGEXP.

`{ dg-message REGEXP [COMMENT [{ target/xfail SELECTOR } [LINE] }]] }'
     The line is expected to get a message other than an error or
     warning.  If there is no message for that line or if the text of
     that message is not matched by REGEXP then the check fails and
     COMMENT is included in the `FAIL' message.

`{ dg-bogus REGEXP [COMMENT [{ target/xfail SELECTOR } [LINE] }]] }'
     This DejaGnu directive appears on a source line that should not
     get a message matching REGEXP, or else specifies the source line
     associated with the bogus message.  It is usually used with `xfail'
     to indicate that the message is a known problem for a particular
     set of targets.

`{ dg-excess-errors COMMENT [{ target/xfail SELECTOR }] }'
     This DejaGnu directive indicates that the test is expected to fail
     due to compiler messages that are not handled by `dg-error',
     `dg-warning' or `dg-bogus'.  For this directive `xfail' has the
     same effect as `target'.

`{ dg-prune-output REGEXP }'
     Prune messages matching REGEXP from the test output.

7.2.1.8 Verify output of the test executable
............................................

`{ dg-output REGEXP [{ target/xfail SELECTOR }] }'
     This DejaGnu directive compares REGEXP to the combined output that
     the test executable writes to `stdout' and `stderr'.

7.2.1.9 Specify additional files for a test
...........................................

`{ dg-additional-files "FILELIST" }'
     Specify additional files, other than source files, that must be
     copied to the system where the compiler runs.

`{ dg-additional-sources "FILELIST" }'
     Specify additional source files to appear in the compile line
     following the main test file.

7.2.1.10 Add checks at the end of a test
........................................

`{ dg-final { LOCAL-DIRECTIVE } }'
     This DejaGnu directive is placed within a comment anywhere in the
     source file and is processed after the test has been compiled and
     run.  Multiple `dg-final' commands are processed in the order in
     which they appear in the source file.  *Note Final Actions::, for
     a list of directives that can be used within `dg-final'.


File: gccint.info,  Node: Selectors,  Next: Effective-Target Keywords,  Prev: Directives,  Up: Test Directives

7.2.2 Selecting targets to which a test applies
-----------------------------------------------

Several test directives include SELECTORs to limit the targets for
which a test is run or to declare that a test is expected to fail on
particular targets.

 A selector is:
   * one or more target triplets, possibly including wildcard
     characters; use `*-*-*' to match any target

   * a single effective-target keyword (*note Effective-Target
     Keywords::)

   * a logical expression

 Depending on the context, the selector specifies whether a test is
skipped and reported as unsupported or is expected to fail.  A context
that allows either `target' or `xfail' also allows `{ target SELECTOR1
xfail SELECTOR2 }' to skip the test for targets that don't match
SELECTOR1 and the test to fail for targets that match SELECTOR2.

 A selector expression appears within curly braces and uses a single
logical operator: one of `!', `&&', or `||'.  An operand is another
selector expression, an effective-target keyword, a single target
triplet, or a list of target triplets within quotes or curly braces.
For example:

     { target { ! "hppa*-*-* ia64*-*-*" } }
     { target { powerpc*-*-* && lp64 } }
     { xfail { lp64 || vect_no_align } }


File: gccint.info,  Node: Effective-Target Keywords,  Next: Add Options,  Prev: Selectors,  Up: Test Directives

7.2.3 Keywords describing target attributes
-------------------------------------------

Effective-target keywords identify sets of targets that support
particular functionality.  They are used to limit tests to be run only
for particular targets, or to specify that particular sets of targets
are expected to fail some tests.

 Effective-target keywords are defined in `lib/target-supports.exp' in
the GCC testsuite, with the exception of those that are documented as
being local to a particular test directory.

 The `effective target' takes into account all of the compiler options
with which the test will be compiled, including the multilib options.
By convention, keywords ending in `_nocache' can also include options
specified for the particular test in an earlier `dg-options' or
`dg-add-options' directive.

7.2.3.1 Data type sizes
.......................

`ilp32'
     Target has 32-bit `int', `long', and pointers.

`lp64'
     Target has 32-bit `int', 64-bit `long' and pointers.

`llp64'
     Target has 32-bit `int' and `long', 64-bit `long long' and
     pointers.

`double64'
     Target has 64-bit `double'.

`double64plus'
     Target has `double' that is 64 bits or longer.

`int32plus'
     Target has `int' that is at 32 bits or longer.

`int16'
     Target has `int' that is 16 bits or shorter.

`long_neq_int'
     Target has `int' and `long' with different sizes.

`large_double'
     Target supports `double' that is longer than `float'.

`large_long_double'
     Target supports `long double' that is longer than `double'.

`ptr32plus'
     Target has pointers that are 32 bits or longer.

`size32plus'
     Target supports array and structure sizes that are 32 bits or
     longer.

`4byte_wchar_t'
     Target has `wchar_t' that is at least 4 bytes.

7.2.3.2 Fortran-specific attributes
...................................

`fortran_integer_16'
     Target supports Fortran `integer' that is 16 bytes or longer.

`fortran_large_int'
     Target supports Fortran `integer' kinds larger than `integer(8)'.

`fortran_large_real'
     Target supports Fortran `real' kinds larger than `real(8)'.

7.2.3.3 Vector-specific attributes
..................................

`vect_condition'
     Target supports vector conditional operations.

`vect_double'
     Target supports hardware vectors of `double'.

`vect_float'
     Target supports hardware vectors of `float'.

`vect_int'
     Target supports hardware vectors of `int'.

`vect_long'
     Target supports hardware vectors of `long'.

`vect_long_long'
     Target supports hardware vectors of `long long'.

`vect_aligned_arrays'
     Target aligns arrays to vector alignment boundary.

`vect_hw_misalign'
     Target supports a vector misalign access.

`vect_no_align'
     Target does not support a vector alignment mechanism.

`vect_no_int_max'
     Target does not support a vector max instruction on `int'.

`vect_no_int_add'
     Target does not support a vector add instruction on `int'.

`vect_no_bitwise'
     Target does not support vector bitwise instructions.

`vect_char_mult'
     Target supports `vector char' multiplication.

`vect_short_mult'
     Target supports `vector short' multiplication.

`vect_int_mult'
     Target supports `vector int' multiplication.

`vect_extract_even_odd'
     Target supports vector even/odd element extraction.

`vect_extract_even_odd_wide'
     Target supports vector even/odd element extraction of vectors with
     elements `SImode' or larger.

`vect_interleave'
     Target supports vector interleaving.

`vect_strided'
     Target supports vector interleaving and extract even/odd.

`vect_strided_wide'
     Target supports vector interleaving and extract even/odd for wide
     element types.

`vect_perm'
     Target supports vector permutation.

`vect_shift'
     Target supports a hardware vector shift operation.

`vect_widen_sum_hi_to_si'
     Target supports a vector widening summation of `short' operands
     into `int' results, or can promote (unpack) from `short' to `int'.

`vect_widen_sum_qi_to_hi'
     Target supports a vector widening summation of `char' operands
     into `short' results, or can promote (unpack) from `char' to
     `short'.

`vect_widen_sum_qi_to_si'
     Target supports a vector widening summation of `char' operands
     into `int' results.

`vect_widen_mult_qi_to_hi'
     Target supports a vector widening multiplication of `char' operands
     into `short' results, or can promote (unpack) from `char' to
     `short' and perform non-widening multiplication of `short'.

`vect_widen_mult_hi_to_si'
     Target supports a vector widening multiplication of `short'
     operands into `int' results, or can promote (unpack) from `short'
     to `int' and perform non-widening multiplication of `int'.

`vect_sdot_qi'
     Target supports a vector dot-product of `signed char'.

`vect_udot_qi'
     Target supports a vector dot-product of `unsigned char'.

`vect_sdot_hi'
     Target supports a vector dot-product of `signed short'.

`vect_udot_hi'
     Target supports a vector dot-product of `unsigned short'.

`vect_pack_trunc'
     Target supports a vector demotion (packing) of `short' to `char'
     and from `int' to `short' using modulo arithmetic.

`vect_unpack'
     Target supports a vector promotion (unpacking) of `char' to `short'
     and from `char' to `int'.

`vect_intfloat_cvt'
     Target supports conversion from `signed int' to `float'.

`vect_uintfloat_cvt'
     Target supports conversion from `unsigned int' to `float'.

`vect_floatint_cvt'
     Target supports conversion from `float' to `signed int'.

`vect_floatuint_cvt'
     Target supports conversion from `float' to `unsigned int'.

7.2.3.4 Thread Local Storage attributes
.......................................

`tls'
     Target supports thread-local storage.

`tls_native'
     Target supports native (rather than emulated) thread-local storage.

`tls_runtime'
     Test system supports executing TLS executables.

7.2.3.5 Decimal floating point attributes
.........................................

`dfp'
     Targets supports compiling decimal floating point extension to C.

`dfp_nocache'
     Including the options used to compile this particular test, the
     target supports compiling decimal floating point extension to C.

`dfprt'
     Test system can execute decimal floating point tests.

`dfprt_nocache'
     Including the options used to compile this particular test, the
     test system can execute decimal floating point tests.

`hard_dfp'
     Target generates decimal floating point instructions with current
     options.

7.2.3.6 ARM-specific attributes
...............................

`arm32'
     ARM target generates 32-bit code.

`arm_eabi'
     ARM target adheres to the ABI for the ARM Architecture.

`arm_hf_eabi'
     ARM target adheres to the VFP and Advanced SIMD Register Arguments
     variant of the ABI for the ARM Architecture (as selected with
     `-mfloat-abi=hard').

`arm_hard_vfp_ok'
     ARM target supports `-mfpu=vfp -mfloat-abi=hard'.  Some multilibs
     may be incompatible with these options.

`arm_iwmmxt_ok'
     ARM target supports `-mcpu=iwmmxt'.  Some multilibs may be
     incompatible with this option.

`arm_neon'
     ARM target supports generating NEON instructions.

`arm_neon_hw'
     Test system supports executing NEON instructions.

`arm_neonv2_hw'
     Test system supports executing NEON v2 instructions.

`arm_neon_ok'
     ARM Target supports `-mfpu=neon -mfloat-abi=softfp' or compatible
     options.  Some multilibs may be incompatible with these options.

`arm_neonv2_ok'
     ARM Target supports `-mfpu=neon-vfpv4 -mfloat-abi=softfp' or
     compatible options.  Some multilibs may be incompatible with these
     options.

`arm_neon_fp16_ok'
     ARM Target supports `-mfpu=neon-fp16 -mfloat-abi=softfp' or
     compatible options.  Some multilibs may be incompatible with these
     options.

`arm_thumb1_ok'
     ARM target generates Thumb-1 code for `-mthumb'.

`arm_thumb2_ok'
     ARM target generates Thumb-2 code for `-mthumb'.

`arm_vfp_ok'
     ARM target supports `-mfpu=vfp -mfloat-abi=softfp'.  Some
     multilibs may be incompatible with these options.

`arm_v8_vfp_ok'
     ARM target supports `-mfpu=fp-armv8 -mfloat-abi=softfp'.  Some
     multilibs may be incompatible with these options.

`arm_v8_neon_ok'
     ARM target supports `-mfpu=neon-fp-armv8 -mfloat-abi=softfp'.
     Some multilibs may be incompatible with these options.

`arm_prefer_ldrd_strd'
     ARM target prefers `LDRD' and `STRD' instructions over `LDM' and
     `STM' instructions.


7.2.3.7 MIPS-specific attributes
................................

`mips64'
     MIPS target supports 64-bit instructions.

`nomips16'
     MIPS target does not produce MIPS16 code.

`mips16_attribute'
     MIPS target can generate MIPS16 code.

`mips_loongson'
     MIPS target is a Loongson-2E or -2F target using an ABI that
     supports the Loongson vector modes.

`mips_newabi_large_long_double'
     MIPS target supports `long double' larger than `double' when using
     the new ABI.

`mpaired_single'
     MIPS target supports `-mpaired-single'.

7.2.3.8 PowerPC-specific attributes
...................................

`powerpc64'
     Test system supports executing 64-bit instructions.

`powerpc_altivec'
     PowerPC target supports AltiVec.

`powerpc_altivec_ok'
     PowerPC target supports `-maltivec'.

`powerpc_fprs'
     PowerPC target supports floating-point registers.

`powerpc_hard_double'
     PowerPC target supports hardware double-precision floating-point.

`powerpc_ppu_ok'
     PowerPC target supports `-mcpu=cell'.

`powerpc_spe'
     PowerPC target supports PowerPC SPE.

`powerpc_spe_nocache'
     Including the options used to compile this particular test, the
     PowerPC target supports PowerPC SPE.

`powerpc_spu'
     PowerPC target supports PowerPC SPU.

`spu_auto_overlay'
     SPU target has toolchain that supports automatic overlay
     generation.

`powerpc_vsx_ok'
     PowerPC target supports `-mvsx'.

`powerpc_405_nocache'
     Including the options used to compile this particular test, the
     PowerPC target supports PowerPC 405.

`vmx_hw'
     PowerPC target supports executing AltiVec instructions.

7.2.3.9 Other hardware attributes
.................................

`avx'
     Target supports compiling `avx' instructions.

`avx_runtime'
     Target supports the execution of `avx' instructions.

`cell_hw'
     Test system can execute AltiVec and Cell PPU instructions.

`coldfire_fpu'
     Target uses a ColdFire FPU.

`hard_float'
     Target supports FPU instructions.

`sse'
     Target supports compiling `sse' instructions.

`sse_runtime'
     Target supports the execution of `sse' instructions.

`sse2'
     Target supports compiling `sse2' instructions.

`sse2_runtime'
     Target supports the execution of `sse2' instructions.

`sync_char_short'
     Target supports atomic operations on `char' and `short'.

`sync_int_long'
     Target supports atomic operations on `int' and `long'.

`ultrasparc_hw'
     Test environment appears to run executables on a simulator that
     accepts only `EM_SPARC' executables and chokes on `EM_SPARC32PLUS'
     or `EM_SPARCV9' executables.

`vect_cmdline_needed'
     Target requires a command line argument to enable a SIMD
     instruction set.

7.2.3.10 Environment attributes
...............................

`c'
     The language for the compiler under test is C.

`c++'
     The language for the compiler under test is C++.

`c99_runtime'
     Target provides a full C99 runtime.

`correct_iso_cpp_string_wchar_protos'
     Target `string.h' and `wchar.h' headers provide C++ required
     overloads for `strchr' etc. functions.

`dummy_wcsftime'
     Target uses a dummy `wcsftime' function that always returns zero.

`fd_truncate'
     Target can truncate a file from a file descriptor, as used by
     `libgfortran/io/unix.c:fd_truncate'; i.e. `ftruncate' or `chsize'.

`freestanding'
     Target is `freestanding' as defined in section 4 of the C99
     standard.  Effectively, it is a target which supports no extra
     headers or libraries other than what is considered essential.

`init_priority'
     Target supports constructors with initialization priority
     arguments.

`inttypes_types'
     Target has the basic signed and unsigned types in `inttypes.h'.
     This is for tests that GCC's notions of these types agree with
     those in the header, as some systems have only `inttypes.h'.

`lax_strtofp'
     Target might have errors of a few ULP in string to floating-point
     conversion functions and overflow is not always detected correctly
     by those functions.

`mmap'
     Target supports `mmap'.

`newlib'
     Target supports Newlib.

`pow10'
     Target provides `pow10' function.

`pthread'
     Target can compile using `pthread.h' with no errors or warnings.

`pthread_h'
     Target has `pthread.h'.

`run_expensive_tests'
     Expensive testcases (usually those that consume excessive amounts
     of CPU time) should be run on this target.  This can be enabled by
     setting the `GCC_TEST_RUN_EXPENSIVE' environment variable to a
     non-empty string.

`simulator'
     Test system runs executables on a simulator (i.e. slowly) rather
     than hardware (i.e. fast).

`stdint_types'
     Target has the basic signed and unsigned C types in `stdint.h'.
     This will be obsolete when GCC ensures a working `stdint.h' for
     all targets.

`trampolines'
     Target supports trampolines.

`uclibc'
     Target supports uClibc.

`unwrapped'
     Target does not use a status wrapper.

`vxworks_kernel'
     Target is a VxWorks kernel.

`vxworks_rtp'
     Target is a VxWorks RTP.

`wchar'
     Target supports wide characters.

7.2.3.11 Other attributes
.........................

`automatic_stack_alignment'
     Target supports automatic stack alignment.

`cxa_atexit'
     Target uses `__cxa_atexit'.

`default_packed'
     Target has packed layout of structure members by default.

`fgraphite'
     Target supports Graphite optimizations.

`fixed_point'
     Target supports fixed-point extension to C.

`fopenmp'
     Target supports OpenMP via `-fopenmp'.

`fpic'
     Target supports `-fpic' and `-fPIC'.

`freorder'
     Target supports `-freorder-blocks-and-partition'.

`fstack_protector'
     Target supports `-fstack-protector'.

`gas'
     Target uses GNU `as'.

`gc_sections'
     Target supports `--gc-sections'.

`gld'
     Target uses GNU `ld'.

`keeps_null_pointer_checks'
     Target keeps null pointer checks, either due to the use of
     `-fno-delete-null-pointer-checks' or hardwired into the target.

`lto'
     Compiler has been configured to support link-time optimization
     (LTO).

`naked_functions'
     Target supports the `naked' function attribute.

`named_sections'
     Target supports named sections.

`natural_alignment_32'
     Target uses natural alignment (aligned to type size) for types of
     32 bits or less.

`target_natural_alignment_64'
     Target uses natural alignment (aligned to type size) for types of
     64 bits or less.

`nonpic'
     Target does not generate PIC by default.

`pcc_bitfield_type_matters'
     Target defines `PCC_BITFIELD_TYPE_MATTERS'.

`pe_aligned_commons'
     Target supports `-mpe-aligned-commons'.

`pie'
     Target supports `-pie', `-fpie' and `-fPIE'.

`section_anchors'
     Target supports section anchors.

`short_enums'
     Target defaults to short enums.

`static'
     Target supports `-static'.

`static_libgfortran'
     Target supports statically linking `libgfortran'.

`string_merging'
     Target supports merging string constants at link time.

`ucn'
     Target supports compiling and assembling UCN.

`ucn_nocache'
     Including the options used to compile this particular test, the
     target supports compiling and assembling UCN.

`unaligned_stack'
     Target does not guarantee that its `STACK_BOUNDARY' is greater than
     or equal to the required vector alignment.

`vector_alignment_reachable'
     Vector alignment is reachable for types of 32 bits or less.

`vector_alignment_reachable_for_64bit'
     Vector alignment is reachable for types of 64 bits or less.

`wchar_t_char16_t_compatible'
     Target supports `wchar_t' that is compatible with `char16_t'.

`wchar_t_char32_t_compatible'
     Target supports `wchar_t' that is compatible with `char32_t'.

7.2.3.12 Local to tests in `gcc.target/i386'
............................................

`3dnow'
     Target supports compiling `3dnow' instructions.

`aes'
     Target supports compiling `aes' instructions.

`fma4'
     Target supports compiling `fma4' instructions.

`ms_hook_prologue'
     Target supports attribute `ms_hook_prologue'.

`pclmul'
     Target supports compiling `pclmul' instructions.

`sse3'
     Target supports compiling `sse3' instructions.

`sse4'
     Target supports compiling `sse4' instructions.

`sse4a'
     Target supports compiling `sse4a' instructions.

`ssse3'
     Target supports compiling `ssse3' instructions.

`vaes'
     Target supports compiling `vaes' instructions.

`vpclmul'
     Target supports compiling `vpclmul' instructions.

`xop'
     Target supports compiling `xop' instructions.

7.2.3.13 Local to tests in `gcc.target/spu/ea'
..............................................

`ealib'
     Target `__ea' library functions are available.

7.2.3.14 Local to tests in `gcc.test-framework'
...............................................

`no'
     Always returns 0.

`yes'
     Always returns 1.


File: gccint.info,  Node: Add Options,  Next: Require Support,  Prev: Effective-Target Keywords,  Up: Test Directives

7.2.4 Features for `dg-add-options'
-----------------------------------

The supported values of FEATURE for directive `dg-add-options' are:

`arm_neon'
     NEON support.  Only ARM targets support this feature, and only then
     in certain modes; see the *note arm_neon_ok effective target
     keyword: arm_neon_ok.

`arm_neon_fp16'
     NEON and half-precision floating point support.  Only ARM targets
     support this feature, and only then in certain modes; see the
     *note arm_neon_fp16_ok effective target keyword: arm_neon_ok.

`bind_pic_locally'
     Add the target-specific flags needed to enable functions to bind
     locally when using pic/PIC passes in the testsuite.

`c99_runtime'
     Add the target-specific flags needed to access the C99 runtime.

`ieee'
     Add the target-specific flags needed to enable full IEEE
     compliance mode.

`mips16_attribute'
     `mips16' function attributes.  Only MIPS targets support this
     feature, and only then in certain modes.

`tls'
     Add the target-specific flags needed to use thread-local storage.


File: gccint.info,  Node: Require Support,  Next: Final Actions,  Prev: Add Options,  Up: Test Directives

7.2.5 Variants of `dg-require-SUPPORT'
--------------------------------------

A few of the `dg-require' directives take arguments.

`dg-require-iconv CODESET'
     Skip the test if the target does not support iconv.  CODESET is
     the codeset to convert to.

`dg-require-profiling PROFOPT'
     Skip the test if the target does not support profiling with option
     PROFOPT.

`dg-require-visibility VIS'
     Skip the test if the target does not support the `visibility'
     attribute.  If VIS is `""', support for `visibility("hidden")' is
     checked, for `visibility("VIS")' otherwise.

 The original `dg-require' directives were defined before there was
support for effective-target keywords.  The directives that do not take
arguments could be replaced with effective-target keywords.

`dg-require-alias ""'
     Skip the test if the target does not support the `alias' attribute.

`dg-require-ascii-locale ""'
     Skip the test if the host does not support an ASCII locale.

`dg-require-compat-dfp ""'
     Skip this test unless both compilers in a `compat' testsuite
     support decimal floating point.

`dg-require-cxa-atexit ""'
     Skip the test if the target does not support `__cxa_atexit'.  This
     is equivalent to `dg-require-effective-target cxa_atexit'.

`dg-require-dll ""'
     Skip the test if the target does not support DLL attributes.

`dg-require-fork ""'
     Skip the test if the target does not support `fork'.

`dg-require-gc-sections ""'
     Skip the test if the target's linker does not support the
     `--gc-sections' flags.  This is equivalent to
     `dg-require-effective-target gc-sections'.

`dg-require-host-local ""'
     Skip the test if the host is remote, rather than the same as the
     build system.  Some tests are incompatible with DejaGnu's handling
     of remote hosts, which involves copying the source file to the
     host and compiling it with a relative path and "`-o a.out'".

`dg-require-mkfifo ""'
     Skip the test if the target does not support `mkfifo'.

`dg-require-named-sections ""'
     Skip the test is the target does not support named sections.  This
     is equivalent to `dg-require-effective-target named_sections'.

`dg-require-weak ""'
     Skip the test if the target does not support weak symbols.

`dg-require-weak-override ""'
     Skip the test if the target does not support overriding weak
     symbols.


File: gccint.info,  Node: Final Actions,  Prev: Require Support,  Up: Test Directives

7.2.6 Commands for use in `dg-final'
------------------------------------

The GCC testsuite defines the following directives to be used within
`dg-final'.

7.2.6.1 Scan a particular file
..............................

`scan-file FILENAME REGEXP [{ target/xfail SELECTOR }]'
     Passes if REGEXP matches text in FILENAME.

`scan-file-not FILENAME REGEXP [{ target/xfail SELECTOR }]'
     Passes if REGEXP does not match text in FILENAME.

`scan-module MODULE REGEXP [{ target/xfail SELECTOR }]'
     Passes if REGEXP matches in Fortran module MODULE.

7.2.6.2 Scan the assembly output
................................

`scan-assembler REGEX [{ target/xfail SELECTOR }]'
     Passes if REGEX matches text in the test's assembler output.

`scan-assembler-not REGEX [{ target/xfail SELECTOR }]'
     Passes if REGEX does not match text in the test's assembler output.

`scan-assembler-times REGEX NUM [{ target/xfail SELECTOR }]'
     Passes if REGEX is matched exactly NUM times in the test's
     assembler output.

`scan-assembler-dem REGEX [{ target/xfail SELECTOR }]'
     Passes if REGEX matches text in the test's demangled assembler
     output.

`scan-assembler-dem-not REGEX [{ target/xfail SELECTOR }]'
     Passes if REGEX does not match text in the test's demangled
     assembler output.

`scan-hidden SYMBOL [{ target/xfail SELECTOR }]'
     Passes if SYMBOL is defined as a hidden symbol in the test's
     assembly output.

`scan-not-hidden SYMBOL [{ target/xfail SELECTOR }]'
     Passes if SYMBOL is not defined as a hidden symbol in the test's
     assembly output.

7.2.6.3 Scan optimization dump files
....................................

These commands are available for KIND of `tree', `rtl', and `ipa'.

`scan-KIND-dump REGEX SUFFIX [{ target/xfail SELECTOR }]'
     Passes if REGEX matches text in the dump file with suffix SUFFIX.

`scan-KIND-dump-not REGEX SUFFIX [{ target/xfail SELECTOR }]'
     Passes if REGEX does not match text in the dump file with suffix
     SUFFIX.

`scan-KIND-dump-times REGEX NUM SUFFIX [{ target/xfail SELECTOR }]'
     Passes if REGEX is found exactly NUM times in the dump file with
     suffix SUFFIX.

`scan-KIND-dump-dem REGEX SUFFIX [{ target/xfail SELECTOR }]'
     Passes if REGEX matches demangled text in the dump file with
     suffix SUFFIX.

`scan-KIND-dump-dem-not REGEX SUFFIX [{ target/xfail SELECTOR }]'
     Passes if REGEX does not match demangled text in the dump file with
     suffix SUFFIX.

7.2.6.4 Verify that an output files exists or not
.................................................

`output-exists [{ target/xfail SELECTOR }]'
     Passes if compiler output file exists.

`output-exists-not [{ target/xfail SELECTOR }]'
     Passes if compiler output file does not exist.

7.2.6.5 Check for LTO tests
...........................

`scan-symbol REGEXP [{ target/xfail SELECTOR }]'
     Passes if the pattern is present in the final executable.

7.2.6.6 Checks for `gcov' tests
...............................

`run-gcov SOURCEFILE'
     Check line counts in `gcov' tests.

`run-gcov [branches] [calls] { OPTS SOURCEFILE }'
     Check branch and/or call counts, in addition to line counts, in
     `gcov' tests.

7.2.6.7 Clean up generated test files
.....................................

`cleanup-coverage-files'
     Removes coverage data files generated for this test.

`cleanup-ipa-dump SUFFIX'
     Removes IPA dump files generated for this test.

`cleanup-modules "LIST-OF-EXTRA-MODULES"'
     Removes Fortran module files generated for this test, excluding the
     module names listed in keep-modules.  Cleaning up module files is
     usually done automatically by the testsuite by looking at the
     source files and removing the modules after the test has been
     executed.
          module MoD1
          end module MoD1
          module Mod2
          end module Mod2
          module moD3
          end module moD3
          module mod4
          end module mod4
          ! { dg-final { cleanup-modules "mod1 mod2" } } ! redundant
          ! { dg-final { keep-modules "mod3 mod4" } }

`keep-modules "LIST-OF-MODULES-NOT-TO-DELETE"'
     Whitespace separated list of module names that should not be
     deleted by cleanup-modules.  If the list of modules is empty, all
     modules defined in this file are kept.
          module maybe_unneeded
          end module maybe_unneeded
          module keep1
          end module keep1
          module keep2
          end module keep2
          ! { dg-final { keep-modules "keep1 keep2" } } ! just keep these two
          ! { dg-final { keep-modules "" } } ! keep all

`cleanup-profile-file'
     Removes profiling files generated for this test.

`cleanup-repo-files'
     Removes files generated for this test for `-frepo'.

`cleanup-rtl-dump SUFFIX'
     Removes RTL dump files generated for this test.

`cleanup-saved-temps'
     Removes files for the current test which were kept for
     `-save-temps'.

`cleanup-tree-dump SUFFIX'
     Removes tree dump files matching SUFFIX which were generated for
     this test.


File: gccint.info,  Node: Ada Tests,  Next: C Tests,  Prev: Test Directives,  Up: Testsuites

7.3 Ada Language Testsuites
===========================

The Ada testsuite includes executable tests from the ACATS testsuite,
publicly available at `http://www.ada-auth.org/acats.html'.

 These tests are integrated in the GCC testsuite in the `ada/acats'
directory, and enabled automatically when running `make check', assuming
the Ada language has been enabled when configuring GCC.

 You can also run the Ada testsuite independently, using `make
check-ada', or run a subset of the tests by specifying which chapter to
run, e.g.:

     $ make check-ada CHAPTERS="c3 c9"

 The tests are organized by directory, each directory corresponding to
a chapter of the Ada Reference Manual.  So for example, `c9' corresponds
to chapter 9, which deals with tasking features of the language.

 There is also an extra chapter called `gcc' containing a template for
creating new executable tests, although this is deprecated in favor of
the `gnat.dg' testsuite.

 The tests are run using two `sh' scripts: `run_acats' and
`run_all.sh'.  To run the tests using a simulator or a cross target,
see the small customization section at the top of `run_all.sh'.

 These tests are run using the build tree: they can be run without doing
a `make install'.


File: gccint.info,  Node: C Tests,  Next: libgcj Tests,  Prev: Ada Tests,  Up: Testsuites

7.4 C Language Testsuites
=========================

GCC contains the following C language testsuites, in the
`gcc/testsuite' directory:

`gcc.dg'
     This contains tests of particular features of the C compiler,
     using the more modern `dg' harness.  Correctness tests for various
     compiler features should go here if possible.

     Magic comments determine whether the file is preprocessed,
     compiled, linked or run.  In these tests, error and warning
     message texts are compared against expected texts or regular
     expressions given in comments.  These tests are run with the
     options `-ansi -pedantic' unless other options are given in the
     test.  Except as noted below they are not run with multiple
     optimization options.

`gcc.dg/compat'
     This subdirectory contains tests for binary compatibility using
     `lib/compat.exp', which in turn uses the language-independent
     support (*note Support for testing binary compatibility: compat
     Testing.).

`gcc.dg/cpp'
     This subdirectory contains tests of the preprocessor.

`gcc.dg/debug'
     This subdirectory contains tests for debug formats.  Tests in this
     subdirectory are run for each debug format that the compiler
     supports.

`gcc.dg/format'
     This subdirectory contains tests of the `-Wformat' format
     checking.  Tests in this directory are run with and without
     `-DWIDE'.

`gcc.dg/noncompile'
     This subdirectory contains tests of code that should not compile
     and does not need any special compilation options.  They are run
     with multiple optimization options, since sometimes invalid code
     crashes the compiler with optimization.

`gcc.dg/special'
     FIXME: describe this.

`gcc.c-torture'
     This contains particular code fragments which have historically
     broken easily.  These tests are run with multiple optimization
     options, so tests for features which only break at some
     optimization levels belong here.  This also contains tests to
     check that certain optimizations occur.  It might be worthwhile to
     separate the correctness tests cleanly from the code quality
     tests, but it hasn't been done yet.

`gcc.c-torture/compat'
     FIXME: describe this.

     This directory should probably not be used for new tests.

`gcc.c-torture/compile'
     This testsuite contains test cases that should compile, but do not
     need to link or run.  These test cases are compiled with several
     different combinations of optimization options.  All warnings are
     disabled for these test cases, so this directory is not suitable if
     you wish to test for the presence or absence of compiler warnings.
     While special options can be set, and tests disabled on specific
     platforms, by the use of `.x' files, mostly these test cases
     should not contain platform dependencies.  FIXME: discuss how
     defines such as `NO_LABEL_VALUES' and `STACK_SIZE' are used.

`gcc.c-torture/execute'
     This testsuite contains test cases that should compile, link and
     run; otherwise the same comments as for `gcc.c-torture/compile'
     apply.

`gcc.c-torture/execute/ieee'
     This contains tests which are specific to IEEE floating point.

`gcc.c-torture/unsorted'
     FIXME: describe this.

     This directory should probably not be used for new tests.

`gcc.misc-tests'
     This directory contains C tests that require special handling.
     Some of these tests have individual expect files, and others share
     special-purpose expect files:

    ``bprob*.c''
          Test `-fbranch-probabilities' using
          `gcc.misc-tests/bprob.exp', which in turn uses the generic,
          language-independent framework (*note Support for testing
          profile-directed optimizations: profopt Testing.).

    ``gcov*.c''
          Test `gcov' output using `gcov.exp', which in turn uses the
          language-independent support (*note Support for testing gcov:
          gcov Testing.).

    ``i386-pf-*.c''
          Test i386-specific support for data prefetch using
          `i386-prefetch.exp'.

`gcc.test-framework'

    ``dg-*.c''
          Test the testsuite itself using
          `gcc.test-framework/test-framework.exp'.


 FIXME: merge in `testsuite/README.gcc' and discuss the format of test
cases and magic comments more.


File: gccint.info,  Node: libgcj Tests,  Next: LTO Testing,  Prev: C Tests,  Up: Testsuites

7.5 The Java library testsuites.
================================

Runtime tests are executed via `make check' in the
`TARGET/libjava/testsuite' directory in the build tree.  Additional
runtime tests can be checked into this testsuite.

 Regression testing of the core packages in libgcj is also covered by
the Mauve testsuite.  The Mauve Project develops tests for the Java
Class Libraries.  These tests are run as part of libgcj testing by
placing the Mauve tree within the libjava testsuite sources at
`libjava/testsuite/libjava.mauve/mauve', or by specifying the location
of that tree when invoking `make', as in `make MAUVEDIR=~/mauve check'.

 To detect regressions, a mechanism in `mauve.exp' compares the
failures for a test run against the list of expected failures in
`libjava/testsuite/libjava.mauve/xfails' from the source hierarchy.
Update this file when adding new failing tests to Mauve, or when fixing
bugs in libgcj that had caused Mauve test failures.

 We encourage developers to contribute test cases to Mauve.


File: gccint.info,  Node: LTO Testing,  Next: gcov Testing,  Prev: libgcj Tests,  Up: Testsuites

7.6 Support for testing link-time optimizations
===============================================

Tests for link-time optimizations usually require multiple source files
that are compiled separately, perhaps with different sets of options.
There are several special-purpose test directives used for these tests.

`{ dg-lto-do DO-WHAT-KEYWORD }'
     DO-WHAT-KEYWORD specifies how the test is compiled and whether it
     is executed.  It is one of:

    `assemble'
          Compile with `-c' to produce a relocatable object file.

    `link'
          Compile, assemble, and link to produce an executable file.

    `run'
          Produce and run an executable file, which is expected to
          return an exit code of 0.

     The default is `assemble'.  That can be overridden for a set of
     tests by redefining `dg-do-what-default' within the `.exp' file
     for those tests.

     Unlike `dg-do', `dg-lto-do' does not support an optional `target'
     or `xfail' list.  Use `dg-skip-if', `dg-xfail-if', or
     `dg-xfail-run-if'.

`{ dg-lto-options { { OPTIONS } [{ OPTIONS }] } [{ target SELECTOR }]}'
     This directive provides a list of one or more sets of compiler
     options to override LTO_OPTIONS.  Each test will be compiled and
     run with each of these sets of options.

`{ dg-extra-ld-options OPTIONS [{ target SELECTOR }]}'
     This directive adds OPTIONS to the linker options used.

`{ dg-suppress-ld-options OPTIONS [{ target SELECTOR }]}'
     This directive removes OPTIONS from the set of linker options used.


File: gccint.info,  Node: gcov Testing,  Next: profopt Testing,  Prev: LTO Testing,  Up: Testsuites

7.7 Support for testing `gcov'
==============================

Language-independent support for testing `gcov', and for checking that
branch profiling produces expected values, is provided by the expect
file `lib/gcov.exp'.  `gcov' tests also rely on procedures in
`lib/gcc-dg.exp' to compile and run the test program.  A typical `gcov'
test contains the following DejaGnu commands within comments:

     { dg-options "-fprofile-arcs -ftest-coverage" }
     { dg-do run { target native } }
     { dg-final { run-gcov sourcefile } }

 Checks of `gcov' output can include line counts, branch percentages,
and call return percentages.  All of these checks are requested via
commands that appear in comments in the test's source file.  Commands
to check line counts are processed by default.  Commands to check
branch percentages and call return percentages are processed if the
`run-gcov' command has arguments `branches' or `calls', respectively.
For example, the following specifies checking both, as well as passing
`-b' to `gcov':

     { dg-final { run-gcov branches calls { -b sourcefile } } }

 A line count command appears within a comment on the source line that
is expected to get the specified count and has the form `count(CNT)'.
A test should only check line counts for lines that will get the same
count for any architecture.

 Commands to check branch percentages (`branch') and call return
percentages (`returns') are very similar to each other.  A beginning
command appears on or before the first of a range of lines that will
report the percentage, and the ending command follows that range of
lines.  The beginning command can include a list of percentages, all of
which are expected to be found within the range.  A range is terminated
by the next command of the same kind.  A command `branch(end)' or
`returns(end)' marks the end of a range without starting a new one.
For example:

     if (i > 10 && j > i && j < 20)  /* branch(27 50 75) */
                                     /* branch(end) */
       foo (i, j);

 For a call return percentage, the value specified is the percentage of
calls reported to return.  For a branch percentage, the value is either
the expected percentage or 100 minus that value, since the direction of
a branch can differ depending on the target or the optimization level.

 Not all branches and calls need to be checked.  A test should not
check for branches that might be optimized away or replaced with
predicated instructions.  Don't check for calls inserted by the
compiler or ones that might be inlined or optimized away.

 A single test can check for combinations of line counts, branch
percentages, and call return percentages.  The command to check a line
count must appear on the line that will report that count, but commands
to check branch percentages and call return percentages can bracket the
lines that report them.


File: gccint.info,  Node: profopt Testing,  Next: compat Testing,  Prev: gcov Testing,  Up: Testsuites

7.8 Support for testing profile-directed optimizations
======================================================

The file `profopt.exp' provides language-independent support for
checking correct execution of a test built with profile-directed
optimization.  This testing requires that a test program be built and
executed twice.  The first time it is compiled to generate profile
data, and the second time it is compiled to use the data that was
generated during the first execution.  The second execution is to
verify that the test produces the expected results.

 To check that the optimization actually generated better code, a test
can be built and run a third time with normal optimizations to verify
that the performance is better with the profile-directed optimizations.
`profopt.exp' has the beginnings of this kind of support.

 `profopt.exp' provides generic support for profile-directed
optimizations.  Each set of tests that uses it provides information
about a specific optimization:

`tool'
     tool being tested, e.g., `gcc'

`profile_option'
     options used to generate profile data

`feedback_option'
     options used to optimize using that profile data

`prof_ext'
     suffix of profile data files

`PROFOPT_OPTIONS'
     list of options with which to run each test, similar to the lists
     for torture tests

`{ dg-final-generate { LOCAL-DIRECTIVE } }'
     This directive is similar to `dg-final', but the LOCAL-DIRECTIVE
     is run after the generation of profile data.

`{ dg-final-use { LOCAL-DIRECTIVE } }'
     The LOCAL-DIRECTIVE is run after the profile data have been used.


File: gccint.info,  Node: compat Testing,  Next: Torture Tests,  Prev: profopt Testing,  Up: Testsuites

7.9 Support for testing binary compatibility
============================================

The file `compat.exp' provides language-independent support for binary
compatibility testing.  It supports testing interoperability of two
compilers that follow the same ABI, or of multiple sets of compiler
options that should not affect binary compatibility.  It is intended to
be used for testsuites that complement ABI testsuites.

 A test supported by this framework has three parts, each in a separate
source file: a main program and two pieces that interact with each
other to split up the functionality being tested.

`TESTNAME_main.SUFFIX'
     Contains the main program, which calls a function in file
     `TESTNAME_x.SUFFIX'.

`TESTNAME_x.SUFFIX'
     Contains at least one call to a function in `TESTNAME_y.SUFFIX'.

`TESTNAME_y.SUFFIX'
     Shares data with, or gets arguments from, `TESTNAME_x.SUFFIX'.

 Within each test, the main program and one functional piece are
compiled by the GCC under test.  The other piece can be compiled by an
alternate compiler.  If no alternate compiler is specified, then all
three source files are all compiled by the GCC under test.  You can
specify pairs of sets of compiler options.  The first element of such a
pair specifies options used with the GCC under test, and the second
element of the pair specifies options used with the alternate compiler.
Each test is compiled with each pair of options.

 `compat.exp' defines default pairs of compiler options.  These can be
overridden by defining the environment variable `COMPAT_OPTIONS' as:

     COMPAT_OPTIONS="[list [list {TST1} {ALT1}]
       ...[list {TSTN} {ALTN}]]"

 where TSTI and ALTI are lists of options, with TSTI used by the
compiler under test and ALTI used by the alternate compiler.  For
example, with `[list [list {-g -O0} {-O3}] [list {-fpic} {-fPIC -O2}]]',
the test is first built with `-g -O0' by the compiler under test and
with `-O3' by the alternate compiler.  The test is built a second time
using `-fpic' by the compiler under test and `-fPIC -O2' by the
alternate compiler.

 An alternate compiler is specified by defining an environment variable
to be the full pathname of an installed compiler; for C define
`ALT_CC_UNDER_TEST', and for C++ define `ALT_CXX_UNDER_TEST'.  These
will be written to the `site.exp' file used by DejaGnu.  The default is
to build each test with the compiler under test using the first of each
pair of compiler options from `COMPAT_OPTIONS'.  When
`ALT_CC_UNDER_TEST' or `ALT_CXX_UNDER_TEST' is `same', each test is
built using the compiler under test but with combinations of the
options from `COMPAT_OPTIONS'.

 To run only the C++ compatibility suite using the compiler under test
and another version of GCC using specific compiler options, do the
following from `OBJDIR/gcc':

     rm site.exp
     make -k \
       ALT_CXX_UNDER_TEST=${alt_prefix}/bin/g++ \
       COMPAT_OPTIONS="LISTS AS SHOWN ABOVE" \
       check-c++ \
       RUNTESTFLAGS="compat.exp"

 A test that fails when the source files are compiled with different
compilers, but passes when the files are compiled with the same
compiler, demonstrates incompatibility of the generated code or runtime
support.  A test that fails for the alternate compiler but passes for
the compiler under test probably tests for a bug that was fixed in the
compiler under test but is present in the alternate compiler.

 The binary compatibility tests support a small number of test framework
commands that appear within comments in a test file.

`dg-require-*'
     These commands can be used in `TESTNAME_main.SUFFIX' to skip the
     test if specific support is not available on the target.

`dg-options'
     The specified options are used for compiling this particular source
     file, appended to the options from `COMPAT_OPTIONS'.  When this
     command appears in `TESTNAME_main.SUFFIX' the options are also
     used to link the test program.

`dg-xfail-if'
     This command can be used in a secondary source file to specify that
     compilation is expected to fail for particular options on
     particular targets.


File: gccint.info,  Node: Torture Tests,  Prev: compat Testing,  Up: Testsuites

7.10 Support for torture testing using multiple options
=======================================================

Throughout the compiler testsuite there are several directories whose
tests are run multiple times, each with a different set of options.
These are known as torture tests.  `lib/torture-options.exp' defines
procedures to set up these lists:

`torture-init'
     Initialize use of torture lists.

`set-torture-options'
     Set lists of torture options to use for tests with and without
     loops.  Optionally combine a set of torture options with a set of
     other options, as is done with Objective-C runtime options.

`torture-finish'
     Finalize use of torture lists.

 The `.exp' file for a set of tests that use torture options must
include calls to these three procedures if:

   * It calls `gcc-dg-runtest' and overrides DG_TORTURE_OPTIONS.

   * It calls ${TOOL}`-torture' or ${TOOL}`-torture-execute', where
     TOOL is `c', `fortran', or `objc'.

   * It calls `dg-pch'.

 It is not necessary for a `.exp' file that calls `gcc-dg-runtest' to
call the torture procedures if the tests should use the list in
DG_TORTURE_OPTIONS defined in `gcc-dg.exp'.

 Most uses of torture options can override the default lists by defining
TORTURE_OPTIONS or add to the default list by defining
ADDITIONAL_TORTURE_OPTIONS.  Define these in a `.dejagnurc' file or add
them to the `site.exp' file; for example

     set ADDITIONAL_TORTURE_OPTIONS  [list \
       { -O2 -ftree-loop-linear } \
       { -O2 -fpeel-loops } ]


File: gccint.info,  Node: Options,  Next: Passes,  Prev: Testsuites,  Up: Top

8 Option specification files
****************************

Most GCC command-line options are described by special option
definition files, the names of which conventionally end in `.opt'.
This chapter describes the format of these files.

* Menu:

* Option file format::   The general layout of the files
* Option properties::    Supported option properties


File: gccint.info,  Node: Option file format,  Next: Option properties,  Up: Options

8.1 Option file format
======================

Option files are a simple list of records in which each field occupies
its own line and in which the records themselves are separated by blank
lines.  Comments may appear on their own line anywhere within the file
and are preceded by semicolons.  Whitespace is allowed before the
semicolon.

 The files can contain the following types of record:

   * A language definition record.  These records have two fields: the
     string `Language' and the name of the language.  Once a language
     has been declared in this way, it can be used as an option
     property.  *Note Option properties::.

   * A target specific save record to save additional information. These
     records have two fields: the string `TargetSave', and a
     declaration type to go in the `cl_target_option' structure.

   * A variable record to define a variable used to store option
     information.  These records have two fields: the string
     `Variable', and a declaration of the type and name of the
     variable, optionally with an initializer (but without any trailing
     `;').  These records may be used for variables used for many
     options where declaring the initializer in a single option
     definition record, or duplicating it in many records, would be
     inappropriate, or for variables set in option handlers rather than
     referenced by `Var' properties.

   * A variable record to define a variable used to store option
     information.  These records have two fields: the string
     `TargetVariable', and a declaration of the type and name of the
     variable, optionally with an initializer (but without any trailing
     `;').  `TargetVariable' is a combination of `Variable' and
     `TargetSave' records in that the variable is defined in the
     `gcc_options' structure, but these variables are also stored in
     the `cl_target_option' structure.  The variables are saved in the
     target save code and restored in the target restore code.

   * A variable record to record any additional files that the
     `options.h' file should include.  This is useful to provide
     enumeration or structure definitions needed for target variables.
     These records have two fields: the string `HeaderInclude' and the
     name of the include file.

   * A variable record to record any additional files that the
     `options.c' or `options-save.c' file should include.  This is
     useful to provide inline functions needed for target variables
     and/or `#ifdef' sequences to properly set up the initialization.
     These records have two fields: the string `SourceInclude' and the
     name of the include file.

   * An enumeration record to define a set of strings that may be used
     as arguments to an option or options.  These records have three
     fields: the string `Enum', a space-separated list of properties
     and help text used to describe the set of strings in `--help'
     output.  Properties use the same format as option properties; the
     following are valid:
    `Name(NAME)'
          This property is required; NAME must be a name (suitable for
          use in C identifiers) used to identify the set of strings in
          `Enum' option properties.

    `Type(TYPE)'
          This property is required; TYPE is the C type for variables
          set by options using this enumeration together with `Var'.

    `UnknownError(MESSAGE)'
          The message MESSAGE will be used as an error message if the
          argument is invalid; for enumerations without `UnknownError',
          a generic error message is used.  MESSAGE should contain a
          single `%qs' format, which will be used to format the invalid
          argument.

   * An enumeration value record to define one of the strings in a set
     given in an `Enum' record.  These records have two fields: the
     string `EnumValue' and a space-separated list of properties.
     Properties use the same format as option properties; the following
     are valid:
    `Enum(NAME)'
          This property is required; NAME says which `Enum' record this
          `EnumValue' record corresponds to.

    `String(STRING)'
          This property is required; STRING is the string option
          argument being described by this record.

    `Value(VALUE)'
          This property is required; it says what value (representable
          as `int') should be used for the given string.

    `Canonical'
          This property is optional.  If present, it says the present
          string is the canonical one among all those with the given
          value.  Other strings yielding that value will be mapped to
          this one so specs do not need to handle them.

    `DriverOnly'
          This property is optional.  If present, the present string
          will only be accepted by the driver.  This is used for cases
          such as `-march=native' that are processed by the driver so
          that `gcc -v' shows how the options chosen depended on the
          system on which the compiler was run.

   * An option definition record.  These records have the following
     fields:
       1. the name of the option, with the leading "-" removed

       2. a space-separated list of option properties (*note Option
          properties::)

       3. the help text to use for `--help' (omitted if the second field
          contains the `Undocumented' property).

     By default, all options beginning with "f", "W" or "m" are
     implicitly assumed to take a "no-" form.  This form should not be
     listed separately.  If an option beginning with one of these
     letters does not have a "no-" form, you can use the
     `RejectNegative' property to reject it.

     The help text is automatically line-wrapped before being displayed.
     Normally the name of the option is printed on the left-hand side of
     the output and the help text is printed on the right.  However, if
     the help text contains a tab character, the text to the left of
     the tab is used instead of the option's name and the text to the
     right of the tab forms the help text.  This allows you to
     elaborate on what type of argument the option takes.

   * A target mask record.  These records have one field of the form
     `Mask(X)'.  The options-processing script will automatically
     allocate a bit in `target_flags' (*note Run-time Target::) for
     each mask name X and set the macro `MASK_X' to the appropriate
     bitmask.  It will also declare a `TARGET_X' macro that has the
     value 1 when bit `MASK_X' is set and 0 otherwise.

     They are primarily intended to declare target masks that are not
     associated with user options, either because these masks represent
     internal switches or because the options are not available on all
     configurations and yet the masks always need to be defined.


File: gccint.info,  Node: Option properties,  Prev: Option file format,  Up: Options

8.2 Option properties
=====================

The second field of an option record can specify any of the following
properties.  When an option takes an argument, it is enclosed in
parentheses following the option property name.  The parser that
handles option files is quite simplistic, and will be tricked by any
nested parentheses within the argument text itself; in this case, the
entire option argument can be wrapped in curly braces within the
parentheses to demarcate it, e.g.:

     Condition({defined (USE_CYGWIN_LIBSTDCXX_WRAPPERS)})

`Common'
     The option is available for all languages and targets.

`Target'
     The option is available for all languages but is target-specific.

`Driver'
     The option is handled by the compiler driver using code not shared
     with the compilers proper (`cc1' etc.).

`LANGUAGE'
     The option is available when compiling for the given language.

     It is possible to specify several different languages for the same
     option.  Each LANGUAGE must have been declared by an earlier
     `Language' record.  *Note Option file format::.

`RejectDriver'
     The option is only handled by the compilers proper (`cc1' etc.)
     and should not be accepted by the driver.

`RejectNegative'
     The option does not have a "no-" form.  All options beginning with
     "f", "W" or "m" are assumed to have a "no-" form unless this
     property is used.

`Negative(OTHERNAME)'
     The option will turn off another option OTHERNAME, which is the
     option name with the leading "-" removed.  This chain action will
     propagate through the `Negative' property of the option to be
     turned off.

     As a consequence, if you have a group of mutually-exclusive
     options, their `Negative' properties should form a circular chain.
     For example, if options `-A', `-B' and `-C' are mutually
     exclusive, their respective `Negative' properties should be
     `Negative(B)', `Negative(C)' and `Negative(A)'.

`Joined'
`Separate'
     The option takes a mandatory argument.  `Joined' indicates that
     the option and argument can be included in the same `argv' entry
     (as with `-mflush-func=NAME', for example).  `Separate' indicates
     that the option and argument can be separate `argv' entries (as
     with `-o').  An option is allowed to have both of these properties.

`JoinedOrMissing'
     The option takes an optional argument.  If the argument is given,
     it will be part of the same `argv' entry as the option itself.

     This property cannot be used alongside `Joined' or `Separate'.

`MissingArgError(MESSAGE)'
     For an option marked `Joined' or `Separate', the message MESSAGE
     will be used as an error message if the mandatory argument is
     missing; for options without `MissingArgError', a generic error
     message is used.  MESSAGE should contain a single `%qs' format,
     which will be used to format the name of the option passed.

`Args(N)'
     For an option marked `Separate', indicate that it takes N
     arguments.  The default is 1.

`UInteger'
     The option's argument is a non-negative integer.  The option parser
     will check and convert the argument before passing it to the
     relevant option handler.  `UInteger' should also be used on
     options like `-falign-loops' where both `-falign-loops' and
     `-falign-loops'=N are supported to make sure the saved options are
     given a full integer.

`ToLower'
     The option's argument should be converted to lowercase as part of
     putting it in canonical form, and before comparing with the strings
     indicated by any `Enum' property.

`NoDriverArg'
     For an option marked `Separate', the option only takes an argument
     in the compiler proper, not in the driver.  This is for
     compatibility with existing options that are used both directly and
     via `-Wp,'; new options should not have this property.

`Var(VAR)'
     The state of this option should be stored in variable VAR
     (actually a macro for `global_options.x_VAR').  The way that the
     state is stored depends on the type of option:

        * If the option uses the `Mask' or `InverseMask' properties,
          VAR is the integer variable that contains the mask.

        * If the option is a normal on/off switch, VAR is an integer
          variable that is nonzero when the option is enabled.  The
          options parser will set the variable to 1 when the positive
          form of the option is used and 0 when the "no-" form is used.

        * If the option takes an argument and has the `UInteger'
          property, VAR is an integer variable that stores the value of
          the argument.

        * If the option takes an argument and has the `Enum' property,
          VAR is a variable (type given in the `Type' property of the
          `Enum' record whose `Name' property has the same argument as
          the `Enum' property of this option) that stores the value of
          the argument.

        * If the option has the `Defer' property, VAR is a pointer to a
          `VEC(cl_deferred_option,heap)' that stores the option for
          later processing.  (VAR is declared with type `void *' and
          needs to be cast to `VEC(cl_deferred_option,heap)' before
          use.)

        * Otherwise, if the option takes an argument, VAR is a pointer
          to the argument string.  The pointer will be null if the
          argument is optional and wasn't given.

     The option-processing script will usually zero-initialize VAR.
     You can modify this behavior using `Init'.

`Var(VAR, SET)'
     The option controls an integer variable VAR and is active when VAR
     equals SET.  The option parser will set VAR to SET when the
     positive form of the option is used and `!SET' when the "no-" form
     is used.

     VAR is declared in the same way as for the single-argument form
     described above.

`Init(VALUE)'
     The variable specified by the `Var' property should be statically
     initialized to VALUE.  If more than one option using the same
     variable specifies `Init', all must specify the same initializer.

`Mask(NAME)'
     The option is associated with a bit in the `target_flags' variable
     (*note Run-time Target::) and is active when that bit is set.  You
     may also specify `Var' to select a variable other than
     `target_flags'.

     The options-processing script will automatically allocate a unique
     bit for the option.  If the option is attached to `target_flags',
     the script will set the macro `MASK_NAME' to the appropriate
     bitmask.  It will also declare a `TARGET_NAME' macro that has the
     value 1 when the option is active and 0 otherwise.  If you use
     `Var' to attach the option to a different variable, the bitmask
     macro with be called `OPTION_MASK_NAME'.

`InverseMask(OTHERNAME)'
`InverseMask(OTHERNAME, THISNAME)'
     The option is the inverse of another option that has the
     `Mask(OTHERNAME)' property.  If THISNAME is given, the
     options-processing script will declare a `TARGET_THISNAME' macro
     that is 1 when the option is active and 0 otherwise.

`Enum(NAME)'
     The option's argument is a string from the set of strings
     associated with the corresponding `Enum' record.  The string is
     checked and converted to the integer specified in the corresponding
     `EnumValue' record before being passed to option handlers.

`Defer'
     The option should be stored in a vector, specified with `Var', for
     later processing.

`Alias(OPT)'
`Alias(OPT, ARG)'
`Alias(OPT, POSARG, NEGARG)'
     The option is an alias for `-OPT' (or the negative form of that
     option, depending on `NegativeAlias').  In the first form, any
     argument passed to the alias is considered to be passed to `-OPT',
     and `-OPT' is considered to be negated if the alias is used in
     negated form.  In the second form, the alias may not be negated or
     have an argument, and POSARG is considered to be passed as an
     argument to `-OPT'.  In the third form, the alias may not have an
     argument, if the alias is used in the positive form then POSARG is
     considered to be passed to `-OPT', and if the alias is used in the
     negative form then NEGARG is considered to be passed to `-OPT'.

     Aliases should not specify `Var' or `Mask' or `UInteger'.  Aliases
     should normally specify the same languages as the target of the
     alias; the flags on the target will be used to determine any
     diagnostic for use of an option for the wrong language, while
     those on the alias will be used to identify what command-line text
     is the option and what text is any argument to that option.

     When an `Alias' definition is used for an option, driver specs do
     not need to handle it and no `OPT_' enumeration value is defined
     for it; only the canonical form of the option will be seen in those
     places.

`NegativeAlias'
     For an option marked with `Alias(OPT)', the option is considered
     to be an alias for the positive form of `-OPT' if negated and for
     the negative form of `-OPT' if not negated.  `NegativeAlias' may
     not be used with the forms of `Alias' taking more than one
     argument.

`Ignore'
     This option is ignored apart from printing any warning specified
     using `Warn'.  The option will not be seen by specs and no `OPT_'
     enumeration value is defined for it.

`SeparateAlias'
     For an option marked with `Joined', `Separate' and `Alias', the
     option only acts as an alias when passed a separate argument; with
     a joined argument it acts as a normal option, with an `OPT_'
     enumeration value.  This is for compatibility with the Java `-d'
     option and should not be used for new options.

`Warn(MESSAGE)'
     If this option is used, output the warning MESSAGE.  MESSAGE is a
     format string, either taking a single operand with a `%qs' format
     which is the option name, or not taking any operands, which is
     passed to the `warning' function.  If an alias is marked `Warn',
     the target of the alias must not also be marked `Warn'.

`Report'
     The state of the option should be printed by `-fverbose-asm'.

`Warning'
     This is a warning option and should be shown as such in `--help'
     output.  This flag does not currently affect anything other than
     `--help'.

`Optimization'
     This is an optimization option.  It should be shown as such in
     `--help' output, and any associated variable named using `Var'
     should be saved and restored when the optimization level is
     changed with `optimize' attributes.

`Undocumented'
     The option is deliberately missing documentation and should not be
     included in the `--help' output.

`Condition(COND)'
     The option should only be accepted if preprocessor condition COND
     is true.  Note that any C declarations associated with the option
     will be present even if COND is false; COND simply controls
     whether the option is accepted and whether it is printed in the
     `--help' output.

`Save'
     Build the `cl_target_option' structure to hold a copy of the
     option, add the functions `cl_target_option_save' and
     `cl_target_option_restore' to save and restore the options.

`SetByCombined'
     The option may also be set by a combined option such as
     `-ffast-math'.  This causes the `gcc_options' struct to have a
     field `frontend_set_NAME', where `NAME' is the name of the field
     holding the value of this option (without the leading `x_').  This
     gives the front end a way to indicate that the value has been set
     explicitly and should not be changed by the combined option.  For
     example, some front ends use this to prevent `-ffast-math' and
     `-fno-fast-math' from changing the value of `-fmath-errno' for
     languages that do not use `errno'.

`EnabledBy(OPT)'
`EnabledBy(OPT && OPT2)'
     If not explicitly set, the option is set to the value of `-OPT'.
     The second form specifies that the option is only set if both OPT
     and OPT2 are set.

`LangEnabledBy(LANGUAGE, OPT)'
`LangEnabledBy(LANGUAGE, OPT, POSARG, NEGARG)'
     When compiling for the given language, the option is set to the
     value of `-OPT', if not explicitly set. In the second form, if OPT
     is used in the positive form then POSARG is considered to be
     passed to the option, and if OPT is used in the negative form then
     NEGARG is considered to be passed to the option.  It is possible
     to specify several different languages.  Each LANGUAGE must have
     been declared by an earlier `Language' record.  *Note Option file
     format::.

`NoDWARFRecord'
     The option is omitted from the producer string written by
     `-grecord-gcc-switches'.


File: gccint.info,  Node: Passes,  Next: GENERIC,  Prev: Options,  Up: Top

9 Passes and Files of the Compiler
**********************************

This chapter is dedicated to giving an overview of the optimization and
code generation passes of the compiler.  In the process, it describes
some of the language front end interface, though this description is no
where near complete.

* Menu:

* Parsing pass::         The language front end turns text into bits.
* Gimplification pass::  The bits are turned into something we can optimize.
* Pass manager::         Sequencing the optimization passes.
* Tree SSA passes::      Optimizations on a high-level representation.
* RTL passes::           Optimizations on a low-level representation.


File: gccint.info,  Node: Parsing pass,  Next: Gimplification pass,  Up: Passes

9.1 Parsing pass
================

The language front end is invoked only once, via
`lang_hooks.parse_file', to parse the entire input.  The language front
end may use any intermediate language representation deemed
appropriate.  The C front end uses GENERIC trees (*note GENERIC::), plus
a double handful of language specific tree codes defined in
`c-common.def'.  The Fortran front end uses a completely different
private representation.

 At some point the front end must translate the representation used in
the front end to a representation understood by the language-independent
portions of the compiler.  Current practice takes one of two forms.
The C front end manually invokes the gimplifier (*note GIMPLE::) on
each function, and uses the gimplifier callbacks to convert the
language-specific tree nodes directly to GIMPLE before passing the
function off to be compiled.  The Fortran front end converts from a
private representation to GENERIC, which is later lowered to GIMPLE
when the function is compiled.  Which route to choose probably depends
on how well GENERIC (plus extensions) can be made to match up with the
source language and necessary parsing data structures.

 BUG: Gimplification must occur before nested function lowering, and
nested function lowering must be done by the front end before passing
the data off to cgraph.

 TODO: Cgraph should control nested function lowering.  It would only
be invoked when it is certain that the outer-most function is used.

 TODO: Cgraph needs a gimplify_function callback.  It should be invoked
when (1) it is certain that the function is used, (2) warning flags
specified by the user require some amount of compilation in order to
honor, (3) the language indicates that semantic analysis is not
complete until gimplification occurs.  Hum... this sounds overly
complicated.  Perhaps we should just have the front end gimplify
always; in most cases it's only one function call.

 The front end needs to pass all function definitions and top level
declarations off to the middle-end so that they can be compiled and
emitted to the object file.  For a simple procedural language, it is
usually most convenient to do this as each top level declaration or
definition is seen.  There is also a distinction to be made between
generating functional code and generating complete debug information.
The only thing that is absolutely required for functional code is that
function and data _definitions_ be passed to the middle-end.  For
complete debug information, function, data and type declarations should
all be passed as well.

 In any case, the front end needs each complete top-level function or
data declaration, and each data definition should be passed to
`rest_of_decl_compilation'.  Each complete type definition should be
passed to `rest_of_type_compilation'.  Each function definition should
be passed to `cgraph_finalize_function'.

 TODO: I know rest_of_compilation currently has all sorts of RTL
generation semantics.  I plan to move all code generation bits (both
Tree and RTL) to compile_function.  Should we hide cgraph from the
front ends and move back to rest_of_compilation as the official
interface?  Possibly we should rename all three interfaces such that
the names match in some meaningful way and that is more descriptive
than "rest_of".

 The middle-end will, at its option, emit the function and data
definitions immediately or queue them for later processing.


File: gccint.info,  Node: Gimplification pass,  Next: Pass manager,  Prev: Parsing pass,  Up: Passes

9.2 Gimplification pass
=======================

"Gimplification" is a whimsical term for the process of converting the
intermediate representation of a function into the GIMPLE language
(*note GIMPLE::).  The term stuck, and so words like "gimplification",
"gimplify", "gimplifier" and the like are sprinkled throughout this
section of code.

 While a front end may certainly choose to generate GIMPLE directly if
it chooses, this can be a moderately complex process unless the
intermediate language used by the front end is already fairly simple.
Usually it is easier to generate GENERIC trees plus extensions and let
the language-independent gimplifier do most of the work.

 The main entry point to this pass is `gimplify_function_tree' located
in `gimplify.c'.  From here we process the entire function gimplifying
each statement in turn.  The main workhorse for this pass is
`gimplify_expr'.  Approximately everything passes through here at least
once, and it is from here that we invoke the `lang_hooks.gimplify_expr'
callback.

 The callback should examine the expression in question and return
`GS_UNHANDLED' if the expression is not a language specific construct
that requires attention.  Otherwise it should alter the expression in
some way to such that forward progress is made toward producing valid
GIMPLE.  If the callback is certain that the transformation is complete
and the expression is valid GIMPLE, it should return `GS_ALL_DONE'.
Otherwise it should return `GS_OK', which will cause the expression to
be processed again.  If the callback encounters an error during the
transformation (because the front end is relying on the gimplification
process to finish semantic checks), it should return `GS_ERROR'.


File: gccint.info,  Node: Pass manager,  Next: Tree SSA passes,  Prev: Gimplification pass,  Up: Passes

9.3 Pass manager
================

The pass manager is located in `passes.c', `tree-optimize.c' and
`tree-pass.h'.  Its job is to run all of the individual passes in the
correct order, and take care of standard bookkeeping that applies to
every pass.

 The theory of operation is that each pass defines a structure that
represents everything we need to know about that pass--when it should
be run, how it should be run, what intermediate language form or
on-the-side data structures it needs.  We register the pass to be run
in some particular order, and the pass manager arranges for everything
to happen in the correct order.

 The actuality doesn't completely live up to the theory at present.
Command-line switches and `timevar_id_t' enumerations must still be
defined elsewhere.  The pass manager validates constraints but does not
attempt to (re-)generate data structures or lower intermediate language
form based on the requirements of the next pass.  Nevertheless, what is
present is useful, and a far sight better than nothing at all.

 Each pass should have a unique name.  Each pass may have its own dump
file (for GCC debugging purposes).  Passes with a name starting with a
star do not dump anything.  Sometimes passes are supposed to share a
dump file / option name.  To still give these unique names, you can use
a prefix that is delimited by a space from the part that is used for
the dump file / option name.  E.g. When the pass name is "ud dce", the
name used for dump file/options is "dce".

 TODO: describe the global variables set up by the pass manager, and a
brief description of how a new pass should use it.  I need to look at
what info RTL passes use first...


File: gccint.info,  Node: Tree SSA passes,  Next: RTL passes,  Prev: Pass manager,  Up: Passes

9.4 Tree SSA passes
===================

The following briefly describes the Tree optimization passes that are
run after gimplification and what source files they are located in.

   * Remove useless statements

     This pass is an extremely simple sweep across the gimple code in
     which we identify obviously dead code and remove it.  Here we do
     things like simplify `if' statements with constant conditions,
     remove exception handling constructs surrounding code that
     obviously cannot throw, remove lexical bindings that contain no
     variables, and other assorted simplistic cleanups.  The idea is to
     get rid of the obvious stuff quickly rather than wait until later
     when it's more work to get rid of it.  This pass is located in
     `tree-cfg.c' and described by `pass_remove_useless_stmts'.

   * Mudflap declaration registration

     If mudflap (*note -fmudflap -fmudflapth -fmudflapir: (gcc)Optimize
     Options.) is enabled, we generate code to register some variable
     declarations with the mudflap runtime.  Specifically, the runtime
     tracks the lifetimes of those variable declarations that have
     their addresses taken, or whose bounds are unknown at compile time
     (`extern').  This pass generates new exception handling constructs
     (`try'/`finally'), and so must run before those are lowered.  In
     addition, the pass enqueues declarations of static variables whose
     lifetimes extend to the entire program.  The pass is located in
     `tree-mudflap.c' and is described by `pass_mudflap_1'.

   * OpenMP lowering

     If OpenMP generation (`-fopenmp') is enabled, this pass lowers
     OpenMP constructs into GIMPLE.

     Lowering of OpenMP constructs involves creating replacement
     expressions for local variables that have been mapped using data
     sharing clauses, exposing the control flow of most synchronization
     directives and adding region markers to facilitate the creation of
     the control flow graph.  The pass is located in `omp-low.c' and is
     described by `pass_lower_omp'.

   * OpenMP expansion

     If OpenMP generation (`-fopenmp') is enabled, this pass expands
     parallel regions into their own functions to be invoked by the
     thread library.  The pass is located in `omp-low.c' and is
     described by `pass_expand_omp'.

   * Lower control flow

     This pass flattens `if' statements (`COND_EXPR') and moves lexical
     bindings (`BIND_EXPR') out of line.  After this pass, all `if'
     statements will have exactly two `goto' statements in its `then'
     and `else' arms.  Lexical binding information for each statement
     will be found in `TREE_BLOCK' rather than being inferred from its
     position under a `BIND_EXPR'.  This pass is found in
     `gimple-low.c' and is described by `pass_lower_cf'.

   * Lower exception handling control flow

     This pass decomposes high-level exception handling constructs
     (`TRY_FINALLY_EXPR' and `TRY_CATCH_EXPR') into a form that
     explicitly represents the control flow involved.  After this pass,
     `lookup_stmt_eh_region' will return a non-negative number for any
     statement that may have EH control flow semantics; examine
     `tree_can_throw_internal' or `tree_can_throw_external' for exact
     semantics.  Exact control flow may be extracted from
     `foreach_reachable_handler'.  The EH region nesting tree is defined
     in `except.h' and built in `except.c'.  The lowering pass itself
     is in `tree-eh.c' and is described by `pass_lower_eh'.

   * Build the control flow graph

     This pass decomposes a function into basic blocks and creates all
     of the edges that connect them.  It is located in `tree-cfg.c' and
     is described by `pass_build_cfg'.

   * Find all referenced variables

     This pass walks the entire function and collects an array of all
     variables referenced in the function, `referenced_vars'.  The
     index at which a variable is found in the array is used as a UID
     for the variable within this function.  This data is needed by the
     SSA rewriting routines.  The pass is located in `tree-dfa.c' and
     is described by `pass_referenced_vars'.

   * Enter static single assignment form

     This pass rewrites the function such that it is in SSA form.  After
     this pass, all `is_gimple_reg' variables will be referenced by
     `SSA_NAME', and all occurrences of other variables will be
     annotated with `VDEFS' and `VUSES'; PHI nodes will have been
     inserted as necessary for each basic block.  This pass is located
     in `tree-ssa.c' and is described by `pass_build_ssa'.

   * Warn for uninitialized variables

     This pass scans the function for uses of `SSA_NAME's that are fed
     by default definition.  For non-parameter variables, such uses are
     uninitialized.  The pass is run twice, before and after
     optimization (if turned on).  In the first pass we only warn for
     uses that are positively uninitialized; in the second pass we warn
     for uses that are possibly uninitialized.  The pass is located in
     `tree-ssa.c' and is defined by `pass_early_warn_uninitialized' and
     `pass_late_warn_uninitialized'.

   * Dead code elimination

     This pass scans the function for statements without side effects
     whose result is unused.  It does not do memory life analysis, so
     any value that is stored in memory is considered used.  The pass
     is run multiple times throughout the optimization process.  It is
     located in `tree-ssa-dce.c' and is described by `pass_dce'.

   * Dominator optimizations

     This pass performs trivial dominator-based copy and constant
     propagation, expression simplification, and jump threading.  It is
     run multiple times throughout the optimization process.  It is
     located in `tree-ssa-dom.c' and is described by `pass_dominator'.

   * Forward propagation of single-use variables

     This pass attempts to remove redundant computation by substituting
     variables that are used once into the expression that uses them and
     seeing if the result can be simplified.  It is located in
     `tree-ssa-forwprop.c' and is described by `pass_forwprop'.

   * Copy Renaming

     This pass attempts to change the name of compiler temporaries
     involved in copy operations such that SSA->normal can coalesce the
     copy away.  When compiler temporaries are copies of user
     variables, it also renames the compiler temporary to the user
     variable resulting in better use of user symbols.  It is located
     in `tree-ssa-copyrename.c' and is described by `pass_copyrename'.

   * PHI node optimizations

     This pass recognizes forms of PHI inputs that can be represented as
     conditional expressions and rewrites them into straight line code.
     It is located in `tree-ssa-phiopt.c' and is described by
     `pass_phiopt'.

   * May-alias optimization

     This pass performs a flow sensitive SSA-based points-to analysis.
     The resulting may-alias, must-alias, and escape analysis
     information is used to promote variables from in-memory
     addressable objects to non-aliased variables that can be renamed
     into SSA form.  We also update the `VDEF'/`VUSE' memory tags for
     non-renameable aggregates so that we get fewer false kills.  The
     pass is located in `tree-ssa-alias.c' and is described by
     `pass_may_alias'.

     Interprocedural points-to information is located in
     `tree-ssa-structalias.c' and described by `pass_ipa_pta'.

   * Profiling

     This pass rewrites the function in order to collect runtime block
     and value profiling data.  Such data may be fed back into the
     compiler on a subsequent run so as to allow optimization based on
     expected execution frequencies.  The pass is located in
     `predict.c' and is described by `pass_profile'.

   * Lower complex arithmetic

     This pass rewrites complex arithmetic operations into their
     component scalar arithmetic operations.  The pass is located in
     `tree-complex.c' and is described by `pass_lower_complex'.

   * Scalar replacement of aggregates

     This pass rewrites suitable non-aliased local aggregate variables
     into a set of scalar variables.  The resulting scalar variables are
     rewritten into SSA form, which allows subsequent optimization
     passes to do a significantly better job with them.  The pass is
     located in `tree-sra.c' and is described by `pass_sra'.

   * Dead store elimination

     This pass eliminates stores to memory that are subsequently
     overwritten by another store, without any intervening loads.  The
     pass is located in `tree-ssa-dse.c' and is described by `pass_dse'.

   * Tail recursion elimination

     This pass transforms tail recursion into a loop.  It is located in
     `tree-tailcall.c' and is described by `pass_tail_recursion'.

   * Forward store motion

     This pass sinks stores and assignments down the flowgraph closer
     to their use point.  The pass is located in `tree-ssa-sink.c' and
     is described by `pass_sink_code'.

   * Partial redundancy elimination

     This pass eliminates partially redundant computations, as well as
     performing load motion.  The pass is located in `tree-ssa-pre.c'
     and is described by `pass_pre'.

     Just before partial redundancy elimination, if
     `-funsafe-math-optimizations' is on, GCC tries to convert
     divisions to multiplications by the reciprocal.  The pass is
     located in `tree-ssa-math-opts.c' and is described by
     `pass_cse_reciprocal'.

   * Full redundancy elimination

     This is a simpler form of PRE that only eliminates redundancies
     that occur on all paths.  It is located in `tree-ssa-pre.c' and
     described by `pass_fre'.

   * Loop optimization

     The main driver of the pass is placed in `tree-ssa-loop.c' and
     described by `pass_loop'.

     The optimizations performed by this pass are:

     Loop invariant motion.  This pass moves only invariants that would
     be hard to handle on 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.  The pass
     is implemented in `tree-ssa-loop-im.c'.

     Canonical induction variable creation.  This pass creates a simple
     counter for number of iterations of the loop and replaces the exit
     condition of the loop using it, in case when a complicated
     analysis is necessary to determine the number of iterations.
     Later optimizations then may determine the number easily.  The
     pass is implemented in `tree-ssa-loop-ivcanon.c'.

     Induction variable optimizations.  This pass performs standard
     induction variable optimizations, including strength reduction,
     induction variable merging and induction variable elimination.
     The pass is implemented in `tree-ssa-loop-ivopts.c'.

     Loop unswitching.  This pass moves the conditional jumps that are
     invariant out of the loops.  To achieve this, a duplicate of the
     loop is created for each possible outcome of conditional jump(s).
     The pass is implemented in `tree-ssa-loop-unswitch.c'.  This pass
     should eventually replace the RTL level loop unswitching in
     `loop-unswitch.c', but currently the RTL level pass is not
     completely redundant yet due to deficiencies in tree level alias
     analysis.

     The optimizations also use various utility functions contained in
     `tree-ssa-loop-manip.c', `cfgloop.c', `cfgloopanal.c' and
     `cfgloopmanip.c'.

     Vectorization.  This pass transforms loops to operate on vector
     types instead of scalar types.  Data parallelism across loop
     iterations is exploited to group data elements from consecutive
     iterations into a vector and operate on them in parallel.
     Depending on available target support the loop is conceptually
     unrolled by a factor `VF' (vectorization factor), which is the
     number of elements operated upon in parallel in each iteration,
     and the `VF' copies of each scalar operation are fused to form a
     vector operation.  Additional loop transformations such as peeling
     and versioning may take place to align the number of iterations,
     and to align the memory accesses in the loop.  The pass is
     implemented in `tree-vectorizer.c' (the main driver),
     `tree-vect-loop.c' and `tree-vect-loop-manip.c' (loop specific
     parts and general loop utilities), `tree-vect-slp' (loop-aware SLP
     functionality), `tree-vect-stmts.c' and `tree-vect-data-refs.c'.
     Analysis of data references is in `tree-data-ref.c'.

     SLP Vectorization.  This pass performs vectorization of
     straight-line code. The pass is implemented in `tree-vectorizer.c'
     (the main driver), `tree-vect-slp.c', `tree-vect-stmts.c' and
     `tree-vect-data-refs.c'.

     Autoparallelization.  This pass splits the loop iteration space to
     run into several threads.  The pass is implemented in
     `tree-parloops.c'.

     Graphite is a loop transformation framework based on the polyhedral
     model.  Graphite stands for Gimple Represented as Polyhedra.  The
     internals of this infrastructure are documented in
     `http://gcc.gnu.org/wiki/Graphite'.  The passes working on this
     representation are implemented in the various `graphite-*' files.

   * Tree level if-conversion for vectorizer

     This pass applies if-conversion to simple loops to help vectorizer.
     We identify if convertible loops, if-convert statements and merge
     basic blocks in one big block.  The idea is to present loop in such
     form so that vectorizer can have one to one mapping between
     statements and available vector operations.  This pass is located
     in `tree-if-conv.c' and is described by `pass_if_conversion'.

   * Conditional constant propagation

     This pass relaxes a lattice of values in order to identify those
     that must be constant even in the presence of conditional branches.
     The pass is located in `tree-ssa-ccp.c' and is described by
     `pass_ccp'.

     A related pass that works on memory loads and stores, and not just
     register values, is located in `tree-ssa-ccp.c' and described by
     `pass_store_ccp'.

   * Conditional copy propagation

     This is similar to constant propagation but the lattice of values
     is the "copy-of" relation.  It eliminates redundant copies from the
     code.  The pass is located in `tree-ssa-copy.c' and described by
     `pass_copy_prop'.

     A related pass that works on memory copies, and not just register
     copies, is located in `tree-ssa-copy.c' and described by
     `pass_store_copy_prop'.

   * Value range propagation

     This transformation is similar to constant propagation but instead
     of propagating single constant values, it propagates known value
     ranges.  The implementation is based on Patterson's range
     propagation algorithm (Accurate Static Branch Prediction by Value
     Range Propagation, J. R. C. Patterson, PLDI '95).  In contrast to
     Patterson's algorithm, this implementation does not propagate
     branch probabilities nor it uses more than a single range per SSA
     name. This means that the current implementation cannot be used
     for branch prediction (though adapting it would not be difficult).
     The pass is located in `tree-vrp.c' and is described by `pass_vrp'.

   * Folding built-in functions

     This pass simplifies built-in functions, as applicable, with
     constant arguments or with inferable string lengths.  It is
     located in `tree-ssa-ccp.c' and is described by
     `pass_fold_builtins'.

   * Split critical edges

     This pass identifies critical edges and inserts empty basic blocks
     such that the edge is no longer critical.  The pass is located in
     `tree-cfg.c' and is described by `pass_split_crit_edges'.

   * Control dependence dead code elimination

     This pass is a stronger form of dead code elimination that can
     eliminate unnecessary control flow statements.   It is located in
     `tree-ssa-dce.c' and is described by `pass_cd_dce'.

   * Tail call elimination

     This pass identifies function calls that may be rewritten into
     jumps.  No code transformation is actually applied here, but the
     data and control flow problem is solved.  The code transformation
     requires target support, and so is delayed until RTL.  In the
     meantime `CALL_EXPR_TAILCALL' is set indicating the possibility.
     The pass is located in `tree-tailcall.c' and is described by
     `pass_tail_calls'.  The RTL transformation is handled by
     `fixup_tail_calls' in `calls.c'.

   * Warn for function return without value

     For non-void functions, this pass locates return statements that do
     not specify a value and issues a warning.  Such a statement may
     have been injected by falling off the end of the function.  This
     pass is run last so that we have as much time as possible to prove
     that the statement is not reachable.  It is located in
     `tree-cfg.c' and is described by `pass_warn_function_return'.

   * Mudflap statement annotation

     If mudflap is enabled, we rewrite some memory accesses with code to
     validate that the memory access is correct.  In particular,
     expressions involving pointer dereferences (`INDIRECT_REF',
     `ARRAY_REF', etc.) are replaced by code that checks the selected
     address range against the mudflap runtime's database of valid
     regions.  This check includes an inline lookup into a
     direct-mapped cache, based on shift/mask operations of the pointer
     value, with a fallback function call into the runtime.  The pass
     is located in `tree-mudflap.c' and is described by
     `pass_mudflap_2'.

   * Leave static single assignment form

     This pass rewrites the function such that it is in normal form.  At
     the same time, we eliminate as many single-use temporaries as
     possible, so the intermediate language is no longer GIMPLE, but
     GENERIC.  The pass is located in `tree-outof-ssa.c' and is
     described by `pass_del_ssa'.

   * Merge PHI nodes that feed into one another

     This is part of the CFG cleanup passes.  It attempts to join PHI
     nodes from a forwarder CFG block into another block with PHI
     nodes.  The pass is located in `tree-cfgcleanup.c' and is
     described by `pass_merge_phi'.

   * Return value optimization

     If a function always returns the same local variable, and that
     local variable is an aggregate type, then the variable is replaced
     with the return value for the function (i.e., the function's
     DECL_RESULT).  This is equivalent to the C++ named return value
     optimization applied to GIMPLE.  The pass is located in
     `tree-nrv.c' and is described by `pass_nrv'.

   * Return slot optimization

     If a function returns a memory object and is called as `var =
     foo()', this pass tries to change the call so that the address of
     `var' is sent to the caller to avoid an extra memory copy.  This
     pass is located in `tree-nrv.c' and is described by
     `pass_return_slot'.

   * Optimize calls to `__builtin_object_size'

     This is a propagation pass similar to CCP that tries to remove
     calls to `__builtin_object_size' when the size of the object can be
     computed at compile-time.  This pass is located in
     `tree-object-size.c' and is described by `pass_object_sizes'.

   * Loop invariant motion

     This pass removes expensive loop-invariant computations out of
     loops.  The pass is located in `tree-ssa-loop.c' and described by
     `pass_lim'.

   * Loop nest optimizations

     This is a family of loop transformations that works on loop nests.
     It includes loop interchange, scaling, skewing and reversal and
     they are all geared to the optimization of data locality in array
     traversals and the removal of dependencies that hamper
     optimizations such as loop parallelization and vectorization.  The
     pass is located in `tree-loop-linear.c' and described by
     `pass_linear_transform'.

   * Removal of empty loops

     This pass removes loops with no code in them.  The pass is located
     in `tree-ssa-loop-ivcanon.c' and described by `pass_empty_loop'.

   * Unrolling of small loops

     This pass completely unrolls loops with few iterations.  The pass
     is located in `tree-ssa-loop-ivcanon.c' and described by
     `pass_complete_unroll'.

   * Predictive commoning

     This pass makes the code reuse the computations from the previous
     iterations of the loops, especially loads and stores to memory.
     It does so by storing the values of these computations to a bank
     of temporary variables that are rotated at the end of loop.  To
     avoid the need for this rotation, the loop is then unrolled and
     the copies of the loop body are rewritten to use the appropriate
     version of the temporary variable.  This pass is located in
     `tree-predcom.c' and described by `pass_predcom'.

   * Array prefetching

     This pass issues prefetch instructions for array references inside
     loops.  The pass is located in `tree-ssa-loop-prefetch.c' and
     described by `pass_loop_prefetch'.

   * Reassociation

     This pass rewrites arithmetic expressions to enable optimizations
     that operate on them, like redundancy elimination and
     vectorization.  The pass is located in `tree-ssa-reassoc.c' and
     described by `pass_reassoc'.

   * Optimization of `stdarg' functions

     This pass tries to avoid the saving of register arguments into the
     stack on entry to `stdarg' functions.  If the function doesn't use
     any `va_start' macros, no registers need to be saved.  If
     `va_start' macros are used, the `va_list' variables don't escape
     the function, it is only necessary to save registers that will be
     used in `va_arg' macros.  For instance, if `va_arg' is only used
     with integral types in the function, floating point registers
     don't need to be saved.  This pass is located in `tree-stdarg.c'
     and described by `pass_stdarg'.



File: gccint.info,  Node: RTL passes,  Prev: Tree SSA passes,  Up: Passes

9.5 RTL passes
==============

The following briefly describes the RTL generation and optimization
passes that are run after the Tree optimization passes.

   * RTL generation

     The source files for RTL generation include `stmt.c', `calls.c',
     `expr.c', `explow.c', `expmed.c', `function.c', `optabs.c' and
     `emit-rtl.c'.  Also, the file `insn-emit.c', generated from the
     machine description by the program `genemit', is used in this
     pass.  The header file `expr.h' is used for communication within
     this pass.

     The header files `insn-flags.h' and `insn-codes.h', generated from
     the machine description by the programs `genflags' and `gencodes',
     tell this pass which standard names are available for use and
     which patterns correspond to them.

   * Generation of exception landing pads

     This pass generates the glue that handles communication between the
     exception handling library routines and the exception handlers
     within the function.  Entry points in the function that are
     invoked by the exception handling library are called "landing
     pads".  The code for this pass is located in `except.c'.

   * Control flow graph cleanup

     This pass removes unreachable code, simplifies jumps to next,
     jumps to jump, jumps across jumps, etc.  The pass is run multiple
     times.  For historical reasons, it is occasionally referred to as
     the "jump optimization pass".  The bulk of the code for this pass
     is in `cfgcleanup.c', and there are support routines in `cfgrtl.c'
     and `jump.c'.

   * Forward propagation of single-def values

     This pass attempts to remove redundant computation by substituting
     variables that come from a single definition, and seeing if the
     result can be simplified.  It performs copy propagation and
     addressing mode selection.  The pass is run twice, with values
     being propagated into loops only on the second run.  The code is
     located in `fwprop.c'.

   * Common subexpression elimination

     This pass removes redundant computation within basic blocks, and
     optimizes addressing modes based on cost.  The pass is run twice.
     The code for this pass is located in `cse.c'.

   * Global common subexpression elimination

     This pass performs two different types of GCSE  depending on
     whether you are optimizing for size or not (LCM based GCSE tends
     to increase code size for a gain in speed, while Morel-Renvoise
     based GCSE does not).  When optimizing for size, GCSE is done
     using Morel-Renvoise Partial Redundancy Elimination, with the
     exception that it does not try to move invariants out of
     loops--that is left to  the loop optimization pass.  If MR PRE
     GCSE is done, code hoisting (aka unification) is also done, as
     well as load motion.  If you are optimizing for speed, LCM (lazy
     code motion) based GCSE is done.  LCM is based on the work of
     Knoop, Ruthing, and Steffen.  LCM based GCSE also does loop
     invariant code motion.  We also perform load and store motion when
     optimizing for speed.  Regardless of which type of GCSE is used,
     the GCSE pass also performs global constant and  copy propagation.
     The source file for this pass is `gcse.c', and the LCM routines
     are in `lcm.c'.

   * Loop optimization

     This pass performs several loop related optimizations.  The source
     files `cfgloopanal.c' and `cfgloopmanip.c' contain generic loop
     analysis and manipulation code.  Initialization and finalization
     of loop structures is handled by `loop-init.c'.  A loop invariant
     motion pass is implemented in `loop-invariant.c'.  Basic block
     level optimizations--unrolling, peeling and unswitching loops--
     are implemented in `loop-unswitch.c' and `loop-unroll.c'.
     Replacing of the exit condition of loops by special
     machine-dependent instructions is handled by `loop-doloop.c'.

   * Jump bypassing

     This pass is an aggressive form of GCSE that transforms the control
     flow graph of a function by propagating constants into conditional
     branch instructions.  The source file for this pass is `gcse.c'.

   * If conversion

     This pass attempts to replace conditional branches and surrounding
     assignments with arithmetic, boolean value producing comparison
     instructions, and conditional move instructions.  In the very last
     invocation after reload/LRA, it will generate predicated
     instructions when supported by the target.  The code is located in
     `ifcvt.c'.

   * Web construction

     This pass splits independent uses of each pseudo-register.  This
     can improve effect of the other transformation, such as CSE or
     register allocation.  The code for this pass is located in `web.c'.

   * Instruction combination

     This pass attempts to combine groups of two or three instructions
     that are related by data flow into single instructions.  It
     combines the RTL expressions for the instructions by substitution,
     simplifies the result using algebra, and then attempts to match
     the result against the machine description.  The code is located
     in `combine.c'.

   * Register movement

     This pass looks for cases where matching constraints would force an
     instruction to need a reload, and this reload would be a
     register-to-register move.  It then attempts to change the
     registers used by the instruction to avoid the move instruction.
     The code is located in `regmove.c'.

   * Mode switching optimization

     This pass looks for instructions that require the processor to be
     in a specific "mode" and minimizes the number of mode changes
     required to satisfy all users.  What these modes are, and what
     they apply to are completely target-specific.  The code for this
     pass is located in `mode-switching.c'.

   * Modulo scheduling

     This pass looks at innermost loops and reorders their instructions
     by overlapping different iterations.  Modulo scheduling is
     performed immediately before instruction scheduling.  The code for
     this pass is located in `modulo-sched.c'.

   * Instruction scheduling

     This pass looks for instructions whose output will not be
     available by the time that it is used in subsequent instructions.
     Memory loads and floating point instructions often have this
     behavior on RISC machines.  It re-orders instructions within a
     basic block to try to separate the definition and use of items
     that otherwise would cause pipeline stalls.  This pass is
     performed twice, before and after register allocation.  The code
     for this pass is located in `haifa-sched.c', `sched-deps.c',
     `sched-ebb.c', `sched-rgn.c' and `sched-vis.c'.

   * Register allocation

     These passes make sure that all occurrences of pseudo registers are
     eliminated, either by allocating them to a hard register, replacing
     them by an equivalent expression (e.g. a constant) or by placing
     them on the stack.  This is done in several subpasses:

        * Register move optimizations.  This pass makes some simple RTL
          code transformations which improve the subsequent register
          allocation.  The source file is `regmove.c'.

        * The integrated register allocator (IRA).  It is called
          integrated because coalescing, register live range splitting,
          and hard register preferencing are done on-the-fly during
          coloring.  It also has better integration with the reload/LRA
          pass.  Pseudo-registers spilled by the allocator or the
          reload/LRA have still a chance to get hard-registers if the
          reload/LRA evicts some pseudo-registers from hard-registers.
          The allocator helps to choose better pseudos for spilling
          based on their live ranges and to coalesce stack slots
          allocated for the spilled pseudo-registers.  IRA is a regional
          register allocator which is transformed into Chaitin-Briggs
          allocator if there is one region.  By default, IRA chooses
          regions using register pressure but the user can force it to
          use one region or regions corresponding to all loops.

          Source files of the allocator are `ira.c', `ira-build.c',
          `ira-costs.c', `ira-conflicts.c', `ira-color.c',
          `ira-emit.c', `ira-lives', plus header files `ira.h' and
          `ira-int.h' used for the communication between the allocator
          and the rest of the compiler and between the IRA files.

        * Reloading.  This pass renumbers pseudo registers with the
          hardware registers numbers they were allocated.  Pseudo
          registers that did not get hard registers are replaced with
          stack slots.  Then it finds instructions that are invalid
          because a value has failed to end up in a register, or has
          ended up in a register of the wrong kind.  It fixes up these
          instructions by reloading the problematical values
          temporarily into registers.  Additional instructions are
          generated to do the copying.

          The reload pass also optionally eliminates the frame pointer
          and inserts instructions to save and restore call-clobbered
          registers around calls.

          Source files are `reload.c' and `reload1.c', plus the header
          `reload.h' used for communication between them.

        * This pass is a modern replacement of the reload pass.  Source
          files are `lra.c', `lra-assign.c', `lra-coalesce.c',
          `lra-constraints.c', `lra-eliminations.c', `lra-equivs.c',
          `lra-lives.c', `lra-saves.c', `lra-spills.c', the header
          `lra-int.h' used for communication between them, and the
          header `lra.h' used for communication between LRA and the
          rest of compiler.

          Unlike the reload pass, intermediate LRA decisions are
          reflected in RTL as much as possible.  This reduces the
          number of target-dependent macros and hooks, leaving
          instruction constraints as the primary source of control.

          LRA is run on targets for which TARGET_LRA_P returns true.

   * Basic block reordering

     This pass implements profile guided code positioning.  If profile
     information is not available, various types of static analysis are
     performed to make the predictions normally coming from the profile
     feedback (IE execution frequency, branch probability, etc).  It is
     implemented in the file `bb-reorder.c', and the various prediction
     routines are in `predict.c'.

   * Variable tracking

     This pass computes where the variables are stored at each position
     in code and generates notes describing the variable locations to
     RTL code.  The location lists are then generated according to these
     notes to debug information if the debugging information format
     supports location lists.  The code is located in `var-tracking.c'.

   * Delayed branch scheduling

     This optional pass attempts to find instructions that can go into
     the delay slots of other instructions, usually jumps and calls.
     The code for this pass is located in `reorg.c'.

   * Branch shortening

     On many RISC machines, branch instructions have a limited range.
     Thus, longer sequences of instructions must be used for long
     branches.  In this pass, the compiler figures out what how far
     each instruction will be from each other instruction, and
     therefore whether the usual instructions, or the longer sequences,
     must be used for each branch.  The code for this pass is located
     in `final.c'.

   * Register-to-stack conversion

     Conversion from usage of some hard registers to usage of a register
     stack may be done at this point.  Currently, this is supported only
     for the floating-point registers of the Intel 80387 coprocessor.
     The code for this pass is located in `reg-stack.c'.

   * Final

     This pass outputs the assembler code for the function.  The source
     files are `final.c' plus `insn-output.c'; the latter is generated
     automatically from the machine description by the tool `genoutput'.
     The header file `conditions.h' is used for communication between
     these files.  If mudflap is enabled, the queue of deferred
     declarations and any addressed constants (e.g., string literals)
     is processed by `mudflap_finish_file' into a synthetic constructor
     function containing calls into the mudflap runtime.

   * Debugging information output

     This is run after final because it must output the stack slot
     offsets for pseudo registers that did not get hard registers.
     Source files are `dbxout.c' for DBX symbol table format,
     `sdbout.c' for SDB symbol table format, `dwarfout.c' for DWARF
     symbol table format, files `dwarf2out.c' and `dwarf2asm.c' for
     DWARF2 symbol table format, and `vmsdbgout.c' for VMS debug symbol
     table format.



File: gccint.info,  Node: RTL,  Next: Control Flow,  Prev: Tree SSA,  Up: Top

10 RTL Representation
*********************

The last part of the compiler work is done on a low-level intermediate
representation called Register Transfer Language.  In this language, the
instructions to be output are described, pretty much one by one, in an
algebraic form that describes what the instruction does.

 RTL is inspired by Lisp lists.  It has both an internal form, made up
of structures that point at other structures, and a textual form that
is used in the machine description and in printed debugging dumps.  The
textual form uses nested parentheses to indicate the pointers in the
internal form.

* Menu:

* RTL Objects::       Expressions vs vectors vs strings vs integers.
* RTL Classes::       Categories of RTL expression objects, and their structure.
* Accessors::         Macros to access expression operands or vector elts.
* Special Accessors:: Macros to access specific annotations on RTL.
* Flags::             Other flags in an RTL expression.
* Machine Modes::     Describing the size and format of a datum.
* Constants::         Expressions with constant values.
* Regs and Memory::   Expressions representing register contents or memory.
* Arithmetic::        Expressions representing arithmetic on other expressions.
* Comparisons::       Expressions representing comparison of expressions.
* Bit-Fields::        Expressions representing bit-fields in memory or reg.
* Vector Operations:: Expressions involving vector datatypes.
* Conversions::       Extending, truncating, floating or fixing.
* RTL Declarations::  Declaring volatility, constancy, etc.
* Side Effects::      Expressions for storing in registers, etc.
* Incdec::            Embedded side-effects for autoincrement addressing.
* Assembler::         Representing `asm' with operands.
* Debug Information:: Expressions representing debugging information.
* Insns::             Expression types for entire insns.
* Calls::             RTL representation of function call insns.
* Sharing::           Some expressions are unique; others *must* be copied.
* Reading RTL::       Reading textual RTL from a file.


File: gccint.info,  Node: RTL Objects,  Next: RTL Classes,  Up: RTL

10.1 RTL Object Types
=====================

RTL uses five kinds of objects: expressions, integers, wide integers,
strings and vectors.  Expressions are the most important ones.  An RTL
expression ("RTX", for short) is a C structure, but it is usually
referred to with a pointer; a type that is given the typedef name `rtx'.

 An integer is simply an `int'; their written form uses decimal digits.
A wide integer is an integral object whose type is `HOST_WIDE_INT';
their written form uses decimal digits.

 A string is a sequence of characters.  In core it is represented as a
`char *' in usual C fashion, and it is written in C syntax as well.
However, strings in RTL may never be null.  If you write an empty
string in a machine description, it is represented in core as a null
pointer rather than as a pointer to a null character.  In certain
contexts, these null pointers instead of strings are valid.  Within RTL
code, strings are most commonly found inside `symbol_ref' expressions,
but they appear in other contexts in the RTL expressions that make up
machine descriptions.

 In a machine description, strings are normally written with double
quotes, as you would in C.  However, strings in machine descriptions may
extend over many lines, which is invalid C, and adjacent string
constants are not concatenated as they are in C.  Any string constant
may be surrounded with a single set of parentheses.  Sometimes this
makes the machine description easier to read.

 There is also a special syntax for strings, which can be useful when C
code is embedded in a machine description.  Wherever a string can
appear, it is also valid to write a C-style brace block.  The entire
brace block, including the outermost pair of braces, is considered to be
the string constant.  Double quote characters inside the braces are not
special.  Therefore, if you write string constants in the C code, you
need not escape each quote character with a backslash.

 A vector contains an arbitrary number of pointers to expressions.  The
number of elements in the vector is explicitly present in the vector.
The written form of a vector consists of square brackets (`[...]')
surrounding the elements, in sequence and with whitespace separating
them.  Vectors of length zero are not created; null pointers are used
instead.

 Expressions are classified by "expression codes" (also called RTX
codes).  The expression code is a name defined in `rtl.def', which is
also (in uppercase) a C enumeration constant.  The possible expression
codes and their meanings are machine-independent.  The code of an RTX
can be extracted with the macro `GET_CODE (X)' and altered with
`PUT_CODE (X, NEWCODE)'.

 The expression code determines how many operands the expression
contains, and what kinds of objects they are.  In RTL, unlike Lisp, you
cannot tell by looking at an operand what kind of object it is.
Instead, you must know from its context--from the expression code of
the containing expression.  For example, in an expression of code
`subreg', the first operand is to be regarded as an expression and the
second operand as an integer.  In an expression of code `plus', there
are two operands, both of which are to be regarded as expressions.  In
a `symbol_ref' expression, there is one operand, which is to be
regarded as a string.

 Expressions are written as parentheses containing the name of the
expression type, its flags and machine mode if any, and then the
operands of the expression (separated by spaces).

 Expression code names in the `md' file are written in lowercase, but
when they appear in C code they are written in uppercase.  In this
manual, they are shown as follows: `const_int'.

 In a few contexts a null pointer is valid where an expression is
normally wanted.  The written form of this is `(nil)'.


File: gccint.info,  Node: RTL Classes,  Next: Accessors,  Prev: RTL Objects,  Up: RTL

10.2 RTL Classes and Formats
============================

The various expression codes are divided into several "classes", which
are represented by single characters.  You can determine the class of
an RTX code with the macro `GET_RTX_CLASS (CODE)'.  Currently,
`rtl.def' defines these classes:

`RTX_OBJ'
     An RTX code that represents an actual object, such as a register
     (`REG') or a memory location (`MEM', `SYMBOL_REF').  `LO_SUM') is
     also included; instead, `SUBREG' and `STRICT_LOW_PART' are not in
     this class, but in class `x'.

`RTX_CONST_OBJ'
     An RTX code that represents a constant object.  `HIGH' is also
     included in this class.

`RTX_COMPARE'
     An RTX code for a non-symmetric comparison, such as `GEU' or `LT'.

`RTX_COMM_COMPARE'
     An RTX code for a symmetric (commutative) comparison, such as `EQ'
     or `ORDERED'.

`RTX_UNARY'
     An RTX code for a unary arithmetic operation, such as `NEG',
     `NOT', or `ABS'.  This category also includes value extension
     (sign or zero) and conversions between integer and floating point.

`RTX_COMM_ARITH'
     An RTX code for a commutative binary operation, such as `PLUS' or
     `AND'.  `NE' and `EQ' are comparisons, so they have class `<'.

`RTX_BIN_ARITH'
     An RTX code for a non-commutative binary operation, such as
     `MINUS', `DIV', or `ASHIFTRT'.

`RTX_BITFIELD_OPS'
     An RTX code for a bit-field operation.  Currently only
     `ZERO_EXTRACT' and `SIGN_EXTRACT'.  These have three inputs and
     are lvalues (so they can be used for insertion as well).  *Note
     Bit-Fields::.

`RTX_TERNARY'
     An RTX code for other three input operations.  Currently only
     `IF_THEN_ELSE',  `VEC_MERGE', `SIGN_EXTRACT', `ZERO_EXTRACT', and
     `FMA'.

`RTX_INSN'
     An RTX code for an entire instruction:  `INSN', `JUMP_INSN', and
     `CALL_INSN'.  *Note Insns::.

`RTX_MATCH'
     An RTX code for something that matches in insns, such as
     `MATCH_DUP'.  These only occur in machine descriptions.

`RTX_AUTOINC'
     An RTX code for an auto-increment addressing mode, such as
     `POST_INC'.

`RTX_EXTRA'
     All other RTX codes.  This category includes the remaining codes
     used only in machine descriptions (`DEFINE_*', etc.).  It also
     includes all the codes describing side effects (`SET', `USE',
     `CLOBBER', etc.) and the non-insns that may appear on an insn
     chain, such as `NOTE', `BARRIER', and `CODE_LABEL'.  `SUBREG' is
     also part of this class.

 For each expression code, `rtl.def' specifies the number of contained
objects and their kinds using a sequence of characters called the
"format" of the expression code.  For example, the format of `subreg'
is `ei'.

 These are the most commonly used format characters:

`e'
     An expression (actually a pointer to an expression).

`i'
     An integer.

`w'
     A wide integer.

`s'
     A string.

`E'
     A vector of expressions.

 A few other format characters are used occasionally:

`u'
     `u' is equivalent to `e' except that it is printed differently in
     debugging dumps.  It is used for pointers to insns.

`n'
     `n' is equivalent to `i' except that it is printed differently in
     debugging dumps.  It is used for the line number or code number of
     a `note' insn.

`S'
     `S' indicates a string which is optional.  In the RTL objects in
     core, `S' is equivalent to `s', but when the object is read, from
     an `md' file, the string value of this operand may be omitted.  An
     omitted string is taken to be the null string.

`V'
     `V' indicates a vector which is optional.  In the RTL objects in
     core, `V' is equivalent to `E', but when the object is read from
     an `md' file, the vector value of this operand may be omitted.  An
     omitted vector is effectively the same as a vector of no elements.

`B'
     `B' indicates a pointer to basic block structure.

`0'
     `0' means a slot whose contents do not fit any normal category.
     `0' slots are not printed at all in dumps, and are often used in
     special ways by small parts of the compiler.

 There are macros to get the number of operands and the format of an
expression code:

`GET_RTX_LENGTH (CODE)'
     Number of operands of an RTX of code CODE.

`GET_RTX_FORMAT (CODE)'
     The format of an RTX of code CODE, as a C string.

 Some classes of RTX codes always have the same format.  For example, it
is safe to assume that all comparison operations have format `ee'.

`1'
     All codes of this class have format `e'.

`<'
`c'
`2'
     All codes of these classes have format `ee'.

`b'
`3'
     All codes of these classes have format `eee'.

`i'
     All codes of this class have formats that begin with `iuueiee'.
     *Note Insns::.  Note that not all RTL objects linked onto an insn
     chain are of class `i'.

`o'
`m'
`x'
     You can make no assumptions about the format of these codes.


File: gccint.info,  Node: Accessors,  Next: Special Accessors,  Prev: RTL Classes,  Up: RTL

10.3 Access to Operands
=======================

Operands of expressions are accessed using the macros `XEXP', `XINT',
`XWINT' and `XSTR'.  Each of these macros takes two arguments: an
expression-pointer (RTX) and an operand number (counting from zero).
Thus,

     XEXP (X, 2)

accesses operand 2 of expression X, as an expression.

     XINT (X, 2)

accesses the same operand as an integer.  `XSTR', used in the same
fashion, would access it as a string.

 Any operand can be accessed as an integer, as an expression or as a
string.  You must choose the correct method of access for the kind of
value actually stored in the operand.  You would do this based on the
expression code of the containing expression.  That is also how you
would know how many operands there are.

 For example, if X is a `subreg' expression, you know that it has two
operands which can be correctly accessed as `XEXP (X, 0)' and `XINT (X,
1)'.  If you did `XINT (X, 0)', you would get the address of the
expression operand but cast as an integer; that might occasionally be
useful, but it would be cleaner to write `(int) XEXP (X, 0)'.  `XEXP
(X, 1)' would also compile without error, and would return the second,
integer operand cast as an expression pointer, which would probably
result in a crash when accessed.  Nothing stops you from writing `XEXP
(X, 28)' either, but this will access memory past the end of the
expression with unpredictable results.

 Access to operands which are vectors is more complicated.  You can use
the macro `XVEC' to get the vector-pointer itself, or the macros
`XVECEXP' and `XVECLEN' to access the elements and length of a vector.

`XVEC (EXP, IDX)'
     Access the vector-pointer which is operand number IDX in EXP.

`XVECLEN (EXP, IDX)'
     Access the length (number of elements) in the vector which is in
     operand number IDX in EXP.  This value is an `int'.

`XVECEXP (EXP, IDX, ELTNUM)'
     Access element number ELTNUM in the vector which is in operand
     number IDX in EXP.  This value is an RTX.

     It is up to you to make sure that ELTNUM is not negative and is
     less than `XVECLEN (EXP, IDX)'.

 All the macros defined in this section expand into lvalues and
therefore can be used to assign the operands, lengths and vector
elements as well as to access them.


File: gccint.info,  Node: Special Accessors,  Next: Flags,  Prev: Accessors,  Up: RTL

10.4 Access to Special Operands
===============================

Some RTL nodes have special annotations associated with them.

`MEM'

    `MEM_ALIAS_SET (X)'
          If 0, X is not in any alias set, and may alias anything.
          Otherwise, X can only alias `MEM's in a conflicting alias
          set.  This value is set in a language-dependent manner in the
          front-end, and should not be altered in the back-end.  In
          some front-ends, these numbers may correspond in some way to
          types, or other language-level entities, but they need not,
          and the back-end makes no such assumptions.  These set
          numbers are tested with `alias_sets_conflict_p'.

    `MEM_EXPR (X)'
          If this register is known to hold the value of some user-level
          declaration, this is that tree node.  It may also be a
          `COMPONENT_REF', in which case this is some field reference,
          and `TREE_OPERAND (X, 0)' contains the declaration, or
          another `COMPONENT_REF', or null if there is no compile-time
          object associated with the reference.

    `MEM_OFFSET_KNOWN_P (X)'
          True if the offset of the memory reference from `MEM_EXPR' is
          known.  `MEM_OFFSET (X)' provides the offset if so.

    `MEM_OFFSET (X)'
          The offset from the start of `MEM_EXPR'.  The value is only
          valid if `MEM_OFFSET_KNOWN_P (X)' is true.

    `MEM_SIZE_KNOWN_P (X)'
          True if the size of the memory reference is known.  `MEM_SIZE
          (X)' provides its size if so.

    `MEM_SIZE (X)'
          The size in bytes of the memory reference.  This is mostly
          relevant for `BLKmode' references as otherwise the size is
          implied by the mode.  The value is only valid if
          `MEM_SIZE_KNOWN_P (X)' is true.

    `MEM_ALIGN (X)'
          The known alignment in bits of the memory reference.

    `MEM_ADDR_SPACE (X)'
          The address space of the memory reference.  This will
          commonly be zero for the generic address space.

`REG'

    `ORIGINAL_REGNO (X)'
          This field holds the number the register "originally" had;
          for a pseudo register turned into a hard reg this will hold
          the old pseudo register number.

    `REG_EXPR (X)'
          If this register is known to hold the value of some user-level
          declaration, this is that tree node.

    `REG_OFFSET (X)'
          If this register is known to hold the value of some user-level
          declaration, this is the offset into that logical storage.

`SYMBOL_REF'

    `SYMBOL_REF_DECL (X)'
          If the `symbol_ref' X was created for a `VAR_DECL' or a
          `FUNCTION_DECL', that tree is recorded here.  If this value is
          null, then X was created by back end code generation routines,
          and there is no associated front end symbol table entry.

          `SYMBOL_REF_DECL' may also point to a tree of class `'c'',
          that is, some sort of constant.  In this case, the
          `symbol_ref' is an entry in the per-file constant pool;
          again, there is no associated front end symbol table entry.

    `SYMBOL_REF_CONSTANT (X)'
          If `CONSTANT_POOL_ADDRESS_P (X)' is true, this is the constant
          pool entry for X.  It is null otherwise.

    `SYMBOL_REF_DATA (X)'
          A field of opaque type used to store `SYMBOL_REF_DECL' or
          `SYMBOL_REF_CONSTANT'.

    `SYMBOL_REF_FLAGS (X)'
          In a `symbol_ref', this is used to communicate various
          predicates about the symbol.  Some of these are common enough
          to be computed by common code, some are specific to the
          target.  The common bits are:

         `SYMBOL_FLAG_FUNCTION'
               Set if the symbol refers to a function.

         `SYMBOL_FLAG_LOCAL'
               Set if the symbol is local to this "module".  See
               `TARGET_BINDS_LOCAL_P'.

         `SYMBOL_FLAG_EXTERNAL'
               Set if this symbol is not defined in this translation
               unit.  Note that this is not the inverse of
               `SYMBOL_FLAG_LOCAL'.

         `SYMBOL_FLAG_SMALL'
               Set if the symbol is located in the small data section.
               See `TARGET_IN_SMALL_DATA_P'.

         `SYMBOL_REF_TLS_MODEL (X)'
               This is a multi-bit field accessor that returns the
               `tls_model' to be used for a thread-local storage
               symbol.  It returns zero for non-thread-local symbols.

         `SYMBOL_FLAG_HAS_BLOCK_INFO'
               Set if the symbol has `SYMBOL_REF_BLOCK' and
               `SYMBOL_REF_BLOCK_OFFSET' fields.

         `SYMBOL_FLAG_ANCHOR'
               Set if the symbol is used as a section anchor.  "Section
               anchors" are symbols that have a known position within
               an `object_block' and that can be used to access nearby
               members of that block.  They are used to implement
               `-fsection-anchors'.

               If this flag is set, then `SYMBOL_FLAG_HAS_BLOCK_INFO'
               will be too.

          Bits beginning with `SYMBOL_FLAG_MACH_DEP' are available for
          the target's use.

`SYMBOL_REF_BLOCK (X)'
     If `SYMBOL_REF_HAS_BLOCK_INFO_P (X)', this is the `object_block'
     structure to which the symbol belongs, or `NULL' if it has not
     been assigned a block.

`SYMBOL_REF_BLOCK_OFFSET (X)'
     If `SYMBOL_REF_HAS_BLOCK_INFO_P (X)', this is the offset of X from
     the first object in `SYMBOL_REF_BLOCK (X)'.  The value is negative
     if X has not yet been assigned to a block, or it has not been
     given an offset within that block.


File: gccint.info,  Node: Flags,  Next: Machine Modes,  Prev: Special Accessors,  Up: RTL

10.5 Flags in an RTL Expression
===============================

RTL expressions contain several flags (one-bit bit-fields) that are
used in certain types of expression.  Most often they are accessed with
the following macros, which expand into lvalues.

`CONSTANT_POOL_ADDRESS_P (X)'
     Nonzero in a `symbol_ref' if it refers to part of the current
     function's constant pool.  For most targets these addresses are in
     a `.rodata' section entirely separate from the function, but for
     some targets the addresses are close to the beginning of the
     function.  In either case GCC assumes these addresses can be
     addressed directly, perhaps with the help of base registers.
     Stored in the `unchanging' field and printed as `/u'.

`RTL_CONST_CALL_P (X)'
     In a `call_insn' indicates that the insn represents a call to a
     const function.  Stored in the `unchanging' field and printed as
     `/u'.

`RTL_PURE_CALL_P (X)'
     In a `call_insn' indicates that the insn represents a call to a
     pure function.  Stored in the `return_val' field and printed as
     `/i'.

`RTL_CONST_OR_PURE_CALL_P (X)'
     In a `call_insn', true if `RTL_CONST_CALL_P' or `RTL_PURE_CALL_P'
     is true.

`RTL_LOOPING_CONST_OR_PURE_CALL_P (X)'
     In a `call_insn' indicates that the insn represents a possibly
     infinite looping call to a const or pure function.  Stored in the
     `call' field and printed as `/c'.  Only true if one of
     `RTL_CONST_CALL_P' or `RTL_PURE_CALL_P' is true.

`INSN_ANNULLED_BRANCH_P (X)'
     In a `jump_insn', `call_insn', or `insn' indicates that the branch
     is an annulling one.  See the discussion under `sequence' below.
     Stored in the `unchanging' field and printed as `/u'.

`INSN_DELETED_P (X)'
     In an `insn', `call_insn', `jump_insn', `code_label', `barrier',
     or `note', nonzero if the insn has been deleted.  Stored in the
     `volatil' field and printed as `/v'.

`INSN_FROM_TARGET_P (X)'
     In an `insn' or `jump_insn' or `call_insn' in a delay slot of a
     branch, indicates that the insn is from the target of the branch.
     If the branch insn has `INSN_ANNULLED_BRANCH_P' set, this insn
     will only be executed if the branch is taken.  For annulled
     branches with `INSN_FROM_TARGET_P' clear, the insn will be
     executed only if the branch is not taken.  When
     `INSN_ANNULLED_BRANCH_P' is not set, this insn will always be
     executed.  Stored in the `in_struct' field and printed as `/s'.

`LABEL_PRESERVE_P (X)'
     In a `code_label' or `note', indicates that the label is
     referenced by code or data not visible to the RTL of a given
     function.  Labels referenced by a non-local goto will have this
     bit set.  Stored in the `in_struct' field and printed as `/s'.

`LABEL_REF_NONLOCAL_P (X)'
     In `label_ref' and `reg_label' expressions, nonzero if this is a
     reference to a non-local label.  Stored in the `volatil' field and
     printed as `/v'.

`MEM_KEEP_ALIAS_SET_P (X)'
     In `mem' expressions, 1 if we should keep the alias set for this
     mem unchanged when we access a component.  Set to 1, for example,
     when we are already in a non-addressable component of an aggregate.
     Stored in the `jump' field and printed as `/j'.

`MEM_VOLATILE_P (X)'
     In `mem', `asm_operands', and `asm_input' expressions, nonzero for
     volatile memory references.  Stored in the `volatil' field and
     printed as `/v'.

`MEM_NOTRAP_P (X)'
     In `mem', nonzero for memory references that will not trap.
     Stored in the `call' field and printed as `/c'.

`MEM_POINTER (X)'
     Nonzero in a `mem' if the memory reference holds a pointer.
     Stored in the `frame_related' field and printed as `/f'.

`REG_FUNCTION_VALUE_P (X)'
     Nonzero in a `reg' if it is the place in which this function's
     value is going to be returned.  (This happens only in a hard
     register.)  Stored in the `return_val' field and printed as `/i'.

`REG_POINTER (X)'
     Nonzero in a `reg' if the register holds a pointer.  Stored in the
     `frame_related' field and printed as `/f'.

`REG_USERVAR_P (X)'
     In a `reg', nonzero if it corresponds to a variable present in the
     user's source code.  Zero for temporaries generated internally by
     the compiler.  Stored in the `volatil' field and printed as `/v'.

     The same hard register may be used also for collecting the values
     of functions called by this one, but `REG_FUNCTION_VALUE_P' is zero
     in this kind of use.

`RTX_FRAME_RELATED_P (X)'
     Nonzero in an `insn', `call_insn', `jump_insn', `barrier', or
     `set' which is part of a function prologue and sets the stack
     pointer, sets the frame pointer, or saves a register.  This flag
     should also be set on an instruction that sets up a temporary
     register to use in place of the frame pointer.  Stored in the
     `frame_related' field and printed as `/f'.

     In particular, on RISC targets where there are limits on the sizes
     of immediate constants, it is sometimes impossible to reach the
     register save area directly from the stack pointer.  In that case,
     a temporary register is used that is near enough to the register
     save area, and the Canonical Frame Address, i.e., DWARF2's logical
     frame pointer, register must (temporarily) be changed to be this
     temporary register.  So, the instruction that sets this temporary
     register must be marked as `RTX_FRAME_RELATED_P'.

     If the marked instruction is overly complex (defined in terms of
     what `dwarf2out_frame_debug_expr' can handle), you will also have
     to create a `REG_FRAME_RELATED_EXPR' note and attach it to the
     instruction.  This note should contain a simple expression of the
     computation performed by this instruction, i.e., one that
     `dwarf2out_frame_debug_expr' can handle.

     This flag is required for exception handling support on targets
     with RTL prologues.

`MEM_READONLY_P (X)'
     Nonzero in a `mem', if the memory is statically allocated and
     read-only.

     Read-only in this context means never modified during the lifetime
     of the program, not necessarily in ROM or in write-disabled pages.
     A common example of the later is a shared library's global offset
     table.  This table is initialized by the runtime loader, so the
     memory is technically writable, but after control is transferred
     from the runtime loader to the application, this memory will never
     be subsequently modified.

     Stored in the `unchanging' field and printed as `/u'.

`SCHED_GROUP_P (X)'
     During instruction scheduling, in an `insn', `call_insn' or
     `jump_insn', indicates that the previous insn must be scheduled
     together with this insn.  This is used to ensure that certain
     groups of instructions will not be split up by the instruction
     scheduling pass, for example, `use' insns before a `call_insn' may
     not be separated from the `call_insn'.  Stored in the `in_struct'
     field and printed as `/s'.

`SET_IS_RETURN_P (X)'
     For a `set', nonzero if it is for a return.  Stored in the `jump'
     field and printed as `/j'.

`SIBLING_CALL_P (X)'
     For a `call_insn', nonzero if the insn is a sibling call.  Stored
     in the `jump' field and printed as `/j'.

`STRING_POOL_ADDRESS_P (X)'
     For a `symbol_ref' expression, nonzero if it addresses this
     function's string constant pool.  Stored in the `frame_related'
     field and printed as `/f'.

`SUBREG_PROMOTED_UNSIGNED_P (X)'
     Returns a value greater then zero for a `subreg' that has
     `SUBREG_PROMOTED_VAR_P' nonzero if the object being referenced is
     kept zero-extended, zero if it is kept sign-extended, and less
     then zero if it is extended some other way via the `ptr_extend'
     instruction.  Stored in the `unchanging' field and `volatil'
     field, printed as `/u' and `/v'.  This macro may only be used to
     get the value it may not be used to change the value.  Use
     `SUBREG_PROMOTED_UNSIGNED_SET' to change the value.

`SUBREG_PROMOTED_UNSIGNED_SET (X)'
     Set the `unchanging' and `volatil' fields in a `subreg' to reflect
     zero, sign, or other extension.  If `volatil' is zero, then
     `unchanging' as nonzero means zero extension and as zero means
     sign extension.  If `volatil' is nonzero then some other type of
     extension was done via the `ptr_extend' instruction.

`SUBREG_PROMOTED_VAR_P (X)'
     Nonzero in a `subreg' if it was made when accessing an object that
     was promoted to a wider mode in accord with the `PROMOTED_MODE'
     machine description macro (*note Storage Layout::).  In this case,
     the mode of the `subreg' is the declared mode of the object and
     the mode of `SUBREG_REG' is the mode of the register that holds
     the object.  Promoted variables are always either sign- or
     zero-extended to the wider mode on every assignment.  Stored in
     the `in_struct' field and printed as `/s'.

`SYMBOL_REF_USED (X)'
     In a `symbol_ref', indicates that X has been used.  This is
     normally only used to ensure that X is only declared external
     once.  Stored in the `used' field.

`SYMBOL_REF_WEAK (X)'
     In a `symbol_ref', indicates that X has been declared weak.
     Stored in the `return_val' field and printed as `/i'.

`SYMBOL_REF_FLAG (X)'
     In a `symbol_ref', this is used as a flag for machine-specific
     purposes.  Stored in the `volatil' field and printed as `/v'.

     Most uses of `SYMBOL_REF_FLAG' are historic and may be subsumed by
     `SYMBOL_REF_FLAGS'.  Certainly use of `SYMBOL_REF_FLAGS' is
     mandatory if the target requires more than one bit of storage.

`PREFETCH_SCHEDULE_BARRIER_P (X)'
     In a `prefetch', indicates that the prefetch is a scheduling
     barrier.  No other INSNs will be moved over it.  Stored in the
     `volatil' field and printed as `/v'.

 These are the fields to which the above macros refer:

`call'
     In a `mem', 1 means that the memory reference will not trap.

     In a `call', 1 means that this pure or const call may possibly
     infinite loop.

     In an RTL dump, this flag is represented as `/c'.

`frame_related'
     In an `insn' or `set' expression, 1 means that it is part of a
     function prologue and sets the stack pointer, sets the frame
     pointer, saves a register, or sets up a temporary register to use
     in place of the frame pointer.

     In `reg' expressions, 1 means that the register holds a pointer.

     In `mem' expressions, 1 means that the memory reference holds a
     pointer.

     In `symbol_ref' expressions, 1 means that the reference addresses
     this function's string constant pool.

     In an RTL dump, this flag is represented as `/f'.

`in_struct'
     In `reg' expressions, it is 1 if the register has its entire life
     contained within the test expression of some loop.

     In `subreg' expressions, 1 means that the `subreg' is accessing an
     object that has had its mode promoted from a wider mode.

     In `label_ref' expressions, 1 means that the referenced label is
     outside the innermost loop containing the insn in which the
     `label_ref' was found.

     In `code_label' expressions, it is 1 if the label may never be
     deleted.  This is used for labels which are the target of
     non-local gotos.  Such a label that would have been deleted is
     replaced with a `note' of type `NOTE_INSN_DELETED_LABEL'.

     In an `insn' during dead-code elimination, 1 means that the insn is
     dead code.

     In an `insn' or `jump_insn' during reorg for an insn in the delay
     slot of a branch, 1 means that this insn is from the target of the
     branch.

     In an `insn' during instruction scheduling, 1 means that this insn
     must be scheduled as part of a group together with the previous
     insn.

     In an RTL dump, this flag is represented as `/s'.

`return_val'
     In `reg' expressions, 1 means the register contains the value to
     be returned by the current function.  On machines that pass
     parameters in registers, the same register number may be used for
     parameters as well, but this flag is not set on such uses.

     In `symbol_ref' expressions, 1 means the referenced symbol is weak.

     In `call' expressions, 1 means the call is pure.

     In an RTL dump, this flag is represented as `/i'.

`jump'
     In a `mem' expression, 1 means we should keep the alias set for
     this mem unchanged when we access a component.

     In a `set', 1 means it is for a return.

     In a `call_insn', 1 means it is a sibling call.

     In an RTL dump, this flag is represented as `/j'.

`unchanging'
     In `reg' and `mem' expressions, 1 means that the value of the
     expression never changes.

     In `subreg' expressions, it is 1 if the `subreg' references an
     unsigned object whose mode has been promoted to a wider mode.

     In an `insn' or `jump_insn' in the delay slot of a branch
     instruction, 1 means an annulling branch should be used.

     In a `symbol_ref' expression, 1 means that this symbol addresses
     something in the per-function constant pool.

     In a `call_insn' 1 means that this instruction is a call to a const
     function.

     In an RTL dump, this flag is represented as `/u'.

`used'
     This flag is used directly (without an access macro) at the end of
     RTL generation for a function, to count the number of times an
     expression appears in insns.  Expressions that appear more than
     once are copied, according to the rules for shared structure
     (*note Sharing::).

     For a `reg', it is used directly (without an access macro) by the
     leaf register renumbering code to ensure that each register is only
     renumbered once.

     In a `symbol_ref', it indicates that an external declaration for
     the symbol has already been written.

`volatil'
     In a `mem', `asm_operands', or `asm_input' expression, it is 1 if
     the memory reference is volatile.  Volatile memory references may
     not be deleted, reordered or combined.

     In a `symbol_ref' expression, it is used for machine-specific
     purposes.

     In a `reg' expression, it is 1 if the value is a user-level
     variable.  0 indicates an internal compiler temporary.

     In an `insn', 1 means the insn has been deleted.

     In `label_ref' and `reg_label' expressions, 1 means a reference to
     a non-local label.

     In `prefetch' expressions, 1 means that the containing insn is a
     scheduling barrier.

     In an RTL dump, this flag is represented as `/v'.


File: gccint.info,  Node: Machine Modes,  Next: Constants,  Prev: Flags,  Up: RTL

10.6 Machine Modes
==================

A machine mode describes a size of data object and the representation
used for it.  In the C code, machine modes are represented by an
enumeration type, `enum machine_mode', defined in `machmode.def'.  Each
RTL expression has room for a machine mode and so do certain kinds of
tree expressions (declarations and types, to be precise).

 In debugging dumps and machine descriptions, the machine mode of an RTL
expression is written after the expression code with a colon to separate
them.  The letters `mode' which appear at the end of each machine mode
name are omitted.  For example, `(reg:SI 38)' is a `reg' expression
with machine mode `SImode'.  If the mode is `VOIDmode', it is not
written at all.

 Here is a table of machine modes.  The term "byte" below refers to an
object of `BITS_PER_UNIT' bits (*note Storage Layout::).

`BImode'
     "Bit" mode represents a single bit, for predicate registers.

`QImode'
     "Quarter-Integer" mode represents a single byte treated as an
     integer.

`HImode'
     "Half-Integer" mode represents a two-byte integer.

`PSImode'
     "Partial Single Integer" mode represents an integer which occupies
     four bytes but which doesn't really use all four.  On some
     machines, this is the right mode to use for pointers.

`SImode'
     "Single Integer" mode represents a four-byte integer.

`PDImode'
     "Partial Double Integer" mode represents an integer which occupies
     eight bytes but which doesn't really use all eight.  On some
     machines, this is the right mode to use for certain pointers.

`DImode'
     "Double Integer" mode represents an eight-byte integer.

`TImode'
     "Tetra Integer" (?) mode represents a sixteen-byte integer.

`OImode'
     "Octa Integer" (?) mode represents a thirty-two-byte integer.

`QFmode'
     "Quarter-Floating" mode represents a quarter-precision (single
     byte) floating point number.

`HFmode'
     "Half-Floating" mode represents a half-precision (two byte)
     floating point number.

`TQFmode'
     "Three-Quarter-Floating" (?) mode represents a
     three-quarter-precision (three byte) floating point number.

`SFmode'
     "Single Floating" mode represents a four byte floating point
     number.  In the common case, of a processor with IEEE arithmetic
     and 8-bit bytes, this is a single-precision IEEE floating point
     number; it can also be used for double-precision (on processors
     with 16-bit bytes) and single-precision VAX and IBM types.

`DFmode'
     "Double Floating" mode represents an eight byte floating point
     number.  In the common case, of a processor with IEEE arithmetic
     and 8-bit bytes, this is a double-precision IEEE floating point
     number.

`XFmode'
     "Extended Floating" mode represents an IEEE extended floating point
     number.  This mode only has 80 meaningful bits (ten bytes).  Some
     processors require such numbers to be padded to twelve bytes,
     others to sixteen; this mode is used for either.

`SDmode'
     "Single Decimal Floating" mode represents a four byte decimal
     floating point number (as distinct from conventional binary
     floating point).

`DDmode'
     "Double Decimal Floating" mode represents an eight byte decimal
     floating point number.

`TDmode'
     "Tetra Decimal Floating" mode represents a sixteen byte decimal
     floating point number all 128 of whose bits are meaningful.

`TFmode'
     "Tetra Floating" mode represents a sixteen byte floating point
     number all 128 of whose bits are meaningful.  One common use is the
     IEEE quad-precision format.

`QQmode'
     "Quarter-Fractional" mode represents a single byte treated as a
     signed fractional number.  The default format is "s.7".

`HQmode'
     "Half-Fractional" mode represents a two-byte signed fractional
     number.  The default format is "s.15".

`SQmode'
     "Single Fractional" mode represents a four-byte signed fractional
     number.  The default format is "s.31".

`DQmode'
     "Double Fractional" mode represents an eight-byte signed
     fractional number.  The default format is "s.63".

`TQmode'
     "Tetra Fractional" mode represents a sixteen-byte signed
     fractional number.  The default format is "s.127".

`UQQmode'
     "Unsigned Quarter-Fractional" mode represents a single byte
     treated as an unsigned fractional number.  The default format is
     ".8".

`UHQmode'
     "Unsigned Half-Fractional" mode represents a two-byte unsigned
     fractional number.  The default format is ".16".

`USQmode'
     "Unsigned Single Fractional" mode represents a four-byte unsigned
     fractional number.  The default format is ".32".

`UDQmode'
     "Unsigned Double Fractional" mode represents an eight-byte unsigned
     fractional number.  The default format is ".64".

`UTQmode'
     "Unsigned Tetra Fractional" mode represents a sixteen-byte unsigned
     fractional number.  The default format is ".128".

`HAmode'
     "Half-Accumulator" mode represents a two-byte signed accumulator.
     The default format is "s8.7".

`SAmode'
     "Single Accumulator" mode represents a four-byte signed
     accumulator.  The default format is "s16.15".

`DAmode'
     "Double Accumulator" mode represents an eight-byte signed
     accumulator.  The default format is "s32.31".

`TAmode'
     "Tetra Accumulator" mode represents a sixteen-byte signed
     accumulator.  The default format is "s64.63".

`UHAmode'
     "Unsigned Half-Accumulator" mode represents a two-byte unsigned
     accumulator.  The default format is "8.8".

`USAmode'
     "Unsigned Single Accumulator" mode represents a four-byte unsigned
     accumulator.  The default format is "16.16".

`UDAmode'
     "Unsigned Double Accumulator" mode represents an eight-byte
     unsigned accumulator.  The default format is "32.32".

`UTAmode'
     "Unsigned Tetra Accumulator" mode represents a sixteen-byte
     unsigned accumulator.  The default format is "64.64".

`CCmode'
     "Condition Code" mode represents the value of a condition code,
     which is a machine-specific set of bits used to represent the
     result of a comparison operation.  Other machine-specific modes
     may also be used for the condition code.  These modes are not used
     on machines that use `cc0' (*note Condition Code::).

`BLKmode'
     "Block" mode represents values that are aggregates to which none of
     the other modes apply.  In RTL, only memory references can have
     this mode, and only if they appear in string-move or vector
     instructions.  On machines which have no such instructions,
     `BLKmode' will not appear in RTL.

`VOIDmode'
     Void mode means the absence of a mode or an unspecified mode.  For
     example, RTL expressions of code `const_int' have mode `VOIDmode'
     because they can be taken to have whatever mode the context
     requires.  In debugging dumps of RTL, `VOIDmode' is expressed by
     the absence of any mode.

`QCmode, HCmode, SCmode, DCmode, XCmode, TCmode'
     These modes stand for a complex number represented as a pair of
     floating point values.  The floating point values are in `QFmode',
     `HFmode', `SFmode', `DFmode', `XFmode', and `TFmode', respectively.

`CQImode, CHImode, CSImode, CDImode, CTImode, COImode'
     These modes stand for a complex number represented as a pair of
     integer values.  The integer values are in `QImode', `HImode',
     `SImode', `DImode', `TImode', and `OImode', respectively.

 The machine description defines `Pmode' as a C macro which expands
into the machine mode used for addresses.  Normally this is the mode
whose size is `BITS_PER_WORD', `SImode' on 32-bit machines.

 The only modes which a machine description must support are `QImode',
and the modes corresponding to `BITS_PER_WORD', `FLOAT_TYPE_SIZE' and
`DOUBLE_TYPE_SIZE'.  The compiler will attempt to use `DImode' for
8-byte structures and unions, but this can be prevented by overriding
the definition of `MAX_FIXED_MODE_SIZE'.  Alternatively, you can have
the compiler use `TImode' for 16-byte structures and unions.  Likewise,
you can arrange for the C type `short int' to avoid using `HImode'.

 Very few explicit references to machine modes remain in the compiler
and these few references will soon be removed.  Instead, the machine
modes are divided into mode classes.  These are represented by the
enumeration type `enum mode_class' defined in `machmode.h'.  The
possible mode classes are:

`MODE_INT'
     Integer modes.  By default these are `BImode', `QImode', `HImode',
     `SImode', `DImode', `TImode', and `OImode'.

`MODE_PARTIAL_INT'
     The "partial integer" modes, `PQImode', `PHImode', `PSImode' and
     `PDImode'.

`MODE_FLOAT'
     Floating point modes.  By default these are `QFmode', `HFmode',
     `TQFmode', `SFmode', `DFmode', `XFmode' and `TFmode'.

`MODE_DECIMAL_FLOAT'
     Decimal floating point modes.  By default these are `SDmode',
     `DDmode' and `TDmode'.

`MODE_FRACT'
     Signed fractional modes.  By default these are `QQmode', `HQmode',
     `SQmode', `DQmode' and `TQmode'.

`MODE_UFRACT'
     Unsigned fractional modes.  By default these are `UQQmode',
     `UHQmode', `USQmode', `UDQmode' and `UTQmode'.

`MODE_ACCUM'
     Signed accumulator modes.  By default these are `HAmode',
     `SAmode', `DAmode' and `TAmode'.

`MODE_UACCUM'
     Unsigned accumulator modes.  By default these are `UHAmode',
     `USAmode', `UDAmode' and `UTAmode'.

`MODE_COMPLEX_INT'
     Complex integer modes.  (These are not currently implemented).

`MODE_COMPLEX_FLOAT'
     Complex floating point modes.  By default these are `QCmode',
     `HCmode', `SCmode', `DCmode', `XCmode', and `TCmode'.

`MODE_FUNCTION'
     Algol or Pascal function variables including a static chain.
     (These are not currently implemented).

`MODE_CC'
     Modes representing condition code values.  These are `CCmode' plus
     any `CC_MODE' modes listed in the `MACHINE-modes.def'.  *Note Jump
     Patterns::, also see *note Condition Code::.

`MODE_RANDOM'
     This is a catchall mode class for modes which don't fit into the
     above classes.  Currently `VOIDmode' and `BLKmode' are in
     `MODE_RANDOM'.

 Here are some C macros that relate to machine modes:

`GET_MODE (X)'
     Returns the machine mode of the RTX X.

`PUT_MODE (X, NEWMODE)'
     Alters the machine mode of the RTX X to be NEWMODE.

`NUM_MACHINE_MODES'
     Stands for the number of machine modes available on the target
     machine.  This is one greater than the largest numeric value of any
     machine mode.

`GET_MODE_NAME (M)'
     Returns the name of mode M as a string.

`GET_MODE_CLASS (M)'
     Returns the mode class of mode M.

`GET_MODE_WIDER_MODE (M)'
     Returns the next wider natural mode.  For example, the expression
     `GET_MODE_WIDER_MODE (QImode)' returns `HImode'.

`GET_MODE_SIZE (M)'
     Returns the size in bytes of a datum of mode M.

`GET_MODE_BITSIZE (M)'
     Returns the size in bits of a datum of mode M.

`GET_MODE_IBIT (M)'
     Returns the number of integral bits of a datum of fixed-point mode
     M.

`GET_MODE_FBIT (M)'
     Returns the number of fractional bits of a datum of fixed-point
     mode M.

`GET_MODE_MASK (M)'
     Returns a bitmask containing 1 for all bits in a word that fit
     within mode M.  This macro can only be used for modes whose
     bitsize is less than or equal to `HOST_BITS_PER_INT'.

`GET_MODE_ALIGNMENT (M)'
     Return the required alignment, in bits, for an object of mode M.

`GET_MODE_UNIT_SIZE (M)'
     Returns the size in bytes of the subunits of a datum of mode M.
     This is the same as `GET_MODE_SIZE' except in the case of complex
     modes.  For them, the unit size is the size of the real or
     imaginary part.

`GET_MODE_NUNITS (M)'
     Returns the number of units contained in a mode, i.e.,
     `GET_MODE_SIZE' divided by `GET_MODE_UNIT_SIZE'.

`GET_CLASS_NARROWEST_MODE (C)'
     Returns the narrowest mode in mode class C.

 The global variables `byte_mode' and `word_mode' contain modes whose
classes are `MODE_INT' and whose bitsizes are either `BITS_PER_UNIT' or
`BITS_PER_WORD', respectively.  On 32-bit machines, these are `QImode'
and `SImode', respectively.


File: gccint.info,  Node: Constants,  Next: Regs and Memory,  Prev: Machine Modes,  Up: RTL

10.7 Constant Expression Types
==============================

The simplest RTL expressions are those that represent constant values.

`(const_int I)'
     This type of expression represents the integer value I.  I is
     customarily accessed with the macro `INTVAL' as in `INTVAL (EXP)',
     which is equivalent to `XWINT (EXP, 0)'.

     Constants generated for modes with fewer bits than in
     `HOST_WIDE_INT' must be sign extended to full width (e.g., with
     `gen_int_mode').  For constants for modes with more bits than in
     `HOST_WIDE_INT' the implied high order bits of that constant are
     copies of the top bit.  Note however that values are neither
     inherently signed nor inherently unsigned; where necessary,
     signedness is determined by the rtl operation instead.

     There is only one expression object for the integer value zero; it
     is the value of the variable `const0_rtx'.  Likewise, the only
     expression for integer value one is found in `const1_rtx', the only
     expression for integer value two is found in `const2_rtx', and the
     only expression for integer value negative one is found in
     `constm1_rtx'.  Any attempt to create an expression of code
     `const_int' and value zero, one, two or negative one will return
     `const0_rtx', `const1_rtx', `const2_rtx' or `constm1_rtx' as
     appropriate.

     Similarly, there is only one object for the integer whose value is
     `STORE_FLAG_VALUE'.  It is found in `const_true_rtx'.  If
     `STORE_FLAG_VALUE' is one, `const_true_rtx' and `const1_rtx' will
     point to the same object.  If `STORE_FLAG_VALUE' is -1,
     `const_true_rtx' and `constm1_rtx' will point to the same object.

`(const_double:M I0 I1 ...)'
     Represents either a floating-point constant of mode M or an
     integer constant too large to fit into `HOST_BITS_PER_WIDE_INT'
     bits but small enough to fit within twice that number of bits (GCC
     does not provide a mechanism to represent even larger constants).
     In the latter case, M will be `VOIDmode'.  For integral values
     constants for modes with more bits than twice the number in
     `HOST_WIDE_INT' the implied high order bits of that constant are
     copies of the top bit of `CONST_DOUBLE_HIGH'.  Note however that
     integral values are neither inherently signed nor inherently
     unsigned; where necessary, signedness is determined by the rtl
     operation instead.

     If M is `VOIDmode', the bits of the value are stored in I0 and I1.
     I0 is customarily accessed with the macro `CONST_DOUBLE_LOW' and
     I1 with `CONST_DOUBLE_HIGH'.

     If the constant is floating point (regardless of its precision),
     then the number of integers used to store the value depends on the
     size of `REAL_VALUE_TYPE' (*note Floating Point::).  The integers
     represent a floating point number, but not precisely in the target
     machine's or host machine's floating point format.  To convert
     them to the precise bit pattern used by the target machine, use
     the macro `REAL_VALUE_TO_TARGET_DOUBLE' and friends (*note Data
     Output::).

`(const_fixed:M ...)'
     Represents a fixed-point constant of mode M.  The operand is a
     data structure of type `struct fixed_value' and is accessed with
     the macro `CONST_FIXED_VALUE'.  The high part of data is accessed
     with `CONST_FIXED_VALUE_HIGH'; the low part is accessed with
     `CONST_FIXED_VALUE_LOW'.

`(const_vector:M [X0 X1 ...])'
     Represents a vector constant.  The square brackets stand for the
     vector containing the constant elements.  X0, X1 and so on are the
     `const_int', `const_double' or `const_fixed' elements.

     The number of units in a `const_vector' is obtained with the macro
     `CONST_VECTOR_NUNITS' as in `CONST_VECTOR_NUNITS (V)'.

     Individual elements in a vector constant are accessed with the
     macro `CONST_VECTOR_ELT' as in `CONST_VECTOR_ELT (V, N)' where V
     is the vector constant and N is the element desired.

`(const_string STR)'
     Represents a constant string with value STR.  Currently this is
     used only for insn attributes (*note Insn Attributes::) since
     constant strings in C are placed in memory.

`(symbol_ref:MODE SYMBOL)'
     Represents the value of an assembler label for data.  SYMBOL is a
     string that describes the name of the assembler label.  If it
     starts with a `*', the label is the rest of SYMBOL not including
     the `*'.  Otherwise, the label is SYMBOL, usually prefixed with
     `_'.

     The `symbol_ref' contains a mode, which is usually `Pmode'.
     Usually that is the only mode for which a symbol is directly valid.

`(label_ref:MODE LABEL)'
     Represents the value of an assembler label for code.  It contains
     one operand, an expression, which must be a `code_label' or a
     `note' of type `NOTE_INSN_DELETED_LABEL' that appears in the
     instruction sequence to identify the place where the label should
     go.

     The reason for using a distinct expression type for code label
     references is so that jump optimization can distinguish them.

     The `label_ref' contains a mode, which is usually `Pmode'.
     Usually that is the only mode for which a label is directly valid.

`(const:M EXP)'
     Represents a constant that is the result of an assembly-time
     arithmetic computation.  The operand, EXP, is an expression that
     contains only constants (`const_int', `symbol_ref' and `label_ref'
     expressions) combined with `plus' and `minus'.  However, not all
     combinations are valid, since the assembler cannot do arbitrary
     arithmetic on relocatable symbols.

     M should be `Pmode'.

`(high:M EXP)'
     Represents the high-order bits of EXP, usually a `symbol_ref'.
     The number of bits is machine-dependent and is normally the number
     of bits specified in an instruction that initializes the high
     order bits of a register.  It is used with `lo_sum' to represent
     the typical two-instruction sequence used in RISC machines to
     reference a global memory location.

     M should be `Pmode'.

 The macro `CONST0_RTX (MODE)' refers to an expression with value 0 in
mode MODE.  If mode MODE is of mode class `MODE_INT', it returns
`const0_rtx'.  If mode MODE is of mode class `MODE_FLOAT', it returns a
`CONST_DOUBLE' expression in mode MODE.  Otherwise, it returns a
`CONST_VECTOR' expression in mode MODE.  Similarly, the macro
`CONST1_RTX (MODE)' refers to an expression with value 1 in mode MODE
and similarly for `CONST2_RTX'.  The `CONST1_RTX' and `CONST2_RTX'
macros are undefined for vector modes.


File: gccint.info,  Node: Regs and Memory,  Next: Arithmetic,  Prev: Constants,  Up: RTL

10.8 Registers and Memory
=========================

Here are the RTL expression types for describing access to machine
registers and to main memory.

`(reg:M N)'
     For small values of the integer N (those that are less than
     `FIRST_PSEUDO_REGISTER'), this stands for a reference to machine
     register number N: a "hard register".  For larger values of N, it
     stands for a temporary value or "pseudo register".  The compiler's
     strategy is to generate code assuming an unlimited number of such
     pseudo registers, and later convert them into hard registers or
     into memory references.

     M is the machine mode of the reference.  It is necessary because
     machines can generally refer to each register in more than one
     mode.  For example, a register may contain a full word but there
     may be instructions to refer to it as a half word or as a single
     byte, as well as instructions to refer to it as a floating point
     number of various precisions.

     Even for a register that the machine can access in only one mode,
     the mode must always be specified.

     The symbol `FIRST_PSEUDO_REGISTER' is defined by the machine
     description, since the number of hard registers on the machine is
     an invariant characteristic of the machine.  Note, however, that
     not all of the machine registers must be general registers.  All
     the machine registers that can be used for storage of data are
     given hard register numbers, even those that can be used only in
     certain instructions or can hold only certain types of data.

     A hard register may be accessed in various modes throughout one
     function, but each pseudo register is given a natural mode and is
     accessed only in that mode.  When it is necessary to describe an
     access to a pseudo register using a nonnatural mode, a `subreg'
     expression is used.

     A `reg' expression with a machine mode that specifies more than
     one word of data may actually stand for several consecutive
     registers.  If in addition the register number specifies a
     hardware register, then it actually represents several consecutive
     hardware registers starting with the specified one.

     Each pseudo register number used in a function's RTL code is
     represented by a unique `reg' expression.

     Some pseudo register numbers, those within the range of
     `FIRST_VIRTUAL_REGISTER' to `LAST_VIRTUAL_REGISTER' only appear
     during the RTL generation phase and are eliminated before the
     optimization phases.  These represent locations in the stack frame
     that cannot be determined until RTL generation for the function
     has been completed.  The following virtual register numbers are
     defined:

    `VIRTUAL_INCOMING_ARGS_REGNUM'
          This points to the first word of the incoming arguments
          passed on the stack.  Normally these arguments are placed
          there by the caller, but the callee may have pushed some
          arguments that were previously passed in registers.

          When RTL generation is complete, this virtual register is
          replaced by the sum of the register given by
          `ARG_POINTER_REGNUM' and the value of `FIRST_PARM_OFFSET'.

    `VIRTUAL_STACK_VARS_REGNUM'
          If `FRAME_GROWS_DOWNWARD' is defined to a nonzero value, this
          points to immediately above the first variable on the stack.
          Otherwise, it points to the first variable on the stack.

          `VIRTUAL_STACK_VARS_REGNUM' is replaced with the sum of the
          register given by `FRAME_POINTER_REGNUM' and the value
          `STARTING_FRAME_OFFSET'.

    `VIRTUAL_STACK_DYNAMIC_REGNUM'
          This points to the location of dynamically allocated memory
          on the stack immediately after the stack pointer has been
          adjusted by the amount of memory desired.

          This virtual register is replaced by the sum of the register
          given by `STACK_POINTER_REGNUM' and the value
          `STACK_DYNAMIC_OFFSET'.

    `VIRTUAL_OUTGOING_ARGS_REGNUM'
          This points to the location in the stack at which outgoing
          arguments should be written when the stack is pre-pushed
          (arguments pushed using push insns should always use
          `STACK_POINTER_REGNUM').

          This virtual register is replaced by the sum of the register
          given by `STACK_POINTER_REGNUM' and the value
          `STACK_POINTER_OFFSET'.

`(subreg:M1 REG:M2 BYTENUM)'
     `subreg' expressions are used to refer to a register in a machine
     mode other than its natural one, or to refer to one register of a
     multi-part `reg' that actually refers to several registers.

     Each pseudo register has a natural mode.  If it is necessary to
     operate on it in a different mode, the register must be enclosed
     in a `subreg'.

     There are currently three supported types for the first operand of
     a `subreg':
        * pseudo registers This is the most common case.  Most
          `subreg's have pseudo `reg's as their first operand.

        * mem `subreg's of `mem' were common in earlier versions of GCC
          and are still supported.  During the reload pass these are
          replaced by plain `mem's.  On machines that do not do
          instruction scheduling, use of `subreg's of `mem' are still
          used, but this is no longer recommended.  Such `subreg's are
          considered to be `register_operand's rather than
          `memory_operand's before and during reload.  Because of this,
          the scheduling passes cannot properly schedule instructions
          with `subreg's of `mem', so for machines that do scheduling,
          `subreg's of `mem' should never be used.  To support this,
          the combine and recog passes have explicit code to inhibit
          the creation of `subreg's of `mem' when `INSN_SCHEDULING' is
          defined.

          The use of `subreg's of `mem' after the reload pass is an area
          that is not well understood and should be avoided.  There is
          still some code in the compiler to support this, but this
          code has possibly rotted.  This use of `subreg's is
          discouraged and will most likely not be supported in the
          future.

        * hard registers It is seldom necessary to wrap hard registers
          in `subreg's; such registers would normally reduce to a
          single `reg' rtx.  This use of `subreg's is discouraged and
          may not be supported in the future.


     `subreg's of `subreg's are not supported.  Using
     `simplify_gen_subreg' is the recommended way to avoid this problem.

     `subreg's come in two distinct flavors, each having its own usage
     and rules:

    Paradoxical subregs
          When M1 is strictly wider than M2, the `subreg' expression is
          called "paradoxical".  The canonical test for this class of
          `subreg' is:

               GET_MODE_SIZE (M1) > GET_MODE_SIZE (M2)

          Paradoxical `subreg's can be used as both lvalues and rvalues.
          When used as an lvalue, the low-order bits of the source value
          are stored in REG and the high-order bits are discarded.
          When used as an rvalue, the low-order bits of the `subreg' are
          taken from REG while the high-order bits may or may not be
          defined.

          The high-order bits of rvalues are in the following
          circumstances:

             * `subreg's of `mem' When M2 is smaller than a word, the
               macro `LOAD_EXTEND_OP', can control how the high-order
               bits are defined.

             * `subreg' of `reg's The upper bits are defined when
               `SUBREG_PROMOTED_VAR_P' is true.
               `SUBREG_PROMOTED_UNSIGNED_P' describes what the upper
               bits hold.  Such subregs usually represent local
               variables, register variables and parameter pseudo
               variables that have been promoted to a wider mode.


          BYTENUM is always zero for a paradoxical `subreg', even on
          big-endian targets.

          For example, the paradoxical `subreg':

               (set (subreg:SI (reg:HI X) 0) Y)

          stores the lower 2 bytes of Y in X and discards the upper 2
          bytes.  A subsequent:

               (set Z (subreg:SI (reg:HI X) 0))

          would set the lower two bytes of Z to Y and set the upper two
          bytes to an unknown value assuming `SUBREG_PROMOTED_VAR_P' is
          false.

    Normal subregs
          When M1 is at least as narrow as M2 the `subreg' expression
          is called "normal".

          Normal `subreg's restrict consideration to certain bits of
          REG.  There are two cases.  If M1 is smaller than a word, the
          `subreg' refers to the least-significant part (or "lowpart")
          of one word of REG.  If M1 is word-sized or greater, the
          `subreg' refers to one or more complete words.

          When used as an lvalue, `subreg' is a word-based accessor.
          Storing to a `subreg' modifies all the words of REG that
          overlap the `subreg', but it leaves the other words of REG
          alone.

          When storing to a normal `subreg' that is smaller than a word,
          the other bits of the referenced word are usually left in an
          undefined state.  This laxity makes it easier to generate
          efficient code for such instructions.  To represent an
          instruction that preserves all the bits outside of those in
          the `subreg', use `strict_low_part' or `zero_extract' around
          the `subreg'.

          BYTENUM must identify the offset of the first byte of the
          `subreg' from the start of REG, assuming that REG is laid out
          in memory order.  The memory order of bytes is defined by two
          target macros, `WORDS_BIG_ENDIAN' and `BYTES_BIG_ENDIAN':

             * `WORDS_BIG_ENDIAN', if set to 1, says that byte number
               zero is part of the most significant word; otherwise, it
               is part of the least significant word.

             * `BYTES_BIG_ENDIAN', if set to 1, says that byte number
               zero is the most significant byte within a word;
               otherwise, it is the least significant byte within a
               word.

          On a few targets, `FLOAT_WORDS_BIG_ENDIAN' disagrees with
          `WORDS_BIG_ENDIAN'.  However, most parts of the compiler treat
          floating point values as if they had the same endianness as
          integer values.  This works because they handle them solely
          as a collection of integer values, with no particular
          numerical value.  Only real.c and the runtime libraries care
          about `FLOAT_WORDS_BIG_ENDIAN'.

          Thus,

               (subreg:HI (reg:SI X) 2)

          on a `BYTES_BIG_ENDIAN', `UNITS_PER_WORD == 4' target is the
          same as

               (subreg:HI (reg:SI X) 0)

          on a little-endian, `UNITS_PER_WORD == 4' target.  Both
          `subreg's access the lower two bytes of register X.


     A `MODE_PARTIAL_INT' mode behaves as if it were as wide as the
     corresponding `MODE_INT' mode, except that it has an unknown
     number of undefined bits.  For example:

          (subreg:PSI (reg:SI 0) 0)

     accesses the whole of `(reg:SI 0)', but the exact relationship
     between the `PSImode' value and the `SImode' value is not defined.
     If we assume `UNITS_PER_WORD <= 4', then the following two
     `subreg's:

          (subreg:PSI (reg:DI 0) 0)
          (subreg:PSI (reg:DI 0) 4)

     represent independent 4-byte accesses to the two halves of
     `(reg:DI 0)'.  Both `subreg's have an unknown number of undefined
     bits.

     If `UNITS_PER_WORD <= 2' then these two `subreg's:

          (subreg:HI (reg:PSI 0) 0)
          (subreg:HI (reg:PSI 0) 2)

     represent independent 2-byte accesses that together span the whole
     of `(reg:PSI 0)'.  Storing to the first `subreg' does not affect
     the value of the second, and vice versa.  `(reg:PSI 0)' has an
     unknown number of undefined bits, so the assignment:

          (set (subreg:HI (reg:PSI 0) 0) (reg:HI 4))

     does not guarantee that `(subreg:HI (reg:PSI 0) 0)' has the value
     `(reg:HI 4)'.

     The rules above apply to both pseudo REGs and hard REGs.  If the
     semantics are not correct for particular combinations of M1, M2
     and hard REG, the target-specific code must ensure that those
     combinations are never used.  For example:

          CANNOT_CHANGE_MODE_CLASS (M2, M1, CLASS)

     must be true for every class CLASS that includes REG.

     The first operand of a `subreg' expression is customarily accessed
     with the `SUBREG_REG' macro and the second operand is customarily
     accessed with the `SUBREG_BYTE' macro.

     It has been several years since a platform in which
     `BYTES_BIG_ENDIAN' not equal to `WORDS_BIG_ENDIAN' has been
     tested.  Anyone wishing to support such a platform in the future
     may be confronted with code rot.

`(scratch:M)'
     This represents a scratch register that will be required for the
     execution of a single instruction and not used subsequently.  It is
     converted into a `reg' by either the local register allocator or
     the reload pass.

     `scratch' is usually present inside a `clobber' operation (*note
     Side Effects::).

`(cc0)'
     This refers to the machine's condition code register.  It has no
     operands and may not have a machine mode.  There are two ways to
     use it:

        * To stand for a complete set of condition code flags.  This is
          best on most machines, where each comparison sets the entire
          series of flags.

          With this technique, `(cc0)' may be validly used in only two
          contexts: as the destination of an assignment (in test and
          compare instructions) and in comparison operators comparing
          against zero (`const_int' with value zero; that is to say,
          `const0_rtx').

        * To stand for a single flag that is the result of a single
          condition.  This is useful on machines that have only a
          single flag bit, and in which comparison instructions must
          specify the condition to test.

          With this technique, `(cc0)' may be validly used in only two
          contexts: as the destination of an assignment (in test and
          compare instructions) where the source is a comparison
          operator, and as the first operand of `if_then_else' (in a
          conditional branch).

     There is only one expression object of code `cc0'; it is the value
     of the variable `cc0_rtx'.  Any attempt to create an expression of
     code `cc0' will return `cc0_rtx'.

     Instructions can set the condition code implicitly.  On many
     machines, nearly all instructions set the condition code based on
     the value that they compute or store.  It is not necessary to
     record these actions explicitly in the RTL because the machine
     description includes a prescription for recognizing the
     instructions that do so (by means of the macro
     `NOTICE_UPDATE_CC').  *Note Condition Code::.  Only instructions
     whose sole purpose is to set the condition code, and instructions
     that use the condition code, need mention `(cc0)'.

     On some machines, the condition code register is given a register
     number and a `reg' is used instead of `(cc0)'.  This is usually the
     preferable approach if only a small subset of instructions modify
     the condition code.  Other machines store condition codes in
     general registers; in such cases a pseudo register should be used.

     Some machines, such as the SPARC and RS/6000, have two sets of
     arithmetic instructions, one that sets and one that does not set
     the condition code.  This is best handled by normally generating
     the instruction that does not set the condition code, and making a
     pattern that both performs the arithmetic and sets the condition
     code register (which would not be `(cc0)' in this case).  For
     examples, search for `addcc' and `andcc' in `sparc.md'.

`(pc)'
     This represents the machine's program counter.  It has no operands
     and may not have a machine mode.  `(pc)' may be validly used only
     in certain specific contexts in jump instructions.

     There is only one expression object of code `pc'; it is the value
     of the variable `pc_rtx'.  Any attempt to create an expression of
     code `pc' will return `pc_rtx'.

     All instructions that do not jump alter the program counter
     implicitly by incrementing it, but there is no need to mention
     this in the RTL.

`(mem:M ADDR ALIAS)'
     This RTX represents a reference to main memory at an address
     represented by the expression ADDR.  M specifies how large a unit
     of memory is accessed.  ALIAS specifies an alias set for the
     reference.  In general two items are in different alias sets if
     they cannot reference the same memory address.

     The construct `(mem:BLK (scratch))' is considered to alias all
     other memories.  Thus it may be used as a memory barrier in
     epilogue stack deallocation patterns.

`(concatM RTX RTX)'
     This RTX represents the concatenation of two other RTXs.  This is
     used for complex values.  It should only appear in the RTL
     attached to declarations and during RTL generation.  It should not
     appear in the ordinary insn chain.

`(concatnM [RTX ...])'
     This RTX represents the concatenation of all the RTX to make a
     single value.  Like `concat', this should only appear in
     declarations, and not in the insn chain.


File: gccint.info,  Node: Arithmetic,  Next: Comparisons,  Prev: Regs and Memory,  Up: RTL

10.9 RTL Expressions for Arithmetic
===================================

Unless otherwise specified, all the operands of arithmetic expressions
must be valid for mode M.  An operand is valid for mode M if it has
mode M, or if it is a `const_int' or `const_double' and M is a mode of
class `MODE_INT'.

 For commutative binary operations, constants should be placed in the
second operand.

`(plus:M X Y)'
`(ss_plus:M X Y)'
`(us_plus:M X Y)'
     These three expressions all represent the sum of the values
     represented by X and Y carried out in machine mode M.  They differ
     in their behavior on overflow of integer modes.  `plus' wraps
     round modulo the width of M; `ss_plus' saturates at the maximum
     signed value representable in M; `us_plus' saturates at the
     maximum unsigned value.

`(lo_sum:M X Y)'
     This expression represents the sum of X and the low-order bits of
     Y.  It is used with `high' (*note Constants::) to represent the
     typical two-instruction sequence used in RISC machines to
     reference a global memory location.

     The number of low order bits is machine-dependent but is normally
     the number of bits in a `Pmode' item minus the number of bits set
     by `high'.

     M should be `Pmode'.

`(minus:M X Y)'
`(ss_minus:M X Y)'
`(us_minus:M X Y)'
     These three expressions represent the result of subtracting Y from
     X, carried out in mode M.  Behavior on overflow is the same as for
     the three variants of `plus' (see above).

`(compare:M X Y)'
     Represents the result of subtracting Y from X for purposes of
     comparison.  The result is computed without overflow, as if with
     infinite precision.

     Of course, machines can't really subtract with infinite precision.
     However, they can pretend to do so when only the sign of the
     result will be used, which is the case when the result is stored
     in the condition code.  And that is the _only_ way this kind of
     expression may validly be used: as a value to be stored in the
     condition codes, either `(cc0)' or a register.  *Note
     Comparisons::.

     The mode M is not related to the modes of X and Y, but instead is
     the mode of the condition code value.  If `(cc0)' is used, it is
     `VOIDmode'.  Otherwise it is some mode in class `MODE_CC', often
     `CCmode'.  *Note Condition Code::.  If M is `VOIDmode' or
     `CCmode', the operation returns sufficient information (in an
     unspecified format) so that any comparison operator can be applied
     to the result of the `COMPARE' operation.  For other modes in
     class `MODE_CC', the operation only returns a subset of this
     information.

     Normally, X and Y must have the same mode.  Otherwise, `compare'
     is valid only if the mode of X is in class `MODE_INT' and Y is a
     `const_int' or `const_double' with mode `VOIDmode'.  The mode of X
     determines what mode the comparison is to be done in; thus it must
     not be `VOIDmode'.

     If one of the operands is a constant, it should be placed in the
     second operand and the comparison code adjusted as appropriate.

     A `compare' specifying two `VOIDmode' constants is not valid since
     there is no way to know in what mode the comparison is to be
     performed; the comparison must either be folded during the
     compilation or the first operand must be loaded into a register
     while its mode is still known.

`(neg:M X)'
`(ss_neg:M X)'
`(us_neg:M X)'
     These two expressions represent the negation (subtraction from
     zero) of the value represented by X, carried out in mode M.  They
     differ in the behavior on overflow of integer modes.  In the case
     of `neg', the negation of the operand may be a number not
     representable in mode M, in which case it is truncated to M.
     `ss_neg' and `us_neg' ensure that an out-of-bounds result
     saturates to the maximum or minimum signed or unsigned value.

`(mult:M X Y)'
`(ss_mult:M X Y)'
`(us_mult:M X Y)'
     Represents the signed product of the values represented by X and Y
     carried out in machine mode M.  `ss_mult' and `us_mult' ensure
     that an out-of-bounds result saturates to the maximum or minimum
     signed or unsigned value.

     Some machines support a multiplication that generates a product
     wider than the operands.  Write the pattern for this as

          (mult:M (sign_extend:M X) (sign_extend:M Y))

     where M is wider than the modes of X and Y, which need not be the
     same.

     For unsigned widening multiplication, use the same idiom, but with
     `zero_extend' instead of `sign_extend'.

`(fma:M X Y Z)'
     Represents the `fma', `fmaf', and `fmal' builtin functions that do
     a combined multiply of X and Y and then adding toZ without doing
     an intermediate rounding step.

`(div:M X Y)'
`(ss_div:M X Y)'
     Represents the quotient in signed division of X by Y, carried out
     in machine mode M.  If M is a floating point mode, it represents
     the exact quotient; otherwise, the integerized quotient.  `ss_div'
     ensures that an out-of-bounds result saturates to the maximum or
     minimum signed value.

     Some machines have division instructions in which the operands and
     quotient widths are not all the same; you should represent such
     instructions using `truncate' and `sign_extend' as in,

          (truncate:M1 (div:M2 X (sign_extend:M2 Y)))

`(udiv:M X Y)'
`(us_div:M X Y)'
     Like `div' but represents unsigned division.  `us_div' ensures
     that an out-of-bounds result saturates to the maximum or minimum
     unsigned value.

`(mod:M X Y)'
`(umod:M X Y)'
     Like `div' and `udiv' but represent the remainder instead of the
     quotient.

`(smin:M X Y)'
`(smax:M X Y)'
     Represents the smaller (for `smin') or larger (for `smax') of X
     and Y, interpreted as signed values in mode M.  When used with
     floating point, if both operands are zeros, or if either operand
     is `NaN', then it is unspecified which of the two operands is
     returned as the result.

`(umin:M X Y)'
`(umax:M X Y)'
     Like `smin' and `smax', but the values are interpreted as unsigned
     integers.

`(not:M X)'
     Represents the bitwise complement of the value represented by X,
     carried out in mode M, which must be a fixed-point machine mode.

`(and:M X Y)'
     Represents the bitwise logical-and of the values represented by X
     and Y, carried out in machine mode M, which must be a fixed-point
     machine mode.

`(ior:M X Y)'
     Represents the bitwise inclusive-or of the values represented by X
     and Y, carried out in machine mode M, which must be a fixed-point
     mode.

`(xor:M X Y)'
     Represents the bitwise exclusive-or of the values represented by X
     and Y, carried out in machine mode M, which must be a fixed-point
     mode.

`(ashift:M X C)'
`(ss_ashift:M X C)'
`(us_ashift:M X C)'
     These three expressions represent the result of arithmetically
     shifting X left by C places.  They differ in their behavior on
     overflow of integer modes.  An `ashift' operation is a plain shift
     with no special behavior in case of a change in the sign bit;
     `ss_ashift' and `us_ashift' saturates to the minimum or maximum
     representable value if any of the bits shifted out differs from
     the final sign bit.

     X have mode M, a fixed-point machine mode.  C be a fixed-point
     mode or be a constant with mode `VOIDmode'; which mode is
     determined by the mode called for in the machine description entry
     for the left-shift instruction.  For example, on the VAX, the mode
     of C is `QImode' regardless of M.

`(lshiftrt:M X C)'
`(ashiftrt:M X C)'
     Like `ashift' but for right shift.  Unlike the case for left shift,
     these two operations are distinct.

`(rotate:M X C)'
`(rotatert:M X C)'
     Similar but represent left and right rotate.  If C is a constant,
     use `rotate'.

`(abs:M X)'

`(ss_abs:M X)'
     Represents the absolute value of X, computed in mode M.  `ss_abs'
     ensures that an out-of-bounds result saturates to the maximum
     signed value.

`(sqrt:M X)'
     Represents the square root of X, computed in mode M.  Most often M
     will be a floating point mode.

`(ffs:M X)'
     Represents one plus the index of the least significant 1-bit in X,
     represented as an integer of mode M.  (The value is zero if X is
     zero.)  The mode of X must be M or `VOIDmode'.

`(clrsb:M X)'
     Represents the number of redundant leading sign bits in X,
     represented as an integer of mode M, starting at the most
     significant bit position.  This is one less than the number of
     leading sign bits (either 0 or 1), with no special cases.  The
     mode of X must be M or `VOIDmode'.

`(clz:M X)'
     Represents the number of leading 0-bits in X, represented as an
     integer of mode M, starting at the most significant bit position.
     If X is zero, the value is determined by
     `CLZ_DEFINED_VALUE_AT_ZERO' (*note Misc::).  Note that this is one
     of the few expressions that is not invariant under widening.  The
     mode of X must be M or `VOIDmode'.

`(ctz:M X)'
     Represents the number of trailing 0-bits in X, represented as an
     integer of mode M, starting at the least significant bit position.
     If X is zero, the value is determined by
     `CTZ_DEFINED_VALUE_AT_ZERO' (*note Misc::).  Except for this case,
     `ctz(x)' is equivalent to `ffs(X) - 1'.  The mode of X must be M
     or `VOIDmode'.

`(popcount:M X)'
     Represents the number of 1-bits in X, represented as an integer of
     mode M.  The mode of X must be M or `VOIDmode'.

`(parity:M X)'
     Represents the number of 1-bits modulo 2 in X, represented as an
     integer of mode M.  The mode of X must be M or `VOIDmode'.

`(bswap:M X)'
     Represents the value X with the order of bytes reversed, carried
     out in mode M, which must be a fixed-point machine mode.  The mode
     of X must be M or `VOIDmode'.


File: gccint.info,  Node: Comparisons,  Next: Bit-Fields,  Prev: Arithmetic,  Up: RTL

10.10 Comparison Operations
===========================

Comparison operators test a relation on two operands and are considered
to represent a machine-dependent nonzero value described by, but not
necessarily equal to, `STORE_FLAG_VALUE' (*note Misc::) if the relation
holds, or zero if it does not, for comparison operators whose results
have a `MODE_INT' mode, `FLOAT_STORE_FLAG_VALUE' (*note Misc::) if the
relation holds, or zero if it does not, for comparison operators that
return floating-point values, and a vector of either
`VECTOR_STORE_FLAG_VALUE' (*note Misc::) if the relation holds, or of
zeros if it does not, for comparison operators that return vector
results.  The mode of the comparison operation is independent of the
mode of the data being compared.  If the comparison operation is being
tested (e.g., the first operand of an `if_then_else'), the mode must be
`VOIDmode'.

 There are two ways that comparison operations may be used.  The
comparison operators may be used to compare the condition codes `(cc0)'
against zero, as in `(eq (cc0) (const_int 0))'.  Such a construct
actually refers to the result of the preceding instruction in which the
condition codes were set.  The instruction setting the condition code
must be adjacent to the instruction using the condition code; only
`note' insns may separate them.

 Alternatively, a comparison operation may directly compare two data
objects.  The mode of the comparison is determined by the operands; they
must both be valid for a common machine mode.  A comparison with both
operands constant would be invalid as the machine mode could not be
deduced from it, but such a comparison should never exist in RTL due to
constant folding.

 In the example above, if `(cc0)' were last set to `(compare X Y)', the
comparison operation is identical to `(eq X Y)'.  Usually only one style
of comparisons is supported on a particular machine, but the combine
pass will try to merge the operations to produce the `eq' shown in case
it exists in the context of the particular insn involved.

 Inequality comparisons come in two flavors, signed and unsigned.  Thus,
there are distinct expression codes `gt' and `gtu' for signed and
unsigned greater-than.  These can produce different results for the same
pair of integer values: for example, 1 is signed greater-than -1 but not
unsigned greater-than, because -1 when regarded as unsigned is actually
`0xffffffff' which is greater than 1.

 The signed comparisons are also used for floating point values.
Floating point comparisons are distinguished by the machine modes of
the operands.

`(eq:M X Y)'
     `STORE_FLAG_VALUE' if the values represented by X and Y are equal,
     otherwise 0.

`(ne:M X Y)'
     `STORE_FLAG_VALUE' if the values represented by X and Y are not
     equal, otherwise 0.

`(gt:M X Y)'
     `STORE_FLAG_VALUE' if the X is greater than Y.  If they are
     fixed-point, the comparison is done in a signed sense.

`(gtu:M X Y)'
     Like `gt' but does unsigned comparison, on fixed-point numbers
     only.

`(lt:M X Y)'
`(ltu:M X Y)'
     Like `gt' and `gtu' but test for "less than".

`(ge:M X Y)'
`(geu:M X Y)'
     Like `gt' and `gtu' but test for "greater than or equal".

`(le:M X Y)'
`(leu:M X Y)'
     Like `gt' and `gtu' but test for "less than or equal".

`(if_then_else COND THEN ELSE)'
     This is not a comparison operation but is listed here because it is
     always used in conjunction with a comparison operation.  To be
     precise, COND is a comparison expression.  This expression
     represents a choice, according to COND, between the value
     represented by THEN and the one represented by ELSE.

     On most machines, `if_then_else' expressions are valid only to
     express conditional jumps.

`(cond [TEST1 VALUE1 TEST2 VALUE2 ...] DEFAULT)'
     Similar to `if_then_else', but more general.  Each of TEST1,
     TEST2, ... is performed in turn.  The result of this expression is
     the VALUE corresponding to the first nonzero test, or DEFAULT if
     none of the tests are nonzero expressions.

     This is currently not valid for instruction patterns and is
     supported only for insn attributes.  *Note Insn Attributes::.


File: gccint.info,  Node: Bit-Fields,  Next: Vector Operations,  Prev: Comparisons,  Up: RTL

10.11 Bit-Fields
================

Special expression codes exist to represent bit-field instructions.

`(sign_extract:M LOC SIZE POS)'
     This represents a reference to a sign-extended bit-field contained
     or starting in LOC (a memory or register reference).  The bit-field
     is SIZE bits wide and starts at bit POS.  The compilation option
     `BITS_BIG_ENDIAN' says which end of the memory unit POS counts
     from.

     If LOC is in memory, its mode must be a single-byte integer mode.
     If LOC is in a register, the mode to use is specified by the
     operand of the `insv' or `extv' pattern (*note Standard Names::)
     and is usually a full-word integer mode, which is the default if
     none is specified.

     The mode of POS is machine-specific and is also specified in the
     `insv' or `extv' pattern.

     The mode M is the same as the mode that would be used for LOC if
     it were a register.

     A `sign_extract' can not appear as an lvalue, or part thereof, in
     RTL.

`(zero_extract:M LOC SIZE POS)'
     Like `sign_extract' but refers to an unsigned or zero-extended
     bit-field.  The same sequence of bits are extracted, but they are
     filled to an entire word with zeros instead of by sign-extension.

     Unlike `sign_extract', this type of expressions can be lvalues in
     RTL; they may appear on the left side of an assignment, indicating
     insertion of a value into the specified bit-field.


File: gccint.info,  Node: Vector Operations,  Next: Conversions,  Prev: Bit-Fields,  Up: RTL

10.12 Vector Operations
=======================

All normal RTL expressions can be used with vector modes; they are
interpreted as operating on each part of the vector independently.
Additionally, there are a few new expressions to describe specific
vector operations.

`(vec_merge:M VEC1 VEC2 ITEMS)'
     This describes a merge operation between two vectors.  The result
     is a vector of mode M; its elements are selected from either VEC1
     or VEC2.  Which elements are selected is described by ITEMS, which
     is a bit mask represented by a `const_int'; a zero bit indicates
     the corresponding element in the result vector is taken from VEC2
     while a set bit indicates it is taken from VEC1.

`(vec_select:M VEC1 SELECTION)'
     This describes an operation that selects parts of a vector.  VEC1
     is the source vector, and SELECTION is a `parallel' that contains a
     `const_int' for each of the subparts of the result vector, giving
     the number of the source subpart that should be stored into it.
     The result mode M is either the submode for a single element of
     VEC1 (if only one subpart is selected), or another vector mode
     with that element submode (if multiple subparts are selected).

`(vec_concat:M X1 X2)'
     Describes a vector concat operation.  The result is a
     concatenation of the vectors or scalars X1 and X2; its length is
     the sum of the lengths of the two inputs.

`(vec_duplicate:M X)'
     This operation converts a scalar into a vector or a small vector
     into a larger one by duplicating the input values.  The output
     vector mode must have the same submodes as the input vector mode
     or the scalar modes, and the number of output parts must be an
     integer multiple of the number of input parts.



File: gccint.info,  Node: Conversions,  Next: RTL Declarations,  Prev: Vector Operations,  Up: RTL

10.13 Conversions
=================

All conversions between machine modes must be represented by explicit
conversion operations.  For example, an expression which is the sum of
a byte and a full word cannot be written as `(plus:SI (reg:QI 34)
(reg:SI 80))' because the `plus' operation requires two operands of the
same machine mode.  Therefore, the byte-sized operand is enclosed in a
conversion operation, as in

     (plus:SI (sign_extend:SI (reg:QI 34)) (reg:SI 80))

 The conversion operation is not a mere placeholder, because there may
be more than one way of converting from a given starting mode to the
desired final mode.  The conversion operation code says how to do it.

 For all conversion operations, X must not be `VOIDmode' because the
mode in which to do the conversion would not be known.  The conversion
must either be done at compile-time or X must be placed into a register.

`(sign_extend:M X)'
     Represents the result of sign-extending the value X to machine
     mode M.  M must be a fixed-point mode and X a fixed-point value of
     a mode narrower than M.

`(zero_extend:M X)'
     Represents the result of zero-extending the value X to machine
     mode M.  M must be a fixed-point mode and X a fixed-point value of
     a mode narrower than M.

`(float_extend:M X)'
     Represents the result of extending the value X to machine mode M.
     M must be a floating point mode and X a floating point value of a
     mode narrower than M.

`(truncate:M X)'
     Represents the result of truncating the value X to machine mode M.
     M must be a fixed-point mode and X a fixed-point value of a mode
     wider than M.

`(ss_truncate:M X)'
     Represents the result of truncating the value X to machine mode M,
     using signed saturation in the case of overflow.  Both M and the
     mode of X must be fixed-point modes.

`(us_truncate:M X)'
     Represents the result of truncating the value X to machine mode M,
     using unsigned saturation in the case of overflow.  Both M and the
     mode of X must be fixed-point modes.

`(float_truncate:M X)'
     Represents the result of truncating the value X to machine mode M.
     M must be a floating point mode and X a floating point value of a
     mode wider than M.

`(float:M X)'
     Represents the result of converting fixed point value X, regarded
     as signed, to floating point mode M.

`(unsigned_float:M X)'
     Represents the result of converting fixed point value X, regarded
     as unsigned, to floating point mode M.

`(fix:M X)'
     When M is a floating-point mode, represents the result of
     converting floating point value X (valid for mode M) to an
     integer, still represented in floating point mode M, by rounding
     towards zero.

     When M is a fixed-point mode, represents the result of converting
     floating point value X to mode M, regarded as signed.  How
     rounding is done is not specified, so this operation may be used
     validly in compiling C code only for integer-valued operands.

`(unsigned_fix:M X)'
     Represents the result of converting floating point value X to
     fixed point mode M, regarded as unsigned.  How rounding is done is
     not specified.

`(fract_convert:M X)'
     Represents the result of converting fixed-point value X to
     fixed-point mode M, signed integer value X to fixed-point mode M,
     floating-point value X to fixed-point mode M, fixed-point value X
     to integer mode M regarded as signed, or fixed-point value X to
     floating-point mode M.  When overflows or underflows happen, the
     results are undefined.

`(sat_fract:M X)'
     Represents the result of converting fixed-point value X to
     fixed-point mode M, signed integer value X to fixed-point mode M,
     or floating-point value X to fixed-point mode M.  When overflows
     or underflows happen, the results are saturated to the maximum or
     the minimum.

`(unsigned_fract_convert:M X)'
     Represents the result of converting fixed-point value X to integer
     mode M regarded as unsigned, or unsigned integer value X to
     fixed-point mode M.  When overflows or underflows happen, the
     results are undefined.

`(unsigned_sat_fract:M X)'
     Represents the result of converting unsigned integer value X to
     fixed-point mode M.  When overflows or underflows happen, the
     results are saturated to the maximum or the minimum.


File: gccint.info,  Node: RTL Declarations,  Next: Side Effects,  Prev: Conversions,  Up: RTL

10.14 Declarations
==================

Declaration expression codes do not represent arithmetic operations but
rather state assertions about their operands.

`(strict_low_part (subreg:M (reg:N R) 0))'
     This expression code is used in only one context: as the
     destination operand of a `set' expression.  In addition, the
     operand of this expression must be a non-paradoxical `subreg'
     expression.

     The presence of `strict_low_part' says that the part of the
     register which is meaningful in mode N, but is not part of mode M,
     is not to be altered.  Normally, an assignment to such a subreg is
     allowed to have undefined effects on the rest of the register when
     M is less than a word.


File: gccint.info,  Node: Side Effects,  Next: Incdec,  Prev: RTL Declarations,  Up: RTL

10.15 Side Effect Expressions
=============================

The expression codes described so far represent values, not actions.
But machine instructions never produce values; they are meaningful only
for their side effects on the state of the machine.  Special expression
codes are used to represent side effects.

 The body of an instruction is always one of these side effect codes;
the codes described above, which represent values, appear only as the
operands of these.

`(set LVAL X)'
     Represents the action of storing the value of X into the place
     represented by LVAL.  LVAL must be an expression representing a
     place that can be stored in: `reg' (or `subreg', `strict_low_part'
     or `zero_extract'), `mem', `pc', `parallel', or `cc0'.

     If LVAL is a `reg', `subreg' or `mem', it has a machine mode; then
     X must be valid for that mode.

     If LVAL is a `reg' whose machine mode is less than the full width
     of the register, then it means that the part of the register
     specified by the machine mode is given the specified value and the
     rest of the register receives an undefined value.  Likewise, if
     LVAL is a `subreg' whose machine mode is narrower than the mode of
     the register, the rest of the register can be changed in an
     undefined way.

     If LVAL is a `strict_low_part' of a subreg, then the part of the
     register specified by the machine mode of the `subreg' is given
     the value X and the rest of the register is not changed.

     If LVAL is a `zero_extract', then the referenced part of the
     bit-field (a memory or register reference) specified by the
     `zero_extract' is given the value X and the rest of the bit-field
     is not changed.  Note that `sign_extract' can not appear in LVAL.

     If LVAL is `(cc0)', it has no machine mode, and X may be either a
     `compare' expression or a value that may have any mode.  The
     latter case represents a "test" instruction.  The expression `(set
     (cc0) (reg:M N))' is equivalent to `(set (cc0) (compare (reg:M N)
     (const_int 0)))'.  Use the former expression to save space during
     the compilation.

     If LVAL is a `parallel', it is used to represent the case of a
     function returning a structure in multiple registers.  Each element
     of the `parallel' is an `expr_list' whose first operand is a `reg'
     and whose second operand is a `const_int' representing the offset
     (in bytes) into the structure at which the data in that register
     corresponds.  The first element may be null to indicate that the
     structure is also passed partly in memory.

     If LVAL is `(pc)', we have a jump instruction, and the
     possibilities for X are very limited.  It may be a `label_ref'
     expression (unconditional jump).  It may be an `if_then_else'
     (conditional jump), in which case either the second or the third
     operand must be `(pc)' (for the case which does not jump) and the
     other of the two must be a `label_ref' (for the case which does
     jump).  X may also be a `mem' or `(plus:SI (pc) Y)', where Y may
     be a `reg' or a `mem'; these unusual patterns are used to
     represent jumps through branch tables.

     If LVAL is neither `(cc0)' nor `(pc)', the mode of LVAL must not
     be `VOIDmode' and the mode of X must be valid for the mode of LVAL.

     LVAL is customarily accessed with the `SET_DEST' macro and X with
     the `SET_SRC' macro.

`(return)'
     As the sole expression in a pattern, represents a return from the
     current function, on machines where this can be done with one
     instruction, such as VAXen.  On machines where a multi-instruction
     "epilogue" must be executed in order to return from the function,
     returning is done by jumping to a label which precedes the
     epilogue, and the `return' expression code is never used.

     Inside an `if_then_else' expression, represents the value to be
     placed in `pc' to return to the caller.

     Note that an insn pattern of `(return)' is logically equivalent to
     `(set (pc) (return))', but the latter form is never used.

`(simple_return)'
     Like `(return)', but truly represents only a function return, while
     `(return)' may represent an insn that also performs other functions
     of the function epilogue.  Like `(return)', this may also occur in
     conditional jumps.

`(call FUNCTION NARGS)'
     Represents a function call.  FUNCTION is a `mem' expression whose
     address is the address of the function to be called.  NARGS is an
     expression which can be used for two purposes: on some machines it
     represents the number of bytes of stack argument; on others, it
     represents the number of argument registers.

     Each machine has a standard machine mode which FUNCTION must have.
     The machine description defines macro `FUNCTION_MODE' to expand
     into the requisite mode name.  The purpose of this mode is to
     specify what kind of addressing is allowed, on machines where the
     allowed kinds of addressing depend on the machine mode being
     addressed.

`(clobber X)'
     Represents the storing or possible storing of an unpredictable,
     undescribed value into X, which must be a `reg', `scratch',
     `parallel' or `mem' expression.

     One place this is used is in string instructions that store
     standard values into particular hard registers.  It may not be
     worth the trouble to describe the values that are stored, but it
     is essential to inform the compiler that the registers will be
     altered, lest it attempt to keep data in them across the string
     instruction.

     If X is `(mem:BLK (const_int 0))' or `(mem:BLK (scratch))', it
     means that all memory locations must be presumed clobbered.  If X
     is a `parallel', it has the same meaning as a `parallel' in a
     `set' expression.

     Note that the machine description classifies certain hard
     registers as "call-clobbered".  All function call instructions are
     assumed by default to clobber these registers, so there is no need
     to use `clobber' expressions to indicate this fact.  Also, each
     function call is assumed to have the potential to alter any memory
     location, unless the function is declared `const'.

     If the last group of expressions in a `parallel' are each a
     `clobber' expression whose arguments are `reg' or `match_scratch'
     (*note RTL Template::) expressions, the combiner phase can add the
     appropriate `clobber' expressions to an insn it has constructed
     when doing so will cause a pattern to be matched.

     This feature can be used, for example, on a machine that whose
     multiply and add instructions don't use an MQ register but which
     has an add-accumulate instruction that does clobber the MQ
     register.  Similarly, a combined instruction might require a
     temporary register while the constituent instructions might not.

     When a `clobber' expression for a register appears inside a
     `parallel' with other side effects, the register allocator
     guarantees that the register is unoccupied both before and after
     that insn if it is a hard register clobber.  For pseudo-register
     clobber, the register allocator and the reload pass do not assign
     the same hard register to the clobber and the input operands if
     there is an insn alternative containing the `&' constraint (*note
     Modifiers::) for the clobber and the hard register is in register
     classes of the clobber in the alternative.  You can clobber either
     a specific hard register, a pseudo register, or a `scratch'
     expression; in the latter two cases, GCC will allocate a hard
     register that is available there for use as a temporary.

     For instructions that require a temporary register, you should use
     `scratch' instead of a pseudo-register because this will allow the
     combiner phase to add the `clobber' when required.  You do this by
     coding (`clobber' (`match_scratch' ...)).  If you do clobber a
     pseudo register, use one which appears nowhere else--generate a
     new one each time.  Otherwise, you may confuse CSE.

     There is one other known use for clobbering a pseudo register in a
     `parallel': when one of the input operands of the insn is also
     clobbered by the insn.  In this case, using the same pseudo
     register in the clobber and elsewhere in the insn produces the
     expected results.

`(use X)'
     Represents the use of the value of X.  It indicates that the value
     in X at this point in the program is needed, even though it may
     not be apparent why this is so.  Therefore, the compiler will not
     attempt to delete previous instructions whose only effect is to
     store a value in X.  X must be a `reg' expression.

     In some situations, it may be tempting to add a `use' of a
     register in a `parallel' to describe a situation where the value
     of a special register will modify the behavior of the instruction.
     A hypothetical example might be a pattern for an addition that can
     either wrap around or use saturating addition depending on the
     value of a special control register:

          (parallel [(set (reg:SI 2) (unspec:SI [(reg:SI 3)
                                                 (reg:SI 4)] 0))
                     (use (reg:SI 1))])

     This will not work, several of the optimizers only look at
     expressions locally; it is very likely that if you have multiple
     insns with identical inputs to the `unspec', they will be
     optimized away even if register 1 changes in between.

     This means that `use' can _only_ be used to describe that the
     register is live.  You should think twice before adding `use'
     statements, more often you will want to use `unspec' instead.  The
     `use' RTX is most commonly useful to describe that a fixed
     register is implicitly used in an insn.  It is also safe to use in
     patterns where the compiler knows for other reasons that the result
     of the whole pattern is variable, such as `movmemM' or `call'
     patterns.

     During the reload phase, an insn that has a `use' as pattern can
     carry a reg_equal note.  These `use' insns will be deleted before
     the reload phase exits.

     During the delayed branch scheduling phase, X may be an insn.
     This indicates that X previously was located at this place in the
     code and its data dependencies need to be taken into account.
     These `use' insns will be deleted before the delayed branch
     scheduling phase exits.

`(parallel [X0 X1 ...])'
     Represents several side effects performed in parallel.  The square
     brackets stand for a vector; the operand of `parallel' is a vector
     of expressions.  X0, X1 and so on are individual side effect
     expressions--expressions of code `set', `call', `return',
     `simple_return', `clobber' or `use'.

     "In parallel" means that first all the values used in the
     individual side-effects are computed, and second all the actual
     side-effects are performed.  For example,

          (parallel [(set (reg:SI 1) (mem:SI (reg:SI 1)))
                     (set (mem:SI (reg:SI 1)) (reg:SI 1))])

     says unambiguously that the values of hard register 1 and the
     memory location addressed by it are interchanged.  In both places
     where `(reg:SI 1)' appears as a memory address it refers to the
     value in register 1 _before_ the execution of the insn.

     It follows that it is _incorrect_ to use `parallel' and expect the
     result of one `set' to be available for the next one.  For
     example, people sometimes attempt to represent a jump-if-zero
     instruction this way:

          (parallel [(set (cc0) (reg:SI 34))
                     (set (pc) (if_then_else
                                  (eq (cc0) (const_int 0))
                                  (label_ref ...)
                                  (pc)))])

     But this is incorrect, because it says that the jump condition
     depends on the condition code value _before_ this instruction, not
     on the new value that is set by this instruction.

     Peephole optimization, which takes place together with final
     assembly code output, can produce insns whose patterns consist of
     a `parallel' whose elements are the operands needed to output the
     resulting assembler code--often `reg', `mem' or constant
     expressions.  This would not be well-formed RTL at any other stage
     in compilation, but it is ok then because no further optimization
     remains to be done.  However, the definition of the macro
     `NOTICE_UPDATE_CC', if any, must deal with such insns if you
     define any peephole optimizations.

`(cond_exec [COND EXPR])'
     Represents a conditionally executed expression.  The EXPR is
     executed only if the COND is nonzero.  The COND expression must
     not have side-effects, but the EXPR may very well have
     side-effects.

`(sequence [INSNS ...])'
     Represents a sequence of insns.  Each of the INSNS that appears in
     the vector is suitable for appearing in the chain of insns, so it
     must be an `insn', `jump_insn', `call_insn', `code_label',
     `barrier' or `note'.

     A `sequence' RTX is never placed in an actual insn during RTL
     generation.  It represents the sequence of insns that result from a
     `define_expand' _before_ those insns are passed to `emit_insn' to
     insert them in the chain of insns.  When actually inserted, the
     individual sub-insns are separated out and the `sequence' is
     forgotten.

     After delay-slot scheduling is completed, an insn and all the
     insns that reside in its delay slots are grouped together into a
     `sequence'.  The insn requiring the delay slot is the first insn
     in the vector; subsequent insns are to be placed in the delay slot.

     `INSN_ANNULLED_BRANCH_P' is set on an insn in a delay slot to
     indicate that a branch insn should be used that will conditionally
     annul the effect of the insns in the delay slots.  In such a case,
     `INSN_FROM_TARGET_P' indicates that the insn is from the target of
     the branch and should be executed only if the branch is taken;
     otherwise the insn should be executed only if the branch is not
     taken.  *Note Delay Slots::.

 These expression codes appear in place of a side effect, as the body of
an insn, though strictly speaking they do not always describe side
effects as such:

`(asm_input S)'
     Represents literal assembler code as described by the string S.

`(unspec [OPERANDS ...] INDEX)'
`(unspec_volatile [OPERANDS ...] INDEX)'
     Represents a machine-specific operation on OPERANDS.  INDEX
     selects between multiple machine-specific operations.
     `unspec_volatile' is used for volatile operations and operations
     that may trap; `unspec' is used for other operations.

     These codes may appear inside a `pattern' of an insn, inside a
     `parallel', or inside an expression.

`(addr_vec:M [LR0 LR1 ...])'
     Represents a table of jump addresses.  The vector elements LR0,
     etc., are `label_ref' expressions.  The mode M specifies how much
     space is given to each address; normally M would be `Pmode'.

`(addr_diff_vec:M BASE [LR0 LR1 ...] MIN MAX FLAGS)'
     Represents a table of jump addresses expressed as offsets from
     BASE.  The vector elements LR0, etc., are `label_ref' expressions
     and so is BASE.  The mode M specifies how much space is given to
     each address-difference.  MIN and MAX are set up by branch
     shortening and hold a label with a minimum and a maximum address,
     respectively.  FLAGS indicates the relative position of BASE, MIN
     and MAX to the containing insn and of MIN and MAX to BASE.  See
     rtl.def for details.

`(prefetch:M ADDR RW LOCALITY)'
     Represents prefetch of memory at address ADDR.  Operand RW is 1 if
     the prefetch is for data to be written, 0 otherwise; targets that
     do not support write prefetches should treat this as a normal
     prefetch.  Operand LOCALITY specifies the amount of temporal
     locality; 0 if there is none or 1, 2, or 3 for increasing levels
     of temporal locality; targets that do not support locality hints
     should ignore this.

     This insn is used to minimize cache-miss latency by moving data
     into a cache before it is accessed.  It should use only
     non-faulting data prefetch instructions.


File: gccint.info,  Node: Incdec,  Next: Assembler,  Prev: Side Effects,  Up: RTL

10.16 Embedded Side-Effects on Addresses
========================================

Six special side-effect expression codes appear as memory addresses.

`(pre_dec:M X)'
     Represents the side effect of decrementing X by a standard amount
     and represents also the value that X has after being decremented.
     X must be a `reg' or `mem', but most machines allow only a `reg'.
     M must be the machine mode for pointers on the machine in use.
     The amount X is decremented by is the length in bytes of the
     machine mode of the containing memory reference of which this
     expression serves as the address.  Here is an example of its use:

          (mem:DF (pre_dec:SI (reg:SI 39)))

     This says to decrement pseudo register 39 by the length of a
     `DFmode' value and use the result to address a `DFmode' value.

`(pre_inc:M X)'
     Similar, but specifies incrementing X instead of decrementing it.

`(post_dec:M X)'
     Represents the same side effect as `pre_dec' but a different
     value.  The value represented here is the value X has before being
     decremented.

`(post_inc:M X)'
     Similar, but specifies incrementing X instead of decrementing it.

`(post_modify:M X Y)'
     Represents the side effect of setting X to Y and represents X
     before X is modified.  X must be a `reg' or `mem', but most
     machines allow only a `reg'.  M must be the machine mode for
     pointers on the machine in use.

     The expression Y must be one of three forms: `(plus:M X Z)',
     `(minus:M X Z)', or `(plus:M X I)', where Z is an index register
     and I is a constant.

     Here is an example of its use:

          (mem:SF (post_modify:SI (reg:SI 42) (plus (reg:SI 42)
                                                    (reg:SI 48))))

     This says to modify pseudo register 42 by adding the contents of
     pseudo register 48 to it, after the use of what ever 42 points to.

`(pre_modify:M X EXPR)'
     Similar except side effects happen before the use.

 These embedded side effect expressions must be used with care.
Instruction patterns may not use them.  Until the `flow' pass of the
compiler, they may occur only to represent pushes onto the stack.  The
`flow' pass finds cases where registers are incremented or decremented
in one instruction and used as an address shortly before or after;
these cases are then transformed to use pre- or post-increment or
-decrement.

 If a register used as the operand of these expressions is used in
another address in an insn, the original value of the register is used.
Uses of the register outside of an address are not permitted within the
same insn as a use in an embedded side effect expression because such
insns behave differently on different machines and hence must be treated
as ambiguous and disallowed.

 An instruction that can be represented with an embedded side effect
could also be represented using `parallel' containing an additional
`set' to describe how the address register is altered.  This is not
done because machines that allow these operations at all typically
allow them wherever a memory address is called for.  Describing them as
additional parallel stores would require doubling the number of entries
in the machine description.


File: gccint.info,  Node: Assembler,  Next: Debug Information,  Prev: Incdec,  Up: RTL

10.17 Assembler Instructions as Expressions
===========================================

The RTX code `asm_operands' represents a value produced by a
user-specified assembler instruction.  It is used to represent an `asm'
statement with arguments.  An `asm' statement with a single output
operand, like this:

     asm ("foo %1,%2,%0" : "=a" (outputvar) : "g" (x + y), "di" (*z));

is represented using a single `asm_operands' RTX which represents the
value that is stored in `outputvar':

     (set RTX-FOR-OUTPUTVAR
          (asm_operands "foo %1,%2,%0" "a" 0
                        [RTX-FOR-ADDITION-RESULT RTX-FOR-*Z]
                        [(asm_input:M1 "g")
                         (asm_input:M2 "di")]))

Here the operands of the `asm_operands' RTX are the assembler template
string, the output-operand's constraint, the index-number of the output
operand among the output operands specified, a vector of input operand
RTX's, and a vector of input-operand modes and constraints.  The mode
M1 is the mode of the sum `x+y'; M2 is that of `*z'.

 When an `asm' statement has multiple output values, its insn has
several such `set' RTX's inside of a `parallel'.  Each `set' contains
an `asm_operands'; all of these share the same assembler template and
vectors, but each contains the constraint for the respective output
operand.  They are also distinguished by the output-operand index
number, which is 0, 1, ... for successive output operands.


File: gccint.info,  Node: Debug Information,  Next: Insns,  Prev: Assembler,  Up: RTL

10.18 Variable Location Debug Information in RTL
================================================

Variable tracking relies on `MEM_EXPR' and `REG_EXPR' annotations to
determine what user variables memory and register references refer to.

 Variable tracking at assignments uses these notes only when they refer
to variables that live at fixed locations (e.g., addressable variables,
global non-automatic variables).  For variables whose location may
vary, it relies on the following types of notes.

`(var_location:MODE VAR EXP STAT)'
     Binds variable `var', a tree, to value EXP, an RTL expression.  It
     appears only in `NOTE_INSN_VAR_LOCATION' and `DEBUG_INSN's, with
     slightly different meanings.  MODE, if present, represents the
     mode of EXP, which is useful if it is a modeless expression.  STAT
     is only meaningful in notes, indicating whether the variable is
     known to be initialized or uninitialized.

`(debug_expr:MODE DECL)'
     Stands for the value bound to the `DEBUG_EXPR_DECL' DECL, that
     points back to it, within value expressions in `VAR_LOCATION'
     nodes.



File: gccint.info,  Node: Insns,  Next: Calls,  Prev: Debug Information,  Up: RTL

10.19 Insns
===========

The RTL representation of the code for a function is a doubly-linked
chain of objects called "insns".  Insns are expressions with special
codes that are used for no other purpose.  Some insns are actual
instructions; others represent dispatch tables for `switch' statements;
others represent labels to jump to or various sorts of declarative
information.

 In addition to its own specific data, each insn must have a unique
id-number that distinguishes it from all other insns in the current
function (after delayed branch scheduling, copies of an insn with the
same id-number may be present in multiple places in a function, but
these copies will always be identical and will only appear inside a
`sequence'), and chain pointers to the preceding and following insns.
These three fields occupy the same position in every insn, independent
of the expression code of the insn.  They could be accessed with `XEXP'
and `XINT', but instead three special macros are always used:

`INSN_UID (I)'
     Accesses the unique id of insn I.

`PREV_INSN (I)'
     Accesses the chain pointer to the insn preceding I.  If I is the
     first insn, this is a null pointer.

`NEXT_INSN (I)'
     Accesses the chain pointer to the insn following I.  If I is the
     last insn, this is a null pointer.

 The first insn in the chain is obtained by calling `get_insns'; the
last insn is the result of calling `get_last_insn'.  Within the chain
delimited by these insns, the `NEXT_INSN' and `PREV_INSN' pointers must
always correspond: if INSN is not the first insn,

     NEXT_INSN (PREV_INSN (INSN)) == INSN

is always true and if INSN is not the last insn,

     PREV_INSN (NEXT_INSN (INSN)) == INSN

is always true.

 After delay slot scheduling, some of the insns in the chain might be
`sequence' expressions, which contain a vector of insns.  The value of
`NEXT_INSN' in all but the last of these insns is the next insn in the
vector; the value of `NEXT_INSN' of the last insn in the vector is the
same as the value of `NEXT_INSN' for the `sequence' in which it is
contained.  Similar rules apply for `PREV_INSN'.

 This means that the above invariants are not necessarily true for insns
inside `sequence' expressions.  Specifically, if INSN is the first insn
in a `sequence', `NEXT_INSN (PREV_INSN (INSN))' is the insn containing
the `sequence' expression, as is the value of `PREV_INSN (NEXT_INSN
(INSN))' if INSN is the last insn in the `sequence' expression.  You
can use these expressions to find the containing `sequence' expression.

 Every insn has one of the following expression codes:

`insn'
     The expression code `insn' is used for instructions that do not
     jump and do not do function calls.  `sequence' expressions are
     always contained in insns with code `insn' even if one of those
     insns should jump or do function calls.

     Insns with code `insn' have four additional fields beyond the three
     mandatory ones listed above.  These four are described in a table
     below.

`jump_insn'
     The expression code `jump_insn' is used for instructions that may
     jump (or, more generally, may contain `label_ref' expressions to
     which `pc' can be set in that instruction).  If there is an
     instruction to return from the current function, it is recorded as
     a `jump_insn'.

     `jump_insn' insns have the same extra fields as `insn' insns,
     accessed in the same way and in addition contain a field
     `JUMP_LABEL' which is defined once jump optimization has completed.

     For simple conditional and unconditional jumps, this field contains
     the `code_label' to which this insn will (possibly conditionally)
     branch.  In a more complex jump, `JUMP_LABEL' records one of the
     labels that the insn refers to; other jump target labels are
     recorded as `REG_LABEL_TARGET' notes.  The exception is `addr_vec'
     and `addr_diff_vec', where `JUMP_LABEL' is `NULL_RTX' and the only
     way to find the labels is to scan the entire body of the insn.

     Return insns count as jumps, but since they do not refer to any
     labels, their `JUMP_LABEL' is `NULL_RTX'.

`call_insn'
     The expression code `call_insn' is used for instructions that may
     do function calls.  It is important to distinguish these
     instructions because they imply that certain registers and memory
     locations may be altered unpredictably.

     `call_insn' insns have the same extra fields as `insn' insns,
     accessed in the same way and in addition contain a field
     `CALL_INSN_FUNCTION_USAGE', which contains a list (chain of
     `expr_list' expressions) containing `use', `clobber' and sometimes
     `set' expressions that denote hard registers and `mem's used or
     clobbered by the called function.

     A `mem' generally points to a stack slot in which arguments passed
     to the libcall by reference (*note TARGET_PASS_BY_REFERENCE:
     Register Arguments.) are stored.  If the argument is caller-copied
     (*note TARGET_CALLEE_COPIES: Register Arguments.), the stack slot
     will be mentioned in `clobber' and `use' entries; if it's
     callee-copied, only a `use' will appear, and the `mem' may point
     to addresses that are not stack slots.

     Registers occurring inside a `clobber' in this list augment
     registers specified in `CALL_USED_REGISTERS' (*note Register
     Basics::).

     If the list contains a `set' involving two registers, it indicates
     that the function returns one of its arguments.  Such a `set' may
     look like a no-op if the same register holds the argument and the
     return value.

`code_label'
     A `code_label' insn represents a label that a jump insn can jump
     to.  It contains two special fields of data in addition to the
     three standard ones.  `CODE_LABEL_NUMBER' is used to hold the
     "label number", a number that identifies this label uniquely among
     all the labels in the compilation (not just in the current
     function).  Ultimately, the label is represented in the assembler
     output as an assembler label, usually of the form `LN' where N is
     the label number.

     When a `code_label' appears in an RTL expression, it normally
     appears within a `label_ref' which represents the address of the
     label, as a number.

     Besides as a `code_label', a label can also be represented as a
     `note' of type `NOTE_INSN_DELETED_LABEL'.

     The field `LABEL_NUSES' is only defined once the jump optimization
     phase is completed.  It contains the number of times this label is
     referenced in the current function.

     The field `LABEL_KIND' differentiates four different types of
     labels: `LABEL_NORMAL', `LABEL_STATIC_ENTRY',
     `LABEL_GLOBAL_ENTRY', and `LABEL_WEAK_ENTRY'.  The only labels
     that do not have type `LABEL_NORMAL' are "alternate entry points"
     to the current function.  These may be static (visible only in the
     containing translation unit), global (exposed to all translation
     units), or weak (global, but can be overridden by another symbol
     with the same name).

     Much of the compiler treats all four kinds of label identically.
     Some of it needs to know whether or not a label is an alternate
     entry point; for this purpose, the macro `LABEL_ALT_ENTRY_P' is
     provided.  It is equivalent to testing whether `LABEL_KIND (label)
     == LABEL_NORMAL'.  The only place that cares about the distinction
     between static, global, and weak alternate entry points, besides
     the front-end code that creates them, is the function
     `output_alternate_entry_point', in `final.c'.

     To set the kind of a label, use the `SET_LABEL_KIND' macro.

`barrier'
     Barriers are placed in the instruction stream when control cannot
     flow past them.  They are placed after unconditional jump
     instructions to indicate that the jumps are unconditional and
     after calls to `volatile' functions, which do not return (e.g.,
     `exit').  They contain no information beyond the three standard
     fields.

`note'
     `note' insns are used to represent additional debugging and
     declarative information.  They contain two nonstandard fields, an
     integer which is accessed with the macro `NOTE_LINE_NUMBER' and a
     string accessed with `NOTE_SOURCE_FILE'.

     If `NOTE_LINE_NUMBER' is positive, the note represents the
     position of a source line and `NOTE_SOURCE_FILE' is the source
     file name that the line came from.  These notes control generation
     of line number data in the assembler output.

     Otherwise, `NOTE_LINE_NUMBER' is not really a line number but a
     code with one of the following values (and `NOTE_SOURCE_FILE' must
     contain a null pointer):

    `NOTE_INSN_DELETED'
          Such a note is completely ignorable.  Some passes of the
          compiler delete insns by altering them into notes of this
          kind.

    `NOTE_INSN_DELETED_LABEL'
          This marks what used to be a `code_label', but was not used
          for other purposes than taking its address and was
          transformed to mark that no code jumps to it.

    `NOTE_INSN_BLOCK_BEG'
    `NOTE_INSN_BLOCK_END'
          These types of notes indicate the position of the beginning
          and end of a level of scoping of variable names.  They
          control the output of debugging information.

    `NOTE_INSN_EH_REGION_BEG'
    `NOTE_INSN_EH_REGION_END'
          These types of notes indicate the position of the beginning
          and end of a level of scoping for exception handling.
          `NOTE_BLOCK_NUMBER' identifies which `CODE_LABEL' or `note'
          of type `NOTE_INSN_DELETED_LABEL' is associated with the
          given region.

    `NOTE_INSN_LOOP_BEG'
    `NOTE_INSN_LOOP_END'
          These types of notes indicate the position of the beginning
          and end of a `while' or `for' loop.  They enable the loop
          optimizer to find loops quickly.

    `NOTE_INSN_LOOP_CONT'
          Appears at the place in a loop that `continue' statements
          jump to.

    `NOTE_INSN_LOOP_VTOP'
          This note indicates the place in a loop where the exit test
          begins for those loops in which the exit test has been
          duplicated.  This position becomes another virtual start of
          the loop when considering loop invariants.

    `NOTE_INSN_FUNCTION_BEG'
          Appears at the start of the function body, after the function
          prologue.

    `NOTE_INSN_VAR_LOCATION'
          This note is used to generate variable location debugging
          information.  It indicates that the user variable in its
          `VAR_LOCATION' operand is at the location given in the RTL
          expression, or holds a value that can be computed by
          evaluating the RTL expression from that static point in the
          program up to the next such note for the same user variable.


     These codes are printed symbolically when they appear in debugging
     dumps.

`debug_insn'
     The expression code `debug_insn' is used for pseudo-instructions
     that hold debugging information for variable tracking at
     assignments (see `-fvar-tracking-assignments' option).  They are
     the RTL representation of `GIMPLE_DEBUG' statements (*note
     `GIMPLE_DEBUG'::), with a `VAR_LOCATION' operand that binds a user
     variable tree to an RTL representation of the `value' in the
     corresponding statement.  A `DEBUG_EXPR' in it stands for the
     value bound to the corresponding `DEBUG_EXPR_DECL'.

     Throughout optimization passes, binding information is kept in
     pseudo-instruction form, so that, unlike notes, it gets the same
     treatment and adjustments that regular instructions would.  It is
     the variable tracking pass that turns these pseudo-instructions
     into var location notes, analyzing control flow, value
     equivalences and changes to registers and memory referenced in
     value expressions, propagating the values of debug temporaries and
     determining expressions that can be used to compute the value of
     each user variable at as many points (ranges, actually) in the
     program as possible.

     Unlike `NOTE_INSN_VAR_LOCATION', the value expression in an
     `INSN_VAR_LOCATION' denotes a value at that specific point in the
     program, rather than an expression that can be evaluated at any
     later point before an overriding `VAR_LOCATION' is encountered.
     E.g., if a user variable is bound to a `REG' and then a subsequent
     insn modifies the `REG', the note location would keep mapping the
     user variable to the register across the insn, whereas the insn
     location would keep the variable bound to the value, so that the
     variable tracking pass would emit another location note for the
     variable at the point in which the register is modified.


 The machine mode of an insn is normally `VOIDmode', but some phases
use the mode for various purposes.

 The common subexpression elimination pass sets the mode of an insn to
`QImode' when it is the first insn in a block that has already been
processed.

 The second Haifa scheduling pass, for targets that can multiple issue,
sets the mode of an insn to `TImode' when it is believed that the
instruction begins an issue group.  That is, when the instruction
cannot issue simultaneously with the previous.  This may be relied on
by later passes, in particular machine-dependent reorg.

 Here is a table of the extra fields of `insn', `jump_insn' and
`call_insn' insns:

`PATTERN (I)'
     An expression for the side effect performed by this insn.  This
     must be one of the following codes: `set', `call', `use',
     `clobber', `return', `simple_return', `asm_input', `asm_output',
     `addr_vec', `addr_diff_vec', `trap_if', `unspec',
     `unspec_volatile', `parallel', `cond_exec', or `sequence'.  If it
     is a `parallel', each element of the `parallel' must be one these
     codes, except that `parallel' expressions cannot be nested and
     `addr_vec' and `addr_diff_vec' are not permitted inside a
     `parallel' expression.

`INSN_CODE (I)'
     An integer that says which pattern in the machine description
     matches this insn, or -1 if the matching has not yet been
     attempted.

     Such matching is never attempted and this field remains -1 on an
     insn whose pattern consists of a single `use', `clobber',
     `asm_input', `addr_vec' or `addr_diff_vec' expression.

     Matching is also never attempted on insns that result from an `asm'
     statement.  These contain at least one `asm_operands' expression.
     The function `asm_noperands' returns a non-negative value for such
     insns.

     In the debugging output, this field is printed as a number
     followed by a symbolic representation that locates the pattern in
     the `md' file as some small positive or negative offset from a
     named pattern.

`LOG_LINKS (I)'
     A list (chain of `insn_list' expressions) giving information about
     dependencies between instructions within a basic block.  Neither a
     jump nor a label may come between the related insns.  These are
     only used by the schedulers and by combine.  This is a deprecated
     data structure.  Def-use and use-def chains are now preferred.

`REG_NOTES (I)'
     A list (chain of `expr_list' and `insn_list' expressions) giving
     miscellaneous information about the insn.  It is often information
     pertaining to the registers used in this insn.

 The `LOG_LINKS' field of an insn is a chain of `insn_list'
expressions.  Each of these has two operands: the first is an insn, and
the second is another `insn_list' expression (the next one in the
chain).  The last `insn_list' in the chain has a null pointer as second
operand.  The significant thing about the chain is which insns appear
in it (as first operands of `insn_list' expressions).  Their order is
not significant.

 This list is originally set up by the flow analysis pass; it is a null
pointer until then.  Flow only adds links for those data dependencies
which can be used for instruction combination.  For each insn, the flow
analysis pass adds a link to insns which store into registers values
that are used for the first time in this insn.

 The `REG_NOTES' field of an insn is a chain similar to the `LOG_LINKS'
field but it includes `expr_list' expressions in addition to
`insn_list' expressions.  There are several kinds of register notes,
which are distinguished by the machine mode, which in a register note
is really understood as being an `enum reg_note'.  The first operand OP
of the note is data whose meaning depends on the kind of note.

 The macro `REG_NOTE_KIND (X)' returns the kind of register note.  Its
counterpart, the macro `PUT_REG_NOTE_KIND (X, NEWKIND)' sets the
register note type of X to be NEWKIND.

 Register notes are of three classes: They may say something about an
input to an insn, they may say something about an output of an insn, or
they may create a linkage between two insns.  There are also a set of
values that are only used in `LOG_LINKS'.

 These register notes annotate inputs to an insn:

`REG_DEAD'
     The value in OP dies in this insn; that is to say, altering the
     value immediately after this insn would not affect the future
     behavior of the program.

     It does not follow that the register OP has no useful value after
     this insn since OP is not necessarily modified by this insn.
     Rather, no subsequent instruction uses the contents of OP.

`REG_UNUSED'
     The register OP being set by this insn will not be used in a
     subsequent insn.  This differs from a `REG_DEAD' note, which
     indicates that the value in an input will not be used subsequently.
     These two notes are independent; both may be present for the same
     register.

`REG_INC'
     The register OP is incremented (or decremented; at this level
     there is no distinction) by an embedded side effect inside this
     insn.  This means it appears in a `post_inc', `pre_inc',
     `post_dec' or `pre_dec' expression.

`REG_NONNEG'
     The register OP is known to have a nonnegative value when this
     insn is reached.  This is used so that decrement and branch until
     zero instructions, such as the m68k dbra, can be matched.

     The `REG_NONNEG' note is added to insns only if the machine
     description has a `decrement_and_branch_until_zero' pattern.

`REG_LABEL_OPERAND'
     This insn uses OP, a `code_label' or a `note' of type
     `NOTE_INSN_DELETED_LABEL', but is not a `jump_insn', or it is a
     `jump_insn' that refers to the operand as an ordinary operand.
     The label may still eventually be a jump target, but if so in an
     indirect jump in a subsequent insn.  The presence of this note
     allows jump optimization to be aware that OP is, in fact, being
     used, and flow optimization to build an accurate flow graph.

`REG_LABEL_TARGET'
     This insn is a `jump_insn' but not an `addr_vec' or
     `addr_diff_vec'.  It uses OP, a `code_label' as a direct or
     indirect jump target.  Its purpose is similar to that of
     `REG_LABEL_OPERAND'.  This note is only present if the insn has
     multiple targets; the last label in the insn (in the highest
     numbered insn-field) goes into the `JUMP_LABEL' field and does not
     have a `REG_LABEL_TARGET' note.  *Note JUMP_LABEL: Insns.

`REG_CROSSING_JUMP'
     This insn is a branching instruction (either an unconditional jump
     or an indirect jump) which crosses between hot and cold sections,
     which could potentially be very far apart in the executable.  The
     presence of this note indicates to other optimizations that this
     branching instruction should not be "collapsed" into a simpler
     branching construct.  It is used when the optimization to
     partition basic blocks into hot and cold sections is turned on.

`REG_SETJMP'
     Appears attached to each `CALL_INSN' to `setjmp' or a related
     function.

 The following notes describe attributes of outputs of an insn:

`REG_EQUIV'
`REG_EQUAL'
     This note is only valid on an insn that sets only one register and
     indicates that that register will be equal to OP at run time; the
     scope of this equivalence differs between the two types of notes.
     The value which the insn explicitly copies into the register may
     look different from OP, but they will be equal at run time.  If the
     output of the single `set' is a `strict_low_part' expression, the
     note refers to the register that is contained in `SUBREG_REG' of
     the `subreg' expression.

     For `REG_EQUIV', the register is equivalent to OP throughout the
     entire function, and could validly be replaced in all its
     occurrences by OP.  ("Validly" here refers to the data flow of the
     program; simple replacement may make some insns invalid.)  For
     example, when a constant is loaded into a register that is never
     assigned any other value, this kind of note is used.

     When a parameter is copied into a pseudo-register at entry to a
     function, a note of this kind records that the register is
     equivalent to the stack slot where the parameter was passed.
     Although in this case the register may be set by other insns, it
     is still valid to replace the register by the stack slot
     throughout the function.

     A `REG_EQUIV' note is also used on an instruction which copies a
     register parameter into a pseudo-register at entry to a function,
     if there is a stack slot where that parameter could be stored.
     Although other insns may set the pseudo-register, it is valid for
     the compiler to replace the pseudo-register by stack slot
     throughout the function, provided the compiler ensures that the
     stack slot is properly initialized by making the replacement in
     the initial copy instruction as well.  This is used on machines
     for which the calling convention allocates stack space for
     register parameters.  See `REG_PARM_STACK_SPACE' in *note Stack
     Arguments::.

     In the case of `REG_EQUAL', the register that is set by this insn
     will be equal to OP at run time at the end of this insn but not
     necessarily elsewhere in the function.  In this case, OP is
     typically an arithmetic expression.  For example, when a sequence
     of insns such as a library call is used to perform an arithmetic
     operation, this kind of note is attached to the insn that produces
     or copies the final value.

     These two notes are used in different ways by the compiler passes.
     `REG_EQUAL' is used by passes prior to register allocation (such as
     common subexpression elimination and loop optimization) to tell
     them how to think of that value.  `REG_EQUIV' notes are used by
     register allocation to indicate that there is an available
     substitute expression (either a constant or a `mem' expression for
     the location of a parameter on the stack) that may be used in
     place of a register if insufficient registers are available.

     Except for stack homes for parameters, which are indicated by a
     `REG_EQUIV' note and are not useful to the early optimization
     passes and pseudo registers that are equivalent to a memory
     location throughout their entire life, which is not detected until
     later in the compilation, all equivalences are initially indicated
     by an attached `REG_EQUAL' note.  In the early stages of register
     allocation, a `REG_EQUAL' note is changed into a `REG_EQUIV' note
     if OP is a constant and the insn represents the only set of its
     destination register.

     Thus, compiler passes prior to register allocation need only check
     for `REG_EQUAL' notes and passes subsequent to register allocation
     need only check for `REG_EQUIV' notes.

 These notes describe linkages between insns.  They occur in pairs: one
insn has one of a pair of notes that points to a second insn, which has
the inverse note pointing back to the first insn.

`REG_CC_SETTER'
`REG_CC_USER'
     On machines that use `cc0', the insns which set and use `cc0' set
     and use `cc0' are adjacent.  However, when branch delay slot
     filling is done, this may no longer be true.  In this case a
     `REG_CC_USER' note will be placed on the insn setting `cc0' to
     point to the insn using `cc0' and a `REG_CC_SETTER' note will be
     placed on the insn using `cc0' to point to the insn setting `cc0'.

 These values are only used in the `LOG_LINKS' field, and indicate the
type of dependency that each link represents.  Links which indicate a
data dependence (a read after write dependence) do not use any code,
they simply have mode `VOIDmode', and are printed without any
descriptive text.

`REG_DEP_TRUE'
     This indicates a true dependence (a read after write dependence).

`REG_DEP_OUTPUT'
     This indicates an output dependence (a write after write
     dependence).

`REG_DEP_ANTI'
     This indicates an anti dependence (a write after read dependence).


 These notes describe information gathered from gcov profile data.  They
are stored in the `REG_NOTES' field of an insn as an `expr_list'.

`REG_BR_PROB'
     This is used to specify the ratio of branches to non-branches of a
     branch insn according to the profile data.  The value is stored as
     a value between 0 and REG_BR_PROB_BASE; larger values indicate a
     higher probability that the branch will be taken.

`REG_BR_PRED'
     These notes are found in JUMP insns after delayed branch scheduling
     has taken place.  They indicate both the direction and the
     likelihood of the JUMP.  The format is a bitmask of ATTR_FLAG_*
     values.

`REG_FRAME_RELATED_EXPR'
     This is used on an RTX_FRAME_RELATED_P insn wherein the attached
     expression is used in place of the actual insn pattern.  This is
     done in cases where the pattern is either complex or misleading.

 For convenience, the machine mode in an `insn_list' or `expr_list' is
printed using these symbolic codes in debugging dumps.

 The only difference between the expression codes `insn_list' and
`expr_list' is that the first operand of an `insn_list' is assumed to
be an insn and is printed in debugging dumps as the insn's unique id;
the first operand of an `expr_list' is printed in the ordinary way as
an expression.


File: gccint.info,  Node: Calls,  Next: Sharing,  Prev: Insns,  Up: RTL

10.20 RTL Representation of Function-Call Insns
===============================================

Insns that call subroutines have the RTL expression code `call_insn'.
These insns must satisfy special rules, and their bodies must use a
special RTL expression code, `call'.

 A `call' expression has two operands, as follows:

     (call (mem:FM ADDR) NBYTES)

Here NBYTES is an operand that represents the number of bytes of
argument data being passed to the subroutine, FM is a machine mode
(which must equal as the definition of the `FUNCTION_MODE' macro in the
machine description) and ADDR represents the address of the subroutine.

 For a subroutine that returns no value, the `call' expression as shown
above is the entire body of the insn, except that the insn might also
contain `use' or `clobber' expressions.

 For a subroutine that returns a value whose mode is not `BLKmode', the
value is returned in a hard register.  If this register's number is R,
then the body of the call insn looks like this:

     (set (reg:M R)
          (call (mem:FM ADDR) NBYTES))

This RTL expression makes it clear (to the optimizer passes) that the
appropriate register receives a useful value in this insn.

 When a subroutine returns a `BLKmode' value, it is handled by passing
to the subroutine the address of a place to store the value.  So the
call insn itself does not "return" any value, and it has the same RTL
form as a call that returns nothing.

 On some machines, the call instruction itself clobbers some register,
for example to contain the return address.  `call_insn' insns on these
machines should have a body which is a `parallel' that contains both
the `call' expression and `clobber' expressions that indicate which
registers are destroyed.  Similarly, if the call instruction requires
some register other than the stack pointer that is not explicitly
mentioned in its RTL, a `use' subexpression should mention that
register.

 Functions that are called are assumed to modify all registers listed in
the configuration macro `CALL_USED_REGISTERS' (*note Register Basics::)
and, with the exception of `const' functions and library calls, to
modify all of memory.

 Insns containing just `use' expressions directly precede the
`call_insn' insn to indicate which registers contain inputs to the
function.  Similarly, if registers other than those in
`CALL_USED_REGISTERS' are clobbered by the called function, insns
containing a single `clobber' follow immediately after the call to
indicate which registers.


File: gccint.info,  Node: Sharing,  Next: Reading RTL,  Prev: Calls,  Up: RTL

10.21 Structure Sharing Assumptions
===================================

The compiler assumes that certain kinds of RTL expressions are unique;
there do not exist two distinct objects representing the same value.
In other cases, it makes an opposite assumption: that no RTL expression
object of a certain kind appears in more than one place in the
containing structure.

 These assumptions refer to a single function; except for the RTL
objects that describe global variables and external functions, and a
few standard objects such as small integer constants, no RTL objects
are common to two functions.

   * Each pseudo-register has only a single `reg' object to represent
     it, and therefore only a single machine mode.

   * For any symbolic label, there is only one `symbol_ref' object
     referring to it.

   * All `const_int' expressions with equal values are shared.

   * There is only one `pc' expression.

   * There is only one `cc0' expression.

   * There is only one `const_double' expression with value 0 for each
     floating point mode.  Likewise for values 1 and 2.

   * There is only one `const_vector' expression with value 0 for each
     vector mode, be it an integer or a double constant vector.

   * No `label_ref' or `scratch' appears in more than one place in the
     RTL structure; in other words, it is safe to do a tree-walk of all
     the insns in the function and assume that each time a `label_ref'
     or `scratch' is seen it is distinct from all others that are seen.

   * Only one `mem' object is normally created for each static variable
     or stack slot, so these objects are frequently shared in all the
     places they appear.  However, separate but equal objects for these
     variables are occasionally made.

   * When a single `asm' statement has multiple output operands, a
     distinct `asm_operands' expression is made for each output operand.
     However, these all share the vector which contains the sequence of
     input operands.  This sharing is used later on to test whether two
     `asm_operands' expressions come from the same statement, so all
     optimizations must carefully preserve the sharing if they copy the
     vector at all.

   * No RTL object appears in more than one place in the RTL structure
     except as described above.  Many passes of the compiler rely on
     this by assuming that they can modify RTL objects in place without
     unwanted side-effects on other insns.

   * During initial RTL generation, shared structure is freely
     introduced.  After all the RTL for a function has been generated,
     all shared structure is copied by `unshare_all_rtl' in
     `emit-rtl.c', after which the above rules are guaranteed to be
     followed.

   * During the combiner pass, shared structure within an insn can exist
     temporarily.  However, the shared structure is copied before the
     combiner is finished with the insn.  This is done by calling
     `copy_rtx_if_shared', which is a subroutine of `unshare_all_rtl'.


File: gccint.info,  Node: Reading RTL,  Prev: Sharing,  Up: RTL

10.22 Reading RTL
=================

To read an RTL object from a file, call `read_rtx'.  It takes one
argument, a stdio stream, and returns a single RTL object.  This routine
is defined in `read-rtl.c'.  It is not available in the compiler
itself, only the various programs that generate the compiler back end
from the machine description.

 People frequently have the idea of using RTL stored as text in a file
as an interface between a language front end and the bulk of GCC.  This
idea is not feasible.

 GCC was designed to use RTL internally only.  Correct RTL for a given
program is very dependent on the particular target machine.  And the RTL
does not contain all the information about the program.

 The proper way to interface GCC to a new language front end is with
the "tree" data structure, described in the files `tree.h' and
`tree.def'.  The documentation for this structure (*note GENERIC::) is
incomplete.


File: gccint.info,  Node: GENERIC,  Next: GIMPLE,  Prev: Passes,  Up: Top

11 GENERIC
**********

The purpose of GENERIC is simply to provide a language-independent way
of representing an entire function in trees.  To this end, it was
necessary to add a few new tree codes to the back end, but most
everything was already there.  If you can express it with the codes in
`gcc/tree.def', it's GENERIC.

 Early on, there was a great deal of debate about how to think about
statements in a tree IL.  In GENERIC, a statement is defined as any
expression whose value, if any, is ignored.  A statement will always
have `TREE_SIDE_EFFECTS' set (or it will be discarded), but a
non-statement expression may also have side effects.  A `CALL_EXPR',
for instance.

 It would be possible for some local optimizations to work on the
GENERIC form of a function; indeed, the adapted tree inliner works fine
on GENERIC, but the current compiler performs inlining after lowering
to GIMPLE (a restricted form described in the next section). Indeed,
currently the frontends perform this lowering before handing off to
`tree_rest_of_compilation', but this seems inelegant.

* Menu:

* Deficiencies::                Topics net yet covered in this document.
* Tree overview::               All about `tree's.
* Types::                       Fundamental and aggregate types.
* Declarations::                Type declarations and variables.
* Attributes::                  Declaration and type attributes.
* Expressions: Expression trees.            Operating on data.
* Statements::                  Control flow and related trees.
* Functions::           	Function bodies, linkage, and other aspects.
* Language-dependent trees::    Topics and trees specific to language front ends.
* C and C++ Trees::     	Trees specific to C and C++.
* Java Trees:: 	                Trees specific to Java.


File: gccint.info,  Node: Deficiencies,  Next: Tree overview,  Up: GENERIC

11.1 Deficiencies
=================

There are many places in which this document is incomplet and incorrekt.
It is, as of yet, only _preliminary_ documentation.


File: gccint.info,  Node: Tree overview,  Next: Types,  Prev: Deficiencies,  Up: GENERIC

11.2 Overview
=============

The central data structure used by the internal representation is the
`tree'.  These nodes, while all of the C type `tree', are of many
varieties.  A `tree' is a pointer type, but the object to which it
points may be of a variety of types.  From this point forward, we will
refer to trees in ordinary type, rather than in `this font', except
when talking about the actual C type `tree'.

 You can tell what kind of node a particular tree is by using the
`TREE_CODE' macro.  Many, many macros take trees as input and return
trees as output.  However, most macros require a certain kind of tree
node as input.  In other words, there is a type-system for trees, but
it is not reflected in the C type-system.

 For safety, it is useful to configure GCC with `--enable-checking'.
Although this results in a significant performance penalty (since all
tree types are checked at run-time), and is therefore inappropriate in a
release version, it is extremely helpful during the development process.

 Many macros behave as predicates.  Many, although not all, of these
predicates end in `_P'.  Do not rely on the result type of these macros
being of any particular type.  You may, however, rely on the fact that
the type can be compared to `0', so that statements like
     if (TEST_P (t) && !TEST_P (y))
       x = 1;
 and
     int i = (TEST_P (t) != 0);
 are legal.  Macros that return `int' values now may be changed to
return `tree' values, or other pointers in the future.  Even those that
continue to return `int' may return multiple nonzero codes where
previously they returned only zero and one.  Therefore, you should not
write code like
     if (TEST_P (t) == 1)
 as this code is not guaranteed to work correctly in the future.

 You should not take the address of values returned by the macros or
functions described here.  In particular, no guarantee is given that the
values are lvalues.

 In general, the names of macros are all in uppercase, while the names
of functions are entirely in lowercase.  There are rare exceptions to
this rule.  You should assume that any macro or function whose name is
made up entirely of uppercase letters may evaluate its arguments more
than once.  You may assume that a macro or function whose name is made
up entirely of lowercase letters will evaluate its arguments only once.

 The `error_mark_node' is a special tree.  Its tree code is
`ERROR_MARK', but since there is only ever one node with that code, the
usual practice is to compare the tree against `error_mark_node'.  (This
test is just a test for pointer equality.)  If an error has occurred
during front-end processing the flag `errorcount' will be set.  If the
front end has encountered code it cannot handle, it will issue a
message to the user and set `sorrycount'.  When these flags are set,
any macro or function which normally returns a tree of a particular
kind may instead return the `error_mark_node'.  Thus, if you intend to
do any processing of erroneous code, you must be prepared to deal with
the `error_mark_node'.

 Occasionally, a particular tree slot (like an operand to an expression,
or a particular field in a declaration) will be referred to as
"reserved for the back end".  These slots are used to store RTL when
the tree is converted to RTL for use by the GCC back end.  However, if
that process is not taking place (e.g., if the front end is being hooked
up to an intelligent editor), then those slots may be used by the back
end presently in use.

 If you encounter situations that do not match this documentation, such
as tree nodes of types not mentioned here, or macros documented to
return entities of a particular kind that instead return entities of
some different kind, you have found a bug, either in the front end or in
the documentation.  Please report these bugs as you would any other bug.

* Menu:

* Macros and Functions::Macros and functions that can be used with all trees.
* Identifiers::         The names of things.
* Containers::          Lists and vectors.


File: gccint.info,  Node: Macros and Functions,  Next: Identifiers,  Up: Tree overview

11.2.1 Trees
------------

All GENERIC trees have two fields in common.  First, `TREE_CHAIN' is a
pointer that can be used as a singly-linked list to other trees.  The
other is `TREE_TYPE'.  Many trees store the type of an expression or
declaration in this field.

 These are some other functions for handling trees:

`tree_size'
     Return the number of bytes a tree takes.

`build0'
`build1'
`build2'
`build3'
`build4'
`build5'
`build6'
     These functions build a tree and supply values to put in each
     parameter.  The basic signature is `code, type, [operands]'.
     `code' is the `TREE_CODE', and `type' is a tree representing the
     `TREE_TYPE'.  These are followed by the operands, each of which is
     also a tree.



File: gccint.info,  Node: Identifiers,  Next: Containers,  Prev: Macros and Functions,  Up: Tree overview

11.2.2 Identifiers
------------------

An `IDENTIFIER_NODE' represents a slightly more general concept that
the standard C or C++ concept of identifier.  In particular, an
`IDENTIFIER_NODE' may contain a `$', or other extraordinary characters.

 There are never two distinct `IDENTIFIER_NODE's representing the same
identifier.  Therefore, you may use pointer equality to compare
`IDENTIFIER_NODE's, rather than using a routine like `strcmp'.  Use
`get_identifier' to obtain the unique `IDENTIFIER_NODE' for a supplied
string.

 You can use the following macros to access identifiers:
`IDENTIFIER_POINTER'
     The string represented by the identifier, represented as a
     `char*'.  This string is always `NUL'-terminated, and contains no
     embedded `NUL' characters.

`IDENTIFIER_LENGTH'
     The length of the string returned by `IDENTIFIER_POINTER', not
     including the trailing `NUL'.  This value of `IDENTIFIER_LENGTH
     (x)' is always the same as `strlen (IDENTIFIER_POINTER (x))'.

`IDENTIFIER_OPNAME_P'
     This predicate holds if the identifier represents the name of an
     overloaded operator.  In this case, you should not depend on the
     contents of either the `IDENTIFIER_POINTER' or the
     `IDENTIFIER_LENGTH'.

`IDENTIFIER_TYPENAME_P'
     This predicate holds if the identifier represents the name of a
     user-defined conversion operator.  In this case, the `TREE_TYPE' of
     the `IDENTIFIER_NODE' holds the type to which the conversion
     operator converts.



File: gccint.info,  Node: Containers,  Prev: Identifiers,  Up: Tree overview

11.2.3 Containers
-----------------

Two common container data structures can be represented directly with
tree nodes.  A `TREE_LIST' is a singly linked list containing two trees
per node.  These are the `TREE_PURPOSE' and `TREE_VALUE' of each node.
(Often, the `TREE_PURPOSE' contains some kind of tag, or additional
information, while the `TREE_VALUE' contains the majority of the
payload.  In other cases, the `TREE_PURPOSE' is simply `NULL_TREE',
while in still others both the `TREE_PURPOSE' and `TREE_VALUE' are of
equal stature.)  Given one `TREE_LIST' node, the next node is found by
following the `TREE_CHAIN'.  If the `TREE_CHAIN' is `NULL_TREE', then
you have reached the end of the list.

 A `TREE_VEC' is a simple vector.  The `TREE_VEC_LENGTH' is an integer
(not a tree) giving the number of nodes in the vector.  The nodes
themselves are accessed using the `TREE_VEC_ELT' macro, which takes two
arguments.  The first is the `TREE_VEC' in question; the second is an
integer indicating which element in the vector is desired.  The
elements are indexed from zero.


File: gccint.info,  Node: Types,  Next: Declarations,  Prev: Tree overview,  Up: GENERIC

11.3 Types
==========

All types have corresponding tree nodes.  However, you should not assume
that there is exactly one tree node corresponding to each type.  There
are often multiple nodes corresponding to the same type.

 For the most part, different kinds of types have different tree codes.
(For example, pointer types use a `POINTER_TYPE' code while arrays use
an `ARRAY_TYPE' code.)  However, pointers to member functions use the
`RECORD_TYPE' code.  Therefore, when writing a `switch' statement that
depends on the code associated with a particular type, you should take
care to handle pointers to member functions under the `RECORD_TYPE'
case label.

 The following functions and macros deal with cv-qualification of types:
`TYPE_MAIN_VARIANT'
     This macro returns the unqualified version of a type.  It may be
     applied to an unqualified type, but it is not always the identity
     function in that case.

 A few other macros and functions are usable with all types:
`TYPE_SIZE'
     The number of bits required to represent the type, represented as
     an `INTEGER_CST'.  For an incomplete type, `TYPE_SIZE' will be
     `NULL_TREE'.

`TYPE_ALIGN'
     The alignment of the type, in bits, represented as an `int'.

`TYPE_NAME'
     This macro returns a declaration (in the form of a `TYPE_DECL') for
     the type.  (Note this macro does _not_ return an
     `IDENTIFIER_NODE', as you might expect, given its name!)  You can
     look at the `DECL_NAME' of the `TYPE_DECL' to obtain the actual
     name of the type.  The `TYPE_NAME' will be `NULL_TREE' for a type
     that is not a built-in type, the result of a typedef, or a named
     class type.

`TYPE_CANONICAL'
     This macro returns the "canonical" type for the given type node.
     Canonical types are used to improve performance in the C++ and
     Objective-C++ front ends by allowing efficient comparison between
     two type nodes in `same_type_p': if the `TYPE_CANONICAL' values of
     the types are equal, the types are equivalent; otherwise, the types
     are not equivalent. The notion of equivalence for canonical types
     is the same as the notion of type equivalence in the language
     itself. For instance,

     When `TYPE_CANONICAL' is `NULL_TREE', there is no canonical type
     for the given type node. In this case, comparison between this
     type and any other type requires the compiler to perform a deep,
     "structural" comparison to see if the two type nodes have the same
     form and properties.

     The canonical type for a node is always the most fundamental type
     in the equivalence class of types. For instance, `int' is its own
     canonical type. A typedef `I' of `int' will have `int' as its
     canonical type. Similarly, `I*' and a typedef `IP' (defined to
     `I*') will has `int*' as their canonical type. When building a new
     type node, be sure to set `TYPE_CANONICAL' to the appropriate
     canonical type. If the new type is a compound type (built from
     other types), and any of those other types require structural
     equality, use `SET_TYPE_STRUCTURAL_EQUALITY' to ensure that the
     new type also requires structural equality. Finally, if for some
     reason you cannot guarantee that `TYPE_CANONICAL' will point to
     the canonical type, use `SET_TYPE_STRUCTURAL_EQUALITY' to make
     sure that the new type-and any type constructed based on
     it-requires structural equality. If you suspect that the canonical
     type system is miscomparing types, pass `--param
     verify-canonical-types=1' to the compiler or configure with
     `--enable-checking' to force the compiler to verify its
     canonical-type comparisons against the structural comparisons; the
     compiler will then print any warnings if the canonical types
     miscompare.

`TYPE_STRUCTURAL_EQUALITY_P'
     This predicate holds when the node requires structural equality
     checks, e.g., when `TYPE_CANONICAL' is `NULL_TREE'.

`SET_TYPE_STRUCTURAL_EQUALITY'
     This macro states that the type node it is given requires
     structural equality checks, e.g., it sets `TYPE_CANONICAL' to
     `NULL_TREE'.

`same_type_p'
     This predicate takes two types as input, and holds if they are the
     same type.  For example, if one type is a `typedef' for the other,
     or both are `typedef's for the same type.  This predicate also
     holds if the two trees given as input are simply copies of one
     another; i.e., there is no difference between them at the source
     level, but, for whatever reason, a duplicate has been made in the
     representation.  You should never use `==' (pointer equality) to
     compare types; always use `same_type_p' instead.

 Detailed below are the various kinds of types, and the macros that can
be used to access them.  Although other kinds of types are used
elsewhere in G++, the types described here are the only ones that you
will encounter while examining the intermediate representation.

`VOID_TYPE'
     Used to represent the `void' type.

`INTEGER_TYPE'
     Used to represent the various integral types, including `char',
     `short', `int', `long', and `long long'.  This code is not used
     for enumeration types, nor for the `bool' type.  The
     `TYPE_PRECISION' is the number of bits used in the representation,
     represented as an `unsigned int'.  (Note that in the general case
     this is not the same value as `TYPE_SIZE'; suppose that there were
     a 24-bit integer type, but that alignment requirements for the ABI
     required 32-bit alignment.  Then, `TYPE_SIZE' would be an
     `INTEGER_CST' for 32, while `TYPE_PRECISION' would be 24.)  The
     integer type is unsigned if `TYPE_UNSIGNED' holds; otherwise, it
     is signed.

     The `TYPE_MIN_VALUE' is an `INTEGER_CST' for the smallest integer
     that may be represented by this type.  Similarly, the
     `TYPE_MAX_VALUE' is an `INTEGER_CST' for the largest integer that
     may be represented by this type.

`REAL_TYPE'
     Used to represent the `float', `double', and `long double' types.
     The number of bits in the floating-point representation is given
     by `TYPE_PRECISION', as in the `INTEGER_TYPE' case.

`FIXED_POINT_TYPE'
     Used to represent the `short _Fract', `_Fract', `long _Fract',
     `long long _Fract', `short _Accum', `_Accum', `long _Accum', and
     `long long _Accum' types.  The number of bits in the fixed-point
     representation is given by `TYPE_PRECISION', as in the
     `INTEGER_TYPE' case.  There may be padding bits, fractional bits
     and integral bits.  The number of fractional bits is given by
     `TYPE_FBIT', and the number of integral bits is given by
     `TYPE_IBIT'.  The fixed-point type is unsigned if `TYPE_UNSIGNED'
     holds; otherwise, it is signed.  The fixed-point type is
     saturating if `TYPE_SATURATING' holds; otherwise, it is not
     saturating.

`COMPLEX_TYPE'
     Used to represent GCC built-in `__complex__' data types.  The
     `TREE_TYPE' is the type of the real and imaginary parts.

`ENUMERAL_TYPE'
     Used to represent an enumeration type.  The `TYPE_PRECISION' gives
     (as an `int'), the number of bits used to represent the type.  If
     there are no negative enumeration constants, `TYPE_UNSIGNED' will
     hold.  The minimum and maximum enumeration constants may be
     obtained with `TYPE_MIN_VALUE' and `TYPE_MAX_VALUE', respectively;
     each of these macros returns an `INTEGER_CST'.

     The actual enumeration constants themselves may be obtained by
     looking at the `TYPE_VALUES'.  This macro will return a
     `TREE_LIST', containing the constants.  The `TREE_PURPOSE' of each
     node will be an `IDENTIFIER_NODE' giving the name of the constant;
     the `TREE_VALUE' will be an `INTEGER_CST' giving the value
     assigned to that constant.  These constants will appear in the
     order in which they were declared.  The `TREE_TYPE' of each of
     these constants will be the type of enumeration type itself.

`BOOLEAN_TYPE'
     Used to represent the `bool' type.

`POINTER_TYPE'
     Used to represent pointer types, and pointer to data member types.
     The `TREE_TYPE' gives the type to which this type points.

`REFERENCE_TYPE'
     Used to represent reference types.  The `TREE_TYPE' gives the type
     to which this type refers.

`FUNCTION_TYPE'
     Used to represent the type of non-member functions and of static
     member functions.  The `TREE_TYPE' gives the return type of the
     function.  The `TYPE_ARG_TYPES' are a `TREE_LIST' of the argument
     types.  The `TREE_VALUE' of each node in this list is the type of
     the corresponding argument; the `TREE_PURPOSE' is an expression
     for the default argument value, if any.  If the last node in the
     list is `void_list_node' (a `TREE_LIST' node whose `TREE_VALUE' is
     the `void_type_node'), then functions of this type do not take
     variable arguments.  Otherwise, they do take a variable number of
     arguments.

     Note that in C (but not in C++) a function declared like `void f()'
     is an unprototyped function taking a variable number of arguments;
     the `TYPE_ARG_TYPES' of such a function will be `NULL'.

`METHOD_TYPE'
     Used to represent the type of a non-static member function.  Like a
     `FUNCTION_TYPE', the return type is given by the `TREE_TYPE'.  The
     type of `*this', i.e., the class of which functions of this type
     are a member, is given by the `TYPE_METHOD_BASETYPE'.  The
     `TYPE_ARG_TYPES' is the parameter list, as for a `FUNCTION_TYPE',
     and includes the `this' argument.

`ARRAY_TYPE'
     Used to represent array types.  The `TREE_TYPE' gives the type of
     the elements in the array.  If the array-bound is present in the
     type, the `TYPE_DOMAIN' is an `INTEGER_TYPE' whose
     `TYPE_MIN_VALUE' and `TYPE_MAX_VALUE' will be the lower and upper
     bounds of the array, respectively.  The `TYPE_MIN_VALUE' will
     always be an `INTEGER_CST' for zero, while the `TYPE_MAX_VALUE'
     will be one less than the number of elements in the array, i.e.,
     the highest value which may be used to index an element in the
     array.

`RECORD_TYPE'
     Used to represent `struct' and `class' types, as well as pointers
     to member functions and similar constructs in other languages.
     `TYPE_FIELDS' contains the items contained in this type, each of
     which can be a `FIELD_DECL', `VAR_DECL', `CONST_DECL', or
     `TYPE_DECL'.  You may not make any assumptions about the ordering
     of the fields in the type or whether one or more of them overlap.

`UNION_TYPE'
     Used to represent `union' types.  Similar to `RECORD_TYPE' except
     that all `FIELD_DECL' nodes in `TYPE_FIELD' start at bit position
     zero.

`QUAL_UNION_TYPE'
     Used to represent part of a variant record in Ada.  Similar to
     `UNION_TYPE' except that each `FIELD_DECL' has a `DECL_QUALIFIER'
     field, which contains a boolean expression that indicates whether
     the field is present in the object.  The type will only have one
     field, so each field's `DECL_QUALIFIER' is only evaluated if none
     of the expressions in the previous fields in `TYPE_FIELDS' are
     nonzero.  Normally these expressions will reference a field in the
     outer object using a `PLACEHOLDER_EXPR'.

`LANG_TYPE'
     This node is used to represent a language-specific type.  The front
     end must handle it.

`OFFSET_TYPE'
     This node is used to represent a pointer-to-data member.  For a
     data member `X::m' the `TYPE_OFFSET_BASETYPE' is `X' and the
     `TREE_TYPE' is the type of `m'.


 There are variables whose values represent some of the basic types.
These include:
`void_type_node'
     A node for `void'.

`integer_type_node'
     A node for `int'.

`unsigned_type_node.'
     A node for `unsigned int'.

`char_type_node.'
     A node for `char'.
 It may sometimes be useful to compare one of these variables with a
type in hand, using `same_type_p'.


File: gccint.info,  Node: Declarations,  Next: Attributes,  Prev: Types,  Up: GENERIC

11.4 Declarations
=================

This section covers the various kinds of declarations that appear in the
internal representation, except for declarations of functions
(represented by `FUNCTION_DECL' nodes), which are described in *note
Functions::.

* Menu:

* Working with declarations::  Macros and functions that work on
declarations.
* Internal structure:: How declaration nodes are represented.


File: gccint.info,  Node: Working with declarations,  Next: Internal structure,  Up: Declarations

11.4.1 Working with declarations
--------------------------------

Some macros can be used with any kind of declaration.  These include:
`DECL_NAME'
     This macro returns an `IDENTIFIER_NODE' giving the name of the
     entity.

`TREE_TYPE'
     This macro returns the type of the entity declared.

`EXPR_FILENAME'
     This macro returns the name of the file in which the entity was
     declared, as a `char*'.  For an entity declared implicitly by the
     compiler (like `__builtin_memcpy'), this will be the string
     `"<internal>"'.

`EXPR_LINENO'
     This macro returns the line number at which the entity was
     declared, as an `int'.

`DECL_ARTIFICIAL'
     This predicate holds if the declaration was implicitly generated
     by the compiler.  For example, this predicate will hold of an
     implicitly declared member function, or of the `TYPE_DECL'
     implicitly generated for a class type.  Recall that in C++ code
     like:
          struct S {};
     is roughly equivalent to C code like:
          struct S {};
          typedef struct S S;
     The implicitly generated `typedef' declaration is represented by a
     `TYPE_DECL' for which `DECL_ARTIFICIAL' holds.


 The various kinds of declarations include:
`LABEL_DECL'
     These nodes are used to represent labels in function bodies.  For
     more information, see *note Functions::.  These nodes only appear
     in block scopes.

`CONST_DECL'
     These nodes are used to represent enumeration constants.  The
     value of the constant is given by `DECL_INITIAL' which will be an
     `INTEGER_CST' with the same type as the `TREE_TYPE' of the
     `CONST_DECL', i.e., an `ENUMERAL_TYPE'.

`RESULT_DECL'
     These nodes represent the value returned by a function.  When a
     value is assigned to a `RESULT_DECL', that indicates that the
     value should be returned, via bitwise copy, by the function.  You
     can use `DECL_SIZE' and `DECL_ALIGN' on a `RESULT_DECL', just as
     with a `VAR_DECL'.

`TYPE_DECL'
     These nodes represent `typedef' declarations.  The `TREE_TYPE' is
     the type declared to have the name given by `DECL_NAME'.  In some
     cases, there is no associated name.

`VAR_DECL'
     These nodes represent variables with namespace or block scope, as
     well as static data members.  The `DECL_SIZE' and `DECL_ALIGN' are
     analogous to `TYPE_SIZE' and `TYPE_ALIGN'.  For a declaration, you
     should always use the `DECL_SIZE' and `DECL_ALIGN' rather than the
     `TYPE_SIZE' and `TYPE_ALIGN' given by the `TREE_TYPE', since
     special attributes may have been applied to the variable to give
     it a particular size and alignment.  You may use the predicates
     `DECL_THIS_STATIC' or `DECL_THIS_EXTERN' to test whether the
     storage class specifiers `static' or `extern' were used to declare
     a variable.

     If this variable is initialized (but does not require a
     constructor), the `DECL_INITIAL' will be an expression for the
     initializer.  The initializer should be evaluated, and a bitwise
     copy into the variable performed.  If the `DECL_INITIAL' is the
     `error_mark_node', there is an initializer, but it is given by an
     explicit statement later in the code; no bitwise copy is required.

     GCC provides an extension that allows either automatic variables,
     or global variables, to be placed in particular registers.  This
     extension is being used for a particular `VAR_DECL' if
     `DECL_REGISTER' holds for the `VAR_DECL', and if
     `DECL_ASSEMBLER_NAME' is not equal to `DECL_NAME'.  In that case,
     `DECL_ASSEMBLER_NAME' is the name of the register into which the
     variable will be placed.

`PARM_DECL'
     Used to represent a parameter to a function.  Treat these nodes
     similarly to `VAR_DECL' nodes.  These nodes only appear in the
     `DECL_ARGUMENTS' for a `FUNCTION_DECL'.

     The `DECL_ARG_TYPE' for a `PARM_DECL' is the type that will
     actually be used when a value is passed to this function.  It may
     be a wider type than the `TREE_TYPE' of the parameter; for
     example, the ordinary type might be `short' while the
     `DECL_ARG_TYPE' is `int'.

`DEBUG_EXPR_DECL'
     Used to represent an anonymous debug-information temporary created
     to hold an expression as it is optimized away, so that its value
     can be referenced in debug bind statements.

`FIELD_DECL'
     These nodes represent non-static data members.  The `DECL_SIZE' and
     `DECL_ALIGN' behave as for `VAR_DECL' nodes.  The position of the
     field within the parent record is specified by a combination of
     three attributes.  `DECL_FIELD_OFFSET' is the position, counting
     in bytes, of the `DECL_OFFSET_ALIGN'-bit sized word containing the
     bit of the field closest to the beginning of the structure.
     `DECL_FIELD_BIT_OFFSET' is the bit offset of the first bit of the
     field within this word; this may be nonzero even for fields that
     are not bit-fields, since `DECL_OFFSET_ALIGN' may be greater than
     the natural alignment of the field's type.

     If `DECL_C_BIT_FIELD' holds, this field is a bit-field.  In a
     bit-field, `DECL_BIT_FIELD_TYPE' also contains the type that was
     originally specified for it, while DECL_TYPE may be a modified
     type with lesser precision, according to the size of the bit field.

`NAMESPACE_DECL'
     Namespaces provide a name hierarchy for other declarations.  They
     appear in the `DECL_CONTEXT' of other `_DECL' nodes.



File: gccint.info,  Node: Internal structure,  Prev: Working with declarations,  Up: Declarations

11.4.2 Internal structure
-------------------------

`DECL' nodes are represented internally as a hierarchy of structures.

* Menu:

* Current structure hierarchy::  The current DECL node structure
hierarchy.
* Adding new DECL node types:: How to add a new DECL node to a
frontend.


File: gccint.info,  Node: Current structure hierarchy,  Next: Adding new DECL node types,  Up: Internal structure

11.4.2.1 Current structure hierarchy
....................................

`struct tree_decl_minimal'
     This is the minimal structure to inherit from in order for common
     `DECL' macros to work.  The fields it contains are a unique ID,
     source location, context, and name.

`struct tree_decl_common'
     This structure inherits from `struct tree_decl_minimal'.  It
     contains fields that most `DECL' nodes need, such as a field to
     store alignment, machine mode, size, and attributes.

`struct tree_field_decl'
     This structure inherits from `struct tree_decl_common'.  It is
     used to represent `FIELD_DECL'.

`struct tree_label_decl'
     This structure inherits from `struct tree_decl_common'.  It is
     used to represent `LABEL_DECL'.

`struct tree_translation_unit_decl'
     This structure inherits from `struct tree_decl_common'.  It is
     used to represent `TRANSLATION_UNIT_DECL'.

`struct tree_decl_with_rtl'
     This structure inherits from `struct tree_decl_common'.  It
     contains a field to store the low-level RTL associated with a
     `DECL' node.

`struct tree_result_decl'
     This structure inherits from `struct tree_decl_with_rtl'.  It is
     used to represent `RESULT_DECL'.

`struct tree_const_decl'
     This structure inherits from `struct tree_decl_with_rtl'.  It is
     used to represent `CONST_DECL'.

`struct tree_parm_decl'
     This structure inherits from `struct tree_decl_with_rtl'.  It is
     used to represent `PARM_DECL'.

`struct tree_decl_with_vis'
     This structure inherits from `struct tree_decl_with_rtl'.  It
     contains fields necessary to store visibility information, as well
     as a section name and assembler name.

`struct tree_var_decl'
     This structure inherits from `struct tree_decl_with_vis'.  It is
     used to represent `VAR_DECL'.

`struct tree_function_decl'
     This structure inherits from `struct tree_decl_with_vis'.  It is
     used to represent `FUNCTION_DECL'.



File: gccint.info,  Node: Adding new DECL node types,  Prev: Current structure hierarchy,  Up: Internal structure

11.4.2.2 Adding new DECL node types
...................................

Adding a new `DECL' tree consists of the following steps

Add a new tree code for the `DECL' node
     For language specific `DECL' nodes, there is a `.def' file in each
     frontend directory where the tree code should be added.  For
     `DECL' nodes that are part of the middle-end, the code should be
     added to `tree.def'.

Create a new structure type for the `DECL' node
     These structures should inherit from one of the existing
     structures in the language hierarchy by using that structure as
     the first member.

          struct tree_foo_decl
          {
             struct tree_decl_with_vis common;
          }

     Would create a structure name `tree_foo_decl' that inherits from
     `struct tree_decl_with_vis'.

     For language specific `DECL' nodes, this new structure type should
     go in the appropriate `.h' file.  For `DECL' nodes that are part
     of the middle-end, the structure type should go in `tree.h'.

Add a member to the tree structure enumerator for the node
     For garbage collection and dynamic checking purposes, each `DECL'
     node structure type is required to have a unique enumerator value
     specified with it.  For language specific `DECL' nodes, this new
     enumerator value should go in the appropriate `.def' file.  For
     `DECL' nodes that are part of the middle-end, the enumerator
     values are specified in `treestruct.def'.

Update `union tree_node'
     In order to make your new structure type usable, it must be added
     to `union tree_node'.  For language specific `DECL' nodes, a new
     entry should be added to the appropriate `.h' file of the form
            struct tree_foo_decl GTY ((tag ("TS_VAR_DECL"))) foo_decl;
     For `DECL' nodes that are part of the middle-end, the additional
     member goes directly into `union tree_node' in `tree.h'.

Update dynamic checking info
     In order to be able to check whether accessing a named portion of
     `union tree_node' is legal, and whether a certain `DECL' node
     contains one of the enumerated `DECL' node structures in the
     hierarchy, a simple lookup table is used.  This lookup table needs
     to be kept up to date with the tree structure hierarchy, or else
     checking and containment macros will fail inappropriately.

     For language specific `DECL' nodes, their is an `init_ts' function
     in an appropriate `.c' file, which initializes the lookup table.
     Code setting up the table for new `DECL' nodes should be added
     there.  For each `DECL' tree code and enumerator value
     representing a member of the inheritance  hierarchy, the table
     should contain 1 if that tree code inherits (directly or
     indirectly) from that member.  Thus, a `FOO_DECL' node derived
     from `struct decl_with_rtl', and enumerator value `TS_FOO_DECL',
     would be set up as follows
          tree_contains_struct[FOO_DECL][TS_FOO_DECL] = 1;
          tree_contains_struct[FOO_DECL][TS_DECL_WRTL] = 1;
          tree_contains_struct[FOO_DECL][TS_DECL_COMMON] = 1;
          tree_contains_struct[FOO_DECL][TS_DECL_MINIMAL] = 1;

     For `DECL' nodes that are part of the middle-end, the setup code
     goes into `tree.c'.

Add macros to access any new fields and flags
     Each added field or flag should have a macro that is used to access
     it, that performs appropriate checking to ensure only the right
     type of `DECL' nodes access the field.

     These macros generally take the following form
          #define FOO_DECL_FIELDNAME(NODE) FOO_DECL_CHECK(NODE)->foo_decl.fieldname
     However, if the structure is simply a base class for further
     structures, something like the following should be used
          #define BASE_STRUCT_CHECK(T) CONTAINS_STRUCT_CHECK(T, TS_BASE_STRUCT)
          #define BASE_STRUCT_FIELDNAME(NODE) \
             (BASE_STRUCT_CHECK(NODE)->base_struct.fieldname



File: gccint.info,  Node: Attributes,  Next: Expression trees,  Prev: Declarations,  Up: GENERIC

11.5 Attributes in trees
========================

Attributes, as specified using the `__attribute__' keyword, are
represented internally as a `TREE_LIST'.  The `TREE_PURPOSE' is the
name of the attribute, as an `IDENTIFIER_NODE'.  The `TREE_VALUE' is a
`TREE_LIST' of the arguments of the attribute, if any, or `NULL_TREE'
if there are no arguments; the arguments are stored as the `TREE_VALUE'
of successive entries in the list, and may be identifiers or
expressions.  The `TREE_CHAIN' of the attribute is the next attribute
in a list of attributes applying to the same declaration or type, or
`NULL_TREE' if there are no further attributes in the list.

 Attributes may be attached to declarations and to types; these
attributes may be accessed with the following macros.  All attributes
are stored in this way, and many also cause other changes to the
declaration or type or to other internal compiler data structures.

 -- Tree Macro: tree DECL_ATTRIBUTES (tree DECL)
     This macro returns the attributes on the declaration DECL.

 -- Tree Macro: tree TYPE_ATTRIBUTES (tree TYPE)
     This macro returns the attributes on the type TYPE.


File: gccint.info,  Node: Expression trees,  Next: Statements,  Prev: Attributes,  Up: GENERIC

11.6 Expressions
================

The internal representation for expressions is for the most part quite
straightforward.  However, there are a few facts that one must bear in
mind.  In particular, the expression "tree" is actually a directed
acyclic graph.  (For example there may be many references to the integer
constant zero throughout the source program; many of these will be
represented by the same expression node.)  You should not rely on
certain kinds of node being shared, nor should you rely on certain
kinds of nodes being unshared.

 The following macros can be used with all expression nodes:

`TREE_TYPE'
     Returns the type of the expression.  This value may not be
     precisely the same type that would be given the expression in the
     original program.

 In what follows, some nodes that one might expect to always have type
`bool' are documented to have either integral or boolean type.  At some
point in the future, the C front end may also make use of this same
intermediate representation, and at this point these nodes will
certainly have integral type.  The previous sentence is not meant to
imply that the C++ front end does not or will not give these nodes
integral type.

 Below, we list the various kinds of expression nodes.  Except where
noted otherwise, the operands to an expression are accessed using the
`TREE_OPERAND' macro.  For example, to access the first operand to a
binary plus expression `expr', use:

     TREE_OPERAND (expr, 0)
 As this example indicates, the operands are zero-indexed.

* Menu:

* Constants: Constant expressions.
* Storage References::
* Unary and Binary Expressions::
* Vectors::


File: gccint.info,  Node: Constant expressions,  Next: Storage References,  Up: Expression trees

11.6.1 Constant expressions
---------------------------

The table below begins with constants, moves on to unary expressions,
then proceeds to binary expressions, and concludes with various other
kinds of expressions:

`INTEGER_CST'
     These nodes represent integer constants.  Note that the type of
     these constants is obtained with `TREE_TYPE'; they are not always
     of type `int'.  In particular, `char' constants are represented
     with `INTEGER_CST' nodes.  The value of the integer constant `e' is
     given by
          ((TREE_INT_CST_HIGH (e) << HOST_BITS_PER_WIDE_INT)
          + TREE_INST_CST_LOW (e))
     HOST_BITS_PER_WIDE_INT is at least thirty-two on all platforms.
     Both `TREE_INT_CST_HIGH' and `TREE_INT_CST_LOW' return a
     `HOST_WIDE_INT'.  The value of an `INTEGER_CST' is interpreted as
     a signed or unsigned quantity depending on the type of the
     constant.  In general, the expression given above will overflow,
     so it should not be used to calculate the value of the constant.

     The variable `integer_zero_node' is an integer constant with value
     zero.  Similarly, `integer_one_node' is an integer constant with
     value one.  The `size_zero_node' and `size_one_node' variables are
     analogous, but have type `size_t' rather than `int'.

     The function `tree_int_cst_lt' is a predicate which holds if its
     first argument is less than its second.  Both constants are
     assumed to have the same signedness (i.e., either both should be
     signed or both should be unsigned.)  The full width of the
     constant is used when doing the comparison; the usual rules about
     promotions and conversions are ignored.  Similarly,
     `tree_int_cst_equal' holds if the two constants are equal.  The
     `tree_int_cst_sgn' function returns the sign of a constant.  The
     value is `1', `0', or `-1' according on whether the constant is
     greater than, equal to, or less than zero.  Again, the signedness
     of the constant's type is taken into account; an unsigned constant
     is never less than zero, no matter what its bit-pattern.

`REAL_CST'
     FIXME: Talk about how to obtain representations of this constant,
     do comparisons, and so forth.

`FIXED_CST'
     These nodes represent fixed-point constants.  The type of these
     constants is obtained with `TREE_TYPE'.  `TREE_FIXED_CST_PTR'
     points to a `struct fixed_value';  `TREE_FIXED_CST' returns the
     structure itself.  `struct fixed_value' contains `data' with the
     size of two `HOST_BITS_PER_WIDE_INT' and `mode' as the associated
     fixed-point machine mode for `data'.

`COMPLEX_CST'
     These nodes are used to represent complex number constants, that
     is a `__complex__' whose parts are constant nodes.  The
     `TREE_REALPART' and `TREE_IMAGPART' return the real and the
     imaginary parts respectively.

`VECTOR_CST'
     These nodes are used to represent vector constants, whose parts are
     constant nodes.  Each individual constant node is either an
     integer or a double constant node.  The first operand is a
     `TREE_LIST' of the constant nodes and is accessed through
     `TREE_VECTOR_CST_ELTS'.

`STRING_CST'
     These nodes represent string-constants.  The `TREE_STRING_LENGTH'
     returns the length of the string, as an `int'.  The
     `TREE_STRING_POINTER' is a `char*' containing the string itself.
     The string may not be `NUL'-terminated, and it may contain
     embedded `NUL' characters.  Therefore, the `TREE_STRING_LENGTH'
     includes the trailing `NUL' if it is present.

     For wide string constants, the `TREE_STRING_LENGTH' is the number
     of bytes in the string, and the `TREE_STRING_POINTER' points to an
     array of the bytes of the string, as represented on the target
     system (that is, as integers in the target endianness).  Wide and
     non-wide string constants are distinguished only by the `TREE_TYPE'
     of the `STRING_CST'.

     FIXME: The formats of string constants are not well-defined when
     the target system bytes are not the same width as host system
     bytes.



File: gccint.info,  Node: Storage References,  Next: Unary and Binary Expressions,  Prev: Constant expressions,  Up: Expression trees

11.6.2 References to storage
----------------------------

`ARRAY_REF'
     These nodes represent array accesses.  The first operand is the
     array; the second is the index.  To calculate the address of the
     memory accessed, you must scale the index by the size of the type
     of the array elements.  The type of these expressions must be the
     type of a component of the array.  The third and fourth operands
     are used after gimplification to represent the lower bound and
     component size but should not be used directly; call
     `array_ref_low_bound' and `array_ref_element_size' instead.

`ARRAY_RANGE_REF'
     These nodes represent access to a range (or "slice") of an array.
     The operands are the same as that for `ARRAY_REF' and have the same
     meanings.  The type of these expressions must be an array whose
     component type is the same as that of the first operand.  The
     range of that array type determines the amount of data these
     expressions access.

`TARGET_MEM_REF'
     These nodes represent memory accesses whose address directly map to
     an addressing mode of the target architecture.  The first argument
     is `TMR_SYMBOL' and must be a `VAR_DECL' of an object with a fixed
     address.  The second argument is `TMR_BASE' and the third one is
     `TMR_INDEX'.  The fourth argument is `TMR_STEP' and must be an
     `INTEGER_CST'.  The fifth argument is `TMR_OFFSET' and must be an
     `INTEGER_CST'.  Any of the arguments may be NULL if the
     appropriate component does not appear in the address.  Address of
     the `TARGET_MEM_REF' is determined in the following way.

          &TMR_SYMBOL + TMR_BASE + TMR_INDEX * TMR_STEP + TMR_OFFSET

     The sixth argument is the reference to the original memory access,
     which is preserved for the purposes of the RTL alias analysis.
     The seventh argument is a tag representing the results of tree
     level alias analysis.

`ADDR_EXPR'
     These nodes are used to represent the address of an object.  (These
     expressions will always have pointer or reference type.)  The
     operand may be another expression, or it may be a declaration.

     As an extension, GCC allows users to take the address of a label.
     In this case, the operand of the `ADDR_EXPR' will be a
     `LABEL_DECL'.  The type of such an expression is `void*'.

     If the object addressed is not an lvalue, a temporary is created,
     and the address of the temporary is used.

`INDIRECT_REF'
     These nodes are used to represent the object pointed to by a
     pointer.  The operand is the pointer being dereferenced; it will
     always have pointer or reference type.

`MEM_REF'
     These nodes are used to represent the object pointed to by a
     pointer offset by a constant.  The first operand is the pointer
     being dereferenced; it will always have pointer or reference type.
     The second operand is a pointer constant.  Its type is specifying
     the type to be used for type-based alias analysis.

`COMPONENT_REF'
     These nodes represent non-static data member accesses.  The first
     operand is the object (rather than a pointer to it); the second
     operand is the `FIELD_DECL' for the data member.  The third
     operand represents the byte offset of the field, but should not be
     used directly; call `component_ref_field_offset' instead.



File: gccint.info,  Node: Unary and Binary Expressions,  Next: Vectors,  Prev: Storage References,  Up: Expression trees

11.6.3 Unary and Binary Expressions
-----------------------------------

`NEGATE_EXPR'
     These nodes represent unary negation of the single operand, for
     both integer and floating-point types.  The type of negation can be
     determined by looking at the type of the expression.

     The behavior of this operation on signed arithmetic overflow is
     controlled by the `flag_wrapv' and `flag_trapv' variables.

`ABS_EXPR'
     These nodes represent the absolute value of the single operand, for
     both integer and floating-point types.  This is typically used to
     implement the `abs', `labs' and `llabs' builtins for integer
     types, and the `fabs', `fabsf' and `fabsl' builtins for floating
     point types.  The type of abs operation can be determined by
     looking at the type of the expression.

     This node is not used for complex types.  To represent the modulus
     or complex abs of a complex value, use the `BUILT_IN_CABS',
     `BUILT_IN_CABSF' or `BUILT_IN_CABSL' builtins, as used to
     implement the C99 `cabs', `cabsf' and `cabsl' built-in functions.

`BIT_NOT_EXPR'
     These nodes represent bitwise complement, and will always have
     integral type.  The only operand is the value to be complemented.

`TRUTH_NOT_EXPR'
     These nodes represent logical negation, and will always have
     integral (or boolean) type.  The operand is the value being
     negated.  The type of the operand and that of the result are
     always of `BOOLEAN_TYPE' or `INTEGER_TYPE'.

`PREDECREMENT_EXPR'
`PREINCREMENT_EXPR'
`POSTDECREMENT_EXPR'
`POSTINCREMENT_EXPR'
     These nodes represent increment and decrement expressions.  The
     value of the single operand is computed, and the operand
     incremented or decremented.  In the case of `PREDECREMENT_EXPR' and
     `PREINCREMENT_EXPR', the value of the expression is the value
     resulting after the increment or decrement; in the case of
     `POSTDECREMENT_EXPR' and `POSTINCREMENT_EXPR' is the value before
     the increment or decrement occurs.  The type of the operand, like
     that of the result, will be either integral, boolean, or
     floating-point.

`FIX_TRUNC_EXPR'
     These nodes represent conversion of a floating-point value to an
     integer.  The single operand will have a floating-point type, while
     the complete expression will have an integral (or boolean) type.
     The operand is rounded towards zero.

`FLOAT_EXPR'
     These nodes represent conversion of an integral (or boolean) value
     to a floating-point value.  The single operand will have integral
     type, while the complete expression will have a floating-point
     type.

     FIXME: How is the operand supposed to be rounded?  Is this
     dependent on `-mieee'?

`COMPLEX_EXPR'
     These nodes are used to represent complex numbers constructed from
     two expressions of the same (integer or real) type.  The first
     operand is the real part and the second operand is the imaginary
     part.

`CONJ_EXPR'
     These nodes represent the conjugate of their operand.

`REALPART_EXPR'
`IMAGPART_EXPR'
     These nodes represent respectively the real and the imaginary parts
     of complex numbers (their sole argument).

`NON_LVALUE_EXPR'
     These nodes indicate that their one and only operand is not an
     lvalue.  A back end can treat these identically to the single
     operand.

`NOP_EXPR'
     These nodes are used to represent conversions that do not require
     any code-generation.  For example, conversion of a `char*' to an
     `int*' does not require any code be generated; such a conversion is
     represented by a `NOP_EXPR'.  The single operand is the expression
     to be converted.  The conversion from a pointer to a reference is
     also represented with a `NOP_EXPR'.

`CONVERT_EXPR'
     These nodes are similar to `NOP_EXPR's, but are used in those
     situations where code may need to be generated.  For example, if an
     `int*' is converted to an `int' code may need to be generated on
     some platforms.  These nodes are never used for C++-specific
     conversions, like conversions between pointers to different
     classes in an inheritance hierarchy.  Any adjustments that need to
     be made in such cases are always indicated explicitly.  Similarly,
     a user-defined conversion is never represented by a
     `CONVERT_EXPR'; instead, the function calls are made explicit.

`FIXED_CONVERT_EXPR'
     These nodes are used to represent conversions that involve
     fixed-point values.  For example, from a fixed-point value to
     another fixed-point value, from an integer to a fixed-point value,
     from a fixed-point value to an integer, from a floating-point
     value to a fixed-point value, or from a fixed-point value to a
     floating-point value.

`LSHIFT_EXPR'
`RSHIFT_EXPR'
     These nodes represent left and right shifts, respectively.  The
     first operand is the value to shift; it will always be of integral
     type.  The second operand is an expression for the number of bits
     by which to shift.  Right shift should be treated as arithmetic,
     i.e., the high-order bits should be zero-filled when the
     expression has unsigned type and filled with the sign bit when the
     expression has signed type.  Note that the result is undefined if
     the second operand is larger than or equal to the first operand's
     type size. Unlike most nodes, these can have a vector as first
     operand and a scalar as second operand.

`BIT_IOR_EXPR'
`BIT_XOR_EXPR'
`BIT_AND_EXPR'
     These nodes represent bitwise inclusive or, bitwise exclusive or,
     and bitwise and, respectively.  Both operands will always have
     integral type.

`TRUTH_ANDIF_EXPR'
`TRUTH_ORIF_EXPR'
     These nodes represent logical "and" and logical "or", respectively.
     These operators are not strict; i.e., the second operand is
     evaluated only if the value of the expression is not determined by
     evaluation of the first operand.  The type of the operands and
     that of the result are always of `BOOLEAN_TYPE' or `INTEGER_TYPE'.

`TRUTH_AND_EXPR'
`TRUTH_OR_EXPR'
`TRUTH_XOR_EXPR'
     These nodes represent logical and, logical or, and logical
     exclusive or.  They are strict; both arguments are always
     evaluated.  There are no corresponding operators in C or C++, but
     the front end will sometimes generate these expressions anyhow, if
     it can tell that strictness does not matter.  The type of the
     operands and that of the result are always of `BOOLEAN_TYPE' or
     `INTEGER_TYPE'.

`POINTER_PLUS_EXPR'
     This node represents pointer arithmetic.  The first operand is
     always a pointer/reference type.  The second operand is always an
     unsigned integer type compatible with sizetype.  This is the only
     binary arithmetic operand that can operate on pointer types.

`PLUS_EXPR'
`MINUS_EXPR'
`MULT_EXPR'
     These nodes represent various binary arithmetic operations.
     Respectively, these operations are addition, subtraction (of the
     second operand from the first) and multiplication.  Their operands
     may have either integral or floating type, but there will never be
     case in which one operand is of floating type and the other is of
     integral type.

     The behavior of these operations on signed arithmetic overflow is
     controlled by the `flag_wrapv' and `flag_trapv' variables.

`MULT_HIGHPART_EXPR'
     This node represents the "high-part" of a widening multiplication.
     For an integral type with B bits of precision, the result is the
     most significant B bits of the full 2B product.

`RDIV_EXPR'
     This node represents a floating point division operation.

`TRUNC_DIV_EXPR'
`FLOOR_DIV_EXPR'
`CEIL_DIV_EXPR'
`ROUND_DIV_EXPR'
     These nodes represent integer division operations that return an
     integer result.  `TRUNC_DIV_EXPR' rounds towards zero,
     `FLOOR_DIV_EXPR' rounds towards negative infinity, `CEIL_DIV_EXPR'
     rounds towards positive infinity and `ROUND_DIV_EXPR' rounds to
     the closest integer.  Integer division in C and C++ is truncating,
     i.e. `TRUNC_DIV_EXPR'.

     The behavior of these operations on signed arithmetic overflow,
     when dividing the minimum signed integer by minus one, is
     controlled by the `flag_wrapv' and `flag_trapv' variables.

`TRUNC_MOD_EXPR'
`FLOOR_MOD_EXPR'
`CEIL_MOD_EXPR'
`ROUND_MOD_EXPR'
     These nodes represent the integer remainder or modulus operation.
     The integer modulus of two operands `a' and `b' is defined as `a -
     (a/b)*b' where the division calculated using the corresponding
     division operator.  Hence for `TRUNC_MOD_EXPR' this definition
     assumes division using truncation towards zero, i.e.
     `TRUNC_DIV_EXPR'.  Integer remainder in C and C++ uses truncating
     division, i.e. `TRUNC_MOD_EXPR'.

`EXACT_DIV_EXPR'
     The `EXACT_DIV_EXPR' code is used to represent integer divisions
     where the numerator is known to be an exact multiple of the
     denominator.  This allows the backend to choose between the faster
     of `TRUNC_DIV_EXPR', `CEIL_DIV_EXPR' and `FLOOR_DIV_EXPR' for the
     current target.

`LT_EXPR'
`LE_EXPR'
`GT_EXPR'
`GE_EXPR'
`EQ_EXPR'
`NE_EXPR'
     These nodes represent the less than, less than or equal to, greater
     than, greater than or equal to, equal, and not equal comparison
     operators.  The first and second operands will either be both of
     integral type, both of floating type or both of vector type.  The
     result type of these expressions will always be of integral,
     boolean or signed integral vector type.  These operations return
     the result type's zero value for false, the result type's one
     value for true, and a vector whose elements are zero (false) or
     minus one (true) for vectors.

     For floating point comparisons, if we honor IEEE NaNs and either
     operand is NaN, then `NE_EXPR' always returns true and the
     remaining operators always return false.  On some targets,
     comparisons against an IEEE NaN, other than equality and
     inequality, may generate a floating point exception.

`ORDERED_EXPR'
`UNORDERED_EXPR'
     These nodes represent non-trapping ordered and unordered comparison
     operators.  These operations take two floating point operands and
     determine whether they are ordered or unordered relative to each
     other.  If either operand is an IEEE NaN, their comparison is
     defined to be unordered, otherwise the comparison is defined to be
     ordered.  The result type of these expressions will always be of
     integral or boolean type.  These operations return the result
     type's zero value for false, and the result type's one value for
     true.

`UNLT_EXPR'
`UNLE_EXPR'
`UNGT_EXPR'
`UNGE_EXPR'
`UNEQ_EXPR'
`LTGT_EXPR'
     These nodes represent the unordered comparison operators.  These
     operations take two floating point operands and determine whether
     the operands are unordered or are less than, less than or equal to,
     greater than, greater than or equal to, or equal respectively.  For
     example, `UNLT_EXPR' returns true if either operand is an IEEE NaN
     or the first operand is less than the second.  With the possible
     exception of `LTGT_EXPR', all of these operations are guaranteed
     not to generate a floating point exception.  The result type of
     these expressions will always be of integral or boolean type.
     These operations return the result type's zero value for false,
     and the result type's one value for true.

`MODIFY_EXPR'
     These nodes represent assignment.  The left-hand side is the first
     operand; the right-hand side is the second operand.  The left-hand
     side will be a `VAR_DECL', `INDIRECT_REF', `COMPONENT_REF', or
     other lvalue.

     These nodes are used to represent not only assignment with `=' but
     also compound assignments (like `+='), by reduction to `='
     assignment.  In other words, the representation for `i += 3' looks
     just like that for `i = i + 3'.

`INIT_EXPR'
     These nodes are just like `MODIFY_EXPR', but are used only when a
     variable is initialized, rather than assigned to subsequently.
     This means that we can assume that the target of the
     initialization is not used in computing its own value; any
     reference to the lhs in computing the rhs is undefined.

`COMPOUND_EXPR'
     These nodes represent comma-expressions.  The first operand is an
     expression whose value is computed and thrown away prior to the
     evaluation of the second operand.  The value of the entire
     expression is the value of the second operand.

`COND_EXPR'
     These nodes represent `?:' expressions.  The first operand is of
     boolean or integral type.  If it evaluates to a nonzero value, the
     second operand should be evaluated, and returned as the value of
     the expression.  Otherwise, the third operand is evaluated, and
     returned as the value of the expression.

     The second operand must have the same type as the entire
     expression, unless it unconditionally throws an exception or calls
     a noreturn function, in which case it should have void type.  The
     same constraints apply to the third operand.  This allows array
     bounds checks to be represented conveniently as `(i >= 0 && i <
     10) ? i : abort()'.

     As a GNU extension, the C language front-ends allow the second
     operand of the `?:' operator may be omitted in the source.  For
     example, `x ? : 3' is equivalent to `x ? x : 3', assuming that `x'
     is an expression without side-effects.  In the tree
     representation, however, the second operand is always present,
     possibly protected by `SAVE_EXPR' if the first argument does cause
     side-effects.

`CALL_EXPR'
     These nodes are used to represent calls to functions, including
     non-static member functions.  `CALL_EXPR's are implemented as
     expression nodes with a variable number of operands.  Rather than
     using `TREE_OPERAND' to extract them, it is preferable to use the
     specialized accessor macros and functions that operate
     specifically on `CALL_EXPR' nodes.

     `CALL_EXPR_FN' returns a pointer to the function to call; it is
     always an expression whose type is a `POINTER_TYPE'.

     The number of arguments to the call is returned by
     `call_expr_nargs', while the arguments themselves can be accessed
     with the `CALL_EXPR_ARG' macro.  The arguments are zero-indexed
     and numbered left-to-right.  You can iterate over the arguments
     using `FOR_EACH_CALL_EXPR_ARG', as in:

          tree call, arg;
          call_expr_arg_iterator iter;
          FOR_EACH_CALL_EXPR_ARG (arg, iter, call)
            /* arg is bound to successive arguments of call.  */
            ...;

     For non-static member functions, there will be an operand
     corresponding to the `this' pointer.  There will always be
     expressions corresponding to all of the arguments, even if the
     function is declared with default arguments and some arguments are
     not explicitly provided at the call sites.

     `CALL_EXPR's also have a `CALL_EXPR_STATIC_CHAIN' operand that is
     used to implement nested functions.  This operand is otherwise
     null.

`CLEANUP_POINT_EXPR'
     These nodes represent full-expressions.  The single operand is an
     expression to evaluate.  Any destructor calls engendered by the
     creation of temporaries during the evaluation of that expression
     should be performed immediately after the expression is evaluated.

`CONSTRUCTOR'
     These nodes represent the brace-enclosed initializers for a
     structure or array.  The first operand is reserved for use by the
     back end.  The second operand is a `TREE_LIST'.  If the
     `TREE_TYPE' of the `CONSTRUCTOR' is a `RECORD_TYPE' or
     `UNION_TYPE', then the `TREE_PURPOSE' of each node in the
     `TREE_LIST' will be a `FIELD_DECL' and the `TREE_VALUE' of each
     node will be the expression used to initialize that field.

     If the `TREE_TYPE' of the `CONSTRUCTOR' is an `ARRAY_TYPE', then
     the `TREE_PURPOSE' of each element in the `TREE_LIST' will be an
     `INTEGER_CST' or a `RANGE_EXPR' of two `INTEGER_CST's.  A single
     `INTEGER_CST' indicates which element of the array (indexed from
     zero) is being assigned to.  A `RANGE_EXPR' indicates an inclusive
     range of elements to initialize.  In both cases the `TREE_VALUE'
     is the corresponding initializer.  It is re-evaluated for each
     element of a `RANGE_EXPR'.  If the `TREE_PURPOSE' is `NULL_TREE',
     then the initializer is for the next available array element.

     In the front end, you should not depend on the fields appearing in
     any particular order.  However, in the middle end, fields must
     appear in declaration order.  You should not assume that all
     fields will be represented.  Unrepresented fields will be set to
     zero.

`COMPOUND_LITERAL_EXPR'
     These nodes represent ISO C99 compound literals.  The
     `COMPOUND_LITERAL_EXPR_DECL_EXPR' is a `DECL_EXPR' containing an
     anonymous `VAR_DECL' for the unnamed object represented by the
     compound literal; the `DECL_INITIAL' of that `VAR_DECL' is a
     `CONSTRUCTOR' representing the brace-enclosed list of initializers
     in the compound literal.  That anonymous `VAR_DECL' can also be
     accessed directly by the `COMPOUND_LITERAL_EXPR_DECL' macro.

`SAVE_EXPR'
     A `SAVE_EXPR' represents an expression (possibly involving
     side-effects) that is used more than once.  The side-effects should
     occur only the first time the expression is evaluated.  Subsequent
     uses should just reuse the computed value.  The first operand to
     the `SAVE_EXPR' is the expression to evaluate.  The side-effects
     should be executed where the `SAVE_EXPR' is first encountered in a
     depth-first preorder traversal of the expression tree.

`TARGET_EXPR'
     A `TARGET_EXPR' represents a temporary object.  The first operand
     is a `VAR_DECL' for the temporary variable.  The second operand is
     the initializer for the temporary.  The initializer is evaluated
     and, if non-void, copied (bitwise) into the temporary.  If the
     initializer is void, that means that it will perform the
     initialization itself.

     Often, a `TARGET_EXPR' occurs on the right-hand side of an
     assignment, or as the second operand to a comma-expression which is
     itself the right-hand side of an assignment, etc.  In this case,
     we say that the `TARGET_EXPR' is "normal"; otherwise, we say it is
     "orphaned".  For a normal `TARGET_EXPR' the temporary variable
     should be treated as an alias for the left-hand side of the
     assignment, rather than as a new temporary variable.

     The third operand to the `TARGET_EXPR', if present, is a
     cleanup-expression (i.e., destructor call) for the temporary.  If
     this expression is orphaned, then this expression must be executed
     when the statement containing this expression is complete.  These
     cleanups must always be executed in the order opposite to that in
     which they were encountered.  Note that if a temporary is created
     on one branch of a conditional operator (i.e., in the second or
     third operand to a `COND_EXPR'), the cleanup must be run only if
     that branch is actually executed.

`VA_ARG_EXPR'
     This node is used to implement support for the C/C++ variable
     argument-list mechanism.  It represents expressions like `va_arg
     (ap, type)'.  Its `TREE_TYPE' yields the tree representation for
     `type' and its sole argument yields the representation for `ap'.



File: gccint.info,  Node: Vectors,  Prev: Unary and Binary Expressions,  Up: Expression trees

11.6.4 Vectors
--------------

`VEC_LSHIFT_EXPR'
`VEC_RSHIFT_EXPR'
     These nodes represent whole vector left and right shifts,
     respectively.  The first operand is the vector to shift; it will
     always be of vector type.  The second operand is an expression for
     the number of bits by which to shift.  Note that the result is
     undefined if the second operand is larger than or equal to the
     first operand's type size.

`VEC_WIDEN_MULT_HI_EXPR'
`VEC_WIDEN_MULT_LO_EXPR'
     These nodes represent widening vector multiplication of the high
     and low parts of the two input vectors, respectively.  Their
     operands are vectors that contain the same number of elements
     (`N') of the same integral type.  The result is a vector that
     contains half as many elements, of an integral type whose size is
     twice as wide.  In the case of `VEC_WIDEN_MULT_HI_EXPR' the high
     `N/2' elements of the two vector are multiplied to produce the
     vector of `N/2' products. In the case of `VEC_WIDEN_MULT_LO_EXPR'
     the low `N/2' elements of the two vector are multiplied to produce
     the vector of `N/2' products.

`VEC_UNPACK_HI_EXPR'
`VEC_UNPACK_LO_EXPR'
     These nodes represent unpacking of the high and low parts of the
     input vector, respectively.  The single operand is a vector that
     contains `N' elements of the same integral or floating point type.
     The result is a vector that contains half as many elements, of an
     integral or floating point type whose size is twice as wide.  In
     the case of `VEC_UNPACK_HI_EXPR' the high `N/2' elements of the
     vector are extracted and widened (promoted).  In the case of
     `VEC_UNPACK_LO_EXPR' the low `N/2' elements of the vector are
     extracted and widened (promoted).

`VEC_UNPACK_FLOAT_HI_EXPR'
`VEC_UNPACK_FLOAT_LO_EXPR'
     These nodes represent unpacking of the high and low parts of the
     input vector, where the values are converted from fixed point to
     floating point.  The single operand is a vector that contains `N'
     elements of the same integral type.  The result is a vector that
     contains half as many elements of a floating point type whose size
     is twice as wide.  In the case of `VEC_UNPACK_HI_EXPR' the high
     `N/2' elements of the vector are extracted, converted and widened.
     In the case of `VEC_UNPACK_LO_EXPR' the low `N/2' elements of the
     vector are extracted, converted and widened.

`VEC_PACK_TRUNC_EXPR'
     This node represents packing of truncated elements of the two
     input vectors into the output vector.  Input operands are vectors
     that contain the same number of elements of the same integral or
     floating point type.  The result is a vector that contains twice
     as many elements of an integral or floating point type whose size
     is half as wide. The elements of the two vectors are demoted and
     merged (concatenated) to form the output vector.

`VEC_PACK_SAT_EXPR'
     This node represents packing of elements of the two input vectors
     into the output vector using saturation.  Input operands are
     vectors that contain the same number of elements of the same
     integral type.  The result is a vector that contains twice as many
     elements of an integral type whose size is half as wide.  The
     elements of the two vectors are demoted and merged (concatenated)
     to form the output vector.

`VEC_PACK_FIX_TRUNC_EXPR'
     This node represents packing of elements of the two input vectors
     into the output vector, where the values are converted from
     floating point to fixed point.  Input operands are vectors that
     contain the same number of elements of a floating point type.  The
     result is a vector that contains twice as many elements of an
     integral type whose size is half as wide.  The elements of the two
     vectors are merged (concatenated) to form the output vector.

`VEC_COND_EXPR'
     These nodes represent `?:' expressions.  The three operands must be
     vectors of the same size and number of elements.  The second and
     third operands must have the same type as the entire expression.
     The first operand is of signed integral vector type.  If an
     element of the first operand evaluates to a zero value, the
     corresponding element of the result is taken from the third
     operand. If it evaluates to a minus one value, it is taken from
     the second operand. It should never evaluate to any other value
     currently, but optimizations should not rely on that property. In
     contrast with a `COND_EXPR', all operands are always evaluated.


File: gccint.info,  Node: Statements,  Next: Functions,  Prev: Expression trees,  Up: GENERIC

11.7 Statements
===============

Most statements in GIMPLE are assignment statements, represented by
`GIMPLE_ASSIGN'.  No other C expressions can appear at statement level;
a reference to a volatile object is converted into a `GIMPLE_ASSIGN'.

 There are also several varieties of complex statements.

* Menu:

* Basic Statements::
* Blocks::
* Statement Sequences::
* Empty Statements::
* Jumps::
* Cleanups::
* OpenMP::


File: gccint.info,  Node: Basic Statements,  Next: Blocks,  Up: Statements

11.7.1 Basic Statements
-----------------------

`ASM_EXPR'
     Used to represent an inline assembly statement.  For an inline
     assembly statement like:
          asm ("mov x, y");
     The `ASM_STRING' macro will return a `STRING_CST' node for `"mov
     x, y"'.  If the original statement made use of the
     extended-assembly syntax, then `ASM_OUTPUTS', `ASM_INPUTS', and
     `ASM_CLOBBERS' will be the outputs, inputs, and clobbers for the
     statement, represented as `STRING_CST' nodes.  The
     extended-assembly syntax looks like:
          asm ("fsinx %1,%0" : "=f" (result) : "f" (angle));
     The first string is the `ASM_STRING', containing the instruction
     template.  The next two strings are the output and inputs,
     respectively; this statement has no clobbers.  As this example
     indicates, "plain" assembly statements are merely a special case
     of extended assembly statements; they have no cv-qualifiers,
     outputs, inputs, or clobbers.  All of the strings will be
     `NUL'-terminated, and will contain no embedded `NUL'-characters.

     If the assembly statement is declared `volatile', or if the
     statement was not an extended assembly statement, and is therefore
     implicitly volatile, then the predicate `ASM_VOLATILE_P' will hold
     of the `ASM_EXPR'.

`DECL_EXPR'
     Used to represent a local declaration.  The `DECL_EXPR_DECL' macro
     can be used to obtain the entity declared.  This declaration may
     be a `LABEL_DECL', indicating that the label declared is a local
     label.  (As an extension, GCC allows the declaration of labels
     with scope.)  In C, this declaration may be a `FUNCTION_DECL',
     indicating the use of the GCC nested function extension.  For more
     information, *note Functions::.

`LABEL_EXPR'
     Used to represent a label.  The `LABEL_DECL' declared by this
     statement can be obtained with the `LABEL_EXPR_LABEL' macro.  The
     `IDENTIFIER_NODE' giving the name of the label can be obtained from
     the `LABEL_DECL' with `DECL_NAME'.

`GOTO_EXPR'
     Used to represent a `goto' statement.  The `GOTO_DESTINATION' will
     usually be a `LABEL_DECL'.  However, if the "computed goto"
     extension has been used, the `GOTO_DESTINATION' will be an
     arbitrary expression indicating the destination.  This expression
     will always have pointer type.

`RETURN_EXPR'
     Used to represent a `return' statement.  Operand 0 represents the
     value to return.  It should either be the `RESULT_DECL' for the
     containing function, or a `MODIFY_EXPR' or `INIT_EXPR' setting the
     function's `RESULT_DECL'.  It will be `NULL_TREE' if the statement
     was just
          return;

`LOOP_EXPR'
     These nodes represent "infinite" loops.  The `LOOP_EXPR_BODY'
     represents the body of the loop.  It should be executed forever,
     unless an `EXIT_EXPR' is encountered.

`EXIT_EXPR'
     These nodes represent conditional exits from the nearest enclosing
     `LOOP_EXPR'.  The single operand is the condition; if it is
     nonzero, then the loop should be exited.  An `EXIT_EXPR' will only
     appear within a `LOOP_EXPR'.

`SWITCH_STMT'
     Used to represent a `switch' statement.  The `SWITCH_STMT_COND' is
     the expression on which the switch is occurring.  See the
     documentation for an `IF_STMT' for more information on the
     representation used for the condition.  The `SWITCH_STMT_BODY' is
     the body of the switch statement.   The `SWITCH_STMT_TYPE' is the
     original type of switch expression as given in the source, before
     any compiler conversions.

`CASE_LABEL_EXPR'
     Use to represent a `case' label, range of `case' labels, or a
     `default' label.  If `CASE_LOW' is `NULL_TREE', then this is a
     `default' label.  Otherwise, if `CASE_HIGH' is `NULL_TREE', then
     this is an ordinary `case' label.  In this case, `CASE_LOW' is an
     expression giving the value of the label.  Both `CASE_LOW' and
     `CASE_HIGH' are `INTEGER_CST' nodes.  These values will have the
     same type as the condition expression in the switch statement.

     Otherwise, if both `CASE_LOW' and `CASE_HIGH' are defined, the
     statement is a range of case labels.  Such statements originate
     with the extension that allows users to write things of the form:
          case 2 ... 5:
     The first value will be `CASE_LOW', while the second will be
     `CASE_HIGH'.



File: gccint.info,  Node: Blocks,  Next: Statement Sequences,  Prev: Basic Statements,  Up: Statements

11.7.2 Blocks
-------------

Block scopes and the variables they declare in GENERIC are expressed
using the `BIND_EXPR' code, which in previous versions of GCC was
primarily used for the C statement-expression extension.

 Variables in a block are collected into `BIND_EXPR_VARS' in
declaration order through their `TREE_CHAIN' field.  Any runtime
initialization is moved out of `DECL_INITIAL' and into a statement in
the controlled block.  When gimplifying from C or C++, this
initialization replaces the `DECL_STMT'.  These variables will never
require cleanups.  The scope of these variables is just the body

 Variable-length arrays (VLAs) complicate this process, as their size
often refers to variables initialized earlier in the block.  To handle
this, we currently split the block at that point, and move the VLA into
a new, inner `BIND_EXPR'.  This strategy may change in the future.

 A C++ program will usually contain more `BIND_EXPR's than there are
syntactic blocks in the source code, since several C++ constructs have
implicit scopes associated with them.  On the other hand, although the
C++ front end uses pseudo-scopes to handle cleanups for objects with
destructors, these don't translate into the GIMPLE form; multiple
declarations at the same level use the same `BIND_EXPR'.


File: gccint.info,  Node: Statement Sequences,  Next: Empty Statements,  Prev: Blocks,  Up: Statements

11.7.3 Statement Sequences
--------------------------

Multiple statements at the same nesting level are collected into a
`STATEMENT_LIST'.  Statement lists are modified and traversed using the
interface in `tree-iterator.h'.


File: gccint.info,  Node: Empty Statements,  Next: Jumps,  Prev: Statement Sequences,  Up: Statements

11.7.4 Empty Statements
-----------------------

Whenever possible, statements with no effect are discarded.  But if
they are nested within another construct which cannot be discarded for
some reason, they are instead replaced with an empty statement,
generated by `build_empty_stmt'.  Initially, all empty statements were
shared, after the pattern of the Java front end, but this caused a lot
of trouble in practice.

 An empty statement is represented as `(void)0'.


File: gccint.info,  Node: Jumps,  Next: Cleanups,  Prev: Empty Statements,  Up: Statements

11.7.5 Jumps
------------

Other jumps are expressed by either `GOTO_EXPR' or `RETURN_EXPR'.

 The operand of a `GOTO_EXPR' must be either a label or a variable
containing the address to jump to.

 The operand of a `RETURN_EXPR' is either `NULL_TREE', `RESULT_DECL',
or a `MODIFY_EXPR' which sets the return value.  It would be nice to
move the `MODIFY_EXPR' into a separate statement, but the special
return semantics in `expand_return' make that difficult.  It may still
happen in the future, perhaps by moving most of that logic into
`expand_assignment'.


File: gccint.info,  Node: Cleanups,  Next: OpenMP,  Prev: Jumps,  Up: Statements

11.7.6 Cleanups
---------------

Destructors for local C++ objects and similar dynamic cleanups are
represented in GIMPLE by a `TRY_FINALLY_EXPR'.  `TRY_FINALLY_EXPR' has
two operands, both of which are a sequence of statements to execute.
The first sequence is executed.  When it completes the second sequence
is executed.

 The first sequence may complete in the following ways:

  1. Execute the last statement in the sequence and fall off the end.

  2. Execute a goto statement (`GOTO_EXPR') to an ordinary label
     outside the sequence.

  3. Execute a return statement (`RETURN_EXPR').

  4. Throw an exception.  This is currently not explicitly represented
     in GIMPLE.


 The second sequence is not executed if the first sequence completes by
calling `setjmp' or `exit' or any other function that does not return.
The second sequence is also not executed if the first sequence
completes via a non-local goto or a computed goto (in general the
compiler does not know whether such a goto statement exits the first
sequence or not, so we assume that it doesn't).

 After the second sequence is executed, if it completes normally by
falling off the end, execution continues wherever the first sequence
would have continued, by falling off the end, or doing a goto, etc.

 `TRY_FINALLY_EXPR' complicates the flow graph, since the cleanup needs
to appear on every edge out of the controlled block; this reduces the
freedom to move code across these edges.  Therefore, the EH lowering
pass which runs before most of the optimization passes eliminates these
expressions by explicitly adding the cleanup to each edge.  Rethrowing
the exception is represented using `RESX_EXPR'.


File: gccint.info,  Node: OpenMP,  Prev: Cleanups,  Up: Statements

11.7.7 OpenMP
-------------

All the statements starting with `OMP_' represent directives and
clauses used by the OpenMP API `http://www.openmp.org/'.

`OMP_PARALLEL'
     Represents `#pragma omp parallel [clause1 ... clauseN]'. It has
     four operands:

     Operand `OMP_PARALLEL_BODY' is valid while in GENERIC and High
     GIMPLE forms.  It contains the body of code to be executed by all
     the threads.  During GIMPLE lowering, this operand becomes `NULL'
     and the body is emitted linearly after `OMP_PARALLEL'.

     Operand `OMP_PARALLEL_CLAUSES' is the list of clauses associated
     with the directive.

     Operand `OMP_PARALLEL_FN' is created by `pass_lower_omp', it
     contains the `FUNCTION_DECL' for the function that will contain
     the body of the parallel region.

     Operand `OMP_PARALLEL_DATA_ARG' is also created by
     `pass_lower_omp'. If there are shared variables to be communicated
     to the children threads, this operand will contain the `VAR_DECL'
     that contains all the shared values and variables.

`OMP_FOR'
     Represents `#pragma omp for [clause1 ... clauseN]'.  It has 5
     operands:

     Operand `OMP_FOR_BODY' contains the loop body.

     Operand `OMP_FOR_CLAUSES' is the list of clauses associated with
     the directive.

     Operand `OMP_FOR_INIT' is the loop initialization code of the form
     `VAR = N1'.

     Operand `OMP_FOR_COND' is the loop conditional expression of the
     form `VAR {<,>,<=,>=} N2'.

     Operand `OMP_FOR_INCR' is the loop index increment of the form
     `VAR {+=,-=} INCR'.

     Operand `OMP_FOR_PRE_BODY' contains side-effect code from operands
     `OMP_FOR_INIT', `OMP_FOR_COND' and `OMP_FOR_INC'.  These
     side-effects are part of the `OMP_FOR' block but must be evaluated
     before the start of loop body.

     The loop index variable `VAR' must be a signed integer variable,
     which is implicitly private to each thread.  Bounds `N1' and `N2'
     and the increment expression `INCR' are required to be loop
     invariant integer expressions that are evaluated without any
     synchronization. The evaluation order, frequency of evaluation and
     side-effects are unspecified by the standard.

`OMP_SECTIONS'
     Represents `#pragma omp sections [clause1 ... clauseN]'.

     Operand `OMP_SECTIONS_BODY' contains the sections body, which in
     turn contains a set of `OMP_SECTION' nodes for each of the
     concurrent sections delimited by `#pragma omp section'.

     Operand `OMP_SECTIONS_CLAUSES' is the list of clauses associated
     with the directive.

`OMP_SECTION'
     Section delimiter for `OMP_SECTIONS'.

`OMP_SINGLE'
     Represents `#pragma omp single'.

     Operand `OMP_SINGLE_BODY' contains the body of code to be executed
     by a single thread.

     Operand `OMP_SINGLE_CLAUSES' is the list of clauses associated
     with the directive.

`OMP_MASTER'
     Represents `#pragma omp master'.

     Operand `OMP_MASTER_BODY' contains the body of code to be executed
     by the master thread.

`OMP_ORDERED'
     Represents `#pragma omp ordered'.

     Operand `OMP_ORDERED_BODY' contains the body of code to be
     executed in the sequential order dictated by the loop index
     variable.

`OMP_CRITICAL'
     Represents `#pragma omp critical [name]'.

     Operand `OMP_CRITICAL_BODY' is the critical section.

     Operand `OMP_CRITICAL_NAME' is an optional identifier to label the
     critical section.

`OMP_RETURN'
     This does not represent any OpenMP directive, it is an artificial
     marker to indicate the end of the body of an OpenMP. It is used by
     the flow graph (`tree-cfg.c') and OpenMP region building code
     (`omp-low.c').

`OMP_CONTINUE'
     Similarly, this instruction does not represent an OpenMP
     directive, it is used by `OMP_FOR' and `OMP_SECTIONS' to mark the
     place where the code needs to loop to the next iteration (in the
     case of `OMP_FOR') or the next section (in the case of
     `OMP_SECTIONS').

     In some cases, `OMP_CONTINUE' is placed right before `OMP_RETURN'.
     But if there are cleanups that need to occur right after the
     looping body, it will be emitted between `OMP_CONTINUE' and
     `OMP_RETURN'.

`OMP_ATOMIC'
     Represents `#pragma omp atomic'.

     Operand 0 is the address at which the atomic operation is to be
     performed.

     Operand 1 is the expression to evaluate.  The gimplifier tries
     three alternative code generation strategies.  Whenever possible,
     an atomic update built-in is used.  If that fails, a
     compare-and-swap loop is attempted.  If that also fails, a regular
     critical section around the expression is used.

`OMP_CLAUSE'
     Represents clauses associated with one of the `OMP_' directives.
     Clauses are represented by separate sub-codes defined in `tree.h'.
     Clauses codes can be one of: `OMP_CLAUSE_PRIVATE',
     `OMP_CLAUSE_SHARED', `OMP_CLAUSE_FIRSTPRIVATE',
     `OMP_CLAUSE_LASTPRIVATE', `OMP_CLAUSE_COPYIN',
     `OMP_CLAUSE_COPYPRIVATE', `OMP_CLAUSE_IF',
     `OMP_CLAUSE_NUM_THREADS', `OMP_CLAUSE_SCHEDULE',
     `OMP_CLAUSE_NOWAIT', `OMP_CLAUSE_ORDERED', `OMP_CLAUSE_DEFAULT',
     `OMP_CLAUSE_REDUCTION', `OMP_CLAUSE_COLLAPSE', `OMP_CLAUSE_UNTIED',
     `OMP_CLAUSE_FINAL', and `OMP_CLAUSE_MERGEABLE'.  Each code
     represents the corresponding OpenMP clause.

     Clauses associated with the same directive are chained together
     via `OMP_CLAUSE_CHAIN'. Those clauses that accept a list of
     variables are restricted to exactly one, accessed with
     `OMP_CLAUSE_VAR'.  Therefore, multiple variables under the same
     clause `C' need to be represented as multiple `C' clauses chained
     together.  This facilitates adding new clauses during compilation.



File: gccint.info,  Node: Functions,  Next: Language-dependent trees,  Prev: Statements,  Up: GENERIC

11.8 Functions
==============

A function is represented by a `FUNCTION_DECL' node.  It stores the
basic pieces of the function such as body, parameters, and return type
as well as information on the surrounding context, visibility, and
linkage.

* Menu:

* Function Basics::     Function names, body, and parameters.
* Function Properties:: Context, linkage, etc.


File: gccint.info,  Node: Function Basics,  Next: Function Properties,  Up: Functions

11.8.1 Function Basics
----------------------

A function has four core parts: the name, the parameters, the result,
and the body.  The following macros and functions access these parts of
a `FUNCTION_DECL' as well as other basic features:
`DECL_NAME'
     This macro returns the unqualified name of the function, as an
     `IDENTIFIER_NODE'.  For an instantiation of a function template,
     the `DECL_NAME' is the unqualified name of the template, not
     something like `f<int>'.  The value of `DECL_NAME' is undefined
     when used on a constructor, destructor, overloaded operator, or
     type-conversion operator, or any function that is implicitly
     generated by the compiler.  See below for macros that can be used
     to distinguish these cases.

`DECL_ASSEMBLER_NAME'
     This macro returns the mangled name of the function, also an
     `IDENTIFIER_NODE'.  This name does not contain leading underscores
     on systems that prefix all identifiers with underscores.  The
     mangled name is computed in the same way on all platforms; if
     special processing is required to deal with the object file format
     used on a particular platform, it is the responsibility of the
     back end to perform those modifications.  (Of course, the back end
     should not modify `DECL_ASSEMBLER_NAME' itself.)

     Using `DECL_ASSEMBLER_NAME' will cause additional memory to be
     allocated (for the mangled name of the entity) so it should be used
     only when emitting assembly code.  It should not be used within the
     optimizers to determine whether or not two declarations are the
     same, even though some of the existing optimizers do use it in
     that way.  These uses will be removed over time.

`DECL_ARGUMENTS'
     This macro returns the `PARM_DECL' for the first argument to the
     function.  Subsequent `PARM_DECL' nodes can be obtained by
     following the `TREE_CHAIN' links.

`DECL_RESULT'
     This macro returns the `RESULT_DECL' for the function.

`DECL_SAVED_TREE'
     This macro returns the complete body of the function.

`TREE_TYPE'
     This macro returns the `FUNCTION_TYPE' or `METHOD_TYPE' for the
     function.

`DECL_INITIAL'
     A function that has a definition in the current translation unit
     will have a non-`NULL' `DECL_INITIAL'.  However, back ends should
     not make use of the particular value given by `DECL_INITIAL'.

     It should contain a tree of `BLOCK' nodes that mirrors the scopes
     that variables are bound in the function.  Each block contains a
     list of decls declared in a basic block, a pointer to a chain of
     blocks at the next lower scope level, then a pointer to the next
     block at the same level and a backpointer to the parent `BLOCK' or
     `FUNCTION_DECL'.  So given a function as follows:

          void foo()
          {
            int a;
            {
              int b;
            }
            int c;
          }

     you would get the following:

          tree foo = FUNCTION_DECL;
          tree decl_a = VAR_DECL;
          tree decl_b = VAR_DECL;
          tree decl_c = VAR_DECL;
          tree block_a = BLOCK;
          tree block_b = BLOCK;
          tree block_c = BLOCK;
          BLOCK_VARS(block_a) = decl_a;
          BLOCK_SUBBLOCKS(block_a) = block_b;
          BLOCK_CHAIN(block_a) = block_c;
          BLOCK_SUPERCONTEXT(block_a) = foo;
          BLOCK_VARS(block_b) = decl_b;
          BLOCK_SUPERCONTEXT(block_b) = block_a;
          BLOCK_VARS(block_c) = decl_c;
          BLOCK_SUPERCONTEXT(block_c) = foo;
          DECL_INITIAL(foo) = block_a;



File: gccint.info,  Node: Function Properties,  Prev: Function Basics,  Up: Functions

11.8.2 Function Properties
--------------------------

To determine the scope of a function, you can use the `DECL_CONTEXT'
macro.  This macro will return the class (either a `RECORD_TYPE' or a
`UNION_TYPE') or namespace (a `NAMESPACE_DECL') of which the function
is a member.  For a virtual function, this macro returns the class in
which the function was actually defined, not the base class in which
the virtual declaration occurred.

 In C, the `DECL_CONTEXT' for a function maybe another function.  This
representation indicates that the GNU nested function extension is in
use.  For details on the semantics of nested functions, see the GCC
Manual.  The nested function can refer to local variables in its
containing function.  Such references are not explicitly marked in the
tree structure; back ends must look at the `DECL_CONTEXT' for the
referenced `VAR_DECL'.  If the `DECL_CONTEXT' for the referenced
`VAR_DECL' is not the same as the function currently being processed,
and neither `DECL_EXTERNAL' nor `TREE_STATIC' hold, then the reference
is to a local variable in a containing function, and the back end must
take appropriate action.

`DECL_EXTERNAL'
     This predicate holds if the function is undefined.

`TREE_PUBLIC'
     This predicate holds if the function has external linkage.

`TREE_STATIC'
     This predicate holds if the function has been defined.

`TREE_THIS_VOLATILE'
     This predicate holds if the function does not return normally.

`TREE_READONLY'
     This predicate holds if the function can only read its arguments.

`DECL_PURE_P'
     This predicate holds if the function can only read its arguments,
     but may also read global memory.

`DECL_VIRTUAL_P'
     This predicate holds if the function is virtual.

`DECL_ARTIFICIAL'
     This macro holds if the function was implicitly generated by the
     compiler, rather than explicitly declared.  In addition to
     implicitly generated class member functions, this macro holds for
     the special functions created to implement static initialization
     and destruction, to compute run-time type information, and so
     forth.

`DECL_FUNCTION_SPECIFIC_TARGET'
     This macro returns a tree node that holds the target options that
     are to be used to compile this particular function or `NULL_TREE'
     if the function is to be compiled with the target options
     specified on the command line.

`DECL_FUNCTION_SPECIFIC_OPTIMIZATION'
     This macro returns a tree node that holds the optimization options
     that are to be used to compile this particular function or
     `NULL_TREE' if the function is to be compiled with the
     optimization options specified on the command line.



File: gccint.info,  Node: Language-dependent trees,  Next: C and C++ Trees,  Prev: Functions,  Up: GENERIC

11.9 Language-dependent trees
=============================

Front ends may wish to keep some state associated with various GENERIC
trees while parsing.  To support this, trees provide a set of flags
that may be used by the front end.  They are accessed using
`TREE_LANG_FLAG_n' where `n' is currently 0 through 6.

 If necessary, a front end can use some language-dependent tree codes
in its GENERIC representation, so long as it provides a hook for
converting them to GIMPLE and doesn't expect them to work with any
(hypothetical) optimizers that run before the conversion to GIMPLE. The
intermediate representation used while parsing C and C++ looks very
little like GENERIC, but the C and C++ gimplifier hooks are perfectly
happy to take it as input and spit out GIMPLE.


File: gccint.info,  Node: C and C++ Trees,  Next: Java Trees,  Prev: Language-dependent trees,  Up: GENERIC

11.10 C and C++ Trees
=====================

This section documents the internal representation used by GCC to
represent C and C++ source programs.  When presented with a C or C++
source program, GCC parses the program, performs semantic analysis
(including the generation of error messages), and then produces the
internal representation described here.  This representation contains a
complete representation for the entire translation unit provided as
input to the front end.  This representation is then typically processed
by a code-generator in order to produce machine code, but could also be
used in the creation of source browsers, intelligent editors, automatic
documentation generators, interpreters, and any other programs needing
the ability to process C or C++ code.

 This section explains the internal representation.  In particular, it
documents the internal representation for C and C++ source constructs,
and the macros, functions, and variables that can be used to access
these constructs.  The C++ representation is largely a superset of the
representation used in the C front end.  There is only one construct
used in C that does not appear in the C++ front end and that is the GNU
"nested function" extension.  Many of the macros documented here do not
apply in C because the corresponding language constructs do not appear
in C.

 The C and C++ front ends generate a mix of GENERIC trees and ones
specific to C and C++.  These language-specific trees are higher-level
constructs than the ones in GENERIC to make the parser's job easier.
This section describes those trees that aren't part of GENERIC as well
as aspects of GENERIC trees that are treated in a language-specific
manner.

 If you are developing a "back end", be it is a code-generator or some
other tool, that uses this representation, you may occasionally find
that you need to ask questions not easily answered by the functions and
macros available here.  If that situation occurs, it is quite likely
that GCC already supports the functionality you desire, but that the
interface is simply not documented here.  In that case, you should ask
the GCC maintainers (via mail to <gcc@gcc.gnu.org>) about documenting
the functionality you require.  Similarly, if you find yourself writing
functions that do not deal directly with your back end, but instead
might be useful to other people using the GCC front end, you should
submit your patches for inclusion in GCC.

* Menu:

* Types for C++::               Fundamental and aggregate types.
* Namespaces::                  Namespaces.
* Classes::                     Classes.
* Functions for C++::           Overloading and accessors for C++.
* Statements for C++::          Statements specific to C and C++.
* C++ Expressions::    From `typeid' to `throw'.


File: gccint.info,  Node: Types for C++,  Next: Namespaces,  Up: C and C++ Trees

11.10.1 Types for C++
---------------------

In C++, an array type is not qualified; rather the type of the array
elements is qualified.  This situation is reflected in the intermediate
representation.  The macros described here will always examine the
qualification of the underlying element type when applied to an array
type.  (If the element type is itself an array, then the recursion
continues until a non-array type is found, and the qualification of this
type is examined.)  So, for example, `CP_TYPE_CONST_P' will hold of the
type `const int ()[7]', denoting an array of seven `int's.

 The following functions and macros deal with cv-qualification of types:
`cp_type_quals'
     This function returns the set of type qualifiers applied to this
     type.  This value is `TYPE_UNQUALIFIED' if no qualifiers have been
     applied.  The `TYPE_QUAL_CONST' bit is set if the type is
     `const'-qualified.  The `TYPE_QUAL_VOLATILE' bit is set if the
     type is `volatile'-qualified.  The `TYPE_QUAL_RESTRICT' bit is set
     if the type is `restrict'-qualified.

`CP_TYPE_CONST_P'
     This macro holds if the type is `const'-qualified.

`CP_TYPE_VOLATILE_P'
     This macro holds if the type is `volatile'-qualified.

`CP_TYPE_RESTRICT_P'
     This macro holds if the type is `restrict'-qualified.

`CP_TYPE_CONST_NON_VOLATILE_P'
     This predicate holds for a type that is `const'-qualified, but
     _not_ `volatile'-qualified; other cv-qualifiers are ignored as
     well: only the `const'-ness is tested.


 A few other macros and functions are usable with all types:
`TYPE_SIZE'
     The number of bits required to represent the type, represented as
     an `INTEGER_CST'.  For an incomplete type, `TYPE_SIZE' will be
     `NULL_TREE'.

`TYPE_ALIGN'
     The alignment of the type, in bits, represented as an `int'.

`TYPE_NAME'
     This macro returns a declaration (in the form of a `TYPE_DECL') for
     the type.  (Note this macro does _not_ return an
     `IDENTIFIER_NODE', as you might expect, given its name!)  You can
     look at the `DECL_NAME' of the `TYPE_DECL' to obtain the actual
     name of the type.  The `TYPE_NAME' will be `NULL_TREE' for a type
     that is not a built-in type, the result of a typedef, or a named
     class type.

`CP_INTEGRAL_TYPE'
     This predicate holds if the type is an integral type.  Notice that
     in C++, enumerations are _not_ integral types.

`ARITHMETIC_TYPE_P'
     This predicate holds if the type is an integral type (in the C++
     sense) or a floating point type.

`CLASS_TYPE_P'
     This predicate holds for a class-type.

`TYPE_BUILT_IN'
     This predicate holds for a built-in type.

`TYPE_PTRDATAMEM_P'
     This predicate holds if the type is a pointer to data member.

`TYPE_PTR_P'
     This predicate holds if the type is a pointer type, and the
     pointee is not a data member.

`TYPE_PTRFN_P'
     This predicate holds for a pointer to function type.

`TYPE_PTROB_P'
     This predicate holds for a pointer to object type.  Note however
     that it does not hold for the generic pointer to object type `void
     *'.  You may use `TYPE_PTROBV_P' to test for a pointer to object
     type as well as `void *'.


 The table below describes types specific to C and C++ as well as
language-dependent info about GENERIC types.

`POINTER_TYPE'
     Used to represent pointer types, and pointer to data member types.
     If `TREE_TYPE' is a pointer to data member type, then
     `TYPE_PTRDATAMEM_P' will hold.  For a pointer to data member type
     of the form `T X::*', `TYPE_PTRMEM_CLASS_TYPE' will be the type
     `X', while `TYPE_PTRMEM_POINTED_TO_TYPE' will be the type `T'.

`RECORD_TYPE'
     Used to represent `struct' and `class' types in C and C++.  If
     `TYPE_PTRMEMFUNC_P' holds, then this type is a pointer-to-member
     type.  In that case, the `TYPE_PTRMEMFUNC_FN_TYPE' is a
     `POINTER_TYPE' pointing to a `METHOD_TYPE'.  The `METHOD_TYPE' is
     the type of a function pointed to by the pointer-to-member
     function.  If `TYPE_PTRMEMFUNC_P' does not hold, this type is a
     class type.  For more information, *note Classes::.

`UNKNOWN_TYPE'
     This node is used to represent a type the knowledge of which is
     insufficient for a sound processing.

`TYPENAME_TYPE'
     Used to represent a construct of the form `typename T::A'.  The
     `TYPE_CONTEXT' is `T'; the `TYPE_NAME' is an `IDENTIFIER_NODE' for
     `A'.  If the type is specified via a template-id, then
     `TYPENAME_TYPE_FULLNAME' yields a `TEMPLATE_ID_EXPR'.  The
     `TREE_TYPE' is non-`NULL' if the node is implicitly generated in
     support for the implicit typename extension; in which case the
     `TREE_TYPE' is a type node for the base-class.

`TYPEOF_TYPE'
     Used to represent the `__typeof__' extension.  The `TYPE_FIELDS'
     is the expression the type of which is being represented.



File: gccint.info,  Node: Namespaces,  Next: Classes,  Prev: Types for C++,  Up: C and C++ Trees

11.10.2 Namespaces
------------------

The root of the entire intermediate representation is the variable
`global_namespace'.  This is the namespace specified with `::' in C++
source code.  All other namespaces, types, variables, functions, and so
forth can be found starting with this namespace.

 However, except for the fact that it is distinguished as the root of
the representation, the global namespace is no different from any other
namespace.  Thus, in what follows, we describe namespaces generally,
rather than the global namespace in particular.

 A namespace is represented by a `NAMESPACE_DECL' node.

 The following macros and functions can be used on a `NAMESPACE_DECL':

`DECL_NAME'
     This macro is used to obtain the `IDENTIFIER_NODE' corresponding to
     the unqualified name of the name of the namespace (*note
     Identifiers::).  The name of the global namespace is `::', even
     though in C++ the global namespace is unnamed.  However, you
     should use comparison with `global_namespace', rather than
     `DECL_NAME' to determine whether or not a namespace is the global
     one.  An unnamed namespace will have a `DECL_NAME' equal to
     `anonymous_namespace_name'.  Within a single translation unit, all
     unnamed namespaces will have the same name.

`DECL_CONTEXT'
     This macro returns the enclosing namespace.  The `DECL_CONTEXT' for
     the `global_namespace' is `NULL_TREE'.

`DECL_NAMESPACE_ALIAS'
     If this declaration is for a namespace alias, then
     `DECL_NAMESPACE_ALIAS' is the namespace for which this one is an
     alias.

     Do not attempt to use `cp_namespace_decls' for a namespace which is
     an alias.  Instead, follow `DECL_NAMESPACE_ALIAS' links until you
     reach an ordinary, non-alias, namespace, and call
     `cp_namespace_decls' there.

`DECL_NAMESPACE_STD_P'
     This predicate holds if the namespace is the special `::std'
     namespace.

`cp_namespace_decls'
     This function will return the declarations contained in the
     namespace, including types, overloaded functions, other
     namespaces, and so forth.  If there are no declarations, this
     function will return `NULL_TREE'.  The declarations are connected
     through their `TREE_CHAIN' fields.

     Although most entries on this list will be declarations,
     `TREE_LIST' nodes may also appear.  In this case, the `TREE_VALUE'
     will be an `OVERLOAD'.  The value of the `TREE_PURPOSE' is
     unspecified; back ends should ignore this value.  As with the
     other kinds of declarations returned by `cp_namespace_decls', the
     `TREE_CHAIN' will point to the next declaration in this list.

     For more information on the kinds of declarations that can occur
     on this list, *Note Declarations::.  Some declarations will not
     appear on this list.  In particular, no `FIELD_DECL',
     `LABEL_DECL', or `PARM_DECL' nodes will appear here.

     This function cannot be used with namespaces that have
     `DECL_NAMESPACE_ALIAS' set.



File: gccint.info,  Node: Classes,  Next: Functions for C++,  Prev: Namespaces,  Up: C and C++ Trees

11.10.3 Classes
---------------

Besides namespaces, the other high-level scoping construct in C++ is the
class.  (Throughout this manual the term "class" is used to mean the
types referred to in the ANSI/ISO C++ Standard as classes; these include
types defined with the `class', `struct', and `union' keywords.)

 A class type is represented by either a `RECORD_TYPE' or a
`UNION_TYPE'.  A class declared with the `union' tag is represented by
a `UNION_TYPE', while classes declared with either the `struct' or the
`class' tag are represented by `RECORD_TYPE's.  You can use the
`CLASSTYPE_DECLARED_CLASS' macro to discern whether or not a particular
type is a `class' as opposed to a `struct'.  This macro will be true
only for classes declared with the `class' tag.

 Almost all non-function members are available on the `TYPE_FIELDS'
list.  Given one member, the next can be found by following the
`TREE_CHAIN'.  You should not depend in any way on the order in which
fields appear on this list.  All nodes on this list will be `DECL'
nodes.  A `FIELD_DECL' is used to represent a non-static data member, a
`VAR_DECL' is used to represent a static data member, and a `TYPE_DECL'
is used to represent a type.  Note that the `CONST_DECL' for an
enumeration constant will appear on this list, if the enumeration type
was declared in the class.  (Of course, the `TYPE_DECL' for the
enumeration type will appear here as well.)  There are no entries for
base classes on this list.  In particular, there is no `FIELD_DECL' for
the "base-class portion" of an object.

 The `TYPE_VFIELD' is a compiler-generated field used to point to
virtual function tables.  It may or may not appear on the `TYPE_FIELDS'
list.  However, back ends should handle the `TYPE_VFIELD' just like all
the entries on the `TYPE_FIELDS' list.

 The function members are available on the `TYPE_METHODS' list.  Again,
subsequent members are found by following the `TREE_CHAIN' field.  If a
function is overloaded, each of the overloaded functions appears; no
`OVERLOAD' nodes appear on the `TYPE_METHODS' list.  Implicitly
declared functions (including default constructors, copy constructors,
assignment operators, and destructors) will appear on this list as well.

 Every class has an associated "binfo", which can be obtained with
`TYPE_BINFO'.  Binfos are used to represent base-classes.  The binfo
given by `TYPE_BINFO' is the degenerate case, whereby every class is
considered to be its own base-class.  The base binfos for a particular
binfo are held in a vector, whose length is obtained with
`BINFO_N_BASE_BINFOS'.  The base binfos themselves are obtained with
`BINFO_BASE_BINFO' and `BINFO_BASE_ITERATE'.  To add a new binfo, use
`BINFO_BASE_APPEND'.  The vector of base binfos can be obtained with
`BINFO_BASE_BINFOS', but normally you do not need to use that.  The
class type associated with a binfo is given by `BINFO_TYPE'.  It is not
always the case that `BINFO_TYPE (TYPE_BINFO (x))', because of typedefs
and qualified types.  Neither is it the case that `TYPE_BINFO
(BINFO_TYPE (y))' is the same binfo as `y'.  The reason is that if `y'
is a binfo representing a base-class `B' of a derived class `D', then
`BINFO_TYPE (y)' will be `B', and `TYPE_BINFO (BINFO_TYPE (y))' will be
`B' as its own base-class, rather than as a base-class of `D'.

 The access to a base type can be found with `BINFO_BASE_ACCESS'.  This
will produce `access_public_node', `access_private_node' or
`access_protected_node'.  If bases are always public,
`BINFO_BASE_ACCESSES' may be `NULL'.

 `BINFO_VIRTUAL_P' is used to specify whether the binfo is inherited
virtually or not.  The other flags, `BINFO_MARKED_P' and `BINFO_FLAG_1'
to `BINFO_FLAG_6' can be used for language specific use.

 The following macros can be used on a tree node representing a
class-type.

`LOCAL_CLASS_P'
     This predicate holds if the class is local class _i.e._ declared
     inside a function body.

`TYPE_POLYMORPHIC_P'
     This predicate holds if the class has at least one virtual function
     (declared or inherited).

`TYPE_HAS_DEFAULT_CONSTRUCTOR'
     This predicate holds whenever its argument represents a class-type
     with default constructor.

`CLASSTYPE_HAS_MUTABLE'
`TYPE_HAS_MUTABLE_P'
     These predicates hold for a class-type having a mutable data
     member.

`CLASSTYPE_NON_POD_P'
     This predicate holds only for class-types that are not PODs.

`TYPE_HAS_NEW_OPERATOR'
     This predicate holds for a class-type that defines `operator new'.

`TYPE_HAS_ARRAY_NEW_OPERATOR'
     This predicate holds for a class-type for which `operator new[]'
     is defined.

`TYPE_OVERLOADS_CALL_EXPR'
     This predicate holds for class-type for which the function call
     `operator()' is overloaded.

`TYPE_OVERLOADS_ARRAY_REF'
     This predicate holds for a class-type that overloads `operator[]'

`TYPE_OVERLOADS_ARROW'
     This predicate holds for a class-type for which `operator->' is
     overloaded.



File: gccint.info,  Node: Functions for C++,  Next: Statements for C++,  Prev: Classes,  Up: C and C++ Trees

11.10.4 Functions for C++
-------------------------

A function is represented by a `FUNCTION_DECL' node.  A set of
overloaded functions is sometimes represented by an `OVERLOAD' node.

 An `OVERLOAD' node is not a declaration, so none of the `DECL_' macros
should be used on an `OVERLOAD'.  An `OVERLOAD' node is similar to a
`TREE_LIST'.  Use `OVL_CURRENT' to get the function associated with an
`OVERLOAD' node; use `OVL_NEXT' to get the next `OVERLOAD' node in the
list of overloaded functions.  The macros `OVL_CURRENT' and `OVL_NEXT'
are actually polymorphic; you can use them to work with `FUNCTION_DECL'
nodes as well as with overloads.  In the case of a `FUNCTION_DECL',
`OVL_CURRENT' will always return the function itself, and `OVL_NEXT'
will always be `NULL_TREE'.

 To determine the scope of a function, you can use the `DECL_CONTEXT'
macro.  This macro will return the class (either a `RECORD_TYPE' or a
`UNION_TYPE') or namespace (a `NAMESPACE_DECL') of which the function
is a member.  For a virtual function, this macro returns the class in
which the function was actually defined, not the base class in which
the virtual declaration occurred.

 If a friend function is defined in a class scope, the
`DECL_FRIEND_CONTEXT' macro can be used to determine the class in which
it was defined.  For example, in
     class C { friend void f() {} };
 the `DECL_CONTEXT' for `f' will be the `global_namespace', but the
`DECL_FRIEND_CONTEXT' will be the `RECORD_TYPE' for `C'.

 The following macros and functions can be used on a `FUNCTION_DECL':
`DECL_MAIN_P'
     This predicate holds for a function that is the program entry point
     `::code'.

`DECL_LOCAL_FUNCTION_P'
     This predicate holds if the function was declared at block scope,
     even though it has a global scope.

`DECL_ANTICIPATED'
     This predicate holds if the function is a built-in function but its
     prototype is not yet explicitly declared.

`DECL_EXTERN_C_FUNCTION_P'
     This predicate holds if the function is declared as an ``extern
     "C"'' function.

`DECL_LINKONCE_P'
     This macro holds if multiple copies of this function may be
     emitted in various translation units.  It is the responsibility of
     the linker to merge the various copies.  Template instantiations
     are the most common example of functions for which
     `DECL_LINKONCE_P' holds; G++ instantiates needed templates in all
     translation units which require them, and then relies on the
     linker to remove duplicate instantiations.

     FIXME: This macro is not yet implemented.

`DECL_FUNCTION_MEMBER_P'
     This macro holds if the function is a member of a class, rather
     than a member of a namespace.

`DECL_STATIC_FUNCTION_P'
     This predicate holds if the function a static member function.

`DECL_NONSTATIC_MEMBER_FUNCTION_P'
     This macro holds for a non-static member function.

`DECL_CONST_MEMFUNC_P'
     This predicate holds for a `const'-member function.

`DECL_VOLATILE_MEMFUNC_P'
     This predicate holds for a `volatile'-member function.

`DECL_CONSTRUCTOR_P'
     This macro holds if the function is a constructor.

`DECL_NONCONVERTING_P'
     This predicate holds if the constructor is a non-converting
     constructor.

`DECL_COMPLETE_CONSTRUCTOR_P'
     This predicate holds for a function which is a constructor for an
     object of a complete type.

`DECL_BASE_CONSTRUCTOR_P'
     This predicate holds for a function which is a constructor for a
     base class sub-object.

`DECL_COPY_CONSTRUCTOR_P'
     This predicate holds for a function which is a copy-constructor.

`DECL_DESTRUCTOR_P'
     This macro holds if the function is a destructor.

`DECL_COMPLETE_DESTRUCTOR_P'
     This predicate holds if the function is the destructor for an
     object a complete type.

`DECL_OVERLOADED_OPERATOR_P'
     This macro holds if the function is an overloaded operator.

`DECL_CONV_FN_P'
     This macro holds if the function is a type-conversion operator.

`DECL_GLOBAL_CTOR_P'
     This predicate holds if the function is a file-scope initialization
     function.

`DECL_GLOBAL_DTOR_P'
     This predicate holds if the function is a file-scope finalization
     function.

`DECL_THUNK_P'
     This predicate holds if the function is a thunk.

     These functions represent stub code that adjusts the `this' pointer
     and then jumps to another function.  When the jumped-to function
     returns, control is transferred directly to the caller, without
     returning to the thunk.  The first parameter to the thunk is
     always the `this' pointer; the thunk should add `THUNK_DELTA' to
     this value.  (The `THUNK_DELTA' is an `int', not an `INTEGER_CST'.)

     Then, if `THUNK_VCALL_OFFSET' (an `INTEGER_CST') is nonzero the
     adjusted `this' pointer must be adjusted again.  The complete
     calculation is given by the following pseudo-code:

          this += THUNK_DELTA
          if (THUNK_VCALL_OFFSET)
            this += (*((ptrdiff_t **) this))[THUNK_VCALL_OFFSET]

     Finally, the thunk should jump to the location given by
     `DECL_INITIAL'; this will always be an expression for the address
     of a function.

`DECL_NON_THUNK_FUNCTION_P'
     This predicate holds if the function is _not_ a thunk function.

`GLOBAL_INIT_PRIORITY'
     If either `DECL_GLOBAL_CTOR_P' or `DECL_GLOBAL_DTOR_P' holds, then
     this gives the initialization priority for the function.  The
     linker will arrange that all functions for which
     `DECL_GLOBAL_CTOR_P' holds are run in increasing order of priority
     before `main' is called.  When the program exits, all functions for
     which `DECL_GLOBAL_DTOR_P' holds are run in the reverse order.

`TYPE_RAISES_EXCEPTIONS'
     This macro returns the list of exceptions that a (member-)function
     can raise.  The returned list, if non `NULL', is comprised of nodes
     whose `TREE_VALUE' represents a type.

`TYPE_NOTHROW_P'
     This predicate holds when the exception-specification of its
     arguments is of the form ``()''.

`DECL_ARRAY_DELETE_OPERATOR_P'
     This predicate holds if the function an overloaded `operator
     delete[]'.



File: gccint.info,  Node: Statements for C++,  Next: C++ Expressions,  Prev: Functions for C++,  Up: C and C++ Trees

11.10.5 Statements for C++
--------------------------

A function that has a definition in the current translation unit will
have a non-`NULL' `DECL_INITIAL'.  However, back ends should not make
use of the particular value given by `DECL_INITIAL'.

 The `DECL_SAVED_TREE' macro will give the complete body of the
function.

11.10.5.1 Statements
....................

There are tree nodes corresponding to all of the source-level statement
constructs, used within the C and C++ frontends.  These are enumerated
here, together with a list of the various macros that can be used to
obtain information about them.  There are a few macros that can be used
with all statements:

`STMT_IS_FULL_EXPR_P'
     In C++, statements normally constitute "full expressions";
     temporaries created during a statement are destroyed when the
     statement is complete.  However, G++ sometimes represents
     expressions by statements; these statements will not have
     `STMT_IS_FULL_EXPR_P' set.  Temporaries created during such
     statements should be destroyed when the innermost enclosing
     statement with `STMT_IS_FULL_EXPR_P' set is exited.


 Here is the list of the various statement nodes, and the macros used to
access them.  This documentation describes the use of these nodes in
non-template functions (including instantiations of template functions).
In template functions, the same nodes are used, but sometimes in
slightly different ways.

 Many of the statements have substatements.  For example, a `while'
loop will have a body, which is itself a statement.  If the substatement
is `NULL_TREE', it is considered equivalent to a statement consisting
of a single `;', i.e., an expression statement in which the expression
has been omitted.  A substatement may in fact be a list of statements,
connected via their `TREE_CHAIN's.  So, you should always process the
statement tree by looping over substatements, like this:
     void process_stmt (stmt)
          tree stmt;
     {
       while (stmt)
         {
           switch (TREE_CODE (stmt))
             {
             case IF_STMT:
               process_stmt (THEN_CLAUSE (stmt));
               /* More processing here.  */
               break;

             ...
             }

           stmt = TREE_CHAIN (stmt);
         }
     }
 In other words, while the `then' clause of an `if' statement in C++
can be only one statement (although that one statement may be a
compound statement), the intermediate representation will sometimes use
several statements chained together.

`BREAK_STMT'
     Used to represent a `break' statement.  There are no additional
     fields.

`CLEANUP_STMT'
     Used to represent an action that should take place upon exit from
     the enclosing scope.  Typically, these actions are calls to
     destructors for local objects, but back ends cannot rely on this
     fact.  If these nodes are in fact representing such destructors,
     `CLEANUP_DECL' will be the `VAR_DECL' destroyed.  Otherwise,
     `CLEANUP_DECL' will be `NULL_TREE'.  In any case, the
     `CLEANUP_EXPR' is the expression to execute.  The cleanups
     executed on exit from a scope should be run in the reverse order
     of the order in which the associated `CLEANUP_STMT's were
     encountered.

`CONTINUE_STMT'
     Used to represent a `continue' statement.  There are no additional
     fields.

`CTOR_STMT'
     Used to mark the beginning (if `CTOR_BEGIN_P' holds) or end (if
     `CTOR_END_P' holds of the main body of a constructor.  See also
     `SUBOBJECT' for more information on how to use these nodes.

`DO_STMT'
     Used to represent a `do' loop.  The body of the loop is given by
     `DO_BODY' while the termination condition for the loop is given by
     `DO_COND'.  The condition for a `do'-statement is always an
     expression.

`EMPTY_CLASS_EXPR'
     Used to represent a temporary object of a class with no data whose
     address is never taken.  (All such objects are interchangeable.)
     The `TREE_TYPE' represents the type of the object.

`EXPR_STMT'
     Used to represent an expression statement.  Use `EXPR_STMT_EXPR' to
     obtain the expression.

`FOR_STMT'
     Used to represent a `for' statement.  The `FOR_INIT_STMT' is the
     initialization statement for the loop.  The `FOR_COND' is the
     termination condition.  The `FOR_EXPR' is the expression executed
     right before the `FOR_COND' on each loop iteration; often, this
     expression increments a counter.  The body of the loop is given by
     `FOR_BODY'.  Note that `FOR_INIT_STMT' and `FOR_BODY' return
     statements, while `FOR_COND' and `FOR_EXPR' return expressions.

`HANDLER'
     Used to represent a C++ `catch' block.  The `HANDLER_TYPE' is the
     type of exception that will be caught by this handler; it is equal
     (by pointer equality) to `NULL' if this handler is for all types.
     `HANDLER_PARMS' is the `DECL_STMT' for the catch parameter, and
     `HANDLER_BODY' is the code for the block itself.

`IF_STMT'
     Used to represent an `if' statement.  The `IF_COND' is the
     expression.

     If the condition is a `TREE_LIST', then the `TREE_PURPOSE' is a
     statement (usually a `DECL_STMT').  Each time the condition is
     evaluated, the statement should be executed.  Then, the
     `TREE_VALUE' should be used as the conditional expression itself.
     This representation is used to handle C++ code like this:

     C++ distinguishes between this and `COND_EXPR' for handling
     templates.

          if (int i = 7) ...

     where there is a new local variable (or variables) declared within
     the condition.

     The `THEN_CLAUSE' represents the statement given by the `then'
     condition, while the `ELSE_CLAUSE' represents the statement given
     by the `else' condition.

`SUBOBJECT'
     In a constructor, these nodes are used to mark the point at which a
     subobject of `this' is fully constructed.  If, after this point, an
     exception is thrown before a `CTOR_STMT' with `CTOR_END_P' set is
     encountered, the `SUBOBJECT_CLEANUP' must be executed.  The
     cleanups must be executed in the reverse order in which they
     appear.

`SWITCH_STMT'
     Used to represent a `switch' statement.  The `SWITCH_STMT_COND' is
     the expression on which the switch is occurring.  See the
     documentation for an `IF_STMT' for more information on the
     representation used for the condition.  The `SWITCH_STMT_BODY' is
     the body of the switch statement.   The `SWITCH_STMT_TYPE' is the
     original type of switch expression as given in the source, before
     any compiler conversions.

`TRY_BLOCK'
     Used to represent a `try' block.  The body of the try block is
     given by `TRY_STMTS'.  Each of the catch blocks is a `HANDLER'
     node.  The first handler is given by `TRY_HANDLERS'.  Subsequent
     handlers are obtained by following the `TREE_CHAIN' link from one
     handler to the next.  The body of the handler is given by
     `HANDLER_BODY'.

     If `CLEANUP_P' holds of the `TRY_BLOCK', then the `TRY_HANDLERS'
     will not be a `HANDLER' node.  Instead, it will be an expression
     that should be executed if an exception is thrown in the try
     block.  It must rethrow the exception after executing that code.
     And, if an exception is thrown while the expression is executing,
     `terminate' must be called.

`USING_STMT'
     Used to represent a `using' directive.  The namespace is given by
     `USING_STMT_NAMESPACE', which will be a NAMESPACE_DECL.  This node
     is needed inside template functions, to implement using directives
     during instantiation.

`WHILE_STMT'
     Used to represent a `while' loop.  The `WHILE_COND' is the
     termination condition for the loop.  See the documentation for an
     `IF_STMT' for more information on the representation used for the
     condition.

     The `WHILE_BODY' is the body of the loop.



File: gccint.info,  Node: C++ Expressions,  Prev: Statements for C++,  Up: C and C++ Trees

11.10.6 C++ Expressions
-----------------------

This section describes expressions specific to the C and C++ front ends.

`TYPEID_EXPR'
     Used to represent a `typeid' expression.

`NEW_EXPR'
`VEC_NEW_EXPR'
     Used to represent a call to `new' and `new[]' respectively.

`DELETE_EXPR'
`VEC_DELETE_EXPR'
     Used to represent a call to `delete' and `delete[]' respectively.

`MEMBER_REF'
     Represents a reference to a member of a class.

`THROW_EXPR'
     Represents an instance of `throw' in the program.  Operand 0,
     which is the expression to throw, may be `NULL_TREE'.

`AGGR_INIT_EXPR'
     An `AGGR_INIT_EXPR' represents the initialization as the return
     value of a function call, or as the result of a constructor.  An
     `AGGR_INIT_EXPR' will only appear as a full-expression, or as the
     second operand of a `TARGET_EXPR'.  `AGGR_INIT_EXPR's have a
     representation similar to that of `CALL_EXPR's.  You can use the
     `AGGR_INIT_EXPR_FN' and `AGGR_INIT_EXPR_ARG' macros to access the
     function to call and the arguments to pass.

     If `AGGR_INIT_VIA_CTOR_P' holds of the `AGGR_INIT_EXPR', then the
     initialization is via a constructor call.  The address of the
     `AGGR_INIT_EXPR_SLOT' operand, which is always a `VAR_DECL', is
     taken, and this value replaces the first argument in the argument
     list.

     In either case, the expression is void.



File: gccint.info,  Node: Java Trees,  Prev: C and C++ Trees,  Up: GENERIC

11.11 Java Trees
================


File: gccint.info,  Node: GIMPLE,  Next: Tree SSA,  Prev: GENERIC,  Up: Top

12 GIMPLE
*********

GIMPLE is a three-address representation derived from GENERIC by
breaking down GENERIC expressions into tuples of no more than 3
operands (with some exceptions like function calls).  GIMPLE was
heavily influenced by the SIMPLE IL used by the McCAT compiler project
at McGill University, though we have made some different choices.  For
one thing, SIMPLE doesn't support `goto'.

 Temporaries are introduced to hold intermediate values needed to
compute complex expressions. Additionally, all the control structures
used in GENERIC are lowered into conditional jumps, lexical scopes are
removed and exception regions are converted into an on the side
exception region tree.

 The compiler pass which converts GENERIC into GIMPLE is referred to as
the `gimplifier'.  The gimplifier works recursively, generating GIMPLE
tuples out of the original GENERIC expressions.

 One of the early implementation strategies used for the GIMPLE
representation was to use the same internal data structures used by
front ends to represent parse trees. This simplified implementation
because we could leverage existing functionality and interfaces.
However, GIMPLE is a much more restrictive representation than abstract
syntax trees (AST), therefore it does not require the full structural
complexity provided by the main tree data structure.

 The GENERIC representation of a function is stored in the
`DECL_SAVED_TREE' field of the associated `FUNCTION_DECL' tree node.
It is converted to GIMPLE by a call to `gimplify_function_tree'.

 If a front end wants to include language-specific tree codes in the
tree representation which it provides to the back end, it must provide a
definition of `LANG_HOOKS_GIMPLIFY_EXPR' which knows how to convert the
front end trees to GIMPLE.  Usually such a hook will involve much of
the same code for expanding front end trees to RTL.  This function can
return fully lowered GIMPLE, or it can return GENERIC trees and let the
main gimplifier lower them the rest of the way; this is often simpler.
GIMPLE that is not fully lowered is known as "High GIMPLE" and consists
of the IL before the pass `pass_lower_cf'.  High GIMPLE contains some
container statements like lexical scopes (represented by `GIMPLE_BIND')
and nested expressions (e.g., `GIMPLE_TRY'), while "Low GIMPLE" exposes
all of the implicit jumps for control and exception expressions
directly in the IL and EH region trees.

 The C and C++ front ends currently convert directly from front end
trees to GIMPLE, and hand that off to the back end rather than first
converting to GENERIC.  Their gimplifier hooks know about all the
`_STMT' nodes and how to convert them to GENERIC forms.  There was some
work done on a genericization pass which would run first, but the
existence of `STMT_EXPR' meant that in order to convert all of the C
statements into GENERIC equivalents would involve walking the entire
tree anyway, so it was simpler to lower all the way.  This might change
in the future if someone writes an optimization pass which would work
better with higher-level trees, but currently the optimizers all expect
GIMPLE.

 You can request to dump a C-like representation of the GIMPLE form
with the flag `-fdump-tree-gimple'.

* Menu:

* Tuple representation::
* GIMPLE instruction set::
* GIMPLE Exception Handling::
* Temporaries::
* Operands::
* Manipulating GIMPLE statements::
* Tuple specific accessors::
* GIMPLE sequences::
* Sequence iterators::
* Adding a new GIMPLE statement code::
* Statement and operand traversals::


File: gccint.info,  Node: Tuple representation,  Next: GIMPLE instruction set,  Up: GIMPLE

12.1 Tuple representation
=========================

GIMPLE instructions are tuples of variable size divided in two groups:
a header describing the instruction and its locations, and a variable
length body with all the operands. Tuples are organized into a
hierarchy with 3 main classes of tuples.

12.1.1 `gimple_statement_base' (gsbase)
---------------------------------------

This is the root of the hierarchy, it holds basic information needed by
most GIMPLE statements. There are some fields that may not be relevant
to every GIMPLE statement, but those were moved into the base structure
to take advantage of holes left by other fields (thus making the
structure more compact).  The structure takes 4 words (32 bytes) on 64
bit hosts:

Field                   Size (bits)
`code'                  8
`subcode'               16
`no_warning'            1
`visited'               1
`nontemporal_move'      1
`plf'                   2
`modified'              1
`has_volatile_ops'      1
`references_memory_p'   1
`uid'                   32
`location'              32
`num_ops'               32
`bb'                    64
`block'                 63
Total size              32 bytes

   * `code' Main identifier for a GIMPLE instruction.

   * `subcode' Used to distinguish different variants of the same basic
     instruction or provide flags applicable to a given code. The
     `subcode' flags field has different uses depending on the code of
     the instruction, but mostly it distinguishes instructions of the
     same family. The most prominent use of this field is in
     assignments, where subcode indicates the operation done on the RHS
     of the assignment. For example, a = b + c is encoded as
     `GIMPLE_ASSIGN <PLUS_EXPR, a, b, c>'.

   * `no_warning' Bitflag to indicate whether a warning has already
     been issued on this statement.

   * `visited' General purpose "visited" marker. Set and cleared by
     each pass when needed.

   * `nontemporal_move' Bitflag used in assignments that represent
     non-temporal moves.  Although this bitflag is only used in
     assignments, it was moved into the base to take advantage of the
     bit holes left by the previous fields.

   * `plf' Pass Local Flags. This 2-bit mask can be used as general
     purpose markers by any pass. Passes are responsible for clearing
     and setting these two flags accordingly.

   * `modified' Bitflag to indicate whether the statement has been
     modified.  Used mainly by the operand scanner to determine when to
     re-scan a statement for operands.

   * `has_volatile_ops' Bitflag to indicate whether this statement
     contains operands that have been marked volatile.

   * `references_memory_p' Bitflag to indicate whether this statement
     contains memory references (i.e., its operands are either global
     variables, or pointer dereferences or anything that must reside in
     memory).

   * `uid' This is an unsigned integer used by passes that want to
     assign IDs to every statement. These IDs must be assigned and used
     by each pass.

   * `location' This is a `location_t' identifier to specify source code
     location for this statement. It is inherited from the front end.

   * `num_ops' Number of operands that this statement has. This
     specifies the size of the operand vector embedded in the tuple.
     Only used in some tuples, but it is declared in the base tuple to
     take advantage of the 32-bit hole left by the previous fields.

   * `bb' Basic block holding the instruction.

   * `block' Lexical block holding this statement.  Also used for debug
     information generation.

12.1.2 `gimple_statement_with_ops'
----------------------------------

This tuple is actually split in two: `gimple_statement_with_ops_base'
and `gimple_statement_with_ops'. This is needed to accommodate the way
the operand vector is allocated. The operand vector is defined to be an
array of 1 element. So, to allocate a dynamic number of operands, the
memory allocator (`gimple_alloc') simply allocates enough memory to
hold the structure itself plus `N - 1' operands which run "off the end"
of the structure. For example, to allocate space for a tuple with 3
operands, `gimple_alloc' reserves `sizeof (struct
gimple_statement_with_ops) + 2 * sizeof (tree)' bytes.

 On the other hand, several fields in this tuple need to be shared with
the `gimple_statement_with_memory_ops' tuple. So, these common fields
are placed in `gimple_statement_with_ops_base' which is then inherited
from the other two tuples.

`gsbase'    256
`def_ops'   64
`use_ops'   64
`op'        `num_ops' * 64
Total size  48 + 8 * `num_ops' bytes

   * `gsbase' Inherited from `struct gimple_statement_base'.

   * `def_ops' Array of pointers into the operand array indicating all
     the slots that contain a variable written-to by the statement.
     This array is also used for immediate use chaining. Note that it
     would be possible to not rely on this array, but the changes
     required to implement this are pretty invasive.

   * `use_ops' Similar to `def_ops' but for variables read by the
     statement.

   * `op' Array of trees with `num_ops' slots.

12.1.3 `gimple_statement_with_memory_ops'
-----------------------------------------

This tuple is essentially identical to `gimple_statement_with_ops',
except that it contains 4 additional fields to hold vectors related
memory stores and loads.  Similar to the previous case, the structure
is split in two to accommodate for the operand vector
(`gimple_statement_with_memory_ops_base' and
`gimple_statement_with_memory_ops').

Field        Size (bits)
`gsbase'     256
`def_ops'    64
`use_ops'    64
`vdef_ops'   64
`vuse_ops'   64
`stores'     64
`loads'      64
`op'         `num_ops' * 64
Total size   80 + 8 * `num_ops' bytes

   * `vdef_ops' Similar to `def_ops' but for `VDEF' operators. There is
     one entry per memory symbol written by this statement. This is
     used to maintain the memory SSA use-def and def-def chains.

   * `vuse_ops' Similar to `use_ops' but for `VUSE' operators. There is
     one entry per memory symbol loaded by this statement. This is used
     to maintain the memory SSA use-def chains.

   * `stores' Bitset with all the UIDs for the symbols written-to by the
     statement.  This is different than `vdef_ops' in that all the
     affected symbols are mentioned in this set.  If memory
     partitioning is enabled, the `vdef_ops' vector will refer to memory
     partitions. Furthermore, no SSA information is stored in this set.

   * `loads' Similar to `stores', but for memory loads. (Note that there
     is some amount of redundancy here, it should be possible to reduce
     memory utilization further by removing these sets).

 All the other tuples are defined in terms of these three basic ones.
Each tuple will add some fields. The main gimple type is defined to be
the union of all these structures (`GTY' markers elided for clarity):

     union gimple_statement_d
     {
       struct gimple_statement_base gsbase;
       struct gimple_statement_with_ops gsops;
       struct gimple_statement_with_memory_ops gsmem;
       struct gimple_statement_omp omp;
       struct gimple_statement_bind gimple_bind;
       struct gimple_statement_catch gimple_catch;
       struct gimple_statement_eh_filter gimple_eh_filter;
       struct gimple_statement_phi gimple_phi;
       struct gimple_statement_resx gimple_resx;
       struct gimple_statement_try gimple_try;
       struct gimple_statement_wce gimple_wce;
       struct gimple_statement_asm gimple_asm;
       struct gimple_statement_omp_critical gimple_omp_critical;
       struct gimple_statement_omp_for gimple_omp_for;
       struct gimple_statement_omp_parallel gimple_omp_parallel;
       struct gimple_statement_omp_task gimple_omp_task;
       struct gimple_statement_omp_sections gimple_omp_sections;
       struct gimple_statement_omp_single gimple_omp_single;
       struct gimple_statement_omp_continue gimple_omp_continue;
       struct gimple_statement_omp_atomic_load gimple_omp_atomic_load;
       struct gimple_statement_omp_atomic_store gimple_omp_atomic_store;
     };


File: gccint.info,  Node: GIMPLE instruction set,  Next: GIMPLE Exception Handling,  Prev: Tuple representation,  Up: GIMPLE

12.2 GIMPLE instruction set
===========================

The following table briefly describes the GIMPLE instruction set.

Instruction                    High GIMPLE   Low GIMPLE
`GIMPLE_ASM'                   x             x
`GIMPLE_ASSIGN'                x             x
`GIMPLE_BIND'                  x             
`GIMPLE_CALL'                  x             x
`GIMPLE_CATCH'                 x             
`GIMPLE_COND'                  x             x
`GIMPLE_DEBUG'                 x             x
`GIMPLE_EH_FILTER'             x             
`GIMPLE_GOTO'                  x             x
`GIMPLE_LABEL'                 x             x
`GIMPLE_NOP'                   x             x
`GIMPLE_OMP_ATOMIC_LOAD'       x             x
`GIMPLE_OMP_ATOMIC_STORE'      x             x
`GIMPLE_OMP_CONTINUE'          x             x
`GIMPLE_OMP_CRITICAL'          x             x
`GIMPLE_OMP_FOR'               x             x
`GIMPLE_OMP_MASTER'            x             x
`GIMPLE_OMP_ORDERED'           x             x
`GIMPLE_OMP_PARALLEL'          x             x
`GIMPLE_OMP_RETURN'            x             x
`GIMPLE_OMP_SECTION'           x             x
`GIMPLE_OMP_SECTIONS'          x             x
`GIMPLE_OMP_SECTIONS_SWITCH'   x             x
`GIMPLE_OMP_SINGLE'            x             x
`GIMPLE_PHI'                                 x
`GIMPLE_RESX'                                x
`GIMPLE_RETURN'                x             x
`GIMPLE_SWITCH'                x             x
`GIMPLE_TRY'                   x             


File: gccint.info,  Node: GIMPLE Exception Handling,  Next: Temporaries,  Prev: GIMPLE instruction set,  Up: GIMPLE

12.3 Exception Handling
=======================

Other exception handling constructs are represented using
`GIMPLE_TRY_CATCH'.  `GIMPLE_TRY_CATCH' has two operands.  The first
operand is a sequence of statements to execute.  If executing these
statements does not throw an exception, then the second operand is
ignored.  Otherwise, if an exception is thrown, then the second operand
of the `GIMPLE_TRY_CATCH' is checked.  The second operand may have the
following forms:

  1. A sequence of statements to execute.  When an exception occurs,
     these statements are executed, and then the exception is rethrown.

  2. A sequence of `GIMPLE_CATCH' statements.  Each `GIMPLE_CATCH' has
     a list of applicable exception types and handler code.  If the
     thrown exception matches one of the caught types, the associated
     handler code is executed.  If the handler code falls off the
     bottom, execution continues after the original `GIMPLE_TRY_CATCH'.

  3. A `GIMPLE_EH_FILTER' statement.  This has a list of permitted
     exception types, and code to handle a match failure.  If the
     thrown exception does not match one of the allowed types, the
     associated match failure code is executed.  If the thrown exception
     does match, it continues unwinding the stack looking for the next
     handler.


 Currently throwing an exception is not directly represented in GIMPLE,
since it is implemented by calling a function.  At some point in the
future we will want to add some way to express that the call will throw
an exception of a known type.

 Just before running the optimizers, the compiler lowers the high-level
EH constructs above into a set of `goto's, magic labels, and EH
regions.  Continuing to unwind at the end of a cleanup is represented
with a `GIMPLE_RESX'.


File: gccint.info,  Node: Temporaries,  Next: Operands,  Prev: GIMPLE Exception Handling,  Up: GIMPLE

12.4 Temporaries
================

When gimplification encounters a subexpression that is too complex, it
creates a new temporary variable to hold the value of the
subexpression, and adds a new statement to initialize it before the
current statement. These special temporaries are known as `expression
temporaries', and are allocated using `get_formal_tmp_var'.  The
compiler tries to always evaluate identical expressions into the same
temporary, to simplify elimination of redundant calculations.

 We can only use expression temporaries when we know that it will not
be reevaluated before its value is used, and that it will not be
otherwise modified(1). Other temporaries can be allocated using
`get_initialized_tmp_var' or `create_tmp_var'.

 Currently, an expression like `a = b + 5' is not reduced any further.
We tried converting it to something like
     T1 = b + 5;
     a = T1;
 but this bloated the representation for minimal benefit.  However, a
variable which must live in memory cannot appear in an expression; its
value is explicitly loaded into a temporary first.  Similarly, storing
the value of an expression to a memory variable goes through a
temporary.

 ---------- Footnotes ----------

 (1) These restrictions are derived from those in Morgan 4.8.


File: gccint.info,  Node: Operands,  Next: Manipulating GIMPLE statements,  Prev: Temporaries,  Up: GIMPLE

12.5 Operands
=============

In general, expressions in GIMPLE consist of an operation and the
appropriate number of simple operands; these operands must either be a
GIMPLE rvalue (`is_gimple_val'), i.e. a constant or a register
variable.  More complex operands are factored out into temporaries, so
that
     a = b + c + d
 becomes
     T1 = b + c;
     a = T1 + d;

 The same rule holds for arguments to a `GIMPLE_CALL'.

 The target of an assignment is usually a variable, but can also be a
`MEM_REF' or a compound lvalue as described below.

* Menu:

* Compound Expressions::
* Compound Lvalues::
* Conditional Expressions::
* Logical Operators::


File: gccint.info,  Node: Compound Expressions,  Next: Compound Lvalues,  Up: Operands

12.5.1 Compound Expressions
---------------------------

The left-hand side of a C comma expression is simply moved into a
separate statement.


File: gccint.info,  Node: Compound Lvalues,  Next: Conditional Expressions,  Prev: Compound Expressions,  Up: Operands

12.5.2 Compound Lvalues
-----------------------

Currently compound lvalues involving array and structure field
references are not broken down; an expression like `a.b[2] = 42' is not
reduced any further (though complex array subscripts are).  This
restriction is a workaround for limitations in later optimizers; if we
were to convert this to

     T1 = &a.b;
     T1[2] = 42;

 alias analysis would not remember that the reference to `T1[2]' came
by way of `a.b', so it would think that the assignment could alias
another member of `a'; this broke `struct-alias-1.c'.  Future optimizer
improvements may make this limitation unnecessary.


File: gccint.info,  Node: Conditional Expressions,  Next: Logical Operators,  Prev: Compound Lvalues,  Up: Operands

12.5.3 Conditional Expressions
------------------------------

A C `?:' expression is converted into an `if' statement with each
branch assigning to the same temporary.  So,

     a = b ? c : d;
 becomes
     if (b == 1)
       T1 = c;
     else
       T1 = d;
     a = T1;

 The GIMPLE level if-conversion pass re-introduces `?:' expression, if
appropriate. It is used to vectorize loops with conditions using vector
conditional operations.

 Note that in GIMPLE, `if' statements are represented using
`GIMPLE_COND', as described below.


File: gccint.info,  Node: Logical Operators,  Prev: Conditional Expressions,  Up: Operands

12.5.4 Logical Operators
------------------------

Except when they appear in the condition operand of a `GIMPLE_COND',
logical `and' and `or' operators are simplified as follows: `a = b &&
c' becomes

     T1 = (bool)b;
     if (T1 == true)
       T1 = (bool)c;
     a = T1;

 Note that `T1' in this example cannot be an expression temporary,
because it has two different assignments.

12.5.5 Manipulating operands
----------------------------

All gimple operands are of type `tree'.  But only certain types of
trees are allowed to be used as operand tuples.  Basic validation is
controlled by the function `get_gimple_rhs_class', which given a tree
code, returns an `enum' with the following values of type `enum
gimple_rhs_class'

   * `GIMPLE_INVALID_RHS' The tree cannot be used as a GIMPLE operand.

   * `GIMPLE_TERNARY_RHS' The tree is a valid GIMPLE ternary operation.

   * `GIMPLE_BINARY_RHS' The tree is a valid GIMPLE binary operation.

   * `GIMPLE_UNARY_RHS' The tree is a valid GIMPLE unary operation.

   * `GIMPLE_SINGLE_RHS' The tree is a single object, that cannot be
     split into simpler operands (for instance, `SSA_NAME', `VAR_DECL',
     `COMPONENT_REF', etc).

     This operand class also acts as an escape hatch for tree nodes
     that may be flattened out into the operand vector, but would need
     more than two slots on the RHS.  For instance, a `COND_EXPR'
     expression of the form `(a op b) ? x : y' could be flattened out
     on the operand vector using 4 slots, but it would also require
     additional processing to distinguish `c = a op b' from `c = a op b
     ? x : y'.  Something similar occurs with `ASSERT_EXPR'.   In time,
     these special case tree expressions should be flattened into the
     operand vector.

 For tree nodes in the categories `GIMPLE_TERNARY_RHS',
`GIMPLE_BINARY_RHS' and `GIMPLE_UNARY_RHS', they cannot be stored
inside tuples directly.  They first need to be flattened and separated
into individual components.  For instance, given the GENERIC expression

     a = b + c

 its tree representation is:

     MODIFY_EXPR <VAR_DECL  <a>, PLUS_EXPR <VAR_DECL <b>, VAR_DECL <c>>>

 In this case, the GIMPLE form for this statement is logically
identical to its GENERIC form but in GIMPLE, the `PLUS_EXPR' on the RHS
of the assignment is not represented as a tree, instead the two
operands are taken out of the `PLUS_EXPR' sub-tree and flattened into
the GIMPLE tuple as follows:

     GIMPLE_ASSIGN <PLUS_EXPR, VAR_DECL <a>, VAR_DECL <b>, VAR_DECL <c>>

12.5.6 Operand vector allocation
--------------------------------

The operand vector is stored at the bottom of the three tuple
structures that accept operands. This means, that depending on the code
of a given statement, its operand vector will be at different offsets
from the base of the structure.  To access tuple operands use the
following accessors

 -- GIMPLE function: unsigned gimple_num_ops (gimple g)
     Returns the number of operands in statement G.

 -- GIMPLE function: tree gimple_op (gimple g, unsigned i)
     Returns operand `I' from statement `G'.

 -- GIMPLE function: tree * gimple_ops (gimple g)
     Returns a pointer into the operand vector for statement `G'.  This
     is computed using an internal table called `gimple_ops_offset_'[].
     This table is indexed by the gimple code of `G'.

     When the compiler is built, this table is filled-in using the
     sizes of the structures used by each statement code defined in
     gimple.def.  Since the operand vector is at the bottom of the
     structure, for a gimple code `C' the offset is computed as sizeof
     (struct-of `C') - sizeof (tree).

     This mechanism adds one memory indirection to every access when
     using `gimple_op'(), if this becomes a bottleneck, a pass can
     choose to memoize the result from `gimple_ops'() and use that to
     access the operands.

12.5.7 Operand validation
-------------------------

When adding a new operand to a gimple statement, the operand will be
validated according to what each tuple accepts in its operand vector.
These predicates are called by the `gimple_NAME_set_...()'.  Each tuple
will use one of the following predicates (Note, this list is not
exhaustive):

 -- GIMPLE function: bool is_gimple_val (tree t)
     Returns true if t is a "GIMPLE value", which are all the
     non-addressable stack variables (variables for which
     `is_gimple_reg' returns true) and constants (expressions for which
     `is_gimple_min_invariant' returns true).

 -- GIMPLE function: bool is_gimple_addressable (tree t)
     Returns true if t is a symbol or memory reference whose address
     can be taken.

 -- GIMPLE function: bool is_gimple_asm_val (tree t)
     Similar to `is_gimple_val' but it also accepts hard registers.

 -- GIMPLE function: bool is_gimple_call_addr (tree t)
     Return true if t is a valid expression to use as the function
     called by a `GIMPLE_CALL'.

 -- GIMPLE function: bool is_gimple_mem_ref_addr (tree t)
     Return true if t is a valid expression to use as first operand of
     a `MEM_REF' expression.

 -- GIMPLE function: bool is_gimple_constant (tree t)
     Return true if t is a valid gimple constant.

 -- GIMPLE function: bool is_gimple_min_invariant (tree t)
     Return true if t is a valid minimal invariant.  This is different
     from constants, in that the specific value of t may not be known
     at compile time, but it is known that it doesn't change (e.g., the
     address of a function local variable).

 -- GIMPLE function: bool is_gimple_ip_invariant (tree t)
     Return true if t is an interprocedural invariant.  This means that
     t is a valid invariant in all functions (e.g. it can be an address
     of a global variable but not of a local one).

 -- GIMPLE function: bool is_gimple_ip_invariant_address (tree t)
     Return true if t is an `ADDR_EXPR' that does not change once the
     program is running (and which is valid in all functions).

12.5.8 Statement validation
---------------------------

 -- GIMPLE function: bool is_gimple_assign (gimple g)
     Return true if the code of g is `GIMPLE_ASSIGN'.

 -- GIMPLE function: bool is_gimple_call (gimple g)
     Return true if the code of g is `GIMPLE_CALL'.

 -- GIMPLE function: bool is_gimple_debug (gimple g)
     Return true if the code of g is `GIMPLE_DEBUG'.

 -- GIMPLE function: bool gimple_assign_cast_p (gimple g)
     Return true if g is a `GIMPLE_ASSIGN' that performs a type cast
     operation.

 -- GIMPLE function: bool gimple_debug_bind_p (gimple g)
     Return true if g is a `GIMPLE_DEBUG' that binds the value of an
     expression to a variable.


File: gccint.info,  Node: Manipulating GIMPLE statements,  Next: Tuple specific accessors,  Prev: Operands,  Up: GIMPLE

12.6 Manipulating GIMPLE statements
===================================

This section documents all the functions available to handle each of
the GIMPLE instructions.

12.6.1 Common accessors
-----------------------

The following are common accessors for gimple statements.

 -- GIMPLE function: enum gimple_code gimple_code (gimple g)
     Return the code for statement `G'.

 -- GIMPLE function: basic_block gimple_bb (gimple g)
     Return the basic block to which statement `G' belongs to.

 -- GIMPLE function: tree gimple_block (gimple g)
     Return the lexical scope block holding statement `G'.

 -- GIMPLE function: tree gimple_expr_type (gimple stmt)
     Return the type of the main expression computed by `STMT'. Return
     `void_type_node' if `STMT' computes nothing. This will only return
     something meaningful for `GIMPLE_ASSIGN', `GIMPLE_COND' and
     `GIMPLE_CALL'.  For all other tuple codes, it will return
     `void_type_node'.

 -- GIMPLE function: enum tree_code gimple_expr_code (gimple stmt)
     Return the tree code for the expression computed by `STMT'.  This
     is only meaningful for `GIMPLE_CALL', `GIMPLE_ASSIGN' and
     `GIMPLE_COND'.  If `STMT' is `GIMPLE_CALL', it will return
     `CALL_EXPR'.  For `GIMPLE_COND', it returns the code of the
     comparison predicate.  For `GIMPLE_ASSIGN' it returns the code of
     the operation performed by the `RHS' of the assignment.

 -- GIMPLE function: void gimple_set_block (gimple g, tree block)
     Set the lexical scope block of `G' to `BLOCK'.

 -- GIMPLE function: location_t gimple_locus (gimple g)
     Return locus information for statement `G'.

 -- GIMPLE function: void gimple_set_locus (gimple g, location_t locus)
     Set locus information for statement `G'.

 -- GIMPLE function: bool gimple_locus_empty_p (gimple g)
     Return true if `G' does not have locus information.

 -- GIMPLE function: bool gimple_no_warning_p (gimple stmt)
     Return true if no warnings should be emitted for statement `STMT'.

 -- GIMPLE function: void gimple_set_visited (gimple stmt, bool
          visited_p)
     Set the visited status on statement `STMT' to `VISITED_P'.

 -- GIMPLE function: bool gimple_visited_p (gimple stmt)
     Return the visited status on statement `STMT'.

 -- GIMPLE function: void gimple_set_plf (gimple stmt, enum plf_mask
          plf, bool val_p)
     Set pass local flag `PLF' on statement `STMT' to `VAL_P'.

 -- GIMPLE function: unsigned int gimple_plf (gimple stmt, enum
          plf_mask plf)
     Return the value of pass local flag `PLF' on statement `STMT'.

 -- GIMPLE function: bool gimple_has_ops (gimple g)
     Return true if statement `G' has register or memory operands.

 -- GIMPLE function: bool gimple_has_mem_ops (gimple g)
     Return true if statement `G' has memory operands.

 -- GIMPLE function: unsigned gimple_num_ops (gimple g)
     Return the number of operands for statement `G'.

 -- GIMPLE function: tree * gimple_ops (gimple g)
     Return the array of operands for statement `G'.

 -- GIMPLE function: tree gimple_op (gimple g, unsigned i)
     Return operand `I' for statement `G'.

 -- GIMPLE function: tree * gimple_op_ptr (gimple g, unsigned i)
     Return a pointer to operand `I' for statement `G'.

 -- GIMPLE function: void gimple_set_op (gimple g, unsigned i, tree op)
     Set operand `I' of statement `G' to `OP'.

 -- GIMPLE function: bitmap gimple_addresses_taken (gimple stmt)
     Return the set of symbols that have had their address taken by
     `STMT'.

 -- GIMPLE function: struct def_optype_d * gimple_def_ops (gimple g)
     Return the set of `DEF' operands for statement `G'.

 -- GIMPLE function: void gimple_set_def_ops (gimple g, struct
          def_optype_d *def)
     Set `DEF' to be the set of `DEF' operands for statement `G'.

 -- GIMPLE function: struct use_optype_d * gimple_use_ops (gimple g)
     Return the set of `USE' operands for statement `G'.

 -- GIMPLE function: void gimple_set_use_ops (gimple g, struct
          use_optype_d *use)
     Set `USE' to be the set of `USE' operands for statement `G'.

 -- GIMPLE function: struct voptype_d * gimple_vuse_ops (gimple g)
     Return the set of `VUSE' operands for statement `G'.

 -- GIMPLE function: void gimple_set_vuse_ops (gimple g, struct
          voptype_d *ops)
     Set `OPS' to be the set of `VUSE' operands for statement `G'.

 -- GIMPLE function: struct voptype_d * gimple_vdef_ops (gimple g)
     Return the set of `VDEF' operands for statement `G'.

 -- GIMPLE function: void gimple_set_vdef_ops (gimple g, struct
          voptype_d *ops)
     Set `OPS' to be the set of `VDEF' operands for statement `G'.

 -- GIMPLE function: bitmap gimple_loaded_syms (gimple g)
     Return the set of symbols loaded by statement `G'.  Each element of
     the set is the `DECL_UID' of the corresponding symbol.

 -- GIMPLE function: bitmap gimple_stored_syms (gimple g)
     Return the set of symbols stored by statement `G'.  Each element of
     the set is the `DECL_UID' of the corresponding symbol.

 -- GIMPLE function: bool gimple_modified_p (gimple g)
     Return true if statement `G' has operands and the modified field
     has been set.

 -- GIMPLE function: bool gimple_has_volatile_ops (gimple stmt)
     Return true if statement `STMT' contains volatile operands.

 -- GIMPLE function: void gimple_set_has_volatile_ops (gimple stmt,
          bool volatilep)
     Return true if statement `STMT' contains volatile operands.

 -- GIMPLE function: void update_stmt (gimple s)
     Mark statement `S' as modified, and update it.

 -- GIMPLE function: void update_stmt_if_modified (gimple s)
     Update statement `S' if it has been marked modified.

 -- GIMPLE function: gimple gimple_copy (gimple stmt)
     Return a deep copy of statement `STMT'.


File: gccint.info,  Node: Tuple specific accessors,  Next: GIMPLE sequences,  Prev: Manipulating GIMPLE statements,  Up: GIMPLE

12.7 Tuple specific accessors
=============================

* Menu:

* `GIMPLE_ASM'::
* `GIMPLE_ASSIGN'::
* `GIMPLE_BIND'::
* `GIMPLE_CALL'::
* `GIMPLE_CATCH'::
* `GIMPLE_COND'::
* `GIMPLE_DEBUG'::
* `GIMPLE_EH_FILTER'::
* `GIMPLE_LABEL'::
* `GIMPLE_NOP'::
* `GIMPLE_OMP_ATOMIC_LOAD'::
* `GIMPLE_OMP_ATOMIC_STORE'::
* `GIMPLE_OMP_CONTINUE'::
* `GIMPLE_OMP_CRITICAL'::
* `GIMPLE_OMP_FOR'::
* `GIMPLE_OMP_MASTER'::
* `GIMPLE_OMP_ORDERED'::
* `GIMPLE_OMP_PARALLEL'::
* `GIMPLE_OMP_RETURN'::
* `GIMPLE_OMP_SECTION'::
* `GIMPLE_OMP_SECTIONS'::
* `GIMPLE_OMP_SINGLE'::
* `GIMPLE_PHI'::
* `GIMPLE_RESX'::
* `GIMPLE_RETURN'::
* `GIMPLE_SWITCH'::
* `GIMPLE_TRY'::
* `GIMPLE_WITH_CLEANUP_EXPR'::


File: gccint.info,  Node: `GIMPLE_ASM',  Next: `GIMPLE_ASSIGN',  Up: Tuple specific accessors

12.7.1 `GIMPLE_ASM'
-------------------

 -- GIMPLE function: gimple gimple_build_asm (const char *string,
          ninputs, noutputs, nclobbers, ...)
     Build a `GIMPLE_ASM' statement.  This statement is used for
     building in-line assembly constructs.  `STRING' is the assembly
     code.  `NINPUT' is the number of register inputs.  `NOUTPUT' is the
     number of register outputs.  `NCLOBBERS' is the number of clobbered
     registers.  The rest of the arguments trees for each input,
     output, and clobbered registers.

 -- GIMPLE function: gimple gimple_build_asm_vec (const char *,
          VEC(tree,gc) *, VEC(tree,gc) *, VEC(tree,gc) *)
     Identical to gimple_build_asm, but the arguments are passed in
     VECs.

 -- GIMPLE function: unsigned gimple_asm_ninputs (gimple g)
     Return the number of input operands for `GIMPLE_ASM' `G'.

 -- GIMPLE function: unsigned gimple_asm_noutputs (gimple g)
     Return the number of output operands for `GIMPLE_ASM' `G'.

 -- GIMPLE function: unsigned gimple_asm_nclobbers (gimple g)
     Return the number of clobber operands for `GIMPLE_ASM' `G'.

 -- GIMPLE function: tree gimple_asm_input_op (gimple g, unsigned index)
     Return input operand `INDEX' of `GIMPLE_ASM' `G'.

 -- GIMPLE function: void gimple_asm_set_input_op (gimple g, unsigned
          index, tree in_op)
     Set `IN_OP' to be input operand `INDEX' in `GIMPLE_ASM' `G'.

 -- GIMPLE function: tree gimple_asm_output_op (gimple g, unsigned
          index)
     Return output operand `INDEX' of `GIMPLE_ASM' `G'.

 -- GIMPLE function: void gimple_asm_set_output_op (gimple g, unsigned
          index, tree out_op)
     Set `OUT_OP' to be output operand `INDEX' in `GIMPLE_ASM' `G'.

 -- GIMPLE function: tree gimple_asm_clobber_op (gimple g, unsigned
          index)
     Return clobber operand `INDEX' of `GIMPLE_ASM' `G'.

 -- GIMPLE function: void gimple_asm_set_clobber_op (gimple g, unsigned
          index, tree clobber_op)
     Set `CLOBBER_OP' to be clobber operand `INDEX' in `GIMPLE_ASM' `G'.

 -- GIMPLE function: const char * gimple_asm_string (gimple g)
     Return the string representing the assembly instruction in
     `GIMPLE_ASM' `G'.

 -- GIMPLE function: bool gimple_asm_volatile_p (gimple g)
     Return true if `G' is an asm statement marked volatile.

 -- GIMPLE function: void gimple_asm_set_volatile (gimple g)
     Mark asm statement `G' as volatile.

 -- GIMPLE function: void gimple_asm_clear_volatile (gimple g)
     Remove volatile marker from asm statement `G'.


File: gccint.info,  Node: `GIMPLE_ASSIGN',  Next: `GIMPLE_BIND',  Prev: `GIMPLE_ASM',  Up: Tuple specific accessors

12.7.2 `GIMPLE_ASSIGN'
----------------------

 -- GIMPLE function: gimple gimple_build_assign (tree lhs, tree rhs)
     Build a `GIMPLE_ASSIGN' statement.  The left-hand side is an lvalue
     passed in lhs.  The right-hand side can be either a unary or
     binary tree expression.  The expression tree rhs will be flattened
     and its operands assigned to the corresponding operand slots in
     the new statement.  This function is useful when you already have
     a tree expression that you want to convert into a tuple.  However,
     try to avoid building expression trees for the sole purpose of
     calling this function.  If you already have the operands in
     separate trees, it is better to use `gimple_build_assign_with_ops'.

 -- GIMPLE function: gimple gimplify_assign (tree dst, tree src,
          gimple_seq *seq_p)
     Build a new `GIMPLE_ASSIGN' tuple and append it to the end of
     `*SEQ_P'.

 `DST'/`SRC' are the destination and source respectively.  You can pass
ungimplified trees in `DST' or `SRC', in which case they will be
converted to a gimple operand if necessary.

 This function returns the newly created `GIMPLE_ASSIGN' tuple.

 -- GIMPLE function: gimple gimple_build_assign_with_ops (enum
          tree_code subcode, tree lhs, tree op1, tree op2)
     This function is similar to `gimple_build_assign', but is used to
     build a `GIMPLE_ASSIGN' statement when the operands of the
     right-hand side of the assignment are already split into different
     operands.

     The left-hand side is an lvalue passed in lhs.  Subcode is the
     `tree_code' for the right-hand side of the assignment.  Op1 and op2
     are the operands.  If op2 is null, subcode must be a `tree_code'
     for a unary expression.

 -- GIMPLE function: enum tree_code gimple_assign_rhs_code (gimple g)
     Return the code of the expression computed on the `RHS' of
     assignment statement `G'.

 -- GIMPLE function: enum gimple_rhs_class gimple_assign_rhs_class
          (gimple g)
     Return the gimple rhs class of the code for the expression
     computed on the rhs of assignment statement `G'.  This will never
     return `GIMPLE_INVALID_RHS'.

 -- GIMPLE function: tree gimple_assign_lhs (gimple g)
     Return the `LHS' of assignment statement `G'.

 -- GIMPLE function: tree * gimple_assign_lhs_ptr (gimple g)
     Return a pointer to the `LHS' of assignment statement `G'.

 -- GIMPLE function: tree gimple_assign_rhs1 (gimple g)
     Return the first operand on the `RHS' of assignment statement `G'.

 -- GIMPLE function: tree * gimple_assign_rhs1_ptr (gimple g)
     Return the address of the first operand on the `RHS' of assignment
     statement `G'.

 -- GIMPLE function: tree gimple_assign_rhs2 (gimple g)
     Return the second operand on the `RHS' of assignment statement `G'.

 -- GIMPLE function: tree * gimple_assign_rhs2_ptr (gimple g)
     Return the address of the second operand on the `RHS' of assignment
     statement `G'.

 -- GIMPLE function: tree gimple_assign_rhs3 (gimple g)
     Return the third operand on the `RHS' of assignment statement `G'.

 -- GIMPLE function: tree * gimple_assign_rhs3_ptr (gimple g)
     Return the address of the third operand on the `RHS' of assignment
     statement `G'.

 -- GIMPLE function: void gimple_assign_set_lhs (gimple g, tree lhs)
     Set `LHS' to be the `LHS' operand of assignment statement `G'.

 -- GIMPLE function: void gimple_assign_set_rhs1 (gimple g, tree rhs)
     Set `RHS' to be the first operand on the `RHS' of assignment
     statement `G'.

 -- GIMPLE function: void gimple_assign_set_rhs2 (gimple g, tree rhs)
     Set `RHS' to be the second operand on the `RHS' of assignment
     statement `G'.

 -- GIMPLE function: void gimple_assign_set_rhs3 (gimple g, tree rhs)
     Set `RHS' to be the third operand on the `RHS' of assignment
     statement `G'.

 -- GIMPLE function: bool gimple_assign_cast_p (gimple s)
     Return true if `S' is a type-cast assignment.


File: gccint.info,  Node: `GIMPLE_BIND',  Next: `GIMPLE_CALL',  Prev: `GIMPLE_ASSIGN',  Up: Tuple specific accessors

12.7.3 `GIMPLE_BIND'
--------------------

 -- GIMPLE function: gimple gimple_build_bind (tree vars, gimple_seq
          body)
     Build a `GIMPLE_BIND' statement with a list of variables in `VARS'
     and a body of statements in sequence `BODY'.

 -- GIMPLE function: tree gimple_bind_vars (gimple g)
     Return the variables declared in the `GIMPLE_BIND' statement `G'.

 -- GIMPLE function: void gimple_bind_set_vars (gimple g, tree vars)
     Set `VARS' to be the set of variables declared in the `GIMPLE_BIND'
     statement `G'.

 -- GIMPLE function: void gimple_bind_append_vars (gimple g, tree vars)
     Append `VARS' to the set of variables declared in the `GIMPLE_BIND'
     statement `G'.

 -- GIMPLE function: gimple_seq gimple_bind_body (gimple g)
     Return the GIMPLE sequence contained in the `GIMPLE_BIND' statement
     `G'.

 -- GIMPLE function: void gimple_bind_set_body (gimple g, gimple_seq
          seq)
     Set `SEQ' to be sequence contained in the `GIMPLE_BIND' statement
     `G'.

 -- GIMPLE function: void gimple_bind_add_stmt (gimple gs, gimple stmt)
     Append a statement to the end of a `GIMPLE_BIND''s body.

 -- GIMPLE function: void gimple_bind_add_seq (gimple gs, gimple_seq
          seq)
     Append a sequence of statements to the end of a `GIMPLE_BIND''s
     body.

 -- GIMPLE function: tree gimple_bind_block (gimple g)
     Return the `TREE_BLOCK' node associated with `GIMPLE_BIND'
     statement `G'. This is analogous to the `BIND_EXPR_BLOCK' field in
     trees.

 -- GIMPLE function: void gimple_bind_set_block (gimple g, tree block)
     Set `BLOCK' to be the `TREE_BLOCK' node associated with
     `GIMPLE_BIND' statement `G'.


File: gccint.info,  Node: `GIMPLE_CALL',  Next: `GIMPLE_CATCH',  Prev: `GIMPLE_BIND',  Up: Tuple specific accessors

12.7.4 `GIMPLE_CALL'
--------------------

 -- GIMPLE function: gimple gimple_build_call (tree fn, unsigned nargs,
          ...)
     Build a `GIMPLE_CALL' statement to function `FN'.  The argument
     `FN' must be either a `FUNCTION_DECL' or a gimple call address as
     determined by `is_gimple_call_addr'.  `NARGS' are the number of
     arguments.  The rest of the arguments follow the argument `NARGS',
     and must be trees that are valid as rvalues in gimple (i.e., each
     operand is validated with `is_gimple_operand').

 -- GIMPLE function: gimple gimple_build_call_from_tree (tree call_expr)
     Build a `GIMPLE_CALL' from a `CALL_EXPR' node.  The arguments and
     the function are taken from the expression directly.  This routine
     assumes that `call_expr' is already in GIMPLE form.  That is, its
     operands are GIMPLE values and the function call needs no further
     simplification.  All the call flags in `call_expr' are copied over
     to the new `GIMPLE_CALL'.

 -- GIMPLE function: gimple gimple_build_call_vec (tree fn, `VEC'(tree,
          heap) *args)
     Identical to `gimple_build_call' but the arguments are stored in a
     `VEC'().

 -- GIMPLE function: tree gimple_call_lhs (gimple g)
     Return the `LHS' of call statement `G'.

 -- GIMPLE function: tree * gimple_call_lhs_ptr (gimple g)
     Return a pointer to the `LHS' of call statement `G'.

 -- GIMPLE function: void gimple_call_set_lhs (gimple g, tree lhs)
     Set `LHS' to be the `LHS' operand of call statement `G'.

 -- GIMPLE function: tree gimple_call_fn (gimple g)
     Return the tree node representing the function called by call
     statement `G'.

 -- GIMPLE function: void gimple_call_set_fn (gimple g, tree fn)
     Set `FN' to be the function called by call statement `G'.  This has
     to be a gimple value specifying the address of the called function.

 -- GIMPLE function: tree gimple_call_fndecl (gimple g)
     If a given `GIMPLE_CALL''s callee is a `FUNCTION_DECL', return it.
     Otherwise return `NULL'.  This function is analogous to
     `get_callee_fndecl' in `GENERIC'.

 -- GIMPLE function: tree gimple_call_set_fndecl (gimple g, tree fndecl)
     Set the called function to `FNDECL'.

 -- GIMPLE function: tree gimple_call_return_type (gimple g)
     Return the type returned by call statement `G'.

 -- GIMPLE function: tree gimple_call_chain (gimple g)
     Return the static chain for call statement `G'.

 -- GIMPLE function: void gimple_call_set_chain (gimple g, tree chain)
     Set `CHAIN' to be the static chain for call statement `G'.

 -- GIMPLE function: unsigned gimple_call_num_args (gimple g)
     Return the number of arguments used by call statement `G'.

 -- GIMPLE function: tree gimple_call_arg (gimple g, unsigned index)
     Return the argument at position `INDEX' for call statement `G'.
     The first argument is 0.

 -- GIMPLE function: tree * gimple_call_arg_ptr (gimple g, unsigned
          index)
     Return a pointer to the argument at position `INDEX' for call
     statement `G'.

 -- GIMPLE function: void gimple_call_set_arg (gimple g, unsigned
          index, tree arg)
     Set `ARG' to be the argument at position `INDEX' for call statement
     `G'.

 -- GIMPLE function: void gimple_call_set_tail (gimple s)
     Mark call statement `S' as being a tail call (i.e., a call just
     before the exit of a function). These calls are candidate for tail
     call optimization.

 -- GIMPLE function: bool gimple_call_tail_p (gimple s)
     Return true if `GIMPLE_CALL' `S' is marked as a tail call.

 -- GIMPLE function: void gimple_call_mark_uninlinable (gimple s)
     Mark `GIMPLE_CALL' `S' as being uninlinable.

 -- GIMPLE function: bool gimple_call_cannot_inline_p (gimple s)
     Return true if `GIMPLE_CALL' `S' cannot be inlined.

 -- GIMPLE function: bool gimple_call_noreturn_p (gimple s)
     Return true if `S' is a noreturn call.

 -- GIMPLE function: gimple gimple_call_copy_skip_args (gimple stmt,
          bitmap args_to_skip)
     Build a `GIMPLE_CALL' identical to `STMT' but skipping the
     arguments in the positions marked by the set `ARGS_TO_SKIP'.


File: gccint.info,  Node: `GIMPLE_CATCH',  Next: `GIMPLE_COND',  Prev: `GIMPLE_CALL',  Up: Tuple specific accessors

12.7.5 `GIMPLE_CATCH'
---------------------

 -- GIMPLE function: gimple gimple_build_catch (tree types, gimple_seq
          handler)
     Build a `GIMPLE_CATCH' statement.  `TYPES' are the tree types this
     catch handles.  `HANDLER' is a sequence of statements with the code
     for the handler.

 -- GIMPLE function: tree gimple_catch_types (gimple g)
     Return the types handled by `GIMPLE_CATCH' statement `G'.

 -- GIMPLE function: tree * gimple_catch_types_ptr (gimple g)
     Return a pointer to the types handled by `GIMPLE_CATCH' statement
     `G'.

 -- GIMPLE function: gimple_seq gimple_catch_handler (gimple g)
     Return the GIMPLE sequence representing the body of the handler of
     `GIMPLE_CATCH' statement `G'.

 -- GIMPLE function: void gimple_catch_set_types (gimple g, tree t)
     Set `T' to be the set of types handled by `GIMPLE_CATCH' `G'.

 -- GIMPLE function: void gimple_catch_set_handler (gimple g,
          gimple_seq handler)
     Set `HANDLER' to be the body of `GIMPLE_CATCH' `G'.


File: gccint.info,  Node: `GIMPLE_COND',  Next: `GIMPLE_DEBUG',  Prev: `GIMPLE_CATCH',  Up: Tuple specific accessors

12.7.6 `GIMPLE_COND'
--------------------

 -- GIMPLE function: gimple gimple_build_cond (enum tree_code
          pred_code, tree lhs, tree rhs, tree t_label, tree f_label)
     Build a `GIMPLE_COND' statement.  `A' `GIMPLE_COND' statement
     compares `LHS' and `RHS' and if the condition in `PRED_CODE' is
     true, jump to the label in `t_label', otherwise jump to the label
     in `f_label'.  `PRED_CODE' are relational operator tree codes like
     `EQ_EXPR', `LT_EXPR', `LE_EXPR', `NE_EXPR', etc.

 -- GIMPLE function: gimple gimple_build_cond_from_tree (tree cond,
          tree t_label, tree f_label)
     Build a `GIMPLE_COND' statement from the conditional expression
     tree `COND'.  `T_LABEL' and `F_LABEL' are as in
     `gimple_build_cond'.

 -- GIMPLE function: enum tree_code gimple_cond_code (gimple g)
     Return the code of the predicate computed by conditional statement
     `G'.

 -- GIMPLE function: void gimple_cond_set_code (gimple g, enum
          tree_code code)
     Set `CODE' to be the predicate code for the conditional statement
     `G'.

 -- GIMPLE function: tree gimple_cond_lhs (gimple g)
     Return the `LHS' of the predicate computed by conditional statement
     `G'.

 -- GIMPLE function: void gimple_cond_set_lhs (gimple g, tree lhs)
     Set `LHS' to be the `LHS' operand of the predicate computed by
     conditional statement `G'.

 -- GIMPLE function: tree gimple_cond_rhs (gimple g)
     Return the `RHS' operand of the predicate computed by conditional
     `G'.

 -- GIMPLE function: void gimple_cond_set_rhs (gimple g, tree rhs)
     Set `RHS' to be the `RHS' operand of the predicate computed by
     conditional statement `G'.

 -- GIMPLE function: tree gimple_cond_true_label (gimple g)
     Return the label used by conditional statement `G' when its
     predicate evaluates to true.

 -- GIMPLE function: void gimple_cond_set_true_label (gimple g, tree
          label)
     Set `LABEL' to be the label used by conditional statement `G' when
     its predicate evaluates to true.

 -- GIMPLE function: void gimple_cond_set_false_label (gimple g, tree
          label)
     Set `LABEL' to be the label used by conditional statement `G' when
     its predicate evaluates to false.

 -- GIMPLE function: tree gimple_cond_false_label (gimple g)
     Return the label used by conditional statement `G' when its
     predicate evaluates to false.

 -- GIMPLE function: void gimple_cond_make_false (gimple g)
     Set the conditional `COND_STMT' to be of the form 'if (1 == 0)'.

 -- GIMPLE function: void gimple_cond_make_true (gimple g)
     Set the conditional `COND_STMT' to be of the form 'if (1 == 1)'.


File: gccint.info,  Node: `GIMPLE_DEBUG',  Next: `GIMPLE_EH_FILTER',  Prev: `GIMPLE_COND',  Up: Tuple specific accessors

12.7.7 `GIMPLE_DEBUG'
---------------------

 -- GIMPLE function: gimple gimple_build_debug_bind (tree var, tree
          value, gimple stmt)
     Build a `GIMPLE_DEBUG' statement with `GIMPLE_DEBUG_BIND' of
     `subcode'.  The effect of this statement is to tell debug
     information generation machinery that the value of user variable
     `var' is given by `value' at that point, and to remain with that
     value until `var' runs out of scope, a dynamically-subsequent
     debug bind statement overrides the binding, or conflicting values
     reach a control flow merge point.  Even if components of the
     `value' expression change afterwards, the variable is supposed to
     retain the same value, though not necessarily the same location.

     It is expected that `var' be most often a tree for automatic user
     variables (`VAR_DECL' or `PARM_DECL') that satisfy the
     requirements for gimple registers, but it may also be a tree for a
     scalarized component of a user variable (`ARRAY_REF',
     `COMPONENT_REF'), or a debug temporary (`DEBUG_EXPR_DECL').

     As for `value', it can be an arbitrary tree expression, but it is
     recommended that it be in a suitable form for a gimple assignment
     `RHS'.  It is not expected that user variables that could appear
     as `var' ever appear in `value', because in the latter we'd have
     their `SSA_NAME's instead, but even if they were not in SSA form,
     user variables appearing in `value' are to be regarded as part of
     the executable code space, whereas those in `var' are to be
     regarded as part of the source code space.  There is no way to
     refer to the value bound to a user variable within a `value'
     expression.

     If `value' is `GIMPLE_DEBUG_BIND_NOVALUE', debug information
     generation machinery is informed that the variable `var' is
     unbound, i.e., that its value is indeterminate, which sometimes
     means it is really unavailable, and other times that the compiler
     could not keep track of it.

     Block and location information for the newly-created stmt are
     taken from `stmt', if given.

 -- GIMPLE function: tree gimple_debug_bind_get_var (gimple stmt)
     Return the user variable VAR that is bound at `stmt'.

 -- GIMPLE function: tree gimple_debug_bind_get_value (gimple stmt)
     Return the value expression that is bound to a user variable at
     `stmt'.

 -- GIMPLE function: tree * gimple_debug_bind_get_value_ptr (gimple
          stmt)
     Return a pointer to the value expression that is bound to a user
     variable at `stmt'.

 -- GIMPLE function: void gimple_debug_bind_set_var (gimple stmt, tree
          var)
     Modify the user variable bound at `stmt' to VAR.

 -- GIMPLE function: void gimple_debug_bind_set_value (gimple stmt,
          tree var)
     Modify the value bound to the user variable bound at `stmt' to
     VALUE.

 -- GIMPLE function: void gimple_debug_bind_reset_value (gimple stmt)
     Modify the value bound to the user variable bound at `stmt' so
     that the variable becomes unbound.

 -- GIMPLE function: bool gimple_debug_bind_has_value_p (gimple stmt)
     Return `TRUE' if `stmt' binds a user variable to a value, and
     `FALSE' if it unbinds the variable.


File: gccint.info,  Node: `GIMPLE_EH_FILTER',  Next: `GIMPLE_LABEL',  Prev: `GIMPLE_DEBUG',  Up: Tuple specific accessors

12.7.8 `GIMPLE_EH_FILTER'
-------------------------

 -- GIMPLE function: gimple gimple_build_eh_filter (tree types,
          gimple_seq failure)
     Build a `GIMPLE_EH_FILTER' statement.  `TYPES' are the filter's
     types.  `FAILURE' is a sequence with the filter's failure action.

 -- GIMPLE function: tree gimple_eh_filter_types (gimple g)
     Return the types handled by `GIMPLE_EH_FILTER' statement `G'.

 -- GIMPLE function: tree * gimple_eh_filter_types_ptr (gimple g)
     Return a pointer to the types handled by `GIMPLE_EH_FILTER'
     statement `G'.

 -- GIMPLE function: gimple_seq gimple_eh_filter_failure (gimple g)
     Return the sequence of statement to execute when `GIMPLE_EH_FILTER'
     statement fails.

 -- GIMPLE function: void gimple_eh_filter_set_types (gimple g, tree
          types)
     Set `TYPES' to be the set of types handled by `GIMPLE_EH_FILTER'
     `G'.

 -- GIMPLE function: void gimple_eh_filter_set_failure (gimple g,
          gimple_seq failure)
     Set `FAILURE' to be the sequence of statements to execute on
     failure for `GIMPLE_EH_FILTER' `G'.

 -- GIMPLE function: bool gimple_eh_filter_must_not_throw (gimple g)
     Return the `EH_FILTER_MUST_NOT_THROW' flag.

 -- GIMPLE function: void gimple_eh_filter_set_must_not_throw (gimple
          g, bool mntp)
     Set the `EH_FILTER_MUST_NOT_THROW' flag.


File: gccint.info,  Node: `GIMPLE_LABEL',  Next: `GIMPLE_NOP',  Prev: `GIMPLE_EH_FILTER',  Up: Tuple specific accessors

12.7.9 `GIMPLE_LABEL'
---------------------

 -- GIMPLE function: gimple gimple_build_label (tree label)
     Build a `GIMPLE_LABEL' statement with corresponding to the tree
     label, `LABEL'.

 -- GIMPLE function: tree gimple_label_label (gimple g)
     Return the `LABEL_DECL' node used by `GIMPLE_LABEL' statement `G'.

 -- GIMPLE function: void gimple_label_set_label (gimple g, tree label)
     Set `LABEL' to be the `LABEL_DECL' node used by `GIMPLE_LABEL'
     statement `G'.

 -- GIMPLE function: gimple gimple_build_goto (tree dest)
     Build a `GIMPLE_GOTO' statement to label `DEST'.

 -- GIMPLE function: tree gimple_goto_dest (gimple g)
     Return the destination of the unconditional jump `G'.

 -- GIMPLE function: void gimple_goto_set_dest (gimple g, tree dest)
     Set `DEST' to be the destination of the unconditional jump `G'.


File: gccint.info,  Node: `GIMPLE_NOP',  Next: `GIMPLE_OMP_ATOMIC_LOAD',  Prev: `GIMPLE_LABEL',  Up: Tuple specific accessors

12.7.10 `GIMPLE_NOP'
--------------------

 -- GIMPLE function: gimple gimple_build_nop (void)
     Build a `GIMPLE_NOP' statement.

 -- GIMPLE function: bool gimple_nop_p (gimple g)
     Returns `TRUE' if statement `G' is a `GIMPLE_NOP'.


File: gccint.info,  Node: `GIMPLE_OMP_ATOMIC_LOAD',  Next: `GIMPLE_OMP_ATOMIC_STORE',  Prev: `GIMPLE_NOP',  Up: Tuple specific accessors

12.7.11 `GIMPLE_OMP_ATOMIC_LOAD'
--------------------------------

 -- GIMPLE function: gimple gimple_build_omp_atomic_load (tree lhs,
          tree rhs)
     Build a `GIMPLE_OMP_ATOMIC_LOAD' statement.  `LHS' is the left-hand
     side of the assignment.  `RHS' is the right-hand side of the
     assignment.

 -- GIMPLE function: void gimple_omp_atomic_load_set_lhs (gimple g,
          tree lhs)
     Set the `LHS' of an atomic load.

 -- GIMPLE function: tree gimple_omp_atomic_load_lhs (gimple g)
     Get the `LHS' of an atomic load.

 -- GIMPLE function: void gimple_omp_atomic_load_set_rhs (gimple g,
          tree rhs)
     Set the `RHS' of an atomic set.

 -- GIMPLE function: tree gimple_omp_atomic_load_rhs (gimple g)
     Get the `RHS' of an atomic set.


File: gccint.info,  Node: `GIMPLE_OMP_ATOMIC_STORE',  Next: `GIMPLE_OMP_CONTINUE',  Prev: `GIMPLE_OMP_ATOMIC_LOAD',  Up: Tuple specific accessors

12.7.12 `GIMPLE_OMP_ATOMIC_STORE'
---------------------------------

 -- GIMPLE function: gimple gimple_build_omp_atomic_store (tree val)
     Build a `GIMPLE_OMP_ATOMIC_STORE' statement. `VAL' is the value to
     be stored.

 -- GIMPLE function: void gimple_omp_atomic_store_set_val (gimple g,
          tree val)
     Set the value being stored in an atomic store.

 -- GIMPLE function: tree gimple_omp_atomic_store_val (gimple g)
     Return the value being stored in an atomic store.


File: gccint.info,  Node: `GIMPLE_OMP_CONTINUE',  Next: `GIMPLE_OMP_CRITICAL',  Prev: `GIMPLE_OMP_ATOMIC_STORE',  Up: Tuple specific accessors

12.7.13 `GIMPLE_OMP_CONTINUE'
-----------------------------

 -- GIMPLE function: gimple gimple_build_omp_continue (tree
          control_def, tree control_use)
     Build a `GIMPLE_OMP_CONTINUE' statement.  `CONTROL_DEF' is the
     definition of the control variable.  `CONTROL_USE' is the use of
     the control variable.

 -- GIMPLE function: tree gimple_omp_continue_control_def (gimple s)
     Return the definition of the control variable on a
     `GIMPLE_OMP_CONTINUE' in `S'.

 -- GIMPLE function: tree gimple_omp_continue_control_def_ptr (gimple s)
     Same as above, but return the pointer.

 -- GIMPLE function: tree gimple_omp_continue_set_control_def (gimple s)
     Set the control variable definition for a `GIMPLE_OMP_CONTINUE'
     statement in `S'.

 -- GIMPLE function: tree gimple_omp_continue_control_use (gimple s)
     Return the use of the control variable on a `GIMPLE_OMP_CONTINUE'
     in `S'.

 -- GIMPLE function: tree gimple_omp_continue_control_use_ptr (gimple s)
     Same as above, but return the pointer.

 -- GIMPLE function: tree gimple_omp_continue_set_control_use (gimple s)
     Set the control variable use for a `GIMPLE_OMP_CONTINUE' statement
     in `S'.


File: gccint.info,  Node: `GIMPLE_OMP_CRITICAL',  Next: `GIMPLE_OMP_FOR',  Prev: `GIMPLE_OMP_CONTINUE',  Up: Tuple specific accessors

12.7.14 `GIMPLE_OMP_CRITICAL'
-----------------------------

 -- GIMPLE function: gimple gimple_build_omp_critical (gimple_seq body,
          tree name)
     Build a `GIMPLE_OMP_CRITICAL' statement. `BODY' is the sequence of
     statements for which only one thread can execute.  `NAME' is an
     optional identifier for this critical block.

 -- GIMPLE function: tree gimple_omp_critical_name (gimple g)
     Return the name associated with `OMP_CRITICAL' statement `G'.

 -- GIMPLE function: tree * gimple_omp_critical_name_ptr (gimple g)
     Return a pointer to the name associated with `OMP' critical
     statement `G'.

 -- GIMPLE function: void gimple_omp_critical_set_name (gimple g, tree
          name)
     Set `NAME' to be the name associated with `OMP' critical statement
     `G'.


File: gccint.info,  Node: `GIMPLE_OMP_FOR',  Next: `GIMPLE_OMP_MASTER',  Prev: `GIMPLE_OMP_CRITICAL',  Up: Tuple specific accessors

12.7.15 `GIMPLE_OMP_FOR'
------------------------

 -- GIMPLE function: gimple gimple_build_omp_for (gimple_seq body, tree
          clauses, tree index, tree initial, tree final, tree incr,
          gimple_seq pre_body, enum tree_code omp_for_cond)
     Build a `GIMPLE_OMP_FOR' statement. `BODY' is sequence of
     statements inside the for loop.  `CLAUSES', are any of the `OMP'
     loop construct's clauses: private, firstprivate,  lastprivate,
     reductions, ordered, schedule, and nowait.  `PRE_BODY' is the
     sequence of statements that are loop invariant.  `INDEX' is the
     index variable.  `INITIAL' is the initial value of `INDEX'.
     `FINAL' is final value of `INDEX'.  OMP_FOR_COND is the predicate
     used to compare `INDEX' and `FINAL'.  `INCR' is the increment
     expression.

 -- GIMPLE function: tree gimple_omp_for_clauses (gimple g)
     Return the clauses associated with `OMP_FOR' `G'.

 -- GIMPLE function: tree * gimple_omp_for_clauses_ptr (gimple g)
     Return a pointer to the `OMP_FOR' `G'.

 -- GIMPLE function: void gimple_omp_for_set_clauses (gimple g, tree
          clauses)
     Set `CLAUSES' to be the list of clauses associated with `OMP_FOR'
     `G'.

 -- GIMPLE function: tree gimple_omp_for_index (gimple g)
     Return the index variable for `OMP_FOR' `G'.

 -- GIMPLE function: tree * gimple_omp_for_index_ptr (gimple g)
     Return a pointer to the index variable for `OMP_FOR' `G'.

 -- GIMPLE function: void gimple_omp_for_set_index (gimple g, tree
          index)
     Set `INDEX' to be the index variable for `OMP_FOR' `G'.

 -- GIMPLE function: tree gimple_omp_for_initial (gimple g)
     Return the initial value for `OMP_FOR' `G'.

 -- GIMPLE function: tree * gimple_omp_for_initial_ptr (gimple g)
     Return a pointer to the initial value for `OMP_FOR' `G'.

 -- GIMPLE function: void gimple_omp_for_set_initial (gimple g, tree
          initial)
     Set `INITIAL' to be the initial value for `OMP_FOR' `G'.

 -- GIMPLE function: tree gimple_omp_for_final (gimple g)
     Return the final value for `OMP_FOR' `G'.

 -- GIMPLE function: tree * gimple_omp_for_final_ptr (gimple g)
     turn a pointer to the final value for `OMP_FOR' `G'.

 -- GIMPLE function: void gimple_omp_for_set_final (gimple g, tree
          final)
     Set `FINAL' to be the final value for `OMP_FOR' `G'.

 -- GIMPLE function: tree gimple_omp_for_incr (gimple g)
     Return the increment value for `OMP_FOR' `G'.

 -- GIMPLE function: tree * gimple_omp_for_incr_ptr (gimple g)
     Return a pointer to the increment value for `OMP_FOR' `G'.

 -- GIMPLE function: void gimple_omp_for_set_incr (gimple g, tree incr)
     Set `INCR' to be the increment value for `OMP_FOR' `G'.

 -- GIMPLE function: gimple_seq gimple_omp_for_pre_body (gimple g)
     Return the sequence of statements to execute before the `OMP_FOR'
     statement `G' starts.

 -- GIMPLE function: void gimple_omp_for_set_pre_body (gimple g,
          gimple_seq pre_body)
     Set `PRE_BODY' to be the sequence of statements to execute before
     the `OMP_FOR' statement `G' starts.

 -- GIMPLE function: void gimple_omp_for_set_cond (gimple g, enum
          tree_code cond)
     Set `COND' to be the condition code for `OMP_FOR' `G'.

 -- GIMPLE function: enum tree_code gimple_omp_for_cond (gimple g)
     Return the condition code associated with `OMP_FOR' `G'.


File: gccint.info,  Node: `GIMPLE_OMP_MASTER',  Next: `GIMPLE_OMP_ORDERED',  Prev: `GIMPLE_OMP_FOR',  Up: Tuple specific accessors

12.7.16 `GIMPLE_OMP_MASTER'
---------------------------

 -- GIMPLE function: gimple gimple_build_omp_master (gimple_seq body)
     Build a `GIMPLE_OMP_MASTER' statement. `BODY' is the sequence of
     statements to be executed by just the master.


File: gccint.info,  Node: `GIMPLE_OMP_ORDERED',  Next: `GIMPLE_OMP_PARALLEL',  Prev: `GIMPLE_OMP_MASTER',  Up: Tuple specific accessors

12.7.17 `GIMPLE_OMP_ORDERED'
----------------------------

 -- GIMPLE function: gimple gimple_build_omp_ordered (gimple_seq body)
     Build a `GIMPLE_OMP_ORDERED' statement.

 `BODY' is the sequence of statements inside a loop that will executed
in sequence.


File: gccint.info,  Node: `GIMPLE_OMP_PARALLEL',  Next: `GIMPLE_OMP_RETURN',  Prev: `GIMPLE_OMP_ORDERED',  Up: Tuple specific accessors

12.7.18 `GIMPLE_OMP_PARALLEL'
-----------------------------

 -- GIMPLE function: gimple gimple_build_omp_parallel (gimple_seq body,
          tree clauses, tree child_fn, tree data_arg)
     Build a `GIMPLE_OMP_PARALLEL' statement.

 `BODY' is sequence of statements which are executed in parallel.
`CLAUSES', are the `OMP' parallel construct's clauses.  `CHILD_FN' is
the function created for the parallel threads to execute.  `DATA_ARG'
are the shared data argument(s).

 -- GIMPLE function: bool gimple_omp_parallel_combined_p (gimple g)
     Return true if `OMP' parallel statement `G' has the
     `GF_OMP_PARALLEL_COMBINED' flag set.

 -- GIMPLE function: void gimple_omp_parallel_set_combined_p (gimple g)
     Set the `GF_OMP_PARALLEL_COMBINED' field in `OMP' parallel
     statement `G'.

 -- GIMPLE function: gimple_seq gimple_omp_body (gimple g)
     Return the body for the `OMP' statement `G'.

 -- GIMPLE function: void gimple_omp_set_body (gimple g, gimple_seq
          body)
     Set `BODY' to be the body for the `OMP' statement `G'.

 -- GIMPLE function: tree gimple_omp_parallel_clauses (gimple g)
     Return the clauses associated with `OMP_PARALLEL' `G'.

 -- GIMPLE function: tree * gimple_omp_parallel_clauses_ptr (gimple g)
     Return a pointer to the clauses associated with `OMP_PARALLEL' `G'.

 -- GIMPLE function: void gimple_omp_parallel_set_clauses (gimple g,
          tree clauses)
     Set `CLAUSES' to be the list of clauses associated with
     `OMP_PARALLEL' `G'.

 -- GIMPLE function: tree gimple_omp_parallel_child_fn (gimple g)
     Return the child function used to hold the body of `OMP_PARALLEL'
     `G'.

 -- GIMPLE function: tree * gimple_omp_parallel_child_fn_ptr (gimple g)
     Return a pointer to the child function used to hold the body of
     `OMP_PARALLEL' `G'.

 -- GIMPLE function: void gimple_omp_parallel_set_child_fn (gimple g,
          tree child_fn)
     Set `CHILD_FN' to be the child function for `OMP_PARALLEL' `G'.

 -- GIMPLE function: tree gimple_omp_parallel_data_arg (gimple g)
     Return the artificial argument used to send variables and values
     from the parent to the children threads in `OMP_PARALLEL' `G'.

 -- GIMPLE function: tree * gimple_omp_parallel_data_arg_ptr (gimple g)
     Return a pointer to the data argument for `OMP_PARALLEL' `G'.

 -- GIMPLE function: void gimple_omp_parallel_set_data_arg (gimple g,
          tree data_arg)
     Set `DATA_ARG' to be the data argument for `OMP_PARALLEL' `G'.

 -- GIMPLE function: bool is_gimple_omp (gimple stmt)
     Returns true when the gimple statement `STMT' is any of the OpenMP
     types.


File: gccint.info,  Node: `GIMPLE_OMP_RETURN',  Next: `GIMPLE_OMP_SECTION',  Prev: `GIMPLE_OMP_PARALLEL',  Up: Tuple specific accessors

12.7.19 `GIMPLE_OMP_RETURN'
---------------------------

 -- GIMPLE function: gimple gimple_build_omp_return (bool wait_p)
     Build a `GIMPLE_OMP_RETURN' statement. `WAIT_P' is true if this is
     a non-waiting return.

 -- GIMPLE function: void gimple_omp_return_set_nowait (gimple s)
     Set the nowait flag on `GIMPLE_OMP_RETURN' statement `S'.

 -- GIMPLE function: bool gimple_omp_return_nowait_p (gimple g)
     Return true if `OMP' return statement `G' has the
     `GF_OMP_RETURN_NOWAIT' flag set.


File: gccint.info,  Node: `GIMPLE_OMP_SECTION',  Next: `GIMPLE_OMP_SECTIONS',  Prev: `GIMPLE_OMP_RETURN',  Up: Tuple specific accessors

12.7.20 `GIMPLE_OMP_SECTION'
----------------------------

 -- GIMPLE function: gimple gimple_build_omp_section (gimple_seq body)
     Build a `GIMPLE_OMP_SECTION' statement for a sections statement.

 `BODY' is the sequence of statements in the section.

 -- GIMPLE function: bool gimple_omp_section_last_p (gimple g)
     Return true if `OMP' section statement `G' has the
     `GF_OMP_SECTION_LAST' flag set.

 -- GIMPLE function: void gimple_omp_section_set_last (gimple g)
     Set the `GF_OMP_SECTION_LAST' flag on `G'.


File: gccint.info,  Node: `GIMPLE_OMP_SECTIONS',  Next: `GIMPLE_OMP_SINGLE',  Prev: `GIMPLE_OMP_SECTION',  Up: Tuple specific accessors

12.7.21 `GIMPLE_OMP_SECTIONS'
-----------------------------

 -- GIMPLE function: gimple gimple_build_omp_sections (gimple_seq body,
          tree clauses)
     Build a `GIMPLE_OMP_SECTIONS' statement. `BODY' is a sequence of
     section statements.  `CLAUSES' are any of the `OMP' sections
     construct's clauses: private, firstprivate, lastprivate,
     reduction, and nowait.

 -- GIMPLE function: gimple gimple_build_omp_sections_switch (void)
     Build a `GIMPLE_OMP_SECTIONS_SWITCH' statement.

 -- GIMPLE function: tree gimple_omp_sections_control (gimple g)
     Return the control variable associated with the
     `GIMPLE_OMP_SECTIONS' in `G'.

 -- GIMPLE function: tree * gimple_omp_sections_control_ptr (gimple g)
     Return a pointer to the clauses associated with the
     `GIMPLE_OMP_SECTIONS' in `G'.

 -- GIMPLE function: void gimple_omp_sections_set_control (gimple g,
          tree control)
     Set `CONTROL' to be the set of clauses associated with the
     `GIMPLE_OMP_SECTIONS' in `G'.

 -- GIMPLE function: tree gimple_omp_sections_clauses (gimple g)
     Return the clauses associated with `OMP_SECTIONS' `G'.

 -- GIMPLE function: tree * gimple_omp_sections_clauses_ptr (gimple g)
     Return a pointer to the clauses associated with `OMP_SECTIONS' `G'.

 -- GIMPLE function: void gimple_omp_sections_set_clauses (gimple g,
          tree clauses)
     Set `CLAUSES' to be the set of clauses associated with
     `OMP_SECTIONS' `G'.


File: gccint.info,  Node: `GIMPLE_OMP_SINGLE',  Next: `GIMPLE_PHI',  Prev: `GIMPLE_OMP_SECTIONS',  Up: Tuple specific accessors

12.7.22 `GIMPLE_OMP_SINGLE'
---------------------------

 -- GIMPLE function: gimple gimple_build_omp_single (gimple_seq body,
          tree clauses)
     Build a `GIMPLE_OMP_SINGLE' statement. `BODY' is the sequence of
     statements that will be executed once.  `CLAUSES' are any of the
     `OMP' single construct's clauses: private, firstprivate,
     copyprivate, nowait.

 -- GIMPLE function: tree gimple_omp_single_clauses (gimple g)
     Return the clauses associated with `OMP_SINGLE' `G'.

 -- GIMPLE function: tree * gimple_omp_single_clauses_ptr (gimple g)
     Return a pointer to the clauses associated with `OMP_SINGLE' `G'.

 -- GIMPLE function: void gimple_omp_single_set_clauses (gimple g, tree
          clauses)
     Set `CLAUSES' to be the clauses associated with `OMP_SINGLE' `G'.


File: gccint.info,  Node: `GIMPLE_PHI',  Next: `GIMPLE_RESX',  Prev: `GIMPLE_OMP_SINGLE',  Up: Tuple specific accessors

12.7.23 `GIMPLE_PHI'
--------------------

 -- GIMPLE function: unsigned gimple_phi_capacity (gimple g)
     Return the maximum number of arguments supported by `GIMPLE_PHI'
     `G'.

 -- GIMPLE function: unsigned gimple_phi_num_args (gimple g)
     Return the number of arguments in `GIMPLE_PHI' `G'. This must
     always be exactly the number of incoming edges for the basic block
     holding `G'.

 -- GIMPLE function: tree gimple_phi_result (gimple g)
     Return the `SSA' name created by `GIMPLE_PHI' `G'.

 -- GIMPLE function: tree * gimple_phi_result_ptr (gimple g)
     Return a pointer to the `SSA' name created by `GIMPLE_PHI' `G'.

 -- GIMPLE function: void gimple_phi_set_result (gimple g, tree result)
     Set `RESULT' to be the `SSA' name created by `GIMPLE_PHI' `G'.

 -- GIMPLE function: struct phi_arg_d * gimple_phi_arg (gimple g, index)
     Return the `PHI' argument corresponding to incoming edge `INDEX'
     for `GIMPLE_PHI' `G'.

 -- GIMPLE function: void gimple_phi_set_arg (gimple g, index, struct
          phi_arg_d * phiarg)
     Set `PHIARG' to be the argument corresponding to incoming edge
     `INDEX' for `GIMPLE_PHI' `G'.


File: gccint.info,  Node: `GIMPLE_RESX',  Next: `GIMPLE_RETURN',  Prev: `GIMPLE_PHI',  Up: Tuple specific accessors

12.7.24 `GIMPLE_RESX'
---------------------

 -- GIMPLE function: gimple gimple_build_resx (int region)
     Build a `GIMPLE_RESX' statement which is a statement.  This
     statement is a placeholder for _Unwind_Resume before we know if a
     function call or a branch is needed.  `REGION' is the exception
     region from which control is flowing.

 -- GIMPLE function: int gimple_resx_region (gimple g)
     Return the region number for `GIMPLE_RESX' `G'.

 -- GIMPLE function: void gimple_resx_set_region (gimple g, int region)
     Set `REGION' to be the region number for `GIMPLE_RESX' `G'.


File: gccint.info,  Node: `GIMPLE_RETURN',  Next: `GIMPLE_SWITCH',  Prev: `GIMPLE_RESX',  Up: Tuple specific accessors

12.7.25 `GIMPLE_RETURN'
-----------------------

 -- GIMPLE function: gimple gimple_build_return (tree retval)
     Build a `GIMPLE_RETURN' statement whose return value is retval.

 -- GIMPLE function: tree gimple_return_retval (gimple g)
     Return the return value for `GIMPLE_RETURN' `G'.

 -- GIMPLE function: void gimple_return_set_retval (gimple g, tree
          retval)
     Set `RETVAL' to be the return value for `GIMPLE_RETURN' `G'.


File: gccint.info,  Node: `GIMPLE_SWITCH',  Next: `GIMPLE_TRY',  Prev: `GIMPLE_RETURN',  Up: Tuple specific accessors

12.7.26 `GIMPLE_SWITCH'
-----------------------

 -- GIMPLE function: gimple gimple_build_switch (tree index, tree
          default_label, `VEC'(tree,heap) *args)
     Build a `GIMPLE_SWITCH' statement.  `INDEX' is the index variable
     to switch on, and `DEFAULT_LABEL' represents the default label.
     `ARGS' is a vector of `CASE_LABEL_EXPR' trees that contain the
     non-default case labels.  Each label is a tree of code
     `CASE_LABEL_EXPR'.

 -- GIMPLE function: unsigned gimple_switch_num_labels (gimple g)
     Return the number of labels associated with the switch statement
     `G'.

 -- GIMPLE function: void gimple_switch_set_num_labels (gimple g,
          unsigned nlabels)
     Set `NLABELS' to be the number of labels for the switch statement
     `G'.

 -- GIMPLE function: tree gimple_switch_index (gimple g)
     Return the index variable used by the switch statement `G'.

 -- GIMPLE function: void gimple_switch_set_index (gimple g, tree index)
     Set `INDEX' to be the index variable for switch statement `G'.

 -- GIMPLE function: tree gimple_switch_label (gimple g, unsigned index)
     Return the label numbered `INDEX'. The default label is 0, followed
     by any labels in a switch statement.

 -- GIMPLE function: void gimple_switch_set_label (gimple g, unsigned
          index, tree label)
     Set the label number `INDEX' to `LABEL'. 0 is always the default
     label.

 -- GIMPLE function: tree gimple_switch_default_label (gimple g)
     Return the default label for a switch statement.

 -- GIMPLE function: void gimple_switch_set_default_label (gimple g,
          tree label)
     Set the default label for a switch statement.


File: gccint.info,  Node: `GIMPLE_TRY',  Next: `GIMPLE_WITH_CLEANUP_EXPR',  Prev: `GIMPLE_SWITCH',  Up: Tuple specific accessors

12.7.27 `GIMPLE_TRY'
--------------------

 -- GIMPLE function: gimple gimple_build_try (gimple_seq eval,
          gimple_seq cleanup, unsigned int kind)
     Build a `GIMPLE_TRY' statement.  `EVAL' is a sequence with the
     expression to evaluate.  `CLEANUP' is a sequence of statements to
     run at clean-up time.  `KIND' is the enumeration value
     `GIMPLE_TRY_CATCH' if this statement denotes a try/catch construct
     or `GIMPLE_TRY_FINALLY' if this statement denotes a try/finally
     construct.

 -- GIMPLE function: enum gimple_try_flags gimple_try_kind (gimple g)
     Return the kind of try block represented by `GIMPLE_TRY' `G'. This
     is either `GIMPLE_TRY_CATCH' or `GIMPLE_TRY_FINALLY'.

 -- GIMPLE function: bool gimple_try_catch_is_cleanup (gimple g)
     Return the `GIMPLE_TRY_CATCH_IS_CLEANUP' flag.

 -- GIMPLE function: gimple_seq gimple_try_eval (gimple g)
     Return the sequence of statements used as the body for `GIMPLE_TRY'
     `G'.

 -- GIMPLE function: gimple_seq gimple_try_cleanup (gimple g)
     Return the sequence of statements used as the cleanup body for
     `GIMPLE_TRY' `G'.

 -- GIMPLE function: void gimple_try_set_catch_is_cleanup (gimple g,
          bool catch_is_cleanup)
     Set the `GIMPLE_TRY_CATCH_IS_CLEANUP' flag.

 -- GIMPLE function: void gimple_try_set_eval (gimple g, gimple_seq
          eval)
     Set `EVAL' to be the sequence of statements to use as the body for
     `GIMPLE_TRY' `G'.

 -- GIMPLE function: void gimple_try_set_cleanup (gimple g, gimple_seq
          cleanup)
     Set `CLEANUP' to be the sequence of statements to use as the
     cleanup body for `GIMPLE_TRY' `G'.


File: gccint.info,  Node: `GIMPLE_WITH_CLEANUP_EXPR',  Prev: `GIMPLE_TRY',  Up: Tuple specific accessors

12.7.28 `GIMPLE_WITH_CLEANUP_EXPR'
----------------------------------

 -- GIMPLE function: gimple gimple_build_wce (gimple_seq cleanup)
     Build a `GIMPLE_WITH_CLEANUP_EXPR' statement.  `CLEANUP' is the
     clean-up expression.

 -- GIMPLE function: gimple_seq gimple_wce_cleanup (gimple g)
     Return the cleanup sequence for cleanup statement `G'.

 -- GIMPLE function: void gimple_wce_set_cleanup (gimple g, gimple_seq
          cleanup)
     Set `CLEANUP' to be the cleanup sequence for `G'.

 -- GIMPLE function: bool gimple_wce_cleanup_eh_only (gimple g)
     Return the `CLEANUP_EH_ONLY' flag for a `WCE' tuple.

 -- GIMPLE function: void gimple_wce_set_cleanup_eh_only (gimple g,
          bool eh_only_p)
     Set the `CLEANUP_EH_ONLY' flag for a `WCE' tuple.


File: gccint.info,  Node: GIMPLE sequences,  Next: Sequence iterators,  Prev: Tuple specific accessors,  Up: GIMPLE

12.8 GIMPLE sequences
=====================

GIMPLE sequences are the tuple equivalent of `STATEMENT_LIST''s used in
`GENERIC'.  They are used to chain statements together, and when used
in conjunction with sequence iterators, provide a framework for
iterating through statements.

 GIMPLE sequences are of type struct `gimple_sequence', but are more
commonly passed by reference to functions dealing with sequences.  The
type for a sequence pointer is `gimple_seq' which is the same as struct
`gimple_sequence' *.  When declaring a local sequence, you can define a
local variable of type struct `gimple_sequence'.  When declaring a
sequence allocated on the garbage collected heap, use the function
`gimple_seq_alloc' documented below.

 There are convenience functions for iterating through sequences in the
section entitled Sequence Iterators.

 Below is a list of functions to manipulate and query sequences.

 -- GIMPLE function: void gimple_seq_add_stmt (gimple_seq *seq, gimple
          g)
     Link a gimple statement to the end of the sequence *`SEQ' if `G' is
     not `NULL'.  If *`SEQ' is `NULL', allocate a sequence before
     linking.

 -- GIMPLE function: void gimple_seq_add_seq (gimple_seq *dest,
          gimple_seq src)
     Append sequence `SRC' to the end of sequence *`DEST' if `SRC' is
     not `NULL'.  If *`DEST' is `NULL', allocate a new sequence before
     appending.

 -- GIMPLE function: gimple_seq gimple_seq_deep_copy (gimple_seq src)
     Perform a deep copy of sequence `SRC' and return the result.

 -- GIMPLE function: gimple_seq gimple_seq_reverse (gimple_seq seq)
     Reverse the order of the statements in the sequence `SEQ'.  Return
     `SEQ'.

 -- GIMPLE function: gimple gimple_seq_first (gimple_seq s)
     Return the first statement in sequence `S'.

 -- GIMPLE function: gimple gimple_seq_last (gimple_seq s)
     Return the last statement in sequence `S'.

 -- GIMPLE function: void gimple_seq_set_last (gimple_seq s, gimple
          last)
     Set the last statement in sequence `S' to the statement in `LAST'.

 -- GIMPLE function: void gimple_seq_set_first (gimple_seq s, gimple
          first)
     Set the first statement in sequence `S' to the statement in
     `FIRST'.

 -- GIMPLE function: void gimple_seq_init (gimple_seq s)
     Initialize sequence `S' to an empty sequence.

 -- GIMPLE function: gimple_seq gimple_seq_alloc (void)
     Allocate a new sequence in the garbage collected store and return
     it.

 -- GIMPLE function: void gimple_seq_copy (gimple_seq dest, gimple_seq
          src)
     Copy the sequence `SRC' into the sequence `DEST'.

 -- GIMPLE function: bool gimple_seq_empty_p (gimple_seq s)
     Return true if the sequence `S' is empty.

 -- GIMPLE function: gimple_seq bb_seq (basic_block bb)
     Returns the sequence of statements in `BB'.

 -- GIMPLE function: void set_bb_seq (basic_block bb, gimple_seq seq)
     Sets the sequence of statements in `BB' to `SEQ'.

 -- GIMPLE function: bool gimple_seq_singleton_p (gimple_seq seq)
     Determine whether `SEQ' contains exactly one statement.


File: gccint.info,  Node: Sequence iterators,  Next: Adding a new GIMPLE statement code,  Prev: GIMPLE sequences,  Up: GIMPLE

12.9 Sequence iterators
=======================

Sequence iterators are convenience constructs for iterating through
statements in a sequence.  Given a sequence `SEQ', here is a typical
use of gimple sequence iterators:

     gimple_stmt_iterator gsi;

     for (gsi = gsi_start (seq); !gsi_end_p (gsi); gsi_next (&gsi))
       {
         gimple g = gsi_stmt (gsi);
         /* Do something with gimple statement `G'.  */
       }

 Backward iterations are possible:

             for (gsi = gsi_last (seq); !gsi_end_p (gsi); gsi_prev (&gsi))

 Forward and backward iterations on basic blocks are possible with
`gsi_start_bb' and `gsi_last_bb'.

 In the documentation below we sometimes refer to enum
`gsi_iterator_update'.  The valid options for this enumeration are:

   * `GSI_NEW_STMT' Only valid when a single statement is added.  Move
     the iterator to it.

   * `GSI_SAME_STMT' Leave the iterator at the same statement.

   * `GSI_CONTINUE_LINKING' Move iterator to whatever position is
     suitable for linking other statements in the same direction.

 Below is a list of the functions used to manipulate and use statement
iterators.

 -- GIMPLE function: gimple_stmt_iterator gsi_start (gimple_seq seq)
     Return a new iterator pointing to the sequence `SEQ''s first
     statement.  If `SEQ' is empty, the iterator's basic block is
     `NULL'.  Use `gsi_start_bb' instead when the iterator needs to
     always have the correct basic block set.

 -- GIMPLE function: gimple_stmt_iterator gsi_start_bb (basic_block bb)
     Return a new iterator pointing to the first statement in basic
     block `BB'.

 -- GIMPLE function: gimple_stmt_iterator gsi_last (gimple_seq seq)
     Return a new iterator initially pointing to the last statement of
     sequence `SEQ'.  If `SEQ' is empty, the iterator's basic block is
     `NULL'.  Use `gsi_last_bb' instead when the iterator needs to
     always have the correct basic block set.

 -- GIMPLE function: gimple_stmt_iterator gsi_last_bb (basic_block bb)
     Return a new iterator pointing to the last statement in basic
     block `BB'.

 -- GIMPLE function: bool gsi_end_p (gimple_stmt_iterator i)
     Return `TRUE' if at the end of `I'.

 -- GIMPLE function: bool gsi_one_before_end_p (gimple_stmt_iterator i)
     Return `TRUE' if we're one statement before the end of `I'.

 -- GIMPLE function: void gsi_next (gimple_stmt_iterator *i)
     Advance the iterator to the next gimple statement.

 -- GIMPLE function: void gsi_prev (gimple_stmt_iterator *i)
     Advance the iterator to the previous gimple statement.

 -- GIMPLE function: gimple gsi_stmt (gimple_stmt_iterator i)
     Return the current stmt.

 -- GIMPLE function: gimple_stmt_iterator gsi_after_labels (basic_block
          bb)
     Return a block statement iterator that points to the first
     non-label statement in block `BB'.

 -- GIMPLE function: gimple * gsi_stmt_ptr (gimple_stmt_iterator *i)
     Return a pointer to the current stmt.

 -- GIMPLE function: basic_block gsi_bb (gimple_stmt_iterator i)
     Return the basic block associated with this iterator.

 -- GIMPLE function: gimple_seq gsi_seq (gimple_stmt_iterator i)
     Return the sequence associated with this iterator.

 -- GIMPLE function: void gsi_remove (gimple_stmt_iterator *i, bool
          remove_eh_info)
     Remove the current stmt from the sequence.  The iterator is
     updated to point to the next statement.  When `REMOVE_EH_INFO' is
     true we remove the statement pointed to by iterator `I' from the
     `EH' tables.  Otherwise we do not modify the `EH' tables.
     Generally, `REMOVE_EH_INFO' should be true when the statement is
     going to be removed from the `IL' and not reinserted elsewhere.

 -- GIMPLE function: void gsi_link_seq_before (gimple_stmt_iterator *i,
          gimple_seq seq, enum gsi_iterator_update mode)
     Links the sequence of statements `SEQ' before the statement pointed
     by iterator `I'.  `MODE' indicates what to do with the iterator
     after insertion (see `enum gsi_iterator_update' above).

 -- GIMPLE function: void gsi_link_before (gimple_stmt_iterator *i,
          gimple g, enum gsi_iterator_update mode)
     Links statement `G' before the statement pointed-to by iterator
     `I'.  Updates iterator `I' according to `MODE'.

 -- GIMPLE function: void gsi_link_seq_after (gimple_stmt_iterator *i,
          gimple_seq seq, enum gsi_iterator_update mode)
     Links sequence `SEQ' after the statement pointed-to by iterator
     `I'.  `MODE' is as in `gsi_insert_after'.

 -- GIMPLE function: void gsi_link_after (gimple_stmt_iterator *i,
          gimple g, enum gsi_iterator_update mode)
     Links statement `G' after the statement pointed-to by iterator `I'.
     `MODE' is as in `gsi_insert_after'.

 -- GIMPLE function: gimple_seq gsi_split_seq_after
          (gimple_stmt_iterator i)
     Move all statements in the sequence after `I' to a new sequence.
     Return this new sequence.

 -- GIMPLE function: gimple_seq gsi_split_seq_before
          (gimple_stmt_iterator *i)
     Move all statements in the sequence before `I' to a new sequence.
     Return this new sequence.

 -- GIMPLE function: void gsi_replace (gimple_stmt_iterator *i, gimple
          stmt, bool update_eh_info)
     Replace the statement pointed-to by `I' to `STMT'.  If
     `UPDATE_EH_INFO' is true, the exception handling information of
     the original statement is moved to the new statement.

 -- GIMPLE function: void gsi_insert_before (gimple_stmt_iterator *i,
          gimple stmt, enum gsi_iterator_update mode)
     Insert statement `STMT' before the statement pointed-to by iterator
     `I', update `STMT''s basic block and scan it for new operands.
     `MODE' specifies how to update iterator `I' after insertion (see
     enum `gsi_iterator_update').

 -- GIMPLE function: void gsi_insert_seq_before (gimple_stmt_iterator
          *i, gimple_seq seq, enum gsi_iterator_update mode)
     Like `gsi_insert_before', but for all the statements in `SEQ'.

 -- GIMPLE function: void gsi_insert_after (gimple_stmt_iterator *i,
          gimple stmt, enum gsi_iterator_update mode)
     Insert statement `STMT' after the statement pointed-to by iterator
     `I', update `STMT''s basic block and scan it for new operands.
     `MODE' specifies how to update iterator `I' after insertion (see
     enum `gsi_iterator_update').

 -- GIMPLE function: void gsi_insert_seq_after (gimple_stmt_iterator
          *i, gimple_seq seq, enum gsi_iterator_update mode)
     Like `gsi_insert_after', but for all the statements in `SEQ'.

 -- GIMPLE function: gimple_stmt_iterator gsi_for_stmt (gimple stmt)
     Finds iterator for `STMT'.

 -- GIMPLE function: void gsi_move_after (gimple_stmt_iterator *from,
          gimple_stmt_iterator *to)
     Move the statement at `FROM' so it comes right after the statement
     at `TO'.

 -- GIMPLE function: void gsi_move_before (gimple_stmt_iterator *from,
          gimple_stmt_iterator *to)
     Move the statement at `FROM' so it comes right before the statement
     at `TO'.

 -- GIMPLE function: void gsi_move_to_bb_end (gimple_stmt_iterator
          *from, basic_block bb)
     Move the statement at `FROM' to the end of basic block `BB'.

 -- GIMPLE function: void gsi_insert_on_edge (edge e, gimple stmt)
     Add `STMT' to the pending list of edge `E'.  No actual insertion is
     made until a call to `gsi_commit_edge_inserts'() is made.

 -- GIMPLE function: void gsi_insert_seq_on_edge (edge e, gimple_seq
          seq)
     Add the sequence of statements in `SEQ' to the pending list of edge
     `E'.  No actual insertion is made until a call to
     `gsi_commit_edge_inserts'() is made.

 -- GIMPLE function: basic_block gsi_insert_on_edge_immediate (edge e,
          gimple stmt)
     Similar to `gsi_insert_on_edge'+`gsi_commit_edge_inserts'.  If a
     new block has to be created, it is returned.

 -- GIMPLE function: void gsi_commit_one_edge_insert (edge e,
          basic_block *new_bb)
     Commit insertions pending at edge `E'.  If a new block is created,
     set `NEW_BB' to this block, otherwise set it to `NULL'.

 -- GIMPLE function: void gsi_commit_edge_inserts (void)
     This routine will commit all pending edge insertions, creating any
     new basic blocks which are necessary.


File: gccint.info,  Node: Adding a new GIMPLE statement code,  Next: Statement and operand traversals,  Prev: Sequence iterators,  Up: GIMPLE

12.10 Adding a new GIMPLE statement code
========================================

The first step in adding a new GIMPLE statement code, is modifying the
file `gimple.def', which contains all the GIMPLE codes.  Then you must
add a corresponding structure, and an entry in `union
gimple_statement_d', both of which are located in `gimple.h'.  This in
turn, will require you to add a corresponding `GTY' tag in
`gsstruct.def', and code to handle this tag in `gss_for_code' which is
located in `gimple.c'.

 In order for the garbage collector to know the size of the structure
you created in `gimple.h', you need to add a case to handle your new
GIMPLE statement in `gimple_size' which is located in `gimple.c'.

 You will probably want to create a function to build the new gimple
statement in `gimple.c'.  The function should be called
`gimple_build_NEW-TUPLE-NAME', and should return the new tuple of type
gimple.

 If your new statement requires accessors for any members or operands
it may have, put simple inline accessors in `gimple.h' and any
non-trivial accessors in `gimple.c' with a corresponding prototype in
`gimple.h'.


File: gccint.info,  Node: Statement and operand traversals,  Prev: Adding a new GIMPLE statement code,  Up: GIMPLE

12.11 Statement and operand traversals
======================================

There are two functions available for walking statements and sequences:
`walk_gimple_stmt' and `walk_gimple_seq', accordingly, and a third
function for walking the operands in a statement: `walk_gimple_op'.

 -- GIMPLE function: tree walk_gimple_stmt (gimple_stmt_iterator *gsi,
          walk_stmt_fn callback_stmt, walk_tree_fn callback_op, struct
          walk_stmt_info *wi)
     This function is used to walk the current statement in `GSI',
     optionally using traversal state stored in `WI'.  If `WI' is
     `NULL', no state is kept during the traversal.

     The callback `CALLBACK_STMT' is called.  If `CALLBACK_STMT' returns
     true, it means that the callback function has handled all the
     operands of the statement and it is not necessary to walk its
     operands.

     If `CALLBACK_STMT' is `NULL' or it returns false, `CALLBACK_OP' is
     called on each operand of the statement via `walk_gimple_op'.  If
     `walk_gimple_op' returns non-`NULL' for any operand, the remaining
     operands are not scanned.

     The return value is that returned by the last call to
     `walk_gimple_op', or `NULL_TREE' if no `CALLBACK_OP' is specified.

 -- GIMPLE function: tree walk_gimple_op (gimple stmt, walk_tree_fn
          callback_op, struct walk_stmt_info *wi)
     Use this function to walk the operands of statement `STMT'.  Every
     operand is walked via `walk_tree' with optional state information
     in `WI'.

     `CALLBACK_OP' is called on each operand of `STMT' via `walk_tree'.
     Additional parameters to `walk_tree' must be stored in `WI'.  For
     each operand `OP', `walk_tree' is called as:

          walk_tree (&`OP', `CALLBACK_OP', `WI', `PSET')

     If `CALLBACK_OP' returns non-`NULL' for an operand, the remaining
     operands are not scanned.  The return value is that returned by
     the last call to `walk_tree', or `NULL_TREE' if no `CALLBACK_OP' is
     specified.

 -- GIMPLE function: tree walk_gimple_seq (gimple_seq seq, walk_stmt_fn
          callback_stmt, walk_tree_fn callback_op, struct
          walk_stmt_info *wi)
     This function walks all the statements in the sequence `SEQ'
     calling `walk_gimple_stmt' on each one.  `WI' is as in
     `walk_gimple_stmt'.  If `walk_gimple_stmt' returns non-`NULL', the
     walk is stopped and the value returned.  Otherwise, all the
     statements are walked and `NULL_TREE' returned.


File: gccint.info,  Node: Tree SSA,  Next: RTL,  Prev: GIMPLE,  Up: Top

13 Analysis and Optimization of GIMPLE tuples
*********************************************

GCC uses three main intermediate languages to represent the program
during compilation: GENERIC, GIMPLE and RTL.  GENERIC is a
language-independent representation generated by each front end.  It is
used to serve as an interface between the parser and optimizer.
GENERIC is a common representation that is able to represent programs
written in all the languages supported by GCC.

 GIMPLE and RTL are used to optimize the program.  GIMPLE is used for
target and language independent optimizations (e.g., inlining, constant
propagation, tail call elimination, redundancy elimination, etc).  Much
like GENERIC, GIMPLE is a language independent, tree based
representation.  However, it differs from GENERIC in that the GIMPLE
grammar is more restrictive: expressions contain no more than 3
operands (except function calls), it has no control flow structures and
expressions with side-effects are only allowed on the right hand side
of assignments.  See the chapter describing GENERIC and GIMPLE for more
details.

 This chapter describes the data structures and functions used in the
GIMPLE optimizers (also known as "tree optimizers" or "middle end").
In particular, it focuses on all the macros, data structures, functions
and programming constructs needed to implement optimization passes for
GIMPLE.

* Menu:

* Annotations::         Attributes for variables.
* SSA Operands::        SSA names referenced by GIMPLE statements.
* SSA::                 Static Single Assignment representation.
* Alias analysis::      Representing aliased loads and stores.
* Memory model::        Memory model used by the middle-end.


File: gccint.info,  Node: Annotations,  Next: SSA Operands,  Up: Tree SSA

13.1 Annotations
================

The optimizers need to associate attributes with variables during the
optimization process.  For instance, we need to know whether a variable
has aliases.  All these attributes are stored in data structures called
annotations which are then linked to the field `ann' in `struct
tree_common'.

 Presently, we define annotations for variables (`var_ann_t').
Annotations are defined and documented in `tree-flow.h'.


File: gccint.info,  Node: SSA Operands,  Next: SSA,  Prev: Annotations,  Up: Tree SSA

13.2 SSA Operands
=================

Almost every GIMPLE statement will contain a reference to a variable or
memory location.  Since statements come in different shapes and sizes,
their operands are going to be located at various spots inside the
statement's tree.  To facilitate access to the statement's operands,
they are organized into lists associated inside each statement's
annotation.  Each element in an operand list is a pointer to a
`VAR_DECL', `PARM_DECL' or `SSA_NAME' tree node.  This provides a very
convenient way of examining and replacing operands.

 Data flow analysis and optimization is done on all tree nodes
representing variables.  Any node for which `SSA_VAR_P' returns nonzero
is considered when scanning statement operands.  However, not all
`SSA_VAR_P' variables are processed in the same way.  For the purposes
of optimization, we need to distinguish between references to local
scalar variables and references to globals, statics, structures,
arrays, aliased variables, etc.  The reason is simple, the compiler can
gather complete data flow information for a local scalar.  On the other
hand, a global variable may be modified by a function call, it may not
be possible to keep track of all the elements of an array or the fields
of a structure, etc.

 The operand scanner gathers two kinds of operands: "real" and
"virtual".  An operand for which `is_gimple_reg' returns true is
considered real, otherwise it is a virtual operand.  We also
distinguish between uses and definitions.  An operand is used if its
value is loaded by the statement (e.g., the operand at the RHS of an
assignment).  If the statement assigns a new value to the operand, the
operand is considered a definition (e.g., the operand at the LHS of an
assignment).

 Virtual and real operands also have very different data flow
properties.  Real operands are unambiguous references to the full
object that they represent.  For instance, given

     {
       int a, b;
       a = b
     }

 Since `a' and `b' are non-aliased locals, the statement `a = b' will
have one real definition and one real use because variable `a' is
completely modified with the contents of variable `b'.  Real definition
are also known as "killing definitions".  Similarly, the use of `b'
reads all its bits.

 In contrast, virtual operands are used with variables that can have a
partial or ambiguous reference.  This includes structures, arrays,
globals, and aliased variables.  In these cases, we have two types of
definitions.  For globals, structures, and arrays, we can determine from
a statement whether a variable of these types has a killing definition.
If the variable does, then the statement is marked as having a "must
definition" of that variable.  However, if a statement is only defining
a part of the variable (i.e. a field in a structure), or if we know
that a statement might define the variable but we cannot say for sure,
then we mark that statement as having a "may definition".  For
instance, given

     {
       int a, b, *p;

       if (...)
         p = &a;
       else
         p = &b;
       *p = 5;
       return *p;
     }

 The assignment `*p = 5' may be a definition of `a' or `b'.  If we
cannot determine statically where `p' is pointing to at the time of the
store operation, we create virtual definitions to mark that statement
as a potential definition site for `a' and `b'.  Memory loads are
similarly marked with virtual use operands.  Virtual operands are shown
in tree dumps right before the statement that contains them.  To
request a tree dump with virtual operands, use the `-vops' option to
`-fdump-tree':

     {
       int a, b, *p;

       if (...)
         p = &a;
       else
         p = &b;
       # a = VDEF <a>
       # b = VDEF <b>
       *p = 5;

       # VUSE <a>
       # VUSE <b>
       return *p;
     }

 Notice that `VDEF' operands have two copies of the referenced
variable.  This indicates that this is not a killing definition of that
variable.  In this case we refer to it as a "may definition" or
"aliased store".  The presence of the second copy of the variable in
the `VDEF' operand will become important when the function is converted
into SSA form.  This will be used to link all the non-killing
definitions to prevent optimizations from making incorrect assumptions
about them.

 Operands are updated as soon as the statement is finished via a call
to `update_stmt'.  If statement elements are changed via `SET_USE' or
`SET_DEF', then no further action is required (i.e., those macros take
care of updating the statement).  If changes are made by manipulating
the statement's tree directly, then a call must be made to
`update_stmt' when complete.  Calling one of the `bsi_insert' routines
or `bsi_replace' performs an implicit call to `update_stmt'.

13.2.1 Operand Iterators And Access Routines
--------------------------------------------

Operands are collected by `tree-ssa-operands.c'.  They are stored
inside each statement's annotation and can be accessed through either
the operand iterators or an access routine.

 The following access routines are available for examining operands:

  1. `SINGLE_SSA_{USE,DEF,TREE}_OPERAND': These accessors will return
     NULL unless there is exactly one operand matching the specified
     flags.  If there is exactly one operand, the operand is returned
     as either a `tree', `def_operand_p', or `use_operand_p'.

          tree t = SINGLE_SSA_TREE_OPERAND (stmt, flags);
          use_operand_p u = SINGLE_SSA_USE_OPERAND (stmt, SSA_ALL_VIRTUAL_USES);
          def_operand_p d = SINGLE_SSA_DEF_OPERAND (stmt, SSA_OP_ALL_DEFS);

  2. `ZERO_SSA_OPERANDS': This macro returns true if there are no
     operands matching the specified flags.

          if (ZERO_SSA_OPERANDS (stmt, SSA_OP_ALL_VIRTUALS))
            return;

  3. `NUM_SSA_OPERANDS': This macro Returns the number of operands
     matching 'flags'.  This actually executes a loop to perform the
     count, so only use this if it is really needed.

          int count = NUM_SSA_OPERANDS (stmt, flags)

 If you wish to iterate over some or all operands, use the
`FOR_EACH_SSA_{USE,DEF,TREE}_OPERAND' iterator.  For example, to print
all the operands for a statement:

     void
     print_ops (tree stmt)
     {
       ssa_op_iter;
       tree var;

       FOR_EACH_SSA_TREE_OPERAND (var, stmt, iter, SSA_OP_ALL_OPERANDS)
         print_generic_expr (stderr, var, TDF_SLIM);
     }

 How to choose the appropriate iterator:

  1. Determine whether you are need to see the operand pointers, or
     just the trees, and choose the appropriate macro:

          Need            Macro:
          ----            -------
          use_operand_p   FOR_EACH_SSA_USE_OPERAND
          def_operand_p   FOR_EACH_SSA_DEF_OPERAND
          tree            FOR_EACH_SSA_TREE_OPERAND

  2. You need to declare a variable of the type you are interested in,
     and an ssa_op_iter structure which serves as the loop controlling
     variable.

  3. Determine which operands you wish to use, and specify the flags of
     those you are interested in.  They are documented in
     `tree-ssa-operands.h':

          #define SSA_OP_USE              0x01    /* Real USE operands.  */
          #define SSA_OP_DEF              0x02    /* Real DEF operands.  */
          #define SSA_OP_VUSE             0x04    /* VUSE operands.  */
          #define SSA_OP_VMAYUSE          0x08    /* USE portion of VDEFS.  */
          #define SSA_OP_VDEF             0x10    /* DEF portion of VDEFS.  */

          /* These are commonly grouped operand flags.  */
          #define SSA_OP_VIRTUAL_USES     (SSA_OP_VUSE | SSA_OP_VMAYUSE)
          #define SSA_OP_VIRTUAL_DEFS     (SSA_OP_VDEF)
          #define SSA_OP_ALL_USES         (SSA_OP_VIRTUAL_USES | SSA_OP_USE)
          #define SSA_OP_ALL_DEFS         (SSA_OP_VIRTUAL_DEFS | SSA_OP_DEF)
          #define SSA_OP_ALL_OPERANDS     (SSA_OP_ALL_USES | SSA_OP_ALL_DEFS)

 So if you want to look at the use pointers for all the `USE' and
`VUSE' operands, you would do something like:

       use_operand_p use_p;
       ssa_op_iter iter;

       FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, (SSA_OP_USE | SSA_OP_VUSE))
         {
           process_use_ptr (use_p);
         }

 The `TREE' macro is basically the same as the `USE' and `DEF' macros,
only with the use or def dereferenced via `USE_FROM_PTR (use_p)' and
`DEF_FROM_PTR (def_p)'.  Since we aren't using operand pointers, use
and defs flags can be mixed.

       tree var;
       ssa_op_iter iter;

       FOR_EACH_SSA_TREE_OPERAND (var, stmt, iter, SSA_OP_VUSE)
         {
            print_generic_expr (stderr, var, TDF_SLIM);
         }

 `VDEF's are broken into two flags, one for the `DEF' portion
(`SSA_OP_VDEF') and one for the USE portion (`SSA_OP_VMAYUSE').  If all
you want to look at are the `VDEF's together, there is a fourth
iterator macro for this, which returns both a def_operand_p and a
use_operand_p for each `VDEF' in the statement.  Note that you don't
need any flags for this one.

       use_operand_p use_p;
       def_operand_p def_p;
       ssa_op_iter iter;

       FOR_EACH_SSA_MAYDEF_OPERAND (def_p, use_p, stmt, iter)
         {
           my_code;
         }

 There are many examples in the code as well, as well as the
documentation in `tree-ssa-operands.h'.

 There are also a couple of variants on the stmt iterators regarding PHI
nodes.

 `FOR_EACH_PHI_ARG' Works exactly like `FOR_EACH_SSA_USE_OPERAND',
except it works over `PHI' arguments instead of statement operands.

     /* Look at every virtual PHI use.  */
     FOR_EACH_PHI_ARG (use_p, phi_stmt, iter, SSA_OP_VIRTUAL_USES)
     {
        my_code;
     }

     /* Look at every real PHI use.  */
     FOR_EACH_PHI_ARG (use_p, phi_stmt, iter, SSA_OP_USES)
       my_code;

     /* Look at every PHI use.  */
     FOR_EACH_PHI_ARG (use_p, phi_stmt, iter, SSA_OP_ALL_USES)
       my_code;

 `FOR_EACH_PHI_OR_STMT_{USE,DEF}' works exactly like
`FOR_EACH_SSA_{USE,DEF}_OPERAND', except it will function on either a
statement or a `PHI' node.  These should be used when it is appropriate
but they are not quite as efficient as the individual `FOR_EACH_PHI'
and `FOR_EACH_SSA' routines.

     FOR_EACH_PHI_OR_STMT_USE (use_operand_p, stmt, iter, flags)
       {
          my_code;
       }

     FOR_EACH_PHI_OR_STMT_DEF (def_operand_p, phi, iter, flags)
       {
          my_code;
       }

13.2.2 Immediate Uses
---------------------

Immediate use information is now always available.  Using the immediate
use iterators, you may examine every use of any `SSA_NAME'. For
instance, to change each use of `ssa_var' to `ssa_var2' and call
fold_stmt on each stmt after that is done:

       use_operand_p imm_use_p;
       imm_use_iterator iterator;
       tree ssa_var, stmt;


       FOR_EACH_IMM_USE_STMT (stmt, iterator, ssa_var)
         {
           FOR_EACH_IMM_USE_ON_STMT (imm_use_p, iterator)
             SET_USE (imm_use_p, ssa_var_2);
           fold_stmt (stmt);
         }

 There are 2 iterators which can be used. `FOR_EACH_IMM_USE_FAST' is
used when the immediate uses are not changed, i.e., you are looking at
the uses, but not setting them.

 If they do get changed, then care must be taken that things are not
changed under the iterators, so use the `FOR_EACH_IMM_USE_STMT' and
`FOR_EACH_IMM_USE_ON_STMT' iterators.  They attempt to preserve the
sanity of the use list by moving all the uses for a statement into a
controlled position, and then iterating over those uses.  Then the
optimization can manipulate the stmt when all the uses have been
processed.  This is a little slower than the FAST version since it adds
a placeholder element and must sort through the list a bit for each
statement.  This placeholder element must be also be removed if the
loop is terminated early.  The macro `BREAK_FROM_IMM_USE_SAFE' is
provided to do this :

       FOR_EACH_IMM_USE_STMT (stmt, iterator, ssa_var)
         {
           if (stmt == last_stmt)
             BREAK_FROM_SAFE_IMM_USE (iter);

           FOR_EACH_IMM_USE_ON_STMT (imm_use_p, iterator)
             SET_USE (imm_use_p, ssa_var_2);
           fold_stmt (stmt);
         }

 There are checks in `verify_ssa' which verify that the immediate use
list is up to date, as well as checking that an optimization didn't
break from the loop without using this macro.  It is safe to simply
'break'; from a `FOR_EACH_IMM_USE_FAST' traverse.

 Some useful functions and macros:
  1. `has_zero_uses (ssa_var)' : Returns true if there are no uses of
     `ssa_var'.

  2. `has_single_use (ssa_var)' : Returns true if there is only a
     single use of `ssa_var'.

  3. `single_imm_use (ssa_var, use_operand_p *ptr, tree *stmt)' :
     Returns true if there is only a single use of `ssa_var', and also
     returns the use pointer and statement it occurs in, in the second
     and third parameters.

  4. `num_imm_uses (ssa_var)' : Returns the number of immediate uses of
     `ssa_var'. It is better not to use this if possible since it simply
     utilizes a loop to count the uses.

  5. `PHI_ARG_INDEX_FROM_USE (use_p)' : Given a use within a `PHI'
     node, return the index number for the use.  An assert is triggered
     if the use isn't located in a `PHI' node.

  6. `USE_STMT (use_p)' : Return the statement a use occurs in.

 Note that uses are not put into an immediate use list until their
statement is actually inserted into the instruction stream via a
`bsi_*' routine.

 It is also still possible to utilize lazy updating of statements, but
this should be used only when absolutely required.  Both alias analysis
and the dominator optimizations currently do this.

 When lazy updating is being used, the immediate use information is out
of date and cannot be used reliably.  Lazy updating is achieved by
simply marking statements modified via calls to `mark_stmt_modified'
instead of `update_stmt'.  When lazy updating is no longer required,
all the modified statements must have `update_stmt' called in order to
bring them up to date.  This must be done before the optimization is
finished, or `verify_ssa' will trigger an abort.

 This is done with a simple loop over the instruction stream:
       block_stmt_iterator bsi;
       basic_block bb;
       FOR_EACH_BB (bb)
         {
           for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
             update_stmt_if_modified (bsi_stmt (bsi));
         }


File: gccint.info,  Node: SSA,  Next: Alias analysis,  Prev: SSA Operands,  Up: Tree SSA

13.3 Static Single Assignment
=============================

Most of the tree optimizers rely on the data flow information provided
by the Static Single Assignment (SSA) form.  We implement the SSA form
as described in `R. Cytron, J. Ferrante, B. Rosen, M. Wegman, and K.
Zadeck.  Efficiently Computing Static Single Assignment Form and the
Control Dependence Graph.  ACM Transactions on Programming Languages
and Systems, 13(4):451-490, October 1991'.

 The SSA form is based on the premise that program variables are
assigned in exactly one location in the program.  Multiple assignments
to the same variable create new versions of that variable.  Naturally,
actual programs are seldom in SSA form initially because variables tend
to be assigned multiple times.  The compiler modifies the program
representation so that every time a variable is assigned in the code, a
new version of the variable is created.  Different versions of the same
variable are distinguished by subscripting the variable name with its
version number.  Variables used in the right-hand side of expressions
are renamed so that their version number matches that of the most
recent assignment.

 We represent variable versions using `SSA_NAME' nodes.  The renaming
process in `tree-ssa.c' wraps every real and virtual operand with an
`SSA_NAME' node which contains the version number and the statement
that created the `SSA_NAME'.  Only definitions and virtual definitions
may create new `SSA_NAME' nodes.

 Sometimes, flow of control makes it impossible to determine the most
recent version of a variable.  In these cases, the compiler inserts an
artificial definition for that variable called "PHI function" or "PHI
node".  This new definition merges all the incoming versions of the
variable to create a new name for it.  For instance,

     if (...)
       a_1 = 5;
     else if (...)
       a_2 = 2;
     else
       a_3 = 13;

     # a_4 = PHI <a_1, a_2, a_3>
     return a_4;

 Since it is not possible to determine which of the three branches will
be taken at runtime, we don't know which of `a_1', `a_2' or `a_3' to
use at the return statement.  So, the SSA renamer creates a new version
`a_4' which is assigned the result of "merging" `a_1', `a_2' and `a_3'.
Hence, PHI nodes mean "one of these operands.  I don't know which".

 The following macros can be used to examine PHI nodes

 -- Macro: PHI_RESULT (PHI)
     Returns the `SSA_NAME' created by PHI node PHI (i.e., PHI's LHS).

 -- Macro: PHI_NUM_ARGS (PHI)
     Returns the number of arguments in PHI.  This number is exactly
     the number of incoming edges to the basic block holding PHI.

 -- Macro: PHI_ARG_ELT (PHI, I)
     Returns a tuple representing the Ith argument of PHI.  Each
     element of this tuple contains an `SSA_NAME' VAR and the incoming
     edge through which VAR flows.

 -- Macro: PHI_ARG_EDGE (PHI, I)
     Returns the incoming edge for the Ith argument of PHI.

 -- Macro: PHI_ARG_DEF (PHI, I)
     Returns the `SSA_NAME' for the Ith argument of PHI.

13.3.1 Preserving the SSA form
------------------------------

Some optimization passes make changes to the function that invalidate
the SSA property.  This can happen when a pass has added new symbols or
changed the program so that variables that were previously aliased
aren't anymore.  Whenever something like this happens, the affected
symbols must be renamed into SSA form again.  Transformations that emit
new code or replicate existing statements will also need to update the
SSA form.

 Since GCC implements two different SSA forms for register and virtual
variables, keeping the SSA form up to date depends on whether you are
updating register or virtual names.  In both cases, the general idea
behind incremental SSA updates is similar: when new SSA names are
created, they typically are meant to replace other existing names in
the program.

 For instance, given the following code:

          1  L0:
          2  x_1 = PHI (0, x_5)
          3  if (x_1 < 10)
          4    if (x_1 > 7)
          5      y_2 = 0
          6    else
          7      y_3 = x_1 + x_7
          8    endif
          9    x_5 = x_1 + 1
          10   goto L0;
          11 endif

 Suppose that we insert new names `x_10' and `x_11' (lines `4' and `8').

          1  L0:
          2  x_1 = PHI (0, x_5)
          3  if (x_1 < 10)
          4    x_10 = ...
          5    if (x_1 > 7)
          6      y_2 = 0
          7    else
          8      x_11 = ...
          9      y_3 = x_1 + x_7
          10   endif
          11   x_5 = x_1 + 1
          12   goto L0;
          13 endif

 We want to replace all the uses of `x_1' with the new definitions of
`x_10' and `x_11'.  Note that the only uses that should be replaced are
those at lines `5', `9' and `11'.  Also, the use of `x_7' at line `9'
should _not_ be replaced (this is why we cannot just mark symbol `x' for
renaming).

 Additionally, we may need to insert a PHI node at line `11' because
that is a merge point for `x_10' and `x_11'.  So the use of `x_1' at
line `11' will be replaced with the new PHI node.  The insertion of PHI
nodes is optional.  They are not strictly necessary to preserve the SSA
form, and depending on what the caller inserted, they may not even be
useful for the optimizers.

 Updating the SSA form is a two step process.  First, the pass has to
identify which names need to be updated and/or which symbols need to be
renamed into SSA form for the first time.  When new names are
introduced to replace existing names in the program, the mapping
between the old and the new names are registered by calling
`register_new_name_mapping' (note that if your pass creates new code by
duplicating basic blocks, the call to `tree_duplicate_bb' will set up
the necessary mappings automatically).

 After the replacement mappings have been registered and new symbols
marked for renaming, a call to `update_ssa' makes the registered
changes.  This can be done with an explicit call or by creating `TODO'
flags in the `tree_opt_pass' structure for your pass.  There are
several `TODO' flags that control the behavior of `update_ssa':

   * `TODO_update_ssa'.  Update the SSA form inserting PHI nodes for
     newly exposed symbols and virtual names marked for updating.  When
     updating real names, only insert PHI nodes for a real name `O_j'
     in blocks reached by all the new and old definitions for `O_j'.
     If the iterated dominance frontier for `O_j' is not pruned, we may
     end up inserting PHI nodes in blocks that have one or more edges
     with no incoming definition for `O_j'.  This would lead to
     uninitialized warnings for `O_j''s symbol.

   * `TODO_update_ssa_no_phi'.  Update the SSA form without inserting
     any new PHI nodes at all.  This is used by passes that have either
     inserted all the PHI nodes themselves or passes that need only to
     patch use-def and def-def chains for virtuals (e.g., DCE).

   * `TODO_update_ssa_full_phi'.  Insert PHI nodes everywhere they are
     needed.  No pruning of the IDF is done.  This is used by passes
     that need the PHI nodes for `O_j' even if it means that some
     arguments will come from the default definition of `O_j''s symbol
     (e.g., `pass_linear_transform').

     WARNING: If you need to use this flag, chances are that your pass
     may be doing something wrong.  Inserting PHI nodes for an old name
     where not all edges carry a new replacement may lead to silent
     codegen errors or spurious uninitialized warnings.

   * `TODO_update_ssa_only_virtuals'.  Passes that update the SSA form
     on their own may want to delegate the updating of virtual names to
     the generic updater.  Since FUD chains are easier to maintain,
     this simplifies the work they need to do.  NOTE: If this flag is
     used, any OLD->NEW mappings for real names are explicitly
     destroyed and only the symbols marked for renaming are processed.

13.3.2 Preserving the virtual SSA form
--------------------------------------

The virtual SSA form is harder to preserve than the non-virtual SSA form
mainly because the set of virtual operands for a statement may change at
what some would consider unexpected times.  In general, statement
modifications should be bracketed between calls to `push_stmt_changes'
and `pop_stmt_changes'.  For example,

         munge_stmt (tree stmt)
         {
            push_stmt_changes (&stmt);
            ... rewrite STMT ...
            pop_stmt_changes (&stmt);
         }

 The call to `push_stmt_changes' saves the current state of the
statement operands and the call to `pop_stmt_changes' compares the
saved state with the current one and does the appropriate symbol
marking for the SSA renamer.

 It is possible to modify several statements at a time, provided that
`push_stmt_changes' and `pop_stmt_changes' are called in LIFO order, as
when processing a stack of statements.

 Additionally, if the pass discovers that it did not need to make
changes to the statement after calling `push_stmt_changes', it can
simply discard the topmost change buffer by calling
`discard_stmt_changes'.  This will avoid the expensive operand re-scan
operation and the buffer comparison that determines if symbols need to
be marked for renaming.

13.3.3 Examining `SSA_NAME' nodes
---------------------------------

The following macros can be used to examine `SSA_NAME' nodes

 -- Macro: SSA_NAME_DEF_STMT (VAR)
     Returns the statement S that creates the `SSA_NAME' VAR.  If S is
     an empty statement (i.e., `IS_EMPTY_STMT (S)' returns `true'), it
     means that the first reference to this variable is a USE or a VUSE.

 -- Macro: SSA_NAME_VERSION (VAR)
     Returns the version number of the `SSA_NAME' object VAR.

13.3.4 Walking use-def chains
-----------------------------

 -- Tree SSA function: void walk_use_def_chains (VAR, FN, DATA)
     Walks use-def chains starting at the `SSA_NAME' node VAR.  Calls
     function FN at each reaching definition found.  Function FN takes
     three arguments: VAR, its defining statement (DEF_STMT) and a
     generic pointer to whatever state information that FN may want to
     maintain (DATA).  Function FN is able to stop the walk by
     returning `true', otherwise in order to continue the walk, FN
     should return `false'.

     Note, that if DEF_STMT is a `PHI' node, the semantics are slightly
     different.  For each argument ARG of the PHI node, this function
     will:

       1. Walk the use-def chains for ARG.

       2. Call `FN (ARG, PHI, DATA)'.

     Note how the first argument to FN is no longer the original
     variable VAR, but the PHI argument currently being examined.  If
     FN wants to get at VAR, it should call `PHI_RESULT' (PHI).

13.3.5 Walking the dominator tree
---------------------------------

 -- Tree SSA function: void walk_dominator_tree (WALK_DATA, BB)
     This function walks the dominator tree for the current CFG calling
     a set of callback functions defined in STRUCT DOM_WALK_DATA in
     `domwalk.h'.  The call back functions you need to define give you
     hooks to execute custom code at various points during traversal:

       1. Once to initialize any local data needed while processing BB
          and its children.  This local data is pushed into an internal
          stack which is automatically pushed and popped as the walker
          traverses the dominator tree.

       2. Once before traversing all the statements in the BB.

       3. Once for every statement inside BB.

       4. Once after traversing all the statements and before recursing
          into BB's dominator children.

       5. It then recurses into all the dominator children of BB.

       6. After recursing into all the dominator children of BB it can,
          optionally, traverse every statement in BB again (i.e.,
          repeating steps 2 and 3).

       7. Once after walking the statements in BB and BB's dominator
          children.  At this stage, the block local data stack is
          popped.


File: gccint.info,  Node: Alias analysis,  Next: Memory model,  Prev: SSA,  Up: Tree SSA

13.4 Alias analysis
===================

Alias analysis in GIMPLE SSA form consists of two pieces.  First the
virtual SSA web ties conflicting memory accesses and provides a SSA
use-def chain and SSA immediate-use chains for walking possibly
dependent memory accesses.  Second an alias-oracle can be queried to
disambiguate explicit and implicit memory references.

  1. Memory SSA form.

     All statements that may use memory have exactly one accompanied
     use of a virtual SSA name that represents the state of memory at
     the given point in the IL.

     All statements that may define memory have exactly one accompanied
     definition of a virtual SSA name using the previous state of memory
     and defining the new state of memory after the given point in the
     IL.

          int i;
          int foo (void)
          {
            # .MEM_3 = VDEF <.MEM_2(D)>
            i = 1;
            # VUSE <.MEM_3>
            return i;
          }

     The virtual SSA names in this case are `.MEM_2(D)' and `.MEM_3'.
     The store to the global variable `i' defines `.MEM_3' invalidating
     `.MEM_2(D)'.  The load from `i' uses that new state `.MEM_3'.

     The virtual SSA web serves as constraints to SSA optimizers
     preventing illegitimate code-motion and optimization.  It also
     provides a way to walk related memory statements.

  2. Points-to and escape analysis.

     Points-to analysis builds a set of constraints from the GIMPLE SSA
     IL representing all pointer operations and facts we do or do not
     know about pointers.  Solving this set of constraints yields a
     conservatively correct solution for each pointer variable in the
     program (though we are only interested in SSA name pointers) as to
     what it may possibly point to.

     This points-to solution for a given SSA name pointer is stored in
     the `pt_solution' sub-structure of the `SSA_NAME_PTR_INFO' record.
     The following accessor functions are available:

        * `pt_solution_includes'

        * `pt_solutions_intersect'

     Points-to analysis also computes the solution for two special set
     of pointers, `ESCAPED' and `CALLUSED'.  Those represent all memory
     that has escaped the scope of analysis or that is used by pure or
     nested const calls.

  3. Type-based alias analysis

     Type-based alias analysis is frontend dependent though generic
     support is provided by the middle-end in `alias.c'.  TBAA code is
     used by both tree optimizers and RTL optimizers.

     Every language that wishes to perform language-specific alias
     analysis should define a function that computes, given a `tree'
     node, an alias set for the node.  Nodes in different alias sets
     are not allowed to alias.  For an example, see the C front-end
     function `c_get_alias_set'.

  4. Tree alias-oracle

     The tree alias-oracle provides means to disambiguate two memory
     references and memory references against statements.  The following
     queries are available:

        * `refs_may_alias_p'

        * `ref_maybe_used_by_stmt_p'

        * `stmt_may_clobber_ref_p'

     In addition to those two kind of statement walkers are available
     walking statements related to a reference ref.
     `walk_non_aliased_vuses' walks over dominating memory defining
     statements and calls back if the statement does not clobber ref
     providing the non-aliased VUSE.  The walk stops at the first
     clobbering statement or if asked to.  `walk_aliased_vdefs' walks
     over dominating memory defining statements and calls back on each
     statement clobbering ref providing its aliasing VDEF.  The walk
     stops if asked to.



File: gccint.info,  Node: Memory model,  Prev: Alias analysis,  Up: Tree SSA

13.5 Memory model
=================

The memory model used by the middle-end models that of the C/C++
languages.  The middle-end has the notion of an effective type of a
memory region which is used for type-based alias analysis.

 The following is a refinement of ISO C99 6.5/6, clarifying the block
copy case to follow common sense and extending the concept of a dynamic
effective type to objects with a declared type as required for C++.

     The effective type of an object for an access to its stored value is
     the declared type of the object or the effective type determined by
     a previous store to it.  If a value is stored into an object through
     an lvalue having a type that is not a character type, then the
     type of the lvalue becomes the effective type of the object for that
     access and for subsequent accesses that do not modify the stored value.
     If a value is copied into an object using `memcpy' or `memmove',
     or is copied as an array of character type, then the effective type
     of the modified object for that access and for subsequent accesses that
     do not modify the value is undetermined.  For all other accesses to an
     object, the effective type of the object is simply the type of the
     lvalue used for the access.


File: gccint.info,  Node: Loop Analysis and Representation,  Next: Machine Desc,  Prev: Control Flow,  Up: Top

14 Analysis and Representation of Loops
***************************************

GCC provides extensive infrastructure for work with natural loops, i.e.,
strongly connected components of CFG with only one entry block.  This
chapter describes representation of loops in GCC, both on GIMPLE and in
RTL, as well as the interfaces to loop-related analyses (induction
variable analysis and number of iterations analysis).

* Menu:

* Loop representation::         Representation and analysis of loops.
* Loop querying::               Getting information about loops.
* Loop manipulation::           Loop manipulation functions.
* LCSSA::                       Loop-closed SSA form.
* Scalar evolutions::           Induction variables on GIMPLE.
* loop-iv::                     Induction variables on RTL.
* Number of iterations::        Number of iterations analysis.
* Dependency analysis::         Data dependency analysis.
* Lambda::                      Linear loop transformations framework.
* Omega::                       A solver for linear programming problems.


File: gccint.info,  Node: Loop representation,  Next: Loop querying,  Up: Loop Analysis and Representation

14.1 Loop representation
========================

This chapter describes the representation of loops in GCC, and functions
that can be used to build, modify and analyze this representation.  Most
of the interfaces and data structures are declared in `cfgloop.h'.  At
the moment, loop structures are analyzed and this information is
updated only by the optimization passes that deal with loops, but some
efforts are being made to make it available throughout most of the
optimization passes.

 In general, a natural loop has one entry block (header) and possibly
several back edges (latches) leading to the header from the inside of
the loop.  Loops with several latches may appear if several loops share
a single header, or if there is a branching in the middle of the loop.
The representation of loops in GCC however allows only loops with a
single latch.  During loop analysis, headers of such loops are split and
forwarder blocks are created in order to disambiguate their structures.
Heuristic based on profile information and structure of the induction
variables in the loops is used to determine whether the latches
correspond to sub-loops or to control flow in a single loop.  This means
that the analysis sometimes changes the CFG, and if you run it in the
middle of an optimization pass, you must be able to deal with the new
blocks.  You may avoid CFG changes by passing
`LOOPS_MAY_HAVE_MULTIPLE_LATCHES' flag to the loop discovery, note
however that most other loop manipulation functions will not work
correctly for loops with multiple latch edges (the functions that only
query membership of blocks to loops and subloop relationships, or
enumerate and test loop exits, can be expected to work).

 Body of the loop is the set of blocks that are dominated by its header,
and reachable from its latch against the direction of edges in CFG.  The
loops are organized in a containment hierarchy (tree) such that all the
loops immediately contained inside loop L are the children of L in the
tree.  This tree is represented by the `struct loops' structure.  The
root of this tree is a fake loop that contains all blocks in the
function.  Each of the loops is represented in a `struct loop'
structure.  Each loop is assigned an index (`num' field of the `struct
loop' structure), and the pointer to the loop is stored in the
corresponding field of the `larray' vector in the loops structure.  The
indices do not have to be continuous, there may be empty (`NULL')
entries in the `larray' created by deleting loops.  Also, there is no
guarantee on the relative order of a loop and its subloops in the
numbering.  The index of a loop never changes.

 The entries of the `larray' field should not be accessed directly.
The function `get_loop' returns the loop description for a loop with
the given index.  `number_of_loops' function returns number of loops in
the function.  To traverse all loops, use `FOR_EACH_LOOP' macro.  The
`flags' argument of the macro is used to determine the direction of
traversal and the set of loops visited.  Each loop is guaranteed to be
visited exactly once, regardless of the changes to the loop tree, and
the loops may be removed during the traversal.  The newly created loops
are never traversed, if they need to be visited, this must be done
separately after their creation.  The `FOR_EACH_LOOP' macro allocates
temporary variables.  If the `FOR_EACH_LOOP' loop were ended using
break or goto, they would not be released; `FOR_EACH_LOOP_BREAK' macro
must be used instead.

 Each basic block contains the reference to the innermost loop it
belongs to (`loop_father').  For this reason, it is only possible to
have one `struct loops' structure initialized at the same time for each
CFG.  The global variable `current_loops' contains the `struct loops'
structure.  Many of the loop manipulation functions assume that
dominance information is up-to-date.

 The loops are analyzed through `loop_optimizer_init' function.  The
argument of this function is a set of flags represented in an integer
bitmask.  These flags specify what other properties of the loop
structures should be calculated/enforced and preserved later:

   * `LOOPS_MAY_HAVE_MULTIPLE_LATCHES': If this flag is set, no changes
     to CFG will be performed in the loop analysis, in particular,
     loops with multiple latch edges will not be disambiguated.  If a
     loop has multiple latches, its latch block is set to NULL.  Most of
     the loop manipulation functions will not work for loops in this
     shape.  No other flags that require CFG changes can be passed to
     loop_optimizer_init.

   * `LOOPS_HAVE_PREHEADERS': Forwarder blocks are created in such a
     way that each loop has only one entry edge, and additionally, the
     source block of this entry edge has only one successor.  This
     creates a natural place where the code can be moved out of the
     loop, and ensures that the entry edge of the loop leads from its
     immediate super-loop.

   * `LOOPS_HAVE_SIMPLE_LATCHES': Forwarder blocks are created to force
     the latch block of each loop to have only one successor.  This
     ensures that the latch of the loop does not belong to any of its
     sub-loops, and makes manipulation with the loops significantly
     easier.  Most of the loop manipulation functions assume that the
     loops are in this shape.  Note that with this flag, the "normal"
     loop without any control flow inside and with one exit consists of
     two basic blocks.

   * `LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS': Basic blocks and edges in
     the strongly connected components that are not natural loops (have
     more than one entry block) are marked with `BB_IRREDUCIBLE_LOOP'
     and `EDGE_IRREDUCIBLE_LOOP' flags.  The flag is not set for blocks
     and edges that belong to natural loops that are in such an
     irreducible region (but it is set for the entry and exit edges of
     such a loop, if they lead to/from this region).

   * `LOOPS_HAVE_RECORDED_EXITS': The lists of exits are recorded and
     updated for each loop.  This makes some functions (e.g.,
     `get_loop_exit_edges') more efficient.  Some functions (e.g.,
     `single_exit') can be used only if the lists of exits are recorded.

 These properties may also be computed/enforced later, using functions
`create_preheaders', `force_single_succ_latches',
`mark_irreducible_loops' and `record_loop_exits'.

 The memory occupied by the loops structures should be freed with
`loop_optimizer_finalize' function.

 The CFG manipulation functions in general do not update loop
structures.  Specialized versions that additionally do so are provided
for the most common tasks.  On GIMPLE, `cleanup_tree_cfg_loop' function
can be used to cleanup CFG while updating the loops structures if
`current_loops' is set.


File: gccint.info,  Node: Loop querying,  Next: Loop manipulation,  Prev: Loop representation,  Up: Loop Analysis and Representation

14.2 Loop querying
==================

The functions to query the information about loops are declared in
`cfgloop.h'.  Some of the information can be taken directly from the
structures.  `loop_father' field of each basic block contains the
innermost loop to that the block belongs.  The most useful fields of
loop structure (that are kept up-to-date at all times) are:

   * `header', `latch': Header and latch basic blocks of the loop.

   * `num_nodes': Number of basic blocks in the loop (including the
     basic blocks of the sub-loops).

   * `depth': The depth of the loop in the loops tree, i.e., the number
     of super-loops of the loop.

   * `outer', `inner', `next': The super-loop, the first sub-loop, and
     the sibling of the loop in the loops tree.

 There are other fields in the loop structures, many of them used only
by some of the passes, or not updated during CFG changes; in general,
they should not be accessed directly.

 The most important functions to query loop structures are:

   * `flow_loops_dump': Dumps the information about loops to a file.

   * `verify_loop_structure': Checks consistency of the loop structures.

   * `loop_latch_edge': Returns the latch edge of a loop.

   * `loop_preheader_edge': If loops have preheaders, returns the
     preheader edge of a loop.

   * `flow_loop_nested_p': Tests whether loop is a sub-loop of another
     loop.

   * `flow_bb_inside_loop_p': Tests whether a basic block belongs to a
     loop (including its sub-loops).

   * `find_common_loop': Finds the common super-loop of two loops.

   * `superloop_at_depth': Returns the super-loop of a loop with the
     given depth.

   * `tree_num_loop_insns', `num_loop_insns': Estimates the number of
     insns in the loop, on GIMPLE and on RTL.

   * `loop_exit_edge_p': Tests whether edge is an exit from a loop.

   * `mark_loop_exit_edges': Marks all exit edges of all loops with
     `EDGE_LOOP_EXIT' flag.

   * `get_loop_body', `get_loop_body_in_dom_order',
     `get_loop_body_in_bfs_order': Enumerates the basic blocks in the
     loop in depth-first search order in reversed CFG, ordered by
     dominance relation, and breath-first search order, respectively.

   * `single_exit': Returns the single exit edge of the loop, or `NULL'
     if the loop has more than one exit.  You can only use this
     function if LOOPS_HAVE_MARKED_SINGLE_EXITS property is used.

   * `get_loop_exit_edges': Enumerates the exit edges of a loop.

   * `just_once_each_iteration_p': Returns true if the basic block is
     executed exactly once during each iteration of a loop (that is, it
     does not belong to a sub-loop, and it dominates the latch of the
     loop).


File: gccint.info,  Node: Loop manipulation,  Next: LCSSA,  Prev: Loop querying,  Up: Loop Analysis and Representation

14.3 Loop manipulation
======================

The loops tree can be manipulated using the following functions:

   * `flow_loop_tree_node_add': Adds a node to the tree.

   * `flow_loop_tree_node_remove': Removes a node from the tree.

   * `add_bb_to_loop': Adds a basic block to a loop.

   * `remove_bb_from_loops': Removes a basic block from loops.

 Most low-level CFG functions update loops automatically.  The following
functions handle some more complicated cases of CFG manipulations:

   * `remove_path': Removes an edge and all blocks it dominates.

   * `split_loop_exit_edge': Splits exit edge of the loop, ensuring
     that PHI node arguments remain in the loop (this ensures that
     loop-closed SSA form is preserved).  Only useful on GIMPLE.

 Finally, there are some higher-level loop transformations implemented.
While some of them are written so that they should work on non-innermost
loops, they are mostly untested in that case, and at the moment, they
are only reliable for the innermost loops:

   * `create_iv': Creates a new induction variable.  Only works on
     GIMPLE.  `standard_iv_increment_position' can be used to find a
     suitable place for the iv increment.

   * `duplicate_loop_to_header_edge',
     `tree_duplicate_loop_to_header_edge': These functions (on RTL and
     on GIMPLE) duplicate the body of the loop prescribed number of
     times on one of the edges entering loop header, thus performing
     either loop unrolling or loop peeling.  `can_duplicate_loop_p'
     (`can_unroll_loop_p' on GIMPLE) must be true for the duplicated
     loop.

   * `loop_version', `tree_ssa_loop_version': These function create a
     copy of a loop, and a branch before them that selects one of them
     depending on the prescribed condition.  This is useful for
     optimizations that need to verify some assumptions in runtime (one
     of the copies of the loop is usually left unchanged, while the
     other one is transformed in some way).

   * `tree_unroll_loop': Unrolls the loop, including peeling the extra
     iterations to make the number of iterations divisible by unroll
     factor, updating the exit condition, and removing the exits that
     now cannot be taken.  Works only on GIMPLE.


File: gccint.info,  Node: LCSSA,  Next: Scalar evolutions,  Prev: Loop manipulation,  Up: Loop Analysis and Representation

14.4 Loop-closed SSA form
=========================

Throughout the loop optimizations on tree level, one extra condition is
enforced on the SSA form:  No SSA name is used outside of the loop in
that it is defined.  The SSA form satisfying this condition is called
"loop-closed SSA form" - LCSSA.  To enforce LCSSA, PHI nodes must be
created at the exits of the loops for the SSA names that are used
outside of them.  Only the real operands (not virtual SSA names) are
held in LCSSA, in order to save memory.

 There are various benefits of LCSSA:

   * Many optimizations (value range analysis, final value replacement)
     are interested in the values that are defined in the loop and used
     outside of it, i.e., exactly those for that we create new PHI
     nodes.

   * In induction variable analysis, it is not necessary to specify the
     loop in that the analysis should be performed - the scalar
     evolution analysis always returns the results with respect to the
     loop in that the SSA name is defined.

   * It makes updating of SSA form during loop transformations simpler.
     Without LCSSA, operations like loop unrolling may force creation
     of PHI nodes arbitrarily far from the loop, while in LCSSA, the
     SSA form can be updated locally.  However, since we only keep real
     operands in LCSSA, we cannot use this advantage (we could have
     local updating of real operands, but it is not much more efficient
     than to use generic SSA form updating for it as well; the amount
     of changes to SSA is the same).

 However, it also means LCSSA must be updated.  This is usually
straightforward, unless you create a new value in loop and use it
outside, or unless you manipulate loop exit edges (functions are
provided to make these manipulations simple).
`rewrite_into_loop_closed_ssa' is used to rewrite SSA form to LCSSA,
and `verify_loop_closed_ssa' to check that the invariant of LCSSA is
preserved.


File: gccint.info,  Node: Scalar evolutions,  Next: loop-iv,  Prev: LCSSA,  Up: Loop Analysis and Representation

14.5 Scalar evolutions
======================

Scalar evolutions (SCEV) are used to represent results of induction
variable analysis on GIMPLE.  They enable us to represent variables with
complicated behavior in a simple and consistent way (we only use it to
express values of polynomial induction variables, but it is possible to
extend it).  The interfaces to SCEV analysis are declared in
`tree-scalar-evolution.h'.  To use scalar evolutions analysis,
`scev_initialize' must be used.  To stop using SCEV, `scev_finalize'
should be used.  SCEV analysis caches results in order to save time and
memory.  This cache however is made invalid by most of the loop
transformations, including removal of code.  If such a transformation
is performed, `scev_reset' must be called to clean the caches.

 Given an SSA name, its behavior in loops can be analyzed using the
`analyze_scalar_evolution' function.  The returned SCEV however does
not have to be fully analyzed and it may contain references to other
SSA names defined in the loop.  To resolve these (potentially
recursive) references, `instantiate_parameters' or `resolve_mixers'
functions must be used.  `instantiate_parameters' is useful when you
use the results of SCEV only for some analysis, and when you work with
whole nest of loops at once.  It will try replacing all SSA names by
their SCEV in all loops, including the super-loops of the current loop,
thus providing a complete information about the behavior of the
variable in the loop nest.  `resolve_mixers' is useful if you work with
only one loop at a time, and if you possibly need to create code based
on the value of the induction variable.  It will only resolve the SSA
names defined in the current loop, leaving the SSA names defined
outside unchanged, even if their evolution in the outer loops is known.

 The SCEV is a normal tree expression, except for the fact that it may
contain several special tree nodes.  One of them is `SCEV_NOT_KNOWN',
used for SSA names whose value cannot be expressed.  The other one is
`POLYNOMIAL_CHREC'.  Polynomial chrec has three arguments - base, step
and loop (both base and step may contain further polynomial chrecs).
Type of the expression and of base and step must be the same.  A
variable has evolution `POLYNOMIAL_CHREC(base, step, loop)' if it is
(in the specified loop) equivalent to `x_1' in the following example

     while (...)
       {
         x_1 = phi (base, x_2);
         x_2 = x_1 + step;
       }

 Note that this includes the language restrictions on the operations.
For example, if we compile C code and `x' has signed type, then the
overflow in addition would cause undefined behavior, and we may assume
that this does not happen.  Hence, the value with this SCEV cannot
overflow (which restricts the number of iterations of such a loop).

 In many cases, one wants to restrict the attention just to affine
induction variables.  In this case, the extra expressive power of SCEV
is not useful, and may complicate the optimizations.  In this case,
`simple_iv' function may be used to analyze a value - the result is a
loop-invariant base and step.


File: gccint.info,  Node: loop-iv,  Next: Number of iterations,  Prev: Scalar evolutions,  Up: Loop Analysis and Representation

14.6 IV analysis on RTL
=======================

The induction variable on RTL is simple and only allows analysis of
affine induction variables, and only in one loop at once.  The interface
is declared in `cfgloop.h'.  Before analyzing induction variables in a
loop L, `iv_analysis_loop_init' function must be called on L.  After
the analysis (possibly calling `iv_analysis_loop_init' for several
loops) is finished, `iv_analysis_done' should be called.  The following
functions can be used to access the results of the analysis:

   * `iv_analyze': Analyzes a single register used in the given insn.
     If no use of the register in this insn is found, the following
     insns are scanned, so that this function can be called on the insn
     returned by get_condition.

   * `iv_analyze_result': Analyzes result of the assignment in the
     given insn.

   * `iv_analyze_expr': Analyzes a more complicated expression.  All
     its operands are analyzed by `iv_analyze', and hence they must be
     used in the specified insn or one of the following insns.

 The description of the induction variable is provided in `struct
rtx_iv'.  In order to handle subregs, the representation is a bit
complicated; if the value of the `extend' field is not `UNKNOWN', the
value of the induction variable in the i-th iteration is

     delta + mult * extend_{extend_mode} (subreg_{mode} (base + i * step)),

 with the following exception:  if `first_special' is true, then the
value in the first iteration (when `i' is zero) is `delta + mult *
base'.  However, if `extend' is equal to `UNKNOWN', then
`first_special' must be false, `delta' 0, `mult' 1 and the value in the
i-th iteration is

     subreg_{mode} (base + i * step)

 The function `get_iv_value' can be used to perform these calculations.


File: gccint.info,  Node: Number of iterations,  Next: Dependency analysis,  Prev: loop-iv,  Up: Loop Analysis and Representation

14.7 Number of iterations analysis
==================================

Both on GIMPLE and on RTL, there are functions available to determine
the number of iterations of a loop, with a similar interface.  The
number of iterations of a loop in GCC is defined as the number of
executions of the loop latch.  In many cases, it is not possible to
determine the number of iterations unconditionally - the determined
number is correct only if some assumptions are satisfied.  The analysis
tries to verify these conditions using the information contained in the
program; if it fails, the conditions are returned together with the
result.  The following information and conditions are provided by the
analysis:

   * `assumptions': If this condition is false, the rest of the
     information is invalid.

   * `noloop_assumptions' on RTL, `may_be_zero' on GIMPLE: If this
     condition is true, the loop exits in the first iteration.

   * `infinite': If this condition is true, the loop is infinite.  This
     condition is only available on RTL.  On GIMPLE, conditions for
     finiteness of the loop are included in `assumptions'.

   * `niter_expr' on RTL, `niter' on GIMPLE: The expression that gives
     number of iterations.  The number of iterations is defined as the
     number of executions of the loop latch.

 Both on GIMPLE and on RTL, it necessary for the induction variable
analysis framework to be initialized (SCEV on GIMPLE, loop-iv on RTL).
On GIMPLE, the results are stored to `struct tree_niter_desc'
structure.  Number of iterations before the loop is exited through a
given exit can be determined using `number_of_iterations_exit'
function.  On RTL, the results are returned in `struct niter_desc'
structure.  The corresponding function is named `check_simple_exit'.
There are also functions that pass through all the exits of a loop and
try to find one with easy to determine number of iterations -
`find_loop_niter' on GIMPLE and `find_simple_exit' on RTL.  Finally,
there are functions that provide the same information, but additionally
cache it, so that repeated calls to number of iterations are not so
costly - `number_of_latch_executions' on GIMPLE and
`get_simple_loop_desc' on RTL.

 Note that some of these functions may behave slightly differently than
others - some of them return only the expression for the number of
iterations, and fail if there are some assumptions.  The function
`number_of_latch_executions' works only for single-exit loops.  The
function `number_of_cond_exit_executions' can be used to determine
number of executions of the exit condition of a single-exit loop (i.e.,
the `number_of_latch_executions' increased by one).


File: gccint.info,  Node: Dependency analysis,  Next: Lambda,  Prev: Number of iterations,  Up: Loop Analysis and Representation

14.8 Data Dependency Analysis
=============================

The code for the data dependence analysis can be found in
`tree-data-ref.c' and its interface and data structures are described
in `tree-data-ref.h'.  The function that computes the data dependences
for all the array and pointer references for a given loop is
`compute_data_dependences_for_loop'.  This function is currently used
by the linear loop transform and the vectorization passes.  Before
calling this function, one has to allocate two vectors: a first vector
will contain the set of data references that are contained in the
analyzed loop body, and the second vector will contain the dependence
relations between the data references.  Thus if the vector of data
references is of size `n', the vector containing the dependence
relations will contain `n*n' elements.  However if the analyzed loop
contains side effects, such as calls that potentially can interfere
with the data references in the current analyzed loop, the analysis
stops while scanning the loop body for data references, and inserts a
single `chrec_dont_know' in the dependence relation array.

 The data references are discovered in a particular order during the
scanning of the loop body: the loop body is analyzed in execution order,
and the data references of each statement are pushed at the end of the
data reference array.  Two data references syntactically occur in the
program in the same order as in the array of data references.  This
syntactic order is important in some classical data dependence tests,
and mapping this order to the elements of this array avoids costly
queries to the loop body representation.

 Three types of data references are currently handled: ARRAY_REF,
INDIRECT_REF and COMPONENT_REF. The data structure for the data
reference is `data_reference', where `data_reference_p' is a name of a
pointer to the data reference structure. The structure contains the
following elements:

   * `base_object_info': Provides information about the base object of
     the data reference and its access functions. These access functions
     represent the evolution of the data reference in the loop relative
     to its base, in keeping with the classical meaning of the data
     reference access function for the support of arrays. For example,
     for a reference `a.b[i][j]', the base object is `a.b' and the
     access functions, one for each array subscript, are: `{i_init, +
     i_step}_1, {j_init, +, j_step}_2'.

   * `first_location_in_loop': Provides information about the first
     location accessed by the data reference in the loop and about the
     access function used to represent evolution relative to this
     location. This data is used to support pointers, and is not used
     for arrays (for which we have base objects). Pointer accesses are
     represented as a one-dimensional access that starts from the first
     location accessed in the loop. For example:

                for1 i
                   for2 j
                    *((int *)p + i + j) = a[i][j];

     The access function of the pointer access is `{0, + 4B}_for2'
     relative to `p + i'. The access functions of the array are
     `{i_init, + i_step}_for1' and `{j_init, +, j_step}_for2' relative
     to `a'.

     Usually, the object the pointer refers to is either unknown, or we
     can't prove that the access is confined to the boundaries of a
     certain object.

     Two data references can be compared only if at least one of these
     two representations has all its fields filled for both data
     references.

     The current strategy for data dependence tests is as follows: If
     both `a' and `b' are represented as arrays, compare
     `a.base_object' and `b.base_object'; if they are equal, apply
     dependence tests (use access functions based on base_objects).
     Else if both `a' and `b' are represented as pointers, compare
     `a.first_location' and `b.first_location'; if they are equal,
     apply dependence tests (use access functions based on first
     location).  However, if `a' and `b' are represented differently,
     only try to prove that the bases are definitely different.

   * Aliasing information.

   * Alignment information.

 The structure describing the relation between two data references is
`data_dependence_relation' and the shorter name for a pointer to such a
structure is `ddr_p'.  This structure contains:

   * a pointer to each data reference,

   * a tree node `are_dependent' that is set to `chrec_known' if the
     analysis has proved that there is no dependence between these two
     data references, `chrec_dont_know' if the analysis was not able to
     determine any useful result and potentially there could exist a
     dependence between these data references, and `are_dependent' is
     set to `NULL_TREE' if there exist a dependence relation between the
     data references, and the description of this dependence relation is
     given in the `subscripts', `dir_vects', and `dist_vects' arrays,

   * a boolean that determines whether the dependence relation can be
     represented by a classical distance vector,

   * an array `subscripts' that contains a description of each
     subscript of the data references.  Given two array accesses a
     subscript is the tuple composed of the access functions for a given
     dimension.  For example, given `A[f1][f2][f3]' and
     `B[g1][g2][g3]', there are three subscripts: `(f1, g1), (f2, g2),
     (f3, g3)'.

   * two arrays `dir_vects' and `dist_vects' that contain classical
     representations of the data dependences under the form of
     direction and distance dependence vectors,

   * an array of loops `loop_nest' that contains the loops to which the
     distance and direction vectors refer to.

 Several functions for pretty printing the information extracted by the
data dependence analysis are available: `dump_ddrs' prints with a
maximum verbosity the details of a data dependence relations array,
`dump_dist_dir_vectors' prints only the classical distance and
direction vectors for a data dependence relations array, and
`dump_data_references' prints the details of the data references
contained in a data reference array.


File: gccint.info,  Node: Lambda,  Next: Omega,  Prev: Dependency analysis,  Up: Loop Analysis and Representation

14.9 Linear loop transformations framework
==========================================

Lambda is a framework that allows transformations of loops using
non-singular matrix based transformations of the iteration space and
loop bounds. This allows compositions of skewing, scaling, interchange,
and reversal transformations.  These transformations are often used to
improve cache behavior or remove inner loop dependencies to allow
parallelization and vectorization to take place.

 To perform these transformations, Lambda requires that the loopnest be
converted into an internal form that can be matrix transformed easily.
To do this conversion, the function `gcc_loopnest_to_lambda_loopnest'
is provided.  If the loop cannot be transformed using lambda, this
function will return NULL.

 Once a `lambda_loopnest' is obtained from the conversion function, it
can be transformed by using `lambda_loopnest_transform', which takes a
transformation matrix to apply.  Note that it is up to the caller to
verify that the transformation matrix is legal to apply to the loop
(dependence respecting, etc).  Lambda simply applies whatever matrix it
is told to provide.  It can be extended to make legal matrices out of
any non-singular matrix, but this is not currently implemented.
Legality of a matrix for a given loopnest can be verified using
`lambda_transform_legal_p'.

 Given a transformed loopnest, conversion back into gcc IR is done by
`lambda_loopnest_to_gcc_loopnest'.  This function will modify the loops
so that they match the transformed loopnest.


File: gccint.info,  Node: Omega,  Prev: Lambda,  Up: Loop Analysis and Representation

14.10 Omega a solver for linear programming problems
====================================================

The data dependence analysis contains several solvers triggered
sequentially from the less complex ones to the more sophisticated.  For
ensuring the consistency of the results of these solvers, a data
dependence check pass has been implemented based on two different
solvers.  The second method that has been integrated to GCC is based on
the Omega dependence solver, written in the 1990's by William Pugh and
David Wonnacott.  Data dependence tests can be formulated using a
subset of the Presburger arithmetics that can be translated to linear
constraint systems.  These linear constraint systems can then be solved
using the Omega solver.

 The Omega solver is using Fourier-Motzkin's algorithm for variable
elimination: a linear constraint system containing `n' variables is
reduced to a linear constraint system with `n-1' variables.  The Omega
solver can also be used for solving other problems that can be
expressed under the form of a system of linear equalities and
inequalities.  The Omega solver is known to have an exponential worst
case, also known under the name of "omega nightmare" in the literature,
but in practice, the omega test is known to be efficient for the common
data dependence tests.

 The interface used by the Omega solver for describing the linear
programming problems is described in `omega.h', and the solver is
`omega_solve_problem'.


File: gccint.info,  Node: Control Flow,  Next: Loop Analysis and Representation,  Prev: RTL,  Up: Top

15 Control Flow Graph
*********************

A control flow graph (CFG) is a data structure built on top of the
intermediate code representation (the RTL or `GIMPLE' instruction
stream) abstracting the control flow behavior of a function that is
being compiled.  The CFG is a directed graph where the vertices
represent basic blocks and edges represent possible transfer of control
flow from one basic block to another.  The data structures used to
represent the control flow graph are defined in `basic-block.h'.

 In GCC, the representation of control flow is maintained throughout
the compilation process, from constructing the CFG early in
`pass_build_cfg' to `pass_free_cfg' (see `passes.c').  The CFG takes
various different modes and may undergo extensive manipulations, but
the graph is always valid between its construction and its release.
This way, transfer of information such as data flow, a measured
profile, or the loop tree, can be propagated through the passes
pipeline, and even from `GIMPLE' to `RTL'.

 Often the CFG may be better viewed as integral part of instruction
chain, than structure built on the top of it.  Updating the compiler's
intermediate representation for instructions can not be easily done
without proper maintenance of the CFG simultaneously.

* Menu:

* Basic Blocks::           The definition and representation of basic blocks.
* Edges::                  Types of edges and their representation.
* Profile information::    Representation of frequencies and probabilities.
* Maintaining the CFG::    Keeping the control flow graph and up to date.
* Liveness information::   Using and maintaining liveness information.


File: gccint.info,  Node: Basic Blocks,  Next: Edges,  Up: Control Flow

15.1 Basic Blocks
=================

A basic block is a straight-line sequence of code with only one entry
point and only one exit.  In GCC, basic blocks are represented using
the `basic_block' data type.

 Special basic blocks represent possible entry and exit points of a
function.  These blocks are called `ENTRY_BLOCK_PTR' and
`EXIT_BLOCK_PTR'.  These blocks do not contain any code.

 The `BASIC_BLOCK' array contains all basic blocks in an unspecified
order.  Each `basic_block' structure has a field that holds a unique
integer identifier `index' that is the index of the block in the
`BASIC_BLOCK' array.  The total number of basic blocks in the function
is `n_basic_blocks'.  Both the basic block indices and the total number
of basic blocks may vary during the compilation process, as passes
reorder, create, duplicate, and destroy basic blocks.  The index for
any block should never be greater than `last_basic_block'.  The indices
0 and 1 are special codes reserved for `ENTRY_BLOCK' and `EXIT_BLOCK',
the indices of `ENTRY_BLOCK_PTR' and `EXIT_BLOCK_PTR'.

 Two pointer members of the `basic_block' structure are the pointers
`next_bb' and `prev_bb'.  These are used to keep doubly linked chain of
basic blocks in the same order as the underlying instruction stream.
The chain of basic blocks is updated transparently by the provided API
for manipulating the CFG.  The macro `FOR_EACH_BB' can be used to visit
all the basic blocks in lexicographical order, except `ENTRY_BLOCK' and
`EXIT_BLOCK'.  The macro `FOR_ALL_BB' also visits all basic blocks in
lexicographical order, including `ENTRY_BLOCK' and `EXIT_BLOCK'.

 The functions `post_order_compute' and `inverted_post_order_compute'
can be used to compute topological orders of the CFG.  The orders are
stored as vectors of basic block indices.  The `BASIC_BLOCK' array can
be used to iterate each basic block by index.  Dominator traversals are
also possible using `walk_dominator_tree'.  Given two basic blocks A
and B, block A dominates block B if A is _always_ executed before B.

 Each `basic_block' also contains pointers to the first instruction
(the "head") and the last instruction (the "tail") or "end" of the
instruction stream contained in a basic block.  In fact, since the
`basic_block' data type is used to represent blocks in both major
intermediate representations of GCC (`GIMPLE' and RTL), there are
pointers to the head and end of a basic block for both representations,
stored in intermediate representation specific data in the `il' field
of `struct basic_block_def'.

 For RTL, these pointers are `BB_HEAD' and `BB_END'.

 In the RTL representation of a function, the instruction stream
contains not only the "real" instructions, but also "notes" or "insn
notes" (to distinguish them from "reg notes").  Any function that moves
or duplicates the basic blocks needs to take care of updating of these
notes.  Many of these notes expect that the instruction stream consists
of linear regions, so updating can sometimes be tedious.  All types of
insn notes are defined in `insn-notes.def'.

 In the RTL function representation, the instructions contained in a
basic block always follow a `NOTE_INSN_BASIC_BLOCK', but zero or more
`CODE_LABEL' nodes can precede the block note.  A basic block ends with
a control flow instruction or with the last instruction before the next
`CODE_LABEL' or `NOTE_INSN_BASIC_BLOCK'.  By definition, a `CODE_LABEL'
cannot appear in the middle of the instruction stream of a basic block.

 In addition to notes, the jump table vectors are also represented as
"pseudo-instructions" inside the insn stream.  These vectors never
appear in the basic block and should always be placed just after the
table jump instructions referencing them.  After removing the
table-jump it is often difficult to eliminate the code computing the
address and referencing the vector, so cleaning up these vectors is
postponed until after liveness analysis.   Thus the jump table vectors
may appear in the insn stream unreferenced and without any purpose.
Before any edge is made "fall-thru", the existence of such construct in
the way needs to be checked by calling `can_fallthru' function.

 For the `GIMPLE' representation, the PHI nodes and statements
contained in a basic block are in a `gimple_seq' pointed to by the
basic block intermediate language specific pointers.  Abstract
containers and iterators are used to access the PHI nodes and
statements in a basic blocks.  These iterators are called "GIMPLE
statement iterators" (GSIs).  Grep for `^gsi' in the various `gimple-*'
and `tree-*' files.  The following snippet will pretty-print all PHI
nodes the statements of the current function in the GIMPLE
representation.

     basic_block bb;

     FOR_EACH_BB (bb)
       {
        gimple_stmt_iterator si;

        for (si = gsi_start_phis (bb); !gsi_end_p (si); gsi_next (&si))
          {
            gimple phi = gsi_stmt (si);
            print_gimple_stmt (dump_file, phi, 0, TDF_SLIM);
          }
        for (si = gsi_start_bb (bb); !gsi_end_p (si); gsi_next (&si))
          {
            gimple stmt = gsi_stmt (si);
            print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
          }
       }


File: gccint.info,  Node: Edges,  Next: Profile information,  Prev: Basic Blocks,  Up: Control Flow

15.2 Edges
==========

Edges represent possible control flow transfers from the end of some
basic block A to the head of another basic block B.  We say that A is a
predecessor of B, and B is a successor of A.  Edges are represented in
GCC with the `edge' data type.  Each `edge' acts as a link between two
basic blocks: The `src' member of an edge points to the predecessor
basic block of the `dest' basic block.  The members `preds' and `succs'
of the `basic_block' data type point to type-safe vectors of edges to
the predecessors and successors of the block.

 When walking the edges in an edge vector, "edge iterators" should be
used.  Edge iterators are constructed using the `edge_iterator' data
structure and several methods are available to operate on them:

`ei_start'
     This function initializes an `edge_iterator' that points to the
     first edge in a vector of edges.

`ei_last'
     This function initializes an `edge_iterator' that points to the
     last edge in a vector of edges.

`ei_end_p'
     This predicate is `true' if an `edge_iterator' represents the last
     edge in an edge vector.

`ei_one_before_end_p'
     This predicate is `true' if an `edge_iterator' represents the
     second last edge in an edge vector.

`ei_next'
     This function takes a pointer to an `edge_iterator' and makes it
     point to the next edge in the sequence.

`ei_prev'
     This function takes a pointer to an `edge_iterator' and makes it
     point to the previous edge in the sequence.

`ei_edge'
     This function returns the `edge' currently pointed to by an
     `edge_iterator'.

`ei_safe_safe'
     This function returns the `edge' currently pointed to by an
     `edge_iterator', but returns `NULL' if the iterator is pointing at
     the end of the sequence.  This function has been provided for
     existing code makes the assumption that a `NULL' edge indicates
     the end of the sequence.


 The convenience macro `FOR_EACH_EDGE' can be used to visit all of the
edges in a sequence of predecessor or successor edges.  It must not be
used when an element might be removed during the traversal, otherwise
elements will be missed.  Here is an example of how to use the macro:

     edge e;
     edge_iterator ei;

     FOR_EACH_EDGE (e, ei, bb->succs)
       {
          if (e->flags & EDGE_FALLTHRU)
            break;
       }

 There are various reasons why control flow may transfer from one block
to another.  One possibility is that some instruction, for example a
`CODE_LABEL', in a linearized instruction stream just always starts a
new basic block.  In this case a "fall-thru" edge links the basic block
to the first following basic block.  But there are several other
reasons why edges may be created.  The `flags' field of the `edge' data
type is used to store information about the type of edge we are dealing
with.  Each edge is of one of the following types:

_jump_
     No type flags are set for edges corresponding to jump instructions.
     These edges are used for unconditional or conditional jumps and in
     RTL also for table jumps.  They are the easiest to manipulate as
     they may be freely redirected when the flow graph is not in SSA
     form.

_fall-thru_
     Fall-thru edges are present in case where the basic block may
     continue execution to the following one without branching.  These
     edges have the `EDGE_FALLTHRU' flag set.  Unlike other types of
     edges, these edges must come into the basic block immediately
     following in the instruction stream.  The function
     `force_nonfallthru' is available to insert an unconditional jump
     in the case that redirection is needed.  Note that this may
     require creation of a new basic block.

_exception handling_
     Exception handling edges represent possible control transfers from
     a trapping instruction to an exception handler.  The definition of
     "trapping" varies.  In C++, only function calls can throw, but for
     Java and Ada, exceptions like division by zero or segmentation
     fault are defined and thus each instruction possibly throwing this
     kind of exception needs to be handled as control flow instruction.
     Exception edges have the `EDGE_ABNORMAL' and `EDGE_EH' flags set.

     When updating the instruction stream it is easy to change possibly
     trapping instruction to non-trapping, by simply removing the
     exception edge.  The opposite conversion is difficult, but should
     not happen anyway.  The edges can be eliminated via
     `purge_dead_edges' call.

     In the RTL representation, the destination of an exception edge is
     specified by `REG_EH_REGION' note attached to the insn.  In case
     of a trapping call the `EDGE_ABNORMAL_CALL' flag is set too.  In
     the `GIMPLE' representation, this extra flag is not set.

     In the RTL representation, the predicate `may_trap_p' may be used
     to check whether instruction still may trap or not.  For the tree
     representation, the `tree_could_trap_p' predicate is available,
     but this predicate only checks for possible memory traps, as in
     dereferencing an invalid pointer location.

_sibling calls_
     Sibling calls or tail calls terminate the function in a
     non-standard way and thus an edge to the exit must be present.
     `EDGE_SIBCALL' and `EDGE_ABNORMAL' are set in such case.  These
     edges only exist in the RTL representation.

_computed jumps_
     Computed jumps contain edges to all labels in the function
     referenced from the code.  All those edges have `EDGE_ABNORMAL'
     flag set.  The edges used to represent computed jumps often cause
     compile time performance problems, since functions consisting of
     many taken labels and many computed jumps may have _very_ dense
     flow graphs, so these edges need to be handled with special care.
     During the earlier stages of the compilation process, GCC tries to
     avoid such dense flow graphs by factoring computed jumps.  For
     example, given the following series of jumps,

            goto *x;
            [ ... ]

            goto *x;
            [ ... ]

            goto *x;
            [ ... ]

     factoring the computed jumps results in the following code sequence
     which has a much simpler flow graph:

            goto y;
            [ ... ]

            goto y;
            [ ... ]

            goto y;
            [ ... ]

          y:
            goto *x;

     However, the classic problem with this transformation is that it
     has a runtime cost in there resulting code: An extra jump.
     Therefore, the computed jumps are un-factored in the later passes
     of the compiler (in the pass called
     `pass_duplicate_computed_gotos').  Be aware of that when you work
     on passes in that area.  There have been numerous examples already
     where the compile time for code with unfactored computed jumps
     caused some serious headaches.

_nonlocal goto handlers_
     GCC allows nested functions to return into caller using a `goto'
     to a label passed to as an argument to the callee.  The labels
     passed to nested functions contain special code to cleanup after
     function call.  Such sections of code are referred to as "nonlocal
     goto receivers".  If a function contains such nonlocal goto
     receivers, an edge from the call to the label is created with the
     `EDGE_ABNORMAL' and `EDGE_ABNORMAL_CALL' flags set.

_function entry points_
     By definition, execution of function starts at basic block 0, so
     there is always an edge from the `ENTRY_BLOCK_PTR' to basic block
     0.  There is no `GIMPLE' representation for alternate entry points
     at this moment.  In RTL, alternate entry points are specified by
     `CODE_LABEL' with `LABEL_ALTERNATE_NAME' defined.  This feature is
     currently used for multiple entry point prologues and is limited
     to post-reload passes only.  This can be used by back-ends to emit
     alternate prologues for functions called from different contexts.
     In future full support for multiple entry functions defined by
     Fortran 90 needs to be implemented.

_function exits_
     In the pre-reload representation a function terminates after the
     last instruction in the insn chain and no explicit return
     instructions are used.  This corresponds to the fall-thru edge
     into exit block.  After reload, optimal RTL epilogues are used
     that use explicit (conditional) return instructions that are
     represented by edges with no flags set.



File: gccint.info,  Node: Profile information,  Next: Maintaining the CFG,  Prev: Edges,  Up: Control Flow

15.3 Profile information
========================

In many cases a compiler must make a choice whether to trade speed in
one part of code for speed in another, or to trade code size for code
speed.  In such cases it is useful to know information about how often
some given block will be executed.  That is the purpose for maintaining
profile within the flow graph.  GCC can handle profile information
obtained through "profile feedback", but it can also estimate branch
probabilities based on statics and heuristics.

 The feedback based profile is produced by compiling the program with
instrumentation, executing it on a train run and reading the numbers of
executions of basic blocks and edges back to the compiler while
re-compiling the program to produce the final executable.  This method
provides very accurate information about where a program spends most of
its time on the train run.  Whether it matches the average run of
course depends on the choice of train data set, but several studies
have shown that the behavior of a program usually changes just
marginally over different data sets.

 When profile feedback is not available, the compiler may be asked to
attempt to predict the behavior of each branch in the program using a
set of heuristics (see `predict.def' for details) and compute estimated
frequencies of each basic block by propagating the probabilities over
the graph.

 Each `basic_block' contains two integer fields to represent profile
information: `frequency' and `count'.  The `frequency' is an estimation
how often is basic block executed within a function.  It is represented
as an integer scaled in the range from 0 to `BB_FREQ_BASE'.  The most
frequently executed basic block in function is initially set to
`BB_FREQ_BASE' and the rest of frequencies are scaled accordingly.
During optimization, the frequency of the most frequent basic block can
both decrease (for instance by loop unrolling) or grow (for instance by
cross-jumping optimization), so scaling sometimes has to be performed
multiple times.

 The `count' contains hard-counted numbers of execution measured during
training runs and is nonzero only when profile feedback is available.
This value is represented as the host's widest integer (typically a 64
bit integer) of the special type `gcov_type'.

 Most optimization passes can use only the frequency information of a
basic block, but a few passes may want to know hard execution counts.
The frequencies should always match the counts after scaling, however
during updating of the profile information numerical error may
accumulate into quite large errors.

 Each edge also contains a branch probability field: an integer in the
range from 0 to `REG_BR_PROB_BASE'.  It represents probability of
passing control from the end of the `src' basic block to the `dest'
basic block, i.e. the probability that control will flow along this
edge.  The `EDGE_FREQUENCY' macro is available to compute how
frequently a given edge is taken.  There is a `count' field for each
edge as well, representing same information as for a basic block.

 The basic block frequencies are not represented in the instruction
stream, but in the RTL representation the edge frequencies are
represented for conditional jumps (via the `REG_BR_PROB' macro) since
they are used when instructions are output to the assembly file and the
flow graph is no longer maintained.

 The probability that control flow arrives via a given edge to its
destination basic block is called "reverse probability" and is not
directly represented, but it may be easily computed from frequencies of
basic blocks.

 Updating profile information is a delicate task that can unfortunately
not be easily integrated with the CFG manipulation API.  Many of the
functions and hooks to modify the CFG, such as
`redirect_edge_and_branch', do not have enough information to easily
update the profile, so updating it is in the majority of cases left up
to the caller.  It is difficult to uncover bugs in the profile updating
code, because they manifest themselves only by producing worse code,
and checking profile consistency is not possible because of numeric
error accumulation.  Hence special attention needs to be given to this
issue in each pass that modifies the CFG.

 It is important to point out that `REG_BR_PROB_BASE' and
`BB_FREQ_BASE' are both set low enough to be possible to compute second
power of any frequency or probability in the flow graph, it is not
possible to even square the `count' field, as modern CPUs are fast
enough to execute $2^32$ operations quickly.


File: gccint.info,  Node: Maintaining the CFG,  Next: Liveness information,  Prev: Profile information,  Up: Control Flow

15.4 Maintaining the CFG
========================

An important task of each compiler pass is to keep both the control
flow graph and all profile information up-to-date.  Reconstruction of
the control flow graph after each pass is not an option, since it may be
very expensive and lost profile information cannot be reconstructed at
all.

 GCC has two major intermediate representations, and both use the
`basic_block' and `edge' data types to represent control flow.  Both
representations share as much of the CFG maintenance code as possible.
For each representation, a set of "hooks" is defined so that each
representation can provide its own implementation of CFG manipulation
routines when necessary.  These hooks are defined in `cfghooks.h'.
There are hooks for almost all common CFG manipulations, including
block splitting and merging, edge redirection and creating and deleting
basic blocks.  These hooks should provide everything you need to
maintain and manipulate the CFG in both the RTL and `GIMPLE'
representation.

 At the moment, the basic block boundaries are maintained transparently
when modifying instructions, so there rarely is a need to move them
manually (such as in case someone wants to output instruction outside
basic block explicitly).

 In the RTL representation, each instruction has a `BLOCK_FOR_INSN'
value that represents pointer to the basic block that contains the
instruction.  In the `GIMPLE' representation, the function `gimple_bb'
returns a pointer to the basic block containing the queried statement.

 When changes need to be applied to a function in its `GIMPLE'
representation, "GIMPLE statement iterators" should be used.  These
iterators provide an integrated abstraction of the flow graph and the
instruction stream.  Block statement iterators are constructed using
the `gimple_stmt_iterator' data structure and several modifier are
available, including the following:

`gsi_start'
     This function initializes a `gimple_stmt_iterator' that points to
     the first non-empty statement in a basic block.

`gsi_last'
     This function initializes a `gimple_stmt_iterator' that points to
     the last statement in a basic block.

`gsi_end_p'
     This predicate is `true' if a `gimple_stmt_iterator' represents
     the end of a basic block.

`gsi_next'
     This function takes a `gimple_stmt_iterator' and makes it point to
     its successor.

`gsi_prev'
     This function takes a `gimple_stmt_iterator' and makes it point to
     its predecessor.

`gsi_insert_after'
     This function inserts a statement after the `gimple_stmt_iterator'
     passed in.  The final parameter determines whether the statement
     iterator is updated to point to the newly inserted statement, or
     left pointing to the original statement.

`gsi_insert_before'
     This function inserts a statement before the `gimple_stmt_iterator'
     passed in.  The final parameter determines whether the statement
     iterator is updated to point to the newly inserted statement, or
     left pointing to the original  statement.

`gsi_remove'
     This function removes the `gimple_stmt_iterator' passed in and
     rechains the remaining statements in a basic block, if any.

 In the RTL representation, the macros `BB_HEAD' and `BB_END' may be
used to get the head and end `rtx' of a basic block.  No abstract
iterators are defined for traversing the insn chain, but you can just
use `NEXT_INSN' and `PREV_INSN' instead.  *Note Insns::.

 Usually a code manipulating pass simplifies the instruction stream and
the flow of control, possibly eliminating some edges.  This may for
example happen when a conditional jump is replaced with an
unconditional jump, but also when simplifying possibly trapping
instruction to non-trapping while compiling Java.  Updating of edges is
not transparent and each optimization pass is required to do so
manually.  However only few cases occur in practice.  The pass may call
`purge_dead_edges' on a given basic block to remove superfluous edges,
if any.

 Another common scenario is redirection of branch instructions, but
this is best modeled as redirection of edges in the control flow graph
and thus use of `redirect_edge_and_branch' is preferred over more low
level functions, such as `redirect_jump' that operate on RTL chain
only.  The CFG hooks defined in `cfghooks.h' should provide the
complete API required for manipulating and maintaining the CFG.

 It is also possible that a pass has to insert control flow instruction
into the middle of a basic block, thus creating an entry point in the
middle of the basic block, which is impossible by definition: The block
must be split to make sure it only has one entry point, i.e. the head
of the basic block.  The CFG hook `split_block' may be used when an
instruction in the middle of a basic block has to become the target of
a jump or branch instruction.

 For a global optimizer, a common operation is to split edges in the
flow graph and insert instructions on them.  In the RTL representation,
this can be easily done using the `insert_insn_on_edge' function that
emits an instruction "on the edge", caching it for a later
`commit_edge_insertions' call that will take care of moving the
inserted instructions off the edge into the instruction stream
contained in a basic block.  This includes the creation of new basic
blocks where needed.  In the `GIMPLE' representation, the equivalent
functions are `gsi_insert_on_edge' which inserts a block statement
iterator on an edge, and `gsi_commit_edge_inserts' which flushes the
instruction to actual instruction stream.

 While debugging the optimization pass, the `verify_flow_info' function
may be useful to find bugs in the control flow graph updating code.


File: gccint.info,  Node: Liveness information,  Prev: Maintaining the CFG,  Up: Control Flow

15.5 Liveness information
=========================

Liveness information is useful to determine whether some register is
"live" at given point of program, i.e. that it contains a value that
may be used at a later point in the program.  This information is used,
for instance, during register allocation, as the pseudo registers only
need to be assigned to a unique hard register or to a stack slot if
they are live.  The hard registers and stack slots may be freely reused
for other values when a register is dead.

 Liveness information is available in the back end starting with
`pass_df_initialize' and ending with `pass_df_finish'.  Three flavors
of live analysis are available: With `LR', it is possible to determine
at any point `P' in the function if the register may be used on some
path from `P' to the end of the function.  With `UR', it is possible to
determine if there is a path from the beginning of the function to `P'
that defines the variable.  `LIVE' is the intersection of the `LR' and
`UR' and a variable is live at `P' if there is both an assignment that
reaches it from the beginning of the function and a use that can be
reached on some path from `P' to the end of the function.

 In general `LIVE' is the most useful of the three.  The macros
`DF_[LR,UR,LIVE]_[IN,OUT]' can be used to access this information.  The
macros take a basic block number and return a bitmap that is indexed by
the register number.  This information is only guaranteed to be up to
date after calls are made to `df_analyze'.  See the file `df-core.c'
for details on using the dataflow.

 The liveness information is stored partly in the RTL instruction stream
and partly in the flow graph.  Local information is stored in the
instruction stream: Each instruction may contain `REG_DEAD' notes
representing that the value of a given register is no longer needed, or
`REG_UNUSED' notes representing that the value computed by the
instruction is never used.  The second is useful for instructions
computing multiple values at once.


File: gccint.info,  Node: Machine Desc,  Next: Target Macros,  Prev: Loop Analysis and Representation,  Up: Top

16 Machine Descriptions
***********************

A machine description has two parts: a file of instruction patterns
(`.md' file) and a C header file of macro definitions.

 The `.md' file for a target machine contains a pattern for each
instruction that the target machine supports (or at least each
instruction that is worth telling the compiler about).  It may also
contain comments.  A semicolon causes the rest of the line to be a
comment, unless the semicolon is inside a quoted string.

 See the next chapter for information on the C header file.

* Menu:

* Overview::            How the machine description is used.
* Patterns::            How to write instruction patterns.
* Example::             An explained example of a `define_insn' pattern.
* RTL Template::        The RTL template defines what insns match a pattern.
* Output Template::     The output template says how to make assembler code
                        from such an insn.
* Output Statement::    For more generality, write C code to output
                        the assembler code.
* Predicates::          Controlling what kinds of operands can be used
                        for an insn.
* Constraints::         Fine-tuning operand selection.
* Standard Names::      Names mark patterns to use for code generation.
* Pattern Ordering::    When the order of patterns makes a difference.
* Dependent Patterns::  Having one pattern may make you need another.
* Jump Patterns::       Special considerations for patterns for jump insns.
* Looping Patterns::    How to define patterns for special looping insns.
* Insn Canonicalizations::Canonicalization of Instructions
* Expander Definitions::Generating a sequence of several RTL insns
                        for a standard operation.
* Insn Splitting::      Splitting Instructions into Multiple Instructions.
* Including Patterns::  Including Patterns in Machine Descriptions.
* Peephole Definitions::Defining machine-specific peephole optimizations.
* Insn Attributes::     Specifying the value of attributes for generated insns.
* Conditional Execution::Generating `define_insn' patterns for
                         predication.
* Define Subst::	Generating `define_insn' and `define_expand'
			patterns from other patterns.
* Constant Definitions::Defining symbolic constants that can be used in the
                        md file.
* Iterators::           Using iterators to generate patterns from a template.


File: gccint.info,  Node: Overview,  Next: Patterns,  Up: Machine Desc

16.1 Overview of How the Machine Description is Used
====================================================

There are three main conversions that happen in the compiler:

  1. The front end reads the source code and builds a parse tree.

  2. The parse tree is used to generate an RTL insn list based on named
     instruction patterns.

  3. The insn list is matched against the RTL templates to produce
     assembler code.


 For the generate pass, only the names of the insns matter, from either
a named `define_insn' or a `define_expand'.  The compiler will choose
the pattern with the right name and apply the operands according to the
documentation later in this chapter, without regard for the RTL
template or operand constraints.  Note that the names the compiler looks
for are hard-coded in the compiler--it will ignore unnamed patterns and
patterns with names it doesn't know about, but if you don't provide a
named pattern it needs, it will abort.

 If a `define_insn' is used, the template given is inserted into the
insn list.  If a `define_expand' is used, one of three things happens,
based on the condition logic.  The condition logic may manually create
new insns for the insn list, say via `emit_insn()', and invoke `DONE'.
For certain named patterns, it may invoke `FAIL' to tell the compiler
to use an alternate way of performing that task.  If it invokes neither
`DONE' nor `FAIL', the template given in the pattern is inserted, as if
the `define_expand' were a `define_insn'.

 Once the insn list is generated, various optimization passes convert,
replace, and rearrange the insns in the insn list.  This is where the
`define_split' and `define_peephole' patterns get used, for example.

 Finally, the insn list's RTL is matched up with the RTL templates in
the `define_insn' patterns, and those patterns are used to emit the
final assembly code.  For this purpose, each named `define_insn' acts
like it's unnamed, since the names are ignored.


File: gccint.info,  Node: Patterns,  Next: Example,  Prev: Overview,  Up: Machine Desc

16.2 Everything about Instruction Patterns
==========================================

Each instruction pattern contains an incomplete RTL expression, with
pieces to be filled in later, operand constraints that restrict how the
pieces can be filled in, and an output pattern or C code to generate
the assembler output, all wrapped up in a `define_insn' expression.

 A `define_insn' is an RTL expression containing four or five operands:

  1. An optional name.  The presence of a name indicate that this
     instruction pattern can perform a certain standard job for the
     RTL-generation pass of the compiler.  This pass knows certain
     names and will use the instruction patterns with those names, if
     the names are defined in the machine description.

     The absence of a name is indicated by writing an empty string
     where the name should go.  Nameless instruction patterns are never
     used for generating RTL code, but they may permit several simpler
     insns to be combined later on.

     Names that are not thus known and used in RTL-generation have no
     effect; they are equivalent to no name at all.

     For the purpose of debugging the compiler, you may also specify a
     name beginning with the `*' character.  Such a name is used only
     for identifying the instruction in RTL dumps; it is entirely
     equivalent to having a nameless pattern for all other purposes.

  2. The "RTL template" (*note RTL Template::) is a vector of incomplete
     RTL expressions which show what the instruction should look like.
     It is incomplete because it may contain `match_operand',
     `match_operator', and `match_dup' expressions that stand for
     operands of the instruction.

     If the vector has only one element, that element is the template
     for the instruction pattern.  If the vector has multiple elements,
     then the instruction pattern is a `parallel' expression containing
     the elements described.

  3. A condition.  This is a string which contains a C expression that
     is the final test to decide whether an insn body matches this
     pattern.

     For a named pattern, the condition (if present) may not depend on
     the data in the insn being matched, but only the
     target-machine-type flags.  The compiler needs to test these
     conditions during initialization in order to learn exactly which
     named instructions are available in a particular run.

     For nameless patterns, the condition is applied only when matching
     an individual insn, and only after the insn has matched the
     pattern's recognition template.  The insn's operands may be found
     in the vector `operands'.  For an insn where the condition has
     once matched, it can't be used to control register allocation, for
     example by excluding certain hard registers or hard register
     combinations.

  4. The "output template": a string that says how to output matching
     insns as assembler code.  `%' in this string specifies where to
     substitute the value of an operand.  *Note Output Template::.

     When simple substitution isn't general enough, you can specify a
     piece of C code to compute the output.  *Note Output Statement::.

  5. Optionally, a vector containing the values of attributes for insns
     matching this pattern.  *Note Insn Attributes::.


File: gccint.info,  Node: Example,  Next: RTL Template,  Prev: Patterns,  Up: Machine Desc

16.3 Example of `define_insn'
=============================

Here is an actual example of an instruction pattern, for the
68000/68020.

     (define_insn "tstsi"
       [(set (cc0)
             (match_operand:SI 0 "general_operand" "rm"))]
       ""
       "*
     {
       if (TARGET_68020 || ! ADDRESS_REG_P (operands[0]))
         return \"tstl %0\";
       return \"cmpl #0,%0\";
     }")

This can also be written using braced strings:

     (define_insn "tstsi"
       [(set (cc0)
             (match_operand:SI 0 "general_operand" "rm"))]
       ""
     {
       if (TARGET_68020 || ! ADDRESS_REG_P (operands[0]))
         return "tstl %0";
       return "cmpl #0,%0";
     })

 This is an instruction that sets the condition codes based on the
value of a general operand.  It has no condition, so any insn whose RTL
description has the form shown may be handled according to this
pattern.  The name `tstsi' means "test a `SImode' value" and tells the
RTL generation pass that, when it is necessary to test such a value, an
insn to do so can be constructed using this pattern.

 The output control string is a piece of C code which chooses which
output template to return based on the kind of operand and the specific
type of CPU for which code is being generated.

 `"rm"' is an operand constraint.  Its meaning is explained below.


File: gccint.info,  Node: RTL Template,  Next: Output Template,  Prev: Example,  Up: Machine Desc

16.4 RTL Template
=================

The RTL template is used to define which insns match the particular
pattern and how to find their operands.  For named patterns, the RTL
template also says how to construct an insn from specified operands.

 Construction involves substituting specified operands into a copy of
the template.  Matching involves determining the values that serve as
the operands in the insn being matched.  Both of these activities are
controlled by special expression types that direct matching and
substitution of the operands.

`(match_operand:M N PREDICATE CONSTRAINT)'
     This expression is a placeholder for operand number N of the insn.
     When constructing an insn, operand number N will be substituted at
     this point.  When matching an insn, whatever appears at this
     position in the insn will be taken as operand number N; but it
     must satisfy PREDICATE or this instruction pattern will not match
     at all.

     Operand numbers must be chosen consecutively counting from zero in
     each instruction pattern.  There may be only one `match_operand'
     expression in the pattern for each operand number.  Usually
     operands are numbered in the order of appearance in `match_operand'
     expressions.  In the case of a `define_expand', any operand numbers
     used only in `match_dup' expressions have higher values than all
     other operand numbers.

     PREDICATE is a string that is the name of a function that accepts
     two arguments, an expression and a machine mode.  *Note
     Predicates::.  During matching, the function will be called with
     the putative operand as the expression and M as the mode argument
     (if M is not specified, `VOIDmode' will be used, which normally
     causes PREDICATE to accept any mode).  If it returns zero, this
     instruction pattern fails to match.  PREDICATE may be an empty
     string; then it means no test is to be done on the operand, so
     anything which occurs in this position is valid.

     Most of the time, PREDICATE will reject modes other than M--but
     not always.  For example, the predicate `address_operand' uses M
     as the mode of memory ref that the address should be valid for.
     Many predicates accept `const_int' nodes even though their mode is
     `VOIDmode'.

     CONSTRAINT controls reloading and the choice of the best register
     class to use for a value, as explained later (*note Constraints::).
     If the constraint would be an empty string, it can be omitted.

     People are often unclear on the difference between the constraint
     and the predicate.  The predicate helps decide whether a given
     insn matches the pattern.  The constraint plays no role in this
     decision; instead, it controls various decisions in the case of an
     insn which does match.

`(match_scratch:M N CONSTRAINT)'
     This expression is also a placeholder for operand number N and
     indicates that operand must be a `scratch' or `reg' expression.

     When matching patterns, this is equivalent to

          (match_operand:M N "scratch_operand" PRED)

     but, when generating RTL, it produces a (`scratch':M) expression.

     If the last few expressions in a `parallel' are `clobber'
     expressions whose operands are either a hard register or
     `match_scratch', the combiner can add or delete them when
     necessary.  *Note Side Effects::.

`(match_dup N)'
     This expression is also a placeholder for operand number N.  It is
     used when the operand needs to appear more than once in the insn.

     In construction, `match_dup' acts just like `match_operand': the
     operand is substituted into the insn being constructed.  But in
     matching, `match_dup' behaves differently.  It assumes that operand
     number N has already been determined by a `match_operand'
     appearing earlier in the recognition template, and it matches only
     an identical-looking expression.

     Note that `match_dup' should not be used to tell the compiler that
     a particular register is being used for two operands (example:
     `add' that adds one register to another; the second register is
     both an input operand and the output operand).  Use a matching
     constraint (*note Simple Constraints::) for those.  `match_dup' is
     for the cases where one operand is used in two places in the
     template, such as an instruction that computes both a quotient and
     a remainder, where the opcode takes two input operands but the RTL
     template has to refer to each of those twice; once for the
     quotient pattern and once for the remainder pattern.

`(match_operator:M N PREDICATE [OPERANDS...])'
     This pattern is a kind of placeholder for a variable RTL expression
     code.

     When constructing an insn, it stands for an RTL expression whose
     expression code is taken from that of operand N, and whose
     operands are constructed from the patterns OPERANDS.

     When matching an expression, it matches an expression if the
     function PREDICATE returns nonzero on that expression _and_ the
     patterns OPERANDS match the operands of the expression.

     Suppose that the function `commutative_operator' is defined as
     follows, to match any expression whose operator is one of the
     commutative arithmetic operators of RTL and whose mode is MODE:

          int
          commutative_integer_operator (x, mode)
               rtx x;
               enum machine_mode mode;
          {
            enum rtx_code code = GET_CODE (x);
            if (GET_MODE (x) != mode)
              return 0;
            return (GET_RTX_CLASS (code) == RTX_COMM_ARITH
                    || code == EQ || code == NE);
          }

     Then the following pattern will match any RTL expression consisting
     of a commutative operator applied to two general operands:

          (match_operator:SI 3 "commutative_operator"
            [(match_operand:SI 1 "general_operand" "g")
             (match_operand:SI 2 "general_operand" "g")])

     Here the vector `[OPERANDS...]' contains two patterns because the
     expressions to be matched all contain two operands.

     When this pattern does match, the two operands of the commutative
     operator are recorded as operands 1 and 2 of the insn.  (This is
     done by the two instances of `match_operand'.)  Operand 3 of the
     insn will be the entire commutative expression: use `GET_CODE
     (operands[3])' to see which commutative operator was used.

     The machine mode M of `match_operator' works like that of
     `match_operand': it is passed as the second argument to the
     predicate function, and that function is solely responsible for
     deciding whether the expression to be matched "has" that mode.

     When constructing an insn, argument 3 of the gen-function will
     specify the operation (i.e. the expression code) for the
     expression to be made.  It should be an RTL expression, whose
     expression code is copied into a new expression whose operands are
     arguments 1 and 2 of the gen-function.  The subexpressions of
     argument 3 are not used; only its expression code matters.

     When `match_operator' is used in a pattern for matching an insn,
     it usually best if the operand number of the `match_operator' is
     higher than that of the actual operands of the insn.  This improves
     register allocation because the register allocator often looks at
     operands 1 and 2 of insns to see if it can do register tying.

     There is no way to specify constraints in `match_operator'.  The
     operand of the insn which corresponds to the `match_operator'
     never has any constraints because it is never reloaded as a whole.
     However, if parts of its OPERANDS are matched by `match_operand'
     patterns, those parts may have constraints of their own.

`(match_op_dup:M N[OPERANDS...])'
     Like `match_dup', except that it applies to operators instead of
     operands.  When constructing an insn, operand number N will be
     substituted at this point.  But in matching, `match_op_dup' behaves
     differently.  It assumes that operand number N has already been
     determined by a `match_operator' appearing earlier in the
     recognition template, and it matches only an identical-looking
     expression.

`(match_parallel N PREDICATE [SUBPAT...])'
     This pattern is a placeholder for an insn that consists of a
     `parallel' expression with a variable number of elements.  This
     expression should only appear at the top level of an insn pattern.

     When constructing an insn, operand number N will be substituted at
     this point.  When matching an insn, it matches if the body of the
     insn is a `parallel' expression with at least as many elements as
     the vector of SUBPAT expressions in the `match_parallel', if each
     SUBPAT matches the corresponding element of the `parallel', _and_
     the function PREDICATE returns nonzero on the `parallel' that is
     the body of the insn.  It is the responsibility of the predicate
     to validate elements of the `parallel' beyond those listed in the
     `match_parallel'.

     A typical use of `match_parallel' is to match load and store
     multiple expressions, which can contain a variable number of
     elements in a `parallel'.  For example,

          (define_insn ""
            [(match_parallel 0 "load_multiple_operation"
               [(set (match_operand:SI 1 "gpc_reg_operand" "=r")
                     (match_operand:SI 2 "memory_operand" "m"))
                (use (reg:SI 179))
                (clobber (reg:SI 179))])]
            ""
            "loadm 0,0,%1,%2")

     This example comes from `a29k.md'.  The function
     `load_multiple_operation' is defined in `a29k.c' and checks that
     subsequent elements in the `parallel' are the same as the `set' in
     the pattern, except that they are referencing subsequent registers
     and memory locations.

     An insn that matches this pattern might look like:

          (parallel
           [(set (reg:SI 20) (mem:SI (reg:SI 100)))
            (use (reg:SI 179))
            (clobber (reg:SI 179))
            (set (reg:SI 21)
                 (mem:SI (plus:SI (reg:SI 100)
                                  (const_int 4))))
            (set (reg:SI 22)
                 (mem:SI (plus:SI (reg:SI 100)
                                  (const_int 8))))])

`(match_par_dup N [SUBPAT...])'
     Like `match_op_dup', but for `match_parallel' instead of
     `match_operator'.



File: gccint.info,  Node: Output Template,  Next: Output Statement,  Prev: RTL Template,  Up: Machine Desc

16.5 Output Templates and Operand Substitution
==============================================

The "output template" is a string which specifies how to output the
assembler code for an instruction pattern.  Most of the template is a
fixed string which is output literally.  The character `%' is used to
specify where to substitute an operand; it can also be used to identify
places where different variants of the assembler require different
syntax.

 In the simplest case, a `%' followed by a digit N says to output
operand N at that point in the string.

 `%' followed by a letter and a digit says to output an operand in an
alternate fashion.  Four letters have standard, built-in meanings
described below.  The machine description macro `PRINT_OPERAND' can
define additional letters with nonstandard meanings.

 `%cDIGIT' can be used to substitute an operand that is a constant
value without the syntax that normally indicates an immediate operand.

 `%nDIGIT' is like `%cDIGIT' except that the value of the constant is
negated before printing.

 `%aDIGIT' can be used to substitute an operand as if it were a memory
reference, with the actual operand treated as the address.  This may be
useful when outputting a "load address" instruction, because often the
assembler syntax for such an instruction requires you to write the
operand as if it were a memory reference.

 `%lDIGIT' is used to substitute a `label_ref' into a jump instruction.

 `%=' outputs a number which is unique to each instruction in the
entire compilation.  This is useful for making local labels to be
referred to more than once in a single template that generates multiple
assembler instructions.

 `%' followed by a punctuation character specifies a substitution that
does not use an operand.  Only one case is standard: `%%' outputs a `%'
into the assembler code.  Other nonstandard cases can be defined in the
`PRINT_OPERAND' macro.  You must also define which punctuation
characters are valid with the `PRINT_OPERAND_PUNCT_VALID_P' macro.

 The template may generate multiple assembler instructions.  Write the
text for the instructions, with `\;' between them.

 When the RTL contains two operands which are required by constraint to
match each other, the output template must refer only to the
lower-numbered operand.  Matching operands are not always identical,
and the rest of the compiler arranges to put the proper RTL expression
for printing into the lower-numbered operand.

 One use of nonstandard letters or punctuation following `%' is to
distinguish between different assembler languages for the same machine;
for example, Motorola syntax versus MIT syntax for the 68000.  Motorola
syntax requires periods in most opcode names, while MIT syntax does
not.  For example, the opcode `movel' in MIT syntax is `move.l' in
Motorola syntax.  The same file of patterns is used for both kinds of
output syntax, but the character sequence `%.' is used in each place
where Motorola syntax wants a period.  The `PRINT_OPERAND' macro for
Motorola syntax defines the sequence to output a period; the macro for
MIT syntax defines it to do nothing.

 As a special case, a template consisting of the single character `#'
instructs the compiler to first split the insn, and then output the
resulting instructions separately.  This helps eliminate redundancy in
the output templates.   If you have a `define_insn' that needs to emit
multiple assembler instructions, and there is a matching `define_split'
already defined, then you can simply use `#' as the output template
instead of writing an output template that emits the multiple assembler
instructions.

 If the macro `ASSEMBLER_DIALECT' is defined, you can use construct of
the form `{option0|option1|option2}' in the templates.  These describe
multiple variants of assembler language syntax.  *Note Instruction
Output::.


File: gccint.info,  Node: Output Statement,  Next: Predicates,  Prev: Output Template,  Up: Machine Desc

16.6 C Statements for Assembler Output
======================================

Often a single fixed template string cannot produce correct and
efficient assembler code for all the cases that are recognized by a
single instruction pattern.  For example, the opcodes may depend on the
kinds of operands; or some unfortunate combinations of operands may
require extra machine instructions.

 If the output control string starts with a `@', then it is actually a
series of templates, each on a separate line.  (Blank lines and leading
spaces and tabs are ignored.)  The templates correspond to the
pattern's constraint alternatives (*note Multi-Alternative::).  For
example, if a target machine has a two-address add instruction `addr'
to add into a register and another `addm' to add a register to memory,
you might write this pattern:

     (define_insn "addsi3"
       [(set (match_operand:SI 0 "general_operand" "=r,m")
             (plus:SI (match_operand:SI 1 "general_operand" "0,0")
                      (match_operand:SI 2 "general_operand" "g,r")))]
       ""
       "@
        addr %2,%0
        addm %2,%0")

 If the output control string starts with a `*', then it is not an
output template but rather a piece of C program that should compute a
template.  It should execute a `return' statement to return the
template-string you want.  Most such templates use C string literals,
which require doublequote characters to delimit them.  To include these
doublequote characters in the string, prefix each one with `\'.

 If the output control string is written as a brace block instead of a
double-quoted string, it is automatically assumed to be C code.  In that
case, it is not necessary to put in a leading asterisk, or to escape the
doublequotes surrounding C string literals.

 The operands may be found in the array `operands', whose C data type
is `rtx []'.

 It is very common to select different ways of generating assembler code
based on whether an immediate operand is within a certain range.  Be
careful when doing this, because the result of `INTVAL' is an integer
on the host machine.  If the host machine has more bits in an `int'
than the target machine has in the mode in which the constant will be
used, then some of the bits you get from `INTVAL' will be superfluous.
For proper results, you must carefully disregard the values of those
bits.

 It is possible to output an assembler instruction and then go on to
output or compute more of them, using the subroutine `output_asm_insn'.
This receives two arguments: a template-string and a vector of
operands.  The vector may be `operands', or it may be another array of
`rtx' that you declare locally and initialize yourself.

 When an insn pattern has multiple alternatives in its constraints,
often the appearance of the assembler code is determined mostly by
which alternative was matched.  When this is so, the C code can test
the variable `which_alternative', which is the ordinal number of the
alternative that was actually satisfied (0 for the first, 1 for the
second alternative, etc.).

 For example, suppose there are two opcodes for storing zero, `clrreg'
for registers and `clrmem' for memory locations.  Here is how a pattern
could use `which_alternative' to choose between them:

     (define_insn ""
       [(set (match_operand:SI 0 "general_operand" "=r,m")
             (const_int 0))]
       ""
       {
       return (which_alternative == 0
               ? "clrreg %0" : "clrmem %0");
       })

 The example above, where the assembler code to generate was _solely_
determined by the alternative, could also have been specified as
follows, having the output control string start with a `@':

     (define_insn ""
       [(set (match_operand:SI 0 "general_operand" "=r,m")
             (const_int 0))]
       ""
       "@
        clrreg %0
        clrmem %0")

 If you just need a little bit of C code in one (or a few) alternatives,
you can use `*' inside of a `@' multi-alternative template:

     (define_insn ""
       [(set (match_operand:SI 0 "general_operand" "=r,<,m")
             (const_int 0))]
       ""
       "@
        clrreg %0
        * return stack_mem_p (operands[0]) ? \"push 0\" : \"clrmem %0\";
        clrmem %0")


File: gccint.info,  Node: Predicates,  Next: Constraints,  Prev: Output Statement,  Up: Machine Desc

16.7 Predicates
===============

A predicate determines whether a `match_operand' or `match_operator'
expression matches, and therefore whether the surrounding instruction
pattern will be used for that combination of operands.  GCC has a
number of machine-independent predicates, and you can define
machine-specific predicates as needed.  By convention, predicates used
with `match_operand' have names that end in `_operand', and those used
with `match_operator' have names that end in `_operator'.

 All predicates are Boolean functions (in the mathematical sense) of
two arguments: the RTL expression that is being considered at that
position in the instruction pattern, and the machine mode that the
`match_operand' or `match_operator' specifies.  In this section, the
first argument is called OP and the second argument MODE.  Predicates
can be called from C as ordinary two-argument functions; this can be
useful in output templates or other machine-specific code.

 Operand predicates can allow operands that are not actually acceptable
to the hardware, as long as the constraints give reload the ability to
fix them up (*note Constraints::).  However, GCC will usually generate
better code if the predicates specify the requirements of the machine
instructions as closely as possible.  Reload cannot fix up operands
that must be constants ("immediate operands"); you must use a predicate
that allows only constants, or else enforce the requirement in the
extra condition.

 Most predicates handle their MODE argument in a uniform manner.  If
MODE is `VOIDmode' (unspecified), then OP can have any mode.  If MODE
is anything else, then OP must have the same mode, unless OP is a
`CONST_INT' or integer `CONST_DOUBLE'.  These RTL expressions always
have `VOIDmode', so it would be counterproductive to check that their
mode matches.  Instead, predicates that accept `CONST_INT' and/or
integer `CONST_DOUBLE' check that the value stored in the constant will
fit in the requested mode.

 Predicates with this behavior are called "normal".  `genrecog' can
optimize the instruction recognizer based on knowledge of how normal
predicates treat modes.  It can also diagnose certain kinds of common
errors in the use of normal predicates; for instance, it is almost
always an error to use a normal predicate without specifying a mode.

 Predicates that do something different with their MODE argument are
called "special".  The generic predicates `address_operand' and
`pmode_register_operand' are special predicates.  `genrecog' does not
do any optimizations or diagnosis when special predicates are used.

* Menu:

* Machine-Independent Predicates::  Predicates available to all back ends.
* Defining Predicates::             How to write machine-specific predicate
                                    functions.


File: gccint.info,  Node: Machine-Independent Predicates,  Next: Defining Predicates,  Up: Predicates

16.7.1 Machine-Independent Predicates
-------------------------------------

These are the generic predicates available to all back ends.  They are
defined in `recog.c'.  The first category of predicates allow only
constant, or "immediate", operands.

 -- Function: immediate_operand
     This predicate allows any sort of constant that fits in MODE.  It
     is an appropriate choice for instructions that take operands that
     must be constant.

 -- Function: const_int_operand
     This predicate allows any `CONST_INT' expression that fits in
     MODE.  It is an appropriate choice for an immediate operand that
     does not allow a symbol or label.

 -- Function: const_double_operand
     This predicate accepts any `CONST_DOUBLE' expression that has
     exactly MODE.  If MODE is `VOIDmode', it will also accept
     `CONST_INT'.  It is intended for immediate floating point
     constants.

The second category of predicates allow only some kind of machine
register.

 -- Function: register_operand
     This predicate allows any `REG' or `SUBREG' expression that is
     valid for MODE.  It is often suitable for arithmetic instruction
     operands on a RISC machine.

 -- Function: pmode_register_operand
     This is a slight variant on `register_operand' which works around
     a limitation in the machine-description reader.

          (match_operand N "pmode_register_operand" CONSTRAINT)

     means exactly what

          (match_operand:P N "register_operand" CONSTRAINT)

     would mean, if the machine-description reader accepted `:P' mode
     suffixes.  Unfortunately, it cannot, because `Pmode' is an alias
     for some other mode, and might vary with machine-specific options.
     *Note Misc::.

 -- Function: scratch_operand
     This predicate allows hard registers and `SCRATCH' expressions,
     but not pseudo-registers.  It is used internally by
     `match_scratch'; it should not be used directly.

The third category of predicates allow only some kind of memory
reference.

 -- Function: memory_operand
     This predicate allows any valid reference to a quantity of mode
     MODE in memory, as determined by the weak form of
     `GO_IF_LEGITIMATE_ADDRESS' (*note Addressing Modes::).

 -- Function: address_operand
     This predicate is a little unusual; it allows any operand that is a
     valid expression for the _address_ of a quantity of mode MODE,
     again determined by the weak form of `GO_IF_LEGITIMATE_ADDRESS'.
     To first order, if `(mem:MODE (EXP))' is acceptable to
     `memory_operand', then EXP is acceptable to `address_operand'.
     Note that EXP does not necessarily have the mode MODE.

 -- Function: indirect_operand
     This is a stricter form of `memory_operand' which allows only
     memory references with a `general_operand' as the address
     expression.  New uses of this predicate are discouraged, because
     `general_operand' is very permissive, so it's hard to tell what an
     `indirect_operand' does or does not allow.  If a target has
     different requirements for memory operands for different
     instructions, it is better to define target-specific predicates
     which enforce the hardware's requirements explicitly.

 -- Function: push_operand
     This predicate allows a memory reference suitable for pushing a
     value onto the stack.  This will be a `MEM' which refers to
     `stack_pointer_rtx', with a side-effect in its address expression
     (*note Incdec::); which one is determined by the `STACK_PUSH_CODE'
     macro (*note Frame Layout::).

 -- Function: pop_operand
     This predicate allows a memory reference suitable for popping a
     value off the stack.  Again, this will be a `MEM' referring to
     `stack_pointer_rtx', with a side-effect in its address expression.
     However, this time `STACK_POP_CODE' is expected.

The fourth category of predicates allow some combination of the above
operands.

 -- Function: nonmemory_operand
     This predicate allows any immediate or register operand valid for
     MODE.

 -- Function: nonimmediate_operand
     This predicate allows any register or memory operand valid for
     MODE.

 -- Function: general_operand
     This predicate allows any immediate, register, or memory operand
     valid for MODE.

Finally, there are two generic operator predicates.

 -- Function: comparison_operator
     This predicate matches any expression which performs an arithmetic
     comparison in MODE; that is, `COMPARISON_P' is true for the
     expression code.

 -- Function: ordered_comparison_operator
     This predicate matches any expression which performs an arithmetic
     comparison in MODE and whose expression code is valid for integer
     modes; that is, the expression code will be one of `eq', `ne',
     `lt', `ltu', `le', `leu', `gt', `gtu', `ge', `geu'.


File: gccint.info,  Node: Defining Predicates,  Prev: Machine-Independent Predicates,  Up: Predicates

16.7.2 Defining Machine-Specific Predicates
-------------------------------------------

Many machines have requirements for their operands that cannot be
expressed precisely using the generic predicates.  You can define
additional predicates using `define_predicate' and
`define_special_predicate' expressions.  These expressions have three
operands:

   * The name of the predicate, as it will be referred to in
     `match_operand' or `match_operator' expressions.

   * An RTL expression which evaluates to true if the predicate allows
     the operand OP, false if it does not.  This expression can only use
     the following RTL codes:

    `MATCH_OPERAND'
          When written inside a predicate expression, a `MATCH_OPERAND'
          expression evaluates to true if the predicate it names would
          allow OP.  The operand number and constraint are ignored.
          Due to limitations in `genrecog', you can only refer to
          generic predicates and predicates that have already been
          defined.

    `MATCH_CODE'
          This expression evaluates to true if OP or a specified
          subexpression of OP has one of a given list of RTX codes.

          The first operand of this expression is a string constant
          containing a comma-separated list of RTX code names (in lower
          case).  These are the codes for which the `MATCH_CODE' will
          be true.

          The second operand is a string constant which indicates what
          subexpression of OP to examine.  If it is absent or the empty
          string, OP itself is examined.  Otherwise, the string constant
          must be a sequence of digits and/or lowercase letters.  Each
          character indicates a subexpression to extract from the
          current expression; for the first character this is OP, for
          the second and subsequent characters it is the result of the
          previous character.  A digit N extracts `XEXP (E, N)'; a
          letter L extracts `XVECEXP (E, 0, N)' where N is the
          alphabetic ordinal of L (0 for `a', 1 for 'b', and so on).
          The `MATCH_CODE' then examines the RTX code of the
          subexpression extracted by the complete string.  It is not
          possible to extract components of an `rtvec' that is not at
          position 0 within its RTX object.

    `MATCH_TEST'
          This expression has one operand, a string constant containing
          a C expression.  The predicate's arguments, OP and MODE, are
          available with those names in the C expression.  The
          `MATCH_TEST' evaluates to true if the C expression evaluates
          to a nonzero value.  `MATCH_TEST' expressions must not have
          side effects.

    `AND'
    `IOR'
    `NOT'
    `IF_THEN_ELSE'
          The basic `MATCH_' expressions can be combined using these
          logical operators, which have the semantics of the C operators
          `&&', `||', `!', and `? :' respectively.  As in Common Lisp,
          you may give an `AND' or `IOR' expression an arbitrary number
          of arguments; this has exactly the same effect as writing a
          chain of two-argument `AND' or `IOR' expressions.

   * An optional block of C code, which should execute `return true' if
     the predicate is found to match and `return false' if it does not.
     It must not have any side effects.  The predicate arguments, OP
     and MODE, are available with those names.

     If a code block is present in a predicate definition, then the RTL
     expression must evaluate to true _and_ the code block must execute
     `return true' for the predicate to allow the operand.  The RTL
     expression is evaluated first; do not re-check anything in the
     code block that was checked in the RTL expression.

 The program `genrecog' scans `define_predicate' and
`define_special_predicate' expressions to determine which RTX codes are
possibly allowed.  You should always make this explicit in the RTL
predicate expression, using `MATCH_OPERAND' and `MATCH_CODE'.

 Here is an example of a simple predicate definition, from the IA64
machine description:

     ;; True if OP is a `SYMBOL_REF' which refers to the sdata section.
     (define_predicate "small_addr_symbolic_operand"
       (and (match_code "symbol_ref")
            (match_test "SYMBOL_REF_SMALL_ADDR_P (op)")))

And here is another, showing the use of the C block.

     ;; True if OP is a register operand that is (or could be) a GR reg.
     (define_predicate "gr_register_operand"
       (match_operand 0 "register_operand")
     {
       unsigned int regno;
       if (GET_CODE (op) == SUBREG)
         op = SUBREG_REG (op);

       regno = REGNO (op);
       return (regno >= FIRST_PSEUDO_REGISTER || GENERAL_REGNO_P (regno));
     })

 Predicates written with `define_predicate' automatically include a
test that MODE is `VOIDmode', or OP has the same mode as MODE, or OP is
a `CONST_INT' or `CONST_DOUBLE'.  They do _not_ check specifically for
integer `CONST_DOUBLE', nor do they test that the value of either kind
of constant fits in the requested mode.  This is because
target-specific predicates that take constants usually have to do more
stringent value checks anyway.  If you need the exact same treatment of
`CONST_INT' or `CONST_DOUBLE' that the generic predicates provide, use
a `MATCH_OPERAND' subexpression to call `const_int_operand',
`const_double_operand', or `immediate_operand'.

 Predicates written with `define_special_predicate' do not get any
automatic mode checks, and are treated as having special mode handling
by `genrecog'.

 The program `genpreds' is responsible for generating code to test
predicates.  It also writes a header file containing function
declarations for all machine-specific predicates.  It is not necessary
to declare these predicates in `CPU-protos.h'.


File: gccint.info,  Node: Constraints,  Next: Standard Names,  Prev: Predicates,  Up: Machine Desc

16.8 Operand Constraints
========================

Each `match_operand' in an instruction pattern can specify constraints
for the operands allowed.  The constraints allow you to fine-tune
matching within the set of operands allowed by the predicate.

 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.
* Class Preferences::   Constraints guide which hard register to put things in.
* Modifiers::           More precise control over effects of constraints.
* Machine Constraints:: Existing constraints for some particular machines.
* Disable Insn Alternatives:: Disable insn alternatives using the `enabled' attribute.
* Define Constraints::  How to define machine-specific constraints.
* C Constraint Interface:: How to test constraints from C code.


File: gccint.info,  Node: Simple Constraints,  Next: Multi-Alternative,  Up: Constraints

16.8.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, even if it does not satisfy
     `general_operand'.  This is normally used in the constraint of a
     `match_scratch' when certain alternatives will not actually
     require a scratch register.

`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
     considered separate in the RTL insn.  For example, an add insn has
     two input operands and one output operand in the RTL, 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.

     For operands to match in a particular case usually means that they
     are identical-looking RTL expressions.  But in a few special cases
     specific kinds of dissimilarity are allowed.  For example, `*x' as
     an input operand will match `*x++' as an output operand.  For
     proper results in such cases, the output template should always
     use the output-operand's number when printing the operand.

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

 In order to have valid assembler code, each operand must satisfy its
constraint.  But a failure to do so does not prevent the pattern from
applying to an insn.  Instead, it directs the compiler to modify the
code so that the constraint will be satisfied.  Usually this is done by
copying an operand into a register.

 Contrast, therefore, the two instruction patterns that follow:

     (define_insn ""
       [(set (match_operand:SI 0 "general_operand" "=r")
             (plus:SI (match_dup 0)
                      (match_operand:SI 1 "general_operand" "r")))]
       ""
       "...")

which has two operands, one of which must appear in two places, and

     (define_insn ""
       [(set (match_operand:SI 0 "general_operand" "=r")
             (plus:SI (match_operand:SI 1 "general_operand" "0")
                      (match_operand:SI 2 "general_operand" "r")))]
       ""
       "...")

which has three operands, two of which are required by a constraint to
be identical.  If we are considering an insn of the form

     (insn N PREV NEXT
       (set (reg:SI 3)
            (plus:SI (reg:SI 6) (reg:SI 109)))
       ...)

the first pattern would not apply at all, because this insn does not
contain two identical subexpressions in the right place.  The pattern
would say, "That does not look like an add instruction; try other
patterns".  The second pattern would say, "Yes, that's an add
instruction, but there is something wrong with it".  It would direct
the reload pass of the compiler to generate additional insns to make
the constraint true.  The results might look like this:

     (insn N2 PREV N
       (set (reg:SI 3) (reg:SI 6))
       ...)

     (insn N N2 NEXT
       (set (reg:SI 3)
            (plus:SI (reg:SI 3) (reg:SI 109)))
       ...)

 It is up to you to make sure that each operand, in each pattern, has
constraints that can handle any RTL expression that could be present for
that operand.  (When multiple alternatives are in use, each pattern
must, for each possible combination of operand expressions, have at
least one alternative which can handle that combination of operands.)
The constraints don't need to _allow_ any possible operand--when this is
the case, they do not constrain--but they must at least point the way to
reloading any possible operand so that it will fit.

   * If the constraint accepts whatever operands the predicate permits,
     there is no problem: reloading is never necessary for this operand.

     For example, an operand whose constraints permit everything except
     registers is safe provided its predicate rejects registers.

     An operand whose predicate accepts only constant values is safe
     provided its constraints include the letter `i'.  If any possible
     constant value is accepted, then nothing less than `i' will do; if
     the predicate is more selective, then the constraints may also be
     more selective.

   * Any operand expression can be reloaded by copying it into a
     register.  So if an operand's constraints allow some kind of
     register, it is certain to be safe.  It need not permit all
     classes of registers; the compiler knows how to copy a register
     into another register of the proper class in order to make an
     instruction valid.

   * A nonoffsettable memory reference can be reloaded by copying the
     address into a register.  So if the constraint uses the letter
     `o', all memory references are taken care of.

   * A constant operand can be reloaded by allocating space in memory to
     hold it as preinitialized data.  Then the memory reference can be
     used in place of the constant.  So if the constraint uses the
     letters `o' or `m', constant operands are not a problem.

   * If the constraint permits a constant and a pseudo register used in
     an insn was not allocated to a hard register and is equivalent to
     a constant, the register will be replaced with the constant.  If
     the predicate does not permit a constant and the insn is
     re-recognized for some reason, the compiler will crash.  Thus the
     predicate must always recognize any objects allowed by the
     constraint.

 If the operand's predicate can recognize registers, but the constraint
does not permit them, it can make the compiler crash.  When this
operand happens to be a register, the reload pass will be stymied,
because it does not know how to copy a register temporarily into memory.

 If the predicate accepts a unary operator, the constraint applies to
the operand.  For example, the MIPS processor at ISA level 3 supports an
instruction which adds two registers in `SImode' to produce a `DImode'
result, but only if the registers are correctly sign extended.  This
predicate for the input operands accepts a `sign_extend' of an `SImode'
register.  Write the constraint to indicate the type of register that
is required for the operand of the `sign_extend'.


File: gccint.info,  Node: Multi-Alternative,  Next: Class Preferences,  Prev: Simple Constraints,  Up: Constraints

16.8.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.  Here is how it is done for fullword logical-or on the
68000:

     (define_insn "iorsi3"
       [(set (match_operand:SI 0 "general_operand" "=m,d")
             (ior:SI (match_operand:SI 1 "general_operand" "%0,0")
                     (match_operand:SI 2 "general_operand" "dKs,dmKs")))]
       ...)

 The first alternative has `m' (memory) for operand 0, `0' for operand
1 (meaning it must match operand 0), and `dKs' for operand 2.  The
second alternative has `d' (data register) for operand 0, `0' for
operand 1, and `dmKs' for operand 2.  The `=' and `%' in the
constraints apply to all the alternatives; their meaning is explained
in the next section (*note Class Preferences::).

 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.

 When an insn pattern has multiple alternatives in its constraints,
often the appearance of the assembler code is determined mostly by which
alternative was matched.  When this is so, the C code for writing the
assembler code can use the variable `which_alternative', which is the
ordinal number of the alternative that was actually satisfied (0 for
the first, 1 for the second alternative, etc.).  *Note Output
Statement::.


File: gccint.info,  Node: Class Preferences,  Next: Modifiers,  Prev: Multi-Alternative,  Up: Constraints

16.8.3 Register Class Preferences
---------------------------------

The operand constraints have another function: they enable the compiler
to decide which kind of hardware register a pseudo register is best
allocated to.  The compiler examines the constraints that apply to the
insns that use the pseudo register, looking for the machine-dependent
letters such as `d' and `a' that specify classes of registers.  The
pseudo register is put in whichever class gets the most "votes".  The
constraint letters `g' and `r' also vote: they vote in favor of a
general register.  The machine description says which registers are
considered general.

 Of course, on some machines all registers are equivalent, and no
register classes are defined.  Then none of this complexity is relevant.


File: gccint.info,  Node: Modifiers,  Next: Machine Constraints,  Prev: Class Preferences,  Up: Constraints

16.8.4 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.  This is often used in patterns for addition
     instructions that really have only two operands: the result must
     go in one of the arguments.  Here for example, is how the 68000
     halfword-add instruction is defined:

          (define_insn "addhi3"
            [(set (match_operand:HI 0 "general_operand" "=m,r")
               (plus:HI (match_operand:HI 1 "general_operand" "%0,0")
                        (match_operand:HI 2 "general_operand" "di,g")))]
            ...)
     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.

     Here is an example: the 68000 has an instruction to sign-extend a
     halfword in a data register, and can also sign-extend a value by
     copying it into an address register.  While either kind of
     register is acceptable, the constraints on an address-register
     destination are less strict, so it is best if register allocation
     makes an address register its goal.  Therefore, `*' is used so
     that the `d' constraint letter (for data register) is ignored when
     computing register preferences.

          (define_insn "extendhisi2"
            [(set (match_operand:SI 0 "general_operand" "=*d,a")
                  (sign_extend:SI
                   (match_operand:HI 1 "general_operand" "0,g")))]
            ...)


File: gccint.info,  Node: Machine Constraints,  Next: Disable Insn Alternatives,  Prev: Modifiers,  Up: Constraints

16.8.5 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

    `Usa'
          An absolute symbolic address

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

    `Car'
          Constant suitable for the addsi3_r pattern.  This is a valid
          offset For byte, halfword, or word addressing.

    `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/rs6000.h'_

    `b'
          Address base register

    `d'
          Floating point register (containing 64-bit value)

    `f'
          Floating point register (containing 32-bit value)

    `v'
          Altivec vector register

    `wd'
          VSX vector register to hold vector double data

    `wf'
          VSX vector register to hold vector float data

    `ws'
          VSX vector register to hold scalar float data

    `wa'
          Any VSX register

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

    `l'
          Any register that can be used as the index in a base+index
          memory access: that is, any general register except the stack
          pointer.

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

    `Y2'
          Any SSE register, when SSE2 is enabled.

    `Yi'
          Any SSE register, when SSE2 and inter-unit moves are enabled.

    `Ym'
          Any MMX register, when inter-unit moves are enabled.

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

    `O'
          Integer constant in the range 0 ... 127, for 128-bit shifts.

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

    `S0'
          On C64x+ targets, a GP-relative small data reference.

    `S1'
          Any kind of `SYMBOL_REF', for use in a call address.

    `Si'
          Any kind of immediate operand, unless it matches the S0
          constraint.

    `T'
          Memory location with B base register, but not using a long
          offset.

    `W'
          A memory operand with an address that can't be used in an
          unaligned access.

    `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: gccint.info,  Node: Disable Insn Alternatives,  Next: Define Constraints,  Prev: Machine Constraints,  Up: Constraints

16.8.6 Disable insn alternatives using the `enabled' attribute
--------------------------------------------------------------

The `enabled' insn attribute may be used to disable certain insn
alternatives for machine-specific reasons.  This is useful when adding
new instructions to an existing pattern which are only available for
certain cpu architecture levels as specified with the `-march=' option.

 If an insn alternative is disabled, then it will never be used.  The
compiler treats the constraints for the disabled alternative as
unsatisfiable.

 In order to make use of the `enabled' attribute a back end has to add
in the machine description files:

  1. A definition of the `enabled' insn attribute.  The attribute is
     defined as usual using the `define_attr' command.  This definition
     should be based on other insn attributes and/or target flags.  The
     `enabled' attribute is a numeric attribute and should evaluate to
     `(const_int 1)' for an enabled alternative and to `(const_int 0)'
     otherwise.

  2. A definition of another insn attribute used to describe for what
     reason an insn alternative might be available or not.  E.g.
     `cpu_facility' as in the example below.

  3. An assignment for the second attribute to each insn definition
     combining instructions which are not all available under the same
     circumstances.  (Note: It obviously only makes sense for
     definitions with more than one alternative.  Otherwise the insn
     pattern should be disabled or enabled using the insn condition.)

 E.g. the following two patterns could easily be merged using the
`enabled' attribute:


     (define_insn "*movdi_old"
       [(set (match_operand:DI 0 "register_operand" "=d")
             (match_operand:DI 1 "register_operand" " d"))]
       "!TARGET_NEW"
       "lgr %0,%1")

     (define_insn "*movdi_new"
       [(set (match_operand:DI 0 "register_operand" "=d,f,d")
             (match_operand:DI 1 "register_operand" " d,d,f"))]
       "TARGET_NEW"
       "@
        lgr  %0,%1
        ldgr %0,%1
        lgdr %0,%1")

 to:


     (define_insn "*movdi_combined"
       [(set (match_operand:DI 0 "register_operand" "=d,f,d")
             (match_operand:DI 1 "register_operand" " d,d,f"))]
       ""
       "@
        lgr  %0,%1
        ldgr %0,%1
        lgdr %0,%1"
       [(set_attr "cpu_facility" "*,new,new")])

 with the `enabled' attribute defined like this:


     (define_attr "cpu_facility" "standard,new" (const_string "standard"))

     (define_attr "enabled" ""
       (cond [(eq_attr "cpu_facility" "standard") (const_int 1)
              (and (eq_attr "cpu_facility" "new")
                   (ne (symbol_ref "TARGET_NEW") (const_int 0)))
              (const_int 1)]
             (const_int 0)))


File: gccint.info,  Node: Define Constraints,  Next: C Constraint Interface,  Prev: Disable Insn Alternatives,  Up: Constraints

16.8.7 Defining Machine-Specific Constraints
--------------------------------------------

Machine-specific constraints fall into two categories: register and
non-register constraints.  Within the latter category, constraints
which allow subsets of all possible memory or address operands should
be specially marked, to give `reload' more information.

 Machine-specific constraints can be given names of arbitrary length,
but they must be entirely composed of letters, digits, underscores
(`_'), and angle brackets (`< >').  Like C identifiers, they must begin
with a letter or underscore.

 In order to avoid ambiguity in operand constraint strings, no
constraint can have a name that begins with any other constraint's
name.  For example, if `x' is defined as a constraint name, `xy' may
not be, and vice versa.  As a consequence of this rule, no constraint
may begin with one of the generic constraint letters: `E F V X g i m n
o p r s'.

 Register constraints correspond directly to register classes.  *Note
Register Classes::.  There is thus not much flexibility in their
definitions.

 -- MD Expression: define_register_constraint name regclass docstring
     All three arguments are string constants.  NAME is the name of the
     constraint, as it will appear in `match_operand' expressions.  If
     NAME is a multi-letter constraint its length shall be the same for
     all constraints starting with the same letter.  REGCLASS can be
     either the name of the corresponding register class (*note
     Register Classes::), or a C expression which evaluates to the
     appropriate register class.  If it is an expression, it must have
     no side effects, and it cannot look at the operand.  The usual use
     of expressions is to map some register constraints to `NO_REGS'
     when the register class is not available on a given
     subarchitecture.

     DOCSTRING is a sentence documenting the meaning of the constraint.
     Docstrings are explained further below.

 Non-register constraints are more like predicates: the constraint
definition gives a Boolean expression which indicates whether the
constraint matches.

 -- MD Expression: define_constraint name docstring exp
     The NAME and DOCSTRING arguments are the same as for
     `define_register_constraint', but note that the docstring comes
     immediately after the name for these expressions.  EXP is an RTL
     expression, obeying the same rules as the RTL expressions in
     predicate definitions.  *Note Defining Predicates::, for details.
     If it evaluates true, the constraint matches; if it evaluates
     false, it doesn't. Constraint expressions should indicate which
     RTL codes they might match, just like predicate expressions.

     `match_test' C expressions have access to the following variables:

    OP
          The RTL object defining the operand.

    MODE
          The machine mode of OP.

    IVAL
          `INTVAL (OP)', if OP is a `const_int'.

    HVAL
          `CONST_DOUBLE_HIGH (OP)', if OP is an integer `const_double'.

    LVAL
          `CONST_DOUBLE_LOW (OP)', if OP is an integer `const_double'.

    RVAL
          `CONST_DOUBLE_REAL_VALUE (OP)', if OP is a floating-point
          `const_double'.

     The *VAL variables should only be used once another piece of the
     expression has verified that OP is the appropriate kind of RTL
     object.

 Most non-register constraints should be defined with
`define_constraint'.  The remaining two definition expressions are only
appropriate for constraints that should be handled specially by
`reload' if they fail to match.

 -- MD Expression: define_memory_constraint name docstring exp
     Use this expression for constraints that match a subset of all
     memory operands: that is, `reload' can make them match by
     converting the operand to the form `(mem (reg X))', where X is a
     base register (from the register class specified by
     `BASE_REG_CLASS', *note Register Classes::).

     For example, on the S/390, some instructions do not accept
     arbitrary memory references, but only those that do not make use
     of an index register.  The constraint letter `Q' is defined to
     represent a memory address of this type.  If `Q' is defined with
     `define_memory_constraint', a `Q' constraint can handle any memory
     operand, because `reload' knows it can simply copy the memory
     address into a base register if required.  This is analogous to
     the way an `o' constraint can handle any memory operand.

     The syntax and semantics are otherwise identical to
     `define_constraint'.

 -- MD Expression: define_address_constraint name docstring exp
     Use this expression for constraints that match a subset of all
     address operands: that is, `reload' can make the constraint match
     by converting the operand to the form `(reg X)', again with X a
     base register.

     Constraints defined with `define_address_constraint' can only be
     used with the `address_operand' predicate, or machine-specific
     predicates that work the same way.  They are treated analogously to
     the generic `p' constraint.

     The syntax and semantics are otherwise identical to
     `define_constraint'.

 For historical reasons, names beginning with the letters `G H' are
reserved for constraints that match only `const_double's, and names
beginning with the letters `I J K L M N O P' are reserved for
constraints that match only `const_int's.  This may change in the
future.  For the time being, constraints with these names must be
written in a stylized form, so that `genpreds' can tell you did it
correctly:

     (define_constraint "[GHIJKLMNOP]..."
       "DOC..."
       (and (match_code "const_int")  ; `const_double' for G/H
            CONDITION...))            ; usually a `match_test'

 It is fine to use names beginning with other letters for constraints
that match `const_double's or `const_int's.

 Each docstring in a constraint definition should be one or more
complete sentences, marked up in Texinfo format.  _They are currently
unused._ In the future they will be copied into the GCC manual, in
*note Machine Constraints::, replacing the hand-maintained tables
currently found in that section.  Also, in the future the compiler may
use this to give more helpful diagnostics when poor choice of `asm'
constraints causes a reload failure.

 If you put the pseudo-Texinfo directive `@internal' at the beginning
of a docstring, then (in the future) it will appear only in the
internals manual's version of the machine-specific constraint tables.
Use this for constraints that should not appear in `asm' statements.


File: gccint.info,  Node: C Constraint Interface,  Prev: Define Constraints,  Up: Constraints

16.8.8 Testing constraints from C
---------------------------------

It is occasionally useful to test a constraint from C code rather than
implicitly via the constraint string in a `match_operand'.  The
generated file `tm_p.h' declares a few interfaces for working with
machine-specific constraints.  None of these interfaces work with the
generic constraints described in *note Simple Constraints::.  This may
change in the future.

 *Warning:* `tm_p.h' may declare other functions that operate on
constraints, besides the ones documented here.  Do not use those
functions from machine-dependent code.  They exist to implement the old
constraint interface that machine-independent components of the
compiler still expect.  They will change or disappear in the future.

 Some valid constraint names are not valid C identifiers, so there is a
mangling scheme for referring to them from C.  Constraint names that do
not contain angle brackets or underscores are left unchanged.
Underscores are doubled, each `<' is replaced with `_l', and each `>'
with `_g'.  Here are some examples:

     *Original* *Mangled*
     `x'        `x'
     `P42x'     `P42x'
     `P4_x'     `P4__x'
     `P4>x'     `P4_gx'
     `P4>>'     `P4_g_g'
     `P4_g>'    `P4__g_g'

 Throughout this section, the variable C is either a constraint in the
abstract sense, or a constant from `enum constraint_num'; the variable
M is a mangled constraint name (usually as part of a larger identifier).

 -- Enum: constraint_num
     For each machine-specific constraint, there is a corresponding
     enumeration constant: `CONSTRAINT_' plus the mangled name of the
     constraint.  Functions that take an `enum constraint_num' as an
     argument expect one of these constants.

     Machine-independent constraints do not have associated constants.
     This may change in the future.

 -- Function: inline bool satisfies_constraint_M (rtx EXP)
     For each machine-specific, non-register constraint M, there is one
     of these functions; it returns `true' if EXP satisfies the
     constraint.  These functions are only visible if `rtl.h' was
     included before `tm_p.h'.

 -- Function: bool constraint_satisfied_p (rtx EXP, enum constraint_num
          C)
     Like the `satisfies_constraint_M' functions, but the constraint to
     test is given as an argument, C.  If C specifies a register
     constraint, this function will always return `false'.

 -- Function: enum reg_class regclass_for_constraint (enum
          constraint_num C)
     Returns the register class associated with C.  If C is not a
     register constraint, or those registers are not available for the
     currently selected subtarget, returns `NO_REGS'.

 Here is an example use of `satisfies_constraint_M'.  In peephole
optimizations (*note Peephole Definitions::), operand constraint
strings are ignored, so if there are relevant constraints, they must be
tested in the C condition.  In the example, the optimization is applied
if operand 2 does _not_ satisfy the `K' constraint.  (This is a
simplified version of a peephole definition from the i386 machine
description.)

     (define_peephole2
       [(match_scratch:SI 3 "r")
        (set (match_operand:SI 0 "register_operand" "")
             (mult:SI (match_operand:SI 1 "memory_operand" "")
                      (match_operand:SI 2 "immediate_operand" "")))]

       "!satisfies_constraint_K (operands[2])"

       [(set (match_dup 3) (match_dup 1))
        (set (match_dup 0) (mult:SI (match_dup 3) (match_dup 2)))]

       "")


File: gccint.info,  Node: Standard Names,  Next: Pattern Ordering,  Prev: Constraints,  Up: Machine Desc

16.9 Standard Pattern Names For Generation
==========================================

Here is a table of the instruction names that are meaningful in the RTL
generation pass of the compiler.  Giving one of these names to an
instruction pattern tells the RTL generation pass that it can use the
pattern to accomplish a certain task.

`movM'
     Here M stands for a two-letter machine mode name, in lowercase.
     This instruction pattern moves data with that machine mode from
     operand 1 to operand 0.  For example, `movsi' moves full-word data.

     If operand 0 is a `subreg' with mode M of a register whose own
     mode is wider than M, the effect of this instruction is to store
     the specified value in the part of the register that corresponds
     to mode M.  Bits outside of M, but which are within the same
     target word as the `subreg' are undefined.  Bits which are outside
     the target word are left unchanged.

     This class of patterns is special in several ways.  First of all,
     each of these names up to and including full word size _must_ be
     defined, because there is no other way to copy a datum from one
     place to another.  If there are patterns accepting operands in
     larger modes, `movM' must be defined for integer modes of those
     sizes.

     Second, these patterns are not used solely in the RTL generation
     pass.  Even the reload pass can generate move insns to copy values
     from stack slots into temporary registers.  When it does so, one
     of the operands is a hard register and the other is an operand
     that can need to be reloaded into a register.

     Therefore, when given such a pair of operands, the pattern must
     generate RTL which needs no reloading and needs no temporary
     registers--no registers other than the operands.  For example, if
     you support the pattern with a `define_expand', then in such a
     case the `define_expand' mustn't call `force_reg' or any other such
     function which might generate new pseudo registers.

     This requirement exists even for subword modes on a RISC machine
     where fetching those modes from memory normally requires several
     insns and some temporary registers.

     During reload a memory reference with an invalid address may be
     passed as an operand.  Such an address will be replaced with a
     valid address later in the reload pass.  In this case, nothing may
     be done with the address except to use it as it stands.  If it is
     copied, it will not be replaced with a valid address.  No attempt
     should be made to make such an address into a valid address and no
     routine (such as `change_address') that will do so may be called.
     Note that `general_operand' will fail when applied to such an
     address.

     The global variable `reload_in_progress' (which must be explicitly
     declared if required) can be used to determine whether such special
     handling is required.

     The variety of operands that have reloads depends on the rest of
     the machine description, but typically on a RISC machine these can
     only be pseudo registers that did not get hard registers, while on
     other machines explicit memory references will get optional
     reloads.

     If a scratch register is required to move an object to or from
     memory, it can be allocated using `gen_reg_rtx' prior to life
     analysis.

     If there are cases which need scratch registers during or after
     reload, you must provide an appropriate secondary_reload target
     hook.

     The macro `can_create_pseudo_p' can be used to determine if it is
     unsafe to create new pseudo registers.  If this variable is
     nonzero, then it is unsafe to call `gen_reg_rtx' to allocate a new
     pseudo.

     The constraints on a `movM' must permit moving any hard register
     to any other hard register provided that `HARD_REGNO_MODE_OK'
     permits mode M in both registers and `TARGET_REGISTER_MOVE_COST'
     applied to their classes returns a value of 2.

     It is obligatory to support floating point `movM' instructions
     into and out of any registers that can hold fixed point values,
     because unions and structures (which have modes `SImode' or
     `DImode') can be in those registers and they may have floating
     point members.

     There may also be a need to support fixed point `movM'
     instructions in and out of floating point registers.
     Unfortunately, I have forgotten why this was so, and I don't know
     whether it is still true.  If `HARD_REGNO_MODE_OK' rejects fixed
     point values in floating point registers, then the constraints of
     the fixed point `movM' instructions must be designed to avoid ever
     trying to reload into a floating point register.

`reload_inM'
`reload_outM'
     These named patterns have been obsoleted by the target hook
     `secondary_reload'.

     Like `movM', but used when a scratch register is required to move
     between operand 0 and operand 1.  Operand 2 describes the scratch
     register.  See the discussion of the `SECONDARY_RELOAD_CLASS'
     macro in *note Register Classes::.

     There are special restrictions on the form of the `match_operand's
     used in these patterns.  First, only the predicate for the reload
     operand is examined, i.e., `reload_in' examines operand 1, but not
     the predicates for operand 0 or 2.  Second, there may be only one
     alternative in the constraints.  Third, only a single register
     class letter may be used for the constraint; subsequent constraint
     letters are ignored.  As a special exception, an empty constraint
     string matches the `ALL_REGS' register class.  This may relieve
     ports of the burden of defining an `ALL_REGS' constraint letter
     just for these patterns.

`movstrictM'
     Like `movM' except that if operand 0 is a `subreg' with mode M of
     a register whose natural mode is wider, the `movstrictM'
     instruction is guaranteed not to alter any of the register except
     the part which belongs to mode M.

`movmisalignM'
     This variant of a move pattern is designed to load or store a value
     from a memory address that is not naturally aligned for its mode.
     For a store, the memory will be in operand 0; for a load, the
     memory will be in operand 1.  The other operand is guaranteed not
     to be a memory, so that it's easy to tell whether this is a load
     or store.

     This pattern is used by the autovectorizer, and when expanding a
     `MISALIGNED_INDIRECT_REF' expression.

`load_multiple'
     Load several consecutive memory locations into consecutive
     registers.  Operand 0 is the first of the consecutive registers,
     operand 1 is the first memory location, and operand 2 is a
     constant: the number of consecutive registers.

     Define this only if the target machine really has such an
     instruction; do not define this if the most efficient way of
     loading consecutive registers from memory is to do them one at a
     time.

     On some machines, there are restrictions as to which consecutive
     registers can be stored into memory, such as particular starting or
     ending register numbers or only a range of valid counts.  For those
     machines, use a `define_expand' (*note Expander Definitions::) and
     make the pattern fail if the restrictions are not met.

     Write the generated insn as a `parallel' with elements being a
     `set' of one register from the appropriate memory location (you may
     also need `use' or `clobber' elements).  Use a `match_parallel'
     (*note RTL Template::) to recognize the insn.  See `rs6000.md' for
     examples of the use of this insn pattern.

`store_multiple'
     Similar to `load_multiple', but store several consecutive registers
     into consecutive memory locations.  Operand 0 is the first of the
     consecutive memory locations, operand 1 is the first register, and
     operand 2 is a constant: the number of consecutive registers.

`vec_load_lanesMN'
     Perform an interleaved load of several vectors from memory operand
     1 into register operand 0.  Both operands have mode M.  The
     register operand is viewed as holding consecutive vectors of mode
     N, while the memory operand is a flat array that contains the same
     number of elements.  The operation is equivalent to:

          int c = GET_MODE_SIZE (M) / GET_MODE_SIZE (N);
          for (j = 0; j < GET_MODE_NUNITS (N); j++)
            for (i = 0; i < c; i++)
              operand0[i][j] = operand1[j * c + i];

     For example, `vec_load_lanestiv4hi' loads 8 16-bit values from
     memory into a register of mode `TI'.  The register contains two
     consecutive vectors of mode `V4HI'.

     This pattern can only be used if:
          TARGET_ARRAY_MODE_SUPPORTED_P (N, C)
     is true.  GCC assumes that, if a target supports this kind of
     instruction for some mode N, it also supports unaligned loads for
     vectors of mode N.

`vec_store_lanesMN'
     Equivalent to `vec_load_lanesMN', with the memory and register
     operands reversed.  That is, the instruction is equivalent to:

          int c = GET_MODE_SIZE (M) / GET_MODE_SIZE (N);
          for (j = 0; j < GET_MODE_NUNITS (N); j++)
            for (i = 0; i < c; i++)
              operand0[j * c + i] = operand1[i][j];

     for a memory operand 0 and register operand 1.

`vec_setM'
     Set given field in the vector value.  Operand 0 is the vector to
     modify, operand 1 is new value of field and operand 2 specify the
     field index.

`vec_extractM'
     Extract given field from the vector value.  Operand 1 is the
     vector, operand 2 specify field index and operand 0 place to store
     value into.

`vec_initM'
     Initialize the vector to given values.  Operand 0 is the vector to
     initialize and operand 1 is parallel containing values for
     individual fields.

`vcondMN'
     Output a conditional vector move.  Operand 0 is the destination to
     receive a combination of operand 1 and operand 2, which are of
     mode M, dependent on the outcome of the predicate in operand 3
     which is a vector comparison with operands of mode N in operands 4
     and 5.  The modes M and N should have the same size.  Operand 0
     will be set to the value OP1 & MSK | OP2 & ~MSK where MSK is
     computed by element-wise evaluation of the vector comparison with
     a truth value of all-ones and a false value of all-zeros.

`vec_permM'
     Output a (variable) vector permutation.  Operand 0 is the
     destination to receive elements from operand 1 and operand 2,
     which are of mode M.  Operand 3 is the "selector".  It is an
     integral mode vector of the same width and number of elements as
     mode M.

     The input elements are numbered from 0 in operand 1 through 2*N-1
     in operand 2.  The elements of the selector must be computed
     modulo 2*N.  Note that if `rtx_equal_p(operand1, operand2)', this
     can be implemented with just operand 1 and selector elements
     modulo N.

     In order to make things easy for a number of targets, if there is
     no `vec_perm' pattern for mode M, but there is for mode Q where Q
     is a vector of `QImode' of the same width as M, the middle-end
     will lower the mode M `VEC_PERM_EXPR' to mode Q.

`vec_perm_constM'
     Like `vec_perm' except that the permutation is a compile-time
     constant.  That is, operand 3, the "selector", is a `CONST_VECTOR'.

     Some targets cannot perform a permutation with a variable selector,
     but can efficiently perform a constant permutation.  Further, the
     target hook `vec_perm_ok' is queried to determine if the specific
     constant permutation is available efficiently; the named pattern
     is never expanded without `vec_perm_ok' returning true.

     There is no need for a target to supply both `vec_permM' and
     `vec_perm_constM' if the former can trivially implement the
     operation with, say, the vector constant loaded into a register.

`pushM1'
     Output a push instruction.  Operand 0 is value to push.  Used only
     when `PUSH_ROUNDING' is defined.  For historical reason, this
     pattern may be missing and in such case an `mov' expander is used
     instead, with a `MEM' expression forming the push operation.  The
     `mov' expander method is deprecated.

`addM3'
     Add operand 2 and operand 1, storing the result in operand 0.  All
     operands must have mode M.  This can be used even on two-address
     machines, by means of constraints requiring operands 1 and 0 to be
     the same location.

`ssaddM3', `usaddM3'
`subM3', `sssubM3', `ussubM3'
`mulM3', `ssmulM3', `usmulM3'
`divM3', `ssdivM3'
`udivM3', `usdivM3'
`modM3', `umodM3'
`uminM3', `umaxM3'
`andM3', `iorM3', `xorM3'
     Similar, for other arithmetic operations.

`fmaM4'
     Multiply operand 2 and operand 1, then add operand 3, storing the
     result in operand 0 without doing an intermediate rounding step.
     All operands must have mode M.  This pattern is used to implement
     the `fma', `fmaf', and `fmal' builtin functions from the ISO C99
     standard.

`fmsM4'
     Like `fmaM4', except operand 3 subtracted from the product instead
     of added to the product.  This is represented in the rtl as

          (fma:M OP1 OP2 (neg:M OP3))

`fnmaM4'
     Like `fmaM4' except that the intermediate product is negated
     before being added to operand 3.  This is represented in the rtl as

          (fma:M (neg:M OP1) OP2 OP3)

`fnmsM4'
     Like `fmsM4' except that the intermediate product is negated
     before subtracting operand 3.  This is represented in the rtl as

          (fma:M (neg:M OP1) OP2 (neg:M OP3))

`sminM3', `smaxM3'
     Signed minimum and maximum operations.  When used with floating
     point, if both operands are zeros, or if either operand is `NaN',
     then it is unspecified which of the two operands is returned as
     the result.

`reduc_smin_M', `reduc_smax_M'
     Find the signed minimum/maximum of the elements of a vector. The
     vector is operand 1, and the scalar result is stored in the least
     significant bits of operand 0 (also a vector). The output and
     input vector should have the same modes.

`reduc_umin_M', `reduc_umax_M'
     Find the unsigned minimum/maximum of the elements of a vector. The
     vector is operand 1, and the scalar result is stored in the least
     significant bits of operand 0 (also a vector). The output and
     input vector should have the same modes.

`reduc_splus_M'
     Compute the sum of the signed elements of a vector. The vector is
     operand 1, and the scalar result is stored in the least
     significant bits of operand 0 (also a vector). The output and
     input vector should have the same modes.

`reduc_uplus_M'
     Compute the sum of the unsigned elements of a vector. The vector
     is operand 1, and the scalar result is stored in the least
     significant bits of operand 0 (also a vector). The output and
     input vector should have the same modes.

`sdot_prodM'

`udot_prodM'
     Compute the sum of the products of two signed/unsigned elements.
     Operand 1 and operand 2 are of the same mode. Their product, which
     is of a wider mode, is computed and added to operand 3. Operand 3
     is of a mode equal or wider than the mode of the product. The
     result is placed in operand 0, which is of the same mode as
     operand 3.

`ssum_widenM3'

`usum_widenM3'
     Operands 0 and 2 are of the same mode, which is wider than the
     mode of operand 1. Add operand 1 to operand 2 and place the
     widened result in operand 0. (This is used express accumulation of
     elements into an accumulator of a wider mode.)

`vec_shl_M', `vec_shr_M'
     Whole vector left/right shift in bits.  Operand 1 is a vector to
     be shifted.  Operand 2 is an integer shift amount in bits.
     Operand 0 is where the resulting shifted vector is stored.  The
     output and input vectors should have the same modes.

`vec_pack_trunc_M'
     Narrow (demote) and merge the elements of two vectors. Operands 1
     and 2 are vectors of the same mode having N integral or floating
     point elements of size S.  Operand 0 is the resulting vector in
     which 2*N elements of size N/2 are concatenated after narrowing
     them down using truncation.

`vec_pack_ssat_M', `vec_pack_usat_M'
     Narrow (demote) and merge the elements of two vectors.  Operands 1
     and 2 are vectors of the same mode having N integral elements of
     size S.  Operand 0 is the resulting vector in which the elements
     of the two input vectors are concatenated after narrowing them
     down using signed/unsigned saturating arithmetic.

`vec_pack_sfix_trunc_M', `vec_pack_ufix_trunc_M'
     Narrow, convert to signed/unsigned integral type and merge the
     elements of two vectors.  Operands 1 and 2 are vectors of the same
     mode having N floating point elements of size S.  Operand 0 is the
     resulting vector in which 2*N elements of size N/2 are
     concatenated.

`vec_unpacks_hi_M', `vec_unpacks_lo_M'
     Extract and widen (promote) the high/low part of a vector of signed
     integral or floating point elements.  The input vector (operand 1)
     has N elements of size S.  Widen (promote) the high/low elements
     of the vector using signed or floating point extension and place
     the resulting N/2 values of size 2*S in the output vector (operand
     0).

`vec_unpacku_hi_M', `vec_unpacku_lo_M'
     Extract and widen (promote) the high/low part of a vector of
     unsigned integral elements.  The input vector (operand 1) has N
     elements of size S.  Widen (promote) the high/low elements of the
     vector using zero extension and place the resulting N/2 values of
     size 2*S in the output vector (operand 0).

`vec_unpacks_float_hi_M', `vec_unpacks_float_lo_M'
`vec_unpacku_float_hi_M', `vec_unpacku_float_lo_M'
     Extract, convert to floating point type and widen the high/low
     part of a vector of signed/unsigned integral elements.  The input
     vector (operand 1) has N elements of size S.  Convert the high/low
     elements of the vector using floating point conversion and place
     the resulting N/2 values of size 2*S in the output vector (operand
     0).

`vec_widen_umult_hi_M', `vec_widen_umult_lo_M'
`vec_widen_smult_hi_M', `vec_widen_smult_lo_M'
`vec_widen_umult_even_M', `vec_widen_umult_odd_M'
`vec_widen_smult_even_M', `vec_widen_smult_odd_M'
     Signed/Unsigned widening multiplication.  The two inputs (operands
     1 and 2) are vectors with N signed/unsigned elements of size S.
     Multiply the high/low or even/odd elements of the two vectors, and
     put the N/2 products of size 2*S in the output vector (operand 0).

`vec_widen_ushiftl_hi_M', `vec_widen_ushiftl_lo_M'
`vec_widen_sshiftl_hi_M', `vec_widen_sshiftl_lo_M'
     Signed/Unsigned widening shift left.  The first input (operand 1)
     is a vector with N signed/unsigned elements of size S.  Operand 2
     is a constant.  Shift the high/low elements of operand 1, and put
     the N/2 results of size 2*S in the output vector (operand 0).

`mulhisi3'
     Multiply operands 1 and 2, which have mode `HImode', and store a
     `SImode' product in operand 0.

`mulqihi3', `mulsidi3'
     Similar widening-multiplication instructions of other widths.

`umulqihi3', `umulhisi3', `umulsidi3'
     Similar widening-multiplication instructions that do unsigned
     multiplication.

`usmulqihi3', `usmulhisi3', `usmulsidi3'
     Similar widening-multiplication instructions that interpret the
     first operand as unsigned and the second operand as signed, then
     do a signed multiplication.

`smulM3_highpart'
     Perform a signed multiplication of operands 1 and 2, which have
     mode M, and store the most significant half of the product in
     operand 0.  The least significant half of the product is discarded.

`umulM3_highpart'
     Similar, but the multiplication is unsigned.

`maddMN4'
     Multiply operands 1 and 2, sign-extend them to mode N, add operand
     3, and store the result in operand 0.  Operands 1 and 2 have mode
     M and operands 0 and 3 have mode N.  Both modes must be integer or
     fixed-point modes and N must be twice the size of M.

     In other words, `maddMN4' is like `mulMN3' except that it also
     adds operand 3.

     These instructions are not allowed to `FAIL'.

`umaddMN4'
     Like `maddMN4', but zero-extend the multiplication operands
     instead of sign-extending them.

`ssmaddMN4'
     Like `maddMN4', but all involved operations must be
     signed-saturating.

`usmaddMN4'
     Like `umaddMN4', but all involved operations must be
     unsigned-saturating.

`msubMN4'
     Multiply operands 1 and 2, sign-extend them to mode N, subtract the
     result from operand 3, and store the result in operand 0.
     Operands 1 and 2 have mode M and operands 0 and 3 have mode N.
     Both modes must be integer or fixed-point modes and N must be twice
     the size of M.

     In other words, `msubMN4' is like `mulMN3' except that it also
     subtracts the result from operand 3.

     These instructions are not allowed to `FAIL'.

`umsubMN4'
     Like `msubMN4', but zero-extend the multiplication operands
     instead of sign-extending them.

`ssmsubMN4'
     Like `msubMN4', but all involved operations must be
     signed-saturating.

`usmsubMN4'
     Like `umsubMN4', but all involved operations must be
     unsigned-saturating.

`divmodM4'
     Signed division that produces both a quotient and a remainder.
     Operand 1 is divided by operand 2 to produce a quotient stored in
     operand 0 and a remainder stored in operand 3.

     For machines with an instruction that produces both a quotient and
     a remainder, provide a pattern for `divmodM4' but do not provide
     patterns for `divM3' and `modM3'.  This allows optimization in the
     relatively common case when both the quotient and remainder are
     computed.

     If an instruction that just produces a quotient or just a remainder
     exists and is more efficient than the instruction that produces
     both, write the output routine of `divmodM4' to call
     `find_reg_note' and look for a `REG_UNUSED' note on the quotient
     or remainder and generate the appropriate instruction.

`udivmodM4'
     Similar, but does unsigned division.

`ashlM3', `ssashlM3', `usashlM3'
     Arithmetic-shift operand 1 left by a number of bits specified by
     operand 2, and store the result in operand 0.  Here M is the mode
     of operand 0 and operand 1; operand 2's mode is specified by the
     instruction pattern, and the compiler will convert the operand to
     that mode before generating the instruction.  The meaning of
     out-of-range shift counts can optionally be specified by
     `TARGET_SHIFT_TRUNCATION_MASK'.  *Note
     TARGET_SHIFT_TRUNCATION_MASK::.  Operand 2 is always a scalar type.

`ashrM3', `lshrM3', `rotlM3', `rotrM3'
     Other shift and rotate instructions, analogous to the `ashlM3'
     instructions.  Operand 2 is always a scalar type.

`vashlM3', `vashrM3', `vlshrM3', `vrotlM3', `vrotrM3'
     Vector shift and rotate instructions that take vectors as operand 2
     instead of a scalar type.

`bswapM2'
     Reverse the order of bytes of operand 1 and store the result in
     operand 0.

`negM2', `ssnegM2', `usnegM2'
     Negate operand 1 and store the result in operand 0.

`absM2'
     Store the absolute value of operand 1 into operand 0.

`sqrtM2'
     Store the square root of operand 1 into operand 0.

     The `sqrt' built-in function of C always uses the mode which
     corresponds to the C data type `double' and the `sqrtf' built-in
     function uses the mode which corresponds to the C data type
     `float'.

`fmodM3'
     Store the remainder of dividing operand 1 by operand 2 into
     operand 0, rounded towards zero to an integer.

     The `fmod' built-in function of C always uses the mode which
     corresponds to the C data type `double' and the `fmodf' built-in
     function uses the mode which corresponds to the C data type
     `float'.

`remainderM3'
     Store the remainder of dividing operand 1 by operand 2 into
     operand 0, rounded to the nearest integer.

     The `remainder' built-in function of C always uses the mode which
     corresponds to the C data type `double' and the `remainderf'
     built-in function uses the mode which corresponds to the C data
     type `float'.

`cosM2'
     Store the cosine of operand 1 into operand 0.

     The `cos' built-in function of C always uses the mode which
     corresponds to the C data type `double' and the `cosf' built-in
     function uses the mode which corresponds to the C data type
     `float'.

`sinM2'
     Store the sine of operand 1 into operand 0.

     The `sin' built-in function of C always uses the mode which
     corresponds to the C data type `double' and the `sinf' built-in
     function uses the mode which corresponds to the C data type
     `float'.

`sincosM3'
     Store the cosine of operand 2 into operand 0 and the sine of
     operand 2 into operand 1.

     The `sin' and `cos' built-in functions of C always use the mode
     which corresponds to the C data type `double' and the `sinf' and
     `cosf' built-in function use the mode which corresponds to the C
     data type `float'.  Targets that can calculate the sine and cosine
     simultaneously can implement this pattern as opposed to
     implementing individual `sinM2' and `cosM2' patterns.  The `sin'
     and `cos' built-in functions will then be expanded to the
     `sincosM3' pattern, with one of the output values left unused.

`expM2'
     Store the exponential of operand 1 into operand 0.

     The `exp' built-in function of C always uses the mode which
     corresponds to the C data type `double' and the `expf' built-in
     function uses the mode which corresponds to the C data type
     `float'.

`logM2'
     Store the natural logarithm of operand 1 into operand 0.

     The `log' built-in function of C always uses the mode which
     corresponds to the C data type `double' and the `logf' built-in
     function uses the mode which corresponds to the C data type
     `float'.

`powM3'
     Store the value of operand 1 raised to the exponent operand 2 into
     operand 0.

     The `pow' built-in function of C always uses the mode which
     corresponds to the C data type `double' and the `powf' built-in
     function uses the mode which corresponds to the C data type
     `float'.

`atan2M3'
     Store the arc tangent (inverse tangent) of operand 1 divided by
     operand 2 into operand 0, using the signs of both arguments to
     determine the quadrant of the result.

     The `atan2' built-in function of C always uses the mode which
     corresponds to the C data type `double' and the `atan2f' built-in
     function uses the mode which corresponds to the C data type
     `float'.

`floorM2'
     Store the largest integral value not greater than argument.

     The `floor' built-in function of C always uses the mode which
     corresponds to the C data type `double' and the `floorf' built-in
     function uses the mode which corresponds to the C data type
     `float'.

`btruncM2'
     Store the argument rounded to integer towards zero.

     The `trunc' built-in function of C always uses the mode which
     corresponds to the C data type `double' and the `truncf' built-in
     function uses the mode which corresponds to the C data type
     `float'.

`roundM2'
     Store the argument rounded to integer away from zero.

     The `round' built-in function of C always uses the mode which
     corresponds to the C data type `double' and the `roundf' built-in
     function uses the mode which corresponds to the C data type
     `float'.

`ceilM2'
     Store the argument rounded to integer away from zero.

     The `ceil' built-in function of C always uses the mode which
     corresponds to the C data type `double' and the `ceilf' built-in
     function uses the mode which corresponds to the C data type
     `float'.

`nearbyintM2'
     Store the argument rounded according to the default rounding mode

     The `nearbyint' built-in function of C always uses the mode which
     corresponds to the C data type `double' and the `nearbyintf'
     built-in function uses the mode which corresponds to the C data
     type `float'.

`rintM2'
     Store the argument rounded according to the default rounding mode
     and raise the inexact exception when the result differs in value
     from the argument

     The `rint' built-in function of C always uses the mode which
     corresponds to the C data type `double' and the `rintf' built-in
     function uses the mode which corresponds to the C data type
     `float'.

`lrintMN2'
     Convert operand 1 (valid for floating point mode M) to fixed point
     mode N as a signed number according to the current rounding mode
     and store in operand 0 (which has mode N).

`lroundMN2'
     Convert operand 1 (valid for floating point mode M) to fixed point
     mode N as a signed number rounding to nearest and away from zero
     and store in operand 0 (which has mode N).

`lfloorMN2'
     Convert operand 1 (valid for floating point mode M) to fixed point
     mode N as a signed number rounding down and store in operand 0
     (which has mode N).

`lceilMN2'
     Convert operand 1 (valid for floating point mode M) to fixed point
     mode N as a signed number rounding up and store in operand 0
     (which has mode N).

`copysignM3'
     Store a value with the magnitude of operand 1 and the sign of
     operand 2 into operand 0.

     The `copysign' built-in function of C always uses the mode which
     corresponds to the C data type `double' and the `copysignf'
     built-in function uses the mode which corresponds to the C data
     type `float'.

`ffsM2'
     Store into operand 0 one plus the index of the least significant
     1-bit of operand 1.  If operand 1 is zero, store zero.  M is the
     mode of operand 0; operand 1's mode is specified by the instruction
     pattern, and the compiler will convert the operand to that mode
     before generating the instruction.

     The `ffs' built-in function of C always uses the mode which
     corresponds to the C data type `int'.

`clzM2'
     Store into operand 0 the number of leading 0-bits in X, starting
     at the most significant bit position.  If X is 0, the
     `CLZ_DEFINED_VALUE_AT_ZERO' (*note Misc::) macro defines if the
     result is undefined or has a useful value.  M is the mode of
     operand 0; operand 1's mode is specified by the instruction
     pattern, and the compiler will convert the operand to that mode
     before generating the instruction.

`ctzM2'
     Store into operand 0 the number of trailing 0-bits in X, starting
     at the least significant bit position.  If X is 0, the
     `CTZ_DEFINED_VALUE_AT_ZERO' (*note Misc::) macro defines if the
     result is undefined or has a useful value.  M is the mode of
     operand 0; operand 1's mode is specified by the instruction
     pattern, and the compiler will convert the operand to that mode
     before generating the instruction.

`popcountM2'
     Store into operand 0 the number of 1-bits in X.  M is the mode of
     operand 0; operand 1's mode is specified by the instruction
     pattern, and the compiler will convert the operand to that mode
     before generating the instruction.

`parityM2'
     Store into operand 0 the parity of X, i.e. the number of 1-bits in
     X modulo 2.  M is the mode of operand 0; operand 1's mode is
     specified by the instruction pattern, and the compiler will convert
     the operand to that mode before generating the instruction.

`one_cmplM2'
     Store the bitwise-complement of operand 1 into operand 0.

`movmemM'
     Block move instruction.  The destination and source blocks of
     memory are the first two operands, and both are `mem:BLK's with an
     address in mode `Pmode'.

     The number of bytes to move is the third operand, in mode M.
     Usually, you specify `word_mode' for M.  However, if you can
     generate better code knowing the range of valid lengths is smaller
     than those representable in a full word, you should provide a
     pattern with a mode corresponding to the range of values you can
     handle efficiently (e.g., `QImode' for values in the range 0-127;
     note we avoid numbers that appear negative) and also a pattern
     with `word_mode'.

     The fourth operand is the known shared alignment of the source and
     destination, in the form of a `const_int' rtx.  Thus, if the
     compiler knows that both source and destination are word-aligned,
     it may provide the value 4 for this operand.

     Optional operands 5 and 6 specify expected alignment and size of
     block respectively.  The expected alignment differs from alignment
     in operand 4 in a way that the blocks are not required to be
     aligned according to it in all cases. This expected alignment is
     also in bytes, just like operand 4.  Expected size, when unknown,
     is set to `(const_int -1)'.

     Descriptions of multiple `movmemM' patterns can only be beneficial
     if the patterns for smaller modes have fewer restrictions on their
     first, second and fourth operands.  Note that the mode M in
     `movmemM' does not impose any restriction on the mode of
     individually moved data units in the block.

     These patterns need not give special consideration to the
     possibility that the source and destination strings might overlap.

`movstr'
     String copy instruction, with `stpcpy' semantics.  Operand 0 is an
     output operand in mode `Pmode'.  The addresses of the destination
     and source strings are operands 1 and 2, and both are `mem:BLK's
     with addresses in mode `Pmode'.  The execution of the expansion of
     this pattern should store in operand 0 the address in which the
     `NUL' terminator was stored in the destination string.

`setmemM'
     Block set instruction.  The destination string is the first
     operand, given as a `mem:BLK' whose address is in mode `Pmode'.
     The number of bytes to set is the second operand, in mode M.  The
     value to initialize the memory with is the third operand. Targets
     that only support the clearing of memory should reject any value
     that is not the constant 0.  See `movmemM' for a discussion of the
     choice of mode.

     The fourth operand is the known alignment of the destination, in
     the form of a `const_int' rtx.  Thus, if the compiler knows that
     the destination is word-aligned, it may provide the value 4 for
     this operand.

     Optional operands 5 and 6 specify expected alignment and size of
     block respectively.  The expected alignment differs from alignment
     in operand 4 in a way that the blocks are not required to be
     aligned according to it in all cases. This expected alignment is
     also in bytes, just like operand 4.  Expected size, when unknown,
     is set to `(const_int -1)'.

     The use for multiple `setmemM' is as for `movmemM'.

`cmpstrnM'
     String compare instruction, with five operands.  Operand 0 is the
     output; it has mode M.  The remaining four operands are like the
     operands of `movmemM'.  The two memory blocks specified are
     compared byte by byte in lexicographic order starting at the
     beginning of each string.  The instruction is not allowed to
     prefetch more than one byte at a time since either string may end
     in the first byte and reading past that may access an invalid page
     or segment and cause a fault.  The comparison terminates early if
     the fetched bytes are different or if they are equal to zero.  The
     effect of the instruction is to store a value in operand 0 whose
     sign indicates the result of the comparison.

`cmpstrM'
     String compare instruction, without known maximum length.  Operand
     0 is the output; it has mode M.  The second and third operand are
     the blocks of memory to be compared; both are `mem:BLK' with an
     address in mode `Pmode'.

     The fourth operand is the known shared alignment of the source and
     destination, in the form of a `const_int' rtx.  Thus, if the
     compiler knows that both source and destination are word-aligned,
     it may provide the value 4 for this operand.

     The two memory blocks specified are compared byte by byte in
     lexicographic order starting at the beginning of each string.  The
     instruction is not allowed to prefetch more than one byte at a
     time since either string may end in the first byte and reading
     past that may access an invalid page or segment and cause a fault.
     The comparison will terminate when the fetched bytes are different
     or if they are equal to zero.  The effect of the instruction is to
     store a value in operand 0 whose sign indicates the result of the
     comparison.

`cmpmemM'
     Block compare instruction, with five operands like the operands of
     `cmpstrM'.  The two memory blocks specified are compared byte by
     byte in lexicographic order starting at the beginning of each
     block.  Unlike `cmpstrM' the instruction can prefetch any bytes in
     the two memory blocks.  Also unlike `cmpstrM' the comparison will
     not stop if both bytes are zero.  The effect of the instruction is
     to store a value in operand 0 whose sign indicates the result of
     the comparison.

`strlenM'
     Compute the length of a string, with three operands.  Operand 0 is
     the result (of mode M), operand 1 is a `mem' referring to the
     first character of the string, operand 2 is the character to
     search for (normally zero), and operand 3 is a constant describing
     the known alignment of the beginning of the string.

`floatMN2'
     Convert signed integer operand 1 (valid for fixed point mode M) to
     floating point mode N and store in operand 0 (which has mode N).

`floatunsMN2'
     Convert unsigned integer operand 1 (valid for fixed point mode M)
     to floating point mode N and store in operand 0 (which has mode N).

`fixMN2'
     Convert operand 1 (valid for floating point mode M) to fixed point
     mode N as a signed number and store in operand 0 (which has mode
     N).  This instruction's result is defined only when the value of
     operand 1 is an integer.

     If the machine description defines this pattern, it also needs to
     define the `ftrunc' pattern.

`fixunsMN2'
     Convert operand 1 (valid for floating point mode M) to fixed point
     mode N as an unsigned number and store in operand 0 (which has
     mode N).  This instruction's result is defined only when the value
     of operand 1 is an integer.

`ftruncM2'
     Convert operand 1 (valid for floating point mode M) to an integer
     value, still represented in floating point mode M, and store it in
     operand 0 (valid for floating point mode M).

`fix_truncMN2'
     Like `fixMN2' but works for any floating point value of mode M by
     converting the value to an integer.

`fixuns_truncMN2'
     Like `fixunsMN2' but works for any floating point value of mode M
     by converting the value to an integer.

`truncMN2'
     Truncate operand 1 (valid for mode M) to mode N and store in
     operand 0 (which has mode N).  Both modes must be fixed point or
     both floating point.

`extendMN2'
     Sign-extend operand 1 (valid for mode M) to mode N and store in
     operand 0 (which has mode N).  Both modes must be fixed point or
     both floating point.

`zero_extendMN2'
     Zero-extend operand 1 (valid for mode M) to mode N and store in
     operand 0 (which has mode N).  Both modes must be fixed point.

`fractMN2'
     Convert operand 1 of mode M to mode N and store in operand 0
     (which has mode N).  Mode M and mode N could be fixed-point to
     fixed-point, signed integer to fixed-point, fixed-point to signed
     integer, floating-point to fixed-point, or fixed-point to
     floating-point.  When overflows or underflows happen, the results
     are undefined.

`satfractMN2'
     Convert operand 1 of mode M to mode N and store in operand 0
     (which has mode N).  Mode M and mode N could be fixed-point to
     fixed-point, signed integer to fixed-point, or floating-point to
     fixed-point.  When overflows or underflows happen, the instruction
     saturates the results to the maximum or the minimum.

`fractunsMN2'
     Convert operand 1 of mode M to mode N and store in operand 0
     (which has mode N).  Mode M and mode N could be unsigned integer
     to fixed-point, or fixed-point to unsigned integer.  When
     overflows or underflows happen, the results are undefined.

`satfractunsMN2'
     Convert unsigned integer operand 1 of mode M to fixed-point mode N
     and store in operand 0 (which has mode N).  When overflows or
     underflows happen, the instruction saturates the results to the
     maximum or the minimum.

`extvM'
     Extract a bit-field from register operand 1, sign-extend it, and
     store it in operand 0.  Operand 2 specifies the width of the field
     in bits and operand 3 the starting bit, which counts from the most
     significant bit if `BITS_BIG_ENDIAN' is true and from the least
     significant bit otherwise.

     Operands 0 and 1 both have mode M.  Operands 2 and 3 have a
     target-specific mode.

`extvmisalignM'
     Extract a bit-field from memory operand 1, sign extend it, and
     store it in operand 0.  Operand 2 specifies the width in bits and
     operand 3 the starting bit.  The starting bit is always somewhere
     in the first byte of operand 1; it counts from the most
     significant bit if `BITS_BIG_ENDIAN' is true and from the least
     significant bit otherwise.

     Operand 0 has mode M while operand 1 has `BLK' mode.  Operands 2
     and 3 have a target-specific mode.

     The instruction must not read beyond the last byte of the
     bit-field.

`extzvM'
     Like `extvM' except that the bit-field value is zero-extended.

`extzvmisalignM'
     Like `extvmisalignM' except that the bit-field value is
     zero-extended.

`insvM'
     Insert operand 3 into a bit-field of register operand 0.  Operand 1
     specifies the width of the field in bits and operand 2 the
     starting bit, which counts from the most significant bit if
     `BITS_BIG_ENDIAN' is true and from the least significant bit
     otherwise.

     Operands 0 and 3 both have mode M.  Operands 1 and 2 have a
     target-specific mode.

`insvmisalignM'
     Insert operand 3 into a bit-field of memory operand 0.  Operand 1
     specifies the width of the field in bits and operand 2 the
     starting bit.  The starting bit is always somewhere in the first
     byte of operand 0; it counts from the most significant bit if
     `BITS_BIG_ENDIAN' is true and from the least significant bit
     otherwise.

     Operand 3 has mode M while operand 0 has `BLK' mode.  Operands 1
     and 2 have a target-specific mode.

     The instruction must not read or write beyond the last byte of the
     bit-field.

`extv'
     Extract a bit-field from operand 1 (a register or memory operand),
     where operand 2 specifies the width in bits and operand 3 the
     starting bit, and store it in operand 0.  Operand 0 must have mode
     `word_mode'.  Operand 1 may have mode `byte_mode' or `word_mode';
     often `word_mode' is allowed only for registers.  Operands 2 and 3
     must be valid for `word_mode'.

     The RTL generation pass generates this instruction only with
     constants for operands 2 and 3 and the constant is never zero for
     operand 2.

     The bit-field value is sign-extended to a full word integer before
     it is stored in operand 0.

     This pattern is deprecated; please use `extvM' and `extvmisalignM'
     instead.

`extzv'
     Like `extv' except that the bit-field value is zero-extended.

     This pattern is deprecated; please use `extzvM' and
     `extzvmisalignM' instead.

`insv'
     Store operand 3 (which must be valid for `word_mode') into a
     bit-field in operand 0, where operand 1 specifies the width in
     bits and operand 2 the starting bit.  Operand 0 may have mode
     `byte_mode' or `word_mode'; often `word_mode' is allowed only for
     registers.  Operands 1 and 2 must be valid for `word_mode'.

     The RTL generation pass generates this instruction only with
     constants for operands 1 and 2 and the constant is never zero for
     operand 1.

     This pattern is deprecated; please use `insvM' and `insvmisalignM'
     instead.

`movMODEcc'
     Conditionally move operand 2 or operand 3 into operand 0 according
     to the comparison in operand 1.  If the comparison is true,
     operand 2 is moved into operand 0, otherwise operand 3 is moved.

     The mode of the operands being compared need not be the same as
     the operands being moved.  Some machines, sparc64 for example,
     have instructions that conditionally move an integer value based
     on the floating point condition codes and vice versa.

     If the machine does not have conditional move instructions, do not
     define these patterns.

`addMODEcc'
     Similar to `movMODEcc' but for conditional addition.  Conditionally
     move operand 2 or (operands 2 + operand 3) into operand 0
     according to the comparison in operand 1.  If the comparison is
     false, operand 2 is moved into operand 0, otherwise (operand 2 +
     operand 3) is moved.

`cstoreMODE4'
     Store zero or nonzero in operand 0 according to whether a
     comparison is true.  Operand 1 is a comparison operator.  Operand
     2 and operand 3 are the first and second operand of the
     comparison, respectively.  You specify the mode that operand 0
     must have when you write the `match_operand' expression.  The
     compiler automatically sees which mode you have used and supplies
     an operand of that mode.

     The value stored for a true condition must have 1 as its low bit,
     or else must be negative.  Otherwise the instruction is not
     suitable and you should omit it from the machine description.  You
     describe to the compiler exactly which value is stored by defining
     the macro `STORE_FLAG_VALUE' (*note Misc::).  If a description
     cannot be found that can be used for all the possible comparison
     operators, you should pick one and use a `define_expand' to map
     all results onto the one you chose.

     These operations may `FAIL', but should do so only in relatively
     uncommon cases; if they would `FAIL' for common cases involving
     integer comparisons, it is best to restrict the predicates to not
     allow these operands.  Likewise if a given comparison operator will
     always fail, independent of the operands (for floating-point
     modes, the `ordered_comparison_operator' predicate is often useful
     in this case).

     If this pattern is omitted, the compiler will generate a
     conditional branch--for example, it may copy a constant one to the
     target and branching around an assignment of zero to the
     target--or a libcall.  If the predicate for operand 1 only rejects
     some operators, it will also try reordering the operands and/or
     inverting the result value (e.g. by an exclusive OR).  These
     possibilities could be cheaper or equivalent to the instructions
     used for the `cstoreMODE4' pattern followed by those required to
     convert a positive result from `STORE_FLAG_VALUE' to 1; in this
     case, you can and should make operand 1's predicate reject some
     operators in the `cstoreMODE4' pattern, or remove the pattern
     altogether from the machine description.

`cbranchMODE4'
     Conditional branch instruction combined with a compare instruction.
     Operand 0 is a comparison operator.  Operand 1 and operand 2 are
     the first and second operands of the comparison, respectively.
     Operand 3 is a `label_ref' that refers to the label to jump to.

`jump'
     A jump inside a function; an unconditional branch.  Operand 0 is
     the `label_ref' of the label to jump to.  This pattern name is
     mandatory on all machines.

`call'
     Subroutine call instruction returning no value.  Operand 0 is the
     function to call; operand 1 is the number of bytes of arguments
     pushed as a `const_int'; operand 2 is the number of registers used
     as operands.

     On most machines, operand 2 is not actually stored into the RTL
     pattern.  It is supplied for the sake of some RISC machines which
     need to put this information into the assembler code; they can put
     it in the RTL instead of operand 1.

     Operand 0 should be a `mem' RTX whose address is the address of the
     function.  Note, however, that this address can be a `symbol_ref'
     expression even if it would not be a legitimate memory address on
     the target machine.  If it is also not a valid argument for a call
     instruction, the pattern for this operation should be a
     `define_expand' (*note Expander Definitions::) that places the
     address into a register and uses that register in the call
     instruction.

`call_value'
     Subroutine call instruction returning a value.  Operand 0 is the
     hard register in which the value is returned.  There are three more
     operands, the same as the three operands of the `call' instruction
     (but with numbers increased by one).

     Subroutines that return `BLKmode' objects use the `call' insn.

`call_pop', `call_value_pop'
     Similar to `call' and `call_value', except used if defined and if
     `RETURN_POPS_ARGS' is nonzero.  They should emit a `parallel' that
     contains both the function call and a `set' to indicate the
     adjustment made to the frame pointer.

     For machines where `RETURN_POPS_ARGS' can be nonzero, the use of
     these patterns increases the number of functions for which the
     frame pointer can be eliminated, if desired.

`untyped_call'
     Subroutine call instruction returning a value of any type.
     Operand 0 is the function to call; operand 1 is a memory location
     where the result of calling the function is to be stored; operand
     2 is a `parallel' expression where each element is a `set'
     expression that indicates the saving of a function return value
     into the result block.

     This instruction pattern should be defined to support
     `__builtin_apply' on machines where special instructions are needed
     to call a subroutine with arbitrary arguments or to save the value
     returned.  This instruction pattern is required on machines that
     have multiple registers that can hold a return value (i.e.
     `FUNCTION_VALUE_REGNO_P' is true for more than one register).

`return'
     Subroutine return instruction.  This instruction pattern name
     should be defined only if a single instruction can do all the work
     of returning from a function.

     Like the `movM' patterns, this pattern is also used after the RTL
     generation phase.  In this case it is to support machines where
     multiple instructions are usually needed to return from a
     function, but some class of functions only requires one
     instruction to implement a return.  Normally, the applicable
     functions are those which do not need to save any registers or
     allocate stack space.

     It is valid for this pattern to expand to an instruction using
     `simple_return' if no epilogue is required.

`simple_return'
     Subroutine return instruction.  This instruction pattern name
     should be defined only if a single instruction can do all the work
     of returning from a function on a path where no epilogue is
     required.  This pattern is very similar to the `return'
     instruction pattern, but it is emitted only by the shrink-wrapping
     optimization on paths where the function prologue has not been
     executed, and a function return should occur without any of the
     effects of the epilogue.  Additional uses may be introduced on
     paths where both the prologue and the epilogue have executed.

     For such machines, the condition specified in this pattern should
     only be true when `reload_completed' is nonzero and the function's
     epilogue would only be a single instruction.  For machines with
     register windows, the routine `leaf_function_p' may be used to
     determine if a register window push is required.

     Machines that have conditional return instructions should define
     patterns such as

          (define_insn ""
            [(set (pc)
                  (if_then_else (match_operator
                                   0 "comparison_operator"
                                   [(cc0) (const_int 0)])
                                (return)
                                (pc)))]
            "CONDITION"
            "...")

     where CONDITION would normally be the same condition specified on
     the named `return' pattern.

`untyped_return'
     Untyped subroutine return instruction.  This instruction pattern
     should be defined to support `__builtin_return' on machines where
     special instructions are needed to return a value of any type.

     Operand 0 is a memory location where the result of calling a
     function with `__builtin_apply' is stored; operand 1 is a
     `parallel' expression where each element is a `set' expression
     that indicates the restoring of a function return value from the
     result block.

`nop'
     No-op instruction.  This instruction pattern name should always be
     defined to output a no-op in assembler code.  `(const_int 0)' will
     do as an RTL pattern.

`indirect_jump'
     An instruction to jump to an address which is operand zero.  This
     pattern name is mandatory on all machines.

`casesi'
     Instruction to jump through a dispatch table, including bounds
     checking.  This instruction takes five operands:

       1. The index to dispatch on, which has mode `SImode'.

       2. The lower bound for indices in the table, an integer constant.

       3. The total range of indices in the table--the largest index
          minus the smallest one (both inclusive).

       4. A label that precedes the table itself.

       5. A label to jump to if the index has a value outside the
          bounds.

     The table is an `addr_vec' or `addr_diff_vec' inside of a
     `jump_insn'.  The number of elements in the table is one plus the
     difference between the upper bound and the lower bound.

`tablejump'
     Instruction to jump to a variable address.  This is a low-level
     capability which can be used to implement a dispatch table when
     there is no `casesi' pattern.

     This pattern requires two operands: the address or offset, and a
     label which should immediately precede the jump table.  If the
     macro `CASE_VECTOR_PC_RELATIVE' evaluates to a nonzero value then
     the first operand is an offset which counts from the address of
     the table; otherwise, it is an absolute address to jump to.  In
     either case, the first operand has mode `Pmode'.

     The `tablejump' insn is always the last insn before the jump table
     it uses.  Its assembler code normally has no need to use the
     second operand, but you should incorporate it in the RTL pattern so
     that the jump optimizer will not delete the table as unreachable
     code.

`decrement_and_branch_until_zero'
     Conditional branch instruction that decrements a register and
     jumps if the register is nonzero.  Operand 0 is the register to
     decrement and test; operand 1 is the label to jump to if the
     register is nonzero.  *Note Looping Patterns::.

     This optional instruction pattern is only used by the combiner,
     typically for loops reversed by the loop optimizer when strength
     reduction is enabled.

`doloop_end'
     Conditional branch instruction that decrements a register and
     jumps if the register is nonzero.  This instruction takes five
     operands: Operand 0 is the register to decrement and test; operand
     1 is the number of loop iterations as a `const_int' or
     `const0_rtx' if this cannot be determined until run-time; operand
     2 is the actual or estimated maximum number of iterations as a
     `const_int'; operand 3 is the number of enclosed loops as a
     `const_int' (an innermost loop has a value of 1); operand 4 is the
     label to jump to if the register is nonzero; operand 5 is
     const1_rtx if the loop in entered at its top, const0_rtx otherwise.
     *Note Looping Patterns::.

     This optional instruction pattern should be defined for machines
     with low-overhead looping instructions as the loop optimizer will
     try to modify suitable loops to utilize it.  If nested
     low-overhead looping is not supported, use a `define_expand'
     (*note Expander Definitions::) and make the pattern fail if
     operand 3 is not `const1_rtx'.  Similarly, if the actual or
     estimated maximum number of iterations is too large for this
     instruction, make it fail.

`doloop_begin'
     Companion instruction to `doloop_end' required for machines that
     need to perform some initialization, such as loading special
     registers used by a low-overhead looping instruction.  If
     initialization insns do not always need to be emitted, use a
     `define_expand' (*note Expander Definitions::) and make it fail.

`canonicalize_funcptr_for_compare'
     Canonicalize the function pointer in operand 1 and store the result
     into operand 0.

     Operand 0 is always a `reg' and has mode `Pmode'; operand 1 may be
     a `reg', `mem', `symbol_ref', `const_int', etc and also has mode
     `Pmode'.

     Canonicalization of a function pointer usually involves computing
     the address of the function which would be called if the function
     pointer were used in an indirect call.

     Only define this pattern if function pointers on the target machine
     can have different values but still call the same function when
     used in an indirect call.

`save_stack_block'
`save_stack_function'
`save_stack_nonlocal'
`restore_stack_block'
`restore_stack_function'
`restore_stack_nonlocal'
     Most machines save and restore the stack pointer by copying it to
     or from an object of mode `Pmode'.  Do not define these patterns on
     such machines.

     Some machines require special handling for stack pointer saves and
     restores.  On those machines, define the patterns corresponding to
     the non-standard cases by using a `define_expand' (*note Expander
     Definitions::) that produces the required insns.  The three types
     of saves and restores are:

       1. `save_stack_block' saves the stack pointer at the start of a
          block that allocates a variable-sized object, and
          `restore_stack_block' restores the stack pointer when the
          block is exited.

       2. `save_stack_function' and `restore_stack_function' do a
          similar job for the outermost block of a function and are
          used when the function allocates variable-sized objects or
          calls `alloca'.  Only the epilogue uses the restored stack
          pointer, allowing a simpler save or restore sequence on some
          machines.

       3. `save_stack_nonlocal' is used in functions that contain labels
          branched to by nested functions.  It saves the stack pointer
          in such a way that the inner function can use
          `restore_stack_nonlocal' to restore the stack pointer.  The
          compiler generates code to restore the frame and argument
          pointer registers, but some machines require saving and
          restoring additional data such as register window information
          or stack backchains.  Place insns in these patterns to save
          and restore any such required data.

     When saving the stack pointer, operand 0 is the save area and
     operand 1 is the stack pointer.  The mode used to allocate the
     save area defaults to `Pmode' but you can override that choice by
     defining the `STACK_SAVEAREA_MODE' macro (*note Storage Layout::).
     You must specify an integral mode, or `VOIDmode' if no save area
     is needed for a particular type of save (either because no save is
     needed or because a machine-specific save area can be used).
     Operand 0 is the stack pointer and operand 1 is the save area for
     restore operations.  If `save_stack_block' is defined, operand 0
     must not be `VOIDmode' since these saves can be arbitrarily nested.

     A save area is a `mem' that is at a constant offset from
     `virtual_stack_vars_rtx' when the stack pointer is saved for use by
     nonlocal gotos and a `reg' in the other two cases.

`allocate_stack'
     Subtract (or add if `STACK_GROWS_DOWNWARD' is undefined) operand 1
     from the stack pointer to create space for dynamically allocated
     data.

     Store the resultant pointer to this space into operand 0.  If you
     are allocating space from the main stack, do this by emitting a
     move insn to copy `virtual_stack_dynamic_rtx' to operand 0.  If
     you are allocating the space elsewhere, generate code to copy the
     location of the space to operand 0.  In the latter case, you must
     ensure this space gets freed when the corresponding space on the
     main stack is free.

     Do not define this pattern if all that must be done is the
     subtraction.  Some machines require other operations such as stack
     probes or maintaining the back chain.  Define this pattern to emit
     those operations in addition to updating the stack pointer.

`check_stack'
     If stack checking (*note Stack Checking::) cannot be done on your
     system by probing the stack, define this pattern to perform the
     needed check and signal an error if the stack has overflowed.  The
     single operand is the address in the stack farthest from the
     current stack pointer that you need to validate.  Normally, on
     platforms where this pattern is needed, you would obtain the stack
     limit from a global or thread-specific variable or register.

`probe_stack_address'
     If stack checking (*note Stack Checking::) can be done on your
     system by probing the stack but without the need to actually
     access it, define this pattern and signal an error if the stack
     has overflowed.  The single operand is the memory address in the
     stack that needs to be probed.

`probe_stack'
     If stack checking (*note Stack Checking::) can be done on your
     system by probing the stack but doing it with a "store zero"
     instruction is not valid or optimal, define this pattern to do the
     probing differently and signal an error if the stack has
     overflowed.  The single operand is the memory reference in the
     stack that needs to be probed.

`nonlocal_goto'
     Emit code to generate a non-local goto, e.g., a jump from one
     function to a label in an outer function.  This pattern has four
     arguments, each representing a value to be used in the jump.  The
     first argument is to be loaded into the frame pointer, the second
     is the address to branch to (code to dispatch to the actual label),
     the third is the address of a location where the stack is saved,
     and the last is the address of the label, to be placed in the
     location for the incoming static chain.

     On most machines you need not define this pattern, since GCC will
     already generate the correct code, which is to load the frame
     pointer and static chain, restore the stack (using the
     `restore_stack_nonlocal' pattern, if defined), and jump indirectly
     to the dispatcher.  You need only define this pattern if this code
     will not work on your machine.

`nonlocal_goto_receiver'
     This pattern, if defined, contains code needed at the target of a
     nonlocal goto after the code already generated by GCC.  You will
     not normally need to define this pattern.  A typical reason why
     you might need this pattern is if some value, such as a pointer to
     a global table, must be restored when the frame pointer is
     restored.  Note that a nonlocal goto only occurs within a
     unit-of-translation, so a global table pointer that is shared by
     all functions of a given module need not be restored.  There are
     no arguments.

`exception_receiver'
     This pattern, if defined, contains code needed at the site of an
     exception handler that isn't needed at the site of a nonlocal
     goto.  You will not normally need to define this pattern.  A
     typical reason why you might need this pattern is if some value,
     such as a pointer to a global table, must be restored after
     control flow is branched to the handler of an exception.  There
     are no arguments.

`builtin_setjmp_setup'
     This pattern, if defined, contains additional code needed to
     initialize the `jmp_buf'.  You will not normally need to define
     this pattern.  A typical reason why you might need this pattern is
     if some value, such as a pointer to a global table, must be
     restored.  Though it is preferred that the pointer value be
     recalculated if possible (given the address of a label for
     instance).  The single argument is a pointer to the `jmp_buf'.
     Note that the buffer is five words long and that the first three
     are normally used by the generic mechanism.

`builtin_setjmp_receiver'
     This pattern, if defined, contains code needed at the site of a
     built-in setjmp that isn't needed at the site of a nonlocal goto.
     You will not normally need to define this pattern.  A typical
     reason why you might need this pattern is if some value, such as a
     pointer to a global table, must be restored.  It takes one
     argument, which is the label to which builtin_longjmp transferred
     control; this pattern may be emitted at a small offset from that
     label.

`builtin_longjmp'
     This pattern, if defined, performs the entire action of the
     longjmp.  You will not normally need to define this pattern unless
     you also define `builtin_setjmp_setup'.  The single argument is a
     pointer to the `jmp_buf'.

`eh_return'
     This pattern, if defined, affects the way `__builtin_eh_return',
     and thence the call frame exception handling library routines, are
     built.  It is intended to handle non-trivial actions needed along
     the abnormal return path.

     The address of the exception handler to which the function should
     return is passed as operand to this pattern.  It will normally
     need to copied by the pattern to some special register or memory
     location.  If the pattern needs to determine the location of the
     target call frame in order to do so, it may use
     `EH_RETURN_STACKADJ_RTX', if defined; it will have already been
     assigned.

     If this pattern is not defined, the default action will be to
     simply copy the return address to `EH_RETURN_HANDLER_RTX'.  Either
     that macro or this pattern needs to be defined if call frame
     exception handling is to be used.

`prologue'
     This pattern, if defined, emits RTL for entry to a function.  The
     function entry is responsible for setting up the stack frame,
     initializing the frame pointer register, saving callee saved
     registers, etc.

     Using a prologue pattern is generally preferred over defining
     `TARGET_ASM_FUNCTION_PROLOGUE' to emit assembly code for the
     prologue.

     The `prologue' pattern is particularly useful for targets which
     perform instruction scheduling.

`window_save'
     This pattern, if defined, emits RTL for a register window save.
     It should be defined if the target machine has register windows
     but the window events are decoupled from calls to subroutines.
     The canonical example is the SPARC architecture.

`epilogue'
     This pattern emits RTL for exit from a function.  The function
     exit is responsible for deallocating the stack frame, restoring
     callee saved registers and emitting the return instruction.

     Using an epilogue pattern is generally preferred over defining
     `TARGET_ASM_FUNCTION_EPILOGUE' to emit assembly code for the
     epilogue.

     The `epilogue' pattern is particularly useful for targets which
     perform instruction scheduling or which have delay slots for their
     return instruction.

`sibcall_epilogue'
     This pattern, if defined, emits RTL for exit from a function
     without the final branch back to the calling function.  This
     pattern will be emitted before any sibling call (aka tail call)
     sites.

     The `sibcall_epilogue' pattern must not clobber any arguments used
     for parameter passing or any stack slots for arguments passed to
     the current function.

`trap'
     This pattern, if defined, signals an error, typically by causing
     some kind of signal to be raised.  Among other places, it is used
     by the Java front end to signal `invalid array index' exceptions.

`ctrapMM4'
     Conditional trap instruction.  Operand 0 is a piece of RTL which
     performs a comparison, and operands 1 and 2 are the arms of the
     comparison.  Operand 3 is the trap code, an integer.

     A typical `ctrap' pattern looks like

          (define_insn "ctrapsi4"
            [(trap_if (match_operator 0 "trap_operator"
                       [(match_operand 1 "register_operand")
                        (match_operand 2 "immediate_operand")])
                      (match_operand 3 "const_int_operand" "i"))]
            ""
            "...")

`prefetch'
     This pattern, if defined, emits code for a non-faulting data
     prefetch instruction.  Operand 0 is the address of the memory to
     prefetch.  Operand 1 is a constant 1 if the prefetch is preparing
     for a write to the memory address, or a constant 0 otherwise.
     Operand 2 is the expected degree of temporal locality of the data
     and is a value between 0 and 3, inclusive; 0 means that the data
     has no temporal locality, so it need not be left in the cache
     after the access; 3 means that the data has a high degree of
     temporal locality and should be left in all levels of cache
     possible;  1 and 2 mean, respectively, a low or moderate degree of
     temporal locality.

     Targets that do not support write prefetches or locality hints can
     ignore the values of operands 1 and 2.

`blockage'
     This pattern defines a pseudo insn that prevents the instruction
     scheduler and other passes from moving instructions and using
     register equivalences across the boundary defined by the blockage
     insn.  This needs to be an UNSPEC_VOLATILE pattern or a volatile
     ASM.

`memory_barrier'
     If the target memory model is not fully synchronous, then this
     pattern should be defined to an instruction that orders both loads
     and stores before the instruction with respect to loads and stores
     after the instruction.  This pattern has no operands.

`sync_compare_and_swapMODE'
     This pattern, if defined, emits code for an atomic compare-and-swap
     operation.  Operand 1 is the memory on which the atomic operation
     is performed.  Operand 2 is the "old" value to be compared against
     the current contents of the memory location.  Operand 3 is the
     "new" value to store in the memory if the compare succeeds.
     Operand 0 is the result of the operation; it should contain the
     contents of the memory before the operation.  If the compare
     succeeds, this should obviously be a copy of operand 2.

     This pattern must show that both operand 0 and operand 1 are
     modified.

     This pattern must issue any memory barrier instructions such that
     all memory operations before the atomic operation occur before the
     atomic operation and all memory operations after the atomic
     operation occur after the atomic operation.

     For targets where the success or failure of the compare-and-swap
     operation is available via the status flags, it is possible to
     avoid a separate compare operation and issue the subsequent branch
     or store-flag operation immediately after the compare-and-swap.
     To this end, GCC will look for a `MODE_CC' set in the output of
     `sync_compare_and_swapMODE'; if the machine description includes
     such a set, the target should also define special `cbranchcc4'
     and/or `cstorecc4' instructions.  GCC will then be able to take
     the destination of the `MODE_CC' set and pass it to the
     `cbranchcc4' or `cstorecc4' pattern as the first operand of the
     comparison (the second will be `(const_int 0)').

     For targets where the operating system may provide support for this
     operation via library calls, the `sync_compare_and_swap_optab' may
     be initialized to a function with the same interface as the
     `__sync_val_compare_and_swap_N' built-in.  If the entire set of
     __SYNC builtins are supported via library calls, the target can
     initialize all of the optabs at once with `init_sync_libfuncs'.
     For the purposes of C++11 `std::atomic::is_lock_free', it is
     assumed that these library calls do _not_ use any kind of
     interruptable locking.

`sync_addMODE', `sync_subMODE'
`sync_iorMODE', `sync_andMODE'
`sync_xorMODE', `sync_nandMODE'
     These patterns emit code for an atomic operation on memory.
     Operand 0 is the memory on which the atomic operation is performed.
     Operand 1 is the second operand to the binary operator.

     This pattern must issue any memory barrier instructions such that
     all memory operations before the atomic operation occur before the
     atomic operation and all memory operations after the atomic
     operation occur after the atomic operation.

     If these patterns are not defined, the operation will be
     constructed from a compare-and-swap operation, if defined.

`sync_old_addMODE', `sync_old_subMODE'
`sync_old_iorMODE', `sync_old_andMODE'
`sync_old_xorMODE', `sync_old_nandMODE'
     These patterns emit code for an atomic operation on memory, and
     return the value that the memory contained before the operation.
     Operand 0 is the result value, operand 1 is the memory on which the
     atomic operation is performed, and operand 2 is the second operand
     to the binary operator.

     This pattern must issue any memory barrier instructions such that
     all memory operations before the atomic operation occur before the
     atomic operation and all memory operations after the atomic
     operation occur after the atomic operation.

     If these patterns are not defined, the operation will be
     constructed from a compare-and-swap operation, if defined.

`sync_new_addMODE', `sync_new_subMODE'
`sync_new_iorMODE', `sync_new_andMODE'
`sync_new_xorMODE', `sync_new_nandMODE'
     These patterns are like their `sync_old_OP' counterparts, except
     that they return the value that exists in the memory location
     after the operation, rather than before the operation.

`sync_lock_test_and_setMODE'
     This pattern takes two forms, based on the capabilities of the
     target.  In either case, operand 0 is the result of the operand,
     operand 1 is the memory on which the atomic operation is
     performed, and operand 2 is the value to set in the lock.

     In the ideal case, this operation is an atomic exchange operation,
     in which the previous value in memory operand is copied into the
     result operand, and the value operand is stored in the memory
     operand.

     For less capable targets, any value operand that is not the
     constant 1 should be rejected with `FAIL'.  In this case the
     target may use an atomic test-and-set bit operation.  The result
     operand should contain 1 if the bit was previously set and 0 if
     the bit was previously clear.  The true contents of the memory
     operand are implementation defined.

     This pattern must issue any memory barrier instructions such that
     the pattern as a whole acts as an acquire barrier, that is all
     memory operations after the pattern do not occur until the lock is
     acquired.

     If this pattern is not defined, the operation will be constructed
     from a compare-and-swap operation, if defined.

`sync_lock_releaseMODE'
     This pattern, if defined, releases a lock set by
     `sync_lock_test_and_setMODE'.  Operand 0 is the memory that
     contains the lock; operand 1 is the value to store in the lock.

     If the target doesn't implement full semantics for
     `sync_lock_test_and_setMODE', any value operand which is not the
     constant 0 should be rejected with `FAIL', and the true contents
     of the memory operand are implementation defined.

     This pattern must issue any memory barrier instructions such that
     the pattern as a whole acts as a release barrier, that is the lock
     is released only after all previous memory operations have
     completed.

     If this pattern is not defined, then a `memory_barrier' pattern
     will be emitted, followed by a store of the value to the memory
     operand.

`atomic_compare_and_swapMODE'
     This pattern, if defined, emits code for an atomic compare-and-swap
     operation with memory model semantics.  Operand 2 is the memory on
     which the atomic operation is performed.  Operand 0 is an output
     operand which is set to true or false based on whether the
     operation succeeded.  Operand 1 is an output operand which is set
     to the contents of the memory before the operation was attempted.
     Operand 3 is the value that is expected to be in memory.  Operand
     4 is the value to put in memory if the expected value is found
     there.  Operand 5 is set to 1 if this compare and swap is to be
     treated as a weak operation.  Operand 6 is the memory model to be
     used if the operation is a success.  Operand 7 is the memory model
     to be used if the operation fails.

     If memory referred to in operand 2 contains the value in operand
     3, then operand 4 is stored in memory pointed to by operand 2 and
     fencing based on the memory model in operand 6 is issued.

     If memory referred to in operand 2 does not contain the value in
     operand 3, then fencing based on the memory model in operand 7 is
     issued.

     If a target does not support weak compare-and-swap operations, or
     the port elects not to implement weak operations, the argument in
     operand 5 can be ignored.  Note a strong implementation must be
     provided.

     If this pattern is not provided, the `__atomic_compare_exchange'
     built-in functions will utilize the legacy `sync_compare_and_swap'
     pattern with an `__ATOMIC_SEQ_CST' memory model.

`atomic_loadMODE'
     This pattern implements an atomic load operation with memory model
     semantics.  Operand 1 is the memory address being loaded from.
     Operand 0 is the result of the load.  Operand 2 is the memory
     model to be used for the load operation.

     If not present, the `__atomic_load' built-in function will either
     resort to a normal load with memory barriers, or a compare-and-swap
     operation if a normal load would not be atomic.

`atomic_storeMODE'
     This pattern implements an atomic store operation with memory model
     semantics.  Operand 0 is the memory address being stored to.
     Operand 1 is the value to be written.  Operand 2 is the memory
     model to be used for the operation.

     If not present, the `__atomic_store' built-in function will
     attempt to perform a normal store and surround it with any
     required memory fences.  If the store would not be atomic, then an
     `__atomic_exchange' is attempted with the result being ignored.

`atomic_exchangeMODE'
     This pattern implements an atomic exchange operation with memory
     model semantics.  Operand 1 is the memory location the operation
     is performed on.  Operand 0 is an output operand which is set to
     the original value contained in the memory pointed to by operand
     1.  Operand 2 is the value to be stored.  Operand 3 is the memory
     model to be used.

     If this pattern is not present, the built-in function
     `__atomic_exchange' will attempt to preform the operation with a
     compare and swap loop.

`atomic_addMODE', `atomic_subMODE'
`atomic_orMODE', `atomic_andMODE'
`atomic_xorMODE', `atomic_nandMODE'
     These patterns emit code for an atomic operation on memory with
     memory model semantics. Operand 0 is the memory on which the
     atomic operation is performed.  Operand 1 is the second operand to
     the binary operator.  Operand 2 is the memory model to be used by
     the operation.

     If these patterns are not defined, attempts will be made to use
     legacy `sync' patterns, or equivalent patterns which return a
     result.  If none of these are available a compare-and-swap loop
     will be used.

`atomic_fetch_addMODE', `atomic_fetch_subMODE'
`atomic_fetch_orMODE', `atomic_fetch_andMODE'
`atomic_fetch_xorMODE', `atomic_fetch_nandMODE'
     These patterns emit code for an atomic operation on memory with
     memory model semantics, and return the original value. Operand 0
     is an output operand which contains the value of the memory
     location before the operation was performed.  Operand 1 is the
     memory on which the atomic operation is performed.  Operand 2 is
     the second operand to the binary operator.  Operand 3 is the
     memory model to be used by the operation.

     If these patterns are not defined, attempts will be made to use
     legacy `sync' patterns.  If none of these are available a
     compare-and-swap loop will be used.

`atomic_add_fetchMODE', `atomic_sub_fetchMODE'
`atomic_or_fetchMODE', `atomic_and_fetchMODE'
`atomic_xor_fetchMODE', `atomic_nand_fetchMODE'
     These patterns emit code for an atomic operation on memory with
     memory model semantics and return the result after the operation
     is performed.  Operand 0 is an output operand which contains the
     value after the operation.  Operand 1 is the memory on which the
     atomic operation is performed.  Operand 2 is the second operand to
     the binary operator.  Operand 3 is the memory model to be used by
     the operation.

     If these patterns are not defined, attempts will be made to use
     legacy `sync' patterns, or equivalent patterns which return the
     result before the operation followed by the arithmetic operation
     required to produce the result.  If none of these are available a
     compare-and-swap loop will be used.

`atomic_test_and_set'
     This pattern emits code for `__builtin_atomic_test_and_set'.
     Operand 0 is an output operand which is set to true if the previous
     previous contents of the byte was "set", and false otherwise.
     Operand 1 is the `QImode' memory to be modified.  Operand 2 is the
     memory model to be used.

     The specific value that defines "set" is implementation defined,
     and is normally based on what is performed by the native atomic
     test and set instruction.

`mem_thread_fenceMODE'
     This pattern emits code required to implement a thread fence with
     memory model semantics.  Operand 0 is the memory model to be used.

     If this pattern is not specified, all memory models except
     `__ATOMIC_RELAXED' will result in issuing a `sync_synchronize'
     barrier pattern.

`mem_signal_fenceMODE'
     This pattern emits code required to implement a signal fence with
     memory model semantics.  Operand 0 is the memory model to be used.

     This pattern should impact the compiler optimizers the same way
     that mem_signal_fence does, but it does not need to issue any
     barrier instructions.

     If this pattern is not specified, all memory models except
     `__ATOMIC_RELAXED' will result in issuing a `sync_synchronize'
     barrier pattern.

`get_thread_pointerMODE'
`set_thread_pointerMODE'
     These patterns emit code that reads/sets the TLS thread pointer.
     Currently, these are only needed if the target needs to support the
     `__builtin_thread_pointer' and `__builtin_set_thread_pointer'
     builtins.

     The get/set patterns have a single output/input operand
     respectively, with MODE intended to be `Pmode'.

`stack_protect_set'
     This pattern, if defined, moves a `ptr_mode' value from the memory
     in operand 1 to the memory in operand 0 without leaving the value
     in a register afterward.  This is to avoid leaking the value some
     place that an attacker might use to rewrite the stack guard slot
     after having clobbered it.

     If this pattern is not defined, then a plain move pattern is
     generated.

`stack_protect_test'
     This pattern, if defined, compares a `ptr_mode' value from the
     memory in operand 1 with the memory in operand 0 without leaving
     the value in a register afterward and branches to operand 2 if the
     values were equal.

     If this pattern is not defined, then a plain compare pattern and
     conditional branch pattern is used.

`clear_cache'
     This pattern, if defined, flushes the instruction cache for a
     region of memory.  The region is bounded to by the Pmode pointers
     in operand 0 inclusive and operand 1 exclusive.

     If this pattern is not defined, a call to the library function
     `__clear_cache' is used.



File: gccint.info,  Node: Pattern Ordering,  Next: Dependent Patterns,  Prev: Standard Names,  Up: Machine Desc

16.10 When the Order of Patterns Matters
========================================

Sometimes an insn can match more than one instruction pattern.  Then the
pattern that appears first in the machine description is the one used.
Therefore, more specific patterns (patterns that will match fewer
things) and faster instructions (those that will produce better code
when they do match) should usually go first in the description.

 In some cases the effect of ordering the patterns can be used to hide
a pattern when it is not valid.  For example, the 68000 has an
instruction for converting a fullword to floating point and another for
converting a byte to floating point.  An instruction converting an
integer to floating point could match either one.  We put the pattern
to convert the fullword first to make sure that one will be used rather
than the other.  (Otherwise a large integer might be generated as a
single-byte immediate quantity, which would not work.)  Instead of
using this pattern ordering it would be possible to make the pattern
for convert-a-byte smart enough to deal properly with any constant
value.


File: gccint.info,  Node: Dependent Patterns,  Next: Jump Patterns,  Prev: Pattern Ordering,  Up: Machine Desc

16.11 Interdependence of Patterns
=================================

In some cases machines support instructions identical except for the
machine mode of one or more operands.  For example, there may be
"sign-extend halfword" and "sign-extend byte" instructions whose
patterns are

     (set (match_operand:SI 0 ...)
          (extend:SI (match_operand:HI 1 ...)))

     (set (match_operand:SI 0 ...)
          (extend:SI (match_operand:QI 1 ...)))

Constant integers do not specify a machine mode, so an instruction to
extend a constant value could match either pattern.  The pattern it
actually will match is the one that appears first in the file.  For
correct results, this must be the one for the widest possible mode
(`HImode', here).  If the pattern matches the `QImode' instruction, the
results will be incorrect if the constant value does not actually fit
that mode.

 Such instructions to extend constants are rarely generated because
they are optimized away, but they do occasionally happen in nonoptimized
compilations.

 If a constraint in a pattern allows a constant, the reload pass may
replace a register with a constant permitted by the constraint in some
cases.  Similarly for memory references.  Because of this substitution,
you should not provide separate patterns for increment and decrement
instructions.  Instead, they should be generated from the same pattern
that supports register-register add insns by examining the operands and
generating the appropriate machine instruction.


File: gccint.info,  Node: Jump Patterns,  Next: Looping Patterns,  Prev: Dependent Patterns,  Up: Machine Desc

16.12 Defining Jump Instruction Patterns
========================================

GCC does not assume anything about how the machine realizes jumps.  The
machine description should define a single pattern, usually a
`define_expand', which expands to all the required insns.

 Usually, this would be a comparison insn to set the condition code and
a separate branch insn testing the condition code and branching or not
according to its value.  For many machines, however, separating
compares and branches is limiting, which is why the more flexible
approach with one `define_expand' is used in GCC.  The machine
description becomes clearer for architectures that have
compare-and-branch instructions but no condition code.  It also works
better when different sets of comparison operators are supported by
different kinds of conditional branches (e.g. integer vs.
floating-point), or by conditional branches with respect to conditional
stores.

 Two separate insns are always used if the machine description
represents a condition code register using the legacy RTL expression
`(cc0)', and on most machines that use a separate condition code
register (*note Condition Code::).  For machines that use `(cc0)', in
fact, the set and use of the condition code must be separate and
adjacent(1), thus allowing flags in `cc_status' to be used (*note
Condition Code::) and so that the comparison and branch insns could be
located from each other by using the functions `prev_cc0_setter' and
`next_cc0_user'.

 Even in this case having a single entry point for conditional branches
is advantageous, because it handles equally well the case where a single
comparison instruction records the results of both signed and unsigned
comparison of the given operands (with the branch insns coming in
distinct signed and unsigned flavors) as in the x86 or SPARC, and the
case where there are distinct signed and unsigned compare instructions
and only one set of conditional branch instructions as in the PowerPC.

 ---------- Footnotes ----------

 (1) `note' insns can separate them, though.


File: gccint.info,  Node: Looping Patterns,  Next: Insn Canonicalizations,  Prev: Jump Patterns,  Up: Machine Desc

16.13 Defining Looping Instruction Patterns
===========================================

Some machines have special jump instructions that can be utilized to
make loops more efficient.  A common example is the 68000 `dbra'
instruction which performs a decrement of a register and a branch if the
result was greater than zero.  Other machines, in particular digital
signal processors (DSPs), have special block repeat instructions to
provide low-overhead loop support.  For example, the TI TMS320C3x/C4x
DSPs have a block repeat instruction that loads special registers to
mark the top and end of a loop and to count the number of loop
iterations.  This avoids the need for fetching and executing a
`dbra'-like instruction and avoids pipeline stalls associated with the
jump.

 GCC has three special named patterns to support low overhead looping.
They are `decrement_and_branch_until_zero', `doloop_begin', and
`doloop_end'.  The first pattern, `decrement_and_branch_until_zero', is
not emitted during RTL generation but may be emitted during the
instruction combination phase.  This requires the assistance of the
loop optimizer, using information collected during strength reduction,
to reverse a loop to count down to zero.  Some targets also require the
loop optimizer to add a `REG_NONNEG' note to indicate that the
iteration count is always positive.  This is needed if the target
performs a signed loop termination test.  For example, the 68000 uses a
pattern similar to the following for its `dbra' instruction:

     (define_insn "decrement_and_branch_until_zero"
       [(set (pc)
             (if_then_else
               (ge (plus:SI (match_operand:SI 0 "general_operand" "+d*am")
                            (const_int -1))
                   (const_int 0))
               (label_ref (match_operand 1 "" ""))
               (pc)))
        (set (match_dup 0)
             (plus:SI (match_dup 0)
                      (const_int -1)))]
       "find_reg_note (insn, REG_NONNEG, 0)"
       "...")

 Note that since the insn is both a jump insn and has an output, it must
deal with its own reloads, hence the `m' constraints.  Also note that
since this insn is generated by the instruction combination phase
combining two sequential insns together into an implicit parallel insn,
the iteration counter needs to be biased by the same amount as the
decrement operation, in this case -1.  Note that the following similar
pattern will not be matched by the combiner.

     (define_insn "decrement_and_branch_until_zero"
       [(set (pc)
             (if_then_else
               (ge (match_operand:SI 0 "general_operand" "+d*am")
                   (const_int 1))
               (label_ref (match_operand 1 "" ""))
               (pc)))
        (set (match_dup 0)
             (plus:SI (match_dup 0)
                      (const_int -1)))]
       "find_reg_note (insn, REG_NONNEG, 0)"
       "...")

 The other two special looping patterns, `doloop_begin' and
`doloop_end', are emitted by the loop optimizer for certain
well-behaved loops with a finite number of loop iterations using
information collected during strength reduction.

 The `doloop_end' pattern describes the actual looping instruction (or
the implicit looping operation) and the `doloop_begin' pattern is an
optional companion pattern that can be used for initialization needed
for some low-overhead looping instructions.

 Note that some machines require the actual looping instruction to be
emitted at the top of the loop (e.g., the TMS320C3x/C4x DSPs).  Emitting
the true RTL for a looping instruction at the top of the loop can cause
problems with flow analysis.  So instead, a dummy `doloop' insn is
emitted at the end of the loop.  The machine dependent reorg pass checks
for the presence of this `doloop' insn and then searches back to the
top of the loop, where it inserts the true looping insn (provided there
are no instructions in the loop which would cause problems).  Any
additional labels can be emitted at this point.  In addition, if the
desired special iteration counter register was not allocated, this
machine dependent reorg pass could emit a traditional compare and jump
instruction pair.

 The essential difference between the `decrement_and_branch_until_zero'
and the `doloop_end' patterns is that the loop optimizer allocates an
additional pseudo register for the latter as an iteration counter.
This pseudo register cannot be used within the loop (i.e., general
induction variables cannot be derived from it), however, in many cases
the loop induction variable may become redundant and removed by the
flow pass.


File: gccint.info,  Node: Insn Canonicalizations,  Next: Expander Definitions,  Prev: Looping Patterns,  Up: Machine Desc

16.14 Canonicalization of Instructions
======================================

There are often cases where multiple RTL expressions could represent an
operation performed by a single machine instruction.  This situation is
most commonly encountered with logical, branch, and multiply-accumulate
instructions.  In such cases, the compiler attempts to convert these
multiple RTL expressions into a single canonical form to reduce the
number of insn patterns required.

 In addition to algebraic simplifications, following canonicalizations
are performed:

   * For commutative and comparison operators, a constant is always
     made the second operand.  If a machine only supports a constant as
     the second operand, only patterns that match a constant in the
     second operand need be supplied.

   * For associative operators, a sequence of operators will always
     chain to the left; for instance, only the left operand of an
     integer `plus' can itself be a `plus'.  `and', `ior', `xor',
     `plus', `mult', `smin', `smax', `umin', and `umax' are associative
     when applied to integers, and sometimes to floating-point.

   * For these operators, if only one operand is a `neg', `not',
     `mult', `plus', or `minus' expression, it will be the first
     operand.

   * In combinations of `neg', `mult', `plus', and `minus', the `neg'
     operations (if any) will be moved inside the operations as far as
     possible.  For instance, `(neg (mult A B))' is canonicalized as
     `(mult (neg A) B)', but `(plus (mult (neg B) C) A)' is
     canonicalized as `(minus A (mult B C))'.

   * For the `compare' operator, a constant is always the second operand
     if the first argument is a condition code register or `(cc0)'.

   * An operand of `neg', `not', `mult', `plus', or `minus' is made the
     first operand under the same conditions as above.

   * `(ltu (plus A B) B)' is converted to `(ltu (plus A B) A)'.
     Likewise with `geu' instead of `ltu'.

   * `(minus X (const_int N))' is converted to `(plus X (const_int
     -N))'.

   * Within address computations (i.e., inside `mem'), a left shift is
     converted into the appropriate multiplication by a power of two.

   * De Morgan's Law is used to move bitwise negation inside a bitwise
     logical-and or logical-or operation.  If this results in only one
     operand being a `not' expression, it will be the first one.

     A machine that has an instruction that performs a bitwise
     logical-and of one operand with the bitwise negation of the other
     should specify the pattern for that instruction as

          (define_insn ""
            [(set (match_operand:M 0 ...)
                  (and:M (not:M (match_operand:M 1 ...))
                               (match_operand:M 2 ...)))]
            "..."
            "...")

     Similarly, a pattern for a "NAND" instruction should be written

          (define_insn ""
            [(set (match_operand:M 0 ...)
                  (ior:M (not:M (match_operand:M 1 ...))
                               (not:M (match_operand:M 2 ...))))]
            "..."
            "...")

     In both cases, it is not necessary to include patterns for the many
     logically equivalent RTL expressions.

   * The only possible RTL expressions involving both bitwise
     exclusive-or and bitwise negation are `(xor:M X Y)' and `(not:M
     (xor:M X Y))'.

   * The sum of three items, one of which is a constant, will only
     appear in the form

          (plus:M (plus:M X Y) CONSTANT)

   * Equality comparisons of a group of bits (usually a single bit)
     with zero will be written using `zero_extract' rather than the
     equivalent `and' or `sign_extract' operations.

   * `(sign_extend:M1 (mult:M2 (sign_extend:M2 X) (sign_extend:M2 Y)))'
     is converted to `(mult:M1 (sign_extend:M1 X) (sign_extend:M1 Y))',
     and likewise for `zero_extend'.

   * `(sign_extend:M1 (mult:M2 (ashiftrt:M2 X S) (sign_extend:M2 Y)))'
     is converted to `(mult:M1 (sign_extend:M1 (ashiftrt:M2 X S))
     (sign_extend:M1 Y))', and likewise for patterns using
     `zero_extend' and `lshiftrt'.  If the second operand of `mult' is
     also a shift, then that is extended also.  This transformation is
     only applied when it can be proven that the original operation had
     sufficient precision to prevent overflow.


 Further canonicalization rules are defined in the function
`commutative_operand_precedence' in `gcc/rtlanal.c'.


File: gccint.info,  Node: Expander Definitions,  Next: Insn Splitting,  Prev: Insn Canonicalizations,  Up: Machine Desc

16.15 Defining RTL Sequences for Code Generation
================================================

On some target machines, some standard pattern names for RTL generation
cannot be handled with single insn, but a sequence of RTL insns can
represent them.  For these target machines, you can write a
`define_expand' to specify how to generate the sequence of RTL.

 A `define_expand' is an RTL expression that looks almost like a
`define_insn'; but, unlike the latter, a `define_expand' is used only
for RTL generation and it can produce more than one RTL insn.

 A `define_expand' RTX has four operands:

   * The name.  Each `define_expand' must have a name, since the only
     use for it is to refer to it by name.

   * The RTL template.  This is a vector of RTL expressions representing
     a sequence of separate instructions.  Unlike `define_insn', there
     is no implicit surrounding `PARALLEL'.

   * The condition, a string containing a C expression.  This
     expression is used to express how the availability of this pattern
     depends on subclasses of target machine, selected by command-line
     options when GCC is run.  This is just like the condition of a
     `define_insn' that has a standard name.  Therefore, the condition
     (if present) may not depend on the data in the insn being matched,
     but only the target-machine-type flags.  The compiler needs to
     test these conditions during initialization in order to learn
     exactly which named instructions are available in a particular run.

   * The preparation statements, a string containing zero or more C
     statements which are to be executed before RTL code is generated
     from the RTL template.

     Usually these statements prepare temporary registers for use as
     internal operands in the RTL template, but they can also generate
     RTL insns directly by calling routines such as `emit_insn', etc.
     Any such insns precede the ones that come from the RTL template.

   * Optionally, a vector containing the values of attributes. *Note
     Insn Attributes::.

 Every RTL insn emitted by a `define_expand' must match some
`define_insn' in the machine description.  Otherwise, the compiler will
crash when trying to generate code for the insn or trying to optimize
it.

 The RTL template, in addition to controlling generation of RTL insns,
also describes the operands that need to be specified when this pattern
is used.  In particular, it gives a predicate for each operand.

 A true operand, which needs to be specified in order to generate RTL
from the pattern, should be described with a `match_operand' in its
first occurrence in the RTL template.  This enters information on the
operand's predicate into the tables that record such things.  GCC uses
the information to preload the operand into a register if that is
required for valid RTL code.  If the operand is referred to more than
once, subsequent references should use `match_dup'.

 The RTL template may also refer to internal "operands" which are
temporary registers or labels used only within the sequence made by the
`define_expand'.  Internal operands are substituted into the RTL
template with `match_dup', never with `match_operand'.  The values of
the internal operands are not passed in as arguments by the compiler
when it requests use of this pattern.  Instead, they are computed
within the pattern, in the preparation statements.  These statements
compute the values and store them into the appropriate elements of
`operands' so that `match_dup' can find them.

 There are two special macros defined for use in the preparation
statements: `DONE' and `FAIL'.  Use them with a following semicolon, as
a statement.

`DONE'
     Use the `DONE' macro to end RTL generation for the pattern.  The
     only RTL insns resulting from the pattern on this occasion will be
     those already emitted by explicit calls to `emit_insn' within the
     preparation statements; the RTL template will not be generated.

`FAIL'
     Make the pattern fail on this occasion.  When a pattern fails, it
     means that the pattern was not truly available.  The calling
     routines in the compiler will try other strategies for code
     generation using other patterns.

     Failure is currently supported only for binary (addition,
     multiplication, shifting, etc.) and bit-field (`extv', `extzv',
     and `insv') operations.

 If the preparation falls through (invokes neither `DONE' nor `FAIL'),
then the `define_expand' acts like a `define_insn' in that the RTL
template is used to generate the insn.

 The RTL template is not used for matching, only for generating the
initial insn list.  If the preparation statement always invokes `DONE'
or `FAIL', the RTL template may be reduced to a simple list of
operands, such as this example:

     (define_expand "addsi3"
       [(match_operand:SI 0 "register_operand" "")
        (match_operand:SI 1 "register_operand" "")
        (match_operand:SI 2 "register_operand" "")]
       ""
       "
     {
       handle_add (operands[0], operands[1], operands[2]);
       DONE;
     }")

 Here is an example, the definition of left-shift for the SPUR chip:

     (define_expand "ashlsi3"
       [(set (match_operand:SI 0 "register_operand" "")
             (ashift:SI
               (match_operand:SI 1 "register_operand" "")
               (match_operand:SI 2 "nonmemory_operand" "")))]
       ""
       "

     {
       if (GET_CODE (operands[2]) != CONST_INT
           || (unsigned) INTVAL (operands[2]) > 3)
         FAIL;
     }")

This example uses `define_expand' so that it can generate an RTL insn
for shifting when the shift-count is in the supported range of 0 to 3
but fail in other cases where machine insns aren't available.  When it
fails, the compiler tries another strategy using different patterns
(such as, a library call).

 If the compiler were able to handle nontrivial condition-strings in
patterns with names, then it would be possible to use a `define_insn'
in that case.  Here is another case (zero-extension on the 68000) which
makes more use of the power of `define_expand':

     (define_expand "zero_extendhisi2"
       [(set (match_operand:SI 0 "general_operand" "")
             (const_int 0))
        (set (strict_low_part
               (subreg:HI
                 (match_dup 0)
                 0))
             (match_operand:HI 1 "general_operand" ""))]
       ""
       "operands[1] = make_safe_from (operands[1], operands[0]);")

Here two RTL insns are generated, one to clear the entire output operand
and the other to copy the input operand into its low half.  This
sequence is incorrect if the input operand refers to [the old value of]
the output operand, so the preparation statement makes sure this isn't
so.  The function `make_safe_from' copies the `operands[1]' into a
temporary register if it refers to `operands[0]'.  It does this by
emitting another RTL insn.

 Finally, a third example shows the use of an internal operand.
Zero-extension on the SPUR chip is done by `and'-ing the result against
a halfword mask.  But this mask cannot be represented by a `const_int'
because the constant value is too large to be legitimate on this
machine.  So it must be copied into a register with `force_reg' and
then the register used in the `and'.

     (define_expand "zero_extendhisi2"
       [(set (match_operand:SI 0 "register_operand" "")
             (and:SI (subreg:SI
                       (match_operand:HI 1 "register_operand" "")
                       0)
                     (match_dup 2)))]
       ""
       "operands[2]
          = force_reg (SImode, GEN_INT (65535)); ")

 _Note:_ If the `define_expand' is used to serve a standard binary or
unary arithmetic operation or a bit-field operation, then the last insn
it generates must not be a `code_label', `barrier' or `note'.  It must
be an `insn', `jump_insn' or `call_insn'.  If you don't need a real insn
at the end, emit an insn to copy the result of the operation into
itself.  Such an insn will generate no code, but it can avoid problems
in the compiler.


File: gccint.info,  Node: Insn Splitting,  Next: Including Patterns,  Prev: Expander Definitions,  Up: Machine Desc

16.16 Defining How to Split Instructions
========================================

There are two cases where you should specify how to split a pattern
into multiple insns.  On machines that have instructions requiring
delay slots (*note Delay Slots::) or that have instructions whose
output is not available for multiple cycles (*note Processor pipeline
description::), the compiler phases that optimize these cases need to
be able to move insns into one-instruction delay slots.  However, some
insns may generate more than one machine instruction.  These insns
cannot be placed into a delay slot.

 Often you can rewrite the single insn as a list of individual insns,
each corresponding to one machine instruction.  The disadvantage of
doing so is that it will cause the compilation to be slower and require
more space.  If the resulting insns are too complex, it may also
suppress some optimizations.  The compiler splits the insn if there is a
reason to believe that it might improve instruction or delay slot
scheduling.

 The insn combiner phase also splits putative insns.  If three insns are
merged into one insn with a complex expression that cannot be matched by
some `define_insn' pattern, the combiner phase attempts to split the
complex pattern into two insns that are recognized.  Usually it can
break the complex pattern into two patterns by splitting out some
subexpression.  However, in some other cases, such as performing an
addition of a large constant in two insns on a RISC machine, the way to
split the addition into two insns is machine-dependent.

 The `define_split' definition tells the compiler how to split a
complex insn into several simpler insns.  It looks like this:

     (define_split
       [INSN-PATTERN]
       "CONDITION"
       [NEW-INSN-PATTERN-1
        NEW-INSN-PATTERN-2
        ...]
       "PREPARATION-STATEMENTS")

 INSN-PATTERN is a pattern that needs to be split and CONDITION is the
final condition to be tested, as in a `define_insn'.  When an insn
matching INSN-PATTERN and satisfying CONDITION is found, it is replaced
in the insn list with the insns given by NEW-INSN-PATTERN-1,
NEW-INSN-PATTERN-2, etc.

 The PREPARATION-STATEMENTS are similar to those statements that are
specified for `define_expand' (*note Expander Definitions::) and are
executed before the new RTL is generated to prepare for the generated
code or emit some insns whose pattern is not fixed.  Unlike those in
`define_expand', however, these statements must not generate any new
pseudo-registers.  Once reload has completed, they also must not
allocate any space in the stack frame.

 Patterns are matched against INSN-PATTERN in two different
circumstances.  If an insn needs to be split for delay slot scheduling
or insn scheduling, the insn is already known to be valid, which means
that it must have been matched by some `define_insn' and, if
`reload_completed' is nonzero, is known to satisfy the constraints of
that `define_insn'.  In that case, the new insn patterns must also be
insns that are matched by some `define_insn' and, if `reload_completed'
is nonzero, must also satisfy the constraints of those definitions.

 As an example of this usage of `define_split', consider the following
example from `a29k.md', which splits a `sign_extend' from `HImode' to
`SImode' into a pair of shift insns:

     (define_split
       [(set (match_operand:SI 0 "gen_reg_operand" "")
             (sign_extend:SI (match_operand:HI 1 "gen_reg_operand" "")))]
       ""
       [(set (match_dup 0)
             (ashift:SI (match_dup 1)
                        (const_int 16)))
        (set (match_dup 0)
             (ashiftrt:SI (match_dup 0)
                          (const_int 16)))]
       "
     { operands[1] = gen_lowpart (SImode, operands[1]); }")

 When the combiner phase tries to split an insn pattern, it is always
the case that the pattern is _not_ matched by any `define_insn'.  The
combiner pass first tries to split a single `set' expression and then
the same `set' expression inside a `parallel', but followed by a
`clobber' of a pseudo-reg to use as a scratch register.  In these
cases, the combiner expects exactly two new insn patterns to be
generated.  It will verify that these patterns match some `define_insn'
definitions, so you need not do this test in the `define_split' (of
course, there is no point in writing a `define_split' that will never
produce insns that match).

 Here is an example of this use of `define_split', taken from
`rs6000.md':

     (define_split
       [(set (match_operand:SI 0 "gen_reg_operand" "")
             (plus:SI (match_operand:SI 1 "gen_reg_operand" "")
                      (match_operand:SI 2 "non_add_cint_operand" "")))]
       ""
       [(set (match_dup 0) (plus:SI (match_dup 1) (match_dup 3)))
        (set (match_dup 0) (plus:SI (match_dup 0) (match_dup 4)))]
     "
     {
       int low = INTVAL (operands[2]) & 0xffff;
       int high = (unsigned) INTVAL (operands[2]) >> 16;

       if (low & 0x8000)
         high++, low |= 0xffff0000;

       operands[3] = GEN_INT (high << 16);
       operands[4] = GEN_INT (low);
     }")

 Here the predicate `non_add_cint_operand' matches any `const_int' that
is _not_ a valid operand of a single add insn.  The add with the
smaller displacement is written so that it can be substituted into the
address of a subsequent operation.

 An example that uses a scratch register, from the same file, generates
an equality comparison of a register and a large constant:

     (define_split
       [(set (match_operand:CC 0 "cc_reg_operand" "")
             (compare:CC (match_operand:SI 1 "gen_reg_operand" "")
                         (match_operand:SI 2 "non_short_cint_operand" "")))
        (clobber (match_operand:SI 3 "gen_reg_operand" ""))]
       "find_single_use (operands[0], insn, 0)
        && (GET_CODE (*find_single_use (operands[0], insn, 0)) == EQ
            || GET_CODE (*find_single_use (operands[0], insn, 0)) == NE)"
       [(set (match_dup 3) (xor:SI (match_dup 1) (match_dup 4)))
        (set (match_dup 0) (compare:CC (match_dup 3) (match_dup 5)))]
       "
     {
       /* Get the constant we are comparing against, C, and see what it
          looks like sign-extended to 16 bits.  Then see what constant
          could be XOR'ed with C to get the sign-extended value.  */

       int c = INTVAL (operands[2]);
       int sextc = (c << 16) >> 16;
       int xorv = c ^ sextc;

       operands[4] = GEN_INT (xorv);
       operands[5] = GEN_INT (sextc);
     }")

 To avoid confusion, don't write a single `define_split' that accepts
some insns that match some `define_insn' as well as some insns that
don't.  Instead, write two separate `define_split' definitions, one for
the insns that are valid and one for the insns that are not valid.

 The splitter is allowed to split jump instructions into sequence of
jumps or create new jumps in while splitting non-jump instructions.  As
the central flowgraph and branch prediction information needs to be
updated, several restriction apply.

 Splitting of jump instruction into sequence that over by another jump
instruction is always valid, as compiler expect identical behavior of
new jump.  When new sequence contains multiple jump instructions or new
labels, more assistance is needed.  Splitter is required to create only
unconditional jumps, or simple conditional jump instructions.
Additionally it must attach a `REG_BR_PROB' note to each conditional
jump.  A global variable `split_branch_probability' holds the
probability of the original branch in case it was a simple conditional
jump, -1 otherwise.  To simplify recomputing of edge frequencies, the
new sequence is required to have only forward jumps to the newly
created labels.

 For the common case where the pattern of a define_split exactly
matches the pattern of a define_insn, use `define_insn_and_split'.  It
looks like this:

     (define_insn_and_split
       [INSN-PATTERN]
       "CONDITION"
       "OUTPUT-TEMPLATE"
       "SPLIT-CONDITION"
       [NEW-INSN-PATTERN-1
        NEW-INSN-PATTERN-2
        ...]
       "PREPARATION-STATEMENTS"
       [INSN-ATTRIBUTES])

 INSN-PATTERN, CONDITION, OUTPUT-TEMPLATE, and INSN-ATTRIBUTES are used
as in `define_insn'.  The NEW-INSN-PATTERN vector and the
PREPARATION-STATEMENTS are used as in a `define_split'.  The
SPLIT-CONDITION is also used as in `define_split', with the additional
behavior that if the condition starts with `&&', the condition used for
the split will be the constructed as a logical "and" of the split
condition with the insn condition.  For example, from i386.md:

     (define_insn_and_split "zero_extendhisi2_and"
       [(set (match_operand:SI 0 "register_operand" "=r")
          (zero_extend:SI (match_operand:HI 1 "register_operand" "0")))
        (clobber (reg:CC 17))]
       "TARGET_ZERO_EXTEND_WITH_AND && !optimize_size"
       "#"
       "&& reload_completed"
       [(parallel [(set (match_dup 0)
                        (and:SI (match_dup 0) (const_int 65535)))
                   (clobber (reg:CC 17))])]
       ""
       [(set_attr "type" "alu1")])

 In this case, the actual split condition will be
`TARGET_ZERO_EXTEND_WITH_AND && !optimize_size && reload_completed'.

 The `define_insn_and_split' construction provides exactly the same
functionality as two separate `define_insn' and `define_split'
patterns.  It exists for compactness, and as a maintenance tool to
prevent having to ensure the two patterns' templates match.


File: gccint.info,  Node: Including Patterns,  Next: Peephole Definitions,  Prev: Insn Splitting,  Up: Machine Desc

16.17 Including Patterns in Machine Descriptions.
=================================================

The `include' pattern tells the compiler tools where to look for
patterns that are in files other than in the file `.md'.  This is used
only at build time and there is no preprocessing allowed.

 It looks like:


     (include
       PATHNAME)

 For example:


     (include "filestuff")

 Where PATHNAME is a string that specifies the location of the file,
specifies the include file to be in `gcc/config/target/filestuff'.  The
directory `gcc/config/target' is regarded as the default directory.

 Machine descriptions may be split up into smaller more manageable
subsections and placed into subdirectories.

 By specifying:


     (include "BOGUS/filestuff")

 the include file is specified to be in
`gcc/config/TARGET/BOGUS/filestuff'.

 Specifying an absolute path for the include file such as;

     (include "/u2/BOGUS/filestuff")
 is permitted but is not encouraged.

16.17.1 RTL Generation Tool Options for Directory Search
--------------------------------------------------------

The `-IDIR' option specifies directories to search for machine
descriptions.  For example:


     genrecog -I/p1/abc/proc1 -I/p2/abcd/pro2 target.md

 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
machine definition file, substituting your own version, since these
directories are searched before the default machine description file
directories.  If you use more than one `-I' option, the directories are
scanned in left-to-right order; the standard default directory come
after.


File: gccint.info,  Node: Peephole Definitions,  Next: Insn Attributes,  Prev: Including Patterns,  Up: Machine Desc

16.18 Machine-Specific Peephole Optimizers
==========================================

In addition to instruction patterns the `md' file may contain
definitions of machine-specific peephole optimizations.

 The combiner does not notice certain peephole optimizations when the
data flow in the program does not suggest that it should try them.  For
example, sometimes two consecutive insns related in purpose can be
combined even though the second one does not appear to use a register
computed in the first one.  A machine-specific peephole optimizer can
detect such opportunities.

 There are two forms of peephole definitions that may be used.  The
original `define_peephole' is run at assembly output time to match
insns and substitute assembly text.  Use of `define_peephole' is
deprecated.

 A newer `define_peephole2' matches insns and substitutes new insns.
The `peephole2' pass is run after register allocation but before
scheduling, which may result in much better code for targets that do
scheduling.

* Menu:

* define_peephole::     RTL to Text Peephole Optimizers
* define_peephole2::    RTL to RTL Peephole Optimizers


File: gccint.info,  Node: define_peephole,  Next: define_peephole2,  Up: Peephole Definitions

16.18.1 RTL to Text Peephole Optimizers
---------------------------------------

A definition looks like this:

     (define_peephole
       [INSN-PATTERN-1
        INSN-PATTERN-2
        ...]
       "CONDITION"
       "TEMPLATE"
       "OPTIONAL-INSN-ATTRIBUTES")

The last string operand may be omitted if you are not using any
machine-specific information in this machine description.  If present,
it must obey the same rules as in a `define_insn'.

 In this skeleton, INSN-PATTERN-1 and so on are patterns to match
consecutive insns.  The optimization applies to a sequence of insns when
INSN-PATTERN-1 matches the first one, INSN-PATTERN-2 matches the next,
and so on.

 Each of the insns matched by a peephole must also match a
`define_insn'.  Peepholes are checked only at the last stage just
before code generation, and only optionally.  Therefore, any insn which
would match a peephole but no `define_insn' will cause a crash in code
generation in an unoptimized compilation, or at various optimization
stages.

 The operands of the insns are matched with `match_operands',
`match_operator', and `match_dup', as usual.  What is not usual is that
the operand numbers apply to all the insn patterns in the definition.
So, you can check for identical operands in two insns by using
`match_operand' in one insn and `match_dup' in the other.

 The operand constraints used in `match_operand' patterns do not have
any direct effect on the applicability of the peephole, but they will
be validated afterward, so make sure your constraints are general enough
to apply whenever the peephole matches.  If the peephole matches but
the constraints are not satisfied, the compiler will crash.

 It is safe to omit constraints in all the operands of the peephole; or
you can write constraints which serve as a double-check on the criteria
previously tested.

 Once a sequence of insns matches the patterns, the CONDITION is
checked.  This is a C expression which makes the final decision whether
to perform the optimization (we do so if the expression is nonzero).  If
CONDITION is omitted (in other words, the string is empty) then the
optimization is applied to every sequence of insns that matches the
patterns.

 The defined peephole optimizations are applied after register
allocation is complete.  Therefore, the peephole definition can check
which operands have ended up in which kinds of registers, just by
looking at the operands.

 The way to refer to the operands in CONDITION is to write
`operands[I]' for operand number I (as matched by `(match_operand I
...)').  Use the variable `insn' to refer to the last of the insns
being matched; use `prev_active_insn' to find the preceding insns.

 When optimizing computations with intermediate results, you can use
CONDITION to match only when the intermediate results are not used
elsewhere.  Use the C expression `dead_or_set_p (INSN, OP)', where INSN
is the insn in which you expect the value to be used for the last time
(from the value of `insn', together with use of `prev_nonnote_insn'),
and OP is the intermediate value (from `operands[I]').

 Applying the optimization means replacing the sequence of insns with
one new insn.  The TEMPLATE controls ultimate output of assembler code
for this combined insn.  It works exactly like the template of a
`define_insn'.  Operand numbers in this template are the same ones used
in matching the original sequence of insns.

 The result of a defined peephole optimizer does not need to match any
of the insn patterns in the machine description; it does not even have
an opportunity to match them.  The peephole optimizer definition itself
serves as the insn pattern to control how the insn is output.

 Defined peephole optimizers are run as assembler code is being output,
so the insns they produce are never combined or rearranged in any way.

 Here is an example, taken from the 68000 machine description:

     (define_peephole
       [(set (reg:SI 15) (plus:SI (reg:SI 15) (const_int 4)))
        (set (match_operand:DF 0 "register_operand" "=f")
             (match_operand:DF 1 "register_operand" "ad"))]
       "FP_REG_P (operands[0]) && ! FP_REG_P (operands[1])"
     {
       rtx xoperands[2];
       xoperands[1] = gen_rtx_REG (SImode, REGNO (operands[1]) + 1);
     #ifdef MOTOROLA
       output_asm_insn ("move.l %1,(sp)", xoperands);
       output_asm_insn ("move.l %1,-(sp)", operands);
       return "fmove.d (sp)+,%0";
     #else
       output_asm_insn ("movel %1,sp@", xoperands);
       output_asm_insn ("movel %1,sp@-", operands);
       return "fmoved sp@+,%0";
     #endif
     })

 The effect of this optimization is to change

     jbsr _foobar
     addql #4,sp
     movel d1,sp@-
     movel d0,sp@-
     fmoved sp@+,fp0

into

     jbsr _foobar
     movel d1,sp@
     movel d0,sp@-
     fmoved sp@+,fp0

 INSN-PATTERN-1 and so on look _almost_ like the second operand of
`define_insn'.  There is one important difference: the second operand
of `define_insn' consists of one or more RTX's enclosed in square
brackets.  Usually, there is only one: then the same action can be
written as an element of a `define_peephole'.  But when there are
multiple actions in a `define_insn', they are implicitly enclosed in a
`parallel'.  Then you must explicitly write the `parallel', and the
square brackets within it, in the `define_peephole'.  Thus, if an insn
pattern looks like this,

     (define_insn "divmodsi4"
       [(set (match_operand:SI 0 "general_operand" "=d")
             (div:SI (match_operand:SI 1 "general_operand" "0")
                     (match_operand:SI 2 "general_operand" "dmsK")))
        (set (match_operand:SI 3 "general_operand" "=d")
             (mod:SI (match_dup 1) (match_dup 2)))]
       "TARGET_68020"
       "divsl%.l %2,%3:%0")

then the way to mention this insn in a peephole is as follows:

     (define_peephole
       [...
        (parallel
         [(set (match_operand:SI 0 "general_operand" "=d")
               (div:SI (match_operand:SI 1 "general_operand" "0")
                       (match_operand:SI 2 "general_operand" "dmsK")))
          (set (match_operand:SI 3 "general_operand" "=d")
               (mod:SI (match_dup 1) (match_dup 2)))])
        ...]
       ...)


File: gccint.info,  Node: define_peephole2,  Prev: define_peephole,  Up: Peephole Definitions

16.18.2 RTL to RTL Peephole Optimizers
--------------------------------------

The `define_peephole2' definition tells the compiler how to substitute
one sequence of instructions for another sequence, what additional
scratch registers may be needed and what their lifetimes must be.

     (define_peephole2
       [INSN-PATTERN-1
        INSN-PATTERN-2
        ...]
       "CONDITION"
       [NEW-INSN-PATTERN-1
        NEW-INSN-PATTERN-2
        ...]
       "PREPARATION-STATEMENTS")

 The definition is almost identical to `define_split' (*note Insn
Splitting::) except that the pattern to match is not a single
instruction, but a sequence of instructions.

 It is possible to request additional scratch registers for use in the
output template.  If appropriate registers are not free, the pattern
will simply not match.

 Scratch registers are requested with a `match_scratch' pattern at the
top level of the input pattern.  The allocated register (initially) will
be dead at the point requested within the original sequence.  If the
scratch is used at more than a single point, a `match_dup' pattern at
the top level of the input pattern marks the last position in the input
sequence at which the register must be available.

 Here is an example from the IA-32 machine description:

     (define_peephole2
       [(match_scratch:SI 2 "r")
        (parallel [(set (match_operand:SI 0 "register_operand" "")
                        (match_operator:SI 3 "arith_or_logical_operator"
                          [(match_dup 0)
                           (match_operand:SI 1 "memory_operand" "")]))
                   (clobber (reg:CC 17))])]
       "! optimize_size && ! TARGET_READ_MODIFY"
       [(set (match_dup 2) (match_dup 1))
        (parallel [(set (match_dup 0)
                        (match_op_dup 3 [(match_dup 0) (match_dup 2)]))
                   (clobber (reg:CC 17))])]
       "")

This pattern tries to split a load from its use in the hopes that we'll
be able to schedule around the memory load latency.  It allocates a
single `SImode' register of class `GENERAL_REGS' (`"r"') that needs to
be live only at the point just before the arithmetic.

 A real example requiring extended scratch lifetimes is harder to come
by, so here's a silly made-up example:

     (define_peephole2
       [(match_scratch:SI 4 "r")
        (set (match_operand:SI 0 "" "") (match_operand:SI 1 "" ""))
        (set (match_operand:SI 2 "" "") (match_dup 1))
        (match_dup 4)
        (set (match_operand:SI 3 "" "") (match_dup 1))]
       "/* determine 1 does not overlap 0 and 2 */"
       [(set (match_dup 4) (match_dup 1))
        (set (match_dup 0) (match_dup 4))
        (set (match_dup 2) (match_dup 4))]
        (set (match_dup 3) (match_dup 4))]
       "")

If we had not added the `(match_dup 4)' in the middle of the input
sequence, it might have been the case that the register we chose at the
beginning of the sequence is killed by the first or second `set'.


File: gccint.info,  Node: Insn Attributes,  Next: Conditional Execution,  Prev: Peephole Definitions,  Up: Machine Desc

16.19 Instruction Attributes
============================

In addition to describing the instruction supported by the target
machine, the `md' file also defines a group of "attributes" and a set of
values for each.  Every generated insn is assigned a value for each
attribute.  One possible attribute would be the effect that the insn
has on the machine's condition code.  This attribute can then be used
by `NOTICE_UPDATE_CC' to track the condition codes.

* Menu:

* Defining Attributes:: Specifying attributes and their values.
* Expressions::         Valid expressions for attribute values.
* Tagging Insns::       Assigning attribute values to insns.
* Attr Example::        An example of assigning attributes.
* Insn Lengths::        Computing the length of insns.
* Constant Attributes:: Defining attributes that are constant.
* Delay Slots::         Defining delay slots required for a machine.
* Processor pipeline description:: Specifying information for insn scheduling.


File: gccint.info,  Node: Defining Attributes,  Next: Expressions,  Up: Insn Attributes

16.19.1 Defining Attributes and their Values
--------------------------------------------

The `define_attr' expression is used to define each attribute required
by the target machine.  It looks like:

     (define_attr NAME LIST-OF-VALUES DEFAULT)

 NAME is a string specifying the name of the attribute being defined.
Some attributes are used in a special way by the rest of the compiler.
The `enabled' attribute can be used to conditionally enable or disable
insn alternatives (*note Disable Insn Alternatives::). The `predicable'
attribute, together with a suitable `define_cond_exec' (*note
Conditional Execution::), can be used to automatically generate
conditional variants of instruction patterns. The compiler internally
uses the names `ce_enabled' and `nonce_enabled', so they should not be
used elsewhere as alternative names.

 LIST-OF-VALUES is either a string that specifies a comma-separated
list of values that can be assigned to the attribute, or a null string
to indicate that the attribute takes numeric values.

 DEFAULT is an attribute expression that gives the value of this
attribute for insns that match patterns whose definition does not
include an explicit value for this attribute.  *Note Attr Example::,
for more information on the handling of defaults.  *Note Constant
Attributes::, for information on attributes that do not depend on any
particular insn.

 For each defined attribute, a number of definitions are written to the
`insn-attr.h' file.  For cases where an explicit set of values is
specified for an attribute, the following are defined:

   * A `#define' is written for the symbol `HAVE_ATTR_NAME'.

   * An enumerated class is defined for `attr_NAME' with elements of
     the form `UPPER-NAME_UPPER-VALUE' where the attribute name and
     value are first converted to uppercase.

   * A function `get_attr_NAME' is defined that is passed an insn and
     returns the attribute value for that insn.

 For example, if the following is present in the `md' file:

     (define_attr "type" "branch,fp,load,store,arith" ...)

the following lines will be written to the file `insn-attr.h'.

     #define HAVE_ATTR_type 1
     enum attr_type {TYPE_BRANCH, TYPE_FP, TYPE_LOAD,
                      TYPE_STORE, TYPE_ARITH};
     extern enum attr_type get_attr_type ();

 If the attribute takes numeric values, no `enum' type will be defined
and the function to obtain the attribute's value will return `int'.

 There are attributes which are tied to a specific meaning.  These
attributes are not free to use for other purposes:

`length'
     The `length' attribute is used to calculate the length of emitted
     code chunks.  This is especially important when verifying branch
     distances. *Note Insn Lengths::.

`enabled'
     The `enabled' attribute can be defined to prevent certain
     alternatives of an insn definition from being used during code
     generation. *Note Disable Insn Alternatives::.

 For each of these special attributes, the corresponding
`HAVE_ATTR_NAME' `#define' is also written when the attribute is not
defined; in that case, it is defined as `0'.

 Another way of defining an attribute is to use:

     (define_enum_attr "ATTR" "ENUM" DEFAULT)

 This works in just the same way as `define_attr', except that the list
of values is taken from a separate enumeration called ENUM (*note
define_enum::).  This form allows you to use the same list of values
for several attributes without having to repeat the list each time.
For example:

     (define_enum "processor" [
       model_a
       model_b
       ...
     ])
     (define_enum_attr "arch" "processor"
       (const (symbol_ref "target_arch")))
     (define_enum_attr "tune" "processor"
       (const (symbol_ref "target_tune")))

 defines the same attributes as:

     (define_attr "arch" "model_a,model_b,..."
       (const (symbol_ref "target_arch")))
     (define_attr "tune" "model_a,model_b,..."
       (const (symbol_ref "target_tune")))

 but without duplicating the processor list.  The second example
defines two separate C enums (`attr_arch' and `attr_tune') whereas the
first defines a single C enum (`processor').


File: gccint.info,  Node: Expressions,  Next: Tagging Insns,  Prev: Defining Attributes,  Up: Insn Attributes

16.19.2 Attribute Expressions
-----------------------------

RTL expressions used to define attributes use the codes described above
plus a few specific to attribute definitions, to be discussed below.
Attribute value expressions must have one of the following forms:

`(const_int I)'
     The integer I specifies the value of a numeric attribute.  I must
     be non-negative.

     The value of a numeric attribute can be specified either with a
     `const_int', or as an integer represented as a string in
     `const_string', `eq_attr' (see below), `attr', `symbol_ref',
     simple arithmetic expressions, and `set_attr' overrides on
     specific instructions (*note Tagging Insns::).

`(const_string VALUE)'
     The string VALUE specifies a constant attribute value.  If VALUE
     is specified as `"*"', it means that the default value of the
     attribute is to be used for the insn containing this expression.
     `"*"' obviously cannot be used in the DEFAULT expression of a
     `define_attr'.

     If the attribute whose value is being specified is numeric, VALUE
     must be a string containing a non-negative integer (normally
     `const_int' would be used in this case).  Otherwise, it must
     contain one of the valid values for the attribute.

`(if_then_else TEST TRUE-VALUE FALSE-VALUE)'
     TEST specifies an attribute test, whose format is defined below.
     The value of this expression is TRUE-VALUE if TEST is true,
     otherwise it is FALSE-VALUE.

`(cond [TEST1 VALUE1 ...] DEFAULT)'
     The first operand of this expression is a vector containing an even
     number of expressions and consisting of pairs of TEST and VALUE
     expressions.  The value of the `cond' expression is that of the
     VALUE corresponding to the first true TEST expression.  If none of
     the TEST expressions are true, the value of the `cond' expression
     is that of the DEFAULT expression.

 TEST expressions can have one of the following forms:

`(const_int I)'
     This test is true if I is nonzero and false otherwise.

`(not TEST)'
`(ior TEST1 TEST2)'
`(and TEST1 TEST2)'
     These tests are true if the indicated logical function is true.

`(match_operand:M N PRED CONSTRAINTS)'
     This test is true if operand N of the insn whose attribute value
     is being determined has mode M (this part of the test is ignored
     if M is `VOIDmode') and the function specified by the string PRED
     returns a nonzero value when passed operand N and mode M (this
     part of the test is ignored if PRED is the null string).

     The CONSTRAINTS operand is ignored and should be the null string.

`(match_test C-EXPR)'
     The test is true if C expression C-EXPR is true.  In non-constant
     attributes, C-EXPR has access to the following variables:

    INSN
          The rtl instruction under test.

    WHICH_ALTERNATIVE
          The `define_insn' alternative that INSN matches.  *Note
          Output Statement::.

    OPERANDS
          An array of INSN's rtl operands.

     C-EXPR behaves like the condition in a C `if' statement, so there
     is no need to explicitly convert the expression into a boolean 0
     or 1 value.  For example, the following two tests are equivalent:

          (match_test "x & 2")
          (match_test "(x & 2) != 0")

`(le ARITH1 ARITH2)'
`(leu ARITH1 ARITH2)'
`(lt ARITH1 ARITH2)'
`(ltu ARITH1 ARITH2)'
`(gt ARITH1 ARITH2)'
`(gtu ARITH1 ARITH2)'
`(ge ARITH1 ARITH2)'
`(geu ARITH1 ARITH2)'
`(ne ARITH1 ARITH2)'
`(eq ARITH1 ARITH2)'
     These tests are true if the indicated comparison of the two
     arithmetic expressions is true.  Arithmetic expressions are formed
     with `plus', `minus', `mult', `div', `mod', `abs', `neg', `and',
     `ior', `xor', `not', `ashift', `lshiftrt', and `ashiftrt'
     expressions.

     `const_int' and `symbol_ref' are always valid terms (*note Insn
     Lengths::,for additional forms).  `symbol_ref' is a string
     denoting a C expression that yields an `int' when evaluated by the
     `get_attr_...' routine.  It should normally be a global variable.

`(eq_attr NAME VALUE)'
     NAME is a string specifying the name of an attribute.

     VALUE is a string that is either a valid value for attribute NAME,
     a comma-separated list of values, or `!' followed by a value or
     list.  If VALUE does not begin with a `!', this test is true if
     the value of the NAME attribute of the current insn is in the list
     specified by VALUE.  If VALUE begins with a `!', this test is true
     if the attribute's value is _not_ in the specified list.

     For example,

          (eq_attr "type" "load,store")

     is equivalent to

          (ior (eq_attr "type" "load") (eq_attr "type" "store"))

     If NAME specifies an attribute of `alternative', it refers to the
     value of the compiler variable `which_alternative' (*note Output
     Statement::) and the values must be small integers.  For example,

          (eq_attr "alternative" "2,3")

     is equivalent to

          (ior (eq (symbol_ref "which_alternative") (const_int 2))
               (eq (symbol_ref "which_alternative") (const_int 3)))

     Note that, for most attributes, an `eq_attr' test is simplified in
     cases where the value of the attribute being tested is known for
     all insns matching a particular pattern.  This is by far the most
     common case.

`(attr_flag NAME)'
     The value of an `attr_flag' expression is true if the flag
     specified by NAME is true for the `insn' currently being scheduled.

     NAME is a string specifying one of a fixed set of flags to test.
     Test the flags `forward' and `backward' to determine the direction
     of a conditional branch.

     This example describes a conditional branch delay slot which can
     be nullified for forward branches that are taken (annul-true) or
     for backward branches which are not taken (annul-false).

          (define_delay (eq_attr "type" "cbranch")
            [(eq_attr "in_branch_delay" "true")
             (and (eq_attr "in_branch_delay" "true")
                  (attr_flag "forward"))
             (and (eq_attr "in_branch_delay" "true")
                  (attr_flag "backward"))])

     The `forward' and `backward' flags are false if the current `insn'
     being scheduled is not a conditional branch.

     `attr_flag' is only used during delay slot scheduling and has no
     meaning to other passes of the compiler.

`(attr NAME)'
     The value of another attribute is returned.  This is most useful
     for numeric attributes, as `eq_attr' and `attr_flag' produce more
     efficient code for non-numeric attributes.


File: gccint.info,  Node: Tagging Insns,  Next: Attr Example,  Prev: Expressions,  Up: Insn Attributes

16.19.3 Assigning Attribute Values to Insns
-------------------------------------------

The value assigned to an attribute of an insn is primarily determined by
which pattern is matched by that insn (or which `define_peephole'
generated it).  Every `define_insn' and `define_peephole' can have an
optional last argument to specify the values of attributes for matching
insns.  The value of any attribute not specified in a particular insn
is set to the default value for that attribute, as specified in its
`define_attr'.  Extensive use of default values for attributes permits
the specification of the values for only one or two attributes in the
definition of most insn patterns, as seen in the example in the next
section.

 The optional last argument of `define_insn' and `define_peephole' is a
vector of expressions, each of which defines the value for a single
attribute.  The most general way of assigning an attribute's value is
to use a `set' expression whose first operand is an `attr' expression
giving the name of the attribute being set.  The second operand of the
`set' is an attribute expression (*note Expressions::) giving the value
of the attribute.

 When the attribute value depends on the `alternative' attribute (i.e.,
which is the applicable alternative in the constraint of the insn), the
`set_attr_alternative' expression can be used.  It allows the
specification of a vector of attribute expressions, one for each
alternative.

 When the generality of arbitrary attribute expressions is not required,
the simpler `set_attr' expression can be used, which allows specifying
a string giving either a single attribute value or a list of attribute
values, one for each alternative.

 The form of each of the above specifications is shown below.  In each
case, NAME is a string specifying the attribute to be set.

`(set_attr NAME VALUE-STRING)'
     VALUE-STRING is either a string giving the desired attribute value,
     or a string containing a comma-separated list giving the values for
     succeeding alternatives.  The number of elements must match the
     number of alternatives in the constraint of the insn pattern.

     Note that it may be useful to specify `*' for some alternative, in
     which case the attribute will assume its default value for insns
     matching that alternative.

`(set_attr_alternative NAME [VALUE1 VALUE2 ...])'
     Depending on the alternative of the insn, the value will be one of
     the specified values.  This is a shorthand for using a `cond' with
     tests on the `alternative' attribute.

`(set (attr NAME) VALUE)'
     The first operand of this `set' must be the special RTL expression
     `attr', whose sole operand is a string giving the name of the
     attribute being set.  VALUE is the value of the attribute.

 The following shows three different ways of representing the same
attribute value specification:

     (set_attr "type" "load,store,arith")

     (set_attr_alternative "type"
                           [(const_string "load") (const_string "store")
                            (const_string "arith")])

     (set (attr "type")
          (cond [(eq_attr "alternative" "1") (const_string "load")
                 (eq_attr "alternative" "2") (const_string "store")]
                (const_string "arith")))

 The `define_asm_attributes' expression provides a mechanism to specify
the attributes assigned to insns produced from an `asm' statement.  It
has the form:

     (define_asm_attributes [ATTR-SETS])

where ATTR-SETS is specified the same as for both the `define_insn' and
the `define_peephole' expressions.

 These values will typically be the "worst case" attribute values.  For
example, they might indicate that the condition code will be clobbered.

 A specification for a `length' attribute is handled specially.  The
way to compute the length of an `asm' insn is to multiply the length
specified in the expression `define_asm_attributes' by the number of
machine instructions specified in the `asm' statement, determined by
counting the number of semicolons and newlines in the string.
Therefore, the value of the `length' attribute specified in a
`define_asm_attributes' should be the maximum possible length of a
single machine instruction.


File: gccint.info,  Node: Attr Example,  Next: Insn Lengths,  Prev: Tagging Insns,  Up: Insn Attributes

16.19.4 Example of Attribute Specifications
-------------------------------------------

The judicious use of defaulting is important in the efficient use of
insn attributes.  Typically, insns are divided into "types" and an
attribute, customarily called `type', is used to represent this value.
This attribute is normally used only to define the default value for
other attributes.  An example will clarify this usage.

 Assume we have a RISC machine with a condition code and in which only
full-word operations are performed in registers.  Let us assume that we
can divide all insns into loads, stores, (integer) arithmetic
operations, floating point operations, and branches.

 Here we will concern ourselves with determining the effect of an insn
on the condition code and will limit ourselves to the following possible
effects:  The condition code can be set unpredictably (clobbered), not
be changed, be set to agree with the results of the operation, or only
changed if the item previously set into the condition code has been
modified.

 Here is part of a sample `md' file for such a machine:

     (define_attr "type" "load,store,arith,fp,branch" (const_string "arith"))

     (define_attr "cc" "clobber,unchanged,set,change0"
                  (cond [(eq_attr "type" "load")
                             (const_string "change0")
                         (eq_attr "type" "store,branch")
                             (const_string "unchanged")
                         (eq_attr "type" "arith")
                             (if_then_else (match_operand:SI 0 "" "")
                                           (const_string "set")
                                           (const_string "clobber"))]
                        (const_string "clobber")))

     (define_insn ""
       [(set (match_operand:SI 0 "general_operand" "=r,r,m")
             (match_operand:SI 1 "general_operand" "r,m,r"))]
       ""
       "@
        move %0,%1
        load %0,%1
        store %0,%1"
       [(set_attr "type" "arith,load,store")])

 Note that we assume in the above example that arithmetic operations
performed on quantities smaller than a machine word clobber the
condition code since they will set the condition code to a value
corresponding to the full-word result.


File: gccint.info,  Node: Insn Lengths,  Next: Constant Attributes,  Prev: Attr Example,  Up: Insn Attributes

16.19.5 Computing the Length of an Insn
---------------------------------------

For many machines, multiple types of branch instructions are provided,
each for different length branch displacements.  In most cases, the
assembler will choose the correct instruction to use.  However, when
the assembler cannot do so, GCC can when a special attribute, the
`length' attribute, is defined.  This attribute must be defined to have
numeric values by specifying a null string in its `define_attr'.

 In the case of the `length' attribute, two additional forms of
arithmetic terms are allowed in test expressions:

`(match_dup N)'
     This refers to the address of operand N of the current insn, which
     must be a `label_ref'.

`(pc)'
     This refers to the address of the _current_ insn.  It might have
     been more consistent with other usage to make this the address of
     the _next_ insn but this would be confusing because the length of
     the current insn is to be computed.

 For normal insns, the length will be determined by value of the
`length' attribute.  In the case of `addr_vec' and `addr_diff_vec' insn
patterns, the length is computed as the number of vectors multiplied by
the size of each vector.

 Lengths are measured in addressable storage units (bytes).

 The following macros can be used to refine the length computation:

`ADJUST_INSN_LENGTH (INSN, LENGTH)'
     If defined, modifies the length assigned to instruction INSN as a
     function of the context in which it is used.  LENGTH is an lvalue
     that contains the initially computed length of the insn and should
     be updated with the correct length of the insn.

     This macro will normally not be required.  A case in which it is
     required is the ROMP.  On this machine, the size of an `addr_vec'
     insn must be increased by two to compensate for the fact that
     alignment may be required.

 The routine that returns `get_attr_length' (the value of the `length'
attribute) can be used by the output routine to determine the form of
the branch instruction to be written, as the example below illustrates.

 As an example of the specification of variable-length branches,
consider the IBM 360.  If we adopt the convention that a register will
be set to the starting address of a function, we can jump to labels
within 4k of the start using a four-byte instruction.  Otherwise, we
need a six-byte sequence to load the address from memory and then
branch to it.

 On such a machine, a pattern for a branch instruction might be
specified as follows:

     (define_insn "jump"
       [(set (pc)
             (label_ref (match_operand 0 "" "")))]
       ""
     {
        return (get_attr_length (insn) == 4
                ? "b %l0" : "l r15,=a(%l0); br r15");
     }
       [(set (attr "length")
             (if_then_else (lt (match_dup 0) (const_int 4096))
                           (const_int 4)
                           (const_int 6)))])


File: gccint.info,  Node: Constant Attributes,  Next: Delay Slots,  Prev: Insn Lengths,  Up: Insn Attributes

16.19.6 Constant Attributes
---------------------------

A special form of `define_attr', where the expression for the default
value is a `const' expression, indicates an attribute that is constant
for a given run of the compiler.  Constant attributes may be used to
specify which variety of processor is used.  For example,

     (define_attr "cpu" "m88100,m88110,m88000"
      (const
       (cond [(symbol_ref "TARGET_88100") (const_string "m88100")
              (symbol_ref "TARGET_88110") (const_string "m88110")]
             (const_string "m88000"))))

     (define_attr "memory" "fast,slow"
      (const
       (if_then_else (symbol_ref "TARGET_FAST_MEM")
                     (const_string "fast")
                     (const_string "slow"))))

 The routine generated for constant attributes has no parameters as it
does not depend on any particular insn.  RTL expressions used to define
the value of a constant attribute may use the `symbol_ref' form, but
may not use either the `match_operand' form or `eq_attr' forms
involving insn attributes.


File: gccint.info,  Node: Delay Slots,  Next: Processor pipeline description,  Prev: Constant Attributes,  Up: Insn Attributes

16.19.7 Delay Slot Scheduling
-----------------------------

The insn attribute mechanism can be used to specify the requirements for
delay slots, if any, on a target machine.  An instruction is said to
require a "delay slot" if some instructions that are physically after
the instruction are executed as if they were located before it.
Classic examples are branch and call instructions, which often execute
the following instruction before the branch or call is performed.

 On some machines, conditional branch instructions can optionally
"annul" instructions in the delay slot.  This means that the
instruction will not be executed for certain branch outcomes.  Both
instructions that annul if the branch is true and instructions that
annul if the branch is false are supported.

 Delay slot scheduling differs from instruction scheduling in that
determining whether an instruction needs a delay slot is dependent only
on the type of instruction being generated, not on data flow between the
instructions.  See the next section for a discussion of data-dependent
instruction scheduling.

 The requirement of an insn needing one or more delay slots is indicated
via the `define_delay' expression.  It has the following form:

     (define_delay TEST
                   [DELAY-1 ANNUL-TRUE-1 ANNUL-FALSE-1
                    DELAY-2 ANNUL-TRUE-2 ANNUL-FALSE-2
                    ...])

 TEST is an attribute test that indicates whether this `define_delay'
applies to a particular insn.  If so, the number of required delay
slots is determined by the length of the vector specified as the second
argument.  An insn placed in delay slot N must satisfy attribute test
DELAY-N.  ANNUL-TRUE-N is an attribute test that specifies which insns
may be annulled if the branch is true.  Similarly, ANNUL-FALSE-N
specifies which insns in the delay slot may be annulled if the branch
is false.  If annulling is not supported for that delay slot, `(nil)'
should be coded.

 For example, in the common case where branch and call insns require a
single delay slot, which may contain any insn other than a branch or
call, the following would be placed in the `md' file:

     (define_delay (eq_attr "type" "branch,call")
                   [(eq_attr "type" "!branch,call") (nil) (nil)])

 Multiple `define_delay' expressions may be specified.  In this case,
each such expression specifies different delay slot requirements and
there must be no insn for which tests in two `define_delay' expressions
are both true.

 For example, if we have a machine that requires one delay slot for
branches but two for calls,  no delay slot can contain a branch or call
insn, and any valid insn in the delay slot for the branch can be
annulled if the branch is true, we might represent this as follows:

     (define_delay (eq_attr "type" "branch")
        [(eq_attr "type" "!branch,call")
         (eq_attr "type" "!branch,call")
         (nil)])

     (define_delay (eq_attr "type" "call")
                   [(eq_attr "type" "!branch,call") (nil) (nil)
                    (eq_attr "type" "!branch,call") (nil) (nil)])


File: gccint.info,  Node: Processor pipeline description,  Prev: Delay Slots,  Up: Insn Attributes

16.19.8 Specifying processor pipeline description
-------------------------------------------------

To achieve better performance, most modern processors (super-pipelined,
superscalar RISC, and VLIW processors) have many "functional units" on
which several instructions can be executed simultaneously.  An
instruction starts execution if its issue conditions are satisfied.  If
not, the instruction is stalled until its conditions are satisfied.
Such "interlock (pipeline) delay" causes interruption of the fetching
of successor instructions (or demands nop instructions, e.g. for some
MIPS processors).

 There are two major kinds of interlock delays in modern processors.
The first one is a data dependence delay determining "instruction
latency time".  The instruction execution is not started until all
source data have been evaluated by prior instructions (there are more
complex cases when the instruction execution starts even when the data
are not available but will be ready in given time after the instruction
execution start).  Taking the data dependence delays into account is
simple.  The data dependence (true, output, and anti-dependence) delay
between two instructions is given by a constant.  In most cases this
approach is adequate.  The second kind of interlock delays is a
reservation delay.  The reservation delay means that two instructions
under execution will be in need of shared processors resources, i.e.
buses, internal registers, and/or functional units, which are reserved
for some time.  Taking this kind of delay into account is complex
especially for modern RISC processors.

 The task of exploiting more processor parallelism is solved by an
instruction scheduler.  For a better solution to this problem, the
instruction scheduler has to have an adequate description of the
processor parallelism (or "pipeline description").  GCC machine
descriptions describe processor parallelism and functional unit
reservations for groups of instructions with the aid of "regular
expressions".

 The GCC instruction scheduler uses a "pipeline hazard recognizer" to
figure out the possibility of the instruction issue by the processor on
a given simulated processor cycle.  The pipeline hazard recognizer is
automatically generated from the processor pipeline description.  The
pipeline hazard recognizer generated from the machine description is
based on a deterministic finite state automaton (DFA): the instruction
issue is possible if there is a transition from one automaton state to
another one.  This algorithm is very fast, and furthermore, its speed
is not dependent on processor complexity(1).

 The rest of this section describes the directives that constitute an
automaton-based processor pipeline description.  The order of these
constructions within the machine description file is not important.

 The following optional construction describes names of automata
generated and used for the pipeline hazards recognition.  Sometimes the
generated finite state automaton used by the pipeline hazard recognizer
is large.  If we use more than one automaton and bind functional units
to the automata, the total size of the automata is usually less than
the size of the single automaton.  If there is no one such
construction, only one finite state automaton is generated.

     (define_automaton AUTOMATA-NAMES)

 AUTOMATA-NAMES is a string giving names of the automata.  The names
are separated by commas.  All the automata should have unique names.
The automaton name is used in the constructions `define_cpu_unit' and
`define_query_cpu_unit'.

 Each processor functional unit used in the description of instruction
reservations should be described by the following construction.

     (define_cpu_unit UNIT-NAMES [AUTOMATON-NAME])

 UNIT-NAMES is a string giving the names of the functional units
separated by commas.  Don't use name `nothing', it is reserved for
other goals.

 AUTOMATON-NAME is a string giving the name of the automaton with which
the unit is bound.  The automaton should be described in construction
`define_automaton'.  You should give "automaton-name", if there is a
defined automaton.

 The assignment of units to automata are constrained by the uses of the
units in insn reservations.  The most important constraint is: if a
unit reservation is present on a particular cycle of an alternative for
an insn reservation, then some unit from the same automaton must be
present on the same cycle for the other alternatives of the insn
reservation.  The rest of the constraints are mentioned in the
description of the subsequent constructions.

 The following construction describes CPU functional units analogously
to `define_cpu_unit'.  The reservation of such units can be queried for
an automaton state.  The instruction scheduler never queries
reservation of functional units for given automaton state.  So as a
rule, you don't need this construction.  This construction could be
used for future code generation goals (e.g. to generate VLIW insn
templates).

     (define_query_cpu_unit UNIT-NAMES [AUTOMATON-NAME])

 UNIT-NAMES is a string giving names of the functional units separated
by commas.

 AUTOMATON-NAME is a string giving the name of the automaton with which
the unit is bound.

 The following construction is the major one to describe pipeline
characteristics of an instruction.

     (define_insn_reservation INSN-NAME DEFAULT_LATENCY
                              CONDITION REGEXP)

 DEFAULT_LATENCY is a number giving latency time of the instruction.
There is an important difference between the old description and the
automaton based pipeline description.  The latency time is used for all
dependencies when we use the old description.  In the automaton based
pipeline description, the given latency time is only used for true
dependencies.  The cost of anti-dependencies is always zero and the
cost of output dependencies is the difference between latency times of
the producing and consuming insns (if the difference is negative, the
cost is considered to be zero).  You can always change the default
costs for any description by using the target hook
`TARGET_SCHED_ADJUST_COST' (*note Scheduling::).

 INSN-NAME is a string giving the internal name of the insn.  The
internal names are used in constructions `define_bypass' and in the
automaton description file generated for debugging.  The internal name
has nothing in common with the names in `define_insn'.  It is a good
practice to use insn classes described in the processor manual.

 CONDITION defines what RTL insns are described by this construction.
You should remember that you will be in trouble if CONDITION for two or
more different `define_insn_reservation' constructions is TRUE for an
insn.  In this case what reservation will be used for the insn is not
defined.  Such cases are not checked during generation of the pipeline
hazards recognizer because in general recognizing that two conditions
may have the same value is quite difficult (especially if the conditions
contain `symbol_ref').  It is also not checked during the pipeline
hazard recognizer work because it would slow down the recognizer
considerably.

 REGEXP is a string describing the reservation of the cpu's functional
units by the instruction.  The reservations are described by a regular
expression according to the following syntax:

            regexp = regexp "," oneof
                   | oneof

            oneof = oneof "|" allof
                  | allof

            allof = allof "+" repeat
                  | repeat

            repeat = element "*" number
                   | element

            element = cpu_function_unit_name
                    | reservation_name
                    | result_name
                    | "nothing"
                    | "(" regexp ")"

   * `,' is used for describing the start of the next cycle in the
     reservation.

   * `|' is used for describing a reservation described by the first
     regular expression *or* a reservation described by the second
     regular expression *or* etc.

   * `+' is used for describing a reservation described by the first
     regular expression *and* a reservation described by the second
     regular expression *and* etc.

   * `*' is used for convenience and simply means a sequence in which
     the regular expression are repeated NUMBER times with cycle
     advancing (see `,').

   * `cpu_function_unit_name' denotes reservation of the named
     functional unit.

   * `reservation_name' -- see description of construction
     `define_reservation'.

   * `nothing' denotes no unit reservations.

 Sometimes unit reservations for different insns contain common parts.
In such case, you can simplify the pipeline description by describing
the common part by the following construction

     (define_reservation RESERVATION-NAME REGEXP)

 RESERVATION-NAME is a string giving name of REGEXP.  Functional unit
names and reservation names are in the same name space.  So the
reservation names should be different from the functional unit names
and can not be the reserved name `nothing'.

 The following construction is used to describe exceptions in the
latency time for given instruction pair.  This is so called bypasses.

     (define_bypass NUMBER OUT_INSN_NAMES IN_INSN_NAMES
                    [GUARD])

 NUMBER defines when the result generated by the instructions given in
string OUT_INSN_NAMES will be ready for the instructions given in
string IN_INSN_NAMES.  Each of these strings is a comma-separated list
of filename-style globs and they refer to the names of
`define_insn_reservation's.  For example:
     (define_bypass 1 "cpu1_load_*, cpu1_store_*" "cpu1_load_*")
 defines a bypass between instructions that start with `cpu1_load_' or
`cpu1_store_' and those that start with `cpu1_load_'.

 GUARD is an optional string giving the name of a C function which
defines an additional guard for the bypass.  The function will get the
two insns as parameters.  If the function returns zero the bypass will
be ignored for this case.  The additional guard is necessary to
recognize complicated bypasses, e.g. when the consumer is only an
address of insn `store' (not a stored value).

 If there are more one bypass with the same output and input insns, the
chosen bypass is the first bypass with a guard in description whose
guard function returns nonzero.  If there is no such bypass, then
bypass without the guard function is chosen.

 The following five constructions are usually used to describe VLIW
processors, or more precisely, to describe a placement of small
instructions into VLIW instruction slots.  They can be used for RISC
processors, too.

     (exclusion_set UNIT-NAMES UNIT-NAMES)
     (presence_set UNIT-NAMES PATTERNS)
     (final_presence_set UNIT-NAMES PATTERNS)
     (absence_set UNIT-NAMES PATTERNS)
     (final_absence_set UNIT-NAMES PATTERNS)

 UNIT-NAMES is a string giving names of functional units separated by
commas.

 PATTERNS is a string giving patterns of functional units separated by
comma.  Currently pattern is one unit or units separated by
white-spaces.

 The first construction (`exclusion_set') means that each functional
unit in the first string can not be reserved simultaneously with a unit
whose name is in the second string and vice versa.  For example, the
construction is useful for describing processors (e.g. some SPARC
processors) with a fully pipelined floating point functional unit which
can execute simultaneously only single floating point insns or only
double floating point insns.

 The second construction (`presence_set') means that each functional
unit in the first string can not be reserved unless at least one of
pattern of units whose names are in the second string is reserved.
This is an asymmetric relation.  For example, it is useful for
description that VLIW `slot1' is reserved after `slot0' reservation.
We could describe it by the following construction

     (presence_set "slot1" "slot0")

 Or `slot1' is reserved only after `slot0' and unit `b0' reservation.
In this case we could write

     (presence_set "slot1" "slot0 b0")

 The third construction (`final_presence_set') is analogous to
`presence_set'.  The difference between them is when checking is done.
When an instruction is issued in given automaton state reflecting all
current and planned unit reservations, the automaton state is changed.
The first state is a source state, the second one is a result state.
Checking for `presence_set' is done on the source state reservation,
checking for `final_presence_set' is done on the result reservation.
This construction is useful to describe a reservation which is actually
two subsequent reservations.  For example, if we use

     (presence_set "slot1" "slot0")

 the following insn will be never issued (because `slot1' requires
`slot0' which is absent in the source state).

     (define_reservation "insn_and_nop" "slot0 + slot1")

 but it can be issued if we use analogous `final_presence_set'.

 The forth construction (`absence_set') means that each functional unit
in the first string can be reserved only if each pattern of units whose
names are in the second string is not reserved.  This is an asymmetric
relation (actually `exclusion_set' is analogous to this one but it is
symmetric).  For example it might be useful in a VLIW description to
say that `slot0' cannot be reserved after either `slot1' or `slot2'
have been reserved.  This can be described as:

     (absence_set "slot0" "slot1, slot2")

 Or `slot2' can not be reserved if `slot0' and unit `b0' are reserved
or `slot1' and unit `b1' are reserved.  In this case we could write

     (absence_set "slot2" "slot0 b0, slot1 b1")

 All functional units mentioned in a set should belong to the same
automaton.

 The last construction (`final_absence_set') is analogous to
`absence_set' but checking is done on the result (state) reservation.
See comments for `final_presence_set'.

 You can control the generator of the pipeline hazard recognizer with
the following construction.

     (automata_option OPTIONS)

 OPTIONS is a string giving options which affect the generated code.
Currently there are the following options:

   * "no-minimization" makes no minimization of the automaton.  This is
     only worth to do when we are debugging the description and need to
     look more accurately at reservations of states.

   * "time" means printing time statistics about the generation of
     automata.

   * "stats" means printing statistics about the generated automata
     such as the number of DFA states, NDFA states and arcs.

   * "v" means a generation of the file describing the result automata.
     The file has suffix `.dfa' and can be used for the description
     verification and debugging.

   * "w" means a generation of warning instead of error for
     non-critical errors.

   * "no-comb-vect" prevents the automaton generator from generating
     two data structures and comparing them for space efficiency.  Using
     a comb vector to represent transitions may be better, but it can be
     very expensive to construct.  This option is useful if the build
     process spends an unacceptably long time in genautomata.

   * "ndfa" makes nondeterministic finite state automata.  This affects
     the treatment of operator `|' in the regular expressions.  The
     usual treatment of the operator is to try the first alternative
     and, if the reservation is not possible, the second alternative.
     The nondeterministic treatment means trying all alternatives, some
     of them may be rejected by reservations in the subsequent insns.

   * "collapse-ndfa" modifies the behaviour of the generator when
     producing an automaton.  An additional state transition to
     collapse a nondeterministic NDFA state to a deterministic DFA
     state is generated.  It can be triggered by passing `const0_rtx' to
     state_transition.  In such an automaton, cycle advance transitions
     are available only for these collapsed states.  This option is
     useful for ports that want to use the `ndfa' option, but also want
     to use `define_query_cpu_unit' to assign units to insns issued in
     a cycle.

   * "progress" means output of a progress bar showing how many states
     were generated so far for automaton being processed.  This is
     useful during debugging a DFA description.  If you see too many
     generated states, you could interrupt the generator of the pipeline
     hazard recognizer and try to figure out a reason for generation of
     the huge automaton.

 As an example, consider a superscalar RISC machine which can issue
three insns (two integer insns and one floating point insn) on the
cycle but can finish only two insns.  To describe this, we define the
following functional units.

     (define_cpu_unit "i0_pipeline, i1_pipeline, f_pipeline")
     (define_cpu_unit "port0, port1")

 All simple integer insns can be executed in any integer pipeline and
their result is ready in two cycles.  The simple integer insns are
issued into the first pipeline unless it is reserved, otherwise they
are issued into the second pipeline.  Integer division and
multiplication insns can be executed only in the second integer
pipeline and their results are ready correspondingly in 8 and 4 cycles.
The integer division is not pipelined, i.e. the subsequent integer
division insn can not be issued until the current division insn
finished.  Floating point insns are fully pipelined and their results
are ready in 3 cycles.  Where the result of a floating point insn is
used by an integer insn, an additional delay of one cycle is incurred.
To describe all of this we could specify

     (define_cpu_unit "div")

     (define_insn_reservation "simple" 2 (eq_attr "type" "int")
                              "(i0_pipeline | i1_pipeline), (port0 | port1)")

     (define_insn_reservation "mult" 4 (eq_attr "type" "mult")
                              "i1_pipeline, nothing*2, (port0 | port1)")

     (define_insn_reservation "div" 8 (eq_attr "type" "div")
                              "i1_pipeline, div*7, div + (port0 | port1)")

     (define_insn_reservation "float" 3 (eq_attr "type" "float")
                              "f_pipeline, nothing, (port0 | port1))

     (define_bypass 4 "float" "simple,mult,div")

 To simplify the description we could describe the following reservation

     (define_reservation "finish" "port0|port1")

 and use it in all `define_insn_reservation' as in the following
construction

     (define_insn_reservation "simple" 2 (eq_attr "type" "int")
                              "(i0_pipeline | i1_pipeline), finish")

 ---------- Footnotes ----------

 (1) However, the size of the automaton depends on processor
complexity.  To limit this effect, machine descriptions can split
orthogonal parts of the machine description among several automata: but
then, since each of these must be stepped independently, this does
cause a small decrease in the algorithm's performance.


File: gccint.info,  Node: Conditional Execution,  Next: Define Subst,  Prev: Insn Attributes,  Up: Machine Desc

16.20 Conditional Execution
===========================

A number of architectures provide for some form of conditional
execution, or predication.  The hallmark of this feature is the ability
to nullify most of the instructions in the instruction set.  When the
instruction set is large and not entirely symmetric, it can be quite
tedious to describe these forms directly in the `.md' file.  An
alternative is the `define_cond_exec' template.

     (define_cond_exec
       [PREDICATE-PATTERN]
       "CONDITION"
       "OUTPUT-TEMPLATE")

 PREDICATE-PATTERN is the condition that must be true for the insn to
be executed at runtime and should match a relational operator.  One can
use `match_operator' to match several relational operators at once.
Any `match_operand' operands must have no more than one alternative.

 CONDITION is a C expression that must be true for the generated
pattern to match.

 OUTPUT-TEMPLATE is a string similar to the `define_insn' output
template (*note Output Template::), except that the `*' and `@' special
cases do not apply.  This is only useful if the assembly text for the
predicate is a simple prefix to the main insn.  In order to handle the
general case, there is a global variable `current_insn_predicate' that
will contain the entire predicate if the current insn is predicated,
and will otherwise be `NULL'.

 When `define_cond_exec' is used, an implicit reference to the
`predicable' instruction attribute is made.  *Note Insn Attributes::.
This attribute must be a boolean (i.e. have exactly two elements in its
LIST-OF-VALUES), with the possible values being `no' and `yes'.  The
default and all uses in the insns must be a simple constant, not a
complex expressions.  It may, however, depend on the alternative, by
using a comma-separated list of values.  If that is the case, the port
should also define an `enabled' attribute (*note Disable Insn
Alternatives::), which should also allow only `no' and `yes' as its
values.

 For each `define_insn' for which the `predicable' attribute is true, a
new `define_insn' pattern will be generated that matches a predicated
version of the instruction.  For example,

     (define_insn "addsi"
       [(set (match_operand:SI 0 "register_operand" "r")
             (plus:SI (match_operand:SI 1 "register_operand" "r")
                      (match_operand:SI 2 "register_operand" "r")))]
       "TEST1"
       "add %2,%1,%0")

     (define_cond_exec
       [(ne (match_operand:CC 0 "register_operand" "c")
            (const_int 0))]
       "TEST2"
       "(%0)")

generates a new pattern

     (define_insn ""
       [(cond_exec
          (ne (match_operand:CC 3 "register_operand" "c") (const_int 0))
          (set (match_operand:SI 0 "register_operand" "r")
               (plus:SI (match_operand:SI 1 "register_operand" "r")
                        (match_operand:SI 2 "register_operand" "r"))))]
       "(TEST2) && (TEST1)"
       "(%3) add %2,%1,%0")


File: gccint.info,  Node: Define Subst,  Next: Constant Definitions,  Prev: Conditional Execution,  Up: Machine Desc

16.21 RTL Templates Transformations
===================================

For some hardware architectures there are common cases when the RTL
templates for the instructions can be derived from the other RTL
templates using simple transformations.  E.g., `i386.md' contains an
RTL template for the ordinary `sub' instruction-- `*subsi_1', and for
the `sub' instruction with subsequent zero-extension--`*subsi_1_zext'.
Such cases can be easily implemented by a single meta-template capable
of generating a modified case based on the initial one:

     (define_subst "NAME"
       [INPUT-TEMPLATE]
       "CONDITION"
       [OUTPUT-TEMPLATE])
 INPUT-TEMPLATE is a pattern describing the source RTL template, which
will be transformed.

 CONDITION is a C expression that is conjunct with the condition from
the input-template to generate a condition to be used in the
output-template.

 OUTPUT-TEMPLATE is a pattern that will be used in the resulting
template.

 `define_subst' mechanism is tightly coupled with the notion of the
subst attribute (*note Subst Iterators::).  The use of `define_subst'
is triggered by a reference to a subst attribute in the transforming
RTL template.  This reference initiates duplication of the source RTL
template and substitution of the attributes with their values.  The
source RTL template is left unchanged, while the copy is transformed by
`define_subst'.  This transformation can fail in the case when the
source RTL template is not matched against the input-template of the
`define_subst'.  In such case the copy is deleted.

 `define_subst' can be used only in `define_insn' and `define_expand',
it cannot be used in other expressions (e.g. in
`define_insn_and_split').

* Menu:

* Define Subst Example::	    Example of `define_subst' work.
* Define Subst Pattern Matching::   Process of template comparison.
* Define Subst Output Template::    Generation of output template.


File: gccint.info,  Node: Define Subst Example,  Next: Define Subst Pattern Matching,  Up: Define Subst

16.21.1 `define_subst' Example
------------------------------

To illustrate how `define_subst' works, let us examine a simple
template transformation.

 Suppose there are two kinds of instructions: one that touches flags and
the other that does not.  The instructions of the second type could be
generated with the following `define_subst':

     (define_subst "add_clobber_subst"
       [(set (match_operand:SI 0 "" "")
             (match_operand:SI 1 "" ""))]
       ""
       [(set (match_dup 0)
             (match_dup 1))
        (clobber (reg:CC FLAGS_REG))]

 This `define_subst' can be applied to any RTL pattern containing `set'
of mode SI and generates a copy with clobber when it is applied.

 Assume there is an RTL template for a `max' instruction to be used in
`define_subst' mentioned above:

     (define_insn "maxsi"
       [(set (match_operand:SI 0 "register_operand" "=r")
             (max:SI
               (match_operand:SI 1 "register_operand" "r")
               (match_operand:SI 2 "register_operand" "r")))]
       ""
       "max\t{%2, %1, %0|%0, %1, %2}"
      [...])

 To mark the RTL template for `define_subst' application,
subst-attributes are used.  They should be declared in advance:

     (define_subst_attr "add_clobber_name" "add_clobber_subst" "_noclobber" "_clobber")

 Here `add_clobber_name' is the attribute name, `add_clobber_subst' is
the name of the corresponding `define_subst', the third argument
(`_noclobber') is the attribute value that would be substituted into
the unchanged version of the source RTL template, and the last argument
(`_clobber') is the value that would be substituted into the second,
transformed, version of the RTL template.

 Once the subst-attribute has been defined, it should be used in RTL
templates which need to be processed by the `define_subst'.  So, the
original RTL template should be changed:

     (define_insn "maxsi<add_clobber_name>"
       [(set (match_operand:SI 0 "register_operand" "=r")
             (max:SI
               (match_operand:SI 1 "register_operand" "r")
               (match_operand:SI 2 "register_operand" "r")))]
       ""
       "max\t{%2, %1, %0|%0, %1, %2}"
      [...])

 The result of the `define_subst' usage would look like the following:

     (define_insn "maxsi_noclobber"
       [(set (match_operand:SI 0 "register_operand" "=r")
             (max:SI
               (match_operand:SI 1 "register_operand" "r")
               (match_operand:SI 2 "register_operand" "r")))]
       ""
       "max\t{%2, %1, %0|%0, %1, %2}"
      [...])
     (define_insn "maxsi_clobber"
       [(set (match_operand:SI 0 "register_operand" "=r")
             (max:SI
               (match_operand:SI 1 "register_operand" "r")
               (match_operand:SI 2 "register_operand" "r")))
        (clobber (reg:CC FLAGS_REG))]
       ""
       "max\t{%2, %1, %0|%0, %1, %2}"
      [...])


File: gccint.info,  Node: Define Subst Pattern Matching,  Next: Define Subst Output Template,  Prev: Define Subst Example,  Up: Define Subst

16.21.2 Pattern Matching in `define_subst'
------------------------------------------

All expressions, allowed in `define_insn' or `define_expand', are
allowed in the input-template of `define_subst', except
`match_par_dup', `match_scratch', `match_parallel'. The meanings of
expressions in the input-template were changed:

 `match_operand' matches any expression (possibly, a subtree in
RTL-template), if modes of the `match_operand' and this expression are
the same, or mode of the `match_operand' is `VOIDmode', or this
expression is `match_dup', `match_op_dup'.  If the expression is
`match_operand' too, and predicate of `match_operand' from the input
pattern is not empty, then the predicates are compared.  That can be
used for more accurate filtering of accepted RTL-templates.

 `match_operator' matches common operators (like `plus', `minus'),
`unspec', `unspec_volatile' operators and `match_operator's from the
original pattern if the modes match and `match_operator' from the input
pattern has the same number of operands as the operator from the
original pattern.


File: gccint.info,  Node: Define Subst Output Template,  Prev: Define Subst Pattern Matching,  Up: Define Subst

16.21.3 Generation of output template in `define_subst'
-------------------------------------------------------

If all necessary checks for `define_subst' application pass, a new
RTL-pattern, based on the output-template, is created to replace the old
template.  Like in input-patterns, meanings of some RTL expressions are
changed when they are used in output-patterns of a `define_subst'.
Thus, `match_dup' is used for copying the whole expression from the
original pattern, which matched corresponding `match_operand' from the
input pattern.

 `match_dup N' is used in the output template to be replaced with the
expression from the original pattern, which matched `match_operand N'
from the input pattern.  As a consequence, `match_dup' cannot be used
to point to `match_operand's from the output pattern, it should always
refer to a `match_operand' from the input pattern.

 In the output template one can refer to the expressions from the
original pattern and create new ones.  For instance, some operands could
be added by means of standard `match_operand'.

 After replacing `match_dup' with some RTL-subtree from the original
pattern, it could happen that several `match_operand's in the output
pattern have the same indexes.  It is unknown, how many and what
indexes would be used in the expression which would replace
`match_dup', so such conflicts in indexes are inevitable.  To overcome
this issue, `match_operands' and `match_operators', which were
introduced into the output pattern, are renumerated when all
`match_dup's are replaced.

 Number of alternatives in `match_operand's introduced into the output
template `M' could differ from the number of alternatives in the
original pattern `N', so in the resultant pattern there would be `N*M'
alternatives.  Thus, constraints from the original pattern would be
duplicated `N' times, constraints from the output pattern would be
duplicated `M' times, producing all possible combinations.


File: gccint.info,  Node: Constant Definitions,  Next: Iterators,  Prev: Define Subst,  Up: Machine Desc

16.22 Constant Definitions
==========================

Using literal constants inside instruction patterns reduces legibility
and can be a maintenance problem.

 To overcome this problem, you may use the `define_constants'
expression.  It contains a vector of name-value pairs.  From that point
on, wherever any of the names appears in the MD file, it is as if the
corresponding value had been written instead.  You may use
`define_constants' multiple times; each appearance adds more constants
to the table.  It is an error to redefine a constant with a different
value.

 To come back to the a29k load multiple example, instead of

     (define_insn ""
       [(match_parallel 0 "load_multiple_operation"
          [(set (match_operand:SI 1 "gpc_reg_operand" "=r")
                (match_operand:SI 2 "memory_operand" "m"))
           (use (reg:SI 179))
           (clobber (reg:SI 179))])]
       ""
       "loadm 0,0,%1,%2")

 You could write:

     (define_constants [
         (R_BP 177)
         (R_FC 178)
         (R_CR 179)
         (R_Q  180)
     ])

     (define_insn ""
       [(match_parallel 0 "load_multiple_operation"
          [(set (match_operand:SI 1 "gpc_reg_operand" "=r")
                (match_operand:SI 2 "memory_operand" "m"))
           (use (reg:SI R_CR))
           (clobber (reg:SI R_CR))])]
       ""
       "loadm 0,0,%1,%2")

 The constants that are defined with a define_constant are also output
in the insn-codes.h header file as #defines.

 You can also use the machine description file to define enumerations.
Like the constants defined by `define_constant', these enumerations are
visible to both the machine description file and the main C code.

 The syntax is as follows:

     (define_c_enum "NAME" [
       VALUE0
       VALUE1
       ...
       VALUEN
     ])

 This definition causes the equivalent of the following C code to appear
in `insn-constants.h':

     enum NAME {
       VALUE0 = 0,
       VALUE1 = 1,
       ...
       VALUEN = N
     };
     #define NUM_CNAME_VALUES (N + 1)

 where CNAME is the capitalized form of NAME.  It also makes each
VALUEI available in the machine description file, just as if it had
been declared with:

     (define_constants [(VALUEI I)])

 Each VALUEI is usually an upper-case identifier and usually begins
with CNAME.

 You can split the enumeration definition into as many statements as
you like.  The above example is directly equivalent to:

     (define_c_enum "NAME" [VALUE0])
     (define_c_enum "NAME" [VALUE1])
     ...
     (define_c_enum "NAME" [VALUEN])

 Splitting the enumeration helps to improve the modularity of each
individual `.md' file.  For example, if a port defines its
synchronization instructions in a separate `sync.md' file, it is
convenient to define all synchronization-specific enumeration values in
`sync.md' rather than in the main `.md' file.

 Some enumeration names have special significance to GCC:

`unspecv'
     If an enumeration called `unspecv' is defined, GCC will use it
     when printing out `unspec_volatile' expressions.  For example:

          (define_c_enum "unspecv" [
            UNSPECV_BLOCKAGE
          ])

     causes GCC to print `(unspec_volatile ... 0)' as:

          (unspec_volatile ... UNSPECV_BLOCKAGE)

`unspec'
     If an enumeration called `unspec' is defined, GCC will use it when
     printing out `unspec' expressions.  GCC will also use it when
     printing out `unspec_volatile' expressions unless an `unspecv'
     enumeration is also defined.  You can therefore decide whether to
     keep separate enumerations for volatile and non-volatile
     expressions or whether to use the same enumeration for both.

 Another way of defining an enumeration is to use `define_enum':

     (define_enum "NAME" [
       VALUE0
       VALUE1
       ...
       VALUEN
     ])

 This directive implies:

     (define_c_enum "NAME" [
       CNAME_CVALUE0
       CNAME_CVALUE1
       ...
       CNAME_CVALUEN
     ])

 where CVALUEI is the capitalized form of VALUEI.  However, unlike
`define_c_enum', the enumerations defined by `define_enum' can be used
in attribute specifications (*note define_enum_attr::).


File: gccint.info,  Node: Iterators,  Prev: Constant Definitions,  Up: Machine Desc

16.23 Iterators
===============

Ports often need to define similar patterns for more than one machine
mode or for more than one rtx code.  GCC provides some simple iterator
facilities to make this process easier.

* Menu:

* Mode Iterators::         Generating variations of patterns for different modes.
* Code Iterators::         Doing the same for codes.
* Int Iterators::          Doing the same for integers.
* Subst Iterators::	   Generating variations of patterns for define_subst.


File: gccint.info,  Node: Mode Iterators,  Next: Code Iterators,  Up: Iterators

16.23.1 Mode Iterators
----------------------

Ports often need to define similar patterns for two or more different
modes.  For example:

   * If a processor has hardware support for both single and double
     floating-point arithmetic, the `SFmode' patterns tend to be very
     similar to the `DFmode' ones.

   * If a port uses `SImode' pointers in one configuration and `DImode'
     pointers in another, it will usually have very similar `SImode'
     and `DImode' patterns for manipulating pointers.

 Mode iterators allow several patterns to be instantiated from one
`.md' file template.  They can be used with any type of rtx-based
construct, such as a `define_insn', `define_split', or
`define_peephole2'.

* Menu:

* Defining Mode Iterators:: Defining a new mode iterator.
* Substitutions::           Combining mode iterators with substitutions
* Examples::                Examples


File: gccint.info,  Node: Defining Mode Iterators,  Next: Substitutions,  Up: Mode Iterators

16.23.1.1 Defining Mode Iterators
.................................

The syntax for defining a mode iterator is:

     (define_mode_iterator NAME [(MODE1 "COND1") ... (MODEN "CONDN")])

 This allows subsequent `.md' file constructs to use the mode suffix
`:NAME'.  Every construct that does so will be expanded N times, once
with every use of `:NAME' replaced by `:MODE1', once with every use
replaced by `:MODE2', and so on.  In the expansion for a particular
MODEI, every C condition will also require that CONDI be true.

 For example:

     (define_mode_iterator P [(SI "Pmode == SImode") (DI "Pmode == DImode")])

 defines a new mode suffix `:P'.  Every construct that uses `:P' will
be expanded twice, once with every `:P' replaced by `:SI' and once with
every `:P' replaced by `:DI'.  The `:SI' version will only apply if
`Pmode == SImode' and the `:DI' version will only apply if `Pmode ==
DImode'.

 As with other `.md' conditions, an empty string is treated as "always
true".  `(MODE "")' can also be abbreviated to `MODE'.  For example:

     (define_mode_iterator GPR [SI (DI "TARGET_64BIT")])

 means that the `:DI' expansion only applies if `TARGET_64BIT' but that
the `:SI' expansion has no such constraint.

 Iterators are applied in the order they are defined.  This can be
significant if two iterators are used in a construct that requires
substitutions.  *Note Substitutions::.


File: gccint.info,  Node: Substitutions,  Next: Examples,  Prev: Defining Mode Iterators,  Up: Mode Iterators

16.23.1.2 Substitution in Mode Iterators
........................................

If an `.md' file construct uses mode iterators, each version of the
construct will often need slightly different strings or modes.  For
example:

   * When a `define_expand' defines several `addM3' patterns (*note
     Standard Names::), each expander will need to use the appropriate
     mode name for M.

   * When a `define_insn' defines several instruction patterns, each
     instruction will often use a different assembler mnemonic.

   * When a `define_insn' requires operands with different modes, using
     an iterator for one of the operand modes usually requires a
     specific mode for the other operand(s).

 GCC supports such variations through a system of "mode attributes".
There are two standard attributes: `mode', which is the name of the
mode in lower case, and `MODE', which is the same thing in upper case.
You can define other attributes using:

     (define_mode_attr NAME [(MODE1 "VALUE1") ... (MODEN "VALUEN")])

 where NAME is the name of the attribute and VALUEI is the value
associated with MODEI.

 When GCC replaces some :ITERATOR with :MODE, it will scan each string
and mode in the pattern for sequences of the form `<ITERATOR:ATTR>',
where ATTR is the name of a mode attribute.  If the attribute is
defined for MODE, the whole `<...>' sequence will be replaced by the
appropriate attribute value.

 For example, suppose an `.md' file has:

     (define_mode_iterator P [(SI "Pmode == SImode") (DI "Pmode == DImode")])
     (define_mode_attr load [(SI "lw") (DI "ld")])

 If one of the patterns that uses `:P' contains the string
`"<P:load>\t%0,%1"', the `SI' version of that pattern will use
`"lw\t%0,%1"' and the `DI' version will use `"ld\t%0,%1"'.

 Here is an example of using an attribute for a mode:

     (define_mode_iterator LONG [SI DI])
     (define_mode_attr SHORT [(SI "HI") (DI "SI")])
     (define_insn ...
       (sign_extend:LONG (match_operand:<LONG:SHORT> ...)) ...)

 The `ITERATOR:' prefix may be omitted, in which case the substitution
will be attempted for every iterator expansion.


File: gccint.info,  Node: Examples,  Prev: Substitutions,  Up: Mode Iterators

16.23.1.3 Mode Iterator Examples
................................

Here is an example from the MIPS port.  It defines the following modes
and attributes (among others):

     (define_mode_iterator GPR [SI (DI "TARGET_64BIT")])
     (define_mode_attr d [(SI "") (DI "d")])

 and uses the following template to define both `subsi3' and `subdi3':

     (define_insn "sub<mode>3"
       [(set (match_operand:GPR 0 "register_operand" "=d")
             (minus:GPR (match_operand:GPR 1 "register_operand" "d")
                        (match_operand:GPR 2 "register_operand" "d")))]
       ""
       "<d>subu\t%0,%1,%2"
       [(set_attr "type" "arith")
        (set_attr "mode" "<MODE>")])

 This is exactly equivalent to:

     (define_insn "subsi3"
       [(set (match_operand:SI 0 "register_operand" "=d")
             (minus:SI (match_operand:SI 1 "register_operand" "d")
                       (match_operand:SI 2 "register_operand" "d")))]
       ""
       "subu\t%0,%1,%2"
       [(set_attr "type" "arith")
        (set_attr "mode" "SI")])

     (define_insn "subdi3"
       [(set (match_operand:DI 0 "register_operand" "=d")
             (minus:DI (match_operand:DI 1 "register_operand" "d")
                       (match_operand:DI 2 "register_operand" "d")))]
       ""
       "dsubu\t%0,%1,%2"
       [(set_attr "type" "arith")
        (set_attr "mode" "DI")])


File: gccint.info,  Node: Code Iterators,  Next: Int Iterators,  Prev: Mode Iterators,  Up: Iterators

16.23.2 Code Iterators
----------------------

Code iterators operate in a similar way to mode iterators.  *Note Mode
Iterators::.

 The construct:

     (define_code_iterator NAME [(CODE1 "COND1") ... (CODEN "CONDN")])

 defines a pseudo rtx code NAME that can be instantiated as CODEI if
condition CONDI is true.  Each CODEI must have the same rtx format.
*Note RTL Classes::.

 As with mode iterators, each pattern that uses NAME will be expanded N
times, once with all uses of NAME replaced by CODE1, once with all uses
replaced by CODE2, and so on.  *Note Defining Mode Iterators::.

 It is possible to define attributes for codes as well as for modes.
There are two standard code attributes: `code', the name of the code in
lower case, and `CODE', the name of the code in upper case.  Other
attributes are defined using:

     (define_code_attr NAME [(CODE1 "VALUE1") ... (CODEN "VALUEN")])

 Here's an example of code iterators in action, taken from the MIPS
port:

     (define_code_iterator any_cond [unordered ordered unlt unge uneq ltgt unle ungt
                                     eq ne gt ge lt le gtu geu ltu leu])

     (define_expand "b<code>"
       [(set (pc)
             (if_then_else (any_cond:CC (cc0)
                                        (const_int 0))
                           (label_ref (match_operand 0 ""))
                           (pc)))]
       ""
     {
       gen_conditional_branch (operands, <CODE>);
       DONE;
     })

 This is equivalent to:

     (define_expand "bunordered"
       [(set (pc)
             (if_then_else (unordered:CC (cc0)
                                         (const_int 0))
                           (label_ref (match_operand 0 ""))
                           (pc)))]
       ""
     {
       gen_conditional_branch (operands, UNORDERED);
       DONE;
     })

     (define_expand "bordered"
       [(set (pc)
             (if_then_else (ordered:CC (cc0)
                                       (const_int 0))
                           (label_ref (match_operand 0 ""))
                           (pc)))]
       ""
     {
       gen_conditional_branch (operands, ORDERED);
       DONE;
     })

     ...


File: gccint.info,  Node: Int Iterators,  Next: Subst Iterators,  Prev: Code Iterators,  Up: Iterators

16.23.3 Int Iterators
---------------------

Int iterators operate in a similar way to code iterators.  *Note Code
Iterators::.

 The construct:

     (define_int_iterator NAME [(INT1 "COND1") ... (INTN "CONDN")])

 defines a pseudo integer constant NAME that can be instantiated as
INTI if condition CONDI is true.  Each INT must have the same rtx
format.  *Note RTL Classes::. Int iterators can appear in only those
rtx fields that have 'i' as the specifier. This means that each INT has
to be a constant defined using define_constant or define_c_enum.

 As with mode and code iterators, each pattern that uses NAME will be
expanded N times, once with all uses of NAME replaced by INT1, once
with all uses replaced by INT2, and so on.  *Note Defining Mode
Iterators::.

 It is possible to define attributes for ints as well as for codes and
modes.  Attributes are defined using:

     (define_int_attr NAME [(INT1 "VALUE1") ... (INTN "VALUEN")])

 Here's an example of int iterators in action, taken from the ARM port:

     (define_int_iterator QABSNEG [UNSPEC_VQABS UNSPEC_VQNEG])

     (define_int_attr absneg [(UNSPEC_VQABS "abs") (UNSPEC_VQNEG "neg")])

     (define_insn "neon_vq<absneg><mode>"
       [(set (match_operand:VDQIW 0 "s_register_operand" "=w")
     	(unspec:VDQIW [(match_operand:VDQIW 1 "s_register_operand" "w")
     		       (match_operand:SI 2 "immediate_operand" "i")]
     		      QABSNEG))]
       "TARGET_NEON"
       "vq<absneg>.<V_s_elem>\t%<V_reg>0, %<V_reg>1"
       [(set_attr "neon_type" "neon_vqneg_vqabs")]
     )

 This is equivalent to:

     (define_insn "neon_vqabs<mode>"
       [(set (match_operand:VDQIW 0 "s_register_operand" "=w")
     	(unspec:VDQIW [(match_operand:VDQIW 1 "s_register_operand" "w")
     		       (match_operand:SI 2 "immediate_operand" "i")]
     		      UNSPEC_VQABS))]
       "TARGET_NEON"
       "vqabs.<V_s_elem>\t%<V_reg>0, %<V_reg>1"
       [(set_attr "neon_type" "neon_vqneg_vqabs")]
     )

     (define_insn "neon_vqneg<mode>"
       [(set (match_operand:VDQIW 0 "s_register_operand" "=w")
     	(unspec:VDQIW [(match_operand:VDQIW 1 "s_register_operand" "w")
     		       (match_operand:SI 2 "immediate_operand" "i")]
     		      UNSPEC_VQNEG))]
       "TARGET_NEON"
       "vqneg.<V_s_elem>\t%<V_reg>0, %<V_reg>1"
       [(set_attr "neon_type" "neon_vqneg_vqabs")]
     )


File: gccint.info,  Node: Subst Iterators,  Prev: Int Iterators,  Up: Iterators

16.23.4 Subst Iterators
-----------------------

Subst iterators are special type of iterators with the following
restrictions: they could not be declared explicitly, they always have
only two values, and they do not have explicit dedicated name.
Subst-iterators are triggered only when corresponding subst-attribute is
used in RTL-pattern.

 Subst iterators transform templates in the following way: the templates
are duplicated, the subst-attributes in these templates are replaced
with the corresponding values, and a new attribute is implicitly added
to the given `define_insn'/`define_expand'.  The name of the added
attribute matches the name of `define_subst'.  Such attributes are
declared implicitly, and it is not allowed to have a `define_attr'
named as a `define_subst'.

 Each subst iterator is linked to a `define_subst'.  It is declared
implicitly by the first appearance of the corresponding
`define_subst_attr', and it is not allowed to define it explicitly.

 Declarations of subst-attributes have the following syntax:

     (define_subst_attr "NAME"
       "SUBST-NAME"
       "NO-SUBST-VALUE"
       "SUBST-APPLIED-VALUE")

 NAME is a string with which the given subst-attribute could be
referred to.

 SUBST-NAME shows which `define_subst' should be applied to an
RTL-template if the given subst-attribute is present in the
RTL-template.

 NO-SUBST-VALUE is a value with which subst-attribute would be replaced
in the first copy of the original RTL-template.

 SUBST-APPLIED-VALUE is a value with which subst-attribute would be
replaced in the second copy of the original RTL-template.


File: gccint.info,  Node: Target Macros,  Next: Host Config,  Prev: Machine Desc,  Up: Top

17 Target Description Macros and Functions
******************************************

In addition to the file `MACHINE.md', a machine description includes a
C header file conventionally given the name `MACHINE.h' and a C source
file named `MACHINE.c'.  The header file defines numerous macros that
convey the information about the target machine that does not fit into
the scheme of the `.md' file.  The file `tm.h' should be a link to
`MACHINE.h'.  The header file `config.h' includes `tm.h' and most
compiler source files include `config.h'.  The source file defines a
variable `targetm', which is a structure containing pointers to
functions and data relating to the target machine.  `MACHINE.c' should
also contain their definitions, if they are not defined elsewhere in
GCC, and other functions called through the macros defined in the `.h'
file.

* Menu:

* Target Structure::    The `targetm' variable.
* Driver::              Controlling how the driver runs the compilation passes.
* Run-time Target::     Defining `-m' options like `-m68000' and `-m68020'.
* Per-Function Data::   Defining data structures for per-function information.
* Storage Layout::      Defining sizes and alignments of data.
* Type Layout::         Defining sizes and properties of basic user data types.
* Registers::           Naming and describing the hardware registers.
* Register Classes::    Defining the classes of hardware registers.
* Old Constraints::     The old way to define machine-specific constraints.
* Stack and Calling::   Defining which way the stack grows and by how much.
* Varargs::             Defining the varargs macros.
* Trampolines::         Code set up at run time to enter a nested function.
* Library Calls::       Controlling how library routines are implicitly called.
* Addressing Modes::    Defining addressing modes valid for memory operands.
* Anchored Addresses::  Defining how `-fsection-anchors' should work.
* Condition Code::      Defining how insns update the condition code.
* Costs::               Defining relative costs of different operations.
* Scheduling::          Adjusting the behavior of the instruction scheduler.
* Sections::            Dividing storage into text, data, and other sections.
* PIC::                 Macros for position independent code.
* Assembler Format::    Defining how to write insns and pseudo-ops to output.
* Debugging Info::      Defining the format of debugging output.
* Floating Point::      Handling floating point for cross-compilers.
* Mode Switching::      Insertion of mode-switching instructions.
* Target Attributes::   Defining target-specific uses of `__attribute__'.
* Emulated TLS::        Emulated TLS support.
* MIPS Coprocessors::   MIPS coprocessor support and how to customize it.
* PCH Target::          Validity checking for precompiled headers.
* C++ ABI::             Controlling C++ ABI changes.
* Named Address Spaces:: Adding support for named address spaces
* Misc::                Everything else.


File: gccint.info,  Node: Target Structure,  Next: Driver,  Up: Target Macros

17.1 The Global `targetm' Variable
==================================

 -- Variable: struct gcc_target targetm
     The target `.c' file must define the global `targetm' variable
     which contains pointers to functions and data relating to the
     target machine.  The variable is declared in `target.h';
     `target-def.h' defines the macro `TARGET_INITIALIZER' which is
     used to initialize the variable, and macros for the default
     initializers for elements of the structure.  The `.c' file should
     override those macros for which the default definition is
     inappropriate.  For example:
          #include "target.h"
          #include "target-def.h"

          /* Initialize the GCC target structure.  */

          #undef TARGET_COMP_TYPE_ATTRIBUTES
          #define TARGET_COMP_TYPE_ATTRIBUTES MACHINE_comp_type_attributes

          struct gcc_target targetm = TARGET_INITIALIZER;

Where a macro should be defined in the `.c' file in this manner to form
part of the `targetm' structure, it is documented below as a "Target
Hook" with a prototype.  Many macros will change in future from being
defined in the `.h' file to being part of the `targetm' structure.

 Similarly, there is a `targetcm' variable for hooks that are specific
to front ends for C-family languages, documented as "C Target Hook".
This is declared in `c-family/c-target.h', the initializer
`TARGETCM_INITIALIZER' in `c-family/c-target-def.h'.  If targets
initialize `targetcm' themselves, they should set
`target_has_targetcm=yes' in `config.gcc'; otherwise a default
definition is used.

 Similarly, there is a `targetm_common' variable for hooks that are
shared between the compiler driver and the compilers proper, documented
as "Common Target Hook".  This is declared in `common/common-target.h',
the initializer `TARGETM_COMMON_INITIALIZER' in
`common/common-target-def.h'.  If targets initialize `targetm_common'
themselves, they should set `target_has_targetm_common=yes' in
`config.gcc'; otherwise a default definition is used.


File: gccint.info,  Node: Driver,  Next: Run-time Target,  Prev: Target Structure,  Up: Target Macros

17.2 Controlling the Compilation Driver, `gcc'
==============================================

You can control the compilation driver.

 -- Macro: DRIVER_SELF_SPECS
     A list of specs for the driver itself.  It should be a suitable
     initializer for an array of strings, with no surrounding braces.

     The driver applies these specs to its own command line between
     loading default `specs' files (but not command-line specified
     ones) and choosing the multilib directory or running any
     subcommands.  It applies them in the order given, so each spec can
     depend on the options added by earlier ones.  It is also possible
     to remove options using `%<OPTION' in the usual way.

     This macro can be useful when a port has several interdependent
     target options.  It provides a way of standardizing the command
     line so that the other specs are easier to write.

     Do not define this macro if it does not need to do anything.

 -- Macro: OPTION_DEFAULT_SPECS
     A list of specs used to support configure-time default options
     (i.e.  `--with' options) in the driver.  It should be a suitable
     initializer for an array of structures, each containing two
     strings, without the outermost pair of surrounding braces.

     The first item in the pair is the name of the default.  This must
     match the code in `config.gcc' for the target.  The second item is
     a spec to apply if a default with this name was specified.  The
     string `%(VALUE)' in the spec will be replaced by the value of the
     default everywhere it occurs.

     The driver will apply these specs to its own command line between
     loading default `specs' files and processing `DRIVER_SELF_SPECS',
     using the same mechanism as `DRIVER_SELF_SPECS'.

     Do not define this macro if it does not need to do anything.

 -- Macro: CPP_SPEC
     A C string constant that tells the GCC driver program options to
     pass to CPP.  It can also specify how to translate options you
     give to GCC into options for GCC to pass to the CPP.

     Do not define this macro if it does not need to do anything.

 -- Macro: CPLUSPLUS_CPP_SPEC
     This macro is just like `CPP_SPEC', but is used for C++, rather
     than C.  If you do not define this macro, then the value of
     `CPP_SPEC' (if any) will be used instead.

 -- Macro: CC1_SPEC
     A C string constant that tells the GCC driver program options to
     pass to `cc1', `cc1plus', `f771', and the other language front
     ends.  It can also specify how to translate options you give to
     GCC into options for GCC to pass to front ends.

     Do not define this macro if it does not need to do anything.

 -- Macro: CC1PLUS_SPEC
     A C string constant that tells the GCC driver program options to
     pass to `cc1plus'.  It can also specify how to translate options
     you give to GCC into options for GCC to pass to the `cc1plus'.

     Do not define this macro if it does not need to do anything.  Note
     that everything defined in CC1_SPEC is already passed to `cc1plus'
     so there is no need to duplicate the contents of CC1_SPEC in
     CC1PLUS_SPEC.

 -- Macro: ASM_SPEC
     A C string constant that tells the GCC driver program options to
     pass to the assembler.  It can also specify how to translate
     options you give to GCC into options for GCC to pass to the
     assembler.  See the file `sun3.h' for an example of this.

     Do not define this macro if it does not need to do anything.

 -- Macro: ASM_FINAL_SPEC
     A C string constant that tells the GCC driver program how to run
     any programs which cleanup after the normal assembler.  Normally,
     this is not needed.  See the file `mips.h' for an example of this.

     Do not define this macro if it does not need to do anything.

 -- Macro: AS_NEEDS_DASH_FOR_PIPED_INPUT
     Define this macro, with no value, if the driver should give the
     assembler an argument consisting of a single dash, `-', to
     instruct it to read from its standard input (which will be a pipe
     connected to the output of the compiler proper).  This argument is
     given after any `-o' option specifying the name of the output file.

     If you do not define this macro, the assembler is assumed to read
     its standard input if given no non-option arguments.  If your
     assembler cannot read standard input at all, use a `%{pipe:%e}'
     construct; see `mips.h' for instance.

 -- Macro: LINK_SPEC
     A C string constant that tells the GCC driver program options to
     pass to the linker.  It can also specify how to translate options
     you give to GCC into options for GCC to pass to the linker.

     Do not define this macro if it does not need to do anything.

 -- Macro: LIB_SPEC
     Another C string constant used much like `LINK_SPEC'.  The
     difference between the two is that `LIB_SPEC' is used at the end
     of the command given to the linker.

     If this macro is not defined, a default is provided that loads the
     standard C library from the usual place.  See `gcc.c'.

 -- Macro: LIBGCC_SPEC
     Another C string constant that tells the GCC driver program how
     and when to place a reference to `libgcc.a' into the linker
     command line.  This constant is placed both before and after the
     value of `LIB_SPEC'.

     If this macro is not defined, the GCC driver provides a default
     that passes the string `-lgcc' to the linker.

 -- Macro: REAL_LIBGCC_SPEC
     By default, if `ENABLE_SHARED_LIBGCC' is defined, the
     `LIBGCC_SPEC' is not directly used by the driver program but is
     instead modified to refer to different versions of `libgcc.a'
     depending on the values of the command line flags `-static',
     `-shared', `-static-libgcc', and `-shared-libgcc'.  On targets
     where these modifications are inappropriate, define
     `REAL_LIBGCC_SPEC' instead.  `REAL_LIBGCC_SPEC' tells the driver
     how to place a reference to `libgcc' on the link command line,
     but, unlike `LIBGCC_SPEC', it is used unmodified.

 -- Macro: USE_LD_AS_NEEDED
     A macro that controls the modifications to `LIBGCC_SPEC' mentioned
     in `REAL_LIBGCC_SPEC'.  If nonzero, a spec will be generated that
     uses -as-needed and the shared libgcc in place of the static
     exception handler library, when linking without any of `-static',
     `-static-libgcc', or `-shared-libgcc'.

 -- Macro: LINK_EH_SPEC
     If defined, this C string constant is added to `LINK_SPEC'.  When
     `USE_LD_AS_NEEDED' is zero or undefined, it also affects the
     modifications to `LIBGCC_SPEC' mentioned in `REAL_LIBGCC_SPEC'.

 -- Macro: STARTFILE_SPEC
     Another C string constant used much like `LINK_SPEC'.  The
     difference between the two is that `STARTFILE_SPEC' is used at the
     very beginning of the command given to the linker.

     If this macro is not defined, a default is provided that loads the
     standard C startup file from the usual place.  See `gcc.c'.

 -- Macro: ENDFILE_SPEC
     Another C string constant used much like `LINK_SPEC'.  The
     difference between the two is that `ENDFILE_SPEC' is used at the
     very end of the command given to the linker.

     Do not define this macro if it does not need to do anything.

 -- Macro: THREAD_MODEL_SPEC
     GCC `-v' will print the thread model GCC was configured to use.
     However, this doesn't work on platforms that are multilibbed on
     thread models, such as AIX 4.3.  On such platforms, define
     `THREAD_MODEL_SPEC' such that it evaluates to a string without
     blanks that names one of the recognized thread models.  `%*', the
     default value of this macro, will expand to the value of
     `thread_file' set in `config.gcc'.

 -- Macro: SYSROOT_SUFFIX_SPEC
     Define this macro to add a suffix to the target sysroot when GCC is
     configured with a sysroot.  This will cause GCC to search for
     usr/lib, et al, within sysroot+suffix.

 -- Macro: SYSROOT_HEADERS_SUFFIX_SPEC
     Define this macro to add a headers_suffix to the target sysroot
     when GCC is configured with a sysroot.  This will cause GCC to
     pass the updated sysroot+headers_suffix to CPP, causing it to
     search for usr/include, et al, within sysroot+headers_suffix.

 -- Macro: EXTRA_SPECS
     Define this macro to provide additional specifications to put in
     the `specs' file that can be used in various specifications like
     `CC1_SPEC'.

     The definition should be an initializer for an array of structures,
     containing a string constant, that defines the specification name,
     and a string constant that provides the specification.

     Do not define this macro if it does not need to do anything.

     `EXTRA_SPECS' is useful when an architecture contains several
     related targets, which have various `..._SPECS' which are similar
     to each other, and the maintainer would like one central place to
     keep these definitions.

     For example, the PowerPC System V.4 targets use `EXTRA_SPECS' to
     define either `_CALL_SYSV' when the System V calling sequence is
     used or `_CALL_AIX' when the older AIX-based calling sequence is
     used.

     The `config/rs6000/rs6000.h' target file defines:

          #define EXTRA_SPECS \
            { "cpp_sysv_default", CPP_SYSV_DEFAULT },

          #define CPP_SYS_DEFAULT ""

     The `config/rs6000/sysv.h' target file defines:
          #undef CPP_SPEC
          #define CPP_SPEC \
          "%{posix: -D_POSIX_SOURCE } \
          %{mcall-sysv: -D_CALL_SYSV } \
          %{!mcall-sysv: %(cpp_sysv_default) } \
          %{msoft-float: -D_SOFT_FLOAT} %{mcpu=403: -D_SOFT_FLOAT}"

          #undef CPP_SYSV_DEFAULT
          #define CPP_SYSV_DEFAULT "-D_CALL_SYSV"

     while the `config/rs6000/eabiaix.h' target file defines
     `CPP_SYSV_DEFAULT' as:

          #undef CPP_SYSV_DEFAULT
          #define CPP_SYSV_DEFAULT "-D_CALL_AIX"

 -- Macro: LINK_LIBGCC_SPECIAL_1
     Define this macro if the driver program should find the library
     `libgcc.a'.  If you do not define this macro, the driver program
     will pass the argument `-lgcc' to tell the linker to do the search.

 -- Macro: LINK_GCC_C_SEQUENCE_SPEC
     The sequence in which libgcc and libc are specified to the linker.
     By default this is `%G %L %G'.

 -- Macro: LINK_COMMAND_SPEC
     A C string constant giving the complete command line need to
     execute the linker.  When you do this, you will need to update
     your port each time a change is made to the link command line
     within `gcc.c'.  Therefore, define this macro only if you need to
     completely redefine the command line for invoking the linker and
     there is no other way to accomplish the effect you need.
     Overriding this macro may be avoidable by overriding
     `LINK_GCC_C_SEQUENCE_SPEC' instead.

 -- Common Target Hook: bool TARGET_ALWAYS_STRIP_DOTDOT
     True if `..' components should always be removed from directory
     names computed relative to GCC's internal directories, false
     (default) if such components should be preserved and directory
     names containing them passed to other tools such as the linker.

 -- Macro: MULTILIB_DEFAULTS
     Define this macro as a C expression for the initializer of an
     array of string to tell the driver program which options are
     defaults for this target and thus do not need to be handled
     specially when using `MULTILIB_OPTIONS'.

     Do not define this macro if `MULTILIB_OPTIONS' is not defined in
     the target makefile fragment or if none of the options listed in
     `MULTILIB_OPTIONS' are set by default.  *Note Target Fragment::.

 -- Macro: RELATIVE_PREFIX_NOT_LINKDIR
     Define this macro to tell `gcc' that it should only translate a
     `-B' prefix into a `-L' linker option if the prefix indicates an
     absolute file name.

 -- Macro: MD_EXEC_PREFIX
     If defined, this macro is an additional prefix to try after
     `STANDARD_EXEC_PREFIX'.  `MD_EXEC_PREFIX' is not searched when the
     compiler is built as a cross compiler.  If you define
     `MD_EXEC_PREFIX', then be sure to add it to the list of
     directories used to find the assembler in `configure.in'.

 -- Macro: STANDARD_STARTFILE_PREFIX
     Define this macro as a C string constant if you wish to override
     the standard choice of `libdir' as the default prefix to try when
     searching for startup files such as `crt0.o'.
     `STANDARD_STARTFILE_PREFIX' is not searched when the compiler is
     built as a cross compiler.

 -- Macro: STANDARD_STARTFILE_PREFIX_1
     Define this macro as a C string constant if you wish to override
     the standard choice of `/lib' as a prefix to try after the default
     prefix when searching for startup files such as `crt0.o'.
     `STANDARD_STARTFILE_PREFIX_1' is not searched when the compiler is
     built as a cross compiler.

 -- Macro: STANDARD_STARTFILE_PREFIX_2
     Define this macro as a C string constant if you wish to override
     the standard choice of `/lib' as yet another prefix to try after
     the default prefix when searching for startup files such as
     `crt0.o'.  `STANDARD_STARTFILE_PREFIX_2' is not searched when the
     compiler is built as a cross compiler.

 -- Macro: MD_STARTFILE_PREFIX
     If defined, this macro supplies an additional prefix to try after
     the standard prefixes.  `MD_EXEC_PREFIX' is not searched when the
     compiler is built as a cross compiler.

 -- Macro: MD_STARTFILE_PREFIX_1
     If defined, this macro supplies yet another prefix to try after the
     standard prefixes.  It is not searched when the compiler is built
     as a cross compiler.

 -- Macro: INIT_ENVIRONMENT
     Define this macro as a C string constant if you wish to set
     environment variables for programs called by the driver, such as
     the assembler and loader.  The driver passes the value of this
     macro to `putenv' to initialize the necessary environment
     variables.

 -- Macro: LOCAL_INCLUDE_DIR
     Define this macro as a C string constant if you wish to override
     the standard choice of `/usr/local/include' as the default prefix
     to try when searching for local header files.  `LOCAL_INCLUDE_DIR'
     comes before `NATIVE_SYSTEM_HEADER_DIR' (set in `config.gcc',
     normally `/usr/include') in the search order.

     Cross compilers do not search either `/usr/local/include' or its
     replacement.

 -- Macro: NATIVE_SYSTEM_HEADER_COMPONENT
     The "component" corresponding to `NATIVE_SYSTEM_HEADER_DIR'.  See
     `INCLUDE_DEFAULTS', below, for the description of components.  If
     you do not define this macro, no component is used.

 -- Macro: INCLUDE_DEFAULTS
     Define this macro if you wish to override the entire default
     search path for include files.  For a native compiler, the default
     search path usually consists of `GCC_INCLUDE_DIR',
     `LOCAL_INCLUDE_DIR', `GPLUSPLUS_INCLUDE_DIR', and
     `NATIVE_SYSTEM_HEADER_DIR'.  In addition, `GPLUSPLUS_INCLUDE_DIR'
     and `GCC_INCLUDE_DIR' are defined automatically by `Makefile', and
     specify private search areas for GCC.  The directory
     `GPLUSPLUS_INCLUDE_DIR' is used only for C++ programs.

     The definition should be an initializer for an array of structures.
     Each array element should have four elements: the directory name (a
     string constant), the component name (also a string constant), a
     flag for C++-only directories, and a flag showing that the
     includes in the directory don't need to be wrapped in `extern `C''
     when compiling C++.  Mark the end of the array with a null element.

     The component name denotes what GNU package the include file is
     part of, if any, in all uppercase letters.  For example, it might
     be `GCC' or `BINUTILS'.  If the package is part of a
     vendor-supplied operating system, code the component name as `0'.

     For example, here is the definition used for VAX/VMS:

          #define INCLUDE_DEFAULTS \
          {                                       \
            { "GNU_GXX_INCLUDE:", "G++", 1, 1},   \
            { "GNU_CC_INCLUDE:", "GCC", 0, 0},    \
            { "SYS$SYSROOT:[SYSLIB.]", 0, 0, 0},  \
            { ".", 0, 0, 0},                      \
            { 0, 0, 0, 0}                         \
          }

 Here is the order of prefixes tried for exec files:

  1. Any prefixes specified by the user with `-B'.

  2. The environment variable `GCC_EXEC_PREFIX' or, if `GCC_EXEC_PREFIX'
     is not set and the compiler has not been installed in the
     configure-time PREFIX, the location in which the compiler has
     actually been installed.

  3. The directories specified by the environment variable
     `COMPILER_PATH'.

  4. The macro `STANDARD_EXEC_PREFIX', if the compiler has been
     installed in the configured-time PREFIX.

  5. The location `/usr/libexec/gcc/', but only if this is a native
     compiler.

  6. The location `/usr/lib/gcc/', but only if this is a native
     compiler.

  7. The macro `MD_EXEC_PREFIX', if defined, but only if this is a
     native compiler.

 Here is the order of prefixes tried for startfiles:

  1. Any prefixes specified by the user with `-B'.

  2. The environment variable `GCC_EXEC_PREFIX' or its automatically
     determined value based on the installed toolchain location.

  3. The directories specified by the environment variable
     `LIBRARY_PATH' (or port-specific name; native only, cross
     compilers do not use this).

  4. The macro `STANDARD_EXEC_PREFIX', but only if the toolchain is
     installed in the configured PREFIX or this is a native compiler.

  5. The location `/usr/lib/gcc/', but only if this is a native
     compiler.

  6. The macro `MD_EXEC_PREFIX', if defined, but only if this is a
     native compiler.

  7. The macro `MD_STARTFILE_PREFIX', if defined, but only if this is a
     native compiler, or we have a target system root.

  8. The macro `MD_STARTFILE_PREFIX_1', if defined, but only if this is
     a native compiler, or we have a target system root.

  9. The macro `STANDARD_STARTFILE_PREFIX', with any sysroot
     modifications.  If this path is relative it will be prefixed by
     `GCC_EXEC_PREFIX' and the machine suffix or `STANDARD_EXEC_PREFIX'
     and the machine suffix.

 10. The macro `STANDARD_STARTFILE_PREFIX_1', but only if this is a
     native compiler, or we have a target system root. The default for
     this macro is `/lib/'.

 11. The macro `STANDARD_STARTFILE_PREFIX_2', but only if this is a
     native compiler, or we have a target system root. The default for
     this macro is `/usr/lib/'.


File: gccint.info,  Node: Run-time Target,  Next: Per-Function Data,  Prev: Driver,  Up: Target Macros

17.3 Run-time Target Specification
==================================

Here are run-time target specifications.

 -- Macro: TARGET_CPU_CPP_BUILTINS ()
     This function-like macro expands to a block of code that defines
     built-in preprocessor macros and assertions for the target CPU,
     using the functions `builtin_define', `builtin_define_std' and
     `builtin_assert'.  When the front end calls this macro it provides
     a trailing semicolon, and since it has finished command line
     option processing your code can use those results freely.

     `builtin_assert' takes a string in the form you pass to the
     command-line option `-A', such as `cpu=mips', and creates the
     assertion.  `builtin_define' takes a string in the form accepted
     by option `-D' and unconditionally defines the macro.

     `builtin_define_std' takes a string representing the name of an
     object-like macro.  If it doesn't lie in the user's namespace,
     `builtin_define_std' defines it unconditionally.  Otherwise, it
     defines a version with two leading underscores, and another version
     with two leading and trailing underscores, and defines the original
     only if an ISO standard was not requested on the command line.  For
     example, passing `unix' defines `__unix', `__unix__' and possibly
     `unix'; passing `_mips' defines `__mips', `__mips__' and possibly
     `_mips', and passing `_ABI64' defines only `_ABI64'.

     You can also test for the C dialect being compiled.  The variable
     `c_language' is set to one of `clk_c', `clk_cplusplus' or
     `clk_objective_c'.  Note that if we are preprocessing assembler,
     this variable will be `clk_c' but the function-like macro
     `preprocessing_asm_p()' will return true, so you might want to
     check for that first.  If you need to check for strict ANSI, the
     variable `flag_iso' can be used.  The function-like macro
     `preprocessing_trad_p()' can be used to check for traditional
     preprocessing.

 -- Macro: TARGET_OS_CPP_BUILTINS ()
     Similarly to `TARGET_CPU_CPP_BUILTINS' but this macro is optional
     and is used for the target operating system instead.

 -- Macro: TARGET_OBJFMT_CPP_BUILTINS ()
     Similarly to `TARGET_CPU_CPP_BUILTINS' but this macro is optional
     and is used for the target object format.  `elfos.h' uses this
     macro to define `__ELF__', so you probably do not need to define
     it yourself.

 -- Variable: extern int target_flags
     This variable is declared in `options.h', which is included before
     any target-specific headers.

 -- Common Target Hook: int TARGET_DEFAULT_TARGET_FLAGS
     This variable specifies the initial value of `target_flags'.  Its
     default setting is 0.

 -- Common Target Hook: bool TARGET_HANDLE_OPTION (struct gcc_options
          *OPTS, struct gcc_options *OPTS_SET, const struct
          cl_decoded_option *DECODED, location_t LOC)
     This hook is called whenever the user specifies one of the
     target-specific options described by the `.opt' definition files
     (*note Options::).  It has the opportunity to do some
     option-specific processing and should return true if the option is
     valid.  The default definition does nothing but return true.

     DECODED specifies the option and its arguments.  OPTS and OPTS_SET
     are the `gcc_options' structures to be used for storing option
     state, and LOC is the location at which the option was passed
     (`UNKNOWN_LOCATION' except for options passed via attributes).

 -- C Target Hook: bool TARGET_HANDLE_C_OPTION (size_t CODE, const char
          *ARG, int VALUE)
     This target hook is called whenever the user specifies one of the
     target-specific C language family options described by the `.opt'
     definition files(*note Options::).  It has the opportunity to do
     some option-specific processing and should return true if the
     option is valid.  The arguments are like for
     `TARGET_HANDLE_OPTION'.  The default definition does nothing but
     return false.

     In general, you should use `TARGET_HANDLE_OPTION' to handle
     options.  However, if processing an option requires routines that
     are only available in the C (and related language) front ends,
     then you should use `TARGET_HANDLE_C_OPTION' instead.

 -- C Target Hook: tree TARGET_OBJC_CONSTRUCT_STRING_OBJECT (tree
          STRING)
     Targets may provide a string object type that can be used within
     and between C, C++ and their respective Objective-C dialects. A
     string object might, for example, embed encoding and length
     information. These objects are considered opaque to the compiler
     and handled as references. An ideal implementation makes the
     composition of the string object match that of the Objective-C
     `NSString' (`NXString' for GNUStep), allowing efficient
     interworking between C-only and Objective-C code. If a target
     implements string objects then this hook should return a reference
     to such an object constructed from the normal `C' string
     representation provided in STRING. At present, the hook is used by
     Objective-C only, to obtain a common-format string object when the
     target provides one.

 -- C Target Hook: void TARGET_OBJC_DECLARE_UNRESOLVED_CLASS_REFERENCE
          (const char *CLASSNAME)
     Declare that Objective C class CLASSNAME is referenced  by the
     current TU.

 -- C Target Hook: void TARGET_OBJC_DECLARE_CLASS_DEFINITION (const
          char *CLASSNAME)
     Declare that Objective C class CLASSNAME is defined  by the
     current TU.

 -- C Target Hook: bool TARGET_STRING_OBJECT_REF_TYPE_P (const_tree
          STRINGREF)
     If a target implements string objects then this hook should return
     `true' if STRINGREF is a valid reference to such an object.

 -- C Target Hook: void TARGET_CHECK_STRING_OBJECT_FORMAT_ARG (tree
          FORMAT_ARG, tree ARGS_LIST)
     If a target implements string objects then this hook should should
     provide a facility to check the function arguments in ARGS_LIST
     against the format specifiers in FORMAT_ARG where the type of
     FORMAT_ARG is one recognized as a valid string reference type.

 -- Target Hook: void TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE (void)
     This target function is similar to the hook
     `TARGET_OPTION_OVERRIDE' but is called when the optimize level is
     changed via an attribute or pragma or when it is reset at the end
     of the code affected by the attribute or pragma.  It is not called
     at the beginning of compilation when `TARGET_OPTION_OVERRIDE' is
     called so if you want to perform these actions then, you should
     have `TARGET_OPTION_OVERRIDE' call
     `TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE'.

 -- Macro: C_COMMON_OVERRIDE_OPTIONS
     This is similar to the `TARGET_OPTION_OVERRIDE' hook but is only
     used in the C language frontends (C, Objective-C, C++,
     Objective-C++) and so can be used to alter option flag variables
     which only exist in those frontends.

 -- Common Target Hook: const struct default_options *
TARGET_OPTION_OPTIMIZATION_TABLE
     Some machines may desire to change what optimizations are
     performed for various optimization levels.   This variable, if
     defined, describes options to enable at particular sets of
     optimization levels.  These options are processed once just after
     the optimization level is determined and before the remainder of
     the command options have been parsed, so may be overridden by other
     options passed explicitly.

     This processing is run once at program startup and when the
     optimization options are changed via `#pragma GCC optimize' or by
     using the `optimize' attribute.

 -- Common Target Hook: void TARGET_OPTION_INIT_STRUCT (struct
          gcc_options *OPTS)
     Set target-dependent initial values of fields in OPTS.

 -- Common Target Hook: void TARGET_OPTION_DEFAULT_PARAMS (void)
     Set target-dependent default values for `--param' settings, using
     calls to `set_default_param_value'.

 -- Macro: SWITCHABLE_TARGET
     Some targets need to switch between substantially different
     subtargets during compilation.  For example, the MIPS target has
     one subtarget for the traditional MIPS architecture and another
     for MIPS16.  Source code can switch between these two
     subarchitectures using the `mips16' and `nomips16' attributes.

     Such subtargets can differ in things like the set of available
     registers, the set of available instructions, the costs of various
     operations, and so on.  GCC caches a lot of this type of
     information in global variables, and recomputing them for each
     subtarget takes a significant amount of time.  The compiler
     therefore provides a facility for maintaining several versions of
     the global variables and quickly switching between them; see
     `target-globals.h' for details.

     Define this macro to 1 if your target needs this facility.  The
     default is 0.


File: gccint.info,  Node: Per-Function Data,  Next: Storage Layout,  Prev: Run-time Target,  Up: Target Macros

17.4 Defining data structures for per-function information.
===========================================================

If the target needs to store information on a per-function basis, GCC
provides a macro and a couple of variables to allow this.  Note, just
using statics to store the information is a bad idea, since GCC supports
nested functions, so you can be halfway through encoding one function
when another one comes along.

 GCC defines a data structure called `struct function' which contains
all of the data specific to an individual function.  This structure
contains a field called `machine' whose type is `struct
machine_function *', which can be used by targets to point to their own
specific data.

 If a target needs per-function specific data it should define the type
`struct machine_function' and also the macro `INIT_EXPANDERS'.  This
macro should be used to initialize the function pointer
`init_machine_status'.  This pointer is explained below.

 One typical use of per-function, target specific data is to create an
RTX to hold the register containing the function's return address.  This
RTX can then be used to implement the `__builtin_return_address'
function, for level 0.

 Note--earlier implementations of GCC used a single data area to hold
all of the per-function information.  Thus when processing of a nested
function began the old per-function data had to be pushed onto a stack,
and when the processing was finished, it had to be popped off the
stack.  GCC used to provide function pointers called
`save_machine_status' and `restore_machine_status' to handle the saving
and restoring of the target specific information.  Since the single
data area approach is no longer used, these pointers are no longer
supported.

 -- Macro: INIT_EXPANDERS
     Macro called to initialize any target specific information.  This
     macro is called once per function, before generation of any RTL
     has begun.  The intention of this macro is to allow the
     initialization of the function pointer `init_machine_status'.

 -- Variable: void (*)(struct function *) init_machine_status
     If this function pointer is non-`NULL' it will be called once per
     function, before function compilation starts, in order to allow the
     target to perform any target specific initialization of the
     `struct function' structure.  It is intended that this would be
     used to initialize the `machine' of that structure.

     `struct machine_function' structures are expected to be freed by
     GC.  Generally, any memory that they reference must be allocated
     by using GC allocation, including the structure itself.


File: gccint.info,  Node: Storage Layout,  Next: Type Layout,  Prev: Per-Function Data,  Up: Target Macros

17.5 Storage Layout
===================

Note that the definitions of the macros in this table which are sizes or
alignments measured in bits do not need to be constant.  They can be C
expressions that refer to static variables, such as the `target_flags'.
*Note Run-time Target::.

 -- Macro: BITS_BIG_ENDIAN
     Define this macro to have the value 1 if the most significant bit
     in a byte has the lowest number; otherwise define it to have the
     value zero.  This means that bit-field instructions count from the
     most significant bit.  If the machine has no bit-field
     instructions, then this must still be defined, but it doesn't
     matter which value it is defined to.  This macro need not be a
     constant.

     This macro does not affect the way structure fields are packed into
     bytes or words; that is controlled by `BYTES_BIG_ENDIAN'.

 -- Macro: BYTES_BIG_ENDIAN
     Define this macro to have the value 1 if the most significant byte
     in a word has the lowest number.  This macro need not be a
     constant.

 -- Macro: WORDS_BIG_ENDIAN
     Define this macro to have the value 1 if, in a multiword object,
     the most significant word has the lowest number.  This applies to
     both memory locations and registers; see `REG_WORDS_BIG_ENDIAN' if
     the order of words in memory is not the same as the order in
     registers.  This macro need not be a constant.

 -- Macro: REG_WORDS_BIG_ENDIAN
     On some machines, the order of words in a multiword object differs
     between registers in memory.  In such a situation, define this
     macro to describe the order of words in a register.  The macro
     `WORDS_BIG_ENDIAN' controls the order of words in memory.

 -- Macro: FLOAT_WORDS_BIG_ENDIAN
     Define this macro to have the value 1 if `DFmode', `XFmode' or
     `TFmode' floating point numbers are stored in memory with the word
     containing the sign bit at the lowest address; otherwise define it
     to have the value 0.  This macro need not be a constant.

     You need not define this macro if the ordering is the same as for
     multi-word integers.

 -- Macro: BITS_PER_UNIT
     Define this macro to be the number of bits in an addressable
     storage unit (byte).  If you do not define this macro the default
     is 8.

 -- Macro: BITS_PER_WORD
     Number of bits in a word.  If you do not define this macro, the
     default is `BITS_PER_UNIT * UNITS_PER_WORD'.

 -- Macro: MAX_BITS_PER_WORD
     Maximum number of bits in a word.  If this is undefined, the
     default is `BITS_PER_WORD'.  Otherwise, it is the constant value
     that is the largest value that `BITS_PER_WORD' can have at
     run-time.

 -- Macro: UNITS_PER_WORD
     Number of storage units in a word; normally the size of a
     general-purpose register, a power of two from 1 or 8.

 -- Macro: MIN_UNITS_PER_WORD
     Minimum number of units in a word.  If this is undefined, the
     default is `UNITS_PER_WORD'.  Otherwise, it is the constant value
     that is the smallest value that `UNITS_PER_WORD' can have at
     run-time.

 -- Macro: POINTER_SIZE
     Width of a pointer, in bits.  You must specify a value no wider
     than the width of `Pmode'.  If it is not equal to the width of
     `Pmode', you must define `POINTERS_EXTEND_UNSIGNED'.  If you do
     not specify a value the default is `BITS_PER_WORD'.

 -- Macro: POINTERS_EXTEND_UNSIGNED
     A C expression that determines how pointers should be extended from
     `ptr_mode' to either `Pmode' or `word_mode'.  It is greater than
     zero if pointers should be zero-extended, zero if they should be
     sign-extended, and negative if some other sort of conversion is
     needed.  In the last case, the extension is done by the target's
     `ptr_extend' instruction.

     You need not define this macro if the `ptr_mode', `Pmode' and
     `word_mode' are all the same width.

 -- Macro: PROMOTE_MODE (M, UNSIGNEDP, TYPE)
     A macro to update M and UNSIGNEDP when an object whose type is
     TYPE and which has the specified mode and signedness is to be
     stored in a register.  This macro is only called when TYPE is a
     scalar type.

     On most RISC machines, which only have operations that operate on
     a full register, define this macro to set M to `word_mode' if M is
     an integer mode narrower than `BITS_PER_WORD'.  In most cases,
     only integer modes should be widened because wider-precision
     floating-point operations are usually more expensive than their
     narrower counterparts.

     For most machines, the macro definition does not change UNSIGNEDP.
     However, some machines, have instructions that preferentially
     handle either signed or unsigned quantities of certain modes.  For
     example, on the DEC Alpha, 32-bit loads from memory and 32-bit add
     instructions sign-extend the result to 64 bits.  On such machines,
     set UNSIGNEDP according to which kind of extension is more
     efficient.

     Do not define this macro if it would never modify M.

 -- Target Hook: enum machine_mode TARGET_PROMOTE_FUNCTION_MODE
          (const_tree TYPE, enum machine_mode MODE, int *PUNSIGNEDP,
          const_tree FUNTYPE, int FOR_RETURN)
     Like `PROMOTE_MODE', but it is applied to outgoing function
     arguments or function return values.  The target hook should
     return the new mode and possibly change `*PUNSIGNEDP' if the
     promotion should change signedness.  This function is called only
     for scalar _or pointer_ types.

     FOR_RETURN allows to distinguish the promotion of arguments and
     return values.  If it is `1', a return value is being promoted and
     `TARGET_FUNCTION_VALUE' must perform the same promotions done here.
     If it is `2', the returned mode should be that of the register in
     which an incoming parameter is copied, or the outgoing result is
     computed; then the hook should return the same mode as
     `promote_mode', though the signedness may be different.

     TYPE can be NULL when promoting function arguments of libcalls.

     The default is to not promote arguments and return values.  You can
     also define the hook to
     `default_promote_function_mode_always_promote' if you would like
     to apply the same rules given by `PROMOTE_MODE'.

 -- Macro: PARM_BOUNDARY
     Normal alignment required for function parameters on the stack, in
     bits.  All stack parameters receive at least this much alignment
     regardless of data type.  On most machines, this is the same as the
     size of an integer.

 -- Macro: STACK_BOUNDARY
     Define this macro to the minimum alignment enforced by hardware
     for the stack pointer on this machine.  The definition is a C
     expression for the desired alignment (measured in bits).  This
     value is used as a default if `PREFERRED_STACK_BOUNDARY' is not
     defined.  On most machines, this should be the same as
     `PARM_BOUNDARY'.

 -- Macro: PREFERRED_STACK_BOUNDARY
     Define this macro if you wish to preserve a certain alignment for
     the stack pointer, greater than what the hardware enforces.  The
     definition is a C expression for the desired alignment (measured
     in bits).  This macro must evaluate to a value equal to or larger
     than `STACK_BOUNDARY'.

 -- Macro: INCOMING_STACK_BOUNDARY
     Define this macro if the incoming stack boundary may be different
     from `PREFERRED_STACK_BOUNDARY'.  This macro must evaluate to a
     value equal to or larger than `STACK_BOUNDARY'.

 -- Macro: FUNCTION_BOUNDARY
     Alignment required for a function entry point, in bits.

 -- Macro: BIGGEST_ALIGNMENT
     Biggest alignment that any data type can require on this machine,
     in bits.  Note that this is not the biggest alignment that is
     supported, just the biggest alignment that, when violated, may
     cause a fault.

 -- Macro: MALLOC_ABI_ALIGNMENT
     Alignment, in bits, a C conformant malloc implementation has to
     provide.  If not defined, the default value is `BITS_PER_WORD'.

 -- Macro: ATTRIBUTE_ALIGNED_VALUE
     Alignment used by the `__attribute__ ((aligned))' construct.  If
     not defined, the default value is `BIGGEST_ALIGNMENT'.

 -- Macro: MINIMUM_ATOMIC_ALIGNMENT
     If defined, the smallest alignment, in bits, that can be given to
     an object that can be referenced in one operation, without
     disturbing any nearby object.  Normally, this is `BITS_PER_UNIT',
     but may be larger on machines that don't have byte or half-word
     store operations.

 -- Macro: BIGGEST_FIELD_ALIGNMENT
     Biggest alignment that any structure or union field can require on
     this machine, in bits.  If defined, this overrides
     `BIGGEST_ALIGNMENT' for structure and union fields only, unless
     the field alignment has been set by the `__attribute__ ((aligned
     (N)))' construct.

 -- Macro: ADJUST_FIELD_ALIGN (FIELD, COMPUTED)
     An expression for the alignment of a structure field FIELD if the
     alignment computed in the usual way (including applying of
     `BIGGEST_ALIGNMENT' and `BIGGEST_FIELD_ALIGNMENT' to the
     alignment) is COMPUTED.  It overrides alignment only if the field
     alignment has not been set by the `__attribute__ ((aligned (N)))'
     construct.

 -- Macro: MAX_STACK_ALIGNMENT
     Biggest stack alignment guaranteed by the backend.  Use this macro
     to specify the maximum alignment of a variable on stack.

     If not defined, the default value is `STACK_BOUNDARY'.


 -- Macro: MAX_OFILE_ALIGNMENT
     Biggest alignment supported by the object file format of this
     machine.  Use this macro to limit the alignment which can be
     specified using the `__attribute__ ((aligned (N)))' construct.  If
     not defined, the default value is `BIGGEST_ALIGNMENT'.

     On systems that use ELF, the default (in `config/elfos.h') is the
     largest supported 32-bit ELF section alignment representable on a
     32-bit host e.g. `(((unsigned HOST_WIDEST_INT) 1 << 28) * 8)'.  On
     32-bit ELF the largest supported section alignment in bits is
     `(0x80000000 * 8)', but this is not representable on 32-bit hosts.

 -- Macro: DATA_ALIGNMENT (TYPE, BASIC-ALIGN)
     If defined, a C expression to compute the alignment for a variable
     in the static store.  TYPE is the data type, and BASIC-ALIGN is
     the alignment that the object would ordinarily have.  The value of
     this macro is used instead of that alignment to align the object.

     If this macro is not defined, then BASIC-ALIGN is used.

     One use of this macro is to increase alignment of medium-size data
     to make it all fit in fewer cache lines.  Another is to cause
     character arrays to be word-aligned so that `strcpy' calls that
     copy constants to character arrays can be done inline.

 -- Macro: CONSTANT_ALIGNMENT (CONSTANT, BASIC-ALIGN)
     If defined, a C expression to compute the alignment given to a
     constant that is being placed in memory.  CONSTANT is the constant
     and BASIC-ALIGN is the alignment that the object would ordinarily
     have.  The value of this macro is used instead of that alignment to
     align the object.

     If this macro is not defined, then BASIC-ALIGN is used.

     The typical use of this macro is to increase alignment for string
     constants to be word aligned so that `strcpy' calls that copy
     constants can be done inline.

 -- Macro: LOCAL_ALIGNMENT (TYPE, BASIC-ALIGN)
     If defined, a C expression to compute the alignment for a variable
     in the local store.  TYPE is the data type, and BASIC-ALIGN is the
     alignment that the object would ordinarily have.  The value of this
     macro is used instead of that alignment to align the object.

     If this macro is not defined, then BASIC-ALIGN is used.

     One use of this macro is to increase alignment of medium-size data
     to make it all fit in fewer cache lines.

     If the value of this macro has a type, it should be an unsigned
     type.

 -- Target Hook: HOST_WIDE_INT TARGET_VECTOR_ALIGNMENT (const_tree TYPE)
     This hook can be used to define the alignment for a vector of type
     TYPE, in order to comply with a platform ABI.  The default is to
     require natural alignment for vector types.  The alignment
     returned by this hook must be a power-of-two multiple of the
     default alignment of the vector element type.

 -- Macro: STACK_SLOT_ALIGNMENT (TYPE, MODE, BASIC-ALIGN)
     If defined, a C expression to compute the alignment for stack slot.
     TYPE is the data type, MODE is the widest mode available, and
     BASIC-ALIGN is the alignment that the slot would ordinarily have.
     The value of this macro is used instead of that alignment to align
     the slot.

     If this macro is not defined, then BASIC-ALIGN is used when TYPE
     is `NULL'.  Otherwise, `LOCAL_ALIGNMENT' will be used.

     This macro is to set alignment of stack slot to the maximum
     alignment of all possible modes which the slot may have.

     If the value of this macro has a type, it should be an unsigned
     type.

 -- Macro: LOCAL_DECL_ALIGNMENT (DECL)
     If defined, a C expression to compute the alignment for a local
     variable DECL.

     If this macro is not defined, then `LOCAL_ALIGNMENT (TREE_TYPE
     (DECL), DECL_ALIGN (DECL))' is used.

     One use of this macro is to increase alignment of medium-size data
     to make it all fit in fewer cache lines.

     If the value of this macro has a type, it should be an unsigned
     type.

 -- Macro: MINIMUM_ALIGNMENT (EXP, MODE, ALIGN)
     If defined, a C expression to compute the minimum required
     alignment for dynamic stack realignment purposes for EXP (a type
     or decl), MODE, assuming normal alignment ALIGN.

     If this macro is not defined, then ALIGN will be used.

 -- Macro: EMPTY_FIELD_BOUNDARY
     Alignment in bits to be given to a structure bit-field that
     follows an empty field such as `int : 0;'.

     If `PCC_BITFIELD_TYPE_MATTERS' is true, it overrides this macro.

 -- Macro: STRUCTURE_SIZE_BOUNDARY
     Number of bits which any structure or union's size must be a
     multiple of.  Each structure or union's size is rounded up to a
     multiple of this.

     If you do not define this macro, the default is the same as
     `BITS_PER_UNIT'.

 -- Macro: STRICT_ALIGNMENT
     Define this macro to be the value 1 if instructions will fail to
     work if given data not on the nominal alignment.  If instructions
     will merely go slower in that case, define this macro as 0.

 -- Macro: PCC_BITFIELD_TYPE_MATTERS
     Define this if you wish to imitate the way many other C compilers
     handle alignment of bit-fields and the structures that contain
     them.

     The behavior is that the type written for a named bit-field (`int',
     `short', or other integer type) imposes an alignment for the entire
     structure, as if the structure really did contain an ordinary
     field of that type.  In addition, the bit-field is placed within
     the structure so that it would fit within such a field, not
     crossing a boundary for it.

     Thus, on most machines, a named bit-field whose type is written as
     `int' would not cross a four-byte boundary, and would force
     four-byte alignment for the whole structure.  (The alignment used
     may not be four bytes; it is controlled by the other alignment
     parameters.)

     An unnamed bit-field will not affect the alignment of the
     containing structure.

     If the macro is defined, its definition should be a C expression;
     a nonzero value for the expression enables this behavior.

     Note that if this macro is not defined, or its value is zero, some
     bit-fields may cross more than one alignment boundary.  The
     compiler can support such references if there are `insv', `extv',
     and `extzv' insns that can directly reference memory.

     The other known way of making bit-fields work is to define
     `STRUCTURE_SIZE_BOUNDARY' as large as `BIGGEST_ALIGNMENT'.  Then
     every structure can be accessed with fullwords.

     Unless the machine has bit-field instructions or you define
     `STRUCTURE_SIZE_BOUNDARY' that way, you must define
     `PCC_BITFIELD_TYPE_MATTERS' to have a nonzero value.

     If your aim is to make GCC use the same conventions for laying out
     bit-fields as are used by another compiler, here is how to
     investigate what the other compiler does.  Compile and run this
     program:

          struct foo1
          {
            char x;
            char :0;
            char y;
          };

          struct foo2
          {
            char x;
            int :0;
            char y;
          };

          main ()
          {
            printf ("Size of foo1 is %d\n",
                    sizeof (struct foo1));
            printf ("Size of foo2 is %d\n",
                    sizeof (struct foo2));
            exit (0);
          }

     If this prints 2 and 5, then the compiler's behavior is what you
     would get from `PCC_BITFIELD_TYPE_MATTERS'.

 -- Macro: BITFIELD_NBYTES_LIMITED
     Like `PCC_BITFIELD_TYPE_MATTERS' except that its effect is limited
     to aligning a bit-field within the structure.

 -- Target Hook: bool TARGET_ALIGN_ANON_BITFIELD (void)
     When `PCC_BITFIELD_TYPE_MATTERS' is true this hook will determine
     whether unnamed bitfields affect the alignment of the containing
     structure.  The hook should return true if the structure should
     inherit the alignment requirements of an unnamed bitfield's type.

 -- Target Hook: bool TARGET_NARROW_VOLATILE_BITFIELD (void)
     This target hook should return `true' if accesses to volatile
     bitfields should use the narrowest mode possible.  It should
     return `false' if these accesses should use the bitfield container
     type.

     The default is `!TARGET_STRICT_ALIGN'.

 -- Target Hook: bool TARGET_MEMBER_TYPE_FORCES_BLK (const_tree FIELD,
          enum machine_mode MODE)
     Return true if a structure, union or array containing FIELD should
     be accessed using `BLKMODE'.

     If FIELD is the only field in the structure, MODE is its mode,
     otherwise MODE is VOIDmode.  MODE is provided in the case where
     structures of one field would require the structure's mode to
     retain the field's mode.

     Normally, this is not needed.

 -- Macro: ROUND_TYPE_ALIGN (TYPE, COMPUTED, SPECIFIED)
     Define this macro as an expression for the alignment of a type
     (given by TYPE as a tree node) if the alignment computed in the
     usual way is COMPUTED and the alignment explicitly specified was
     SPECIFIED.

     The default is to use SPECIFIED if it is larger; otherwise, use
     the smaller of COMPUTED and `BIGGEST_ALIGNMENT'

 -- Macro: MAX_FIXED_MODE_SIZE
     An integer expression for the size in bits of the largest integer
     machine mode that should actually be used.  All integer machine
     modes of this size or smaller can be used for structures and
     unions with the appropriate sizes.  If this macro is undefined,
     `GET_MODE_BITSIZE (DImode)' is assumed.

 -- Macro: STACK_SAVEAREA_MODE (SAVE_LEVEL)
     If defined, an expression of type `enum machine_mode' that
     specifies the mode of the save area operand of a
     `save_stack_LEVEL' named pattern (*note Standard Names::).
     SAVE_LEVEL is one of `SAVE_BLOCK', `SAVE_FUNCTION', or
     `SAVE_NONLOCAL' and selects which of the three named patterns is
     having its mode specified.

     You need not define this macro if it always returns `Pmode'.  You
     would most commonly define this macro if the `save_stack_LEVEL'
     patterns need to support both a 32- and a 64-bit mode.

 -- Macro: STACK_SIZE_MODE
     If defined, an expression of type `enum machine_mode' that
     specifies the mode of the size increment operand of an
     `allocate_stack' named pattern (*note Standard Names::).

     You need not define this macro if it always returns `word_mode'.
     You would most commonly define this macro if the `allocate_stack'
     pattern needs to support both a 32- and a 64-bit mode.

 -- Target Hook: enum machine_mode TARGET_LIBGCC_CMP_RETURN_MODE (void)
     This target hook should return the mode to be used for the return
     value of compare instructions expanded to libgcc calls.  If not
     defined `word_mode' is returned which is the right choice for a
     majority of targets.

 -- Target Hook: enum machine_mode TARGET_LIBGCC_SHIFT_COUNT_MODE (void)
     This target hook should return the mode to be used for the shift
     count operand of shift instructions expanded to libgcc calls.  If
     not defined `word_mode' is returned which is the right choice for
     a majority of targets.

 -- Target Hook: enum machine_mode TARGET_UNWIND_WORD_MODE (void)
     Return machine mode to be used for `_Unwind_Word' type.  The
     default is to use `word_mode'.

 -- Macro: ROUND_TOWARDS_ZERO
     If defined, this macro should be true if the prevailing rounding
     mode is towards zero.

     Defining this macro only affects the way `libgcc.a' emulates
     floating-point arithmetic.

     Not defining this macro is equivalent to returning zero.

 -- Macro: LARGEST_EXPONENT_IS_NORMAL (SIZE)
     This macro should return true if floats with SIZE bits do not have
     a NaN or infinity representation, but use the largest exponent for
     normal numbers instead.

     Defining this macro only affects the way `libgcc.a' emulates
     floating-point arithmetic.

     The default definition of this macro returns false for all sizes.

 -- Target Hook: bool TARGET_MS_BITFIELD_LAYOUT_P (const_tree
          RECORD_TYPE)
     This target hook returns `true' if bit-fields in the given
     RECORD_TYPE are to be laid out following the rules of Microsoft
     Visual C/C++, namely: (i) a bit-field won't share the same storage
     unit with the previous bit-field if their underlying types have
     different sizes, and the bit-field will be aligned to the highest
     alignment of the underlying types of itself and of the previous
     bit-field; (ii) a zero-sized bit-field will affect the alignment of
     the whole enclosing structure, even if it is unnamed; except that
     (iii) a zero-sized bit-field will be disregarded unless it follows
     another bit-field of nonzero size.  If this hook returns `true',
     other macros that control bit-field layout are ignored.

     When a bit-field is inserted into a packed record, the whole size
     of the underlying type is used by one or more same-size adjacent
     bit-fields (that is, if its long:3, 32 bits is used in the record,
     and any additional adjacent long bit-fields are packed into the
     same chunk of 32 bits.  However, if the size changes, a new field
     of that size is allocated).  In an unpacked record, this is the
     same as using alignment, but not equivalent when packing.

     If both MS bit-fields and `__attribute__((packed))' are used, the
     latter will take precedence.  If `__attribute__((packed))' is used
     on a single field when MS bit-fields are in use, it will take
     precedence for that field, but the alignment of the rest of the
     structure may affect its placement.

 -- Target Hook: bool TARGET_DECIMAL_FLOAT_SUPPORTED_P (void)
     Returns true if the target supports decimal floating point.

 -- Target Hook: bool TARGET_FIXED_POINT_SUPPORTED_P (void)
     Returns true if the target supports fixed-point arithmetic.

 -- Target Hook: void TARGET_EXPAND_TO_RTL_HOOK (void)
     This hook is called just before expansion into rtl, allowing the
     target to perform additional initializations or analysis before
     the expansion.  For example, the rs6000 port uses it to allocate a
     scratch stack slot for use in copying SDmode values between memory
     and floating point registers whenever the function being expanded
     has any SDmode usage.

 -- Target Hook: void TARGET_INSTANTIATE_DECLS (void)
     This hook allows the backend to perform additional instantiations
     on rtl that are not actually in any insns yet, but will be later.

 -- Target Hook: const char * TARGET_MANGLE_TYPE (const_tree TYPE)
     If your target defines any fundamental types, or any types your
     target uses should be mangled differently from the default, define
     this hook to return the appropriate encoding for these types as
     part of a C++ mangled name.  The TYPE argument is the tree
     structure representing the type to be mangled.  The hook may be
     applied to trees which are not target-specific fundamental types;
     it should return `NULL' for all such types, as well as arguments
     it does not recognize.  If the return value is not `NULL', it must
     point to a statically-allocated string constant.

     Target-specific fundamental types might be new fundamental types or
     qualified versions of ordinary fundamental types.  Encode new
     fundamental types as `u N NAME', where NAME is the name used for
     the type in source code, and N is the length of NAME in decimal.
     Encode qualified versions of ordinary types as `U N NAME CODE',
     where NAME is the name used for the type qualifier in source code,
     N is the length of NAME as above, and CODE is the code used to
     represent the unqualified version of this type.  (See
     `write_builtin_type' in `cp/mangle.c' for the list of codes.)  In
     both cases the spaces are for clarity; do not include any spaces
     in your string.

     This hook is applied to types prior to typedef resolution.  If the
     mangled name for a particular type depends only on that type's
     main variant, you can perform typedef resolution yourself using
     `TYPE_MAIN_VARIANT' before mangling.

     The default version of this hook always returns `NULL', which is
     appropriate for a target that does not define any new fundamental
     types.


File: gccint.info,  Node: Type Layout,  Next: Registers,  Prev: Storage Layout,  Up: Target Macros

17.6 Layout of Source Language Data Types
=========================================

These macros define the sizes and other characteristics of the standard
basic data types used in programs being compiled.  Unlike the macros in
the previous section, these apply to specific features of C and related
languages, rather than to fundamental aspects of storage layout.

 -- Macro: INT_TYPE_SIZE
     A C expression for the size in bits of the type `int' on the
     target machine.  If you don't define this, the default is one word.

 -- Macro: SHORT_TYPE_SIZE
     A C expression for the size in bits of the type `short' on the
     target machine.  If you don't define this, the default is half a
     word.  (If this would be less than one storage unit, it is rounded
     up to one unit.)

 -- Macro: LONG_TYPE_SIZE
     A C expression for the size in bits of the type `long' on the
     target machine.  If you don't define this, the default is one word.

 -- Macro: ADA_LONG_TYPE_SIZE
     On some machines, the size used for the Ada equivalent of the type
     `long' by a native Ada compiler differs from that used by C.  In
     that situation, define this macro to be a C expression to be used
     for the size of that type.  If you don't define this, the default
     is the value of `LONG_TYPE_SIZE'.

 -- Macro: LONG_LONG_TYPE_SIZE
     A C expression for the size in bits of the type `long long' on the
     target machine.  If you don't define this, the default is two
     words.  If you want to support GNU Ada on your machine, the value
     of this macro must be at least 64.

 -- Macro: CHAR_TYPE_SIZE
     A C expression for the size in bits of the type `char' on the
     target machine.  If you don't define this, the default is
     `BITS_PER_UNIT'.

 -- Macro: BOOL_TYPE_SIZE
     A C expression for the size in bits of the C++ type `bool' and C99
     type `_Bool' on the target machine.  If you don't define this, and
     you probably shouldn't, the default is `CHAR_TYPE_SIZE'.

 -- Macro: FLOAT_TYPE_SIZE
     A C expression for the size in bits of the type `float' on the
     target machine.  If you don't define this, the default is one word.

 -- Macro: DOUBLE_TYPE_SIZE
     A C expression for the size in bits of the type `double' on the
     target machine.  If you don't define this, the default is two
     words.

 -- Macro: LONG_DOUBLE_TYPE_SIZE
     A C expression for the size in bits of the type `long double' on
     the target machine.  If you don't define this, the default is two
     words.

 -- Macro: SHORT_FRACT_TYPE_SIZE
     A C expression for the size in bits of the type `short _Fract' on
     the target machine.  If you don't define this, the default is
     `BITS_PER_UNIT'.

 -- Macro: FRACT_TYPE_SIZE
     A C expression for the size in bits of the type `_Fract' on the
     target machine.  If you don't define this, the default is
     `BITS_PER_UNIT * 2'.

 -- Macro: LONG_FRACT_TYPE_SIZE
     A C expression for the size in bits of the type `long _Fract' on
     the target machine.  If you don't define this, the default is
     `BITS_PER_UNIT * 4'.

 -- Macro: LONG_LONG_FRACT_TYPE_SIZE
     A C expression for the size in bits of the type `long long _Fract'
     on the target machine.  If you don't define this, the default is
     `BITS_PER_UNIT * 8'.

 -- Macro: SHORT_ACCUM_TYPE_SIZE
     A C expression for the size in bits of the type `short _Accum' on
     the target machine.  If you don't define this, the default is
     `BITS_PER_UNIT * 2'.

 -- Macro: ACCUM_TYPE_SIZE
     A C expression for the size in bits of the type `_Accum' on the
     target machine.  If you don't define this, the default is
     `BITS_PER_UNIT * 4'.

 -- Macro: LONG_ACCUM_TYPE_SIZE
     A C expression for the size in bits of the type `long _Accum' on
     the target machine.  If you don't define this, the default is
     `BITS_PER_UNIT * 8'.

 -- Macro: LONG_LONG_ACCUM_TYPE_SIZE
     A C expression for the size in bits of the type `long long _Accum'
     on the target machine.  If you don't define this, the default is
     `BITS_PER_UNIT * 16'.

 -- Macro: LIBGCC2_LONG_DOUBLE_TYPE_SIZE
     Define this macro if `LONG_DOUBLE_TYPE_SIZE' is not constant or if
     you want routines in `libgcc2.a' for a size other than
     `LONG_DOUBLE_TYPE_SIZE'.  If you don't define this, the default is
     `LONG_DOUBLE_TYPE_SIZE'.

 -- Macro: LIBGCC2_HAS_DF_MODE
     Define this macro if neither `DOUBLE_TYPE_SIZE' nor
     `LIBGCC2_LONG_DOUBLE_TYPE_SIZE' is `DFmode' but you want `DFmode'
     routines in `libgcc2.a' anyway.  If you don't define this and
     either `DOUBLE_TYPE_SIZE' or `LIBGCC2_LONG_DOUBLE_TYPE_SIZE' is 64
     then the default is 1, otherwise it is 0.

 -- Macro: LIBGCC2_HAS_XF_MODE
     Define this macro if `LIBGCC2_LONG_DOUBLE_TYPE_SIZE' is not
     `XFmode' but you want `XFmode' routines in `libgcc2.a' anyway.  If
     you don't define this and `LIBGCC2_LONG_DOUBLE_TYPE_SIZE' is 80
     then the default is 1, otherwise it is 0.

 -- Macro: LIBGCC2_HAS_TF_MODE
     Define this macro if `LIBGCC2_LONG_DOUBLE_TYPE_SIZE' is not
     `TFmode' but you want `TFmode' routines in `libgcc2.a' anyway.  If
     you don't define this and `LIBGCC2_LONG_DOUBLE_TYPE_SIZE' is 128
     then the default is 1, otherwise it is 0.

 -- Macro: LIBGCC2_GNU_PREFIX
     This macro corresponds to the `TARGET_LIBFUNC_GNU_PREFIX' target
     hook and should be defined if that hook is overriden to be true.
     It causes function names in libgcc to be changed to use a `__gnu_'
     prefix for their name rather than the default `__'.  A port which
     uses this macro should also arrange to use `t-gnu-prefix' in the
     libgcc `config.host'.

 -- Macro: SF_SIZE
 -- Macro: DF_SIZE
 -- Macro: XF_SIZE
 -- Macro: TF_SIZE
     Define these macros to be the size in bits of the mantissa of
     `SFmode', `DFmode', `XFmode' and `TFmode' values, if the defaults
     in `libgcc2.h' are inappropriate.  By default, `FLT_MANT_DIG' is
     used for `SF_SIZE', `LDBL_MANT_DIG' for `XF_SIZE' and `TF_SIZE',
     and `DBL_MANT_DIG' or `LDBL_MANT_DIG' for `DF_SIZE' according to
     whether `DOUBLE_TYPE_SIZE' or `LIBGCC2_LONG_DOUBLE_TYPE_SIZE' is
     64.

 -- Macro: TARGET_FLT_EVAL_METHOD
     A C expression for the value for `FLT_EVAL_METHOD' in `float.h',
     assuming, if applicable, that the floating-point control word is
     in its default state.  If you do not define this macro the value of
     `FLT_EVAL_METHOD' will be zero.

 -- Macro: WIDEST_HARDWARE_FP_SIZE
     A C expression for the size in bits of the widest floating-point
     format supported by the hardware.  If you define this macro, you
     must specify a value less than or equal to the value of
     `LONG_DOUBLE_TYPE_SIZE'.  If you do not define this macro, the
     value of `LONG_DOUBLE_TYPE_SIZE' is the default.

 -- Macro: DEFAULT_SIGNED_CHAR
     An expression whose value is 1 or 0, according to whether the type
     `char' should be signed or unsigned by default.  The user can
     always override this default with the options `-fsigned-char' and
     `-funsigned-char'.

 -- Target Hook: bool TARGET_DEFAULT_SHORT_ENUMS (void)
     This target hook should return true if the compiler should give an
     `enum' type only as many bytes as it takes to represent the range
     of possible values of that type.  It should return false if all
     `enum' types should be allocated like `int'.

     The default is to return false.

 -- Macro: SIZE_TYPE
     A C expression for a string describing the name of the data type
     to use for size values.  The typedef name `size_t' is defined
     using the contents of the string.

     The string can contain more than one keyword.  If so, separate
     them with spaces, and write first any length keyword, then
     `unsigned' if appropriate, and finally `int'.  The string must
     exactly match one of the data type names defined in the function
     `c_common_nodes_and_builtins' in the file `c-family/c-common.c'.
     You may not omit `int' or change the order--that would cause the
     compiler to crash on startup.

     If you don't define this macro, the default is `"long unsigned
     int"'.

 -- Macro: SIZETYPE
     GCC defines internal types (`sizetype', `ssizetype', `bitsizetype'
     and `sbitsizetype') for expressions dealing with size.  This macro
     is a C expression for a string describing the name of the data
     type from which the precision of `sizetype' is extracted.

     The string has the same restrictions as `SIZE_TYPE' string.

     If you don't define this macro, the default is `SIZE_TYPE'.

 -- Macro: PTRDIFF_TYPE
     A C expression for a string describing the name of the data type
     to use for the result of subtracting two pointers.  The typedef
     name `ptrdiff_t' is defined using the contents of the string.  See
     `SIZE_TYPE' above for more information.

     If you don't define this macro, the default is `"long int"'.

 -- Macro: WCHAR_TYPE
     A C expression for a string describing the name of the data type
     to use for wide characters.  The typedef name `wchar_t' is defined
     using the contents of the string.  See `SIZE_TYPE' above for more
     information.

     If you don't define this macro, the default is `"int"'.

 -- Macro: WCHAR_TYPE_SIZE
     A C expression for the size in bits of the data type for wide
     characters.  This is used in `cpp', which cannot make use of
     `WCHAR_TYPE'.

 -- Macro: WINT_TYPE
     A C expression for a string describing the name of the data type to
     use for wide characters passed to `printf' and returned from
     `getwc'.  The typedef name `wint_t' is defined using the contents
     of the string.  See `SIZE_TYPE' above for more information.

     If you don't define this macro, the default is `"unsigned int"'.

 -- Macro: INTMAX_TYPE
     A C expression for a string describing the name of the data type
     that can represent any value of any standard or extended signed
     integer type.  The typedef name `intmax_t' is defined using the
     contents of the string.  See `SIZE_TYPE' above for more
     information.

     If you don't define this macro, the default is the first of
     `"int"', `"long int"', or `"long long int"' that has as much
     precision as `long long int'.

 -- Macro: UINTMAX_TYPE
     A C expression for a string describing the name of the data type
     that can represent any value of any standard or extended unsigned
     integer type.  The typedef name `uintmax_t' is defined using the
     contents of the string.  See `SIZE_TYPE' above for more
     information.

     If you don't define this macro, the default is the first of
     `"unsigned int"', `"long unsigned int"', or `"long long unsigned
     int"' that has as much precision as `long long unsigned int'.

 -- Macro: SIG_ATOMIC_TYPE
 -- Macro: INT8_TYPE
 -- Macro: INT16_TYPE
 -- Macro: INT32_TYPE
 -- Macro: INT64_TYPE
 -- Macro: UINT8_TYPE
 -- Macro: UINT16_TYPE
 -- Macro: UINT32_TYPE
 -- Macro: UINT64_TYPE
 -- Macro: INT_LEAST8_TYPE
 -- Macro: INT_LEAST16_TYPE
 -- Macro: INT_LEAST32_TYPE
 -- Macro: INT_LEAST64_TYPE
 -- Macro: UINT_LEAST8_TYPE
 -- Macro: UINT_LEAST16_TYPE
 -- Macro: UINT_LEAST32_TYPE
 -- Macro: UINT_LEAST64_TYPE
 -- Macro: INT_FAST8_TYPE
 -- Macro: INT_FAST16_TYPE
 -- Macro: INT_FAST32_TYPE
 -- Macro: INT_FAST64_TYPE
 -- Macro: UINT_FAST8_TYPE
 -- Macro: UINT_FAST16_TYPE
 -- Macro: UINT_FAST32_TYPE
 -- Macro: UINT_FAST64_TYPE
 -- Macro: INTPTR_TYPE
 -- Macro: UINTPTR_TYPE
     C expressions for the standard types `sig_atomic_t', `int8_t',
     `int16_t', `int32_t', `int64_t', `uint8_t', `uint16_t',
     `uint32_t', `uint64_t', `int_least8_t', `int_least16_t',
     `int_least32_t', `int_least64_t', `uint_least8_t',
     `uint_least16_t', `uint_least32_t', `uint_least64_t',
     `int_fast8_t', `int_fast16_t', `int_fast32_t', `int_fast64_t',
     `uint_fast8_t', `uint_fast16_t', `uint_fast32_t', `uint_fast64_t',
     `intptr_t', and `uintptr_t'.  See `SIZE_TYPE' above for more
     information.

     If any of these macros evaluates to a null pointer, the
     corresponding type is not supported; if GCC is configured to
     provide `<stdint.h>' in such a case, the header provided may not
     conform to C99, depending on the type in question.  The defaults
     for all of these macros are null pointers.

 -- Macro: TARGET_PTRMEMFUNC_VBIT_LOCATION
     The C++ compiler represents a pointer-to-member-function with a
     struct that looks like:

            struct {
              union {
                void (*fn)();
                ptrdiff_t vtable_index;
              };
              ptrdiff_t delta;
            };

     The C++ compiler must use one bit to indicate whether the function
     that will be called through a pointer-to-member-function is
     virtual.  Normally, we assume that the low-order bit of a function
     pointer must always be zero.  Then, by ensuring that the
     vtable_index is odd, we can distinguish which variant of the union
     is in use.  But, on some platforms function pointers can be odd,
     and so this doesn't work.  In that case, we use the low-order bit
     of the `delta' field, and shift the remainder of the `delta' field
     to the left.

     GCC will automatically make the right selection about where to
     store this bit using the `FUNCTION_BOUNDARY' setting for your
     platform.  However, some platforms such as ARM/Thumb have
     `FUNCTION_BOUNDARY' set such that functions always start at even
     addresses, but the lowest bit of pointers to functions indicate
     whether the function at that address is in ARM or Thumb mode.  If
     this is the case of your architecture, you should define this
     macro to `ptrmemfunc_vbit_in_delta'.

     In general, you should not have to define this macro.  On
     architectures in which function addresses are always even,
     according to `FUNCTION_BOUNDARY', GCC will automatically define
     this macro to `ptrmemfunc_vbit_in_pfn'.

 -- Macro: TARGET_VTABLE_USES_DESCRIPTORS
     Normally, the C++ compiler uses function pointers in vtables.  This
     macro allows the target to change to use "function descriptors"
     instead.  Function descriptors are found on targets for whom a
     function pointer is actually a small data structure.  Normally the
     data structure consists of the actual code address plus a data
     pointer to which the function's data is relative.

     If vtables are used, the value of this macro should be the number
     of words that the function descriptor occupies.

 -- Macro: TARGET_VTABLE_ENTRY_ALIGN
     By default, the vtable entries are void pointers, the so the
     alignment is the same as pointer alignment.  The value of this
     macro specifies the alignment of the vtable entry in bits.  It
     should be defined only when special alignment is necessary. */

 -- Macro: TARGET_VTABLE_DATA_ENTRY_DISTANCE
     There are a few non-descriptor entries in the vtable at offsets
     below zero.  If these entries must be padded (say, to preserve the
     alignment specified by `TARGET_VTABLE_ENTRY_ALIGN'), set this to
     the number of words in each data entry.


File: gccint.info,  Node: Registers,  Next: Register Classes,  Prev: Type Layout,  Up: Target Macros

17.7 Register Usage
===================

This section explains how to describe what registers the target machine
has, and how (in general) they can be used.

 The description of which registers a specific instruction can use is
done with register classes; see *note Register Classes::.  For
information on using registers to access a stack frame, see *note Frame
Registers::.  For passing values in registers, see *note Register
Arguments::.  For returning values in registers, see *note Scalar
Return::.

* Menu:

* Register Basics::             Number and kinds of registers.
* Allocation Order::            Order in which registers are allocated.
* Values in Registers::         What kinds of values each reg can hold.
* Leaf Functions::              Renumbering registers for leaf functions.
* Stack Registers::             Handling a register stack such as 80387.


File: gccint.info,  Node: Register Basics,  Next: Allocation Order,  Up: Registers

17.7.1 Basic Characteristics of Registers
-----------------------------------------

Registers have various characteristics.

 -- Macro: FIRST_PSEUDO_REGISTER
     Number of hardware registers known to the compiler.  They receive
     numbers 0 through `FIRST_PSEUDO_REGISTER-1'; thus, the first
     pseudo register's number really is assigned the number
     `FIRST_PSEUDO_REGISTER'.

 -- Macro: FIXED_REGISTERS
     An initializer that says which registers are used for fixed
     purposes all throughout the compiled code and are therefore not
     available for general allocation.  These would include the stack
     pointer, the frame pointer (except on machines where that can be
     used as a general register when no frame pointer is needed), the
     program counter on machines where that is considered one of the
     addressable registers, and any other numbered register with a
     standard use.

     This information is expressed as a sequence of numbers, separated
     by commas and surrounded by braces.  The Nth number is 1 if
     register N is fixed, 0 otherwise.

     The table initialized from this macro, and the table initialized by
     the following one, may be overridden at run time either
     automatically, by the actions of the macro
     `CONDITIONAL_REGISTER_USAGE', or by the user with the command
     options `-ffixed-REG', `-fcall-used-REG' and `-fcall-saved-REG'.

 -- Macro: CALL_USED_REGISTERS
     Like `FIXED_REGISTERS' but has 1 for each register that is
     clobbered (in general) by function calls as well as for fixed
     registers.  This macro therefore identifies the registers that are
     not available for general allocation of values that must live
     across function calls.

     If a register has 0 in `CALL_USED_REGISTERS', the compiler
     automatically saves it on function entry and restores it on
     function exit, if the register is used within the function.

 -- Macro: CALL_REALLY_USED_REGISTERS
     Like `CALL_USED_REGISTERS' except this macro doesn't require that
     the entire set of `FIXED_REGISTERS' be included.
     (`CALL_USED_REGISTERS' must be a superset of `FIXED_REGISTERS').
     This macro is optional.  If not specified, it defaults to the value
     of `CALL_USED_REGISTERS'.

 -- Macro: HARD_REGNO_CALL_PART_CLOBBERED (REGNO, MODE)
     A C expression that is nonzero if it is not permissible to store a
     value of mode MODE in hard register number REGNO across a call
     without some part of it being clobbered.  For most machines this
     macro need not be defined.  It is only required for machines that
     do not preserve the entire contents of a register across a call.

 -- Target Hook: void TARGET_CONDITIONAL_REGISTER_USAGE (void)
     This hook may conditionally modify five variables `fixed_regs',
     `call_used_regs', `global_regs', `reg_names', and
     `reg_class_contents', to take into account any dependence of these
     register sets on target flags.  The first three of these are of
     type `char []' (interpreted as Boolean vectors).  `global_regs' is
     a `const char *[]', and `reg_class_contents' is a `HARD_REG_SET'.
     Before the macro is called, `fixed_regs', `call_used_regs',
     `reg_class_contents', and `reg_names' have been initialized from
     `FIXED_REGISTERS', `CALL_USED_REGISTERS', `REG_CLASS_CONTENTS',
     and `REGISTER_NAMES', respectively.  `global_regs' has been
     cleared, and any `-ffixed-REG', `-fcall-used-REG' and
     `-fcall-saved-REG' command options have been applied.

     If the usage of an entire class of registers depends on the target
     flags, you may indicate this to GCC by using this macro to modify
     `fixed_regs' and `call_used_regs' to 1 for each of the registers
     in the classes which should not be used by GCC.  Also define the
     macro `REG_CLASS_FROM_LETTER' / `REG_CLASS_FROM_CONSTRAINT' to
     return `NO_REGS' if it is called with a letter for a class that
     shouldn't be used.

     (However, if this class is not included in `GENERAL_REGS' and all
     of the insn patterns whose constraints permit this class are
     controlled by target switches, then GCC will automatically avoid
     using these registers when the target switches are opposed to
     them.)

 -- Macro: INCOMING_REGNO (OUT)
     Define this macro if the target machine has register windows.
     This C expression returns the register number as seen by the
     called function corresponding to the register number OUT as seen
     by the calling function.  Return OUT if register number OUT is not
     an outbound register.

 -- Macro: OUTGOING_REGNO (IN)
     Define this macro if the target machine has register windows.
     This C expression returns the register number as seen by the
     calling function corresponding to the register number IN as seen
     by the called function.  Return IN if register number IN is not an
     inbound register.

 -- Macro: LOCAL_REGNO (REGNO)
     Define this macro if the target machine has register windows.
     This C expression returns true if the register is call-saved but
     is in the register window.  Unlike most call-saved registers, such
     registers need not be explicitly restored on function exit or
     during non-local gotos.

 -- Macro: PC_REGNUM
     If the program counter has a register number, define this as that
     register number.  Otherwise, do not define it.


File: gccint.info,  Node: Allocation Order,  Next: Values in Registers,  Prev: Register Basics,  Up: Registers

17.7.2 Order of Allocation of Registers
---------------------------------------

Registers are allocated in order.

 -- Macro: REG_ALLOC_ORDER
     If defined, an initializer for a vector of integers, containing the
     numbers of hard registers in the order in which GCC should prefer
     to use them (from most preferred to least).

     If this macro is not defined, registers are used lowest numbered
     first (all else being equal).

     One use of this macro is on machines where the highest numbered
     registers must always be saved and the save-multiple-registers
     instruction supports only sequences of consecutive registers.  On
     such machines, define `REG_ALLOC_ORDER' to be an initializer that
     lists the highest numbered allocable register first.

 -- Macro: ADJUST_REG_ALLOC_ORDER
     A C statement (sans semicolon) to choose the order in which to
     allocate hard registers for pseudo-registers local to a basic
     block.

     Store the desired register order in the array `reg_alloc_order'.
     Element 0 should be the register to allocate first; element 1, the
     next register; and so on.

     The macro body should not assume anything about the contents of
     `reg_alloc_order' before execution of the macro.

     On most machines, it is not necessary to define this macro.

 -- Macro: HONOR_REG_ALLOC_ORDER
     Normally, IRA tries to estimate the costs for saving a register in
     the prologue and restoring it in the epilogue.  This discourages
     it from using call-saved registers.  If a machine wants to ensure
     that IRA allocates registers in the order given by REG_ALLOC_ORDER
     even if some call-saved registers appear earlier than call-used
     ones, this macro should be defined.

 -- Macro: IRA_HARD_REGNO_ADD_COST_MULTIPLIER (REGNO)
     In some case register allocation order is not enough for the
     Integrated Register Allocator (IRA) to generate a good code.  If
     this macro is defined, it should return a floating point value
     based on REGNO.  The cost of using REGNO for a pseudo will be
     increased by approximately the pseudo's usage frequency times the
     value returned by this macro.  Not defining this macro is
     equivalent to having it always return `0.0'.

     On most machines, it is not necessary to define this macro.


File: gccint.info,  Node: Values in Registers,  Next: Leaf Functions,  Prev: Allocation Order,  Up: Registers

17.7.3 How Values Fit in Registers
----------------------------------

This section discusses the macros that describe which kinds of values
(specifically, which machine modes) each register can hold, and how many
consecutive registers are needed for a given mode.

 -- Macro: HARD_REGNO_NREGS (REGNO, MODE)
     A C expression for the number of consecutive hard registers,
     starting at register number REGNO, required to hold a value of mode
     MODE.  This macro must never return zero, even if a register
     cannot hold the requested mode - indicate that with
     HARD_REGNO_MODE_OK and/or CANNOT_CHANGE_MODE_CLASS instead.

     On a machine where all registers are exactly one word, a suitable
     definition of this macro is

          #define HARD_REGNO_NREGS(REGNO, MODE)            \
             ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1)  \
              / UNITS_PER_WORD)

 -- Macro: HARD_REGNO_NREGS_HAS_PADDING (REGNO, MODE)
     A C expression that is nonzero if a value of mode MODE, stored in
     memory, ends with padding that causes it to take up more space than
     in registers starting at register number REGNO (as determined by
     multiplying GCC's notion of the size of the register when
     containing this mode by the number of registers returned by
     `HARD_REGNO_NREGS').  By default this is zero.

     For example, if a floating-point value is stored in three 32-bit
     registers but takes up 128 bits in memory, then this would be
     nonzero.

     This macros only needs to be defined if there are cases where
     `subreg_get_info' would otherwise wrongly determine that a
     `subreg' can be represented by an offset to the register number,
     when in fact such a `subreg' would contain some of the padding not
     stored in registers and so not be representable.

 -- Macro: HARD_REGNO_NREGS_WITH_PADDING (REGNO, MODE)
     For values of REGNO and MODE for which
     `HARD_REGNO_NREGS_HAS_PADDING' returns nonzero, a C expression
     returning the greater number of registers required to hold the
     value including any padding.  In the example above, the value
     would be four.

 -- Macro: REGMODE_NATURAL_SIZE (MODE)
     Define this macro if the natural size of registers that hold values
     of mode MODE is not the word size.  It is a C expression that
     should give the natural size in bytes for the specified mode.  It
     is used by the register allocator to try to optimize its results.
     This happens for example on SPARC 64-bit where the natural size of
     floating-point registers is still 32-bit.

 -- Macro: HARD_REGNO_MODE_OK (REGNO, MODE)
     A C expression that is nonzero if it is permissible to store a
     value of mode MODE in hard register number REGNO (or in several
     registers starting with that one).  For a machine where all
     registers are equivalent, a suitable definition is

          #define HARD_REGNO_MODE_OK(REGNO, MODE) 1

     You need not include code to check for the numbers of fixed
     registers, because the allocation mechanism considers them to be
     always occupied.

     On some machines, double-precision values must be kept in even/odd
     register pairs.  You can implement that by defining this macro to
     reject odd register numbers for such modes.

     The minimum requirement for a mode to be OK in a register is that
     the `movMODE' instruction pattern support moves between the
     register and other hard register in the same class and that moving
     a value into the register and back out not alter it.

     Since the same instruction used to move `word_mode' will work for
     all narrower integer modes, it is not necessary on any machine for
     `HARD_REGNO_MODE_OK' to distinguish between these modes, provided
     you define patterns `movhi', etc., to take advantage of this.  This
     is useful because of the interaction between `HARD_REGNO_MODE_OK'
     and `MODES_TIEABLE_P'; it is very desirable for all integer modes
     to be tieable.

     Many machines have special registers for floating point arithmetic.
     Often people assume that floating point machine modes are allowed
     only in floating point registers.  This is not true.  Any
     registers that can hold integers can safely _hold_ a floating
     point machine mode, whether or not floating arithmetic can be done
     on it in those registers.  Integer move instructions can be used
     to move the values.

     On some machines, though, the converse is true: fixed-point machine
     modes may not go in floating registers.  This is true if the
     floating registers normalize any value stored in them, because
     storing a non-floating value there would garble it.  In this case,
     `HARD_REGNO_MODE_OK' should reject fixed-point machine modes in
     floating registers.  But if the floating registers do not
     automatically normalize, if you can store any bit pattern in one
     and retrieve it unchanged without a trap, then any machine mode
     may go in a floating register, so you can define this macro to say
     so.

     The primary significance of special floating registers is rather
     that they are the registers acceptable in floating point arithmetic
     instructions.  However, this is of no concern to
     `HARD_REGNO_MODE_OK'.  You handle it by writing the proper
     constraints for those instructions.

     On some machines, the floating registers are especially slow to
     access, so that it is better to store a value in a stack frame
     than in such a register if floating point arithmetic is not being
     done.  As long as the floating registers are not in class
     `GENERAL_REGS', they will not be used unless some pattern's
     constraint asks for one.

 -- Macro: HARD_REGNO_RENAME_OK (FROM, TO)
     A C expression that is nonzero if it is OK to rename a hard
     register FROM to another hard register TO.

     One common use of this macro is to prevent renaming of a register
     to another register that is not saved by a prologue in an interrupt
     handler.

     The default is always nonzero.

 -- Macro: MODES_TIEABLE_P (MODE1, MODE2)
     A C expression that is nonzero if a value of mode MODE1 is
     accessible in mode MODE2 without copying.

     If `HARD_REGNO_MODE_OK (R, MODE1)' and `HARD_REGNO_MODE_OK (R,
     MODE2)' are always the same for any R, then `MODES_TIEABLE_P
     (MODE1, MODE2)' should be nonzero.  If they differ for any R, you
     should define this macro to return zero unless some other
     mechanism ensures the accessibility of the value in a narrower
     mode.

     You should define this macro to return nonzero in as many cases as
     possible since doing so will allow GCC to perform better register
     allocation.

 -- Target Hook: bool TARGET_HARD_REGNO_SCRATCH_OK (unsigned int REGNO)
     This target hook should return `true' if it is OK to use a hard
     register REGNO as scratch reg in peephole2.

     One common use of this macro is to prevent using of a register that
     is not saved by a prologue in an interrupt handler.

     The default version of this hook always returns `true'.

 -- Macro: AVOID_CCMODE_COPIES
     Define this macro if the compiler should avoid copies to/from
     `CCmode' registers.  You should only define this macro if support
     for copying to/from `CCmode' is incomplete.


File: gccint.info,  Node: Leaf Functions,  Next: Stack Registers,  Prev: Values in Registers,  Up: Registers

17.7.4 Handling Leaf Functions
------------------------------

On some machines, a leaf function (i.e., one which makes no calls) can
run more efficiently if it does not make its own register window.
Often this means it is required to receive its arguments in the
registers where they are passed by the caller, instead of the registers
where they would normally arrive.

 The special treatment for leaf functions generally applies only when
other conditions are met; for example, often they may use only those
registers for its own variables and temporaries.  We use the term "leaf
function" to mean a function that is suitable for this special
handling, so that functions with no calls are not necessarily "leaf
functions".

 GCC assigns register numbers before it knows whether the function is
suitable for leaf function treatment.  So it needs to renumber the
registers in order to output a leaf function.  The following macros
accomplish this.

 -- Macro: LEAF_REGISTERS
     Name of a char vector, indexed by hard register number, which
     contains 1 for a register that is allowable in a candidate for leaf
     function treatment.

     If leaf function treatment involves renumbering the registers,
     then the registers marked here should be the ones before
     renumbering--those that GCC would ordinarily allocate.  The
     registers which will actually be used in the assembler code, after
     renumbering, should not be marked with 1 in this vector.

     Define this macro only if the target machine offers a way to
     optimize the treatment of leaf functions.

 -- Macro: LEAF_REG_REMAP (REGNO)
     A C expression whose value is the register number to which REGNO
     should be renumbered, when a function is treated as a leaf
     function.

     If REGNO is a register number which should not appear in a leaf
     function before renumbering, then the expression should yield -1,
     which will cause the compiler to abort.

     Define this macro only if the target machine offers a way to
     optimize the treatment of leaf functions, and registers need to be
     renumbered to do this.

 `TARGET_ASM_FUNCTION_PROLOGUE' and `TARGET_ASM_FUNCTION_EPILOGUE' must
usually treat leaf functions specially.  They can test the C variable
`current_function_is_leaf' which is nonzero for leaf functions.
`current_function_is_leaf' is set prior to local register allocation
and is valid for the remaining compiler passes.  They can also test the
C variable `current_function_uses_only_leaf_regs' which is nonzero for
leaf functions which only use leaf registers.
`current_function_uses_only_leaf_regs' is valid after all passes that
modify the instructions have been run and is only useful if
`LEAF_REGISTERS' is defined.


File: gccint.info,  Node: Stack Registers,  Prev: Leaf Functions,  Up: Registers

17.7.5 Registers That Form a Stack
----------------------------------

There are special features to handle computers where some of the
"registers" form a stack.  Stack registers are normally written by
pushing onto the stack, and are numbered relative to the top of the
stack.

 Currently, GCC can only handle one group of stack-like registers, and
they must be consecutively numbered.  Furthermore, the existing support
for stack-like registers is specific to the 80387 floating point
coprocessor.  If you have a new architecture that uses stack-like
registers, you will need to do substantial work on `reg-stack.c' and
write your machine description to cooperate with it, as well as
defining these macros.

 -- Macro: STACK_REGS
     Define this if the machine has any stack-like registers.

 -- Macro: STACK_REG_COVER_CLASS
     This is a cover class containing the stack registers.  Define this
     if the machine has any stack-like registers.

 -- Macro: FIRST_STACK_REG
     The number of the first stack-like register.  This one is the top
     of the stack.

 -- Macro: LAST_STACK_REG
     The number of the last stack-like register.  This one is the
     bottom of the stack.


File: gccint.info,  Node: Register Classes,  Next: Old Constraints,  Prev: Registers,  Up: Target Macros

17.8 Register Classes
=====================

On many machines, the numbered registers are not all equivalent.  For
example, certain registers may not be allowed for indexed addressing;
certain registers may not be allowed in some instructions.  These
machine restrictions are described to the compiler using "register
classes".

 You define a number of register classes, giving each one a name and
saying which of the registers belong to it.  Then you can specify
register classes that are allowed as operands to particular instruction
patterns.

 In general, each register will belong to several classes.  In fact, one
class must be named `ALL_REGS' and contain all the registers.  Another
class must be named `NO_REGS' and contain no registers.  Often the
union of two classes will be another class; however, this is not
required.

 One of the classes must be named `GENERAL_REGS'.  There is nothing
terribly special about the name, but the operand constraint letters `r'
and `g' specify this class.  If `GENERAL_REGS' is the same as
`ALL_REGS', just define it as a macro which expands to `ALL_REGS'.

 Order the classes so that if class X is contained in class Y then X
has a lower class number than Y.

 The way classes other than `GENERAL_REGS' are specified in operand
constraints is through machine-dependent operand constraint letters.
You can define such letters to correspond to various classes, then use
them in operand constraints.

 You must define the narrowest register classes for allocatable
registers, so that each class either has no subclasses, or that for
some mode, the move cost between registers within the class is cheaper
than moving a register in the class to or from memory (*note Costs::).

 You should define a class for the union of two classes whenever some
instruction allows both classes.  For example, if an instruction allows
either a floating point (coprocessor) register or a general register
for a certain operand, you should define a class `FLOAT_OR_GENERAL_REGS'
which includes both of them.  Otherwise you will get suboptimal code,
or even internal compiler errors when reload cannot find a register in
the class computed via `reg_class_subunion'.

 You must also specify certain redundant information about the register
classes: for each class, which classes contain it and which ones are
contained in it; for each pair of classes, the largest class contained
in their union.

 When a value occupying several consecutive registers is expected in a
certain class, all the registers used must belong to that class.
Therefore, register classes cannot be used to enforce a requirement for
a register pair to start with an even-numbered register.  The way to
specify this requirement is with `HARD_REGNO_MODE_OK'.

 Register classes used for input-operands of bitwise-and or shift
instructions have a special requirement: each such class must have, for
each fixed-point machine mode, a subclass whose registers can transfer
that mode to or from memory.  For example, on some machines, the
operations for single-byte values (`QImode') are limited to certain
registers.  When this is so, each register class that is used in a
bitwise-and or shift instruction must have a subclass consisting of
registers from which single-byte values can be loaded or stored.  This
is so that `PREFERRED_RELOAD_CLASS' can always have a possible value to
return.

 -- Data type: enum reg_class
     An enumerated type that must be defined with all the register
     class names as enumerated values.  `NO_REGS' must be first.
     `ALL_REGS' must be the last register class, followed by one more
     enumerated value, `LIM_REG_CLASSES', which is not a register class
     but rather tells how many classes there are.

     Each register class has a number, which is the value of casting
     the class name to type `int'.  The number serves as an index in
     many of the tables described below.

 -- Macro: N_REG_CLASSES
     The number of distinct register classes, defined as follows:

          #define N_REG_CLASSES (int) LIM_REG_CLASSES

 -- Macro: REG_CLASS_NAMES
     An initializer containing the names of the register classes as C
     string constants.  These names are used in writing some of the
     debugging dumps.

 -- Macro: REG_CLASS_CONTENTS
     An initializer containing the contents of the register classes, as
     integers which are bit masks.  The Nth integer specifies the
     contents of class N.  The way the integer MASK is interpreted is
     that register R is in the class if `MASK & (1 << R)' is 1.

     When the machine has more than 32 registers, an integer does not
     suffice.  Then the integers are replaced by sub-initializers,
     braced groupings containing several integers.  Each
     sub-initializer must be suitable as an initializer for the type
     `HARD_REG_SET' which is defined in `hard-reg-set.h'.  In this
     situation, the first integer in each sub-initializer corresponds to
     registers 0 through 31, the second integer to registers 32 through
     63, and so on.

 -- Macro: REGNO_REG_CLASS (REGNO)
     A C expression whose value is a register class containing hard
     register REGNO.  In general there is more than one such class;
     choose a class which is "minimal", meaning that no smaller class
     also contains the register.

 -- Macro: BASE_REG_CLASS
     A macro whose definition is the name of the class to which a valid
     base register must belong.  A base register is one used in an
     address which is the register value plus a displacement.

 -- Macro: MODE_BASE_REG_CLASS (MODE)
     This is a variation of the `BASE_REG_CLASS' macro which allows the
     selection of a base register in a mode dependent manner.  If MODE
     is VOIDmode then it should return the same value as
     `BASE_REG_CLASS'.

 -- Macro: MODE_BASE_REG_REG_CLASS (MODE)
     A C expression whose value is the register class to which a valid
     base register must belong in order to be used in a base plus index
     register address.  You should define this macro if base plus index
     addresses have different requirements than other base register
     uses.

 -- Macro: MODE_CODE_BASE_REG_CLASS (MODE, ADDRESS_SPACE, OUTER_CODE,
          INDEX_CODE)
     A C expression whose value is the register class to which a valid
     base register for a memory reference in mode MODE to address space
     ADDRESS_SPACE must belong.  OUTER_CODE and INDEX_CODE define the
     context in which the base register occurs.  OUTER_CODE is the code
     of the immediately enclosing expression (`MEM' for the top level
     of an address, `ADDRESS' for something that occurs in an
     `address_operand').  INDEX_CODE is the code of the corresponding
     index expression if OUTER_CODE is `PLUS'; `SCRATCH' otherwise.

 -- Macro: INDEX_REG_CLASS
     A macro whose definition is the name of the class to which a valid
     index register must belong.  An index register is one used in an
     address where its value is either multiplied by a scale factor or
     added to another register (as well as added to a displacement).

 -- Macro: REGNO_OK_FOR_BASE_P (NUM)
     A C expression which is nonzero if register number NUM is suitable
     for use as a base register in operand addresses.

 -- Macro: REGNO_MODE_OK_FOR_BASE_P (NUM, MODE)
     A C expression that is just like `REGNO_OK_FOR_BASE_P', except that
     that expression may examine the mode of the memory reference in
     MODE.  You should define this macro if the mode of the memory
     reference affects whether a register may be used as a base
     register.  If you define this macro, the compiler will use it
     instead of `REGNO_OK_FOR_BASE_P'.  The mode may be `VOIDmode' for
     addresses that appear outside a `MEM', i.e., as an
     `address_operand'.

 -- Macro: REGNO_MODE_OK_FOR_REG_BASE_P (NUM, MODE)
     A C expression which is nonzero if register number NUM is suitable
     for use as a base register in base plus index operand addresses,
     accessing memory in mode MODE.  It may be either a suitable hard
     register or a pseudo register that has been allocated such a hard
     register.  You should define this macro if base plus index
     addresses have different requirements than other base register
     uses.

     Use of this macro is deprecated; please use the more general
     `REGNO_MODE_CODE_OK_FOR_BASE_P'.

 -- Macro: REGNO_MODE_CODE_OK_FOR_BASE_P (NUM, MODE, ADDRESS_SPACE,
          OUTER_CODE, INDEX_CODE)
     A C expression which is nonzero if register number NUM is suitable
     for use as a base register in operand addresses, accessing memory
     in mode MODE in address space ADDRESS_SPACE.  This is similar to
     `REGNO_MODE_OK_FOR_BASE_P', except that that expression may
     examine the context in which the register appears in the memory
     reference.  OUTER_CODE is the code of the immediately enclosing
     expression (`MEM' if at the top level of the address, `ADDRESS'
     for something that occurs in an `address_operand').  INDEX_CODE is
     the code of the corresponding index expression if OUTER_CODE is
     `PLUS'; `SCRATCH' otherwise.  The mode may be `VOIDmode' for
     addresses that appear outside a `MEM', i.e., as an
     `address_operand'.

 -- Macro: REGNO_OK_FOR_INDEX_P (NUM)
     A C expression which is nonzero if register number NUM is suitable
     for use as an index register in operand addresses.  It may be
     either a suitable hard register or a pseudo register that has been
     allocated such a hard register.

     The difference between an index register and a base register is
     that the index register may be scaled.  If an address involves the
     sum of two registers, neither one of them scaled, then either one
     may be labeled the "base" and the other the "index"; but whichever
     labeling is used must fit the machine's constraints of which
     registers may serve in each capacity.  The compiler will try both
     labelings, looking for one that is valid, and will reload one or
     both registers only if neither labeling works.

 -- Target Hook: reg_class_t TARGET_PREFERRED_RENAME_CLASS (reg_class_t
          RCLASS)
     A target hook that places additional preference on the register
     class to use when it is necessary to rename a register in class
     RCLASS to another class, or perhaps NO_REGS, if no preferred
     register class is found or hook `preferred_rename_class' is not
     implemented. Sometimes returning a more restrictive class makes
     better code.  For example, on ARM, thumb-2 instructions using
     `LO_REGS' may be smaller than instructions using `GENERIC_REGS'.
     By returning `LO_REGS' from `preferred_rename_class', code size
     can be reduced.

 -- Target Hook: reg_class_t TARGET_PREFERRED_RELOAD_CLASS (rtx X,
          reg_class_t RCLASS)
     A target hook that places additional restrictions on the register
     class to use when it is necessary to copy value X into a register
     in class RCLASS.  The value is a register class; perhaps RCLASS,
     or perhaps another, smaller class.

     The default version of this hook always returns value of `rclass'
     argument.

     Sometimes returning a more restrictive class makes better code.
     For example, on the 68000, when X is an integer constant that is
     in range for a `moveq' instruction, the value of this macro is
     always `DATA_REGS' as long as RCLASS includes the data registers.
     Requiring a data register guarantees that a `moveq' will be used.

     One case where `TARGET_PREFERRED_RELOAD_CLASS' must not return
     RCLASS is if X is a legitimate constant which cannot be loaded
     into some register class.  By returning `NO_REGS' you can force X
     into a memory location.  For example, rs6000 can load immediate
     values into general-purpose registers, but does not have an
     instruction for loading an immediate value into a floating-point
     register, so `TARGET_PREFERRED_RELOAD_CLASS' returns `NO_REGS' when
     X is a floating-point constant.  If the constant can't be loaded
     into any kind of register, code generation will be better if
     `TARGET_LEGITIMATE_CONSTANT_P' makes the constant illegitimate
     instead of using `TARGET_PREFERRED_RELOAD_CLASS'.

     If an insn has pseudos in it after register allocation, reload
     will go through the alternatives and call repeatedly
     `TARGET_PREFERRED_RELOAD_CLASS' to find the best one.  Returning
     `NO_REGS', in this case, makes reload add a `!' in front of the
     constraint: the x86 back-end uses this feature to discourage usage
     of 387 registers when math is done in the SSE registers (and vice
     versa).

 -- Macro: PREFERRED_RELOAD_CLASS (X, CLASS)
     A C expression that places additional restrictions on the register
     class to use when it is necessary to copy value X into a register
     in class CLASS.  The value is a register class; perhaps CLASS, or
     perhaps another, smaller class.  On many machines, the following
     definition is safe:

          #define PREFERRED_RELOAD_CLASS(X,CLASS) CLASS

     Sometimes returning a more restrictive class makes better code.
     For example, on the 68000, when X is an integer constant that is
     in range for a `moveq' instruction, the value of this macro is
     always `DATA_REGS' as long as CLASS includes the data registers.
     Requiring a data register guarantees that a `moveq' will be used.

     One case where `PREFERRED_RELOAD_CLASS' must not return CLASS is
     if X is a legitimate constant which cannot be loaded into some
     register class.  By returning `NO_REGS' you can force X into a
     memory location.  For example, rs6000 can load immediate values
     into general-purpose registers, but does not have an instruction
     for loading an immediate value into a floating-point register, so
     `PREFERRED_RELOAD_CLASS' returns `NO_REGS' when X is a
     floating-point constant.  If the constant can't be loaded into any
     kind of register, code generation will be better if
     `TARGET_LEGITIMATE_CONSTANT_P' makes the constant illegitimate
     instead of using `TARGET_PREFERRED_RELOAD_CLASS'.

     If an insn has pseudos in it after register allocation, reload
     will go through the alternatives and call repeatedly
     `PREFERRED_RELOAD_CLASS' to find the best one.  Returning
     `NO_REGS', in this case, makes reload add a `!' in front of the
     constraint: the x86 back-end uses this feature to discourage usage
     of 387 registers when math is done in the SSE registers (and vice
     versa).

 -- Target Hook: reg_class_t TARGET_PREFERRED_OUTPUT_RELOAD_CLASS (rtx
          X, reg_class_t RCLASS)
     Like `TARGET_PREFERRED_RELOAD_CLASS', but for output reloads
     instead of input reloads.

     The default version of this hook always returns value of `rclass'
     argument.

     You can also use `TARGET_PREFERRED_OUTPUT_RELOAD_CLASS' to
     discourage reload from using some alternatives, like
     `TARGET_PREFERRED_RELOAD_CLASS'.

 -- Macro: LIMIT_RELOAD_CLASS (MODE, CLASS)
     A C expression that places additional restrictions on the register
     class to use when it is necessary to be able to hold a value of
     mode MODE in a reload register for which class CLASS would
     ordinarily be used.

     Unlike `PREFERRED_RELOAD_CLASS', this macro should be used when
     there are certain modes that simply can't go in certain reload
     classes.

     The value is a register class; perhaps CLASS, or perhaps another,
     smaller class.

     Don't define this macro unless the target machine has limitations
     which require the macro to do something nontrivial.

 -- Target Hook: reg_class_t TARGET_SECONDARY_RELOAD (bool IN_P, rtx X,
          reg_class_t RELOAD_CLASS, enum machine_mode RELOAD_MODE,
          secondary_reload_info *SRI)
     Many machines have some registers that cannot be copied directly
     to or from memory or even from other types of registers.  An
     example is the `MQ' register, which on most machines, can only be
     copied to or from general registers, but not memory.  Below, we
     shall be using the term 'intermediate register' when a move
     operation cannot be performed directly, but has to be done by
     copying the source into the intermediate register first, and then
     copying the intermediate register to the destination.  An
     intermediate register always has the same mode as source and
     destination.  Since it holds the actual value being copied, reload
     might apply optimizations to re-use an intermediate register and
     eliding the copy from the source when it can determine that the
     intermediate register still holds the required value.

     Another kind of secondary reload is required on some machines which
     allow copying all registers to and from memory, but require a
     scratch register for stores to some memory locations (e.g., those
     with symbolic address on the RT, and those with certain symbolic
     address on the SPARC when compiling PIC).  Scratch registers need
     not have the same mode as the value being copied, and usually hold
     a different value than that being copied.  Special patterns in the
     md file are needed to describe how the copy is performed with the
     help of the scratch register; these patterns also describe the
     number, register class(es) and mode(s) of the scratch register(s).

     In some cases, both an intermediate and a scratch register are
     required.

     For input reloads, this target hook is called with nonzero IN_P,
     and X is an rtx that needs to be copied to a register of class
     RELOAD_CLASS in RELOAD_MODE.  For output reloads, this target hook
     is called with zero IN_P, and a register of class RELOAD_CLASS
     needs to be copied to rtx X in RELOAD_MODE.

     If copying a register of RELOAD_CLASS from/to X requires an
     intermediate register, the hook `secondary_reload' should return
     the register class required for this intermediate register.  If no
     intermediate register is required, it should return NO_REGS.  If
     more than one intermediate register is required, describe the one
     that is closest in the copy chain to the reload register.

     If scratch registers are needed, you also have to describe how to
     perform the copy from/to the reload register to/from this closest
     intermediate register.  Or if no intermediate register is
     required, but still a scratch register is needed, describe the
     copy  from/to the reload register to/from the reload operand X.

     You do this by setting `sri->icode' to the instruction code of a
     pattern in the md file which performs the move.  Operands 0 and 1
     are the output and input of this copy, respectively.  Operands
     from operand 2 onward are for scratch operands.  These scratch
     operands must have a mode, and a single-register-class output
     constraint.

     When an intermediate register is used, the `secondary_reload' hook
     will be called again to determine how to copy the intermediate
     register to/from the reload operand X, so your hook must also have
     code to handle the register class of the intermediate operand.

     X might be a pseudo-register or a `subreg' of a pseudo-register,
     which could either be in a hard register or in memory.  Use
     `true_regnum' to find out; it will return -1 if the pseudo is in
     memory and the hard register number if it is in a register.

     Scratch operands in memory (constraint `"=m"' / `"=&m"') are
     currently not supported.  For the time being, you will have to
     continue to use `SECONDARY_MEMORY_NEEDED' for that purpose.

     `copy_cost' also uses this target hook to find out how values are
     copied.  If you want it to include some extra cost for the need to
     allocate (a) scratch register(s), set `sri->extra_cost' to the
     additional cost.  Or if two dependent moves are supposed to have a
     lower cost than the sum of the individual moves due to expected
     fortuitous scheduling and/or special forwarding logic, you can set
     `sri->extra_cost' to a negative amount.

 -- Macro: SECONDARY_RELOAD_CLASS (CLASS, MODE, X)
 -- Macro: SECONDARY_INPUT_RELOAD_CLASS (CLASS, MODE, X)
 -- Macro: SECONDARY_OUTPUT_RELOAD_CLASS (CLASS, MODE, X)
     These macros are obsolete, new ports should use the target hook
     `TARGET_SECONDARY_RELOAD' instead.

     These are obsolete macros, replaced by the
     `TARGET_SECONDARY_RELOAD' target hook.  Older ports still define
     these macros to indicate to the reload phase that it may need to
     allocate at least one register for a reload in addition to the
     register to contain the data.  Specifically, if copying X to a
     register CLASS in MODE requires an intermediate register, you were
     supposed to define `SECONDARY_INPUT_RELOAD_CLASS' to return the
     largest register class all of whose registers can be used as
     intermediate registers or scratch registers.

     If copying a register CLASS in MODE to X requires an intermediate
     or scratch register, `SECONDARY_OUTPUT_RELOAD_CLASS' was supposed
     to be defined be defined to return the largest register class
     required.  If the requirements for input and output reloads were
     the same, the macro `SECONDARY_RELOAD_CLASS' should have been used
     instead of defining both macros identically.

     The values returned by these macros are often `GENERAL_REGS'.
     Return `NO_REGS' if no spare register is needed; i.e., if X can be
     directly copied to or from a register of CLASS in MODE without
     requiring a scratch register.  Do not define this macro if it
     would always return `NO_REGS'.

     If a scratch register is required (either with or without an
     intermediate register), you were supposed to define patterns for
     `reload_inM' or `reload_outM', as required (*note Standard
     Names::.  These patterns, which were normally implemented with a
     `define_expand', should be similar to the `movM' patterns, except
     that operand 2 is the scratch register.

     These patterns need constraints for the reload register and scratch
     register that contain a single register class.  If the original
     reload register (whose class is CLASS) can meet the constraint
     given in the pattern, the value returned by these macros is used
     for the class of the scratch register.  Otherwise, two additional
     reload registers are required.  Their classes are obtained from
     the constraints in the insn pattern.

     X might be a pseudo-register or a `subreg' of a pseudo-register,
     which could either be in a hard register or in memory.  Use
     `true_regnum' to find out; it will return -1 if the pseudo is in
     memory and the hard register number if it is in a register.

     These macros should not be used in the case where a particular
     class of registers can only be copied to memory and not to another
     class of registers.  In that case, secondary reload registers are
     not needed and would not be helpful.  Instead, a stack location
     must be used to perform the copy and the `movM' pattern should use
     memory as an intermediate storage.  This case often occurs between
     floating-point and general registers.

 -- Macro: SECONDARY_MEMORY_NEEDED (CLASS1, CLASS2, M)
     Certain machines have the property that some registers cannot be
     copied to some other registers without using memory.  Define this
     macro on those machines to be a C expression that is nonzero if
     objects of mode M in registers of CLASS1 can only be copied to
     registers of class CLASS2 by storing a register of CLASS1 into
     memory and loading that memory location into a register of CLASS2.

     Do not define this macro if its value would always be zero.

 -- Macro: SECONDARY_MEMORY_NEEDED_RTX (MODE)
     Normally when `SECONDARY_MEMORY_NEEDED' is defined, the compiler
     allocates a stack slot for a memory location needed for register
     copies.  If this macro is defined, the compiler instead uses the
     memory location defined by this macro.

     Do not define this macro if you do not define
     `SECONDARY_MEMORY_NEEDED'.

 -- Macro: SECONDARY_MEMORY_NEEDED_MODE (MODE)
     When the compiler needs a secondary memory location to copy
     between two registers of mode MODE, it normally allocates
     sufficient memory to hold a quantity of `BITS_PER_WORD' bits and
     performs the store and load operations in a mode that many bits
     wide and whose class is the same as that of MODE.

     This is right thing to do on most machines because it ensures that
     all bits of the register are copied and prevents accesses to the
     registers in a narrower mode, which some machines prohibit for
     floating-point registers.

     However, this default behavior is not correct on some machines,
     such as the DEC Alpha, that store short integers in floating-point
     registers differently than in integer registers.  On those
     machines, the default widening will not work correctly and you
     must define this macro to suppress that widening in some cases.
     See the file `alpha.h' for details.

     Do not define this macro if you do not define
     `SECONDARY_MEMORY_NEEDED' or if widening MODE to a mode that is
     `BITS_PER_WORD' bits wide is correct for your machine.

 -- Target Hook: bool TARGET_CLASS_LIKELY_SPILLED_P (reg_class_t RCLASS)
     A target hook which returns `true' if pseudos that have been
     assigned to registers of class RCLASS would likely be spilled
     because registers of RCLASS are needed for spill registers.

     The default version of this target hook returns `true' if RCLASS
     has exactly one register and `false' otherwise.  On most machines,
     this default should be used.  For generally register-starved
     machines, such as i386, or machines with right register
     constraints, such as SH, this hook can be used to avoid excessive
     spilling.

     This hook is also used by some of the global intra-procedural code
     transformations to throtle code motion, to avoid increasing
     register pressure.

 -- Target Hook: unsigned char TARGET_CLASS_MAX_NREGS (reg_class_t
          RCLASS, enum machine_mode MODE)
     A target hook returns the maximum number of consecutive registers
     of class RCLASS needed to hold a value of mode MODE.

     This is closely related to the macro `HARD_REGNO_NREGS'.  In fact,
     the value returned by `TARGET_CLASS_MAX_NREGS (RCLASS, MODE)'
     target hook should be the maximum value of `HARD_REGNO_NREGS
     (REGNO, MODE)' for all REGNO values in the class RCLASS.

     This target hook helps control the handling of multiple-word values
     in the reload pass.

     The default version of this target hook returns the size of MODE
     in words.

 -- Macro: CLASS_MAX_NREGS (CLASS, MODE)
     A C expression for the maximum number of consecutive registers of
     class CLASS needed to hold a value of mode MODE.

     This is closely related to the macro `HARD_REGNO_NREGS'.  In fact,
     the value of the macro `CLASS_MAX_NREGS (CLASS, MODE)' should be
     the maximum value of `HARD_REGNO_NREGS (REGNO, MODE)' for all
     REGNO values in the class CLASS.

     This macro helps control the handling of multiple-word values in
     the reload pass.

 -- Macro: CANNOT_CHANGE_MODE_CLASS (FROM, TO, CLASS)
     If defined, a C expression that returns nonzero for a CLASS for
     which a change from mode FROM to mode TO is invalid.

     For the example, loading 32-bit integer or floating-point objects
     into floating-point registers on the Alpha extends them to 64 bits.
     Therefore loading a 64-bit object and then storing it as a 32-bit
     object does not store the low-order 32 bits, as would be the case
     for a normal register.  Therefore, `alpha.h' defines
     `CANNOT_CHANGE_MODE_CLASS' as below:

          #define CANNOT_CHANGE_MODE_CLASS(FROM, TO, CLASS) \
            (GET_MODE_SIZE (FROM) != GET_MODE_SIZE (TO) \
             ? reg_classes_intersect_p (FLOAT_REGS, (CLASS)) : 0)

 -- Target Hook: bool TARGET_LRA_P (void)
     A target hook which returns true if we use LRA instead of reload
     pass.  It means that LRA was ported to the target.    The default
     version of this target hook returns always false.

 -- Target Hook: int TARGET_REGISTER_PRIORITY (int)
     A target hook which returns the register priority number to which
     the  register HARD_REGNO belongs to.  The bigger the number, the
     more preferable the hard register usage (when all other conditions
     are  the same).  This hook can be used to prefer some hard
     register over  others in LRA.  For example, some x86-64 register
     usage needs  additional prefix which makes instructions longer.
     The hook can  return lower priority number for such registers make
     them less favorable  and as result making the generated code
     smaller.    The default version of this target hook returns always
     zero.

 -- Target Hook: bool TARGET_DIFFERENT_ADDR_DISPLACEMENT_P (void)
     A target hook which returns true if an address with the same
     structure  can have different maximal legitimate displacement.
     For example, the  displacement can depend on memory mode or on
     operand combinations in  the insn.    The default version of this
     target hook returns always false.

 -- Target Hook: reg_class_t TARGET_SPILL_CLASS (reg_class_t, enum
          MACHINE_MODE)
     This hook defines a class of registers which could be used for
     spilling  pseudos of the given mode and class, or `NO_REGS' if
     only memory  should be used.  Not defining this hook is equivalent
     to returning  `NO_REGS' for all inputs.


File: gccint.info,  Node: Old Constraints,  Next: Stack and Calling,  Prev: Register Classes,  Up: Target Macros

17.9 Obsolete Macros for Defining Constraints
=============================================

Machine-specific constraints can be defined with these macros instead
of the machine description constructs described in *note Define
Constraints::.  This mechanism is obsolete.  New ports should not use
it; old ports should convert to the new mechanism.

 -- Macro: CONSTRAINT_LEN (CHAR, STR)
     For the constraint at the start of STR, which starts with the
     letter C, return the length.  This allows you to have register
     class / constant / extra constraints that are longer than a single
     letter; you don't need to define this macro if you can do with
     single-letter constraints only.  The definition of this macro
     should use DEFAULT_CONSTRAINT_LEN for all the characters that you
     don't want to handle specially.  There are some sanity checks in
     genoutput.c that check the constraint lengths for the md file, so
     you can also use this macro to help you while you are
     transitioning from a byzantine single-letter-constraint scheme:
     when you return a negative length for a constraint you want to
     re-use, genoutput will complain about every instance where it is
     used in the md file.

 -- Macro: REG_CLASS_FROM_LETTER (CHAR)
     A C expression which defines the machine-dependent operand
     constraint letters for register classes.  If CHAR is such a
     letter, the value should be the register class corresponding to
     it.  Otherwise, the value should be `NO_REGS'.  The register
     letter `r', corresponding to class `GENERAL_REGS', will not be
     passed to this macro; you do not need to handle it.

 -- Macro: REG_CLASS_FROM_CONSTRAINT (CHAR, STR)
     Like `REG_CLASS_FROM_LETTER', but you also get the constraint
     string passed in STR, so that you can use suffixes to distinguish
     between different variants.

 -- Macro: CONST_OK_FOR_LETTER_P (VALUE, C)
     A C expression that defines the machine-dependent operand
     constraint letters (`I', `J', `K', ... `P') that specify
     particular ranges of integer values.  If C is one of those
     letters, the expression should check that VALUE, an integer, is in
     the appropriate range and return 1 if so, 0 otherwise.  If C is
     not one of those letters, the value should be 0 regardless of
     VALUE.

 -- Macro: CONST_OK_FOR_CONSTRAINT_P (VALUE, C, STR)
     Like `CONST_OK_FOR_LETTER_P', but you also get the constraint
     string passed in STR, so that you can use suffixes to distinguish
     between different variants.

 -- Macro: CONST_DOUBLE_OK_FOR_LETTER_P (VALUE, C)
     A C expression that defines the machine-dependent operand
     constraint letters that specify particular ranges of
     `const_double' values (`G' or `H').

     If C is one of those letters, the expression should check that
     VALUE, an RTX of code `const_double', is in the appropriate range
     and return 1 if so, 0 otherwise.  If C is not one of those
     letters, the value should be 0 regardless of VALUE.

     `const_double' is used for all floating-point constants and for
     `DImode' fixed-point constants.  A given letter can accept either
     or both kinds of values.  It can use `GET_MODE' to distinguish
     between these kinds.

 -- Macro: CONST_DOUBLE_OK_FOR_CONSTRAINT_P (VALUE, C, STR)
     Like `CONST_DOUBLE_OK_FOR_LETTER_P', but you also get the
     constraint string passed in STR, so that you can use suffixes to
     distinguish between different variants.

 -- Macro: EXTRA_CONSTRAINT (VALUE, C)
     A C expression that defines the optional machine-dependent
     constraint letters that can be used to segregate specific types of
     operands, usually memory references, for the target machine.  Any
     letter that is not elsewhere defined and not matched by
     `REG_CLASS_FROM_LETTER' / `REG_CLASS_FROM_CONSTRAINT' may be used.
     Normally this macro will not be defined.

     If it is required for a particular target machine, it should
     return 1 if VALUE corresponds to the operand type represented by
     the constraint letter C.  If C is not defined as an extra
     constraint, the value returned should be 0 regardless of VALUE.

     For example, on the ROMP, load instructions cannot have their
     output in r0 if the memory reference contains a symbolic address.
     Constraint letter `Q' is defined as representing a memory address
     that does _not_ contain a symbolic address.  An alternative is
     specified with a `Q' constraint on the input and `r' on the
     output.  The next alternative specifies `m' on the input and a
     register class that does not include r0 on the output.

 -- Macro: EXTRA_CONSTRAINT_STR (VALUE, C, STR)
     Like `EXTRA_CONSTRAINT', but you also get the constraint string
     passed in STR, so that you can use suffixes to distinguish between
     different variants.

 -- Macro: EXTRA_MEMORY_CONSTRAINT (C, STR)
     A C expression that defines the optional machine-dependent
     constraint letters, amongst those accepted by `EXTRA_CONSTRAINT',
     that should be treated like memory constraints by the reload pass.

     It should return 1 if the operand type represented by the
     constraint at the start of STR, the first letter of which is the
     letter C, comprises a subset of all memory references including
     all those whose address is simply a base register.  This allows
     the reload pass to reload an operand, if it does not directly
     correspond to the operand type of C, by copying its address into a
     base register.

     For example, on the S/390, some instructions do not accept
     arbitrary memory references, but only those that do not make use
     of an index register.  The constraint letter `Q' is defined via
     `EXTRA_CONSTRAINT' as representing a memory address of this type.
     If the letter `Q' is marked as `EXTRA_MEMORY_CONSTRAINT', a `Q'
     constraint can handle any memory operand, because the reload pass
     knows it can be reloaded by copying the memory address into a base
     register if required.  This is analogous to the way an `o'
     constraint can handle any memory operand.

 -- Macro: EXTRA_ADDRESS_CONSTRAINT (C, STR)
     A C expression that defines the optional machine-dependent
     constraint letters, amongst those accepted by `EXTRA_CONSTRAINT' /
     `EXTRA_CONSTRAINT_STR', that should be treated like address
     constraints by the reload pass.

     It should return 1 if the operand type represented by the
     constraint at the start of STR, which starts with the letter C,
     comprises a subset of all memory addresses including all those
     that consist of just a base register.  This allows the reload pass
     to reload an operand, if it does not directly correspond to the
     operand type of STR, by copying it into a base register.

     Any constraint marked as `EXTRA_ADDRESS_CONSTRAINT' can only be
     used with the `address_operand' predicate.  It is treated
     analogously to the `p' constraint.


File: gccint.info,  Node: Stack and Calling,  Next: Varargs,  Prev: Old Constraints,  Up: Target Macros

17.10 Stack Layout and Calling Conventions
==========================================

This describes the stack layout and calling conventions.

* Menu:

* Frame Layout::
* Exception Handling::
* Stack Checking::
* Frame Registers::
* Elimination::
* Stack Arguments::
* Register Arguments::
* Scalar Return::
* Aggregate Return::
* Caller Saves::
* Function Entry::
* Profiling::
* Tail Calls::
* Stack Smashing Protection::


File: gccint.info,  Node: Frame Layout,  Next: Exception Handling,  Up: Stack and Calling

17.10.1 Basic Stack Layout
--------------------------

Here is the basic stack layout.

 -- Macro: STACK_GROWS_DOWNWARD
     Define this macro if pushing a word onto the stack moves the stack
     pointer to a smaller address.

     When we say, "define this macro if ...", it means that the
     compiler checks this macro only with `#ifdef' so the precise
     definition used does not matter.

 -- Macro: STACK_PUSH_CODE
     This macro defines the operation used when something is pushed on
     the stack.  In RTL, a push operation will be `(set (mem
     (STACK_PUSH_CODE (reg sp))) ...)'

     The choices are `PRE_DEC', `POST_DEC', `PRE_INC', and `POST_INC'.
     Which of these is correct depends on the stack direction and on
     whether the stack pointer points to the last item on the stack or
     whether it points to the space for the next item on the stack.

     The default is `PRE_DEC' when `STACK_GROWS_DOWNWARD' is defined,
     which is almost always right, and `PRE_INC' otherwise, which is
     often wrong.

 -- Macro: FRAME_GROWS_DOWNWARD
     Define this macro to nonzero value if the addresses of local
     variable slots are at negative offsets from the frame pointer.

 -- Macro: ARGS_GROW_DOWNWARD
     Define this macro if successive arguments to a function occupy
     decreasing addresses on the stack.

 -- Macro: STARTING_FRAME_OFFSET
     Offset from the frame pointer to the first local variable slot to
     be allocated.

     If `FRAME_GROWS_DOWNWARD', find the next slot's offset by
     subtracting the first slot's length from `STARTING_FRAME_OFFSET'.
     Otherwise, it is found by adding the length of the first slot to
     the value `STARTING_FRAME_OFFSET'.

 -- Macro: STACK_ALIGNMENT_NEEDED
     Define to zero to disable final alignment of the stack during
     reload.  The nonzero default for this macro is suitable for most
     ports.

     On ports where `STARTING_FRAME_OFFSET' is nonzero or where there
     is a register save block following the local block that doesn't
     require alignment to `STACK_BOUNDARY', it may be beneficial to
     disable stack alignment and do it in the backend.

 -- Macro: STACK_POINTER_OFFSET
     Offset from the stack pointer register to the first location at
     which outgoing arguments are placed.  If not specified, the
     default value of zero is used.  This is the proper value for most
     machines.

     If `ARGS_GROW_DOWNWARD', this is the offset to the location above
     the first location at which outgoing arguments are placed.

 -- Macro: FIRST_PARM_OFFSET (FUNDECL)
     Offset from the argument pointer register to the first argument's
     address.  On some machines it may depend on the data type of the
     function.

     If `ARGS_GROW_DOWNWARD', this is the offset to the location above
     the first argument's address.

 -- Macro: STACK_DYNAMIC_OFFSET (FUNDECL)
     Offset from the stack pointer register to an item dynamically
     allocated on the stack, e.g., by `alloca'.

     The default value for this macro is `STACK_POINTER_OFFSET' plus the
     length of the outgoing arguments.  The default is correct for most
     machines.  See `function.c' for details.

 -- Macro: INITIAL_FRAME_ADDRESS_RTX
     A C expression whose value is RTL representing the address of the
     initial stack frame. This address is passed to `RETURN_ADDR_RTX'
     and `DYNAMIC_CHAIN_ADDRESS'.  If you don't define this macro, a
     reasonable default value will be used.  Define this macro in order
     to make frame pointer elimination work in the presence of
     `__builtin_frame_address (count)' and `__builtin_return_address
     (count)' for `count' not equal to zero.

 -- Macro: DYNAMIC_CHAIN_ADDRESS (FRAMEADDR)
     A C expression whose value is RTL representing the address in a
     stack frame where the pointer to the caller's frame is stored.
     Assume that FRAMEADDR is an RTL expression for the address of the
     stack frame itself.

     If you don't define this macro, the default is to return the value
     of FRAMEADDR--that is, the stack frame address is also the address
     of the stack word that points to the previous frame.

 -- Macro: SETUP_FRAME_ADDRESSES
     If defined, a C expression that produces the machine-specific code
     to setup the stack so that arbitrary frames can be accessed.  For
     example, on the SPARC, we must flush all of the register windows
     to the stack before we can access arbitrary stack frames.  You
     will seldom need to define this macro.

 -- Target Hook: rtx TARGET_BUILTIN_SETJMP_FRAME_VALUE (void)
     This target hook should return an rtx that is used to store the
     address of the current frame into the built in `setjmp' buffer.
     The default value, `virtual_stack_vars_rtx', is correct for most
     machines.  One reason you may need to define this target hook is if
     `hard_frame_pointer_rtx' is the appropriate value on your machine.

 -- Macro: FRAME_ADDR_RTX (FRAMEADDR)
     A C expression whose value is RTL representing the value of the
     frame address for the current frame.  FRAMEADDR is the frame
     pointer of the current frame.  This is used for
     __builtin_frame_address.  You need only define this macro if the
     frame address is not the same as the frame pointer.  Most machines
     do not need to define it.

 -- Macro: RETURN_ADDR_RTX (COUNT, FRAMEADDR)
     A C expression whose value is RTL representing the value of the
     return address for the frame COUNT steps up from the current
     frame, after the prologue.  FRAMEADDR is the frame pointer of the
     COUNT frame, or the frame pointer of the COUNT - 1 frame if
     `RETURN_ADDR_IN_PREVIOUS_FRAME' is defined.

     The value of the expression must always be the correct address when
     COUNT is zero, but may be `NULL_RTX' if there is no way to
     determine the return address of other frames.

 -- Macro: RETURN_ADDR_IN_PREVIOUS_FRAME
     Define this if the return address of a particular stack frame is
     accessed from the frame pointer of the previous stack frame.

 -- Macro: INCOMING_RETURN_ADDR_RTX
     A C expression whose value is RTL representing the location of the
     incoming return address at the beginning of any function, before
     the prologue.  This RTL is either a `REG', indicating that the
     return value is saved in `REG', or a `MEM' representing a location
     in the stack.

     You only need to define this macro if you want to support call
     frame debugging information like that provided by DWARF 2.

     If this RTL is a `REG', you should also define
     `DWARF_FRAME_RETURN_COLUMN' to `DWARF_FRAME_REGNUM (REGNO)'.

 -- Macro: DWARF_ALT_FRAME_RETURN_COLUMN
     A C expression whose value is an integer giving a DWARF 2 column
     number that may be used as an alternative return column.  The
     column must not correspond to any gcc hard register (that is, it
     must not be in the range of `DWARF_FRAME_REGNUM').

     This macro can be useful if `DWARF_FRAME_RETURN_COLUMN' is set to a
     general register, but an alternative column needs to be used for
     signal frames.  Some targets have also used different frame return
     columns over time.

 -- Macro: DWARF_ZERO_REG
     A C expression whose value is an integer giving a DWARF 2 register
     number that is considered to always have the value zero.  This
     should only be defined if the target has an architected zero
     register, and someone decided it was a good idea to use that
     register number to terminate the stack backtrace.  New ports
     should avoid this.

 -- Target Hook: void TARGET_DWARF_HANDLE_FRAME_UNSPEC (const char
          *LABEL, rtx PATTERN, int INDEX)
     This target hook allows the backend to emit frame-related insns
     that contain UNSPECs or UNSPEC_VOLATILEs.  The DWARF 2 call frame
     debugging info engine will invoke it on insns of the form
          (set (reg) (unspec [...] UNSPEC_INDEX))
     and
          (set (reg) (unspec_volatile [...] UNSPECV_INDEX)).
     to let the backend emit the call frame instructions.  LABEL is the
     CFI label attached to the insn, PATTERN is the pattern of the insn
     and INDEX is `UNSPEC_INDEX' or `UNSPECV_INDEX'.

 -- Macro: INCOMING_FRAME_SP_OFFSET
     A C expression whose value is an integer giving the offset, in
     bytes, from the value of the stack pointer register to the top of
     the stack frame at the beginning of any function, before the
     prologue.  The top of the frame is defined to be the value of the
     stack pointer in the previous frame, just before the call
     instruction.

     You only need to define this macro if you want to support call
     frame debugging information like that provided by DWARF 2.

 -- Macro: ARG_POINTER_CFA_OFFSET (FUNDECL)
     A C expression whose value is an integer giving the offset, in
     bytes, from the argument pointer to the canonical frame address
     (cfa).  The final value should coincide with that calculated by
     `INCOMING_FRAME_SP_OFFSET'.  Which is unfortunately not usable
     during virtual register instantiation.

     The default value for this macro is `FIRST_PARM_OFFSET (fundecl) +
     crtl->args.pretend_args_size', which is correct for most machines;
     in general, the arguments are found immediately before the stack
     frame.  Note that this is not the case on some targets that save
     registers into the caller's frame, such as SPARC and rs6000, and
     so such targets need to define this macro.

     You only need to define this macro if the default is incorrect,
     and you want to support call frame debugging information like that
     provided by DWARF 2.

 -- Macro: FRAME_POINTER_CFA_OFFSET (FUNDECL)
     If defined, a C expression whose value is an integer giving the
     offset in bytes from the frame pointer to the canonical frame
     address (cfa).  The final value should coincide with that
     calculated by `INCOMING_FRAME_SP_OFFSET'.

     Normally the CFA is calculated as an offset from the argument
     pointer, via `ARG_POINTER_CFA_OFFSET', but if the argument pointer
     is variable due to the ABI, this may not be possible.  If this
     macro is defined, it implies that the virtual register
     instantiation should be based on the frame pointer instead of the
     argument pointer.  Only one of `FRAME_POINTER_CFA_OFFSET' and
     `ARG_POINTER_CFA_OFFSET' should be defined.

 -- Macro: CFA_FRAME_BASE_OFFSET (FUNDECL)
     If defined, a C expression whose value is an integer giving the
     offset in bytes from the canonical frame address (cfa) to the
     frame base used in DWARF 2 debug information.  The default is
     zero.  A different value may reduce the size of debug information
     on some ports.


File: gccint.info,  Node: Exception Handling,  Next: Stack Checking,  Prev: Frame Layout,  Up: Stack and Calling

17.10.2 Exception Handling Support
----------------------------------

 -- Macro: EH_RETURN_DATA_REGNO (N)
     A C expression whose value is the Nth register number used for
     data by exception handlers, or `INVALID_REGNUM' if fewer than N
     registers are usable.

     The exception handling library routines communicate with the
     exception handlers via a set of agreed upon registers.  Ideally
     these registers should be call-clobbered; it is possible to use
     call-saved registers, but may negatively impact code size.  The
     target must support at least 2 data registers, but should define 4
     if there are enough free registers.

     You must define this macro if you want to support call frame
     exception handling like that provided by DWARF 2.

 -- Macro: EH_RETURN_STACKADJ_RTX
     A C expression whose value is RTL representing a location in which
     to store a stack adjustment to be applied before function return.
     This is used to unwind the stack to an exception handler's call
     frame.  It will be assigned zero on code paths that return
     normally.

     Typically this is a call-clobbered hard register that is otherwise
     untouched by the epilogue, but could also be a stack slot.

     Do not define this macro if the stack pointer is saved and restored
     by the regular prolog and epilog code in the call frame itself; in
     this case, the exception handling library routines will update the
     stack location to be restored in place.  Otherwise, you must define
     this macro if you want to support call frame exception handling
     like that provided by DWARF 2.

 -- Macro: EH_RETURN_HANDLER_RTX
     A C expression whose value is RTL representing a location in which
     to store the address of an exception handler to which we should
     return.  It will not be assigned on code paths that return
     normally.

     Typically this is the location in the call frame at which the
     normal return address is stored.  For targets that return by
     popping an address off the stack, this might be a memory address
     just below the _target_ call frame rather than inside the current
     call frame.  If defined, `EH_RETURN_STACKADJ_RTX' will have already
     been assigned, so it may be used to calculate the location of the
     target call frame.

     Some targets have more complex requirements than storing to an
     address calculable during initial code generation.  In that case
     the `eh_return' instruction pattern should be used instead.

     If you want to support call frame exception handling, you must
     define either this macro or the `eh_return' instruction pattern.

 -- Macro: RETURN_ADDR_OFFSET
     If defined, an integer-valued C expression for which rtl will be
     generated to add it to the exception handler address before it is
     searched in the exception handling tables, and to subtract it
     again from the address before using it to return to the exception
     handler.

 -- Macro: ASM_PREFERRED_EH_DATA_FORMAT (CODE, GLOBAL)
     This macro chooses the encoding of pointers embedded in the
     exception handling sections.  If at all possible, this should be
     defined such that the exception handling section will not require
     dynamic relocations, and so may be read-only.

     CODE is 0 for data, 1 for code labels, 2 for function pointers.
     GLOBAL is true if the symbol may be affected by dynamic
     relocations.  The macro should return a combination of the
     `DW_EH_PE_*' defines as found in `dwarf2.h'.

     If this macro is not defined, pointers will not be encoded but
     represented directly.

 -- Macro: ASM_MAYBE_OUTPUT_ENCODED_ADDR_RTX (FILE, ENCODING, SIZE,
          ADDR, DONE)
     This macro allows the target to emit whatever special magic is
     required to represent the encoding chosen by
     `ASM_PREFERRED_EH_DATA_FORMAT'.  Generic code takes care of
     pc-relative and indirect encodings; this must be defined if the
     target uses text-relative or data-relative encodings.

     This is a C statement that branches to DONE if the format was
     handled.  ENCODING is the format chosen, SIZE is the number of
     bytes that the format occupies, ADDR is the `SYMBOL_REF' to be
     emitted.

 -- Macro: MD_FALLBACK_FRAME_STATE_FOR (CONTEXT, FS)
     This macro allows the target to add CPU and operating system
     specific code to the call-frame unwinder for use when there is no
     unwind data available.  The most common reason to implement this
     macro is to unwind through signal frames.

     This macro is called from `uw_frame_state_for' in `unwind-dw2.c',
     `unwind-dw2-xtensa.c' and `unwind-ia64.c'.  CONTEXT is an
     `_Unwind_Context'; FS is an `_Unwind_FrameState'.  Examine
     `context->ra' for the address of the code being executed and
     `context->cfa' for the stack pointer value.  If the frame can be
     decoded, the register save addresses should be updated in FS and
     the macro should evaluate to `_URC_NO_REASON'.  If the frame
     cannot be decoded, the macro should evaluate to
     `_URC_END_OF_STACK'.

     For proper signal handling in Java this macro is accompanied by
     `MAKE_THROW_FRAME', defined in `libjava/include/*-signal.h'
     headers.

 -- Macro: MD_HANDLE_UNWABI (CONTEXT, FS)
     This macro allows the target to add operating system specific code
     to the call-frame unwinder to handle the IA-64 `.unwabi' unwinding
     directive, usually used for signal or interrupt frames.

     This macro is called from `uw_update_context' in libgcc's
     `unwind-ia64.c'.  CONTEXT is an `_Unwind_Context'; FS is an
     `_Unwind_FrameState'.  Examine `fs->unwabi' for the abi and
     context in the `.unwabi' directive.  If the `.unwabi' directive
     can be handled, the register save addresses should be updated in
     FS.

 -- Macro: TARGET_USES_WEAK_UNWIND_INFO
     A C expression that evaluates to true if the target requires unwind
     info to be given comdat linkage.  Define it to be `1' if comdat
     linkage is necessary.  The default is `0'.


File: gccint.info,  Node: Stack Checking,  Next: Frame Registers,  Prev: Exception Handling,  Up: Stack and Calling

17.10.3 Specifying How Stack Checking is Done
---------------------------------------------

GCC will check that stack references are within the boundaries of the
stack, if the option `-fstack-check' is specified, in one of three ways:

  1. If the value of the `STACK_CHECK_BUILTIN' macro is nonzero, GCC
     will assume that you have arranged for full stack checking to be
     done at appropriate places in the configuration files.  GCC will
     not do other special processing.

  2. If `STACK_CHECK_BUILTIN' is zero and the value of the
     `STACK_CHECK_STATIC_BUILTIN' macro is nonzero, GCC will assume
     that you have arranged for static stack checking (checking of the
     static stack frame of functions) to be done at appropriate places
     in the configuration files.  GCC will only emit code to do dynamic
     stack checking (checking on dynamic stack allocations) using the
     third approach below.

  3. If neither of the above are true, GCC will generate code to
     periodically "probe" the stack pointer using the values of the
     macros defined below.

 If neither STACK_CHECK_BUILTIN nor STACK_CHECK_STATIC_BUILTIN is
defined, GCC will change its allocation strategy for large objects if
the option `-fstack-check' is specified: they will always be allocated
dynamically if their size exceeds `STACK_CHECK_MAX_VAR_SIZE' bytes.

 -- Macro: STACK_CHECK_BUILTIN
     A nonzero value if stack checking is done by the configuration
     files in a machine-dependent manner.  You should define this macro
     if stack checking is required by the ABI of your machine or if you
     would like to do stack checking in some more efficient way than
     the generic approach.  The default value of this macro is zero.

 -- Macro: STACK_CHECK_STATIC_BUILTIN
     A nonzero value if static stack checking is done by the
     configuration files in a machine-dependent manner.  You should
     define this macro if you would like to do static stack checking in
     some more efficient way than the generic approach.  The default
     value of this macro is zero.

 -- Macro: STACK_CHECK_PROBE_INTERVAL_EXP
     An integer specifying the interval at which GCC must generate
     stack probe instructions, defined as 2 raised to this integer.
     You will normally define this macro so that the interval be no
     larger than the size of the "guard pages" at the end of a stack
     area.  The default value of 12 (4096-byte interval) is suitable
     for most systems.

 -- Macro: STACK_CHECK_MOVING_SP
     An integer which is nonzero if GCC should move the stack pointer
     page by page when doing probes.  This can be necessary on systems
     where the stack pointer contains the bottom address of the memory
     area accessible to the executing thread at any point in time.  In
     this situation an alternate signal stack is required in order to
     be able to recover from a stack overflow.  The default value of
     this macro is zero.

 -- Macro: STACK_CHECK_PROTECT
     The number of bytes of stack needed to recover from a stack
     overflow, for languages where such a recovery is supported.  The
     default value of 75 words with the `setjmp'/`longjmp'-based
     exception handling mechanism and 8192 bytes with other exception
     handling mechanisms should be adequate for most machines.

 The following macros are relevant only if neither STACK_CHECK_BUILTIN
nor STACK_CHECK_STATIC_BUILTIN is defined; you can omit them altogether
in the opposite case.

 -- Macro: STACK_CHECK_MAX_FRAME_SIZE
     The maximum size of a stack frame, in bytes.  GCC will generate
     probe instructions in non-leaf functions to ensure at least this
     many bytes of stack are available.  If a stack frame is larger
     than this size, stack checking will not be reliable and GCC will
     issue a warning.  The default is chosen so that GCC only generates
     one instruction on most systems.  You should normally not change
     the default value of this macro.

 -- Macro: STACK_CHECK_FIXED_FRAME_SIZE
     GCC uses this value to generate the above warning message.  It
     represents the amount of fixed frame used by a function, not
     including space for any callee-saved registers, temporaries and
     user variables.  You need only specify an upper bound for this
     amount and will normally use the default of four words.

 -- Macro: STACK_CHECK_MAX_VAR_SIZE
     The maximum size, in bytes, of an object that GCC will place in the
     fixed area of the stack frame when the user specifies
     `-fstack-check'.  GCC computed the default from the values of the
     above macros and you will normally not need to override that
     default.


File: gccint.info,  Node: Frame Registers,  Next: Elimination,  Prev: Stack Checking,  Up: Stack and Calling

17.10.4 Registers That Address the Stack Frame
----------------------------------------------

This discusses registers that address the stack frame.

 -- Macro: STACK_POINTER_REGNUM
     The register number of the stack pointer register, which must also
     be a fixed register according to `FIXED_REGISTERS'.  On most
     machines, the hardware determines which register this is.

 -- Macro: FRAME_POINTER_REGNUM
     The register number of the frame pointer register, which is used to
     access automatic variables in the stack frame.  On some machines,
     the hardware determines which register this is.  On other
     machines, you can choose any register you wish for this purpose.

 -- Macro: HARD_FRAME_POINTER_REGNUM
     On some machines the offset between the frame pointer and starting
     offset of the automatic variables is not known until after register
     allocation has been done (for example, because the saved registers
     are between these two locations).  On those machines, define
     `FRAME_POINTER_REGNUM' the number of a special, fixed register to
     be used internally until the offset is known, and define
     `HARD_FRAME_POINTER_REGNUM' to be the actual hard register number
     used for the frame pointer.

     You should define this macro only in the very rare circumstances
     when it is not possible to calculate the offset between the frame
     pointer and the automatic variables until after register
     allocation has been completed.  When this macro is defined, you
     must also indicate in your definition of `ELIMINABLE_REGS' how to
     eliminate `FRAME_POINTER_REGNUM' into either
     `HARD_FRAME_POINTER_REGNUM' or `STACK_POINTER_REGNUM'.

     Do not define this macro if it would be the same as
     `FRAME_POINTER_REGNUM'.

 -- Macro: ARG_POINTER_REGNUM
     The register number of the arg pointer register, which is used to
     access the function's argument list.  On some machines, this is
     the same as the frame pointer register.  On some machines, the
     hardware determines which register this is.  On other machines,
     you can choose any register you wish for this purpose.  If this is
     not the same register as the frame pointer register, then you must
     mark it as a fixed register according to `FIXED_REGISTERS', or
     arrange to be able to eliminate it (*note Elimination::).

 -- Macro: HARD_FRAME_POINTER_IS_FRAME_POINTER
     Define this to a preprocessor constant that is nonzero if
     `hard_frame_pointer_rtx' and `frame_pointer_rtx' should be the
     same.  The default definition is `(HARD_FRAME_POINTER_REGNUM ==
     FRAME_POINTER_REGNUM)'; you only need to define this macro if that
     definition is not suitable for use in preprocessor conditionals.

 -- Macro: HARD_FRAME_POINTER_IS_ARG_POINTER
     Define this to a preprocessor constant that is nonzero if
     `hard_frame_pointer_rtx' and `arg_pointer_rtx' should be the same.
     The default definition is `(HARD_FRAME_POINTER_REGNUM ==
     ARG_POINTER_REGNUM)'; you only need to define this macro if that
     definition is not suitable for use in preprocessor conditionals.

 -- Macro: RETURN_ADDRESS_POINTER_REGNUM
     The register number of the return address pointer register, which
     is used to access the current function's return address from the
     stack.  On some machines, the return address is not at a fixed
     offset from the frame pointer or stack pointer or argument
     pointer.  This register can be defined to point to the return
     address on the stack, and then be converted by `ELIMINABLE_REGS'
     into either the frame pointer or stack pointer.

     Do not define this macro unless there is no other way to get the
     return address from the stack.

 -- Macro: STATIC_CHAIN_REGNUM
 -- Macro: STATIC_CHAIN_INCOMING_REGNUM
     Register numbers used for passing a function's static chain
     pointer.  If register windows are used, the register number as
     seen by the called function is `STATIC_CHAIN_INCOMING_REGNUM',
     while the register number as seen by the calling function is
     `STATIC_CHAIN_REGNUM'.  If these registers are the same,
     `STATIC_CHAIN_INCOMING_REGNUM' need not be defined.

     The static chain register need not be a fixed register.

     If the static chain is passed in memory, these macros should not be
     defined; instead, the `TARGET_STATIC_CHAIN' hook should be used.

 -- Target Hook: rtx TARGET_STATIC_CHAIN (const_tree FNDECL, bool
          INCOMING_P)
     This hook replaces the use of `STATIC_CHAIN_REGNUM' et al for
     targets that may use different static chain locations for different
     nested functions.  This may be required if the target has function
     attributes that affect the calling conventions of the function and
     those calling conventions use different static chain locations.

     The default version of this hook uses `STATIC_CHAIN_REGNUM' et al.

     If the static chain is passed in memory, this hook should be used
     to provide rtx giving `mem' expressions that denote where they are
     stored.  Often the `mem' expression as seen by the caller will be
     at an offset from the stack pointer and the `mem' expression as
     seen by the callee will be at an offset from the frame pointer.  The
     variables `stack_pointer_rtx', `frame_pointer_rtx', and
     `arg_pointer_rtx' will have been initialized and should be used to
     refer to those items.

 -- Macro: DWARF_FRAME_REGISTERS
     This macro specifies the maximum number of hard registers that can
     be saved in a call frame.  This is used to size data structures
     used in DWARF2 exception handling.

     Prior to GCC 3.0, this macro was needed in order to establish a
     stable exception handling ABI in the face of adding new hard
     registers for ISA extensions.  In GCC 3.0 and later, the EH ABI is
     insulated from changes in the number of hard registers.
     Nevertheless, this macro can still be used to reduce the runtime
     memory requirements of the exception handling routines, which can
     be substantial if the ISA contains a lot of registers that are not
     call-saved.

     If this macro is not defined, it defaults to
     `FIRST_PSEUDO_REGISTER'.

 -- Macro: PRE_GCC3_DWARF_FRAME_REGISTERS
     This macro is similar to `DWARF_FRAME_REGISTERS', but is provided
     for backward compatibility in pre GCC 3.0 compiled code.

     If this macro is not defined, it defaults to
     `DWARF_FRAME_REGISTERS'.

 -- Macro: DWARF_REG_TO_UNWIND_COLUMN (REGNO)
     Define this macro if the target's representation for dwarf
     registers is different than the internal representation for unwind
     column.  Given a dwarf register, this macro should return the
     internal unwind column number to use instead.

     See the PowerPC's SPE target for an example.

 -- Macro: DWARF_FRAME_REGNUM (REGNO)
     Define this macro if the target's representation for dwarf
     registers used in .eh_frame or .debug_frame is different from that
     used in other debug info sections.  Given a GCC hard register
     number, this macro should return the .eh_frame register number.
     The default is `DBX_REGISTER_NUMBER (REGNO)'.


 -- Macro: DWARF2_FRAME_REG_OUT (REGNO, FOR_EH)
     Define this macro to map register numbers held in the call frame
     info that GCC has collected using `DWARF_FRAME_REGNUM' to those
     that should be output in .debug_frame (`FOR_EH' is zero) and
     .eh_frame (`FOR_EH' is nonzero).  The default is to return `REGNO'.


 -- Macro: REG_VALUE_IN_UNWIND_CONTEXT
     Define this macro if the target stores register values as
     `_Unwind_Word' type in unwind context.  It should be defined if
     target register size is larger than the size of `void *'.  The
     default is to store register values as `void *' type.


 -- Macro: ASSUME_EXTENDED_UNWIND_CONTEXT
     Define this macro to be 1 if the target always uses extended unwind
     context with version, args_size and by_value fields.  If it is
     undefined, it will be defined to 1 when
     `REG_VALUE_IN_UNWIND_CONTEXT' is defined and 0 otherwise.



File: gccint.info,  Node: Elimination,  Next: Stack Arguments,  Prev: Frame Registers,  Up: Stack and Calling

17.10.5 Eliminating Frame Pointer and Arg Pointer
-------------------------------------------------

This is about eliminating the frame pointer and arg pointer.

 -- Target Hook: bool TARGET_FRAME_POINTER_REQUIRED (void)
     This target hook should return `true' if a function must have and
     use a frame pointer.  This target hook is called in the reload
     pass.  If its return value is `true' the function will have a
     frame pointer.

     This target hook can in principle examine the current function and
     decide according to the facts, but on most machines the constant
     `false' or the constant `true' suffices.  Use `false' when the
     machine allows code to be generated with no frame pointer, and
     doing so saves some time or space.  Use `true' when there is no
     possible advantage to avoiding a frame pointer.

     In certain cases, the compiler does not know how to produce valid
     code without a frame pointer.  The compiler recognizes those cases
     and automatically gives the function a frame pointer regardless of
     what `TARGET_FRAME_POINTER_REQUIRED' returns.  You don't need to
     worry about them.

     In a function that does not require a frame pointer, the frame
     pointer register can be allocated for ordinary usage, unless you
     mark it as a fixed register.  See `FIXED_REGISTERS' for more
     information.

     Default return value is `false'.

 -- Macro: INITIAL_FRAME_POINTER_OFFSET (DEPTH-VAR)
     A C statement to store in the variable DEPTH-VAR the difference
     between the frame pointer and the stack pointer values immediately
     after the function prologue.  The value would be computed from
     information such as the result of `get_frame_size ()' and the
     tables of registers `regs_ever_live' and `call_used_regs'.

     If `ELIMINABLE_REGS' is defined, this macro will be not be used and
     need not be defined.  Otherwise, it must be defined even if
     `TARGET_FRAME_POINTER_REQUIRED' always returns true; in that case,
     you may set DEPTH-VAR to anything.

 -- Macro: ELIMINABLE_REGS
     If defined, this macro specifies a table of register pairs used to
     eliminate unneeded registers that point into the stack frame.  If
     it is not defined, the only elimination attempted by the compiler
     is to replace references to the frame pointer with references to
     the stack pointer.

     The definition of this macro is a list of structure
     initializations, each of which specifies an original and
     replacement register.

     On some machines, the position of the argument pointer is not
     known until the compilation is completed.  In such a case, a
     separate hard register must be used for the argument pointer.
     This register can be eliminated by replacing it with either the
     frame pointer or the argument pointer, depending on whether or not
     the frame pointer has been eliminated.

     In this case, you might specify:
          #define ELIMINABLE_REGS  \
          {{ARG_POINTER_REGNUM, STACK_POINTER_REGNUM}, \
           {ARG_POINTER_REGNUM, FRAME_POINTER_REGNUM}, \
           {FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM}}

     Note that the elimination of the argument pointer with the stack
     pointer is specified first since that is the preferred elimination.

 -- Target Hook: bool TARGET_CAN_ELIMINATE (const int FROM_REG, const
          int TO_REG)
     This target hook should returns `true' if the compiler is allowed
     to try to replace register number FROM_REG with register number
     TO_REG.  This target hook need only be defined if `ELIMINABLE_REGS'
     is defined, and will usually be `true', since most of the cases
     preventing register elimination are things that the compiler
     already knows about.

     Default return value is `true'.

 -- Macro: INITIAL_ELIMINATION_OFFSET (FROM-REG, TO-REG, OFFSET-VAR)
     This macro is similar to `INITIAL_FRAME_POINTER_OFFSET'.  It
     specifies the initial difference between the specified pair of
     registers.  This macro must be defined if `ELIMINABLE_REGS' is
     defined.


File: gccint.info,  Node: Stack Arguments,  Next: Register Arguments,  Prev: Elimination,  Up: Stack and Calling

17.10.6 Passing Function Arguments on the Stack
-----------------------------------------------

The macros in this section control how arguments are passed on the
stack.  See the following section for other macros that control passing
certain arguments in registers.

 -- Target Hook: bool TARGET_PROMOTE_PROTOTYPES (const_tree FNTYPE)
     This target hook returns `true' if an argument declared in a
     prototype as an integral type smaller than `int' should actually be
     passed as an `int'.  In addition to avoiding errors in certain
     cases of mismatch, it also makes for better code on certain
     machines.  The default is to not promote prototypes.

 -- Macro: PUSH_ARGS
     A C expression.  If nonzero, push insns will be used to pass
     outgoing arguments.  If the target machine does not have a push
     instruction, set it to zero.  That directs GCC to use an alternate
     strategy: to allocate the entire argument block and then store the
     arguments into it.  When `PUSH_ARGS' is nonzero, `PUSH_ROUNDING'
     must be defined too.

 -- Macro: PUSH_ARGS_REVERSED
     A C expression.  If nonzero, function arguments will be evaluated
     from last to first, rather than from first to last.  If this macro
     is not defined, it defaults to `PUSH_ARGS' on targets where the
     stack and args grow in opposite directions, and 0 otherwise.

 -- Macro: PUSH_ROUNDING (NPUSHED)
     A C expression that is the number of bytes actually pushed onto the
     stack when an instruction attempts to push NPUSHED bytes.

     On some machines, the definition

          #define PUSH_ROUNDING(BYTES) (BYTES)

     will suffice.  But on other machines, instructions that appear to
     push one byte actually push two bytes in an attempt to maintain
     alignment.  Then the definition should be

          #define PUSH_ROUNDING(BYTES) (((BYTES) + 1) & ~1)

     If the value of this macro has a type, it should be an unsigned
     type.

 -- Macro: ACCUMULATE_OUTGOING_ARGS
     A C expression.  If nonzero, the maximum amount of space required
     for outgoing arguments will be computed and placed into
     `crtl->outgoing_args_size'.  No space will be pushed onto the
     stack for each call; instead, the function prologue should
     increase the stack frame size by this amount.

     Setting both `PUSH_ARGS' and `ACCUMULATE_OUTGOING_ARGS' is not
     proper.

 -- Macro: REG_PARM_STACK_SPACE (FNDECL)
     Define this macro if functions should assume that stack space has
     been allocated for arguments even when their values are passed in
     registers.

     The value of this macro is the size, in bytes, of the area
     reserved for arguments passed in registers for the function
     represented by FNDECL, which can be zero if GCC is calling a
     library function.  The argument FNDECL can be the FUNCTION_DECL,
     or the type itself of the function.

     This space can be allocated by the caller, or be a part of the
     machine-dependent stack frame: `OUTGOING_REG_PARM_STACK_SPACE' says
     which.

 -- Macro: OUTGOING_REG_PARM_STACK_SPACE (FNTYPE)
     Define this to a nonzero value if it is the responsibility of the
     caller to allocate the area reserved for arguments passed in
     registers when calling a function of FNTYPE.  FNTYPE may be NULL
     if the function called is a library function.

     If `ACCUMULATE_OUTGOING_ARGS' is defined, this macro controls
     whether the space for these arguments counts in the value of
     `crtl->outgoing_args_size'.

 -- Macro: STACK_PARMS_IN_REG_PARM_AREA
     Define this macro if `REG_PARM_STACK_SPACE' is defined, but the
     stack parameters don't skip the area specified by it.

     Normally, when a parameter is not passed in registers, it is
     placed on the stack beyond the `REG_PARM_STACK_SPACE' area.
     Defining this macro suppresses this behavior and causes the
     parameter to be passed on the stack in its natural location.

 -- Target Hook: int TARGET_RETURN_POPS_ARGS (tree FUNDECL, tree
          FUNTYPE, int SIZE)
     This target hook returns the number of bytes of its own arguments
     that a function pops on returning, or 0 if the function pops no
     arguments and the caller must therefore pop them all after the
     function returns.

     FUNDECL is a C variable whose value is a tree node that describes
     the function in question.  Normally it is a node of type
     `FUNCTION_DECL' that describes the declaration of the function.
     From this you can obtain the `DECL_ATTRIBUTES' of the function.

     FUNTYPE is a C variable whose value is a tree node that describes
     the function in question.  Normally it is a node of type
     `FUNCTION_TYPE' that describes the data type of the function.
     From this it is possible to obtain the data types of the value and
     arguments (if known).

     When a call to a library function is being considered, FUNDECL
     will contain an identifier node for the library function.  Thus, if
     you need to distinguish among various library functions, you can
     do so by their names.  Note that "library function" in this
     context means a function used to perform arithmetic, whose name is
     known specially in the compiler and was not mentioned in the C
     code being compiled.

     SIZE is the number of bytes of arguments passed on the stack.  If
     a variable number of bytes is passed, it is zero, and argument
     popping will always be the responsibility of the calling function.

     On the VAX, all functions always pop their arguments, so the
     definition of this macro is SIZE.  On the 68000, using the standard
     calling convention, no functions pop their arguments, so the value
     of the macro is always 0 in this case.  But an alternative calling
     convention is available in which functions that take a fixed
     number of arguments pop them but other functions (such as
     `printf') pop nothing (the caller pops all).  When this convention
     is in use, FUNTYPE is examined to determine whether a function
     takes a fixed number of arguments.

 -- Macro: CALL_POPS_ARGS (CUM)
     A C expression that should indicate the number of bytes a call
     sequence pops off the stack.  It is added to the value of
     `RETURN_POPS_ARGS' when compiling a function call.

     CUM is the variable in which all arguments to the called function
     have been accumulated.

     On certain architectures, such as the SH5, a call trampoline is
     used that pops certain registers off the stack, depending on the
     arguments that have been passed to the function.  Since this is a
     property of the call site, not of the called function,
     `RETURN_POPS_ARGS' is not appropriate.


File: gccint.info,  Node: Register Arguments,  Next: Scalar Return,  Prev: Stack Arguments,  Up: Stack and Calling

17.10.7 Passing Arguments in Registers
--------------------------------------

This section describes the macros which let you control how various
types of arguments are passed in registers or how they are arranged in
the stack.

 -- Target Hook: rtx TARGET_FUNCTION_ARG (cumulative_args_t CA, enum
          machine_mode MODE, const_tree TYPE, bool NAMED)
     Return an RTX indicating whether a function argument is passed in a
     register and if so, which register.

     The arguments are CA, which summarizes all the previous arguments;
     MODE, the machine mode of the argument; TYPE, the data type of the
     argument as a tree node or 0 if that is not known (which happens
     for C support library functions); and NAMED, which is `true' for
     an ordinary argument and `false' for nameless arguments that
     correspond to `...' in the called function's prototype.  TYPE can
     be an incomplete type if a syntax error has previously occurred.

     The return value is usually either a `reg' RTX for the hard
     register in which to pass the argument, or zero to pass the
     argument on the stack.

     The value of the expression can also be a `parallel' RTX.  This is
     used when an argument is passed in multiple locations.  The mode
     of the `parallel' should be the mode of the entire argument.  The
     `parallel' holds any number of `expr_list' pairs; each one
     describes where part of the argument is passed.  In each
     `expr_list' the first operand must be a `reg' RTX for the hard
     register in which to pass this part of the argument, and the mode
     of the register RTX indicates how large this part of the argument
     is.  The second operand of the `expr_list' is a `const_int' which
     gives the offset in bytes into the entire argument of where this
     part starts.  As a special exception the first `expr_list' in the
     `parallel' RTX may have a first operand of zero.  This indicates
     that the entire argument is also stored on the stack.

     The last time this hook is called, it is called with `MODE ==
     VOIDmode', and its result is passed to the `call' or `call_value'
     pattern as operands 2 and 3 respectively.

     The usual way to make the ISO library `stdarg.h' work on a machine
     where some arguments are usually passed in registers, is to cause
     nameless arguments to be passed on the stack instead.  This is
     done by making `TARGET_FUNCTION_ARG' return 0 whenever NAMED is
     `false'.

     You may use the hook `targetm.calls.must_pass_in_stack' in the
     definition of this macro to determine if this argument is of a
     type that must be passed in the stack.  If `REG_PARM_STACK_SPACE'
     is not defined and `TARGET_FUNCTION_ARG' returns nonzero for such
     an argument, the compiler will abort.  If `REG_PARM_STACK_SPACE' is
     defined, the argument will be computed in the stack and then
     loaded into a register.

 -- Target Hook: bool TARGET_MUST_PASS_IN_STACK (enum machine_mode
          MODE, const_tree TYPE)
     This target hook should return `true' if we should not pass TYPE
     solely in registers.  The file `expr.h' defines a definition that
     is usually appropriate, refer to `expr.h' for additional
     documentation.

 -- Target Hook: rtx TARGET_FUNCTION_INCOMING_ARG (cumulative_args_t
          CA, enum machine_mode MODE, const_tree TYPE, bool NAMED)
     Define this hook if the target machine has "register windows", so
     that the register in which a function sees an arguments is not
     necessarily the same as the one in which the caller passed the
     argument.

     For such machines, `TARGET_FUNCTION_ARG' computes the register in
     which the caller passes the value, and
     `TARGET_FUNCTION_INCOMING_ARG' should be defined in a similar
     fashion to tell the function being called where the arguments will
     arrive.

     If `TARGET_FUNCTION_INCOMING_ARG' is not defined,
     `TARGET_FUNCTION_ARG' serves both purposes.

 -- Target Hook: int TARGET_ARG_PARTIAL_BYTES (cumulative_args_t CUM,
          enum machine_mode MODE, tree TYPE, bool NAMED)
     This target hook returns the number of bytes at the beginning of an
     argument that must be put in registers.  The value must be zero for
     arguments that are passed entirely in registers or that are
     entirely pushed on the stack.

     On some machines, certain arguments must be passed partially in
     registers and partially in memory.  On these machines, typically
     the first few words of arguments are passed in registers, and the
     rest on the stack.  If a multi-word argument (a `double' or a
     structure) crosses that boundary, its first few words must be
     passed in registers and the rest must be pushed.  This macro tells
     the compiler when this occurs, and how many bytes should go in
     registers.

     `TARGET_FUNCTION_ARG' for these arguments should return the first
     register to be used by the caller for this argument; likewise
     `TARGET_FUNCTION_INCOMING_ARG', for the called function.

 -- Target Hook: bool TARGET_PASS_BY_REFERENCE (cumulative_args_t CUM,
          enum machine_mode MODE, const_tree TYPE, bool NAMED)
     This target hook should return `true' if an argument at the
     position indicated by CUM should be passed by reference.  This
     predicate is queried after target independent reasons for being
     passed by reference, such as `TREE_ADDRESSABLE (type)'.

     If the hook returns true, a copy of that argument is made in
     memory and a pointer to the argument is passed instead of the
     argument itself.  The pointer is passed in whatever way is
     appropriate for passing a pointer to that type.

 -- Target Hook: bool TARGET_CALLEE_COPIES (cumulative_args_t CUM, enum
          machine_mode MODE, const_tree TYPE, bool NAMED)
     The function argument described by the parameters to this hook is
     known to be passed by reference.  The hook should return true if
     the function argument should be copied by the callee instead of
     copied by the caller.

     For any argument for which the hook returns true, if it can be
     determined that the argument is not modified, then a copy need not
     be generated.

     The default version of this hook always returns false.

 -- Macro: CUMULATIVE_ARGS
     A C type for declaring a variable that is used as the first
     argument of `TARGET_FUNCTION_ARG' and other related values.  For
     some target machines, the type `int' suffices and can hold the
     number of bytes of argument so far.

     There is no need to record in `CUMULATIVE_ARGS' anything about the
     arguments that have been passed on the stack.  The compiler has
     other variables to keep track of that.  For target machines on
     which all arguments are passed on the stack, there is no need to
     store anything in `CUMULATIVE_ARGS'; however, the data structure
     must exist and should not be empty, so use `int'.

 -- Macro: OVERRIDE_ABI_FORMAT (FNDECL)
     If defined, this macro is called before generating any code for a
     function, but after the CFUN descriptor for the function has been
     created.  The back end may use this macro to update CFUN to
     reflect an ABI other than that which would normally be used by
     default.  If the compiler is generating code for a
     compiler-generated function, FNDECL may be `NULL'.

 -- Macro: INIT_CUMULATIVE_ARGS (CUM, FNTYPE, LIBNAME, FNDECL,
          N_NAMED_ARGS)
     A C statement (sans semicolon) for initializing the variable CUM
     for the state at the beginning of the argument list.  The variable
     has type `CUMULATIVE_ARGS'.  The value of FNTYPE is the tree node
     for the data type of the function which will receive the args, or
     0 if the args are to a compiler support library function.  For
     direct calls that are not libcalls, FNDECL contain the declaration
     node of the function.  FNDECL is also set when
     `INIT_CUMULATIVE_ARGS' is used to find arguments for the function
     being compiled.  N_NAMED_ARGS is set to the number of named
     arguments, including a structure return address if it is passed as
     a parameter, when making a call.  When processing incoming
     arguments, N_NAMED_ARGS is set to -1.

     When processing a call to a compiler support library function,
     LIBNAME identifies which one.  It is a `symbol_ref' rtx which
     contains the name of the function, as a string.  LIBNAME is 0 when
     an ordinary C function call is being processed.  Thus, each time
     this macro is called, either LIBNAME or FNTYPE is nonzero, but
     never both of them at once.

 -- Macro: INIT_CUMULATIVE_LIBCALL_ARGS (CUM, MODE, LIBNAME)
     Like `INIT_CUMULATIVE_ARGS' but only used for outgoing libcalls,
     it gets a `MODE' argument instead of FNTYPE, that would be `NULL'.
     INDIRECT would always be zero, too.  If this macro is not defined,
     `INIT_CUMULATIVE_ARGS (cum, NULL_RTX, libname, 0)' is used instead.

 -- Macro: INIT_CUMULATIVE_INCOMING_ARGS (CUM, FNTYPE, LIBNAME)
     Like `INIT_CUMULATIVE_ARGS' but overrides it for the purposes of
     finding the arguments for the function being compiled.  If this
     macro is undefined, `INIT_CUMULATIVE_ARGS' is used instead.

     The value passed for LIBNAME is always 0, since library routines
     with special calling conventions are never compiled with GCC.  The
     argument LIBNAME exists for symmetry with `INIT_CUMULATIVE_ARGS'.

 -- Target Hook: void TARGET_FUNCTION_ARG_ADVANCE (cumulative_args_t
          CA, enum machine_mode MODE, const_tree TYPE, bool NAMED)
     This hook updates the summarizer variable pointed to by CA to
     advance past an argument in the argument list.  The values MODE,
     TYPE and NAMED describe that argument.  Once this is done, the
     variable CUM is suitable for analyzing the _following_ argument
     with `TARGET_FUNCTION_ARG', etc.

     This hook need not do anything if the argument in question was
     passed on the stack.  The compiler knows how to track the amount
     of stack space used for arguments without any special help.

 -- Macro: FUNCTION_ARG_OFFSET (MODE, TYPE)
     If defined, a C expression that is the number of bytes to add to
     the offset of the argument passed in memory.  This is needed for
     the SPU, which passes `char' and `short' arguments in the preferred
     slot that is in the middle of the quad word instead of starting at
     the top.

 -- Macro: FUNCTION_ARG_PADDING (MODE, TYPE)
     If defined, a C expression which determines whether, and in which
     direction, to pad out an argument with extra space.  The value
     should be of type `enum direction': either `upward' to pad above
     the argument, `downward' to pad below, or `none' to inhibit
     padding.

     The _amount_ of padding is not controlled by this macro, but by the
     target hook `TARGET_FUNCTION_ARG_ROUND_BOUNDARY'.  It is always
     just enough to reach the next multiple of that boundary.

     This macro has a default definition which is right for most
     systems.  For little-endian machines, the default is to pad
     upward.  For big-endian machines, the default is to pad downward
     for an argument of constant size shorter than an `int', and upward
     otherwise.

 -- Macro: PAD_VARARGS_DOWN
     If defined, a C expression which determines whether the default
     implementation of va_arg will attempt to pad down before reading
     the next argument, if that argument is smaller than its aligned
     space as controlled by `PARM_BOUNDARY'.  If this macro is not
     defined, all such arguments are padded down if `BYTES_BIG_ENDIAN'
     is true.

 -- Macro: BLOCK_REG_PADDING (MODE, TYPE, FIRST)
     Specify padding for the last element of a block move between
     registers and memory.  FIRST is nonzero if this is the only
     element.  Defining this macro allows better control of register
     function parameters on big-endian machines, without using
     `PARALLEL' rtl.  In particular, `MUST_PASS_IN_STACK' need not test
     padding and mode of types in registers, as there is no longer a
     "wrong" part of a register;  For example, a three byte aggregate
     may be passed in the high part of a register if so required.

 -- Target Hook: unsigned int TARGET_FUNCTION_ARG_BOUNDARY (enum
          machine_mode MODE, const_tree TYPE)
     This hook returns the alignment boundary, in bits, of an argument
     with the specified mode and type.  The default hook returns
     `PARM_BOUNDARY' for all arguments.

 -- Target Hook: unsigned int TARGET_FUNCTION_ARG_ROUND_BOUNDARY (enum
          machine_mode MODE, const_tree TYPE)
     Normally, the size of an argument is rounded up to `PARM_BOUNDARY',
     which is the default value for this hook.  You can define this
     hook to return a different value if an argument size must be
     rounded to a larger value.

 -- Macro: FUNCTION_ARG_REGNO_P (REGNO)
     A C expression that is nonzero if REGNO is the number of a hard
     register in which function arguments are sometimes passed.  This
     does _not_ include implicit arguments such as the static chain and
     the structure-value address.  On many machines, no registers can be
     used for this purpose since all function arguments are pushed on
     the stack.

 -- Target Hook: bool TARGET_SPLIT_COMPLEX_ARG (const_tree TYPE)
     This hook should return true if parameter of type TYPE are passed
     as two scalar parameters.  By default, GCC will attempt to pack
     complex arguments into the target's word size.  Some ABIs require
     complex arguments to be split and treated as their individual
     components.  For example, on AIX64, complex floats should be
     passed in a pair of floating point registers, even though a
     complex float would fit in one 64-bit floating point register.

     The default value of this hook is `NULL', which is treated as
     always false.

 -- Target Hook: tree TARGET_BUILD_BUILTIN_VA_LIST (void)
     This hook returns a type node for `va_list' for the target.  The
     default version of the hook returns `void*'.

 -- Target Hook: int TARGET_ENUM_VA_LIST_P (int IDX, const char
          **PNAME, tree *PTREE)
     This target hook is used in function `c_common_nodes_and_builtins'
     to iterate through the target specific builtin types for va_list.
     The variable IDX is used as iterator. PNAME has to be a pointer to
     a `const char *' and PTREE a pointer to a `tree' typed variable.
     The arguments PNAME and PTREE are used to store the result of this
     macro and are set to the name of the va_list builtin type and its
     internal type.  If the return value of this macro is zero, then
     there is no more element.  Otherwise the IDX should be increased
     for the next call of this macro to iterate through all types.

 -- Target Hook: tree TARGET_FN_ABI_VA_LIST (tree FNDECL)
     This hook returns the va_list type of the calling convention
     specified by FNDECL.  The default version of this hook returns
     `va_list_type_node'.

 -- Target Hook: tree TARGET_CANONICAL_VA_LIST_TYPE (tree TYPE)
     This hook returns the va_list type of the calling convention
     specified by the type of TYPE. If TYPE is not a valid va_list
     type, it returns `NULL_TREE'.

 -- Target Hook: tree TARGET_GIMPLIFY_VA_ARG_EXPR (tree VALIST, tree
          TYPE, gimple_seq *PRE_P, gimple_seq *POST_P)
     This hook performs target-specific gimplification of
     `VA_ARG_EXPR'.  The first two parameters correspond to the
     arguments to `va_arg'; the latter two are as in
     `gimplify.c:gimplify_expr'.

 -- Target Hook: bool TARGET_VALID_POINTER_MODE (enum machine_mode MODE)
     Define this to return nonzero if the port can handle pointers with
     machine mode MODE.  The default version of this hook returns true
     for both `ptr_mode' and `Pmode'.

 -- Target Hook: bool TARGET_REF_MAY_ALIAS_ERRNO (struct ao_ref_s *REF)
     Define this to return nonzero if the memory reference REF  may
     alias with the system C library errno location.  The default
     version of this hook assumes the system C library errno location
     is either a declaration of type int or accessed by dereferencing
     a pointer to int.

 -- Target Hook: bool TARGET_SCALAR_MODE_SUPPORTED_P (enum machine_mode
          MODE)
     Define this to return nonzero if the port is prepared to handle
     insns involving scalar mode MODE.  For a scalar mode to be
     considered supported, all the basic arithmetic and comparisons
     must work.

     The default version of this hook returns true for any mode
     required to handle the basic C types (as defined by the port).
     Included here are the double-word arithmetic supported by the code
     in `optabs.c'.

 -- Target Hook: bool TARGET_VECTOR_MODE_SUPPORTED_P (enum machine_mode
          MODE)
     Define this to return nonzero if the port is prepared to handle
     insns involving vector mode MODE.  At the very least, it must have
     move patterns for this mode.

 -- Target Hook: bool TARGET_ARRAY_MODE_SUPPORTED_P (enum machine_mode
          MODE, unsigned HOST_WIDE_INT NELEMS)
     Return true if GCC should try to use a scalar mode to store an
     array of NELEMS elements, given that each element has mode MODE.
     Returning true here overrides the usual `MAX_FIXED_MODE' limit and
     allows GCC to use any defined integer mode.

     One use of this hook is to support vector load and store operations
     that operate on several homogeneous vectors.  For example, ARM NEON
     has operations like:

          int8x8x3_t vld3_s8 (const int8_t *)

     where the return type is defined as:

          typedef struct int8x8x3_t
          {
            int8x8_t val[3];
          } int8x8x3_t;

     If this hook allows `val' to have a scalar mode, then `int8x8x3_t'
     can have the same mode.  GCC can then store `int8x8x3_t's in
     registers rather than forcing them onto the stack.

 -- Target Hook: bool TARGET_SMALL_REGISTER_CLASSES_FOR_MODE_P (enum
          machine_mode MODE)
     Define this to return nonzero for machine modes for which the port
     has small register classes.  If this target hook returns nonzero
     for a given MODE, the compiler will try to minimize the lifetime
     of registers in MODE.  The hook may be called with `VOIDmode' as
     argument.  In this case, the hook is expected to return nonzero if
     it returns nonzero for any mode.

     On some machines, it is risky to let hard registers live across
     arbitrary insns.  Typically, these machines have instructions that
     require values to be in specific registers (like an accumulator),
     and reload will fail if the required hard register is used for
     another purpose across such an insn.

     Passes before reload do not know which hard registers will be used
     in an instruction, but the machine modes of the registers set or
     used in the instruction are already known.  And for some machines,
     register classes are small for, say, integer registers but not for
     floating point registers.  For example, the AMD x86-64
     architecture requires specific registers for the legacy x86
     integer instructions, but there are many SSE registers for
     floating point operations.  On such targets, a good strategy may
     be to return nonzero from this hook for `INTEGRAL_MODE_P' machine
     modes but zero for the SSE register classes.

     The default version of this hook returns false for any mode.  It
     is always safe to redefine this hook to return with a nonzero
     value.  But if you unnecessarily define it, you will reduce the
     amount of optimizations that can be performed in some cases.  If
     you do not define this hook to return a nonzero value when it is
     required, the compiler will run out of spill registers and print a
     fatal error message.

 -- Target Hook: unsigned int TARGET_FLAGS_REGNUM
     If the target has a dedicated flags register, and it needs to use
     the post-reload comparison elimination pass, then this value
     should be set appropriately.


File: gccint.info,  Node: Scalar Return,  Next: Aggregate Return,  Prev: Register Arguments,  Up: Stack and Calling

17.10.8 How Scalar Function Values Are Returned
-----------------------------------------------

This section discusses the macros that control returning scalars as
values--values that can fit in registers.

 -- Target Hook: rtx TARGET_FUNCTION_VALUE (const_tree RET_TYPE,
          const_tree FN_DECL_OR_TYPE, bool OUTGOING)
     Define this to return an RTX representing the place where a
     function returns or receives a value of data type RET_TYPE, a tree
     node representing a data type.  FN_DECL_OR_TYPE is a tree node
     representing `FUNCTION_DECL' or `FUNCTION_TYPE' of a function
     being called.  If OUTGOING is false, the hook should compute the
     register in which the caller will see the return value.
     Otherwise, the hook should return an RTX representing the place
     where a function returns a value.

     On many machines, only `TYPE_MODE (RET_TYPE)' is relevant.
     (Actually, on most machines, scalar values are returned in the same
     place regardless of mode.)  The value of the expression is usually
     a `reg' RTX for the hard register where the return value is stored.
     The value can also be a `parallel' RTX, if the return value is in
     multiple places.  See `TARGET_FUNCTION_ARG' for an explanation of
     the `parallel' form.   Note that the callee will populate every
     location specified in the `parallel', but if the first element of
     the `parallel' contains the whole return value, callers will use
     that element as the canonical location and ignore the others.  The
     m68k port uses this type of `parallel' to return pointers in both
     `%a0' (the canonical location) and `%d0'.

     If `TARGET_PROMOTE_FUNCTION_RETURN' returns true, you must apply
     the same promotion rules specified in `PROMOTE_MODE' if VALTYPE is
     a scalar type.

     If the precise function being called is known, FUNC is a tree node
     (`FUNCTION_DECL') for it; otherwise, FUNC is a null pointer.  This
     makes it possible to use a different value-returning convention
     for specific functions when all their calls are known.

     Some target machines have "register windows" so that the register
     in which a function returns its value is not the same as the one
     in which the caller sees the value.  For such machines, you should
     return different RTX depending on OUTGOING.

     `TARGET_FUNCTION_VALUE' is not used for return values with
     aggregate data types, because these are returned in another way.
     See `TARGET_STRUCT_VALUE_RTX' and related macros, below.

 -- Macro: FUNCTION_VALUE (VALTYPE, FUNC)
     This macro has been deprecated.  Use `TARGET_FUNCTION_VALUE' for a
     new target instead.

 -- Macro: LIBCALL_VALUE (MODE)
     A C expression to create an RTX representing the place where a
     library function returns a value of mode MODE.

     Note that "library function" in this context means a compiler
     support routine, used to perform arithmetic, whose name is known
     specially by the compiler and was not mentioned in the C code being
     compiled.

 -- Target Hook: rtx TARGET_LIBCALL_VALUE (enum machine_mode MODE,
          const_rtx FUN)
     Define this hook if the back-end needs to know the name of the
     libcall function in order to determine where the result should be
     returned.

     The mode of the result is given by MODE and the name of the called
     library function is given by FUN.  The hook should return an RTX
     representing the place where the library function result will be
     returned.

     If this hook is not defined, then LIBCALL_VALUE will be used.

 -- Macro: FUNCTION_VALUE_REGNO_P (REGNO)
     A C expression that is nonzero if REGNO is the number of a hard
     register in which the values of called function may come back.

     A register whose use for returning values is limited to serving as
     the second of a pair (for a value of type `double', say) need not
     be recognized by this macro.  So for most machines, this definition
     suffices:

          #define FUNCTION_VALUE_REGNO_P(N) ((N) == 0)

     If the machine has register windows, so that the caller and the
     called function use different registers for the return value, this
     macro should recognize only the caller's register numbers.

     This macro has been deprecated.  Use
     `TARGET_FUNCTION_VALUE_REGNO_P' for a new target instead.

 -- Target Hook: bool TARGET_FUNCTION_VALUE_REGNO_P (const unsigned int
          REGNO)
     A target hook that return `true' if REGNO is the number of a hard
     register in which the values of called function may come back.

     A register whose use for returning values is limited to serving as
     the second of a pair (for a value of type `double', say) need not
     be recognized by this target hook.

     If the machine has register windows, so that the caller and the
     called function use different registers for the return value, this
     target hook should recognize only the caller's register numbers.

     If this hook is not defined, then FUNCTION_VALUE_REGNO_P will be
     used.

 -- Macro: APPLY_RESULT_SIZE
     Define this macro if `untyped_call' and `untyped_return' need more
     space than is implied by `FUNCTION_VALUE_REGNO_P' for saving and
     restoring an arbitrary return value.

 -- Target Hook: bool TARGET_RETURN_IN_MSB (const_tree TYPE)
     This hook should return true if values of type TYPE are returned
     at the most significant end of a register (in other words, if they
     are padded at the least significant end).  You can assume that TYPE
     is returned in a register; the caller is required to check this.

     Note that the register provided by `TARGET_FUNCTION_VALUE' must be
     able to hold the complete return value.  For example, if a 1-, 2-
     or 3-byte structure is returned at the most significant end of a
     4-byte register, `TARGET_FUNCTION_VALUE' should provide an
     `SImode' rtx.


File: gccint.info,  Node: Aggregate Return,  Next: Caller Saves,  Prev: Scalar Return,  Up: Stack and Calling

17.10.9 How Large Values Are Returned
-------------------------------------

When a function value's mode is `BLKmode' (and in some other cases),
the value is not returned according to `TARGET_FUNCTION_VALUE' (*note
Scalar Return::).  Instead, the caller passes the address of a block of
memory in which the value should be stored.  This address is called the
"structure value address".

 This section describes how to control returning structure values in
memory.

 -- Target Hook: bool TARGET_RETURN_IN_MEMORY (const_tree TYPE,
          const_tree FNTYPE)
     This target hook should return a nonzero value to say to return the
     function value in memory, just as large structures are always
     returned.  Here TYPE will be the data type of the value, and FNTYPE
     will be the type of the function doing the returning, or `NULL' for
     libcalls.

     Note that values of mode `BLKmode' must be explicitly handled by
     this function.  Also, the option `-fpcc-struct-return' takes
     effect regardless of this macro.  On most systems, it is possible
     to leave the hook undefined; this causes a default definition to
     be used, whose value is the constant 1 for `BLKmode' values, and 0
     otherwise.

     Do not use this hook to indicate that structures and unions should
     always be returned in memory.  You should instead use
     `DEFAULT_PCC_STRUCT_RETURN' to indicate this.

 -- Macro: DEFAULT_PCC_STRUCT_RETURN
     Define this macro to be 1 if all structure and union return values
     must be in memory.  Since this results in slower code, this should
     be defined only if needed for compatibility with other compilers
     or with an ABI.  If you define this macro to be 0, then the
     conventions used for structure and union return values are decided
     by the `TARGET_RETURN_IN_MEMORY' target hook.

     If not defined, this defaults to the value 1.

 -- Target Hook: rtx TARGET_STRUCT_VALUE_RTX (tree FNDECL, int INCOMING)
     This target hook should return the location of the structure value
     address (normally a `mem' or `reg'), or 0 if the address is passed
     as an "invisible" first argument.  Note that FNDECL may be `NULL',
     for libcalls.  You do not need to define this target hook if the
     address is always passed as an "invisible" first argument.

     On some architectures the place where the structure value address
     is found by the called function is not the same place that the
     caller put it.  This can be due to register windows, or it could
     be because the function prologue moves it to a different place.
     INCOMING is `1' or `2' when the location is needed in the context
     of the called function, and `0' in the context of the caller.

     If INCOMING is nonzero and the address is to be found on the
     stack, return a `mem' which refers to the frame pointer. If
     INCOMING is `2', the result is being used to fetch the structure
     value address at the beginning of a function.  If you need to emit
     adjusting code, you should do it at this point.

 -- Macro: PCC_STATIC_STRUCT_RETURN
     Define this macro if the usual system convention on the target
     machine for returning structures and unions is for the called
     function to return the address of a static variable containing the
     value.

     Do not define this if the usual system convention is for the
     caller to pass an address to the subroutine.

     This macro has effect in `-fpcc-struct-return' mode, but it does
     nothing when you use `-freg-struct-return' mode.

 -- Target Hook: enum machine_mode TARGET_GET_RAW_RESULT_MODE (int
          REGNO)
     This target hook returns the mode to be used when accessing raw
     return registers in `__builtin_return'.  Define this macro if the
     value in REG_RAW_MODE is not correct.

 -- Target Hook: enum machine_mode TARGET_GET_RAW_ARG_MODE (int REGNO)
     This target hook returns the mode to be used when accessing raw
     argument registers in `__builtin_apply_args'.  Define this macro
     if the value in REG_RAW_MODE is not correct.


File: gccint.info,  Node: Caller Saves,  Next: Function Entry,  Prev: Aggregate Return,  Up: Stack and Calling

17.10.10 Caller-Saves Register Allocation
-----------------------------------------

If you enable it, GCC can save registers around function calls.  This
makes it possible to use call-clobbered registers to hold variables that
must live across calls.

 -- Macro: CALLER_SAVE_PROFITABLE (REFS, CALLS)
     A C expression to determine whether it is worthwhile to consider
     placing a pseudo-register in a call-clobbered hard register and
     saving and restoring it around each function call.  The expression
     should be 1 when this is worth doing, and 0 otherwise.

     If you don't define this macro, a default is used which is good on
     most machines: `4 * CALLS < REFS'.

 -- Macro: HARD_REGNO_CALLER_SAVE_MODE (REGNO, NREGS)
     A C expression specifying which mode is required for saving NREGS
     of a pseudo-register in call-clobbered hard register REGNO.  If
     REGNO is unsuitable for caller save, `VOIDmode' should be
     returned.  For most machines this macro need not be defined since
     GCC will select the smallest suitable mode.


File: gccint.info,  Node: Function Entry,  Next: Profiling,  Prev: Caller Saves,  Up: Stack and Calling

17.10.11 Function Entry and Exit
--------------------------------

This section describes the macros that output function entry
("prologue") and exit ("epilogue") code.

 -- Target Hook: void TARGET_ASM_FUNCTION_PROLOGUE (FILE *FILE,
          HOST_WIDE_INT SIZE)
     If defined, a function that outputs the assembler code for entry
     to a function.  The prologue is responsible for setting up the
     stack frame, initializing the frame pointer register, saving
     registers that must be saved, and allocating SIZE additional bytes
     of storage for the local variables.  SIZE is an integer.  FILE is
     a stdio stream to which the assembler code should be output.

     The label for the beginning of the function need not be output by
     this macro.  That has already been done when the macro is run.

     To determine which registers to save, the macro can refer to the
     array `regs_ever_live': element R is nonzero if hard register R is
     used anywhere within the function.  This implies the function
     prologue should save register R, provided it is not one of the
     call-used registers.  (`TARGET_ASM_FUNCTION_EPILOGUE' must
     likewise use `regs_ever_live'.)

     On machines that have "register windows", the function entry code
     does not save on the stack the registers that are in the windows,
     even if they are supposed to be preserved by function calls;
     instead it takes appropriate steps to "push" the register stack,
     if any non-call-used registers are used in the function.

     On machines where functions may or may not have frame-pointers, the
     function entry code must vary accordingly; it must set up the frame
     pointer if one is wanted, and not otherwise.  To determine whether
     a frame pointer is in wanted, the macro can refer to the variable
     `frame_pointer_needed'.  The variable's value will be 1 at run
     time in a function that needs a frame pointer.  *Note
     Elimination::.

     The function entry code is responsible for allocating any stack
     space required for the function.  This stack space consists of the
     regions listed below.  In most cases, these regions are allocated
     in the order listed, with the last listed region closest to the
     top of the stack (the lowest address if `STACK_GROWS_DOWNWARD' is
     defined, and the highest address if it is not defined).  You can
     use a different order for a machine if doing so is more convenient
     or required for compatibility reasons.  Except in cases where
     required by standard or by a debugger, there is no reason why the
     stack layout used by GCC need agree with that used by other
     compilers for a machine.

 -- Target Hook: void TARGET_ASM_FUNCTION_END_PROLOGUE (FILE *FILE)
     If defined, a function that outputs assembler code at the end of a
     prologue.  This should be used when the function prologue is being
     emitted as RTL, and you have some extra assembler that needs to be
     emitted.  *Note prologue instruction pattern::.

 -- Target Hook: void TARGET_ASM_FUNCTION_BEGIN_EPILOGUE (FILE *FILE)
     If defined, a function that outputs assembler code at the start of
     an epilogue.  This should be used when the function epilogue is
     being emitted as RTL, and you have some extra assembler that needs
     to be emitted.  *Note epilogue instruction pattern::.

 -- Target Hook: void TARGET_ASM_FUNCTION_EPILOGUE (FILE *FILE,
          HOST_WIDE_INT SIZE)
     If defined, a function that outputs the assembler code for exit
     from a function.  The epilogue is responsible for restoring the
     saved registers and stack pointer to their values when the
     function was called, and returning control to the caller.  This
     macro takes the same arguments as the macro
     `TARGET_ASM_FUNCTION_PROLOGUE', and the registers to restore are
     determined from `regs_ever_live' and `CALL_USED_REGISTERS' in the
     same way.

     On some machines, there is a single instruction that does all the
     work of returning from the function.  On these machines, give that
     instruction the name `return' and do not define the macro
     `TARGET_ASM_FUNCTION_EPILOGUE' at all.

     Do not define a pattern named `return' if you want the
     `TARGET_ASM_FUNCTION_EPILOGUE' to be used.  If you want the target
     switches to control whether return instructions or epilogues are
     used, define a `return' pattern with a validity condition that
     tests the target switches appropriately.  If the `return'
     pattern's validity condition is false, epilogues will be used.

     On machines where functions may or may not have frame-pointers, the
     function exit code must vary accordingly.  Sometimes the code for
     these two cases is completely different.  To determine whether a
     frame pointer is wanted, the macro can refer to the variable
     `frame_pointer_needed'.  The variable's value will be 1 when
     compiling a function that needs a frame pointer.

     Normally, `TARGET_ASM_FUNCTION_PROLOGUE' and
     `TARGET_ASM_FUNCTION_EPILOGUE' must treat leaf functions specially.
     The C variable `current_function_is_leaf' is nonzero for such a
     function.  *Note Leaf Functions::.

     On some machines, some functions pop their arguments on exit while
     others leave that for the caller to do.  For example, the 68020
     when given `-mrtd' pops arguments in functions that take a fixed
     number of arguments.

     Your definition of the macro `RETURN_POPS_ARGS' decides which
     functions pop their own arguments.  `TARGET_ASM_FUNCTION_EPILOGUE'
     needs to know what was decided.  The number of bytes of the current
     function's arguments that this function should pop is available in
     `crtl->args.pops_args'.  *Note Scalar Return::.

   * A region of `crtl->args.pretend_args_size' bytes of uninitialized
     space just underneath the first argument arriving on the stack.
     (This may not be at the very start of the allocated stack region
     if the calling sequence has pushed anything else since pushing the
     stack arguments.  But usually, on such machines, nothing else has
     been pushed yet, because the function prologue itself does all the
     pushing.)  This region is used on machines where an argument may
     be passed partly in registers and partly in memory, and, in some
     cases to support the features in `<stdarg.h>'.

   * An area of memory used to save certain registers used by the
     function.  The size of this area, which may also include space for
     such things as the return address and pointers to previous stack
     frames, is machine-specific and usually depends on which registers
     have been used in the function.  Machines with register windows
     often do not require a save area.

   * A region of at least SIZE bytes, possibly rounded up to an
     allocation boundary, to contain the local variables of the
     function.  On some machines, this region and the save area may
     occur in the opposite order, with the save area closer to the top
     of the stack.

   * Optionally, when `ACCUMULATE_OUTGOING_ARGS' is defined, a region of
     `crtl->outgoing_args_size' bytes to be used for outgoing argument
     lists of the function.  *Note Stack Arguments::.

 -- Macro: EXIT_IGNORE_STACK
     Define this macro as a C expression that is nonzero if the return
     instruction or the function epilogue ignores the value of the stack
     pointer; in other words, if it is safe to delete an instruction to
     adjust the stack pointer before a return from the function.  The
     default is 0.

     Note that this macro's value is relevant only for functions for
     which frame pointers are maintained.  It is never safe to delete a
     final stack adjustment in a function that has no frame pointer,
     and the compiler knows this regardless of `EXIT_IGNORE_STACK'.

 -- Macro: EPILOGUE_USES (REGNO)
     Define this macro as a C expression that is nonzero for registers
     that are used by the epilogue or the `return' pattern.  The stack
     and frame pointer registers are already assumed to be used as
     needed.

 -- Macro: EH_USES (REGNO)
     Define this macro as a C expression that is nonzero for registers
     that are used by the exception handling mechanism, and so should
     be considered live on entry to an exception edge.

 -- Target Hook: void TARGET_ASM_OUTPUT_MI_THUNK (FILE *FILE, tree
          THUNK_FNDECL, HOST_WIDE_INT DELTA, HOST_WIDE_INT
          VCALL_OFFSET, tree FUNCTION)
     A function that outputs the assembler code for a thunk function,
     used to implement C++ virtual function calls with multiple
     inheritance.  The thunk acts as a wrapper around a virtual
     function, adjusting the implicit object parameter before handing
     control off to the real function.

     First, emit code to add the integer DELTA to the location that
     contains the incoming first argument.  Assume that this argument
     contains a pointer, and is the one used to pass the `this' pointer
     in C++.  This is the incoming argument _before_ the function
     prologue, e.g. `%o0' on a sparc.  The addition must preserve the
     values of all other incoming arguments.

     Then, if VCALL_OFFSET is nonzero, an additional adjustment should
     be made after adding `delta'.  In particular, if P is the adjusted
     pointer, the following adjustment should be made:

          p += (*((ptrdiff_t **)p))[vcall_offset/sizeof(ptrdiff_t)]

     After the additions, emit code to jump to FUNCTION, which is a
     `FUNCTION_DECL'.  This is a direct pure jump, not a call, and does
     not touch the return address.  Hence returning from FUNCTION will
     return to whoever called the current `thunk'.

     The effect must be as if FUNCTION had been called directly with
     the adjusted first argument.  This macro is responsible for
     emitting all of the code for a thunk function;
     `TARGET_ASM_FUNCTION_PROLOGUE' and `TARGET_ASM_FUNCTION_EPILOGUE'
     are not invoked.

     The THUNK_FNDECL is redundant.  (DELTA and FUNCTION have already
     been extracted from it.)  It might possibly be useful on some
     targets, but probably not.

     If you do not define this macro, the target-independent code in
     the C++ front end will generate a less efficient heavyweight thunk
     that calls FUNCTION instead of jumping to it.  The generic
     approach does not support varargs.

 -- Target Hook: bool TARGET_ASM_CAN_OUTPUT_MI_THUNK (const_tree
          THUNK_FNDECL, HOST_WIDE_INT DELTA, HOST_WIDE_INT
          VCALL_OFFSET, const_tree FUNCTION)
     A function that returns true if TARGET_ASM_OUTPUT_MI_THUNK would
     be able to output the assembler code for the thunk function
     specified by the arguments it is passed, and false otherwise.  In
     the latter case, the generic approach will be used by the C++
     front end, with the limitations previously exposed.


File: gccint.info,  Node: Profiling,  Next: Tail Calls,  Prev: Function Entry,  Up: Stack and Calling

17.10.12 Generating Code for Profiling
--------------------------------------

These macros will help you generate code for profiling.

 -- Macro: FUNCTION_PROFILER (FILE, LABELNO)
     A C statement or compound statement to output to FILE some
     assembler code to call the profiling subroutine `mcount'.

     The details of how `mcount' expects to be called are determined by
     your operating system environment, not by GCC.  To figure them out,
     compile a small program for profiling using the system's installed
     C compiler and look at the assembler code that results.

     Older implementations of `mcount' expect the address of a counter
     variable to be loaded into some register.  The name of this
     variable is `LP' followed by the number LABELNO, so you would
     generate the name using `LP%d' in a `fprintf'.

 -- Macro: PROFILE_HOOK
     A C statement or compound statement to output to FILE some assembly
     code to call the profiling subroutine `mcount' even the target does
     not support profiling.

 -- Macro: NO_PROFILE_COUNTERS
     Define this macro to be an expression with a nonzero value if the
     `mcount' subroutine on your system does not need a counter variable
     allocated for each function.  This is true for almost all modern
     implementations.  If you define this macro, you must not use the
     LABELNO argument to `FUNCTION_PROFILER'.

 -- Macro: PROFILE_BEFORE_PROLOGUE
     Define this macro if the code for function profiling should come
     before the function prologue.  Normally, the profiling code comes
     after.


File: gccint.info,  Node: Tail Calls,  Next: Stack Smashing Protection,  Prev: Profiling,  Up: Stack and Calling

17.10.13 Permitting tail calls
------------------------------

 -- Target Hook: bool TARGET_FUNCTION_OK_FOR_SIBCALL (tree DECL, tree
          EXP)
     True if it is ok to do sibling call optimization for the specified
     call expression EXP.  DECL will be the called function, or `NULL'
     if this is an indirect call.

     It is not uncommon for limitations of calling conventions to
     prevent tail calls to functions outside the current unit of
     translation, or during PIC compilation.  The hook is used to
     enforce these restrictions, as the `sibcall' md pattern can not
     fail, or fall over to a "normal" call.  The criteria for
     successful sibling call optimization may vary greatly between
     different architectures.

 -- Target Hook: void TARGET_EXTRA_LIVE_ON_ENTRY (bitmap REGS)
     Add any hard registers to REGS that are live on entry to the
     function.  This hook only needs to be defined to provide registers
     that cannot be found by examination of FUNCTION_ARG_REGNO_P, the
     callee saved registers, STATIC_CHAIN_INCOMING_REGNUM,
     STATIC_CHAIN_REGNUM, TARGET_STRUCT_VALUE_RTX,
     FRAME_POINTER_REGNUM, EH_USES, FRAME_POINTER_REGNUM,
     ARG_POINTER_REGNUM, and the PIC_OFFSET_TABLE_REGNUM.

 -- Target Hook: void TARGET_SET_UP_BY_PROLOGUE (struct
          hard_reg_set_container *)
     This hook should add additional registers that are computed by the
     prologue to the hard regset for shrink-wrapping optimization
     purposes.

 -- Target Hook: bool TARGET_WARN_FUNC_RETURN (tree)
     True if a function's return statements should be checked for
     matching the function's return type.  This includes checking for
     falling off the end of a non-void function.  Return false if no
     such check should be made.


File: gccint.info,  Node: Stack Smashing Protection,  Prev: Tail Calls,  Up: Stack and Calling

17.10.14 Stack smashing protection
----------------------------------

 -- Target Hook: tree TARGET_STACK_PROTECT_GUARD (void)
     This hook returns a `DECL' node for the external variable to use
     for the stack protection guard.  This variable is initialized by
     the runtime to some random value and is used to initialize the
     guard value that is placed at the top of the local stack frame.
     The type of this variable must be `ptr_type_node'.

     The default version of this hook creates a variable called
     `__stack_chk_guard', which is normally defined in `libgcc2.c'.

 -- Target Hook: tree TARGET_STACK_PROTECT_FAIL (void)
     This hook returns a `CALL_EXPR' that alerts the runtime that the
     stack protect guard variable has been modified.  This expression
     should involve a call to a `noreturn' function.

     The default version of this hook invokes a function called
     `__stack_chk_fail', taking no arguments.  This function is
     normally defined in `libgcc2.c'.

 -- Common Target Hook: bool TARGET_SUPPORTS_SPLIT_STACK (bool REPORT,
          struct gcc_options *OPTS)
     Whether this target supports splitting the stack when the options
     described in OPTS have been passed.  This is called after options
     have been parsed, so the target may reject splitting the stack in
     some configurations.  The default version of this hook returns
     false.  If REPORT is true, this function may issue a warning or
     error; if REPORT is false, it must simply return a value


File: gccint.info,  Node: Varargs,  Next: Trampolines,  Prev: Stack and Calling,  Up: Target Macros

17.11 Implementing the Varargs Macros
=====================================

GCC comes with an implementation of `<varargs.h>' and `<stdarg.h>' that
work without change on machines that pass arguments on the stack.
Other machines require their own implementations of varargs, and the
two machine independent header files must have conditionals to include
it.

 ISO `<stdarg.h>' differs from traditional `<varargs.h>' mainly in the
calling convention for `va_start'.  The traditional implementation
takes just one argument, which is the variable in which to store the
argument pointer.  The ISO implementation of `va_start' takes an
additional second argument.  The user is supposed to write the last
named argument of the function here.

 However, `va_start' should not use this argument.  The way to find the
end of the named arguments is with the built-in functions described
below.

 -- Macro: __builtin_saveregs ()
     Use this built-in function to save the argument registers in
     memory so that the varargs mechanism can access them.  Both ISO
     and traditional versions of `va_start' must use
     `__builtin_saveregs', unless you use
     `TARGET_SETUP_INCOMING_VARARGS' (see below) instead.

     On some machines, `__builtin_saveregs' is open-coded under the
     control of the target hook `TARGET_EXPAND_BUILTIN_SAVEREGS'.  On
     other machines, it calls a routine written in assembler language,
     found in `libgcc2.c'.

     Code generated for the call to `__builtin_saveregs' appears at the
     beginning of the function, as opposed to where the call to
     `__builtin_saveregs' is written, regardless of what the code is.
     This is because the registers must be saved before the function
     starts to use them for its own purposes.

 -- Macro: __builtin_next_arg (LASTARG)
     This builtin returns the address of the first anonymous stack
     argument, as type `void *'.  If `ARGS_GROW_DOWNWARD', it returns
     the address of the location above the first anonymous stack
     argument.  Use it in `va_start' to initialize the pointer for
     fetching arguments from the stack.  Also use it in `va_start' to
     verify that the second parameter LASTARG is the last named argument
     of the current function.

 -- Macro: __builtin_classify_type (OBJECT)
     Since each machine has its own conventions for which data types are
     passed in which kind of register, your implementation of `va_arg'
     has to embody these conventions.  The easiest way to categorize the
     specified data type is to use `__builtin_classify_type' together
     with `sizeof' and `__alignof__'.

     `__builtin_classify_type' ignores the value of OBJECT, considering
     only its data type.  It returns an integer describing what kind of
     type that is--integer, floating, pointer, structure, and so on.

     The file `typeclass.h' defines an enumeration that you can use to
     interpret the values of `__builtin_classify_type'.

 These machine description macros help implement varargs:

 -- Target Hook: rtx TARGET_EXPAND_BUILTIN_SAVEREGS (void)
     If defined, this hook produces the machine-specific code for a
     call to `__builtin_saveregs'.  This code will be moved to the very
     beginning of the function, before any parameter access are made.
     The return value of this function should be an RTX that contains
     the value to use as the return of `__builtin_saveregs'.

 -- Target Hook: void TARGET_SETUP_INCOMING_VARARGS (cumulative_args_t
          ARGS_SO_FAR, enum machine_mode MODE, tree TYPE, int
          *PRETEND_ARGS_SIZE, int SECOND_TIME)
     This target hook offers an alternative to using
     `__builtin_saveregs' and defining the hook
     `TARGET_EXPAND_BUILTIN_SAVEREGS'.  Use it to store the anonymous
     register arguments into the stack so that all the arguments appear
     to have been passed consecutively on the stack.  Once this is
     done, you can use the standard implementation of varargs that
     works for machines that pass all their arguments on the stack.

     The argument ARGS_SO_FAR points to the `CUMULATIVE_ARGS' data
     structure, containing the values that are obtained after
     processing the named arguments.  The arguments MODE and TYPE
     describe the last named argument--its machine mode and its data
     type as a tree node.

     The target hook should do two things: first, push onto the stack
     all the argument registers _not_ used for the named arguments, and
     second, store the size of the data thus pushed into the
     `int'-valued variable pointed to by PRETEND_ARGS_SIZE.  The value
     that you store here will serve as additional offset for setting up
     the stack frame.

     Because you must generate code to push the anonymous arguments at
     compile time without knowing their data types,
     `TARGET_SETUP_INCOMING_VARARGS' is only useful on machines that
     have just a single category of argument register and use it
     uniformly for all data types.

     If the argument SECOND_TIME is nonzero, it means that the
     arguments of the function are being analyzed for the second time.
     This happens for an inline function, which is not actually
     compiled until the end of the source file.  The hook
     `TARGET_SETUP_INCOMING_VARARGS' should not generate any
     instructions in this case.

 -- Target Hook: bool TARGET_STRICT_ARGUMENT_NAMING (cumulative_args_t
          CA)
     Define this hook to return `true' if the location where a function
     argument is passed depends on whether or not it is a named
     argument.

     This hook controls how the NAMED argument to `TARGET_FUNCTION_ARG'
     is set for varargs and stdarg functions.  If this hook returns
     `true', the NAMED argument is always true for named arguments, and
     false for unnamed arguments.  If it returns `false', but
     `TARGET_PRETEND_OUTGOING_VARARGS_NAMED' returns `true', then all
     arguments are treated as named.  Otherwise, all named arguments
     except the last are treated as named.

     You need not define this hook if it always returns `false'.

 -- Target Hook: bool TARGET_PRETEND_OUTGOING_VARARGS_NAMED
          (cumulative_args_t CA)
     If you need to conditionally change ABIs so that one works with
     `TARGET_SETUP_INCOMING_VARARGS', but the other works like neither
     `TARGET_SETUP_INCOMING_VARARGS' nor
     `TARGET_STRICT_ARGUMENT_NAMING' was defined, then define this hook
     to return `true' if `TARGET_SETUP_INCOMING_VARARGS' is used,
     `false' otherwise.  Otherwise, you should not define this hook.


File: gccint.info,  Node: Trampolines,  Next: Library Calls,  Prev: Varargs,  Up: Target Macros

17.12 Trampolines for Nested Functions
======================================

A "trampoline" is a small piece of code that is created at run time
when the address of a nested function is taken.  It normally resides on
the stack, in the stack frame of the containing function.  These macros
tell GCC how to generate code to allocate and initialize a trampoline.

 The instructions in the trampoline must do two things: load a constant
address into the static chain register, and jump to the real address of
the nested function.  On CISC machines such as the m68k, this requires
two instructions, a move immediate and a jump.  Then the two addresses
exist in the trampoline as word-long immediate operands.  On RISC
machines, it is often necessary to load each address into a register in
two parts.  Then pieces of each address form separate immediate
operands.

 The code generated to initialize the trampoline must store the variable
parts--the static chain value and the function address--into the
immediate operands of the instructions.  On a CISC machine, this is
simply a matter of copying each address to a memory reference at the
proper offset from the start of the trampoline.  On a RISC machine, it
may be necessary to take out pieces of the address and store them
separately.

 -- Target Hook: void TARGET_ASM_TRAMPOLINE_TEMPLATE (FILE *F)
     This hook is called by `assemble_trampoline_template' to output,
     on the stream F, assembler code for a block of data that contains
     the constant parts of a trampoline.  This code should not include a
     label--the label is taken care of automatically.

     If you do not define this hook, it means no template is needed for
     the target.  Do not define this hook on systems where the block
     move code to copy the trampoline into place would be larger than
     the code to generate it on the spot.

 -- Macro: TRAMPOLINE_SECTION
     Return the section into which the trampoline template is to be
     placed (*note Sections::).  The default value is
     `readonly_data_section'.

 -- Macro: TRAMPOLINE_SIZE
     A C expression for the size in bytes of the trampoline, as an
     integer.

 -- Macro: TRAMPOLINE_ALIGNMENT
     Alignment required for trampolines, in bits.

     If you don't define this macro, the value of `FUNCTION_ALIGNMENT'
     is used for aligning trampolines.

 -- Target Hook: void TARGET_TRAMPOLINE_INIT (rtx M_TRAMP, tree FNDECL,
          rtx STATIC_CHAIN)
     This hook is called to initialize a trampoline.  M_TRAMP is an RTX
     for the memory block for the trampoline; FNDECL is the
     `FUNCTION_DECL' for the nested function; STATIC_CHAIN is an RTX
     for the static chain value that should be passed to the function
     when it is called.

     If the target defines `TARGET_ASM_TRAMPOLINE_TEMPLATE', then the
     first thing this hook should do is emit a block move into M_TRAMP
     from the memory block returned by `assemble_trampoline_template'.
     Note that the block move need only cover the constant parts of the
     trampoline.  If the target isolates the variable parts of the
     trampoline to the end, not all `TRAMPOLINE_SIZE' bytes need be
     copied.

     If the target requires any other actions, such as flushing caches
     or enabling stack execution, these actions should be performed
     after initializing the trampoline proper.

 -- Target Hook: rtx TARGET_TRAMPOLINE_ADJUST_ADDRESS (rtx ADDR)
     This hook should perform any machine-specific adjustment in the
     address of the trampoline.  Its argument contains the address of
     the memory block that was passed to `TARGET_TRAMPOLINE_INIT'.  In
     case the address to be used for a function call should be
     different from the address at which the template was stored, the
     different address should be returned; otherwise ADDR should be
     returned unchanged.  If this hook is not defined, ADDR will be
     used for function calls.

 Implementing trampolines is difficult on many machines because they
have separate instruction and data caches.  Writing into a stack
location fails to clear the memory in the instruction cache, so when
the program jumps to that location, it executes the old contents.

 Here are two possible solutions.  One is to clear the relevant parts of
the instruction cache whenever a trampoline is set up.  The other is to
make all trampolines identical, by having them jump to a standard
subroutine.  The former technique makes trampoline execution faster; the
latter makes initialization faster.

 To clear the instruction cache when a trampoline is initialized, define
the following macro.

 -- Macro: CLEAR_INSN_CACHE (BEG, END)
     If defined, expands to a C expression clearing the _instruction
     cache_ in the specified interval.  The definition of this macro
     would typically be a series of `asm' statements.  Both BEG and END
     are both pointer expressions.

 To use a standard subroutine, define the following macro.  In addition,
you must make sure that the instructions in a trampoline fill an entire
cache line with identical instructions, or else ensure that the
beginning of the trampoline code is always aligned at the same point in
its cache line.  Look in `m68k.h' as a guide.

 -- Macro: TRANSFER_FROM_TRAMPOLINE
     Define this macro if trampolines need a special subroutine to do
     their work.  The macro should expand to a series of `asm'
     statements which will be compiled with GCC.  They go in a library
     function named `__transfer_from_trampoline'.

     If you need to avoid executing the ordinary prologue code of a
     compiled C function when you jump to the subroutine, you can do so
     by placing a special label of your own in the assembler code.  Use
     one `asm' statement to generate an assembler label, and another to
     make the label global.  Then trampolines can use that label to
     jump directly to your special assembler code.


File: gccint.info,  Node: Library Calls,  Next: Addressing Modes,  Prev: Trampolines,  Up: Target Macros

17.13 Implicit Calls to Library Routines
========================================

Here is an explanation of implicit calls to library routines.

 -- Macro: DECLARE_LIBRARY_RENAMES
     This macro, if defined, should expand to a piece of C code that
     will get expanded when compiling functions for libgcc.a.  It can
     be used to provide alternate names for GCC's internal library
     functions if there are ABI-mandated names that the compiler should
     provide.

 -- Target Hook: void TARGET_INIT_LIBFUNCS (void)
     This hook should declare additional library routines or rename
     existing ones, using the functions `set_optab_libfunc' and
     `init_one_libfunc' defined in `optabs.c'.  `init_optabs' calls
     this macro after initializing all the normal library routines.

     The default is to do nothing.  Most ports don't need to define
     this hook.

 -- Target Hook: bool TARGET_LIBFUNC_GNU_PREFIX
     If false (the default), internal library routines start with two
     underscores.  If set to true, these routines start with `__gnu_'
     instead.  E.g., `__muldi3' changes to `__gnu_muldi3'.  This
     currently only affects functions defined in `libgcc2.c'.  If this
     is set to true, the `tm.h' file must also `#define
     LIBGCC2_GNU_PREFIX'.

 -- Macro: FLOAT_LIB_COMPARE_RETURNS_BOOL (MODE, COMPARISON)
     This macro should return `true' if the library routine that
     implements the floating point comparison operator COMPARISON in
     mode MODE will return a boolean, and FALSE if it will return a
     tristate.

     GCC's own floating point libraries return tristates from the
     comparison operators, so the default returns false always.  Most
     ports don't need to define this macro.

 -- Macro: TARGET_LIB_INT_CMP_BIASED
     This macro should evaluate to `true' if the integer comparison
     functions (like `__cmpdi2') return 0 to indicate that the first
     operand is smaller than the second, 1 to indicate that they are
     equal, and 2 to indicate that the first operand is greater than
     the second.  If this macro evaluates to `false' the comparison
     functions return -1, 0, and 1 instead of 0, 1, and 2.  If the
     target uses the routines in `libgcc.a', you do not need to define
     this macro.

 -- Macro: TARGET_EDOM
     The value of `EDOM' on the target machine, as a C integer constant
     expression.  If you don't define this macro, GCC does not attempt
     to deposit the value of `EDOM' into `errno' directly.  Look in
     `/usr/include/errno.h' to find the value of `EDOM' on your system.

     If you do not define `TARGET_EDOM', then compiled code reports
     domain errors by calling the library function and letting it
     report the error.  If mathematical functions on your system use
     `matherr' when there is an error, then you should leave
     `TARGET_EDOM' undefined so that `matherr' is used normally.

 -- Macro: GEN_ERRNO_RTX
     Define this macro as a C expression to create an rtl expression
     that refers to the global "variable" `errno'.  (On certain systems,
     `errno' may not actually be a variable.)  If you don't define this
     macro, a reasonable default is used.

 -- Macro: TARGET_C99_FUNCTIONS
     When this macro is nonzero, GCC will implicitly optimize `sin'
     calls into `sinf' and similarly for other functions defined by C99
     standard.  The default is zero because a number of existing
     systems lack support for these functions in their runtime so this
     macro needs to be redefined to one on systems that do support the
     C99 runtime.

 -- Macro: TARGET_HAS_SINCOS
     When this macro is nonzero, GCC will implicitly optimize calls to
     `sin' and `cos' with the same argument to a call to `sincos'.  The
     default is zero.  The target has to provide the following
     functions:
          void sincos(double x, double *sin, double *cos);
          void sincosf(float x, float *sin, float *cos);
          void sincosl(long double x, long double *sin, long double *cos);

 -- Macro: NEXT_OBJC_RUNTIME
     Set this macro to 1 to use the "NeXT" Objective-C message sending
     conventions by default.  This calling convention involves passing
     the object, the selector and the method arguments all at once to
     the method-lookup library function.  This is the usual setting
     when targeting Darwin/Mac OS X systems, which have the NeXT
     runtime installed.

     If the macro is set to 0, the "GNU" Objective-C message sending
     convention will be used by default.  This convention passes just
     the object and the selector to the method-lookup function, which
     returns a pointer to the method.

     In either case, it remains possible to select code-generation for
     the alternate scheme, by means of compiler command line switches.


File: gccint.info,  Node: Addressing Modes,  Next: Anchored Addresses,  Prev: Library Calls,  Up: Target Macros

17.14 Addressing Modes
======================

This is about addressing modes.

 -- Macro: HAVE_PRE_INCREMENT
 -- Macro: HAVE_PRE_DECREMENT
 -- Macro: HAVE_POST_INCREMENT
 -- Macro: HAVE_POST_DECREMENT
     A C expression that is nonzero if the machine supports
     pre-increment, pre-decrement, post-increment, or post-decrement
     addressing respectively.

 -- Macro: HAVE_PRE_MODIFY_DISP
 -- Macro: HAVE_POST_MODIFY_DISP
     A C expression that is nonzero if the machine supports pre- or
     post-address side-effect generation involving constants other than
     the size of the memory operand.

 -- Macro: HAVE_PRE_MODIFY_REG
 -- Macro: HAVE_POST_MODIFY_REG
     A C expression that is nonzero if the machine supports pre- or
     post-address side-effect generation involving a register
     displacement.

 -- Macro: CONSTANT_ADDRESS_P (X)
     A C expression that is 1 if the RTX X is a constant which is a
     valid address.  On most machines the default definition of
     `(CONSTANT_P (X) && GET_CODE (X) != CONST_DOUBLE)' is acceptable,
     but a few machines are more restrictive as to which constant
     addresses are supported.

 -- Macro: CONSTANT_P (X)
     `CONSTANT_P', which is defined by target-independent code, accepts
     integer-values expressions whose values are not explicitly known,
     such as `symbol_ref', `label_ref', and `high' expressions and
     `const' arithmetic expressions, in addition to `const_int' and
     `const_double' expressions.

 -- Macro: MAX_REGS_PER_ADDRESS
     A number, the maximum number of registers that can appear in a
     valid memory address.  Note that it is up to you to specify a
     value equal to the maximum number that
     `TARGET_LEGITIMATE_ADDRESS_P' would ever accept.

 -- Target Hook: bool TARGET_LEGITIMATE_ADDRESS_P (enum machine_mode
          MODE, rtx X, bool STRICT)
     A function that returns whether X (an RTX) is a legitimate memory
     address on the target machine for a memory operand of mode MODE.

     Legitimate addresses are defined in two variants: a strict variant
     and a non-strict one.  The STRICT parameter chooses which variant
     is desired by the caller.

     The strict variant is used in the reload pass.  It must be defined
     so that any pseudo-register that has not been allocated a hard
     register is considered a memory reference.  This is because in
     contexts where some kind of register is required, a
     pseudo-register with no hard register must be rejected.  For
     non-hard registers, the strict variant should look up the
     `reg_renumber' array; it should then proceed using the hard
     register number in the array, or treat the pseudo as a memory
     reference if the array holds `-1'.

     The non-strict variant is used in other passes.  It must be
     defined to accept all pseudo-registers in every context where some
     kind of register is required.

     Normally, constant addresses which are the sum of a `symbol_ref'
     and an integer are stored inside a `const' RTX to mark them as
     constant.  Therefore, there is no need to recognize such sums
     specifically as legitimate addresses.  Normally you would simply
     recognize any `const' as legitimate.

     Usually `PRINT_OPERAND_ADDRESS' is not prepared to handle constant
     sums that are not marked with  `const'.  It assumes that a naked
     `plus' indicates indexing.  If so, then you _must_ reject such
     naked constant sums as illegitimate addresses, so that none of
     them will be given to `PRINT_OPERAND_ADDRESS'.

     On some machines, whether a symbolic address is legitimate depends
     on the section that the address refers to.  On these machines,
     define the target hook `TARGET_ENCODE_SECTION_INFO' to store the
     information into the `symbol_ref', and then check for it here.
     When you see a `const', you will have to look inside it to find the
     `symbol_ref' in order to determine the section.  *Note Assembler
     Format::.

     Some ports are still using a deprecated legacy substitute for this
     hook, the `GO_IF_LEGITIMATE_ADDRESS' macro.  This macro has this
     syntax:

          #define GO_IF_LEGITIMATE_ADDRESS (MODE, X, LABEL)

     and should `goto LABEL' if the address X is a valid address on the
     target machine for a memory operand of mode MODE.

     Compiler source files that want to use the strict variant of this
     macro define the macro `REG_OK_STRICT'.  You should use an `#ifdef
     REG_OK_STRICT' conditional to define the strict variant in that
     case and the non-strict variant otherwise.

     Using the hook is usually simpler because it limits the number of
     files that are recompiled when changes are made.

 -- Macro: TARGET_MEM_CONSTRAINT
     A single character to be used instead of the default `'m''
     character for general memory addresses.  This defines the
     constraint letter which matches the memory addresses accepted by
     `TARGET_LEGITIMATE_ADDRESS_P'.  Define this macro if you want to
     support new address formats in your back end without changing the
     semantics of the `'m'' constraint.  This is necessary in order to
     preserve functionality of inline assembly constructs using the
     `'m'' constraint.

 -- Macro: FIND_BASE_TERM (X)
     A C expression to determine the base term of address X, or to
     provide a simplified version of X from which `alias.c' can easily
     find the base term.  This macro is used in only two places:
     `find_base_value' and `find_base_term' in `alias.c'.

     It is always safe for this macro to not be defined.  It exists so
     that alias analysis can understand machine-dependent addresses.

     The typical use of this macro is to handle addresses containing a
     label_ref or symbol_ref within an UNSPEC.

 -- Target Hook: rtx TARGET_LEGITIMIZE_ADDRESS (rtx X, rtx OLDX, enum
          machine_mode MODE)
     This hook is given an invalid memory address X for an operand of
     mode MODE and should try to return a valid memory address.

     X will always be the result of a call to `break_out_memory_refs',
     and OLDX will be the operand that was given to that function to
     produce X.

     The code of the hook should not alter the substructure of X.  If
     it transforms X into a more legitimate form, it should return the
     new X.

     It is not necessary for this hook to come up with a legitimate
     address, with the exception of native TLS addresses (*note
     Emulated TLS::).  The compiler has standard ways of doing so in
     all cases.  In fact, if the target supports only emulated TLS, it
     is safe to omit this hook or make it return X if it cannot find a
     valid way to legitimize the address.  But often a machine-dependent
     strategy can generate better code.

 -- Macro: LEGITIMIZE_RELOAD_ADDRESS (X, MODE, OPNUM, TYPE, IND_LEVELS,
          WIN)
     A C compound statement that attempts to replace X, which is an
     address that needs reloading, with a valid memory address for an
     operand of mode MODE.  WIN will be a C statement label elsewhere
     in the code.  It is not necessary to define this macro, but it
     might be useful for performance reasons.

     For example, on the i386, it is sometimes possible to use a single
     reload register instead of two by reloading a sum of two pseudo
     registers into a register.  On the other hand, for number of RISC
     processors offsets are limited so that often an intermediate
     address needs to be generated in order to address a stack slot.
     By defining `LEGITIMIZE_RELOAD_ADDRESS' appropriately, the
     intermediate addresses generated for adjacent some stack slots can
     be made identical, and thus be shared.

     _Note_: This macro should be used with caution.  It is necessary
     to know something of how reload works in order to effectively use
     this, and it is quite easy to produce macros that build in too
     much knowledge of reload internals.

     _Note_: This macro must be able to reload an address created by a
     previous invocation of this macro.  If it fails to handle such
     addresses then the compiler may generate incorrect code or abort.

     The macro definition should use `push_reload' to indicate parts
     that need reloading; OPNUM, TYPE and IND_LEVELS are usually
     suitable to be passed unaltered to `push_reload'.

     The code generated by this macro must not alter the substructure of
     X.  If it transforms X into a more legitimate form, it should
     assign X (which will always be a C variable) a new value.  This
     also applies to parts that you change indirectly by calling
     `push_reload'.

     The macro definition may use `strict_memory_address_p' to test if
     the address has become legitimate.

     If you want to change only a part of X, one standard way of doing
     this is to use `copy_rtx'.  Note, however, that it unshares only a
     single level of rtl.  Thus, if the part to be changed is not at the
     top level, you'll need to replace first the top level.  It is not
     necessary for this macro to come up with a legitimate address;
     but often a machine-dependent strategy can generate better code.

 -- Target Hook: bool TARGET_MODE_DEPENDENT_ADDRESS_P (const_rtx ADDR,
          addr_space_t ADDRSPACE)
     This hook returns `true' if memory address ADDR in address space
     ADDRSPACE can have different meanings depending on the machine
     mode of the memory reference it is used for or if the address is
     valid for some modes but not others.

     Autoincrement and autodecrement addresses typically have
     mode-dependent effects because the amount of the increment or
     decrement is the size of the operand being addressed.  Some
     machines have other mode-dependent addresses.  Many RISC machines
     have no mode-dependent addresses.

     You may assume that ADDR is a valid address for the machine.

     The default version of this hook returns `false'.

 -- Target Hook: bool TARGET_LEGITIMATE_CONSTANT_P (enum machine_mode
          MODE, rtx X)
     This hook returns true if X is a legitimate constant for a
     MODE-mode immediate operand on the target machine.  You can assume
     that X satisfies `CONSTANT_P', so you need not check this.

     The default definition returns true.

 -- Target Hook: rtx TARGET_DELEGITIMIZE_ADDRESS (rtx X)
     This hook is used to undo the possibly obfuscating effects of the
     `LEGITIMIZE_ADDRESS' and `LEGITIMIZE_RELOAD_ADDRESS' target
     macros.  Some backend implementations of these macros wrap symbol
     references inside an `UNSPEC' rtx to represent PIC or similar
     addressing modes.  This target hook allows GCC's optimizers to
     understand the semantics of these opaque `UNSPEC's by converting
     them back into their original form.

 -- Target Hook: bool TARGET_CONST_NOT_OK_FOR_DEBUG_P (rtx X)
     This hook should return true if X should not be emitted into debug
     sections.

 -- Target Hook: bool TARGET_CANNOT_FORCE_CONST_MEM (enum machine_mode
          MODE, rtx X)
     This hook should return true if X is of a form that cannot (or
     should not) be spilled to the constant pool.  MODE is the mode of
     X.

     The default version of this hook returns false.

     The primary reason to define this hook is to prevent reload from
     deciding that a non-legitimate constant would be better reloaded
     from the constant pool instead of spilling and reloading a register
     holding the constant.  This restriction is often true of addresses
     of TLS symbols for various targets.

 -- Target Hook: bool TARGET_USE_BLOCKS_FOR_CONSTANT_P (enum
          machine_mode MODE, const_rtx X)
     This hook should return true if pool entries for constant X can be
     placed in an `object_block' structure.  MODE is the mode of X.

     The default version returns false for all constants.

 -- Target Hook: bool TARGET_USE_BLOCKS_FOR_DECL_P (const_tree DECL)
     This hook should return true if pool entries for DECL should be
     placed in an `object_block' structure.

     The default version returns true for all decls.

 -- Target Hook: tree TARGET_BUILTIN_RECIPROCAL (unsigned FN, bool
          MD_FN, bool SQRT)
     This hook should return the DECL of a function that implements
     reciprocal of the builtin function with builtin function code FN,
     or `NULL_TREE' if such a function is not available.  MD_FN is true
     when FN is a code of a machine-dependent builtin function.  When
     SQRT is true, additional optimizations that apply only to the
     reciprocal of a square root function are performed, and only
     reciprocals of `sqrt' function are valid.

 -- Target Hook: tree TARGET_VECTORIZE_BUILTIN_MASK_FOR_LOAD (void)
     This hook should return the DECL of a function F that given an
     address ADDR as an argument returns a mask M that can be used to
     extract from two vectors the relevant data that resides in ADDR in
     case ADDR is not properly aligned.

     The autovectorizer, when vectorizing a load operation from an
     address ADDR that may be unaligned, will generate two vector loads
     from the two aligned addresses around ADDR. It then generates a
     `REALIGN_LOAD' operation to extract the relevant data from the two
     loaded vectors. The first two arguments to `REALIGN_LOAD', V1 and
     V2, are the two vectors, each of size VS, and the third argument,
     OFF, defines how the data will be extracted from these two
     vectors: if OFF is 0, then the returned vector is V2; otherwise,
     the returned vector is composed from the last VS-OFF elements of
     V1 concatenated to the first OFF elements of V2.

     If this hook is defined, the autovectorizer will generate a call
     to F (using the DECL tree that this hook returns) and will use the
     return value of F as the argument OFF to `REALIGN_LOAD'.
     Therefore, the mask M returned by F should comply with the
     semantics expected by `REALIGN_LOAD' described above.  If this
     hook is not defined, then ADDR will be used as the argument OFF to
     `REALIGN_LOAD', in which case the low log2(VS) - 1 bits of ADDR
     will be considered.

 -- Target Hook: int TARGET_VECTORIZE_BUILTIN_VECTORIZATION_COST (enum
          vect_cost_for_stmt TYPE_OF_COST, tree VECTYPE, int MISALIGN)
     Returns cost of different scalar or vector statements for
     vectorization cost model.  For vector memory operations the cost
     may depend on type (VECTYPE) and misalignment value (MISALIGN).

 -- Target Hook: bool TARGET_VECTORIZE_VECTOR_ALIGNMENT_REACHABLE
          (const_tree TYPE, bool IS_PACKED)
     Return true if vector alignment is reachable (by peeling N
     iterations) for the given type.

 -- Target Hook: bool TARGET_VECTORIZE_VEC_PERM_CONST_OK (enum
          MACHINE_MODE, const unsigned char *SEL)
     Return true if a vector created for `vec_perm_const' is valid.

 -- Target Hook: tree TARGET_VECTORIZE_BUILTIN_CONVERSION (unsigned
          CODE, tree DEST_TYPE, tree SRC_TYPE)
     This hook should return the DECL of a function that implements
     conversion of the input vector of type SRC_TYPE to type DEST_TYPE.
     The value of CODE is one of the enumerators in `enum tree_code' and
     specifies how the conversion is to be applied (truncation,
     rounding, etc.).

     If this hook is defined, the autovectorizer will use the
     `TARGET_VECTORIZE_BUILTIN_CONVERSION' target hook when vectorizing
     conversion. Otherwise, it will return `NULL_TREE'.

 -- Target Hook: tree TARGET_VECTORIZE_BUILTIN_VECTORIZED_FUNCTION
          (tree FNDECL, tree VEC_TYPE_OUT, tree VEC_TYPE_IN)
     This hook should return the decl of a function that implements the
     vectorized variant of the builtin function with builtin function
     code CODE or `NULL_TREE' if such a function is not available.  The
     value of FNDECL is the builtin function declaration.  The return
     type of the vectorized function shall be of vector type
     VEC_TYPE_OUT and the argument types should be VEC_TYPE_IN.

 -- Target Hook: bool TARGET_VECTORIZE_SUPPORT_VECTOR_MISALIGNMENT
          (enum machine_mode MODE, const_tree TYPE, int MISALIGNMENT,
          bool IS_PACKED)
     This hook should return true if the target supports misaligned
     vector store/load of a specific factor denoted in the MISALIGNMENT
     parameter.  The vector store/load should be of machine mode MODE
     and the elements in the vectors should be of type TYPE.  IS_PACKED
     parameter is true if the memory access is defined in a packed
     struct.

 -- Target Hook: enum machine_mode TARGET_VECTORIZE_PREFERRED_SIMD_MODE
          (enum machine_mode MODE)
     This hook should return the preferred mode for vectorizing scalar
     mode MODE.  The default is equal to `word_mode', because the
     vectorizer can do some transformations even in absence of
     specialized SIMD hardware.

 -- Target Hook: unsigned int
TARGET_VECTORIZE_AUTOVECTORIZE_VECTOR_SIZES (void)
     This hook should return a mask of sizes that should be iterated
     over after trying to autovectorize using the vector size derived
     from the mode returned by `TARGET_VECTORIZE_PREFERRED_SIMD_MODE'.
     The default is zero which means to not iterate over other vector
     sizes.

 -- Target Hook: void * TARGET_VECTORIZE_INIT_COST (struct loop
          *LOOP_INFO)
     This hook should initialize target-specific data structures in
     preparation for modeling the costs of vectorizing a loop or basic
     block.  The default allocates three unsigned integers for
     accumulating costs for the prologue, body, and epilogue of the
     loop or basic block.  If LOOP_INFO is non-NULL, it identifies the
     loop being vectorized; otherwise a single block is being
     vectorized.

 -- Target Hook: unsigned TARGET_VECTORIZE_ADD_STMT_COST (void *DATA,
          int COUNT, enum vect_cost_for_stmt KIND, struct
          _stmt_vec_info *STMT_INFO, int MISALIGN, enum
          vect_cost_model_location WHERE)
     This hook should update the target-specific DATA in response to
     adding COUNT copies of the given KIND of statement to a loop or
     basic block.  The default adds the builtin vectorizer cost for the
     copies of the statement to the accumulator specified by WHERE,
     (the prologue, body, or epilogue) and returns the amount added.
     The return value should be viewed as a tentative cost that may
     later be revised.

 -- Target Hook: void TARGET_VECTORIZE_FINISH_COST (void *DATA,
          unsigned *PROLOGUE_COST, unsigned *BODY_COST, unsigned
          *EPILOGUE_COST)
     This hook should complete calculations of the cost of vectorizing
     a loop or basic block based on DATA, and return the prologue,
     body, and epilogue costs as unsigned integers.  The default
     returns the value of the three accumulators.

 -- Target Hook: void TARGET_VECTORIZE_DESTROY_COST_DATA (void *DATA)
     This hook should release DATA and any related data structures
     allocated by TARGET_VECTORIZE_INIT_COST.  The default releases the
     accumulator.

 -- Target Hook: tree TARGET_VECTORIZE_BUILTIN_TM_LOAD (tree)
     This hook should return the built-in decl needed to load a vector
     of the given type within a transaction.

 -- Target Hook: tree TARGET_VECTORIZE_BUILTIN_TM_STORE (tree)
     This hook should return the built-in decl needed to store a vector
     of the given type within a transaction.

 -- Target Hook: tree TARGET_VECTORIZE_BUILTIN_GATHER (const_tree
          MEM_VECTYPE, const_tree INDEX_TYPE, int SCALE)
     Target builtin that implements vector gather operation.
     MEM_VECTYPE is the vector type of the load and INDEX_TYPE is
     scalar type of the index, scaled by SCALE.  The default is
     `NULL_TREE' which means to not vectorize gather loads.


File: gccint.info,  Node: Anchored Addresses,  Next: Condition Code,  Prev: Addressing Modes,  Up: Target Macros

17.15 Anchored Addresses
========================

GCC usually addresses every static object as a separate entity.  For
example, if we have:

     static int a, b, c;
     int foo (void) { return a + b + c; }

 the code for `foo' will usually calculate three separate symbolic
addresses: those of `a', `b' and `c'.  On some targets, it would be
better to calculate just one symbolic address and access the three
variables relative to it.  The equivalent pseudocode would be something
like:

     int foo (void)
     {
       register int *xr = &x;
       return xr[&a - &x] + xr[&b - &x] + xr[&c - &x];
     }

 (which isn't valid C).  We refer to shared addresses like `x' as
"section anchors".  Their use is controlled by `-fsection-anchors'.

 The hooks below describe the target properties that GCC needs to know
in order to make effective use of section anchors.  It won't use
section anchors at all unless either `TARGET_MIN_ANCHOR_OFFSET' or
`TARGET_MAX_ANCHOR_OFFSET' is set to a nonzero value.

 -- Target Hook: HOST_WIDE_INT TARGET_MIN_ANCHOR_OFFSET
     The minimum offset that should be applied to a section anchor.  On
     most targets, it should be the smallest offset that can be applied
     to a base register while still giving a legitimate address for
     every mode.  The default value is 0.

 -- Target Hook: HOST_WIDE_INT TARGET_MAX_ANCHOR_OFFSET
     Like `TARGET_MIN_ANCHOR_OFFSET', but the maximum (inclusive)
     offset that should be applied to section anchors.  The default
     value is 0.

 -- Target Hook: void TARGET_ASM_OUTPUT_ANCHOR (rtx X)
     Write the assembly code to define section anchor X, which is a
     `SYMBOL_REF' for which `SYMBOL_REF_ANCHOR_P (X)' is true.  The
     hook is called with the assembly output position set to the
     beginning of `SYMBOL_REF_BLOCK (X)'.

     If `ASM_OUTPUT_DEF' is available, the hook's default definition
     uses it to define the symbol as `. + SYMBOL_REF_BLOCK_OFFSET (X)'.
     If `ASM_OUTPUT_DEF' is not available, the hook's default definition
     is `NULL', which disables the use of section anchors altogether.

 -- Target Hook: bool TARGET_USE_ANCHORS_FOR_SYMBOL_P (const_rtx X)
     Return true if GCC should attempt to use anchors to access
     `SYMBOL_REF' X.  You can assume `SYMBOL_REF_HAS_BLOCK_INFO_P (X)'
     and `!SYMBOL_REF_ANCHOR_P (X)'.

     The default version is correct for most targets, but you might
     need to intercept this hook to handle things like target-specific
     attributes or target-specific sections.


File: gccint.info,  Node: Condition Code,  Next: Costs,  Prev: Anchored Addresses,  Up: Target Macros

17.16 Condition Code Status
===========================

The macros in this section can be split in two families, according to
the two ways of representing condition codes in GCC.

 The first representation is the so called `(cc0)' representation
(*note Jump Patterns::), where all instructions can have an implicit
clobber of the condition codes.  The second is the condition code
register representation, which provides better schedulability for
architectures that do have a condition code register, but on which most
instructions do not affect it.  The latter category includes most RISC
machines.

 The implicit clobbering poses a strong restriction on the placement of
the definition and use of the condition code, which need to be in
adjacent insns for machines using `(cc0)'.  This can prevent important
optimizations on some machines.  For example, on the IBM RS/6000, there
is a delay for taken branches unless the condition code register is set
three instructions earlier than the conditional branch.  The instruction
scheduler cannot perform this optimization if it is not permitted to
separate the definition and use of the condition code register.

 For this reason, it is possible and suggested to use a register to
represent the condition code for new ports.  If there is a specific
condition code register in the machine, use a hard register.  If the
condition code or comparison result can be placed in any general
register, or if there are multiple condition registers, use a pseudo
register.  Registers used to store the condition code value will
usually have a mode that is in class `MODE_CC'.

 Alternatively, you can use `BImode' if the comparison operator is
specified already in the compare instruction.  In this case, you are not
interested in most macros in this section.

* Menu:

* CC0 Condition Codes::      Old style representation of condition codes.
* MODE_CC Condition Codes::  Modern representation of condition codes.
* Cond Exec Macros::         Macros to control conditional execution.


File: gccint.info,  Node: CC0 Condition Codes,  Next: MODE_CC Condition Codes,  Up: Condition Code

17.16.1 Representation of condition codes using `(cc0)'
-------------------------------------------------------

The file `conditions.h' defines a variable `cc_status' to describe how
the condition code was computed (in case the interpretation of the
condition code depends on the instruction that it was set by).  This
variable contains the RTL expressions on which the condition code is
currently based, and several standard flags.

 Sometimes additional machine-specific flags must be defined in the
machine description header file.  It can also add additional
machine-specific information by defining `CC_STATUS_MDEP'.

 -- Macro: CC_STATUS_MDEP
     C code for a data type which is used for declaring the `mdep'
     component of `cc_status'.  It defaults to `int'.

     This macro is not used on machines that do not use `cc0'.

 -- Macro: CC_STATUS_MDEP_INIT
     A C expression to initialize the `mdep' field to "empty".  The
     default definition does nothing, since most machines don't use the
     field anyway.  If you want to use the field, you should probably
     define this macro to initialize it.

     This macro is not used on machines that do not use `cc0'.

 -- Macro: NOTICE_UPDATE_CC (EXP, INSN)
     A C compound statement to set the components of `cc_status'
     appropriately for an insn INSN whose body is EXP.  It is this
     macro's responsibility to recognize insns that set the condition
     code as a byproduct of other activity as well as those that
     explicitly set `(cc0)'.

     This macro is not used on machines that do not use `cc0'.

     If there are insns that do not set the condition code but do alter
     other machine registers, this macro must check to see whether they
     invalidate the expressions that the condition code is recorded as
     reflecting.  For example, on the 68000, insns that store in address
     registers do not set the condition code, which means that usually
     `NOTICE_UPDATE_CC' can leave `cc_status' unaltered for such insns.
     But suppose that the previous insn set the condition code based on
     location `a4@(102)' and the current insn stores a new value in
     `a4'.  Although the condition code is not changed by this, it will
     no longer be true that it reflects the contents of `a4@(102)'.
     Therefore, `NOTICE_UPDATE_CC' must alter `cc_status' in this case
     to say that nothing is known about the condition code value.

     The definition of `NOTICE_UPDATE_CC' must be prepared to deal with
     the results of peephole optimization: insns whose patterns are
     `parallel' RTXs containing various `reg', `mem' or constants which
     are just the operands.  The RTL structure of these insns is not
     sufficient to indicate what the insns actually do.  What
     `NOTICE_UPDATE_CC' should do when it sees one is just to run
     `CC_STATUS_INIT'.

     A possible definition of `NOTICE_UPDATE_CC' is to call a function
     that looks at an attribute (*note Insn Attributes::) named, for
     example, `cc'.  This avoids having detailed information about
     patterns in two places, the `md' file and in `NOTICE_UPDATE_CC'.


File: gccint.info,  Node: MODE_CC Condition Codes,  Next: Cond Exec Macros,  Prev: CC0 Condition Codes,  Up: Condition Code

17.16.2 Representation of condition codes using registers
---------------------------------------------------------

 -- Macro: SELECT_CC_MODE (OP, X, Y)
     On many machines, the condition code may be produced by other
     instructions than compares, for example the branch can use
     directly the condition code set by a subtract instruction.
     However, on some machines when the condition code is set this way
     some bits (such as the overflow bit) are not set in the same way
     as a test instruction, so that a different branch instruction must
     be used for some conditional branches.  When this happens, use the
     machine mode of the condition code register to record different
     formats of the condition code register.  Modes can also be used to
     record which compare instruction (e.g. a signed or an unsigned
     comparison) produced the condition codes.

     If other modes than `CCmode' are required, add them to
     `MACHINE-modes.def' and define `SELECT_CC_MODE' to choose a mode
     given an operand of a compare.  This is needed because the modes
     have to be chosen not only during RTL generation but also, for
     example, by instruction combination.  The result of
     `SELECT_CC_MODE' should be consistent with the mode used in the
     patterns; for example to support the case of the add on the SPARC
     discussed above, we have the pattern

          (define_insn ""
            [(set (reg:CC_NOOV 0)
                  (compare:CC_NOOV
                    (plus:SI (match_operand:SI 0 "register_operand" "%r")
                             (match_operand:SI 1 "arith_operand" "rI"))
                    (const_int 0)))]
            ""
            "...")

     together with a `SELECT_CC_MODE' that returns `CC_NOOVmode' for
     comparisons whose argument is a `plus':

          #define SELECT_CC_MODE(OP,X,Y) \
            (GET_MODE_CLASS (GET_MODE (X)) == MODE_FLOAT          \
             ? ((OP == EQ || OP == NE) ? CCFPmode : CCFPEmode)    \
             : ((GET_CODE (X) == PLUS || GET_CODE (X) == MINUS    \
                 || GET_CODE (X) == NEG) \
                ? CC_NOOVmode : CCmode))

     Another reason to use modes is to retain information on which
     operands were used by the comparison; see `REVERSIBLE_CC_MODE'
     later in this section.

     You should define this macro if and only if you define extra CC
     modes in `MACHINE-modes.def'.

 -- Target Hook: void TARGET_CANONICALIZE_COMPARISON (int *CODE, rtx
          *OP0, rtx *OP1, bool OP0_PRESERVE_VALUE) (CODE, OP0, OP1,
          OP0_PRESERVE_VALUE)
     On some machines not all possible comparisons are defined, but you
     can convert an invalid comparison into a valid one.  For example,
     the Alpha does not have a `GT' comparison, but you can use an `LT'
     comparison instead and swap the order of the operands.

     On such machines, implement this hook to do any required
     conversions.  CODE is the initial comparison code and OP0 and OP1
     are the left and right operands of the comparison, respectively.
     If OP0_PRESERVE_VALUE is `true' the implementation is not allowed
     to change the value of OP0 since the value might be used in RTXs
     which aren't comparisons.  E.g. the implementation is not allowed
     to swap operands in that case.

     GCC will not assume that the comparison resulting from this macro
     is valid but will see if the resulting insn matches a pattern in
     the `md' file.

     You need not to implement this hook if it would never change the
     comparison code or operands.

 -- Macro: REVERSIBLE_CC_MODE (MODE)
     A C expression whose value is one if it is always safe to reverse a
     comparison whose mode is MODE.  If `SELECT_CC_MODE' can ever
     return MODE for a floating-point inequality comparison, then
     `REVERSIBLE_CC_MODE (MODE)' must be zero.

     You need not define this macro if it would always returns zero or
     if the floating-point format is anything other than
     `IEEE_FLOAT_FORMAT'.  For example, here is the definition used on
     the SPARC, where floating-point inequality comparisons are always
     given `CCFPEmode':

          #define REVERSIBLE_CC_MODE(MODE)  ((MODE) != CCFPEmode)

 -- Macro: REVERSE_CONDITION (CODE, MODE)
     A C expression whose value is reversed condition code of the CODE
     for comparison done in CC_MODE MODE.  The macro is used only in
     case `REVERSIBLE_CC_MODE (MODE)' is nonzero.  Define this macro in
     case machine has some non-standard way how to reverse certain
     conditionals.  For instance in case all floating point conditions
     are non-trapping, compiler may freely convert unordered compares
     to ordered one.  Then definition may look like:

          #define REVERSE_CONDITION(CODE, MODE) \
             ((MODE) != CCFPmode ? reverse_condition (CODE) \
              : reverse_condition_maybe_unordered (CODE))

 -- Target Hook: bool TARGET_FIXED_CONDITION_CODE_REGS (unsigned int
          *P1, unsigned int *P2)
     On targets which do not use `(cc0)', and which use a hard register
     rather than a pseudo-register to hold condition codes, the regular
     CSE passes are often not able to identify cases in which the hard
     register is set to a common value.  Use this hook to enable a
     small pass which optimizes such cases.  This hook should return
     true to enable this pass, and it should set the integers to which
     its arguments point to the hard register numbers used for
     condition codes.  When there is only one such register, as is true
     on most systems, the integer pointed to by P2 should be set to
     `INVALID_REGNUM'.

     The default version of this hook returns false.

 -- Target Hook: enum machine_mode TARGET_CC_MODES_COMPATIBLE (enum
          machine_mode M1, enum machine_mode M2)
     On targets which use multiple condition code modes in class
     `MODE_CC', it is sometimes the case that a comparison can be
     validly done in more than one mode.  On such a system, define this
     target hook to take two mode arguments and to return a mode in
     which both comparisons may be validly done.  If there is no such
     mode, return `VOIDmode'.

     The default version of this hook checks whether the modes are the
     same.  If they are, it returns that mode.  If they are different,
     it returns `VOIDmode'.


File: gccint.info,  Node: Cond Exec Macros,  Prev: MODE_CC Condition Codes,  Up: Condition Code

17.16.3 Macros to control conditional execution
-----------------------------------------------

There is one macro that may need to be defined for targets supporting
conditional execution, independent of how they represent conditional
branches.


File: gccint.info,  Node: Costs,  Next: Scheduling,  Prev: Condition Code,  Up: Target Macros

17.17 Describing Relative Costs of Operations
=============================================

These macros let you describe the relative speed of various operations
on the target machine.

 -- Macro: REGISTER_MOVE_COST (MODE, FROM, TO)
     A C expression for the cost of moving data of mode MODE from a
     register in class FROM to one in class TO.  The classes are
     expressed using the enumeration values such as `GENERAL_REGS'.  A
     value of 2 is the default; other values are interpreted relative to
     that.

     It is not required that the cost always equal 2 when FROM is the
     same as TO; on some machines it is expensive to move between
     registers if they are not general registers.

     If reload sees an insn consisting of a single `set' between two
     hard registers, and if `REGISTER_MOVE_COST' applied to their
     classes returns a value of 2, reload does not check to ensure that
     the constraints of the insn are met.  Setting a cost of other than
     2 will allow reload to verify that the constraints are met.  You
     should do this if the `movM' pattern's constraints do not allow
     such copying.

     These macros are obsolete, new ports should use the target hook
     `TARGET_REGISTER_MOVE_COST' instead.

 -- Target Hook: int TARGET_REGISTER_MOVE_COST (enum machine_mode MODE,
          reg_class_t FROM, reg_class_t TO)
     This target hook should return the cost of moving data of mode MODE
     from a register in class FROM to one in class TO.  The classes are
     expressed using the enumeration values such as `GENERAL_REGS'.  A
     value of 2 is the default; other values are interpreted relative to
     that.

     It is not required that the cost always equal 2 when FROM is the
     same as TO; on some machines it is expensive to move between
     registers if they are not general registers.

     If reload sees an insn consisting of a single `set' between two
     hard registers, and if `TARGET_REGISTER_MOVE_COST' applied to their
     classes returns a value of 2, reload does not check to ensure that
     the constraints of the insn are met.  Setting a cost of other than
     2 will allow reload to verify that the constraints are met.  You
     should do this if the `movM' pattern's constraints do not allow
     such copying.

     The default version of this function returns 2.

 -- Macro: MEMORY_MOVE_COST (MODE, CLASS, IN)
     A C expression for the cost of moving data of mode MODE between a
     register of class CLASS and memory; IN is zero if the value is to
     be written to memory, nonzero if it is to be read in.  This cost
     is relative to those in `REGISTER_MOVE_COST'.  If moving between
     registers and memory is more expensive than between two registers,
     you should define this macro to express the relative cost.

     If you do not define this macro, GCC uses a default cost of 4 plus
     the cost of copying via a secondary reload register, if one is
     needed.  If your machine requires a secondary reload register to
     copy between memory and a register of CLASS but the reload
     mechanism is more complex than copying via an intermediate, define
     this macro to reflect the actual cost of the move.

     GCC defines the function `memory_move_secondary_cost' if secondary
     reloads are needed.  It computes the costs due to copying via a
     secondary register.  If your machine copies from memory using a
     secondary register in the conventional way but the default base
     value of 4 is not correct for your machine, define this macro to
     add some other value to the result of that function.  The
     arguments to that function are the same as to this macro.

     These macros are obsolete, new ports should use the target hook
     `TARGET_MEMORY_MOVE_COST' instead.

 -- Target Hook: int TARGET_MEMORY_MOVE_COST (enum machine_mode MODE,
          reg_class_t RCLASS, bool IN)
     This target hook should return the cost of moving data of mode MODE
     between a register of class RCLASS and memory; IN is `false' if
     the value is to be written to memory, `true' if it is to be read
     in.  This cost is relative to those in `TARGET_REGISTER_MOVE_COST'.
     If moving between registers and memory is more expensive than
     between two registers, you should add this target hook to express
     the relative cost.

     If you do not add this target hook, GCC uses a default cost of 4
     plus the cost of copying via a secondary reload register, if one is
     needed.  If your machine requires a secondary reload register to
     copy between memory and a register of RCLASS but the reload
     mechanism is more complex than copying via an intermediate, use
     this target hook to reflect the actual cost of the move.

     GCC defines the function `memory_move_secondary_cost' if secondary
     reloads are needed.  It computes the costs due to copying via a
     secondary register.  If your machine copies from memory using a
     secondary register in the conventional way but the default base
     value of 4 is not correct for your machine, use this target hook
     to add some other value to the result of that function.  The
     arguments to that function are the same as to this target hook.

 -- Macro: BRANCH_COST (SPEED_P, PREDICTABLE_P)
     A C expression for the cost of a branch instruction.  A value of 1
     is the default; other values are interpreted relative to that.
     Parameter SPEED_P is true when the branch in question should be
     optimized for speed.  When it is false, `BRANCH_COST' should
     return a value optimal for code size rather than performance.
     PREDICTABLE_P is true for well-predicted branches. On many
     architectures the `BRANCH_COST' can be reduced then.

 Here are additional macros which do not specify precise relative costs,
but only that certain actions are more expensive than GCC would
ordinarily expect.

 -- Macro: SLOW_BYTE_ACCESS
     Define this macro as a C expression which is nonzero if accessing
     less than a word of memory (i.e. a `char' or a `short') is no
     faster than accessing a word of memory, i.e., if such access
     require more than one instruction or if there is no difference in
     cost between byte and (aligned) word loads.

     When this macro is not defined, the compiler will access a field by
     finding the smallest containing object; when it is defined, a
     fullword load will be used if alignment permits.  Unless bytes
     accesses are faster than word accesses, using word accesses is
     preferable since it may eliminate subsequent memory access if
     subsequent accesses occur to other fields in the same word of the
     structure, but to different bytes.

 -- Macro: SLOW_UNALIGNED_ACCESS (MODE, ALIGNMENT)
     Define this macro to be the value 1 if memory accesses described
     by the MODE and ALIGNMENT parameters have a cost many times greater
     than aligned accesses, for example if they are emulated in a trap
     handler.

     When this macro is nonzero, the compiler will act as if
     `STRICT_ALIGNMENT' were nonzero when generating code for block
     moves.  This can cause significantly more instructions to be
     produced.  Therefore, do not set this macro nonzero if unaligned
     accesses only add a cycle or two to the time for a memory access.

     If the value of this macro is always zero, it need not be defined.
     If this macro is defined, it should produce a nonzero value when
     `STRICT_ALIGNMENT' is nonzero.

 -- Macro: MOVE_RATIO (SPEED)
     The threshold of number of scalar memory-to-memory move insns,
     _below_ which a sequence of insns should be generated instead of a
     string move insn or a library call.  Increasing the value will
     always make code faster, but eventually incurs high cost in
     increased code size.

     Note that on machines where the corresponding move insn is a
     `define_expand' that emits a sequence of insns, this macro counts
     the number of such sequences.

     The parameter SPEED is true if the code is currently being
     optimized for speed rather than size.

     If you don't define this, a reasonable default is used.

 -- Macro: MOVE_BY_PIECES_P (SIZE, ALIGNMENT)
     A C expression used to determine whether `move_by_pieces' will be
     used to copy a chunk of memory, or whether some other block move
     mechanism will be used.  Defaults to 1 if `move_by_pieces_ninsns'
     returns less than `MOVE_RATIO'.

 -- Macro: MOVE_MAX_PIECES
     A C expression used by `move_by_pieces' to determine the largest
     unit a load or store used to copy memory is.  Defaults to
     `MOVE_MAX'.

 -- Macro: CLEAR_RATIO (SPEED)
     The threshold of number of scalar move insns, _below_ which a
     sequence of insns should be generated to clear memory instead of a
     string clear insn or a library call.  Increasing the value will
     always make code faster, but eventually incurs high cost in
     increased code size.

     The parameter SPEED is true if the code is currently being
     optimized for speed rather than size.

     If you don't define this, a reasonable default is used.

 -- Macro: CLEAR_BY_PIECES_P (SIZE, ALIGNMENT)
     A C expression used to determine whether `clear_by_pieces' will be
     used to clear a chunk of memory, or whether some other block clear
     mechanism will be used.  Defaults to 1 if `move_by_pieces_ninsns'
     returns less than `CLEAR_RATIO'.

 -- Macro: SET_RATIO (SPEED)
     The threshold of number of scalar move insns, _below_ which a
     sequence of insns should be generated to set memory to a constant
     value, instead of a block set insn or a library call.  Increasing
     the value will always make code faster, but eventually incurs high
     cost in increased code size.

     The parameter SPEED is true if the code is currently being
     optimized for speed rather than size.

     If you don't define this, it defaults to the value of `MOVE_RATIO'.

 -- Macro: SET_BY_PIECES_P (SIZE, ALIGNMENT)
     A C expression used to determine whether `store_by_pieces' will be
     used to set a chunk of memory to a constant value, or whether some
     other mechanism will be used.  Used by `__builtin_memset' when
     storing values other than constant zero.  Defaults to 1 if
     `move_by_pieces_ninsns' returns less than `SET_RATIO'.

 -- Macro: STORE_BY_PIECES_P (SIZE, ALIGNMENT)
     A C expression used to determine whether `store_by_pieces' will be
     used to set a chunk of memory to a constant string value, or
     whether some other mechanism will be used.  Used by
     `__builtin_strcpy' when called with a constant source string.
     Defaults to 1 if `move_by_pieces_ninsns' returns less than
     `MOVE_RATIO'.

 -- Macro: USE_LOAD_POST_INCREMENT (MODE)
     A C expression used to determine whether a load postincrement is a
     good thing to use for a given mode.  Defaults to the value of
     `HAVE_POST_INCREMENT'.

 -- Macro: USE_LOAD_POST_DECREMENT (MODE)
     A C expression used to determine whether a load postdecrement is a
     good thing to use for a given mode.  Defaults to the value of
     `HAVE_POST_DECREMENT'.

 -- Macro: USE_LOAD_PRE_INCREMENT (MODE)
     A C expression used to determine whether a load preincrement is a
     good thing to use for a given mode.  Defaults to the value of
     `HAVE_PRE_INCREMENT'.

 -- Macro: USE_LOAD_PRE_DECREMENT (MODE)
     A C expression used to determine whether a load predecrement is a
     good thing to use for a given mode.  Defaults to the value of
     `HAVE_PRE_DECREMENT'.

 -- Macro: USE_STORE_POST_INCREMENT (MODE)
     A C expression used to determine whether a store postincrement is
     a good thing to use for a given mode.  Defaults to the value of
     `HAVE_POST_INCREMENT'.

 -- Macro: USE_STORE_POST_DECREMENT (MODE)
     A C expression used to determine whether a store postdecrement is
     a good thing to use for a given mode.  Defaults to the value of
     `HAVE_POST_DECREMENT'.

 -- Macro: USE_STORE_PRE_INCREMENT (MODE)
     This macro is used to determine whether a store preincrement is a
     good thing to use for a given mode.  Defaults to the value of
     `HAVE_PRE_INCREMENT'.

 -- Macro: USE_STORE_PRE_DECREMENT (MODE)
     This macro is used to determine whether a store predecrement is a
     good thing to use for a given mode.  Defaults to the value of
     `HAVE_PRE_DECREMENT'.

 -- Macro: NO_FUNCTION_CSE
     Define this macro if it is as good or better to call a constant
     function address than to call an address kept in a register.

 -- Macro: LOGICAL_OP_NON_SHORT_CIRCUIT
     Define this macro if a non-short-circuit operation produced by
     `fold_range_test ()' is optimal.  This macro defaults to true if
     `BRANCH_COST' is greater than or equal to the value 2.

 -- Target Hook: bool TARGET_RTX_COSTS (rtx X, int CODE, int
          OUTER_CODE, int OPNO, int *TOTAL, bool SPEED)
     This target hook describes the relative costs of RTL expressions.

     The cost may depend on the precise form of the expression, which is
     available for examination in X, and the fact that X appears as
     operand OPNO of an expression with rtx code OUTER_CODE.  That is,
     the hook can assume that there is some rtx Y such that `GET_CODE
     (Y) == OUTER_CODE' and such that either (a) `XEXP (Y, OPNO) == X'
     or (b) `XVEC (Y, OPNO)' contains X.

     CODE is X's expression code--redundant, since it can be obtained
     with `GET_CODE (X)'.

     In implementing this hook, you can use the construct
     `COSTS_N_INSNS (N)' to specify a cost equal to N fast instructions.

     On entry to the hook, `*TOTAL' contains a default estimate for the
     cost of the expression.  The hook should modify this value as
     necessary.  Traditionally, the default costs are `COSTS_N_INSNS
     (5)' for multiplications, `COSTS_N_INSNS (7)' for division and
     modulus operations, and `COSTS_N_INSNS (1)' for all other
     operations.

     When optimizing for code size, i.e. when `speed' is false, this
     target hook should be used to estimate the relative size cost of
     an expression, again relative to `COSTS_N_INSNS'.

     The hook returns true when all subexpressions of X have been
     processed, and false when `rtx_cost' should recurse.

 -- Target Hook: int TARGET_ADDRESS_COST (rtx ADDRESS, enum
          machine_mode MODE, addr_space_t AS, bool SPEED)
     This hook computes the cost of an addressing mode that contains
     ADDRESS.  If not defined, the cost is computed from the ADDRESS
     expression and the `TARGET_RTX_COST' hook.

     For most CISC machines, the default cost is a good approximation
     of the true cost of the addressing mode.  However, on RISC
     machines, all instructions normally have the same length and
     execution time.  Hence all addresses will have equal costs.

     In cases where more than one form of an address is known, the form
     with the lowest cost will be used.  If multiple forms have the
     same, lowest, cost, the one that is the most complex will be used.

     For example, suppose an address that is equal to the sum of a
     register and a constant is used twice in the same basic block.
     When this macro is not defined, the address will be computed in a
     register and memory references will be indirect through that
     register.  On machines where the cost of the addressing mode
     containing the sum is no higher than that of a simple indirect
     reference, this will produce an additional instruction and
     possibly require an additional register.  Proper specification of
     this macro eliminates this overhead for such machines.

     This hook is never called with an invalid address.

     On machines where an address involving more than one register is as
     cheap as an address computation involving only one register,
     defining `TARGET_ADDRESS_COST' to reflect this can cause two
     registers to be live over a region of code where only one would
     have been if `TARGET_ADDRESS_COST' were not defined in that
     manner.  This effect should be considered in the definition of
     this macro.  Equivalent costs should probably only be given to
     addresses with different numbers of registers on machines with
     lots of registers.


File: gccint.info,  Node: Scheduling,  Next: Sections,  Prev: Costs,  Up: Target Macros

17.18 Adjusting the Instruction Scheduler
=========================================

The instruction scheduler may need a fair amount of machine-specific
adjustment in order to produce good code.  GCC provides several target
hooks for this purpose.  It is usually enough to define just a few of
them: try the first ones in this list first.

 -- Target Hook: int TARGET_SCHED_ISSUE_RATE (void)
     This hook returns the maximum number of instructions that can ever
     issue at the same time on the target machine.  The default is one.
     Although the insn scheduler can define itself the possibility of
     issue an insn on the same cycle, the value can serve as an
     additional constraint to issue insns on the same simulated
     processor cycle (see hooks `TARGET_SCHED_REORDER' and
     `TARGET_SCHED_REORDER2').  This value must be constant over the
     entire compilation.  If you need it to vary depending on what the
     instructions are, you must use `TARGET_SCHED_VARIABLE_ISSUE'.

 -- Target Hook: int TARGET_SCHED_VARIABLE_ISSUE (FILE *FILE, int
          VERBOSE, rtx INSN, int MORE)
     This hook is executed by the scheduler after it has scheduled an
     insn from the ready list.  It should return the number of insns
     which can still be issued in the current cycle.  The default is
     `MORE - 1' for insns other than `CLOBBER' and `USE', which
     normally are not counted against the issue rate.  You should
     define this hook if some insns take more machine resources than
     others, so that fewer insns can follow them in the same cycle.
     FILE is either a null pointer, or a stdio stream to write any
     debug output to.  VERBOSE is the verbose level provided by
     `-fsched-verbose-N'.  INSN is the instruction that was scheduled.

 -- Target Hook: int TARGET_SCHED_ADJUST_COST (rtx INSN, rtx LINK, rtx
          DEP_INSN, int COST)
     This function corrects the value of COST based on the relationship
     between INSN and DEP_INSN through the dependence LINK.  It should
     return the new value.  The default is to make no adjustment to
     COST.  This can be used for example to specify to the scheduler
     using the traditional pipeline description that an output- or
     anti-dependence does not incur the same cost as a data-dependence.
     If the scheduler using the automaton based pipeline description,
     the cost of anti-dependence is zero and the cost of
     output-dependence is maximum of one and the difference of latency
     times of the first and the second insns.  If these values are not
     acceptable, you could use the hook to modify them too.  See also
     *note Processor pipeline description::.

 -- Target Hook: int TARGET_SCHED_ADJUST_PRIORITY (rtx INSN, int
          PRIORITY)
     This hook adjusts the integer scheduling priority PRIORITY of
     INSN.  It should return the new priority.  Increase the priority to
     execute INSN earlier, reduce the priority to execute INSN later.
     Do not define this hook if you do not need to adjust the
     scheduling priorities of insns.

 -- Target Hook: int TARGET_SCHED_REORDER (FILE *FILE, int VERBOSE, rtx
          *READY, int *N_READYP, int CLOCK)
     This hook is executed by the scheduler after it has scheduled the
     ready list, to allow the machine description to reorder it (for
     example to combine two small instructions together on `VLIW'
     machines).  FILE is either a null pointer, or a stdio stream to
     write any debug output to.  VERBOSE is the verbose level provided
     by `-fsched-verbose-N'.  READY is a pointer to the ready list of
     instructions that are ready to be scheduled.  N_READYP is a
     pointer to the number of elements in the ready list.  The scheduler
     reads the ready list in reverse order, starting with
     READY[*N_READYP - 1] and going to READY[0].  CLOCK is the timer
     tick of the scheduler.  You may modify the ready list and the
     number of ready insns.  The return value is the number of insns
     that can issue this cycle; normally this is just `issue_rate'.
     See also `TARGET_SCHED_REORDER2'.

 -- Target Hook: int TARGET_SCHED_REORDER2 (FILE *FILE, int VERBOSE,
          rtx *READY, int *N_READYP, int CLOCK)
     Like `TARGET_SCHED_REORDER', but called at a different time.  That
     function is called whenever the scheduler starts a new cycle.
     This one is called once per iteration over a cycle, immediately
     after `TARGET_SCHED_VARIABLE_ISSUE'; it can reorder the ready list
     and return the number of insns to be scheduled in the same cycle.
     Defining this hook can be useful if there are frequent situations
     where scheduling one insn causes other insns to become ready in
     the same cycle.  These other insns can then be taken into account
     properly.

 -- Target Hook: void TARGET_SCHED_DEPENDENCIES_EVALUATION_HOOK (rtx
          HEAD, rtx TAIL)
     This hook is called after evaluation forward dependencies of insns
     in chain given by two parameter values (HEAD and TAIL
     correspondingly) but before insns scheduling of the insn chain.
     For example, it can be used for better insn classification if it
     requires analysis of dependencies.  This hook can use backward and
     forward dependencies of the insn scheduler because they are already
     calculated.

 -- Target Hook: void TARGET_SCHED_INIT (FILE *FILE, int VERBOSE, int
          MAX_READY)
     This hook is executed by the scheduler at the beginning of each
     block of instructions that are to be scheduled.  FILE is either a
     null pointer, or a stdio stream to write any debug output to.
     VERBOSE is the verbose level provided by `-fsched-verbose-N'.
     MAX_READY is the maximum number of insns in the current scheduling
     region that can be live at the same time.  This can be used to
     allocate scratch space if it is needed, e.g. by
     `TARGET_SCHED_REORDER'.

 -- Target Hook: void TARGET_SCHED_FINISH (FILE *FILE, int VERBOSE)
     This hook is executed by the scheduler at the end of each block of
     instructions that are to be scheduled.  It can be used to perform
     cleanup of any actions done by the other scheduling hooks.  FILE
     is either a null pointer, or a stdio stream to write any debug
     output to.  VERBOSE is the verbose level provided by
     `-fsched-verbose-N'.

 -- Target Hook: void TARGET_SCHED_INIT_GLOBAL (FILE *FILE, int
          VERBOSE, int OLD_MAX_UID)
     This hook is executed by the scheduler after function level
     initializations.  FILE is either a null pointer, or a stdio stream
     to write any debug output to.  VERBOSE is the verbose level
     provided by `-fsched-verbose-N'.  OLD_MAX_UID is the maximum insn
     uid when scheduling begins.

 -- Target Hook: void TARGET_SCHED_FINISH_GLOBAL (FILE *FILE, int
          VERBOSE)
     This is the cleanup hook corresponding to
     `TARGET_SCHED_INIT_GLOBAL'.  FILE is either a null pointer, or a
     stdio stream to write any debug output to.  VERBOSE is the verbose
     level provided by `-fsched-verbose-N'.

 -- Target Hook: rtx TARGET_SCHED_DFA_PRE_CYCLE_INSN (void)
     The hook returns an RTL insn.  The automaton state used in the
     pipeline hazard recognizer is changed as if the insn were scheduled
     when the new simulated processor cycle starts.  Usage of the hook
     may simplify the automaton pipeline description for some VLIW
     processors.  If the hook is defined, it is used only for the
     automaton based pipeline description.  The default is not to
     change the state when the new simulated processor cycle starts.

 -- Target Hook: void TARGET_SCHED_INIT_DFA_PRE_CYCLE_INSN (void)
     The hook can be used to initialize data used by the previous hook.

 -- Target Hook: rtx TARGET_SCHED_DFA_POST_CYCLE_INSN (void)
     The hook is analogous to `TARGET_SCHED_DFA_PRE_CYCLE_INSN' but used
     to changed the state as if the insn were scheduled when the new
     simulated processor cycle finishes.

 -- Target Hook: void TARGET_SCHED_INIT_DFA_POST_CYCLE_INSN (void)
     The hook is analogous to `TARGET_SCHED_INIT_DFA_PRE_CYCLE_INSN' but
     used to initialize data used by the previous hook.

 -- Target Hook: void TARGET_SCHED_DFA_PRE_ADVANCE_CYCLE (void)
     The hook to notify target that the current simulated cycle is
     about to finish.  The hook is analogous to
     `TARGET_SCHED_DFA_PRE_CYCLE_INSN' but used to change the state in
     more complicated situations - e.g., when advancing state on a
     single insn is not enough.

 -- Target Hook: void TARGET_SCHED_DFA_POST_ADVANCE_CYCLE (void)
     The hook to notify target that new simulated cycle has just
     started.  The hook is analogous to
     `TARGET_SCHED_DFA_POST_CYCLE_INSN' but used to change the state in
     more complicated situations - e.g., when advancing state on a
     single insn is not enough.

 -- Target Hook: int TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD
          (void)
     This hook controls better choosing an insn from the ready insn
     queue for the DFA-based insn scheduler.  Usually the scheduler
     chooses the first insn from the queue.  If the hook returns a
     positive value, an additional scheduler code tries all
     permutations of `TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD
     ()' subsequent ready insns to choose an insn whose issue will
     result in maximal number of issued insns on the same cycle.  For
     the VLIW processor, the code could actually solve the problem of
     packing simple insns into the VLIW insn.  Of course, if the rules
     of VLIW packing are described in the automaton.

     This code also could be used for superscalar RISC processors.  Let
     us consider a superscalar RISC processor with 3 pipelines.  Some
     insns can be executed in pipelines A or B, some insns can be
     executed only in pipelines B or C, and one insn can be executed in
     pipeline B.  The processor may issue the 1st insn into A and the
     2nd one into B.  In this case, the 3rd insn will wait for freeing B
     until the next cycle.  If the scheduler issues the 3rd insn the
     first, the processor could issue all 3 insns per cycle.

     Actually this code demonstrates advantages of the automaton based
     pipeline hazard recognizer.  We try quickly and easy many insn
     schedules to choose the best one.

     The default is no multipass scheduling.

 -- Target Hook: int
TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD_GUARD (rtx INSN)
     This hook controls what insns from the ready insn queue will be
     considered for the multipass insn scheduling.  If the hook returns
     zero for INSN, the insn will be not chosen to be issued.

     The default is that any ready insns can be chosen to be issued.

 -- Target Hook: void TARGET_SCHED_FIRST_CYCLE_MULTIPASS_BEGIN (void
          *DATA, char *READY_TRY, int N_READY, bool FIRST_CYCLE_INSN_P)
     This hook prepares the target backend for a new round of multipass
     scheduling.

 -- Target Hook: void TARGET_SCHED_FIRST_CYCLE_MULTIPASS_ISSUE (void
          *DATA, char *READY_TRY, int N_READY, rtx INSN, const void
          *PREV_DATA)
     This hook is called when multipass scheduling evaluates
     instruction INSN.

 -- Target Hook: void TARGET_SCHED_FIRST_CYCLE_MULTIPASS_BACKTRACK
          (const void *DATA, char *READY_TRY, int N_READY)
     This is called when multipass scheduling backtracks from
     evaluation of an instruction.

 -- Target Hook: void TARGET_SCHED_FIRST_CYCLE_MULTIPASS_END (const
          void *DATA)
     This hook notifies the target about the result of the concluded
     current round of multipass scheduling.

 -- Target Hook: void TARGET_SCHED_FIRST_CYCLE_MULTIPASS_INIT (void
          *DATA)
     This hook initializes target-specific data used in multipass
     scheduling.

 -- Target Hook: void TARGET_SCHED_FIRST_CYCLE_MULTIPASS_FINI (void
          *DATA)
     This hook finalizes target-specific data used in multipass
     scheduling.

 -- Target Hook: int TARGET_SCHED_DFA_NEW_CYCLE (FILE *DUMP, int
          VERBOSE, rtx INSN, int LAST_CLOCK, int CLOCK, int *SORT_P)
     This hook is called by the insn scheduler before issuing INSN on
     cycle CLOCK.  If the hook returns nonzero, INSN is not issued on
     this processor cycle.  Instead, the processor cycle is advanced.
     If *SORT_P is zero, the insn ready queue is not sorted on the new
     cycle start as usually.  DUMP and VERBOSE specify the file and
     verbosity level to use for debugging output.  LAST_CLOCK and CLOCK
     are, respectively, the processor cycle on which the previous insn
     has been issued, and the current processor cycle.

 -- Target Hook: bool TARGET_SCHED_IS_COSTLY_DEPENDENCE (struct _dep
          *_DEP, int COST, int DISTANCE)
     This hook is used to define which dependences are considered
     costly by the target, so costly that it is not advisable to
     schedule the insns that are involved in the dependence too close
     to one another.  The parameters to this hook are as follows:  The
     first parameter _DEP is the dependence being evaluated.  The
     second parameter COST is the cost of the dependence as estimated
     by the scheduler, and the third parameter DISTANCE is the distance
     in cycles between the two insns.  The hook returns `true' if
     considering the distance between the two insns the dependence
     between them is considered costly by the target, and `false'
     otherwise.

     Defining this hook can be useful in multiple-issue out-of-order
     machines, where (a) it's practically hopeless to predict the
     actual data/resource delays, however: (b) there's a better chance
     to predict the actual grouping that will be formed, and (c)
     correctly emulating the grouping can be very important.  In such
     targets one may want to allow issuing dependent insns closer to
     one another--i.e., closer than the dependence distance;  however,
     not in cases of "costly dependences", which this hooks allows to
     define.

 -- Target Hook: void TARGET_SCHED_H_I_D_EXTENDED (void)
     This hook is called by the insn scheduler after emitting a new
     instruction to the instruction stream.  The hook notifies a target
     backend to extend its per instruction data structures.

 -- Target Hook: void * TARGET_SCHED_ALLOC_SCHED_CONTEXT (void)
     Return a pointer to a store large enough to hold target scheduling
     context.

 -- Target Hook: void TARGET_SCHED_INIT_SCHED_CONTEXT (void *TC, bool
          CLEAN_P)
     Initialize store pointed to by TC to hold target scheduling
     context.  It CLEAN_P is true then initialize TC as if scheduler is
     at the beginning of the block.  Otherwise, copy the current
     context into TC.

 -- Target Hook: void TARGET_SCHED_SET_SCHED_CONTEXT (void *TC)
     Copy target scheduling context pointed to by TC to the current
     context.

 -- Target Hook: void TARGET_SCHED_CLEAR_SCHED_CONTEXT (void *TC)
     Deallocate internal data in target scheduling context pointed to
     by TC.

 -- Target Hook: void TARGET_SCHED_FREE_SCHED_CONTEXT (void *TC)
     Deallocate a store for target scheduling context pointed to by TC.

 -- Target Hook: int TARGET_SCHED_SPECULATE_INSN (rtx INSN, int
          REQUEST, rtx *NEW_PAT)
     This hook is called by the insn scheduler when INSN has only
     speculative dependencies and therefore can be scheduled
     speculatively.  The hook is used to check if the pattern of INSN
     has a speculative version and, in case of successful check, to
     generate that speculative pattern.  The hook should return 1, if
     the instruction has a speculative form, or -1, if it doesn't.
     REQUEST describes the type of requested speculation.  If the
     return value equals 1 then NEW_PAT is assigned the generated
     speculative pattern.

 -- Target Hook: bool TARGET_SCHED_NEEDS_BLOCK_P (int DEP_STATUS)
     This hook is called by the insn scheduler during generation of
     recovery code for INSN.  It should return `true', if the
     corresponding check instruction should branch to recovery code, or
     `false' otherwise.

 -- Target Hook: rtx TARGET_SCHED_GEN_SPEC_CHECK (rtx INSN, rtx LABEL,
          int MUTATE_P)
     This hook is called by the insn scheduler to generate a pattern
     for recovery check instruction.  If MUTATE_P is zero, then INSN is
     a speculative instruction for which the check should be generated.
     LABEL is either a label of a basic block, where recovery code
     should be emitted, or a null pointer, when requested check doesn't
     branch to recovery code (a simple check).  If MUTATE_P is nonzero,
     then a pattern for a branchy check corresponding to a simple check
     denoted by INSN should be generated.  In this case LABEL can't be
     null.

 -- Target Hook: bool
TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD_GUARD_SPEC (const_rtx
          INSN)
     This hook is used as a workaround for
     `TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD_GUARD' not being
     called on the first instruction of the ready list.  The hook is
     used to discard speculative instructions that stand first in the
     ready list from being scheduled on the current cycle.  If the hook
     returns `false', INSN will not be chosen to be issued.  For
     non-speculative instructions, the hook should always return
     `true'.  For example, in the ia64 backend the hook is used to
     cancel data speculative insns when the ALAT table is nearly full.

 -- Target Hook: void TARGET_SCHED_SET_SCHED_FLAGS (struct
          spec_info_def *SPEC_INFO)
     This hook is used by the insn scheduler to find out what features
     should be enabled/used.  The structure *SPEC_INFO should be filled
     in by the target.  The structure describes speculation types that
     can be used in the scheduler.

 -- Target Hook: int TARGET_SCHED_SMS_RES_MII (struct ddg *G)
     This hook is called by the swing modulo scheduler to calculate a
     resource-based lower bound which is based on the resources
     available in the machine and the resources required by each
     instruction.  The target backend can use G to calculate such
     bound.  A very simple lower bound will be used in case this hook
     is not implemented: the total number of instructions divided by
     the issue rate.

 -- Target Hook: bool TARGET_SCHED_DISPATCH (rtx INSN, int X)
     This hook is called by Haifa Scheduler.  It returns true if
     dispatch scheduling is supported in hardware and the condition
     specified in the parameter is true.

 -- Target Hook: void TARGET_SCHED_DISPATCH_DO (rtx INSN, int X)
     This hook is called by Haifa Scheduler.  It performs the operation
     specified in its second parameter.

 -- Target Hook: bool TARGET_SCHED_EXPOSED_PIPELINE
     True if the processor has an exposed pipeline, which means that
     not just the order of instructions is important for correctness
     when scheduling, but also the latencies of operations.

 -- Target Hook: int TARGET_SCHED_REASSOCIATION_WIDTH (unsigned int
          OPC, enum machine_mode MODE)
     This hook is called by tree reassociator to determine a level of
     parallelism required in output calculations chain.


File: gccint.info,  Node: Sections,  Next: PIC,  Prev: Scheduling,  Up: Target Macros

17.19 Dividing the Output into Sections (Texts, Data, ...)
==========================================================

An object file is divided into sections containing different types of
data.  In the most common case, there are three sections: the "text
section", which holds instructions and read-only data; the "data
section", which holds initialized writable data; and the "bss section",
which holds uninitialized data.  Some systems have other kinds of
sections.

 `varasm.c' provides several well-known sections, such as
`text_section', `data_section' and `bss_section'.  The normal way of
controlling a `FOO_section' variable is to define the associated
`FOO_SECTION_ASM_OP' macro, as described below.  The macros are only
read once, when `varasm.c' initializes itself, so their values must be
run-time constants.  They may however depend on command-line flags.

 _Note:_ Some run-time files, such `crtstuff.c', also make use of the
`FOO_SECTION_ASM_OP' macros, and expect them to be string literals.

 Some assemblers require a different string to be written every time a
section is selected.  If your assembler falls into this category, you
should define the `TARGET_ASM_INIT_SECTIONS' hook and use
`get_unnamed_section' to set up the sections.

 You must always create a `text_section', either by defining
`TEXT_SECTION_ASM_OP' or by initializing `text_section' in
`TARGET_ASM_INIT_SECTIONS'.  The same is true of `data_section' and
`DATA_SECTION_ASM_OP'.  If you do not create a distinct
`readonly_data_section', the default is to reuse `text_section'.

 All the other `varasm.c' sections are optional, and are null if the
target does not provide them.

 -- Macro: TEXT_SECTION_ASM_OP
     A C expression whose value is a string, including spacing,
     containing the assembler operation that should precede
     instructions and read-only data.  Normally `"\t.text"' is right.

 -- Macro: HOT_TEXT_SECTION_NAME
     If defined, a C string constant for the name of the section
     containing most frequently executed functions of the program.  If
     not defined, GCC will provide a default definition if the target
     supports named sections.

 -- Macro: UNLIKELY_EXECUTED_TEXT_SECTION_NAME
     If defined, a C string constant for the name of the section
     containing unlikely executed functions in the program.

 -- Macro: DATA_SECTION_ASM_OP
     A C expression whose value is a string, including spacing,
     containing the assembler operation to identify the following data
     as writable initialized data.  Normally `"\t.data"' is right.

 -- Macro: SDATA_SECTION_ASM_OP
     If defined, a C expression whose value is a string, including
     spacing, containing the assembler operation to identify the
     following data as initialized, writable small data.

 -- Macro: READONLY_DATA_SECTION_ASM_OP
     A C expression whose value is a string, including spacing,
     containing the assembler operation to identify the following data
     as read-only initialized data.

 -- Macro: BSS_SECTION_ASM_OP
     If defined, a C expression whose value is a string, including
     spacing, containing the assembler operation to identify the
     following data as uninitialized global data.  If not defined, and
     `ASM_OUTPUT_ALIGNED_BSS' not defined, uninitialized global data
     will be output in the data section if `-fno-common' is passed,
     otherwise `ASM_OUTPUT_COMMON' will be used.

 -- Macro: SBSS_SECTION_ASM_OP
     If defined, a C expression whose value is a string, including
     spacing, containing the assembler operation to identify the
     following data as uninitialized, writable small data.

 -- Macro: TLS_COMMON_ASM_OP
     If defined, a C expression whose value is a string containing the
     assembler operation to identify the following data as thread-local
     common data.  The default is `".tls_common"'.

 -- Macro: TLS_SECTION_ASM_FLAG
     If defined, a C expression whose value is a character constant
     containing the flag used to mark a section as a TLS section.  The
     default is `'T''.

 -- Macro: INIT_SECTION_ASM_OP
     If defined, a C expression whose value is a string, including
     spacing, containing the assembler operation to identify the
     following data as initialization code.  If not defined, GCC will
     assume such a section does not exist.  This section has no
     corresponding `init_section' variable; it is used entirely in
     runtime code.

 -- Macro: FINI_SECTION_ASM_OP
     If defined, a C expression whose value is a string, including
     spacing, containing the assembler operation to identify the
     following data as finalization code.  If not defined, GCC will
     assume such a section does not exist.  This section has no
     corresponding `fini_section' variable; it is used entirely in
     runtime code.

 -- Macro: INIT_ARRAY_SECTION_ASM_OP
     If defined, a C expression whose value is a string, including
     spacing, containing the assembler operation to identify the
     following data as part of the `.init_array' (or equivalent)
     section.  If not defined, GCC will assume such a section does not
     exist.  Do not define both this macro and `INIT_SECTION_ASM_OP'.

 -- Macro: FINI_ARRAY_SECTION_ASM_OP
     If defined, a C expression whose value is a string, including
     spacing, containing the assembler operation to identify the
     following data as part of the `.fini_array' (or equivalent)
     section.  If not defined, GCC will assume such a section does not
     exist.  Do not define both this macro and `FINI_SECTION_ASM_OP'.

 -- Macro: CRT_CALL_STATIC_FUNCTION (SECTION_OP, FUNCTION)
     If defined, an ASM statement that switches to a different section
     via SECTION_OP, calls FUNCTION, and switches back to the text
     section.  This is used in `crtstuff.c' if `INIT_SECTION_ASM_OP' or
     `FINI_SECTION_ASM_OP' to calls to initialization and finalization
     functions from the init and fini sections.  By default, this macro
     uses a simple function call.  Some ports need hand-crafted
     assembly code to avoid dependencies on registers initialized in
     the function prologue or to ensure that constant pools don't end
     up too far way in the text section.

 -- Macro: TARGET_LIBGCC_SDATA_SECTION
     If defined, a string which names the section into which small
     variables defined in crtstuff and libgcc should go.  This is useful
     when the target has options for optimizing access to small data,
     and you want the crtstuff and libgcc routines to be conservative
     in what they expect of your application yet liberal in what your
     application expects.  For example, for targets with a `.sdata'
     section (like MIPS), you could compile crtstuff with `-G 0' so
     that it doesn't require small data support from your application,
     but use this macro to put small data into `.sdata' so that your
     application can access these variables whether it uses small data
     or not.

 -- Macro: FORCE_CODE_SECTION_ALIGN
     If defined, an ASM statement that aligns a code section to some
     arbitrary boundary.  This is used to force all fragments of the
     `.init' and `.fini' sections to have to same alignment and thus
     prevent the linker from having to add any padding.

 -- Macro: JUMP_TABLES_IN_TEXT_SECTION
     Define this macro to be an expression with a nonzero value if jump
     tables (for `tablejump' insns) should be output in the text
     section, along with the assembler instructions.  Otherwise, the
     readonly data section is used.

     This macro is irrelevant if there is no separate readonly data
     section.

 -- Target Hook: void TARGET_ASM_INIT_SECTIONS (void)
     Define this hook if you need to do something special to set up the
     `varasm.c' sections, or if your target has some special sections
     of its own that you need to create.

     GCC calls this hook after processing the command line, but before
     writing any assembly code, and before calling any of the
     section-returning hooks described below.

 -- Target Hook: int TARGET_ASM_RELOC_RW_MASK (void)
     Return a mask describing how relocations should be treated when
     selecting sections.  Bit 1 should be set if global relocations
     should be placed in a read-write section; bit 0 should be set if
     local relocations should be placed in a read-write section.

     The default version of this function returns 3 when `-fpic' is in
     effect, and 0 otherwise.  The hook is typically redefined when the
     target cannot support (some kinds of) dynamic relocations in
     read-only sections even in executables.

 -- Target Hook: section * TARGET_ASM_SELECT_SECTION (tree EXP, int
          RELOC, unsigned HOST_WIDE_INT ALIGN)
     Return the section into which EXP should be placed.  You can
     assume that EXP is either a `VAR_DECL' node or a constant of some
     sort.  RELOC indicates whether the initial value of EXP requires
     link-time relocations.  Bit 0 is set when variable contains local
     relocations only, while bit 1 is set for global relocations.
     ALIGN is the constant alignment in bits.

     The default version of this function takes care of putting
     read-only variables in `readonly_data_section'.

     See also USE_SELECT_SECTION_FOR_FUNCTIONS.

 -- Macro: USE_SELECT_SECTION_FOR_FUNCTIONS
     Define this macro if you wish TARGET_ASM_SELECT_SECTION to be
     called for `FUNCTION_DECL's as well as for variables and constants.

     In the case of a `FUNCTION_DECL', RELOC will be zero if the
     function has been determined to be likely to be called, and
     nonzero if it is unlikely to be called.

 -- Target Hook: void TARGET_ASM_UNIQUE_SECTION (tree DECL, int RELOC)
     Build up a unique section name, expressed as a `STRING_CST' node,
     and assign it to `DECL_SECTION_NAME (DECL)'.  As with
     `TARGET_ASM_SELECT_SECTION', RELOC indicates whether the initial
     value of EXP requires link-time relocations.

     The default version of this function appends the symbol name to the
     ELF section name that would normally be used for the symbol.  For
     example, the function `foo' would be placed in `.text.foo'.
     Whatever the actual target object format, this is often good
     enough.

 -- Target Hook: section * TARGET_ASM_FUNCTION_RODATA_SECTION (tree
          DECL)
     Return the readonly data section associated with
     `DECL_SECTION_NAME (DECL)'.  The default version of this function
     selects `.gnu.linkonce.r.name' if the function's section is
     `.gnu.linkonce.t.name', `.rodata.name' if function is in
     `.text.name', and the normal readonly-data section otherwise.

 -- Target Hook: const char * TARGET_ASM_MERGEABLE_RODATA_PREFIX
     Usually, the compiler uses the prefix `".rodata"' to construct
     section names for mergeable constant data.  Define this macro to
     override the string if a different section name should be used.

 -- Target Hook: section * TARGET_ASM_TM_CLONE_TABLE_SECTION (void)
     Return the section that should be used for transactional memory
     clone  tables.

 -- Target Hook: section * TARGET_ASM_SELECT_RTX_SECTION (enum
          machine_mode MODE, rtx X, unsigned HOST_WIDE_INT ALIGN)
     Return the section into which a constant X, of mode MODE, should
     be placed.  You can assume that X is some kind of constant in RTL.
     The argument MODE is redundant except in the case of a `const_int'
     rtx.  ALIGN is the constant alignment in bits.

     The default version of this function takes care of putting symbolic
     constants in `flag_pic' mode in `data_section' and everything else
     in `readonly_data_section'.

 -- Target Hook: tree TARGET_MANGLE_DECL_ASSEMBLER_NAME (tree DECL,
          tree ID)
     Define this hook if you need to postprocess the assembler name
     generated by target-independent code.  The ID provided to this
     hook will be the computed name (e.g., the macro `DECL_NAME' of the
     DECL in C, or the mangled name of the DECL in C++).  The return
     value of the hook is an `IDENTIFIER_NODE' for the appropriate
     mangled name on your target system.  The default implementation of
     this hook just returns the ID provided.

 -- Target Hook: void TARGET_ENCODE_SECTION_INFO (tree DECL, rtx RTL,
          int NEW_DECL_P)
     Define this hook if references to a symbol or a constant must be
     treated differently depending on something about the variable or
     function named by the symbol (such as what section it is in).

     The hook is executed immediately after rtl has been created for
     DECL, which may be a variable or function declaration or an entry
     in the constant pool.  In either case, RTL is the rtl in question.
     Do _not_ use `DECL_RTL (DECL)' in this hook; that field may not
     have been initialized yet.

     In the case of a constant, it is safe to assume that the rtl is a
     `mem' whose address is a `symbol_ref'.  Most decls will also have
     this form, but that is not guaranteed.  Global register variables,
     for instance, will have a `reg' for their rtl.  (Normally the
     right thing to do with such unusual rtl is leave it alone.)

     The NEW_DECL_P argument will be true if this is the first time
     that `TARGET_ENCODE_SECTION_INFO' has been invoked on this decl.
     It will be false for subsequent invocations, which will happen for
     duplicate declarations.  Whether or not anything must be done for
     the duplicate declaration depends on whether the hook examines
     `DECL_ATTRIBUTES'.  NEW_DECL_P is always true when the hook is
     called for a constant.

     The usual thing for this hook to do is to record flags in the
     `symbol_ref', using `SYMBOL_REF_FLAG' or `SYMBOL_REF_FLAGS'.
     Historically, the name string was modified if it was necessary to
     encode more than one bit of information, but this practice is now
     discouraged; use `SYMBOL_REF_FLAGS'.

     The default definition of this hook, `default_encode_section_info'
     in `varasm.c', sets a number of commonly-useful bits in
     `SYMBOL_REF_FLAGS'.  Check whether the default does what you need
     before overriding it.

 -- Target Hook: const char * TARGET_STRIP_NAME_ENCODING (const char
          *NAME)
     Decode NAME and return the real name part, sans the characters
     that `TARGET_ENCODE_SECTION_INFO' may have added.

 -- Target Hook: bool TARGET_IN_SMALL_DATA_P (const_tree EXP)
     Returns true if EXP should be placed into a "small data" section.
     The default version of this hook always returns false.

 -- Target Hook: bool TARGET_HAVE_SRODATA_SECTION
     Contains the value true if the target places read-only "small
     data" into a separate section.  The default value is false.

 -- Target Hook: bool TARGET_PROFILE_BEFORE_PROLOGUE (void)
     It returns true if target wants profile code emitted before
     prologue.

     The default version of this hook use the target macro
     `PROFILE_BEFORE_PROLOGUE'.

 -- Target Hook: bool TARGET_BINDS_LOCAL_P (const_tree EXP)
     Returns true if EXP names an object for which name resolution
     rules must resolve to the current "module" (dynamic shared library
     or executable image).

     The default version of this hook implements the name resolution
     rules for ELF, which has a looser model of global name binding
     than other currently supported object file formats.

 -- Target Hook: bool TARGET_HAVE_TLS
     Contains the value true if the target supports thread-local
     storage.  The default value is false.


File: gccint.info,  Node: PIC,  Next: Assembler Format,  Prev: Sections,  Up: Target Macros

17.20 Position Independent Code
===============================

This section describes macros that help implement generation of position
independent code.  Simply defining these macros is not enough to
generate valid PIC; you must also add support to the hook
`TARGET_LEGITIMATE_ADDRESS_P' and to the macro `PRINT_OPERAND_ADDRESS',
as well as `LEGITIMIZE_ADDRESS'.  You must modify the definition of
`movsi' to do something appropriate when the source operand contains a
symbolic address.  You may also need to alter the handling of switch
statements so that they use relative addresses.

 -- Macro: PIC_OFFSET_TABLE_REGNUM
     The register number of the register used to address a table of
     static data addresses in memory.  In some cases this register is
     defined by a processor's "application binary interface" (ABI).
     When this macro is defined, RTL is generated for this register
     once, as with the stack pointer and frame pointer registers.  If
     this macro is not defined, it is up to the machine-dependent files
     to allocate such a register (if necessary).  Note that this
     register must be fixed when in use (e.g.  when `flag_pic' is true).

 -- Macro: PIC_OFFSET_TABLE_REG_CALL_CLOBBERED
     A C expression that is nonzero if the register defined by
     `PIC_OFFSET_TABLE_REGNUM' is clobbered by calls.  If not defined,
     the default is zero.  Do not define this macro if
     `PIC_OFFSET_TABLE_REGNUM' is not defined.

 -- Macro: LEGITIMATE_PIC_OPERAND_P (X)
     A C expression that is nonzero if X is a legitimate immediate
     operand on the target machine when generating position independent
     code.  You can assume that X satisfies `CONSTANT_P', so you need
     not check this.  You can also assume FLAG_PIC is true, so you need
     not check it either.  You need not define this macro if all
     constants (including `SYMBOL_REF') can be immediate operands when
     generating position independent code.


File: gccint.info,  Node: Assembler Format,  Next: Debugging Info,  Prev: PIC,  Up: Target Macros

17.21 Defining the Output Assembler Language
============================================

This section describes macros whose principal purpose is to describe how
to write instructions in assembler language--rather than what the
instructions do.

* Menu:

* File Framework::       Structural information for the assembler file.
* Data Output::          Output of constants (numbers, strings, addresses).
* Uninitialized Data::   Output of uninitialized variables.
* Label Output::         Output and generation of labels.
* Initialization::       General principles of initialization
                         and termination routines.
* Macros for Initialization::
                         Specific macros that control the handling of
                         initialization and termination routines.
* Instruction Output::   Output of actual instructions.
* Dispatch Tables::      Output of jump tables.
* Exception Region Output:: Output of exception region code.
* Alignment Output::     Pseudo ops for alignment and skipping data.


File: gccint.info,  Node: File Framework,  Next: Data Output,  Up: Assembler Format

17.21.1 The Overall Framework of an Assembler File
--------------------------------------------------

This describes the overall framework of an assembly file.

 -- Target Hook: void TARGET_ASM_FILE_START (void)
     Output to `asm_out_file' any text which the assembler expects to
     find at the beginning of a file.  The default behavior is
     controlled by two flags, documented below.  Unless your target's
     assembler is quite unusual, if you override the default, you
     should call `default_file_start' at some point in your target
     hook.  This lets other target files rely on these variables.

 -- Target Hook: bool TARGET_ASM_FILE_START_APP_OFF
     If this flag is true, the text of the macro `ASM_APP_OFF' will be
     printed as the very first line in the assembly file, unless
     `-fverbose-asm' is in effect.  (If that macro has been defined to
     the empty string, this variable has no effect.)  With the normal
     definition of `ASM_APP_OFF', the effect is to notify the GNU
     assembler that it need not bother stripping comments or extra
     whitespace from its input.  This allows it to work a bit faster.

     The default is false.  You should not set it to true unless you
     have verified that your port does not generate any extra
     whitespace or comments that will cause GAS to issue errors in
     NO_APP mode.

 -- Target Hook: bool TARGET_ASM_FILE_START_FILE_DIRECTIVE
     If this flag is true, `output_file_directive' will be called for
     the primary source file, immediately after printing `ASM_APP_OFF'
     (if that is enabled).  Most ELF assemblers expect this to be done.
     The default is false.

 -- Target Hook: void TARGET_ASM_FILE_END (void)
     Output to `asm_out_file' any text which the assembler expects to
     find at the end of a file.  The default is to output nothing.

 -- Function: void file_end_indicate_exec_stack ()
     Some systems use a common convention, the `.note.GNU-stack'
     special section, to indicate whether or not an object file relies
     on the stack being executable.  If your system uses this
     convention, you should define `TARGET_ASM_FILE_END' to this
     function.  If you need to do other things in that hook, have your
     hook function call this function.

 -- Target Hook: void TARGET_ASM_LTO_START (void)
     Output to `asm_out_file' any text which the assembler expects to
     find at the start of an LTO section.  The default is to output
     nothing.

 -- Target Hook: void TARGET_ASM_LTO_END (void)
     Output to `asm_out_file' any text which the assembler expects to
     find at the end of an LTO section.  The default is to output
     nothing.

 -- Target Hook: void TARGET_ASM_CODE_END (void)
     Output to `asm_out_file' any text which is needed before emitting
     unwind info and debug info at the end of a file.  Some targets emit
     here PIC setup thunks that cannot be emitted at the end of file,
     because they couldn't have unwind info then.  The default is to
     output nothing.

 -- Macro: ASM_COMMENT_START
     A C string constant describing how to begin a comment in the target
     assembler language.  The compiler assumes that the comment will
     end at the end of the line.

 -- Macro: ASM_APP_ON
     A C string constant for text to be output before each `asm'
     statement or group of consecutive ones.  Normally this is
     `"#APP"', which is a comment that has no effect on most assemblers
     but tells the GNU assembler that it must check the lines that
     follow for all valid assembler constructs.

 -- Macro: ASM_APP_OFF
     A C string constant for text to be output after each `asm'
     statement or group of consecutive ones.  Normally this is
     `"#NO_APP"', which tells the GNU assembler to resume making the
     time-saving assumptions that are valid for ordinary compiler
     output.

 -- Macro: ASM_OUTPUT_SOURCE_FILENAME (STREAM, NAME)
     A C statement to output COFF information or DWARF debugging
     information which indicates that filename NAME is the current
     source file to the stdio stream STREAM.

     This macro need not be defined if the standard form of output for
     the file format in use is appropriate.

 -- Target Hook: void TARGET_ASM_OUTPUT_SOURCE_FILENAME (FILE *FILE,
          const char *NAME)
     Output COFF information or DWARF debugging information which
     indicates that filename NAME is the current source file to the
     stdio stream FILE.

     This target hook need not be defined if the standard form of
     output for the file format in use is appropriate.

 -- Target Hook: void TARGET_ASM_OUTPUT_IDENT (const char *NAME)
     Output a string based on NAME, suitable for the `#ident'
     directive, or the equivalent directive or pragma in non-C-family
     languages.  If this hook is not defined, nothing is output for the
     `#ident'  directive.

 -- Macro: OUTPUT_QUOTED_STRING (STREAM, STRING)
     A C statement to output the string STRING to the stdio stream
     STREAM.  If you do not call the function `output_quoted_string' in
     your config files, GCC will only call it to output filenames to
     the assembler source.  So you can use it to canonicalize the format
     of the filename using this macro.

 -- Target Hook: void TARGET_ASM_NAMED_SECTION (const char *NAME,
          unsigned int FLAGS, tree DECL)
     Output assembly directives to switch to section NAME.  The section
     should have attributes as specified by FLAGS, which is a bit mask
     of the `SECTION_*' flags defined in `output.h'.  If DECL is
     non-NULL, it is the `VAR_DECL' or `FUNCTION_DECL' with which this
     section is associated.

 -- Target Hook: section * TARGET_ASM_FUNCTION_SECTION (tree DECL, enum
          node_frequency FREQ, bool STARTUP, bool EXIT)
     Return preferred text (sub)section for function DECL.  Main
     purpose of this function is to separate cold, normal and hot
     functions. STARTUP is true when function is known to be used only
     at startup (from static constructors or it is `main()').  EXIT is
     true when function is known to be used only at exit (from static
     destructors).  Return NULL if function should go to default text
     section.

 -- Target Hook: void TARGET_ASM_FUNCTION_SWITCHED_TEXT_SECTIONS (FILE
          *FILE, tree DECL, bool NEW_IS_COLD)
     Used by the target to emit any assembler directives or additional
     labels needed when a function is partitioned between different
     sections.  Output should be written to FILE.  The function  decl
     is available as DECL and the new section is `cold' if  NEW_IS_COLD
     is `true'.

 -- Common Target Hook: bool TARGET_HAVE_NAMED_SECTIONS
     This flag is true if the target supports
     `TARGET_ASM_NAMED_SECTION'.  It must not be modified by
     command-line option processing.

 -- Target Hook: bool TARGET_HAVE_SWITCHABLE_BSS_SECTIONS
     This flag is true if we can create zeroed data by switching to a
     BSS section and then using `ASM_OUTPUT_SKIP' to allocate the space.
     This is true on most ELF targets.

 -- Target Hook: unsigned int TARGET_SECTION_TYPE_FLAGS (tree DECL,
          const char *NAME, int RELOC)
     Choose a set of section attributes for use by
     `TARGET_ASM_NAMED_SECTION' based on a variable or function decl, a
     section name, and whether or not the declaration's initializer may
     contain runtime relocations.  DECL may be null, in which case
     read-write data should be assumed.

     The default version of this function handles choosing code vs data,
     read-only vs read-write data, and `flag_pic'.  You should only
     need to override this if your target has special flags that might
     be set via `__attribute__'.

 -- Target Hook: int TARGET_ASM_RECORD_GCC_SWITCHES (print_switch_type
          TYPE, const char *TEXT)
     Provides the target with the ability to record the gcc command line
     switches that have been passed to the compiler, and options that
     are enabled.  The TYPE argument specifies what is being recorded.
     It can take the following values:

    `SWITCH_TYPE_PASSED'
          TEXT is a command line switch that has been set by the user.

    `SWITCH_TYPE_ENABLED'
          TEXT is an option which has been enabled.  This might be as a
          direct result of a command line switch, or because it is
          enabled by default or because it has been enabled as a side
          effect of a different command line switch.  For example, the
          `-O2' switch enables various different individual
          optimization passes.

    `SWITCH_TYPE_DESCRIPTIVE'
          TEXT is either NULL or some descriptive text which should be
          ignored.  If TEXT is NULL then it is being used to warn the
          target hook that either recording is starting or ending.  The
          first time TYPE is SWITCH_TYPE_DESCRIPTIVE and TEXT is NULL,
          the warning is for start up and the second time the warning
          is for wind down.  This feature is to allow the target hook
          to make any necessary preparations before it starts to record
          switches and to perform any necessary tidying up after it has
          finished recording switches.

    `SWITCH_TYPE_LINE_START'
          This option can be ignored by this target hook.

    `SWITCH_TYPE_LINE_END'
          This option can be ignored by this target hook.

     The hook's return value must be zero.  Other return values may be
     supported in the future.

     By default this hook is set to NULL, but an example implementation
     is provided for ELF based targets.  Called ELF_RECORD_GCC_SWITCHES,
     it records the switches as ASCII text inside a new, string
     mergeable section in the assembler output file.  The name of the
     new section is provided by the
     `TARGET_ASM_RECORD_GCC_SWITCHES_SECTION' target hook.

 -- Target Hook: const char * TARGET_ASM_RECORD_GCC_SWITCHES_SECTION
     This is the name of the section that will be created by the example
     ELF implementation of the `TARGET_ASM_RECORD_GCC_SWITCHES' target
     hook.


File: gccint.info,  Node: Data Output,  Next: Uninitialized Data,  Prev: File Framework,  Up: Assembler Format

17.21.2 Output of Data
----------------------

 -- Target Hook: const char * TARGET_ASM_BYTE_OP
 -- Target Hook: const char * TARGET_ASM_ALIGNED_HI_OP
 -- Target Hook: const char * TARGET_ASM_ALIGNED_SI_OP
 -- Target Hook: const char * TARGET_ASM_ALIGNED_DI_OP
 -- Target Hook: const char * TARGET_ASM_ALIGNED_TI_OP
 -- Target Hook: const char * TARGET_ASM_UNALIGNED_HI_OP
 -- Target Hook: const char * TARGET_ASM_UNALIGNED_SI_OP
 -- Target Hook: const char * TARGET_ASM_UNALIGNED_DI_OP
 -- Target Hook: const char * TARGET_ASM_UNALIGNED_TI_OP
     These hooks specify assembly directives for creating certain kinds
     of integer object.  The `TARGET_ASM_BYTE_OP' directive creates a
     byte-sized object, the `TARGET_ASM_ALIGNED_HI_OP' one creates an
     aligned two-byte object, and so on.  Any of the hooks may be
     `NULL', indicating that no suitable directive is available.

     The compiler will print these strings at the start of a new line,
     followed immediately by the object's initial value.  In most cases,
     the string should contain a tab, a pseudo-op, and then another tab.

 -- Target Hook: bool TARGET_ASM_INTEGER (rtx X, unsigned int SIZE, int
          ALIGNED_P)
     The `assemble_integer' function uses this hook to output an
     integer object.  X is the object's value, SIZE is its size in
     bytes and ALIGNED_P indicates whether it is aligned.  The function
     should return `true' if it was able to output the object.  If it
     returns false, `assemble_integer' will try to split the object
     into smaller parts.

     The default implementation of this hook will use the
     `TARGET_ASM_BYTE_OP' family of strings, returning `false' when the
     relevant string is `NULL'.

 -- Target Hook: bool TARGET_ASM_OUTPUT_ADDR_CONST_EXTRA (FILE *FILE,
          rtx X)
     A target hook to recognize RTX patterns that `output_addr_const'
     can't deal with, and output assembly code to FILE corresponding to
     the pattern X.  This may be used to allow machine-dependent
     `UNSPEC's to appear within constants.

     If target hook fails to recognize a pattern, it must return
     `false', so that a standard error message is printed.  If it
     prints an error message itself, by calling, for example,
     `output_operand_lossage', it may just return `true'.

 -- Macro: ASM_OUTPUT_ASCII (STREAM, PTR, LEN)
     A C statement to output to the stdio stream STREAM an assembler
     instruction to assemble a string constant containing the LEN bytes
     at PTR.  PTR will be a C expression of type `char *' and LEN a C
     expression of type `int'.

     If the assembler has a `.ascii' pseudo-op as found in the Berkeley
     Unix assembler, do not define the macro `ASM_OUTPUT_ASCII'.

 -- Macro: ASM_OUTPUT_FDESC (STREAM, DECL, N)
     A C statement to output word N of a function descriptor for DECL.
     This must be defined if `TARGET_VTABLE_USES_DESCRIPTORS' is
     defined, and is otherwise unused.

 -- Macro: CONSTANT_POOL_BEFORE_FUNCTION
     You may define this macro as a C expression.  You should define the
     expression to have a nonzero value if GCC should output the
     constant pool for a function before the code for the function, or
     a zero value if GCC should output the constant pool after the
     function.  If you do not define this macro, the usual case, GCC
     will output the constant pool before the function.

 -- Macro: ASM_OUTPUT_POOL_PROLOGUE (FILE, FUNNAME, FUNDECL, SIZE)
     A C statement to output assembler commands to define the start of
     the constant pool for a function.  FUNNAME is a string giving the
     name of the function.  Should the return type of the function be
     required, it can be obtained via FUNDECL.  SIZE is the size, in
     bytes, of the constant pool that will be written immediately after
     this call.

     If no constant-pool prefix is required, the usual case, this macro
     need not be defined.

 -- Macro: ASM_OUTPUT_SPECIAL_POOL_ENTRY (FILE, X, MODE, ALIGN,
          LABELNO, JUMPTO)
     A C statement (with or without semicolon) to output a constant in
     the constant pool, if it needs special treatment.  (This macro
     need not do anything for RTL expressions that can be output
     normally.)

     The argument FILE is the standard I/O stream to output the
     assembler code on.  X is the RTL expression for the constant to
     output, and MODE is the machine mode (in case X is a `const_int').
     ALIGN is the required alignment for the value X; you should output
     an assembler directive to force this much alignment.

     The argument LABELNO is a number to use in an internal label for
     the address of this pool entry.  The definition of this macro is
     responsible for outputting the label definition at the proper
     place.  Here is how to do this:

          `(*targetm.asm_out.internal_label)' (FILE, "LC", LABELNO);

     When you output a pool entry specially, you should end with a
     `goto' to the label JUMPTO.  This will prevent the same pool entry
     from being output a second time in the usual manner.

     You need not define this macro if it would do nothing.

 -- Macro: ASM_OUTPUT_POOL_EPILOGUE (FILE FUNNAME FUNDECL SIZE)
     A C statement to output assembler commands to at the end of the
     constant pool for a function.  FUNNAME is a string giving the name
     of the function.  Should the return type of the function be
     required, you can obtain it via FUNDECL.  SIZE is the size, in
     bytes, of the constant pool that GCC wrote immediately before this
     call.

     If no constant-pool epilogue is required, the usual case, you need
     not define this macro.

 -- Macro: IS_ASM_LOGICAL_LINE_SEPARATOR (C, STR)
     Define this macro as a C expression which is nonzero if C is used
     as a logical line separator by the assembler.  STR points to the
     position in the string where C was found; this can be used if a
     line separator uses multiple characters.

     If you do not define this macro, the default is that only the
     character `;' is treated as a logical line separator.

 -- Target Hook: const char * TARGET_ASM_OPEN_PAREN
 -- Target Hook: const char * TARGET_ASM_CLOSE_PAREN
     These target hooks are C string constants, describing the syntax
     in the assembler for grouping arithmetic expressions.  If not
     overridden, they default to normal parentheses, which is correct
     for most assemblers.

 These macros are provided by `real.h' for writing the definitions of
`ASM_OUTPUT_DOUBLE' and the like:

 -- Macro: REAL_VALUE_TO_TARGET_SINGLE (X, L)
 -- Macro: REAL_VALUE_TO_TARGET_DOUBLE (X, L)
 -- Macro: REAL_VALUE_TO_TARGET_LONG_DOUBLE (X, L)
 -- Macro: REAL_VALUE_TO_TARGET_DECIMAL32 (X, L)
 -- Macro: REAL_VALUE_TO_TARGET_DECIMAL64 (X, L)
 -- Macro: REAL_VALUE_TO_TARGET_DECIMAL128 (X, L)
     These translate X, of type `REAL_VALUE_TYPE', to the target's
     floating point representation, and store its bit pattern in the
     variable L.  For `REAL_VALUE_TO_TARGET_SINGLE' and
     `REAL_VALUE_TO_TARGET_DECIMAL32', this variable should be a simple
     `long int'.  For the others, it should be an array of `long int'.
     The number of elements in this array is determined by the size of
     the desired target floating point data type: 32 bits of it go in
     each `long int' array element.  Each array element holds 32 bits
     of the result, even if `long int' is wider than 32 bits on the
     host machine.

     The array element values are designed so that you can print them
     out using `fprintf' in the order they should appear in the target
     machine's memory.


File: gccint.info,  Node: Uninitialized Data,  Next: Label Output,  Prev: Data Output,  Up: Assembler Format

17.21.3 Output of Uninitialized Variables
-----------------------------------------

Each of the macros in this section is used to do the whole job of
outputting a single uninitialized variable.

 -- Macro: ASM_OUTPUT_COMMON (STREAM, NAME, SIZE, ROUNDED)
     A C statement (sans semicolon) to output to the stdio stream
     STREAM the assembler definition of a common-label named NAME whose
     size is SIZE bytes.  The variable ROUNDED is the size rounded up
     to whatever alignment the caller wants.  It is possible that SIZE
     may be zero, for instance if a struct with no other member than a
     zero-length array is defined.  In this case, the backend must
     output a symbol definition that allocates at least one byte, both
     so that the address of the resulting object does not compare equal
     to any other, and because some object formats cannot even express
     the concept of a zero-sized common symbol, as that is how they
     represent an ordinary undefined external.

     Use the expression `assemble_name (STREAM, NAME)' to output the
     name itself; before and after that, output the additional
     assembler syntax for defining the name, and a newline.

     This macro controls how the assembler definitions of uninitialized
     common global variables are output.

 -- Macro: ASM_OUTPUT_ALIGNED_COMMON (STREAM, NAME, SIZE, ALIGNMENT)
     Like `ASM_OUTPUT_COMMON' except takes the required alignment as a
     separate, explicit argument.  If you define this macro, it is used
     in place of `ASM_OUTPUT_COMMON', and gives you more flexibility in
     handling the required alignment of the variable.  The alignment is
     specified as the number of bits.

 -- Macro: ASM_OUTPUT_ALIGNED_DECL_COMMON (STREAM, DECL, NAME, SIZE,
          ALIGNMENT)
     Like `ASM_OUTPUT_ALIGNED_COMMON' except that DECL of the variable
     to be output, if there is one, or `NULL_TREE' if there is no
     corresponding variable.  If you define this macro, GCC will use it
     in place of both `ASM_OUTPUT_COMMON' and
     `ASM_OUTPUT_ALIGNED_COMMON'.  Define this macro when you need to
     see the variable's decl in order to chose what to output.

 -- Macro: ASM_OUTPUT_ALIGNED_BSS (STREAM, DECL, NAME, SIZE, ALIGNMENT)
     A C statement (sans semicolon) to output to the stdio stream
     STREAM the assembler definition of uninitialized global DECL named
     NAME whose size is SIZE bytes.  The variable ALIGNMENT is the
     alignment specified as the number of bits.

     Try to use function `asm_output_aligned_bss' defined in file
     `varasm.c' when defining this macro.  If unable, use the expression
     `assemble_name (STREAM, NAME)' to output the name itself; before
     and after that, output the additional assembler syntax for defining
     the name, and a newline.

     There are two ways of handling global BSS.  One is to define this
     macro.  The other is to have `TARGET_ASM_SELECT_SECTION' return a
     switchable BSS section (*note
     TARGET_HAVE_SWITCHABLE_BSS_SECTIONS::).  You do not need to do
     both.

     Some languages do not have `common' data, and require a non-common
     form of global BSS in order to handle uninitialized globals
     efficiently.  C++ is one example of this.  However, if the target
     does not support global BSS, the front end may choose to make
     globals common in order to save space in the object file.

 -- Macro: ASM_OUTPUT_LOCAL (STREAM, NAME, SIZE, ROUNDED)
     A C statement (sans semicolon) to output to the stdio stream
     STREAM the assembler definition of a local-common-label named NAME
     whose size is SIZE bytes.  The variable ROUNDED is the size
     rounded up to whatever alignment the caller wants.

     Use the expression `assemble_name (STREAM, NAME)' to output the
     name itself; before and after that, output the additional
     assembler syntax for defining the name, and a newline.

     This macro controls how the assembler definitions of uninitialized
     static variables are output.

 -- Macro: ASM_OUTPUT_ALIGNED_LOCAL (STREAM, NAME, SIZE, ALIGNMENT)
     Like `ASM_OUTPUT_LOCAL' except takes the required alignment as a
     separate, explicit argument.  If you define this macro, it is used
     in place of `ASM_OUTPUT_LOCAL', and gives you more flexibility in
     handling the required alignment of the variable.  The alignment is
     specified as the number of bits.

 -- Macro: ASM_OUTPUT_ALIGNED_DECL_LOCAL (STREAM, DECL, NAME, SIZE,
          ALIGNMENT)
     Like `ASM_OUTPUT_ALIGNED_DECL' except that DECL of the variable to
     be output, if there is one, or `NULL_TREE' if there is no
     corresponding variable.  If you define this macro, GCC will use it
     in place of both `ASM_OUTPUT_DECL' and `ASM_OUTPUT_ALIGNED_DECL'.
     Define this macro when you need to see the variable's decl in
     order to chose what to output.


File: gccint.info,  Node: Label Output,  Next: Initialization,  Prev: Uninitialized Data,  Up: Assembler Format

17.21.4 Output and Generation of Labels
---------------------------------------

This is about outputting labels.

 -- Macro: ASM_OUTPUT_LABEL (STREAM, NAME)
     A C statement (sans semicolon) to output to the stdio stream
     STREAM the assembler definition of a label named NAME.  Use the
     expression `assemble_name (STREAM, NAME)' to output the name
     itself; before and after that, output the additional assembler
     syntax for defining the name, and a newline.  A default definition
     of this macro is provided which is correct for most systems.

 -- Macro: ASM_OUTPUT_FUNCTION_LABEL (STREAM, NAME, DECL)
     A C statement (sans semicolon) to output to the stdio stream
     STREAM the assembler definition of a label named NAME of a
     function.  Use the expression `assemble_name (STREAM, NAME)' to
     output the name itself; before and after that, output the
     additional assembler syntax for defining the name, and a newline.
     A default definition of this macro is provided which is correct
     for most systems.

     If this macro is not defined, then the function name is defined in
     the usual manner as a label (by means of `ASM_OUTPUT_LABEL').

 -- Macro: ASM_OUTPUT_INTERNAL_LABEL (STREAM, NAME)
     Identical to `ASM_OUTPUT_LABEL', except that NAME is known to
     refer to a compiler-generated label.  The default definition uses
     `assemble_name_raw', which is like `assemble_name' except that it
     is more efficient.

 -- Macro: SIZE_ASM_OP
     A C string containing the appropriate assembler directive to
     specify the size of a symbol, without any arguments.  On systems
     that use ELF, the default (in `config/elfos.h') is `"\t.size\t"';
     on other systems, the default is not to define this macro.

     Define this macro only if it is correct to use the default
     definitions of `ASM_OUTPUT_SIZE_DIRECTIVE' and
     `ASM_OUTPUT_MEASURED_SIZE' for your system.  If you need your own
     custom definitions of those macros, or if you do not need explicit
     symbol sizes at all, do not define this macro.

 -- Macro: ASM_OUTPUT_SIZE_DIRECTIVE (STREAM, NAME, SIZE)
     A C statement (sans semicolon) to output to the stdio stream
     STREAM a directive telling the assembler that the size of the
     symbol NAME is SIZE.  SIZE is a `HOST_WIDE_INT'.  If you define
     `SIZE_ASM_OP', a default definition of this macro is provided.

 -- Macro: ASM_OUTPUT_MEASURED_SIZE (STREAM, NAME)
     A C statement (sans semicolon) to output to the stdio stream
     STREAM a directive telling the assembler to calculate the size of
     the symbol NAME by subtracting its address from the current
     address.

     If you define `SIZE_ASM_OP', a default definition of this macro is
     provided.  The default assumes that the assembler recognizes a
     special `.' symbol as referring to the current address, and can
     calculate the difference between this and another symbol.  If your
     assembler does not recognize `.' or cannot do calculations with
     it, you will need to redefine `ASM_OUTPUT_MEASURED_SIZE' to use
     some other technique.

 -- Macro: NO_DOLLAR_IN_LABEL
     Define this macro if the assembler does not accept the character
     `$' in label names.  By default constructors and destructors in
     G++ have `$' in the identifiers.  If this macro is defined, `.' is
     used instead.

 -- Macro: NO_DOT_IN_LABEL
     Define this macro if the assembler does not accept the character
     `.' in label names.  By default constructors and destructors in G++
     have names that use `.'.  If this macro is defined, these names
     are rewritten to avoid `.'.

 -- Macro: TYPE_ASM_OP
     A C string containing the appropriate assembler directive to
     specify the type of a symbol, without any arguments.  On systems
     that use ELF, the default (in `config/elfos.h') is `"\t.type\t"';
     on other systems, the default is not to define this macro.

     Define this macro only if it is correct to use the default
     definition of `ASM_OUTPUT_TYPE_DIRECTIVE' for your system.  If you
     need your own custom definition of this macro, or if you do not
     need explicit symbol types at all, do not define this macro.

 -- Macro: TYPE_OPERAND_FMT
     A C string which specifies (using `printf' syntax) the format of
     the second operand to `TYPE_ASM_OP'.  On systems that use ELF, the
     default (in `config/elfos.h') is `"@%s"'; on other systems, the
     default is not to define this macro.

     Define this macro only if it is correct to use the default
     definition of `ASM_OUTPUT_TYPE_DIRECTIVE' for your system.  If you
     need your own custom definition of this macro, or if you do not
     need explicit symbol types at all, do not define this macro.

 -- Macro: ASM_OUTPUT_TYPE_DIRECTIVE (STREAM, TYPE)
     A C statement (sans semicolon) to output to the stdio stream
     STREAM a directive telling the assembler that the type of the
     symbol NAME is TYPE.  TYPE is a C string; currently, that string
     is always either `"function"' or `"object"', but you should not
     count on this.

     If you define `TYPE_ASM_OP' and `TYPE_OPERAND_FMT', a default
     definition of this macro is provided.

 -- Macro: ASM_DECLARE_FUNCTION_NAME (STREAM, NAME, DECL)
     A C statement (sans semicolon) to output to the stdio stream
     STREAM any text necessary for declaring the name NAME of a
     function which is being defined.  This macro is responsible for
     outputting the label definition (perhaps using
     `ASM_OUTPUT_FUNCTION_LABEL').  The argument DECL is the
     `FUNCTION_DECL' tree node representing the function.

     If this macro is not defined, then the function name is defined in
     the usual manner as a label (by means of
     `ASM_OUTPUT_FUNCTION_LABEL').

     You may wish to use `ASM_OUTPUT_TYPE_DIRECTIVE' in the definition
     of this macro.

 -- Macro: ASM_DECLARE_FUNCTION_SIZE (STREAM, NAME, DECL)
     A C statement (sans semicolon) to output to the stdio stream
     STREAM any text necessary for declaring the size of a function
     which is being defined.  The argument NAME is the name of the
     function.  The argument DECL is the `FUNCTION_DECL' tree node
     representing the function.

     If this macro is not defined, then the function size is not
     defined.

     You may wish to use `ASM_OUTPUT_MEASURED_SIZE' in the definition
     of this macro.

 -- Macro: ASM_DECLARE_OBJECT_NAME (STREAM, NAME, DECL)
     A C statement (sans semicolon) to output to the stdio stream
     STREAM any text necessary for declaring the name NAME of an
     initialized variable which is being defined.  This macro must
     output the label definition (perhaps using `ASM_OUTPUT_LABEL').
     The argument DECL is the `VAR_DECL' tree node representing the
     variable.

     If this macro is not defined, then the variable name is defined in
     the usual manner as a label (by means of `ASM_OUTPUT_LABEL').

     You may wish to use `ASM_OUTPUT_TYPE_DIRECTIVE' and/or
     `ASM_OUTPUT_SIZE_DIRECTIVE' in the definition of this macro.

 -- Target Hook: void TARGET_ASM_DECLARE_CONSTANT_NAME (FILE *FILE,
          const char *NAME, const_tree EXPR, HOST_WIDE_INT SIZE)
     A target hook to output to the stdio stream FILE any text necessary
     for declaring the name NAME of a constant which is being defined.
     This target hook is responsible for outputting the label
     definition (perhaps using `assemble_label').  The argument EXP is
     the value of the constant, and SIZE is the size of the constant in
     bytes.  The NAME will be an internal label.

     The default version of this target hook, define the NAME in the
     usual manner as a label (by means of `assemble_label').

     You may wish to use `ASM_OUTPUT_TYPE_DIRECTIVE' in this target
     hook.

 -- Macro: ASM_DECLARE_REGISTER_GLOBAL (STREAM, DECL, REGNO, NAME)
     A C statement (sans semicolon) to output to the stdio stream
     STREAM any text necessary for claiming a register REGNO for a
     global variable DECL with name NAME.

     If you don't define this macro, that is equivalent to defining it
     to do nothing.

 -- Macro: ASM_FINISH_DECLARE_OBJECT (STREAM, DECL, TOPLEVEL, ATEND)
     A C statement (sans semicolon) to finish up declaring a variable
     name once the compiler has processed its initializer fully and
     thus has had a chance to determine the size of an array when
     controlled by an initializer.  This is used on systems where it's
     necessary to declare something about the size of the object.

     If you don't define this macro, that is equivalent to defining it
     to do nothing.

     You may wish to use `ASM_OUTPUT_SIZE_DIRECTIVE' and/or
     `ASM_OUTPUT_MEASURED_SIZE' in the definition of this macro.

 -- Target Hook: void TARGET_ASM_GLOBALIZE_LABEL (FILE *STREAM, const
          char *NAME)
     This target hook is a function to output to the stdio stream
     STREAM some commands that will make the label NAME global; that
     is, available for reference from other files.

     The default implementation relies on a proper definition of
     `GLOBAL_ASM_OP'.

 -- Target Hook: void TARGET_ASM_GLOBALIZE_DECL_NAME (FILE *STREAM,
          tree DECL)
     This target hook is a function to output to the stdio stream
     STREAM some commands that will make the name associated with DECL
     global; that is, available for reference from other files.

     The default implementation uses the TARGET_ASM_GLOBALIZE_LABEL
     target hook.

 -- Macro: ASM_WEAKEN_LABEL (STREAM, NAME)
     A C statement (sans semicolon) to output to the stdio stream
     STREAM some commands that will make the label NAME weak; that is,
     available for reference from other files but only used if no other
     definition is available.  Use the expression `assemble_name
     (STREAM, NAME)' to output the name itself; before and after that,
     output the additional assembler syntax for making that name weak,
     and a newline.

     If you don't define this macro or `ASM_WEAKEN_DECL', GCC will not
     support weak symbols and you should not define the `SUPPORTS_WEAK'
     macro.

 -- Macro: ASM_WEAKEN_DECL (STREAM, DECL, NAME, VALUE)
     Combines (and replaces) the function of `ASM_WEAKEN_LABEL' and
     `ASM_OUTPUT_WEAK_ALIAS', allowing access to the associated function
     or variable decl.  If VALUE is not `NULL', this C statement should
     output to the stdio stream STREAM assembler code which defines
     (equates) the weak symbol NAME to have the value VALUE.  If VALUE
     is `NULL', it should output commands to make NAME weak.

 -- Macro: ASM_OUTPUT_WEAKREF (STREAM, DECL, NAME, VALUE)
     Outputs a directive that enables NAME to be used to refer to
     symbol VALUE with weak-symbol semantics.  `decl' is the
     declaration of `name'.

 -- Macro: SUPPORTS_WEAK
     A preprocessor constant expression which evaluates to true if the
     target supports weak symbols.

     If you don't define this macro, `defaults.h' provides a default
     definition.  If either `ASM_WEAKEN_LABEL' or `ASM_WEAKEN_DECL' is
     defined, the default definition is `1'; otherwise, it is `0'.

 -- Macro: TARGET_SUPPORTS_WEAK
     A C expression which evaluates to true if the target supports weak
     symbols.

     If you don't define this macro, `defaults.h' provides a default
     definition.  The default definition is `(SUPPORTS_WEAK)'.  Define
     this macro if you want to control weak symbol support with a
     compiler flag such as `-melf'.

 -- Macro: MAKE_DECL_ONE_ONLY (DECL)
     A C statement (sans semicolon) to mark DECL to be emitted as a
     public symbol such that extra copies in multiple translation units
     will be discarded by the linker.  Define this macro if your object
     file format provides support for this concept, such as the `COMDAT'
     section flags in the Microsoft Windows PE/COFF format, and this
     support requires changes to DECL, such as putting it in a separate
     section.

 -- Macro: SUPPORTS_ONE_ONLY
     A C expression which evaluates to true if the target supports
     one-only semantics.

     If you don't define this macro, `varasm.c' provides a default
     definition.  If `MAKE_DECL_ONE_ONLY' is defined, the default
     definition is `1'; otherwise, it is `0'.  Define this macro if you
     want to control one-only symbol support with a compiler flag, or if
     setting the `DECL_ONE_ONLY' flag is enough to mark a declaration to
     be emitted as one-only.

 -- Target Hook: void TARGET_ASM_ASSEMBLE_VISIBILITY (tree DECL, int
          VISIBILITY)
     This target hook is a function to output to ASM_OUT_FILE some
     commands that will make the symbol(s) associated with DECL have
     hidden, protected or internal visibility as specified by
     VISIBILITY.

 -- Macro: TARGET_WEAK_NOT_IN_ARCHIVE_TOC
     A C expression that evaluates to true if the target's linker
     expects that weak symbols do not appear in a static archive's
     table of contents.  The default is `0'.

     Leaving weak symbols out of an archive's table of contents means
     that, if a symbol will only have a definition in one translation
     unit and will have undefined references from other translation
     units, that symbol should not be weak.  Defining this macro to be
     nonzero will thus have the effect that certain symbols that would
     normally be weak (explicit template instantiations, and vtables
     for polymorphic classes with noninline key methods) will instead
     be nonweak.

     The C++ ABI requires this macro to be zero.  Define this macro for
     targets where full C++ ABI compliance is impossible and where
     linker restrictions require weak symbols to be left out of a
     static archive's table of contents.

 -- Macro: ASM_OUTPUT_EXTERNAL (STREAM, DECL, NAME)
     A C statement (sans semicolon) to output to the stdio stream
     STREAM any text necessary for declaring the name of an external
     symbol named NAME which is referenced in this compilation but not
     defined.  The value of DECL is the tree node for the declaration.

     This macro need not be defined if it does not need to output
     anything.  The GNU assembler and most Unix assemblers don't
     require anything.

 -- Target Hook: void TARGET_ASM_EXTERNAL_LIBCALL (rtx SYMREF)
     This target hook is a function to output to ASM_OUT_FILE an
     assembler pseudo-op to declare a library function name external.
     The name of the library function is given by SYMREF, which is a
     `symbol_ref'.

 -- Target Hook: void TARGET_ASM_MARK_DECL_PRESERVED (const char
          *SYMBOL)
     This target hook is a function to output to ASM_OUT_FILE an
     assembler directive to annotate SYMBOL as used.  The Darwin target
     uses the .no_dead_code_strip directive.

 -- Macro: ASM_OUTPUT_LABELREF (STREAM, NAME)
     A C statement (sans semicolon) to output to the stdio stream
     STREAM a reference in assembler syntax to a label named NAME.
     This should add `_' to the front of the name, if that is customary
     on your operating system, as it is in most Berkeley Unix systems.
     This macro is used in `assemble_name'.

 -- Target Hook: tree TARGET_MANGLE_ASSEMBLER_NAME (const char *NAME)
     Given a symbol NAME, perform same mangling as `varasm.c''s
     `assemble_name', but in memory rather than to a file stream,
     returning result as an `IDENTIFIER_NODE'.  Required for correct
     LTO symtabs.  The default implementation calls the
     `TARGET_STRIP_NAME_ENCODING' hook and then prepends the
     `USER_LABEL_PREFIX', if any.

 -- Macro: ASM_OUTPUT_SYMBOL_REF (STREAM, SYM)
     A C statement (sans semicolon) to output a reference to
     `SYMBOL_REF' SYM.  If not defined, `assemble_name' will be used to
     output the name of the symbol.  This macro may be used to modify
     the way a symbol is referenced depending on information encoded by
     `TARGET_ENCODE_SECTION_INFO'.

 -- Macro: ASM_OUTPUT_LABEL_REF (STREAM, BUF)
     A C statement (sans semicolon) to output a reference to BUF, the
     result of `ASM_GENERATE_INTERNAL_LABEL'.  If not defined,
     `assemble_name' will be used to output the name of the symbol.
     This macro is not used by `output_asm_label', or the `%l'
     specifier that calls it; the intention is that this macro should
     be set when it is necessary to output a label differently when its
     address is being taken.

 -- Target Hook: void TARGET_ASM_INTERNAL_LABEL (FILE *STREAM, const
          char *PREFIX, unsigned long LABELNO)
     A function to output to the stdio stream STREAM a label whose name
     is made from the string PREFIX and the number LABELNO.

     It is absolutely essential that these labels be distinct from the
     labels used for user-level functions and variables.  Otherwise,
     certain programs will have name conflicts with internal labels.

     It is desirable to exclude internal labels from the symbol table
     of the object file.  Most assemblers have a naming convention for
     labels that should be excluded; on many systems, the letter `L' at
     the beginning of a label has this effect.  You should find out what
     convention your system uses, and follow it.

     The default version of this function utilizes
     `ASM_GENERATE_INTERNAL_LABEL'.

 -- Macro: ASM_OUTPUT_DEBUG_LABEL (STREAM, PREFIX, NUM)
     A C statement to output to the stdio stream STREAM a debug info
     label whose name is made from the string PREFIX and the number
     NUM.  This is useful for VLIW targets, where debug info labels may
     need to be treated differently than branch target labels.  On some
     systems, branch target labels must be at the beginning of
     instruction bundles, but debug info labels can occur in the middle
     of instruction bundles.

     If this macro is not defined, then
     `(*targetm.asm_out.internal_label)' will be used.

 -- Macro: ASM_GENERATE_INTERNAL_LABEL (STRING, PREFIX, NUM)
     A C statement to store into the string STRING a label whose name
     is made from the string PREFIX and the number NUM.

     This string, when output subsequently by `assemble_name', should
     produce the output that `(*targetm.asm_out.internal_label)' would
     produce with the same PREFIX and NUM.

     If the string begins with `*', then `assemble_name' will output
     the rest of the string unchanged.  It is often convenient for
     `ASM_GENERATE_INTERNAL_LABEL' to use `*' in this way.  If the
     string doesn't start with `*', then `ASM_OUTPUT_LABELREF' gets to
     output the string, and may change it.  (Of course,
     `ASM_OUTPUT_LABELREF' is also part of your machine description, so
     you should know what it does on your machine.)

 -- Macro: ASM_FORMAT_PRIVATE_NAME (OUTVAR, NAME, NUMBER)
     A C expression to assign to OUTVAR (which is a variable of type
     `char *') a newly allocated string made from the string NAME and
     the number NUMBER, with some suitable punctuation added.  Use
     `alloca' to get space for the string.

     The string will be used as an argument to `ASM_OUTPUT_LABELREF' to
     produce an assembler label for an internal static variable whose
     name is NAME.  Therefore, the string must be such as to result in
     valid assembler code.  The argument NUMBER is different each time
     this macro is executed; it prevents conflicts between
     similarly-named internal static variables in different scopes.

     Ideally this string should not be a valid C identifier, to prevent
     any conflict with the user's own symbols.  Most assemblers allow
     periods or percent signs in assembler symbols; putting at least
     one of these between the name and the number will suffice.

     If this macro is not defined, a default definition will be provided
     which is correct for most systems.

 -- Macro: ASM_OUTPUT_DEF (STREAM, NAME, VALUE)
     A C statement to output to the stdio stream STREAM assembler code
     which defines (equates) the symbol NAME to have the value VALUE.

     If `SET_ASM_OP' is defined, a default definition is provided which
     is correct for most systems.

 -- Macro: ASM_OUTPUT_DEF_FROM_DECLS (STREAM, DECL_OF_NAME,
          DECL_OF_VALUE)
     A C statement to output to the stdio stream STREAM assembler code
     which defines (equates) the symbol whose tree node is DECL_OF_NAME
     to have the value of the tree node DECL_OF_VALUE.  This macro will
     be used in preference to `ASM_OUTPUT_DEF' if it is defined and if
     the tree nodes are available.

     If `SET_ASM_OP' is defined, a default definition is provided which
     is correct for most systems.

 -- Macro: TARGET_DEFERRED_OUTPUT_DEFS (DECL_OF_NAME, DECL_OF_VALUE)
     A C statement that evaluates to true if the assembler code which
     defines (equates) the symbol whose tree node is DECL_OF_NAME to
     have the value of the tree node DECL_OF_VALUE should be emitted
     near the end of the current compilation unit.  The default is to
     not defer output of defines.  This macro affects defines output by
     `ASM_OUTPUT_DEF' and `ASM_OUTPUT_DEF_FROM_DECLS'.

 -- Macro: ASM_OUTPUT_WEAK_ALIAS (STREAM, NAME, VALUE)
     A C statement to output to the stdio stream STREAM assembler code
     which defines (equates) the weak symbol NAME to have the value
     VALUE.  If VALUE is `NULL', it defines NAME as an undefined weak
     symbol.

     Define this macro if the target only supports weak aliases; define
     `ASM_OUTPUT_DEF' instead if possible.

 -- Macro: OBJC_GEN_METHOD_LABEL (BUF, IS_INST, CLASS_NAME, CAT_NAME,
          SEL_NAME)
     Define this macro to override the default assembler names used for
     Objective-C methods.

     The default name is a unique method number followed by the name of
     the class (e.g. `_1_Foo').  For methods in categories, the name of
     the category is also included in the assembler name (e.g.
     `_1_Foo_Bar').

     These names are safe on most systems, but make debugging difficult
     since the method's selector is not present in the name.
     Therefore, particular systems define other ways of computing names.

     BUF is an expression of type `char *' which gives you a buffer in
     which to store the name; its length is as long as CLASS_NAME,
     CAT_NAME and SEL_NAME put together, plus 50 characters extra.

     The argument IS_INST specifies whether the method is an instance
     method or a class method; CLASS_NAME is the name of the class;
     CAT_NAME is the name of the category (or `NULL' if the method is
     not in a category); and SEL_NAME is the name of the selector.

     On systems where the assembler can handle quoted names, you can
     use this macro to provide more human-readable names.


File: gccint.info,  Node: Initialization,  Next: Macros for Initialization,  Prev: Label Output,  Up: Assembler Format

17.21.5 How Initialization Functions Are Handled
------------------------------------------------

The compiled code for certain languages includes "constructors" (also
called "initialization routines")--functions to initialize data in the
program when the program is started.  These functions need to be called
before the program is "started"--that is to say, before `main' is
called.

 Compiling some languages generates "destructors" (also called
"termination routines") that should be called when the program
terminates.

 To make the initialization and termination functions work, the compiler
must output something in the assembler code to cause those functions to
be called at the appropriate time.  When you port the compiler to a new
system, you need to specify how to do this.

 There are two major ways that GCC currently supports the execution of
initialization and termination functions.  Each way has two variants.
Much of the structure is common to all four variations.

 The linker must build two lists of these functions--a list of
initialization functions, called `__CTOR_LIST__', and a list of
termination functions, called `__DTOR_LIST__'.

 Each list always begins with an ignored function pointer (which may
hold 0, -1, or a count of the function pointers after it, depending on
the environment).  This is followed by a series of zero or more function
pointers to constructors (or destructors), followed by a function
pointer containing zero.

 Depending on the operating system and its executable file format,
either `crtstuff.c' or `libgcc2.c' traverses these lists at startup
time and exit time.  Constructors are called in reverse order of the
list; destructors in forward order.

 The best way to handle static constructors works only for object file
formats which provide arbitrarily-named sections.  A section is set
aside for a list of constructors, and another for a list of destructors.
Traditionally these are called `.ctors' and `.dtors'.  Each object file
that defines an initialization function also puts a word in the
constructor section to point to that function.  The linker accumulates
all these words into one contiguous `.ctors' section.  Termination
functions are handled similarly.

 This method will be chosen as the default by `target-def.h' if
`TARGET_ASM_NAMED_SECTION' is defined.  A target that does not support
arbitrary sections, but does support special designated constructor and
destructor sections may define `CTORS_SECTION_ASM_OP' and
`DTORS_SECTION_ASM_OP' to achieve the same effect.

 When arbitrary sections are available, there are two variants,
depending upon how the code in `crtstuff.c' is called.  On systems that
support a ".init" section which is executed at program startup, parts
of `crtstuff.c' are compiled into that section.  The program is linked
by the `gcc' driver like this:

     ld -o OUTPUT_FILE crti.o crtbegin.o ... -lgcc crtend.o crtn.o

 The prologue of a function (`__init') appears in the `.init' section
of `crti.o'; the epilogue appears in `crtn.o'.  Likewise for the
function `__fini' in the ".fini" section.  Normally these files are
provided by the operating system or by the GNU C library, but are
provided by GCC for a few targets.

 The objects `crtbegin.o' and `crtend.o' are (for most targets)
compiled from `crtstuff.c'.  They contain, among other things, code
fragments within the `.init' and `.fini' sections that branch to
routines in the `.text' section.  The linker will pull all parts of a
section together, which results in a complete `__init' function that
invokes the routines we need at startup.

 To use this variant, you must define the `INIT_SECTION_ASM_OP' macro
properly.

 If no init section is available, when GCC compiles any function called
`main' (or more accurately, any function designated as a program entry
point by the language front end calling `expand_main_function'), it
inserts a procedure call to `__main' as the first executable code after
the function prologue.  The `__main' function is defined in `libgcc2.c'
and runs the global constructors.

 In file formats that don't support arbitrary sections, there are again
two variants.  In the simplest variant, the GNU linker (GNU `ld') and
an `a.out' format must be used.  In this case, `TARGET_ASM_CONSTRUCTOR'
is defined to produce a `.stabs' entry of type `N_SETT', referencing
the name `__CTOR_LIST__', and with the address of the void function
containing the initialization code as its value.  The GNU linker
recognizes this as a request to add the value to a "set"; the values
are accumulated, and are eventually placed in the executable as a
vector in the format described above, with a leading (ignored) count
and a trailing zero element.  `TARGET_ASM_DESTRUCTOR' is handled
similarly.  Since no init section is available, the absence of
`INIT_SECTION_ASM_OP' causes the compilation of `main' to call `__main'
as above, starting the initialization process.

 The last variant uses neither arbitrary sections nor the GNU linker.
This is preferable when you want to do dynamic linking and when using
file formats which the GNU linker does not support, such as `ECOFF'.  In
this case, `TARGET_HAVE_CTORS_DTORS' is false, initialization and
termination functions are recognized simply by their names.  This
requires an extra program in the linkage step, called `collect2'.  This
program pretends to be the linker, for use with GCC; it does its job by
running the ordinary linker, but also arranges to include the vectors of
initialization and termination functions.  These functions are called
via `__main' as described above.  In order to use this method,
`use_collect2' must be defined in the target in `config.gcc'.

 The following section describes the specific macros that control and
customize the handling of initialization and termination functions.


File: gccint.info,  Node: Macros for Initialization,  Next: Instruction Output,  Prev: Initialization,  Up: Assembler Format

17.21.6 Macros Controlling Initialization Routines
--------------------------------------------------

Here are the macros that control how the compiler handles initialization
and termination functions:

 -- Macro: INIT_SECTION_ASM_OP
     If defined, a C string constant, including spacing, for the
     assembler operation to identify the following data as
     initialization code.  If not defined, GCC will assume such a
     section does not exist.  When you are using special sections for
     initialization and termination functions, this macro also controls
     how `crtstuff.c' and `libgcc2.c' arrange to run the initialization
     functions.

 -- Macro: HAS_INIT_SECTION
     If defined, `main' will not call `__main' as described above.
     This macro should be defined for systems that control start-up code
     on a symbol-by-symbol basis, such as OSF/1, and should not be
     defined explicitly for systems that support `INIT_SECTION_ASM_OP'.

 -- Macro: LD_INIT_SWITCH
     If defined, a C string constant for a switch that tells the linker
     that the following symbol is an initialization routine.

 -- Macro: LD_FINI_SWITCH
     If defined, a C string constant for a switch that tells the linker
     that the following symbol is a finalization routine.

 -- Macro: COLLECT_SHARED_INIT_FUNC (STREAM, FUNC)
     If defined, a C statement that will write a function that can be
     automatically called when a shared library is loaded.  The function
     should call FUNC, which takes no arguments.  If not defined, and
     the object format requires an explicit initialization function,
     then a function called `_GLOBAL__DI' will be generated.

     This function and the following one are used by collect2 when
     linking a shared library that needs constructors or destructors,
     or has DWARF2 exception tables embedded in the code.

 -- Macro: COLLECT_SHARED_FINI_FUNC (STREAM, FUNC)
     If defined, a C statement that will write a function that can be
     automatically called when a shared library is unloaded.  The
     function should call FUNC, which takes no arguments.  If not
     defined, and the object format requires an explicit finalization
     function, then a function called `_GLOBAL__DD' will be generated.

 -- Macro: INVOKE__main
     If defined, `main' will call `__main' despite the presence of
     `INIT_SECTION_ASM_OP'.  This macro should be defined for systems
     where the init section is not actually run automatically, but is
     still useful for collecting the lists of constructors and
     destructors.

 -- Macro: SUPPORTS_INIT_PRIORITY
     If nonzero, the C++ `init_priority' attribute is supported and the
     compiler should emit instructions to control the order of
     initialization of objects.  If zero, the compiler will issue an
     error message upon encountering an `init_priority' attribute.

 -- Target Hook: bool TARGET_HAVE_CTORS_DTORS
     This value is true if the target supports some "native" method of
     collecting constructors and destructors to be run at startup and
     exit.  It is false if we must use `collect2'.

 -- Target Hook: void TARGET_ASM_CONSTRUCTOR (rtx SYMBOL, int PRIORITY)
     If defined, a function that outputs assembler code to arrange to
     call the function referenced by SYMBOL at initialization time.

     Assume that SYMBOL is a `SYMBOL_REF' for a function taking no
     arguments and with no return value.  If the target supports
     initialization priorities, PRIORITY is a value between 0 and
     `MAX_INIT_PRIORITY'; otherwise it must be `DEFAULT_INIT_PRIORITY'.

     If this macro is not defined by the target, a suitable default will
     be chosen if (1) the target supports arbitrary section names, (2)
     the target defines `CTORS_SECTION_ASM_OP', or (3) `USE_COLLECT2'
     is not defined.

 -- Target Hook: void TARGET_ASM_DESTRUCTOR (rtx SYMBOL, int PRIORITY)
     This is like `TARGET_ASM_CONSTRUCTOR' but used for termination
     functions rather than initialization functions.

 If `TARGET_HAVE_CTORS_DTORS' is true, the initialization routine
generated for the generated object file will have static linkage.

 If your system uses `collect2' as the means of processing
constructors, then that program normally uses `nm' to scan an object
file for constructor functions to be called.

 On certain kinds of systems, you can define this macro to make
`collect2' work faster (and, in some cases, make it work at all):

 -- Macro: OBJECT_FORMAT_COFF
     Define this macro if the system uses COFF (Common Object File
     Format) object files, so that `collect2' can assume this format
     and scan object files directly for dynamic constructor/destructor
     functions.

     This macro is effective only in a native compiler; `collect2' as
     part of a cross compiler always uses `nm' for the target machine.

 -- Macro: REAL_NM_FILE_NAME
     Define this macro as a C string constant containing the file name
     to use to execute `nm'.  The default is to search the path
     normally for `nm'.

 -- Macro: NM_FLAGS
     `collect2' calls `nm' to scan object files for static constructors
     and destructors and LTO info.  By default, `-n' is passed.  Define
     `NM_FLAGS' to a C string constant if other options are needed to
     get the same output format as GNU `nm -n' produces.

 If your system supports shared libraries and has a program to list the
dynamic dependencies of a given library or executable, you can define
these macros to enable support for running initialization and
termination functions in shared libraries:

 -- Macro: LDD_SUFFIX
     Define this macro to a C string constant containing the name of
     the program which lists dynamic dependencies, like `ldd' under
     SunOS 4.

 -- Macro: PARSE_LDD_OUTPUT (PTR)
     Define this macro to be C code that extracts filenames from the
     output of the program denoted by `LDD_SUFFIX'.  PTR is a variable
     of type `char *' that points to the beginning of a line of output
     from `LDD_SUFFIX'.  If the line lists a dynamic dependency, the
     code must advance PTR to the beginning of the filename on that
     line.  Otherwise, it must set PTR to `NULL'.

 -- Macro: SHLIB_SUFFIX
     Define this macro to a C string constant containing the default
     shared library extension of the target (e.g., `".so"').  `collect2'
     strips version information after this suffix when generating global
     constructor and destructor names.  This define is only needed on
     targets that use `collect2' to process constructors and
     destructors.


File: gccint.info,  Node: Instruction Output,  Next: Dispatch Tables,  Prev: Macros for Initialization,  Up: Assembler Format

17.21.7 Output of Assembler Instructions
----------------------------------------

This describes assembler instruction output.

 -- Macro: REGISTER_NAMES
     A C initializer containing the assembler's names for the machine
     registers, each one as a C string constant.  This is what
     translates register numbers in the compiler into assembler
     language.

 -- Macro: ADDITIONAL_REGISTER_NAMES
     If defined, a C initializer for an array of structures containing
     a name and a register number.  This macro defines additional names
     for hard registers, thus allowing the `asm' option in declarations
     to refer to registers using alternate names.

 -- Macro: OVERLAPPING_REGISTER_NAMES
     If defined, a C initializer for an array of structures containing a
     name, a register number and a count of the number of consecutive
     machine registers the name overlaps.  This macro defines additional
     names for hard registers, thus allowing the `asm' option in
     declarations to refer to registers using alternate names.  Unlike
     `ADDITIONAL_REGISTER_NAMES', this macro should be used when the
     register name implies multiple underlying registers.

     This macro should be used when it is important that a clobber in an
     `asm' statement clobbers all the underlying values implied by the
     register name.  For example, on ARM, clobbering the
     double-precision VFP register "d0" implies clobbering both
     single-precision registers "s0" and "s1".

 -- Macro: ASM_OUTPUT_OPCODE (STREAM, PTR)
     Define this macro if you are using an unusual assembler that
     requires different names for the machine instructions.

     The definition is a C statement or statements which output an
     assembler instruction opcode to the stdio stream STREAM.  The
     macro-operand PTR is a variable of type `char *' which points to
     the opcode name in its "internal" form--the form that is written
     in the machine description.  The definition should output the
     opcode name to STREAM, performing any translation you desire, and
     increment the variable PTR to point at the end of the opcode so
     that it will not be output twice.

     In fact, your macro definition may process less than the entire
     opcode name, or more than the opcode name; but if you want to
     process text that includes `%'-sequences to substitute operands,
     you must take care of the substitution yourself.  Just be sure to
     increment PTR over whatever text should not be output normally.

     If you need to look at the operand values, they can be found as the
     elements of `recog_data.operand'.

     If the macro definition does nothing, the instruction is output in
     the usual way.

 -- Macro: FINAL_PRESCAN_INSN (INSN, OPVEC, NOPERANDS)
     If defined, a C statement to be executed just prior to the output
     of assembler code for INSN, to modify the extracted operands so
     they will be output differently.

     Here the argument OPVEC is the vector containing the operands
     extracted from INSN, and NOPERANDS is the number of elements of
     the vector which contain meaningful data for this insn.  The
     contents of this vector are what will be used to convert the insn
     template into assembler code, so you can change the assembler
     output by changing the contents of the vector.

     This macro is useful when various assembler syntaxes share a single
     file of instruction patterns; by defining this macro differently,
     you can cause a large class of instructions to be output
     differently (such as with rearranged operands).  Naturally,
     variations in assembler syntax affecting individual insn patterns
     ought to be handled by writing conditional output routines in
     those patterns.

     If this macro is not defined, it is equivalent to a null statement.

 -- Target Hook: void TARGET_ASM_FINAL_POSTSCAN_INSN (FILE *FILE, rtx
          INSN, rtx *OPVEC, int NOPERANDS)
     If defined, this target hook is a function which is executed just
     after the output of assembler code for INSN, to change the mode of
     the assembler if necessary.

     Here the argument OPVEC is the vector containing the operands
     extracted from INSN, and NOPERANDS is the number of elements of
     the vector which contain meaningful data for this insn.  The
     contents of this vector are what was used to convert the insn
     template into assembler code, so you can change the assembler mode
     by checking the contents of the vector.

 -- Macro: PRINT_OPERAND (STREAM, X, CODE)
     A C compound statement to output to stdio stream STREAM the
     assembler syntax for an instruction operand X.  X is an RTL
     expression.

     CODE is a value that can be used to specify one of several ways of
     printing the operand.  It is used when identical operands must be
     printed differently depending on the context.  CODE comes from the
     `%' specification that was used to request printing of the
     operand.  If the specification was just `%DIGIT' then CODE is 0;
     if the specification was `%LTR DIGIT' then CODE is the ASCII code
     for LTR.

     If X is a register, this macro should print the register's name.
     The names can be found in an array `reg_names' whose type is `char
     *[]'.  `reg_names' is initialized from `REGISTER_NAMES'.

     When the machine description has a specification `%PUNCT' (a `%'
     followed by a punctuation character), this macro is called with a
     null pointer for X and the punctuation character for CODE.

 -- Macro: PRINT_OPERAND_PUNCT_VALID_P (CODE)
     A C expression which evaluates to true if CODE is a valid
     punctuation character for use in the `PRINT_OPERAND' macro.  If
     `PRINT_OPERAND_PUNCT_VALID_P' is not defined, it means that no
     punctuation characters (except for the standard one, `%') are used
     in this way.

 -- Macro: PRINT_OPERAND_ADDRESS (STREAM, X)
     A C compound statement to output to stdio stream STREAM the
     assembler syntax for an instruction operand that is a memory
     reference whose address is X.  X is an RTL expression.

     On some machines, the syntax for a symbolic address depends on the
     section that the address refers to.  On these machines, define the
     hook `TARGET_ENCODE_SECTION_INFO' to store the information into the
     `symbol_ref', and then check for it here.  *Note Assembler
     Format::.

 -- Macro: DBR_OUTPUT_SEQEND (FILE)
     A C statement, to be executed after all slot-filler instructions
     have been output.  If necessary, call `dbr_sequence_length' to
     determine the number of slots filled in a sequence (zero if not
     currently outputting a sequence), to decide how many no-ops to
     output, or whatever.

     Don't define this macro if it has nothing to do, but it is helpful
     in reading assembly output if the extent of the delay sequence is
     made explicit (e.g. with white space).

 Note that output routines for instructions with delay slots must be
prepared to deal with not being output as part of a sequence (i.e. when
the scheduling pass is not run, or when no slot fillers could be
found.)  The variable `final_sequence' is null when not processing a
sequence, otherwise it contains the `sequence' rtx being output.

 -- Macro: REGISTER_PREFIX
 -- Macro: LOCAL_LABEL_PREFIX
 -- Macro: USER_LABEL_PREFIX
 -- Macro: IMMEDIATE_PREFIX
     If defined, C string expressions to be used for the `%R', `%L',
     `%U', and `%I' options of `asm_fprintf' (see `final.c').  These
     are useful when a single `md' file must support multiple assembler
     formats.  In that case, the various `tm.h' files can define these
     macros differently.

 -- Macro: ASM_FPRINTF_EXTENSIONS (FILE, ARGPTR, FORMAT)
     If defined this macro should expand to a series of `case'
     statements which will be parsed inside the `switch' statement of
     the `asm_fprintf' function.  This allows targets to define extra
     printf formats which may useful when generating their assembler
     statements.  Note that uppercase letters are reserved for future
     generic extensions to asm_fprintf, and so are not available to
     target specific code.  The output file is given by the parameter
     FILE.  The varargs input pointer is ARGPTR and the rest of the
     format string, starting the character after the one that is being
     switched upon, is pointed to by FORMAT.

 -- Macro: ASSEMBLER_DIALECT
     If your target supports multiple dialects of assembler language
     (such as different opcodes), define this macro as a C expression
     that gives the numeric index of the assembler language dialect to
     use, with zero as the first variant.

     If this macro is defined, you may use constructs of the form
          `{option0|option1|option2...}'
     in the output templates of patterns (*note Output Template::) or
     in the first argument of `asm_fprintf'.  This construct outputs
     `option0', `option1', `option2', etc., if the value of
     `ASSEMBLER_DIALECT' is zero, one, two, etc.  Any special characters
     within these strings retain their usual meaning.  If there are
     fewer alternatives within the braces than the value of
     `ASSEMBLER_DIALECT', the construct outputs nothing.

     If you do not define this macro, the characters `{', `|' and `}'
     do not have any special meaning when used in templates or operands
     to `asm_fprintf'.

     Define the macros `REGISTER_PREFIX', `LOCAL_LABEL_PREFIX',
     `USER_LABEL_PREFIX' and `IMMEDIATE_PREFIX' if you can express the
     variations in assembler language syntax with that mechanism.
     Define `ASSEMBLER_DIALECT' and use the `{option0|option1}' syntax
     if the syntax variant are larger and involve such things as
     different opcodes or operand order.

 -- Macro: ASM_OUTPUT_REG_PUSH (STREAM, REGNO)
     A C expression to output to STREAM some assembler code which will
     push hard register number REGNO onto the stack.  The code need not
     be optimal, since this macro is used only when profiling.

 -- Macro: ASM_OUTPUT_REG_POP (STREAM, REGNO)
     A C expression to output to STREAM some assembler code which will
     pop hard register number REGNO off of the stack.  The code need
     not be optimal, since this macro is used only when profiling.


File: gccint.info,  Node: Dispatch Tables,  Next: Exception Region Output,  Prev: Instruction Output,  Up: Assembler Format

17.21.8 Output of Dispatch Tables
---------------------------------

This concerns dispatch tables.

 -- Macro: ASM_OUTPUT_ADDR_DIFF_ELT (STREAM, BODY, VALUE, REL)
     A C statement to output to the stdio stream STREAM an assembler
     pseudo-instruction to generate a difference between two labels.
     VALUE and REL are the numbers of two internal labels.  The
     definitions of these labels are output using
     `(*targetm.asm_out.internal_label)', and they must be printed in
     the same way here.  For example,

          fprintf (STREAM, "\t.word L%d-L%d\n",
                   VALUE, REL)

     You must provide this macro on machines where the addresses in a
     dispatch table are relative to the table's own address.  If
     defined, GCC will also use this macro on all machines when
     producing PIC.  BODY is the body of the `ADDR_DIFF_VEC'; it is
     provided so that the mode and flags can be read.

 -- Macro: ASM_OUTPUT_ADDR_VEC_ELT (STREAM, VALUE)
     This macro should be provided on machines where the addresses in a
     dispatch table are absolute.

     The definition should be a C statement to output to the stdio
     stream STREAM an assembler pseudo-instruction to generate a
     reference to a label.  VALUE is the number of an internal label
     whose definition is output using
     `(*targetm.asm_out.internal_label)'.  For example,

          fprintf (STREAM, "\t.word L%d\n", VALUE)

 -- Macro: ASM_OUTPUT_CASE_LABEL (STREAM, PREFIX, NUM, TABLE)
     Define this if the label before a jump-table needs to be output
     specially.  The first three arguments are the same as for
     `(*targetm.asm_out.internal_label)'; the fourth argument is the
     jump-table which follows (a `jump_insn' containing an `addr_vec'
     or `addr_diff_vec').

     This feature is used on system V to output a `swbeg' statement for
     the table.

     If this macro is not defined, these labels are output with
     `(*targetm.asm_out.internal_label)'.

 -- Macro: ASM_OUTPUT_CASE_END (STREAM, NUM, TABLE)
     Define this if something special must be output at the end of a
     jump-table.  The definition should be a C statement to be executed
     after the assembler code for the table is written.  It should write
     the appropriate code to stdio stream STREAM.  The argument TABLE
     is the jump-table insn, and NUM is the label-number of the
     preceding label.

     If this macro is not defined, nothing special is output at the end
     of the jump-table.

 -- Target Hook: void TARGET_ASM_EMIT_UNWIND_LABEL (FILE *STREAM, tree
          DECL, int FOR_EH, int EMPTY)
     This target hook emits a label at the beginning of each FDE.  It
     should be defined on targets where FDEs need special labels, and it
     should write the appropriate label, for the FDE associated with the
     function declaration DECL, to the stdio stream STREAM.  The third
     argument, FOR_EH, is a boolean: true if this is for an exception
     table.  The fourth argument, EMPTY, is a boolean: true if this is
     a placeholder label for an omitted FDE.

     The default is that FDEs are not given nonlocal labels.

 -- Target Hook: void TARGET_ASM_EMIT_EXCEPT_TABLE_LABEL (FILE *STREAM)
     This target hook emits a label at the beginning of the exception
     table.  It should be defined on targets where it is desirable for
     the table to be broken up according to function.

     The default is that no label is emitted.

 -- Target Hook: void TARGET_ASM_EMIT_EXCEPT_PERSONALITY (rtx
          PERSONALITY)
     If the target implements `TARGET_ASM_UNWIND_EMIT', this hook may
     be used to emit a directive to install a personality hook into the
     unwind info.  This hook should not be used if dwarf2 unwind info
     is used.

 -- Target Hook: void TARGET_ASM_UNWIND_EMIT (FILE *STREAM, rtx INSN)
     This target hook emits assembly directives required to unwind the
     given instruction.  This is only used when
     `TARGET_EXCEPT_UNWIND_INFO' returns `UI_TARGET'.

 -- Target Hook: bool TARGET_ASM_UNWIND_EMIT_BEFORE_INSN
     True if the `TARGET_ASM_UNWIND_EMIT' hook should be called before
     the assembly for INSN has been emitted, false if the hook should
     be called afterward.


File: gccint.info,  Node: Exception Region Output,  Next: Alignment Output,  Prev: Dispatch Tables,  Up: Assembler Format

17.21.9 Assembler Commands for Exception Regions
------------------------------------------------

This describes commands marking the start and the end of an exception
region.

 -- Macro: EH_FRAME_SECTION_NAME
     If defined, a C string constant for the name of the section
     containing exception handling frame unwind information.  If not
     defined, GCC will provide a default definition if the target
     supports named sections.  `crtstuff.c' uses this macro to switch
     to the appropriate section.

     You should define this symbol if your target supports DWARF 2 frame
     unwind information and the default definition does not work.

 -- Macro: EH_FRAME_IN_DATA_SECTION
     If defined, DWARF 2 frame unwind information will be placed in the
     data section even though the target supports named sections.  This
     might be necessary, for instance, if the system linker does garbage
     collection and sections cannot be marked as not to be collected.

     Do not define this macro unless `TARGET_ASM_NAMED_SECTION' is also
     defined.

 -- Macro: EH_TABLES_CAN_BE_READ_ONLY
     Define this macro to 1 if your target is such that no frame unwind
     information encoding used with non-PIC code will ever require a
     runtime relocation, but the linker may not support merging
     read-only and read-write sections into a single read-write section.

 -- Macro: MASK_RETURN_ADDR
     An rtx used to mask the return address found via
     `RETURN_ADDR_RTX', so that it does not contain any extraneous set
     bits in it.

 -- Macro: DWARF2_UNWIND_INFO
     Define this macro to 0 if your target supports DWARF 2 frame unwind
     information, but it does not yet work with exception handling.
     Otherwise, if your target supports this information (if it defines
     `INCOMING_RETURN_ADDR_RTX' and `OBJECT_FORMAT_ELF'), GCC will
     provide a default definition of 1.

 -- Common Target Hook: enum unwind_info_type TARGET_EXCEPT_UNWIND_INFO
          (struct gcc_options *OPTS)
     This hook defines the mechanism that will be used for exception
     handling by the target.  If the target has ABI specified unwind
     tables, the hook should return `UI_TARGET'.  If the target is to
     use the `setjmp'/`longjmp'-based exception handling scheme, the
     hook should return `UI_SJLJ'.  If the target supports DWARF 2
     frame unwind information, the hook should return `UI_DWARF2'.

     A target may, if exceptions are disabled, choose to return
     `UI_NONE'.  This may end up simplifying other parts of
     target-specific code.  The default implementation of this hook
     never returns `UI_NONE'.

     Note that the value returned by this hook should be constant.  It
     should not depend on anything except the command-line switches
     described by OPTS.  In particular, the setting `UI_SJLJ' must be
     fixed at compiler start-up as C pre-processor macros and builtin
     functions related to exception handling are set up depending on
     this setting.

     The default implementation of the hook first honors the
     `--enable-sjlj-exceptions' configure option, then
     `DWARF2_UNWIND_INFO', and finally defaults to `UI_SJLJ'.  If
     `DWARF2_UNWIND_INFO' depends on command-line options, the target
     must define this hook so that OPTS is used correctly.

 -- Common Target Hook: bool TARGET_UNWIND_TABLES_DEFAULT
     This variable should be set to `true' if the target ABI requires
     unwinding tables even when exceptions are not used.  It must not
     be modified by command-line option processing.

 -- Macro: DONT_USE_BUILTIN_SETJMP
     Define this macro to 1 if the `setjmp'/`longjmp'-based scheme
     should use the `setjmp'/`longjmp' functions from the C library
     instead of the `__builtin_setjmp'/`__builtin_longjmp' machinery.

 -- Macro: JMP_BUF_SIZE
     This macro has no effect unless `DONT_USE_BUILTIN_SETJMP' is also
     defined.  Define this macro if the default size of `jmp_buf' buffer
     for the `setjmp'/`longjmp'-based exception handling mechanism is
     not large enough, or if it is much too large.  The default size is
     `FIRST_PSEUDO_REGISTER * sizeof(void *)'.

 -- Macro: DWARF_CIE_DATA_ALIGNMENT
     This macro need only be defined if the target might save registers
     in the function prologue at an offset to the stack pointer that is
     not aligned to `UNITS_PER_WORD'.  The definition should be the
     negative minimum alignment if `STACK_GROWS_DOWNWARD' is defined,
     and the positive minimum alignment otherwise.  *Note SDB and
     DWARF::.  Only applicable if the target supports DWARF 2 frame
     unwind information.

 -- Target Hook: bool TARGET_TERMINATE_DW2_EH_FRAME_INFO
     Contains the value true if the target should add a zero word onto
     the end of a Dwarf-2 frame info section when used for exception
     handling.  Default value is false if `EH_FRAME_SECTION_NAME' is
     defined, and true otherwise.

 -- Target Hook: rtx TARGET_DWARF_REGISTER_SPAN (rtx REG)
     Given a register, this hook should return a parallel of registers
     to represent where to find the register pieces.  Define this hook
     if the register and its mode are represented in Dwarf in
     non-contiguous locations, or if the register should be represented
     in more than one register in Dwarf.  Otherwise, this hook should
     return `NULL_RTX'.  If not defined, the default is to return
     `NULL_RTX'.

 -- Target Hook: void TARGET_INIT_DWARF_REG_SIZES_EXTRA (tree ADDRESS)
     If some registers are represented in Dwarf-2 unwind information in
     multiple pieces, define this hook to fill in information about the
     sizes of those pieces in the table used by the unwinder at runtime.
     It will be called by `expand_builtin_init_dwarf_reg_sizes' after
     filling in a single size corresponding to each hard register;
     ADDRESS is the address of the table.

 -- Target Hook: bool TARGET_ASM_TTYPE (rtx SYM)
     This hook is used to output a reference from a frame unwinding
     table to the type_info object identified by SYM.  It should return
     `true' if the reference was output.  Returning `false' will cause
     the reference to be output using the normal Dwarf2 routines.

 -- Target Hook: bool TARGET_ARM_EABI_UNWINDER
     This flag should be set to `true' on targets that use an ARM EABI
     based unwinding library, and `false' on other targets.  This
     effects the format of unwinding tables, and how the unwinder in
     entered after running a cleanup.  The default is `false'.


File: gccint.info,  Node: Alignment Output,  Prev: Exception Region Output,  Up: Assembler Format

17.21.10 Assembler Commands for Alignment
-----------------------------------------

This describes commands for alignment.

 -- Macro: JUMP_ALIGN (LABEL)
     The alignment (log base 2) to put in front of LABEL, which is a
     common destination of jumps and has no fallthru incoming edge.

     This macro need not be defined if you don't want any special
     alignment to be done at such a time.  Most machine descriptions do
     not currently define the macro.

     Unless it's necessary to inspect the LABEL parameter, it is better
     to set the variable ALIGN_JUMPS in the target's
     `TARGET_OPTION_OVERRIDE'.  Otherwise, you should try to honor the
     user's selection in ALIGN_JUMPS in a `JUMP_ALIGN' implementation.

 -- Target Hook: int TARGET_ASM_JUMP_ALIGN_MAX_SKIP (rtx LABEL)
     The maximum number of bytes to skip before LABEL when applying
     `JUMP_ALIGN'.  This works only if `ASM_OUTPUT_MAX_SKIP_ALIGN' is
     defined.

 -- Macro: LABEL_ALIGN_AFTER_BARRIER (LABEL)
     The alignment (log base 2) to put in front of LABEL, which follows
     a `BARRIER'.

     This macro need not be defined if you don't want any special
     alignment to be done at such a time.  Most machine descriptions do
     not currently define the macro.

 -- Target Hook: int TARGET_ASM_LABEL_ALIGN_AFTER_BARRIER_MAX_SKIP (rtx
          LABEL)
     The maximum number of bytes to skip before LABEL when applying
     `LABEL_ALIGN_AFTER_BARRIER'.  This works only if
     `ASM_OUTPUT_MAX_SKIP_ALIGN' is defined.

 -- Macro: LOOP_ALIGN (LABEL)
     The alignment (log base 2) to put in front of LABEL, which follows
     a `NOTE_INSN_LOOP_BEG' note.

     This macro need not be defined if you don't want any special
     alignment to be done at such a time.  Most machine descriptions do
     not currently define the macro.

     Unless it's necessary to inspect the LABEL parameter, it is better
     to set the variable `align_loops' in the target's
     `TARGET_OPTION_OVERRIDE'.  Otherwise, you should try to honor the
     user's selection in `align_loops' in a `LOOP_ALIGN' implementation.

 -- Target Hook: int TARGET_ASM_LOOP_ALIGN_MAX_SKIP (rtx LABEL)
     The maximum number of bytes to skip when applying `LOOP_ALIGN' to
     LABEL.  This works only if `ASM_OUTPUT_MAX_SKIP_ALIGN' is defined.

 -- Macro: LABEL_ALIGN (LABEL)
     The alignment (log base 2) to put in front of LABEL.  If
     `LABEL_ALIGN_AFTER_BARRIER' / `LOOP_ALIGN' specify a different
     alignment, the maximum of the specified values is used.

     Unless it's necessary to inspect the LABEL parameter, it is better
     to set the variable `align_labels' in the target's
     `TARGET_OPTION_OVERRIDE'.  Otherwise, you should try to honor the
     user's selection in `align_labels' in a `LABEL_ALIGN'
     implementation.

 -- Target Hook: int TARGET_ASM_LABEL_ALIGN_MAX_SKIP (rtx LABEL)
     The maximum number of bytes to skip when applying `LABEL_ALIGN' to
     LABEL.  This works only if `ASM_OUTPUT_MAX_SKIP_ALIGN' is defined.

 -- Macro: ASM_OUTPUT_SKIP (STREAM, NBYTES)
     A C statement to output to the stdio stream STREAM an assembler
     instruction to advance the location counter by NBYTES bytes.
     Those bytes should be zero when loaded.  NBYTES will be a C
     expression of type `unsigned HOST_WIDE_INT'.

 -- Macro: ASM_NO_SKIP_IN_TEXT
     Define this macro if `ASM_OUTPUT_SKIP' should not be used in the
     text section because it fails to put zeros in the bytes that are
     skipped.  This is true on many Unix systems, where the pseudo-op
     to skip bytes produces no-op instructions rather than zeros when
     used in the text section.

 -- Macro: ASM_OUTPUT_ALIGN (STREAM, POWER)
     A C statement to output to the stdio stream STREAM an assembler
     command to advance the location counter to a multiple of 2 to the
     POWER bytes.  POWER will be a C expression of type `int'.

 -- Macro: ASM_OUTPUT_ALIGN_WITH_NOP (STREAM, POWER)
     Like `ASM_OUTPUT_ALIGN', except that the "nop" instruction is used
     for padding, if necessary.

 -- Macro: ASM_OUTPUT_MAX_SKIP_ALIGN (STREAM, POWER, MAX_SKIP)
     A C statement to output to the stdio stream STREAM an assembler
     command to advance the location counter to a multiple of 2 to the
     POWER bytes, but only if MAX_SKIP or fewer bytes are needed to
     satisfy the alignment request.  POWER and MAX_SKIP will be a C
     expression of type `int'.


File: gccint.info,  Node: Debugging Info,  Next: Floating Point,  Prev: Assembler Format,  Up: Target Macros

17.22 Controlling Debugging Information Format
==============================================

This describes how to specify debugging information.

* Menu:

* All Debuggers::      Macros that affect all debugging formats uniformly.
* DBX Options::        Macros enabling specific options in DBX format.
* DBX Hooks::          Hook macros for varying DBX format.
* File Names and DBX:: Macros controlling output of file names in DBX format.
* SDB and DWARF::      Macros for SDB (COFF) and DWARF formats.
* VMS Debug::          Macros for VMS debug format.


File: gccint.info,  Node: All Debuggers,  Next: DBX Options,  Up: Debugging Info

17.22.1 Macros Affecting All Debugging Formats
----------------------------------------------

These macros affect all debugging formats.

 -- Macro: DBX_REGISTER_NUMBER (REGNO)
     A C expression that returns the DBX register number for the
     compiler register number REGNO.  In the default macro provided,
     the value of this expression will be REGNO itself.  But sometimes
     there are some registers that the compiler knows about and DBX
     does not, or vice versa.  In such cases, some register may need to
     have one number in the compiler and another for DBX.

     If two registers have consecutive numbers inside GCC, and they can
     be used as a pair to hold a multiword value, then they _must_ have
     consecutive numbers after renumbering with `DBX_REGISTER_NUMBER'.
     Otherwise, debuggers will be unable to access such a pair, because
     they expect register pairs to be consecutive in their own
     numbering scheme.

     If you find yourself defining `DBX_REGISTER_NUMBER' in way that
     does not preserve register pairs, then what you must do instead is
     redefine the actual register numbering scheme.

 -- Macro: DEBUGGER_AUTO_OFFSET (X)
     A C expression that returns the integer offset value for an
     automatic variable having address X (an RTL expression).  The
     default computation assumes that X is based on the frame-pointer
     and gives the offset from the frame-pointer.  This is required for
     targets that produce debugging output for DBX or COFF-style
     debugging output for SDB and allow the frame-pointer to be
     eliminated when the `-g' options is used.

 -- Macro: DEBUGGER_ARG_OFFSET (OFFSET, X)
     A C expression that returns the integer offset value for an
     argument having address X (an RTL expression).  The nominal offset
     is OFFSET.

 -- Macro: PREFERRED_DEBUGGING_TYPE
     A C expression that returns the type of debugging output GCC should
     produce when the user specifies just `-g'.  Define this if you
     have arranged for GCC to support more than one format of debugging
     output.  Currently, the allowable values are `DBX_DEBUG',
     `SDB_DEBUG', `DWARF_DEBUG', `DWARF2_DEBUG', `XCOFF_DEBUG',
     `VMS_DEBUG', and `VMS_AND_DWARF2_DEBUG'.

     When the user specifies `-ggdb', GCC normally also uses the value
     of this macro to select the debugging output format, but with two
     exceptions.  If `DWARF2_DEBUGGING_INFO' is defined, GCC uses the
     value `DWARF2_DEBUG'.  Otherwise, if `DBX_DEBUGGING_INFO' is
     defined, GCC uses `DBX_DEBUG'.

     The value of this macro only affects the default debugging output;
     the user can always get a specific type of output by using
     `-gstabs', `-gcoff', `-gdwarf-2', `-gxcoff', or `-gvms'.


File: gccint.info,  Node: DBX Options,  Next: DBX Hooks,  Prev: All Debuggers,  Up: Debugging Info

17.22.2 Specific Options for DBX Output
---------------------------------------

These are specific options for DBX output.

 -- Macro: DBX_DEBUGGING_INFO
     Define this macro if GCC should produce debugging output for DBX
     in response to the `-g' option.

 -- Macro: XCOFF_DEBUGGING_INFO
     Define this macro if GCC should produce XCOFF format debugging
     output in response to the `-g' option.  This is a variant of DBX
     format.

 -- Macro: DEFAULT_GDB_EXTENSIONS
     Define this macro to control whether GCC should by default generate
     GDB's extended version of DBX debugging information (assuming
     DBX-format debugging information is enabled at all).  If you don't
     define the macro, the default is 1: always generate the extended
     information if there is any occasion to.

 -- Macro: DEBUG_SYMS_TEXT
     Define this macro if all `.stabs' commands should be output while
     in the text section.

 -- Macro: ASM_STABS_OP
     A C string constant, including spacing, naming the assembler
     pseudo op to use instead of `"\t.stabs\t"' to define an ordinary
     debugging symbol.  If you don't define this macro, `"\t.stabs\t"'
     is used.  This macro applies only to DBX debugging information
     format.

 -- Macro: ASM_STABD_OP
     A C string constant, including spacing, naming the assembler
     pseudo op to use instead of `"\t.stabd\t"' to define a debugging
     symbol whose value is the current location.  If you don't define
     this macro, `"\t.stabd\t"' is used.  This macro applies only to
     DBX debugging information format.

 -- Macro: ASM_STABN_OP
     A C string constant, including spacing, naming the assembler
     pseudo op to use instead of `"\t.stabn\t"' to define a debugging
     symbol with no name.  If you don't define this macro,
     `"\t.stabn\t"' is used.  This macro applies only to DBX debugging
     information format.

 -- Macro: DBX_NO_XREFS
     Define this macro if DBX on your system does not support the
     construct `xsTAGNAME'.  On some systems, this construct is used to
     describe a forward reference to a structure named TAGNAME.  On
     other systems, this construct is not supported at all.

 -- Macro: DBX_CONTIN_LENGTH
     A symbol name in DBX-format debugging information is normally
     continued (split into two separate `.stabs' directives) when it
     exceeds a certain length (by default, 80 characters).  On some
     operating systems, DBX requires this splitting; on others,
     splitting must not be done.  You can inhibit splitting by defining
     this macro with the value zero.  You can override the default
     splitting-length by defining this macro as an expression for the
     length you desire.

 -- Macro: DBX_CONTIN_CHAR
     Normally continuation is indicated by adding a `\' character to
     the end of a `.stabs' string when a continuation follows.  To use
     a different character instead, define this macro as a character
     constant for the character you want to use.  Do not define this
     macro if backslash is correct for your system.

 -- Macro: DBX_STATIC_STAB_DATA_SECTION
     Define this macro if it is necessary to go to the data section
     before outputting the `.stabs' pseudo-op for a non-global static
     variable.

 -- Macro: DBX_TYPE_DECL_STABS_CODE
     The value to use in the "code" field of the `.stabs' directive for
     a typedef.  The default is `N_LSYM'.

 -- Macro: DBX_STATIC_CONST_VAR_CODE
     The value to use in the "code" field of the `.stabs' directive for
     a static variable located in the text section.  DBX format does not
     provide any "right" way to do this.  The default is `N_FUN'.

 -- Macro: DBX_REGPARM_STABS_CODE
     The value to use in the "code" field of the `.stabs' directive for
     a parameter passed in registers.  DBX format does not provide any
     "right" way to do this.  The default is `N_RSYM'.

 -- Macro: DBX_REGPARM_STABS_LETTER
     The letter to use in DBX symbol data to identify a symbol as a
     parameter passed in registers.  DBX format does not customarily
     provide any way to do this.  The default is `'P''.

 -- Macro: DBX_FUNCTION_FIRST
     Define this macro if the DBX information for a function and its
     arguments should precede the assembler code for the function.
     Normally, in DBX format, the debugging information entirely
     follows the assembler code.

 -- Macro: DBX_BLOCKS_FUNCTION_RELATIVE
     Define this macro, with value 1, if the value of a symbol
     describing the scope of a block (`N_LBRAC' or `N_RBRAC') should be
     relative to the start of the enclosing function.  Normally, GCC
     uses an absolute address.

 -- Macro: DBX_LINES_FUNCTION_RELATIVE
     Define this macro, with value 1, if the value of a symbol
     indicating the current line number (`N_SLINE') should be relative
     to the start of the enclosing function.  Normally, GCC uses an
     absolute address.

 -- Macro: DBX_USE_BINCL
     Define this macro if GCC should generate `N_BINCL' and `N_EINCL'
     stabs for included header files, as on Sun systems.  This macro
     also directs GCC to output a type number as a pair of a file
     number and a type number within the file.  Normally, GCC does not
     generate `N_BINCL' or `N_EINCL' stabs, and it outputs a single
     number for a type number.


File: gccint.info,  Node: DBX Hooks,  Next: File Names and DBX,  Prev: DBX Options,  Up: Debugging Info

17.22.3 Open-Ended Hooks for DBX Format
---------------------------------------

These are hooks for DBX format.

 -- Macro: DBX_OUTPUT_SOURCE_LINE (STREAM, LINE, COUNTER)
     A C statement to output DBX debugging information before code for
     line number LINE of the current source file to the stdio stream
     STREAM.  COUNTER is the number of time the macro was invoked,
     including the current invocation; it is intended to generate
     unique labels in the assembly output.

     This macro should not be defined if the default output is correct,
     or if it can be made correct by defining
     `DBX_LINES_FUNCTION_RELATIVE'.

 -- Macro: NO_DBX_FUNCTION_END
     Some stabs encapsulation formats (in particular ECOFF), cannot
     handle the `.stabs "",N_FUN,,0,0,Lscope-function-1' gdb dbx
     extension construct.  On those machines, define this macro to turn
     this feature off without disturbing the rest of the gdb extensions.

 -- Macro: NO_DBX_BNSYM_ENSYM
     Some assemblers cannot handle the `.stabd BNSYM/ENSYM,0,0' gdb dbx
     extension construct.  On those machines, define this macro to turn
     this feature off without disturbing the rest of the gdb extensions.


File: gccint.info,  Node: File Names and DBX,  Next: SDB and DWARF,  Prev: DBX Hooks,  Up: Debugging Info

17.22.4 File Names in DBX Format
--------------------------------

This describes file names in DBX format.

 -- Macro: DBX_OUTPUT_MAIN_SOURCE_FILENAME (STREAM, NAME)
     A C statement to output DBX debugging information to the stdio
     stream STREAM, which indicates that file NAME is the main source
     file--the file specified as the input file for compilation.  This
     macro is called only once, at the beginning of compilation.

     This macro need not be defined if the standard form of output for
     DBX debugging information is appropriate.

     It may be necessary to refer to a label equal to the beginning of
     the text section.  You can use `assemble_name (stream,
     ltext_label_name)' to do so.  If you do this, you must also set
     the variable USED_LTEXT_LABEL_NAME to `true'.

 -- Macro: NO_DBX_MAIN_SOURCE_DIRECTORY
     Define this macro, with value 1, if GCC should not emit an
     indication of the current directory for compilation and current
     source language at the beginning of the file.

 -- Macro: NO_DBX_GCC_MARKER
     Define this macro, with value 1, if GCC should not emit an
     indication that this object file was compiled by GCC.  The default
     is to emit an `N_OPT' stab at the beginning of every source file,
     with `gcc2_compiled.' for the string and value 0.

 -- Macro: DBX_OUTPUT_MAIN_SOURCE_FILE_END (STREAM, NAME)
     A C statement to output DBX debugging information at the end of
     compilation of the main source file NAME.  Output should be
     written to the stdio stream STREAM.

     If you don't define this macro, nothing special is output at the
     end of compilation, which is correct for most machines.

 -- Macro: DBX_OUTPUT_NULL_N_SO_AT_MAIN_SOURCE_FILE_END
     Define this macro _instead of_ defining
     `DBX_OUTPUT_MAIN_SOURCE_FILE_END', if what needs to be output at
     the end of compilation is an `N_SO' stab with an empty string,
     whose value is the highest absolute text address in the file.


File: gccint.info,  Node: SDB and DWARF,  Next: VMS Debug,  Prev: File Names and DBX,  Up: Debugging Info

17.22.5 Macros for SDB and DWARF Output
---------------------------------------

Here are macros for SDB and DWARF output.

 -- Macro: SDB_DEBUGGING_INFO
     Define this macro if GCC should produce COFF-style debugging output
     for SDB in response to the `-g' option.

 -- Macro: DWARF2_DEBUGGING_INFO
     Define this macro if GCC should produce dwarf version 2 format
     debugging output in response to the `-g' option.

      -- Target Hook: int TARGET_DWARF_CALLING_CONVENTION (const_tree
               FUNCTION)
          Define this to enable the dwarf attribute
          `DW_AT_calling_convention' to be emitted for each function.
          Instead of an integer return the enum value for the `DW_CC_'
          tag.

     To support optional call frame debugging information, you must also
     define `INCOMING_RETURN_ADDR_RTX' and either set
     `RTX_FRAME_RELATED_P' on the prologue insns if you use RTL for the
     prologue, or call `dwarf2out_def_cfa' and `dwarf2out_reg_save' as
     appropriate from `TARGET_ASM_FUNCTION_PROLOGUE' if you don't.

 -- Macro: DWARF2_FRAME_INFO
     Define this macro to a nonzero value if GCC should always output
     Dwarf 2 frame information.  If `TARGET_EXCEPT_UNWIND_INFO' (*note
     Exception Region Output::) returns `UI_DWARF2', and exceptions are
     enabled, GCC will output this information not matter how you
     define `DWARF2_FRAME_INFO'.

 -- Target Hook: enum unwind_info_type TARGET_DEBUG_UNWIND_INFO (void)
     This hook defines the mechanism that will be used for describing
     frame unwind information to the debugger.  Normally the hook will
     return `UI_DWARF2' if DWARF 2 debug information is enabled, and
     return `UI_NONE' otherwise.

     A target may return `UI_DWARF2' even when DWARF 2 debug information
     is disabled in order to always output DWARF 2 frame information.

     A target may return `UI_TARGET' if it has ABI specified unwind
     tables.  This will suppress generation of the normal debug frame
     unwind information.

 -- Macro: DWARF2_ASM_LINE_DEBUG_INFO
     Define this macro to be a nonzero value if the assembler can
     generate Dwarf 2 line debug info sections.  This will result in
     much more compact line number tables, and hence is desirable if it
     works.

 -- Target Hook: bool TARGET_WANT_DEBUG_PUB_SECTIONS
     True if the `.debug_pubtypes' and `.debug_pubnames' sections
     should be emitted.  These sections are not used on most platforms,
     and in particular GDB does not use them.

 -- Target Hook: bool TARGET_FORCE_AT_COMP_DIR
     True if the `DW_AT_comp_dir' attribute should be emitted for each
     compilation unit.  This attribute is required for the darwin
     linker  to emit debug information.

 -- Target Hook: bool TARGET_DELAY_SCHED2
     True if sched2 is not to be run at its normal place.  This usually
     means it will be run as part of machine-specific reorg.

 -- Target Hook: bool TARGET_DELAY_VARTRACK
     True if vartrack is not to be run at its normal place.  This
     usually means it will be run as part of machine-specific reorg.

 -- Macro: ASM_OUTPUT_DWARF_DELTA (STREAM, SIZE, LABEL1, LABEL2)
     A C statement to issue assembly directives that create a difference
     LAB1 minus LAB2, using an integer of the given SIZE.

 -- Macro: ASM_OUTPUT_DWARF_VMS_DELTA (STREAM, SIZE, LABEL1, LABEL2)
     A C statement to issue assembly directives that create a difference
     between the two given labels in system defined units, e.g.
     instruction slots on IA64 VMS, using an integer of the given size.

 -- Macro: ASM_OUTPUT_DWARF_OFFSET (STREAM, SIZE, LABEL, SECTION)
     A C statement to issue assembly directives that create a
     section-relative reference to the given LABEL, using an integer of
     the given SIZE.  The label is known to be defined in the given
     SECTION.

 -- Macro: ASM_OUTPUT_DWARF_PCREL (STREAM, SIZE, LABEL)
     A C statement to issue assembly directives that create a
     self-relative reference to the given LABEL, using an integer of
     the given SIZE.

 -- Macro: ASM_OUTPUT_DWARF_TABLE_REF (LABEL)
     A C statement to issue assembly directives that create a reference
     to the DWARF table identifier LABEL from the current section.  This
     is used on some systems to avoid garbage collecting a DWARF table
     which is referenced by a function.

 -- Target Hook: void TARGET_ASM_OUTPUT_DWARF_DTPREL (FILE *FILE, int
          SIZE, rtx X)
     If defined, this target hook is a function which outputs a
     DTP-relative reference to the given TLS symbol of the specified
     size.

 -- Macro: PUT_SDB_...
     Define these macros to override the assembler syntax for the
     special SDB assembler directives.  See `sdbout.c' for a list of
     these macros and their arguments.  If the standard syntax is used,
     you need not define them yourself.

 -- Macro: SDB_DELIM
     Some assemblers do not support a semicolon as a delimiter, even
     between SDB assembler directives.  In that case, define this macro
     to be the delimiter to use (usually `\n').  It is not necessary to
     define a new set of `PUT_SDB_OP' macros if this is the only change
     required.

 -- Macro: SDB_ALLOW_UNKNOWN_REFERENCES
     Define this macro to allow references to unknown structure, union,
     or enumeration tags to be emitted.  Standard COFF does not allow
     handling of unknown references, MIPS ECOFF has support for it.

 -- Macro: SDB_ALLOW_FORWARD_REFERENCES
     Define this macro to allow references to structure, union, or
     enumeration tags that have not yet been seen to be handled.  Some
     assemblers choke if forward tags are used, while some require it.

 -- Macro: SDB_OUTPUT_SOURCE_LINE (STREAM, LINE)
     A C statement to output SDB debugging information before code for
     line number LINE of the current source file to the stdio stream
     STREAM.  The default is to emit an `.ln' directive.


File: gccint.info,  Node: VMS Debug,  Prev: SDB and DWARF,  Up: Debugging Info

17.22.6 Macros for VMS Debug Format
-----------------------------------

Here are macros for VMS debug format.

 -- Macro: VMS_DEBUGGING_INFO
     Define this macro if GCC should produce debugging output for VMS
     in response to the `-g' option.  The default behavior for VMS is
     to generate minimal debug info for a traceback in the absence of
     `-g' unless explicitly overridden with `-g0'.  This behavior is
     controlled by `TARGET_OPTION_OPTIMIZATION' and
     `TARGET_OPTION_OVERRIDE'.


File: gccint.info,  Node: Floating Point,  Next: Mode Switching,  Prev: Debugging Info,  Up: Target Macros

17.23 Cross Compilation and Floating Point
==========================================

While all modern machines use twos-complement representation for
integers, there are a variety of representations for floating point
numbers.  This means that in a cross-compiler the representation of
floating point numbers in the compiled program may be different from
that used in the machine doing the compilation.

 Because different representation systems may offer different amounts of
range and precision, all floating point constants must be represented in
the target machine's format.  Therefore, the cross compiler cannot
safely use the host machine's floating point arithmetic; it must emulate
the target's arithmetic.  To ensure consistency, GCC always uses
emulation to work with floating point values, even when the host and
target floating point formats are identical.

 The following macros are provided by `real.h' for the compiler to use.
All parts of the compiler which generate or optimize floating-point
calculations must use these macros.  They may evaluate their operands
more than once, so operands must not have side effects.

 -- Macro: REAL_VALUE_TYPE
     The C data type to be used to hold a floating point value in the
     target machine's format.  Typically this is a `struct' containing
     an array of `HOST_WIDE_INT', but all code should treat it as an
     opaque quantity.

 -- Macro: int REAL_VALUES_EQUAL (REAL_VALUE_TYPE X, REAL_VALUE_TYPE Y)
     Compares for equality the two values, X and Y.  If the target
     floating point format supports negative zeroes and/or NaNs,
     `REAL_VALUES_EQUAL (-0.0, 0.0)' is true, and `REAL_VALUES_EQUAL
     (NaN, NaN)' is false.

 -- Macro: int REAL_VALUES_LESS (REAL_VALUE_TYPE X, REAL_VALUE_TYPE Y)
     Tests whether X is less than Y.

 -- Macro: HOST_WIDE_INT REAL_VALUE_FIX (REAL_VALUE_TYPE X)
     Truncates X to a signed integer, rounding toward zero.

 -- Macro: unsigned HOST_WIDE_INT REAL_VALUE_UNSIGNED_FIX
          (REAL_VALUE_TYPE X)
     Truncates X to an unsigned integer, rounding toward zero.  If X is
     negative, returns zero.

 -- Macro: REAL_VALUE_TYPE REAL_VALUE_ATOF (const char *STRING, enum
          machine_mode MODE)
     Converts STRING into a floating point number in the target
     machine's representation for mode MODE.  This routine can handle
     both decimal and hexadecimal floating point constants, using the
     syntax defined by the C language for both.

 -- Macro: int REAL_VALUE_NEGATIVE (REAL_VALUE_TYPE X)
     Returns 1 if X is negative (including negative zero), 0 otherwise.

 -- Macro: int REAL_VALUE_ISINF (REAL_VALUE_TYPE X)
     Determines whether X represents infinity (positive or negative).

 -- Macro: int REAL_VALUE_ISNAN (REAL_VALUE_TYPE X)
     Determines whether X represents a "NaN" (not-a-number).

 -- Macro: void REAL_ARITHMETIC (REAL_VALUE_TYPE OUTPUT, enum tree_code
          CODE, REAL_VALUE_TYPE X, REAL_VALUE_TYPE Y)
     Calculates an arithmetic operation on the two floating point values
     X and Y, storing the result in OUTPUT (which must be a variable).

     The operation to be performed is specified by CODE.  Only the
     following codes are supported: `PLUS_EXPR', `MINUS_EXPR',
     `MULT_EXPR', `RDIV_EXPR', `MAX_EXPR', `MIN_EXPR'.

     If `REAL_ARITHMETIC' is asked to evaluate division by zero and the
     target's floating point format cannot represent infinity, it will
     call `abort'.  Callers should check for this situation first, using
     `MODE_HAS_INFINITIES'.  *Note Storage Layout::.

 -- Macro: REAL_VALUE_TYPE REAL_VALUE_NEGATE (REAL_VALUE_TYPE X)
     Returns the negative of the floating point value X.

 -- Macro: REAL_VALUE_TYPE REAL_VALUE_ABS (REAL_VALUE_TYPE X)
     Returns the absolute value of X.

 -- Macro: void REAL_VALUE_TO_INT (HOST_WIDE_INT LOW, HOST_WIDE_INT
          HIGH, REAL_VALUE_TYPE X)
     Converts a floating point value X into a double-precision integer
     which is then stored into LOW and HIGH.  If the value is not
     integral, it is truncated.

 -- Macro: void REAL_VALUE_FROM_INT (REAL_VALUE_TYPE X, HOST_WIDE_INT
          LOW, HOST_WIDE_INT HIGH, enum machine_mode MODE)
     Converts a double-precision integer found in LOW and HIGH, into a
     floating point value which is then stored into X.  The value is
     truncated to fit in mode MODE.


File: gccint.info,  Node: Mode Switching,  Next: Target Attributes,  Prev: Floating Point,  Up: Target Macros

17.24 Mode Switching Instructions
=================================

The following macros control mode switching optimizations:

 -- Macro: OPTIMIZE_MODE_SWITCHING (ENTITY)
     Define this macro if the port needs extra instructions inserted
     for mode switching in an optimizing compilation.

     For an example, the SH4 can perform both single and double
     precision floating point operations, but to perform a single
     precision operation, the FPSCR PR bit has to be cleared, while for
     a double precision operation, this bit has to be set.  Changing
     the PR bit requires a general purpose register as a scratch
     register, hence these FPSCR sets have to be inserted before
     reload, i.e. you can't put this into instruction emitting or
     `TARGET_MACHINE_DEPENDENT_REORG'.

     You can have multiple entities that are mode-switched, and select
     at run time which entities actually need it.
     `OPTIMIZE_MODE_SWITCHING' should return nonzero for any ENTITY
     that needs mode-switching.  If you define this macro, you also
     have to define `NUM_MODES_FOR_MODE_SWITCHING', `MODE_NEEDED',
     `MODE_PRIORITY_TO_MODE' and `EMIT_MODE_SET'.  `MODE_AFTER',
     `MODE_ENTRY', and `MODE_EXIT' are optional.

 -- Macro: NUM_MODES_FOR_MODE_SWITCHING
     If you define `OPTIMIZE_MODE_SWITCHING', you have to define this as
     initializer for an array of integers.  Each initializer element N
     refers to an entity that needs mode switching, and specifies the
     number of different modes that might need to be set for this
     entity.  The position of the initializer in the
     initializer--starting counting at zero--determines the integer
     that is used to refer to the mode-switched entity in question.  In
     macros that take mode arguments / yield a mode result, modes are
     represented as numbers 0 ... N - 1.  N is used to specify that no
     mode switch is needed / supplied.

 -- Macro: MODE_NEEDED (ENTITY, INSN)
     ENTITY is an integer specifying a mode-switched entity.  If
     `OPTIMIZE_MODE_SWITCHING' is defined, you must define this macro to
     return an integer value not larger than the corresponding element
     in `NUM_MODES_FOR_MODE_SWITCHING', to denote the mode that ENTITY
     must be switched into prior to the execution of INSN.

 -- Macro: MODE_AFTER (ENTITY, MODE, INSN)
     ENTITY is an integer specifying a mode-switched entity.  If this
     macro is defined, it is evaluated for every INSN during mode
     switching.  It determines the mode that an insn results in (if
     different from the incoming mode).

 -- Macro: MODE_ENTRY (ENTITY)
     If this macro is defined, it is evaluated for every ENTITY that
     needs mode switching.  It should evaluate to an integer, which is
     a mode that ENTITY is assumed to be switched to at function entry.
     If `MODE_ENTRY' is defined then `MODE_EXIT' must be defined.

 -- Macro: MODE_EXIT (ENTITY)
     If this macro is defined, it is evaluated for every ENTITY that
     needs mode switching.  It should evaluate to an integer, which is
     a mode that ENTITY is assumed to be switched to at function exit.
     If `MODE_EXIT' is defined then `MODE_ENTRY' must be defined.

 -- Macro: MODE_PRIORITY_TO_MODE (ENTITY, N)
     This macro specifies the order in which modes for ENTITY are
     processed.  0 is the highest priority,
     `NUM_MODES_FOR_MODE_SWITCHING[ENTITY] - 1' the lowest.  The value
     of the macro should be an integer designating a mode for ENTITY.
     For any fixed ENTITY, `mode_priority_to_mode' (ENTITY, N) shall be
     a bijection in 0 ...  `num_modes_for_mode_switching[ENTITY] - 1'.

 -- Macro: EMIT_MODE_SET (ENTITY, MODE, HARD_REGS_LIVE)
     Generate one or more insns to set ENTITY to MODE.  HARD_REG_LIVE
     is the set of hard registers live at the point where the insn(s)
     are to be inserted.


File: gccint.info,  Node: Target Attributes,  Next: Emulated TLS,  Prev: Mode Switching,  Up: Target Macros

17.25 Defining target-specific uses of `__attribute__'
======================================================

Target-specific attributes may be defined for functions, data and types.
These are described using the following target hooks; they also need to
be documented in `extend.texi'.

 -- Target Hook: const struct attribute_spec * TARGET_ATTRIBUTE_TABLE
     If defined, this target hook points to an array of `struct
     attribute_spec' (defined in `tree.h') specifying the machine
     specific attributes for this target and some of the restrictions
     on the entities to which these attributes are applied and the
     arguments they take.

 -- Target Hook: bool TARGET_ATTRIBUTE_TAKES_IDENTIFIER_P (const_tree
          NAME)
     If defined, this target hook is a function which returns true if
     the machine-specific attribute named NAME expects an identifier
     given as its first argument to be passed on as a plain identifier,
     not subjected to name lookup.  If this is not defined, the default
     is false for all machine-specific attributes.

 -- Target Hook: int TARGET_COMP_TYPE_ATTRIBUTES (const_tree TYPE1,
          const_tree TYPE2)
     If defined, this target hook is a function which returns zero if
     the attributes on TYPE1 and TYPE2 are incompatible, one if they
     are compatible, and two if they are nearly compatible (which
     causes a warning to be generated).  If this is not defined,
     machine-specific attributes are supposed always to be compatible.

 -- Target Hook: void TARGET_SET_DEFAULT_TYPE_ATTRIBUTES (tree TYPE)
     If defined, this target hook is a function which assigns default
     attributes to the newly defined TYPE.

 -- Target Hook: tree TARGET_MERGE_TYPE_ATTRIBUTES (tree TYPE1, tree
          TYPE2)
     Define this target hook if the merging of type attributes needs
     special handling.  If defined, the result is a list of the combined
     `TYPE_ATTRIBUTES' of TYPE1 and TYPE2.  It is assumed that
     `comptypes' has already been called and returned 1.  This function
     may call `merge_attributes' to handle machine-independent merging.

 -- Target Hook: tree TARGET_MERGE_DECL_ATTRIBUTES (tree OLDDECL, tree
          NEWDECL)
     Define this target hook if the merging of decl attributes needs
     special handling.  If defined, the result is a list of the combined
     `DECL_ATTRIBUTES' of OLDDECL and NEWDECL.  NEWDECL is a duplicate
     declaration of OLDDECL.  Examples of when this is needed are when
     one attribute overrides another, or when an attribute is nullified
     by a subsequent definition.  This function may call
     `merge_attributes' to handle machine-independent merging.

     If the only target-specific handling you require is `dllimport'
     for Microsoft Windows targets, you should define the macro
     `TARGET_DLLIMPORT_DECL_ATTRIBUTES' to `1'.  The compiler will then
     define a function called `merge_dllimport_decl_attributes' which
     can then be defined as the expansion of
     `TARGET_MERGE_DECL_ATTRIBUTES'.  You can also add
     `handle_dll_attribute' in the attribute table for your port to
     perform initial processing of the `dllimport' and `dllexport'
     attributes.  This is done in `i386/cygwin.h' and `i386/i386.c',
     for example.

 -- Target Hook: bool TARGET_VALID_DLLIMPORT_ATTRIBUTE_P (const_tree
          DECL)
     DECL is a variable or function with `__attribute__((dllimport))'
     specified.  Use this hook if the target needs to add extra
     validation checks to `handle_dll_attribute'.

 -- Macro: TARGET_DECLSPEC
     Define this macro to a nonzero value if you want to treat
     `__declspec(X)' as equivalent to `__attribute((X))'.  By default,
     this behavior is enabled only for targets that define
     `TARGET_DLLIMPORT_DECL_ATTRIBUTES'.  The current implementation of
     `__declspec' is via a built-in macro, but you should not rely on
     this implementation detail.

 -- Target Hook: void TARGET_INSERT_ATTRIBUTES (tree NODE, tree
          *ATTR_PTR)
     Define this target hook if you want to be able to add attributes
     to a decl when it is being created.  This is normally useful for
     back ends which wish to implement a pragma by using the attributes
     which correspond to the pragma's effect.  The NODE argument is the
     decl which is being created.  The ATTR_PTR argument is a pointer
     to the attribute list for this decl.  The list itself should not
     be modified, since it may be shared with other decls, but
     attributes may be chained on the head of the list and `*ATTR_PTR'
     modified to point to the new attributes, or a copy of the list may
     be made if further changes are needed.

 -- Target Hook: bool TARGET_FUNCTION_ATTRIBUTE_INLINABLE_P (const_tree
          FNDECL)
     This target hook returns `true' if it is ok to inline FNDECL into
     the current function, despite its having target-specific
     attributes, `false' otherwise.  By default, if a function has a
     target specific attribute attached to it, it will not be inlined.

 -- Target Hook: bool TARGET_OPTION_VALID_ATTRIBUTE_P (tree FNDECL,
          tree NAME, tree ARGS, int FLAGS)
     This hook is called to parse `attribute(target("..."))', which
     allows setting target-specific options on individual functions.
     These function-specific options may differ from the options
     specified on the command line.  The hook should return `true' if
     the options are valid.

     The hook should set the `DECL_FUNCTION_SPECIFIC_TARGET' field in
     the function declaration to hold a pointer to a target-specific
     `struct cl_target_option' structure.

 -- Target Hook: void TARGET_OPTION_SAVE (struct cl_target_option *PTR)
     This hook is called to save any additional target-specific
     information in the `struct cl_target_option' structure for
     function-specific options.  *Note Option file format::.

 -- Target Hook: void TARGET_OPTION_RESTORE (struct cl_target_option
          *PTR)
     This hook is called to restore any additional target-specific
     information in the `struct cl_target_option' structure for
     function-specific options.

 -- Target Hook: void TARGET_OPTION_PRINT (FILE *FILE, int INDENT,
          struct cl_target_option *PTR)
     This hook is called to print any additional target-specific
     information in the `struct cl_target_option' structure for
     function-specific options.

 -- Target Hook: bool TARGET_OPTION_PRAGMA_PARSE (tree ARGS, tree
          POP_TARGET)
     This target hook parses the options for `#pragma GCC target', which
     sets the target-specific options for functions that occur later in
     the input stream.  The options accepted should be the same as
     those handled by the `TARGET_OPTION_VALID_ATTRIBUTE_P' hook.

 -- Target Hook: void TARGET_OPTION_OVERRIDE (void)
     Sometimes certain combinations of command options do not make
     sense on a particular target machine.  You can override the hook
     `TARGET_OPTION_OVERRIDE' to take account of this.  This hooks is
     called once just after all the command options have been parsed.

     Don't use this hook to turn on various extra optimizations for
     `-O'.  That is what `TARGET_OPTION_OPTIMIZATION' is for.

     If you need to do something whenever the optimization level is
     changed via the optimize attribute or pragma, see
     `TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE'

 -- Target Hook: bool TARGET_OPTION_FUNCTION_VERSIONS (tree DECL1, tree
          DECL2)
     This target hook returns `true' if DECL1 and DECL2 are versions of
     the same function.  DECL1 and DECL2 are function versions if and
     only if they have the same function signature and different target
     specific attributes, that is, they are compiled for different
     target machines.

 -- Target Hook: bool TARGET_CAN_INLINE_P (tree CALLER, tree CALLEE)
     This target hook returns `false' if the CALLER function cannot
     inline CALLEE, based on target specific information.  By default,
     inlining is not allowed if the callee function has function
     specific target options and the caller does not use the same
     options.


File: gccint.info,  Node: Emulated TLS,  Next: MIPS Coprocessors,  Prev: Target Attributes,  Up: Target Macros

17.26 Emulating TLS
===================

For targets whose psABI does not provide Thread Local Storage via
specific relocations and instruction sequences, an emulation layer is
used.  A set of target hooks allows this emulation layer to be
configured for the requirements of a particular target.  For instance
the psABI may in fact specify TLS support in terms of an emulation
layer.

 The emulation layer works by creating a control object for every TLS
object.  To access the TLS object, a lookup function is provided which,
when given the address of the control object, will return the address
of the current thread's instance of the TLS object.

 -- Target Hook: const char * TARGET_EMUTLS_GET_ADDRESS
     Contains the name of the helper function that uses a TLS control
     object to locate a TLS instance.  The default causes libgcc's
     emulated TLS helper function to be used.

 -- Target Hook: const char * TARGET_EMUTLS_REGISTER_COMMON
     Contains the name of the helper function that should be used at
     program startup to register TLS objects that are implicitly
     initialized to zero.  If this is `NULL', all TLS objects will have
     explicit initializers.  The default causes libgcc's emulated TLS
     registration function to be used.

 -- Target Hook: const char * TARGET_EMUTLS_VAR_SECTION
     Contains the name of the section in which TLS control variables
     should be placed.  The default of `NULL' allows these to be placed
     in any section.

 -- Target Hook: const char * TARGET_EMUTLS_TMPL_SECTION
     Contains the name of the section in which TLS initializers should
     be placed.  The default of `NULL' allows these to be placed in any
     section.

 -- Target Hook: const char * TARGET_EMUTLS_VAR_PREFIX
     Contains the prefix to be prepended to TLS control variable names.
     The default of `NULL' uses a target-specific prefix.

 -- Target Hook: const char * TARGET_EMUTLS_TMPL_PREFIX
     Contains the prefix to be prepended to TLS initializer objects.
     The default of `NULL' uses a target-specific prefix.

 -- Target Hook: tree TARGET_EMUTLS_VAR_FIELDS (tree TYPE, tree *NAME)
     Specifies a function that generates the FIELD_DECLs for a TLS
     control object type.  TYPE is the RECORD_TYPE the fields are for
     and NAME should be filled with the structure tag, if the default of
     `__emutls_object' is unsuitable.  The default creates a type
     suitable for libgcc's emulated TLS function.

 -- Target Hook: tree TARGET_EMUTLS_VAR_INIT (tree VAR, tree DECL, tree
          TMPL_ADDR)
     Specifies a function that generates the CONSTRUCTOR to initialize a
     TLS control object.  VAR is the TLS control object, DECL is the
     TLS object and TMPL_ADDR is the address of the initializer.  The
     default initializes libgcc's emulated TLS control object.

 -- Target Hook: bool TARGET_EMUTLS_VAR_ALIGN_FIXED
     Specifies whether the alignment of TLS control variable objects is
     fixed and should not be increased as some backends may do to
     optimize single objects.  The default is false.

 -- Target Hook: bool TARGET_EMUTLS_DEBUG_FORM_TLS_ADDRESS
     Specifies whether a DWARF `DW_OP_form_tls_address' location
     descriptor may be used to describe emulated TLS control objects.


File: gccint.info,  Node: MIPS Coprocessors,  Next: PCH Target,  Prev: Emulated TLS,  Up: Target Macros

17.27 Defining coprocessor specifics for MIPS targets.
======================================================

The MIPS specification allows MIPS implementations to have as many as 4
coprocessors, each with as many as 32 private registers.  GCC supports
accessing these registers and transferring values between the registers
and memory using asm-ized variables.  For example:

       register unsigned int cp0count asm ("c0r1");
       unsigned int d;

       d = cp0count + 3;

 ("c0r1" is the default name of register 1 in coprocessor 0; alternate
names may be added as described below, or the default names may be
overridden entirely in `SUBTARGET_CONDITIONAL_REGISTER_USAGE'.)

 Coprocessor registers are assumed to be epilogue-used; sets to them
will be preserved even if it does not appear that the register is used
again later in the function.

 Another note: according to the MIPS spec, coprocessor 1 (if present) is
the FPU.  One accesses COP1 registers through standard mips
floating-point support; they are not included in this mechanism.

 There is one macro used in defining the MIPS coprocessor interface
which you may want to override in subtargets; it is described below.


File: gccint.info,  Node: PCH Target,  Next: C++ ABI,  Prev: MIPS Coprocessors,  Up: Target Macros

17.28 Parameters for Precompiled Header Validity Checking
=========================================================

 -- Target Hook: void * TARGET_GET_PCH_VALIDITY (size_t *SZ)
     This hook returns a pointer to the data needed by
     `TARGET_PCH_VALID_P' and sets `*SZ' to the size of the data in
     bytes.

 -- Target Hook: const char * TARGET_PCH_VALID_P (const void *DATA,
          size_t SZ)
     This hook checks whether the options used to create a PCH file are
     compatible with the current settings.  It returns `NULL' if so and
     a suitable error message if not.  Error messages will be presented
     to the user and must be localized using `_(MSG)'.

     DATA is the data that was returned by `TARGET_GET_PCH_VALIDITY'
     when the PCH file was created and SZ is the size of that data in
     bytes.  It's safe to assume that the data was created by the same
     version of the compiler, so no format checking is needed.

     The default definition of `default_pch_valid_p' should be suitable
     for most targets.

 -- Target Hook: const char * TARGET_CHECK_PCH_TARGET_FLAGS (int
          PCH_FLAGS)
     If this hook is nonnull, the default implementation of
     `TARGET_PCH_VALID_P' will use it to check for compatible values of
     `target_flags'.  PCH_FLAGS specifies the value that `target_flags'
     had when the PCH file was created.  The return value is the same
     as for `TARGET_PCH_VALID_P'.

 -- Target Hook: void TARGET_PREPARE_PCH_SAVE (void)
     Called before writing out a PCH file.  If the target has some
     garbage-collected data that needs to be in a particular state on
     PCH loads, it can use this hook to enforce that state.  Very few
     targets need to do anything here.


File: gccint.info,  Node: C++ ABI,  Next: Named Address Spaces,  Prev: PCH Target,  Up: Target Macros

17.29 C++ ABI parameters
========================

 -- Target Hook: tree TARGET_CXX_GUARD_TYPE (void)
     Define this hook to override the integer type used for guard
     variables.  These are used to implement one-time construction of
     static objects.  The default is long_long_integer_type_node.

 -- Target Hook: bool TARGET_CXX_GUARD_MASK_BIT (void)
     This hook determines how guard variables are used.  It should
     return `false' (the default) if the first byte should be used.  A
     return value of `true' indicates that only the least significant
     bit should be used.

 -- Target Hook: tree TARGET_CXX_GET_COOKIE_SIZE (tree TYPE)
     This hook returns the size of the cookie to use when allocating an
     array whose elements have the indicated TYPE.  Assumes that it is
     already known that a cookie is needed.  The default is `max(sizeof
     (size_t), alignof(type))', as defined in section 2.7 of the
     IA64/Generic C++ ABI.

 -- Target Hook: bool TARGET_CXX_COOKIE_HAS_SIZE (void)
     This hook should return `true' if the element size should be
     stored in array cookies.  The default is to return `false'.

 -- Target Hook: int TARGET_CXX_IMPORT_EXPORT_CLASS (tree TYPE, int
          IMPORT_EXPORT)
     If defined by a backend this hook allows the decision made to
     export class TYPE to be overruled.  Upon entry IMPORT_EXPORT will
     contain 1 if the class is going to be exported, -1 if it is going
     to be imported and 0 otherwise.  This function should return the
     modified value and perform any other actions necessary to support
     the backend's targeted operating system.

 -- Target Hook: bool TARGET_CXX_CDTOR_RETURNS_THIS (void)
     This hook should return `true' if constructors and destructors
     return the address of the object created/destroyed.  The default
     is to return `false'.

 -- Target Hook: bool TARGET_CXX_KEY_METHOD_MAY_BE_INLINE (void)
     This hook returns true if the key method for a class (i.e., the
     method which, if defined in the current translation unit, causes
     the virtual table to be emitted) may be an inline function.  Under
     the standard Itanium C++ ABI the key method may be an inline
     function so long as the function is not declared inline in the
     class definition.  Under some variants of the ABI, an inline
     function can never be the key method.  The default is to return
     `true'.

 -- Target Hook: void TARGET_CXX_DETERMINE_CLASS_DATA_VISIBILITY (tree
          DECL)
     DECL is a virtual table, virtual table table, typeinfo object, or
     other similar implicit class data object that will be emitted with
     external linkage in this translation unit.  No ELF visibility has
     been explicitly specified.  If the target needs to specify a
     visibility other than that of the containing class, use this hook
     to set `DECL_VISIBILITY' and `DECL_VISIBILITY_SPECIFIED'.

 -- Target Hook: bool TARGET_CXX_CLASS_DATA_ALWAYS_COMDAT (void)
     This hook returns true (the default) if virtual tables and other
     similar implicit class data objects are always COMDAT if they have
     external linkage.  If this hook returns false, then class data for
     classes whose virtual table will be emitted in only one translation
     unit will not be COMDAT.

 -- Target Hook: bool TARGET_CXX_LIBRARY_RTTI_COMDAT (void)
     This hook returns true (the default) if the RTTI information for
     the basic types which is defined in the C++ runtime should always
     be COMDAT, false if it should not be COMDAT.

 -- Target Hook: bool TARGET_CXX_USE_AEABI_ATEXIT (void)
     This hook returns true if `__aeabi_atexit' (as defined by the ARM
     EABI) should be used to register static destructors when
     `-fuse-cxa-atexit' is in effect.  The default is to return false
     to use `__cxa_atexit'.

 -- Target Hook: bool TARGET_CXX_USE_ATEXIT_FOR_CXA_ATEXIT (void)
     This hook returns true if the target `atexit' function can be used
     in the same manner as `__cxa_atexit' to register C++ static
     destructors. This requires that `atexit'-registered functions in
     shared libraries are run in the correct order when the libraries
     are unloaded. The default is to return false.

 -- Target Hook: void TARGET_CXX_ADJUST_CLASS_AT_DEFINITION (tree TYPE)
     TYPE is a C++ class (i.e., RECORD_TYPE or UNION_TYPE) that has
     just been defined.  Use this hook to make adjustments to the class
     (eg, tweak visibility or perform any other required target
     modifications).

 -- Target Hook: tree TARGET_CXX_DECL_MANGLING_CONTEXT (const_tree DECL)
     Return target-specific mangling context of DECL or `NULL_TREE'.


File: gccint.info,  Node: Named Address Spaces,  Next: Misc,  Prev: C++ ABI,  Up: Target Macros

17.30 Adding support for named address spaces
=============================================

The draft technical report of the ISO/IEC JTC1 S22 WG14 N1275 standards
committee, `Programming Languages - C - Extensions to support embedded
processors', specifies a syntax for embedded processors to specify
alternate address spaces.  You can configure a GCC port to support
section 5.1 of the draft report to add support for address spaces other
than the default address space.  These address spaces are new keywords
that are similar to the `volatile' and `const' type attributes.

 Pointers to named address spaces can have a different size than
pointers to the generic address space.

 For example, the SPU port uses the `__ea' address space to refer to
memory in the host processor, rather than memory local to the SPU
processor.  Access to memory in the `__ea' address space involves
issuing DMA operations to move data between the host processor and the
local processor memory address space.  Pointers in the `__ea' address
space are either 32 bits or 64 bits based on the `-mea32' or `-mea64'
switches (native SPU pointers are always 32 bits).

 Internally, address spaces are represented as a small integer in the
range 0 to 15 with address space 0 being reserved for the generic
address space.

 To register a named address space qualifier keyword with the C front
end, the target may call the `c_register_addr_space' routine.  For
example, the SPU port uses the following to declare `__ea' as the
keyword for named address space #1:
     #define ADDR_SPACE_EA 1
     c_register_addr_space ("__ea", ADDR_SPACE_EA);

 -- Target Hook: enum machine_mode TARGET_ADDR_SPACE_POINTER_MODE
          (addr_space_t ADDRESS_SPACE)
     Define this to return the machine mode to use for pointers to
     ADDRESS_SPACE if the target supports named address spaces.  The
     default version of this hook returns `ptr_mode' for the generic
     address space only.

 -- Target Hook: enum machine_mode TARGET_ADDR_SPACE_ADDRESS_MODE
          (addr_space_t ADDRESS_SPACE)
     Define this to return the machine mode to use for addresses in
     ADDRESS_SPACE if the target supports named address spaces.  The
     default version of this hook returns `Pmode' for the generic
     address space only.

 -- Target Hook: bool TARGET_ADDR_SPACE_VALID_POINTER_MODE (enum
          machine_mode MODE, addr_space_t AS)
     Define this to return nonzero if the port can handle pointers with
     machine mode MODE to address space AS.  This target hook is the
     same as the `TARGET_VALID_POINTER_MODE' target hook, except that
     it includes explicit named address space support.  The default
     version of this hook returns true for the modes returned by either
     the `TARGET_ADDR_SPACE_POINTER_MODE' or
     `TARGET_ADDR_SPACE_ADDRESS_MODE' target hooks for the given
     address space.

 -- Target Hook: bool TARGET_ADDR_SPACE_LEGITIMATE_ADDRESS_P (enum
          machine_mode MODE, rtx EXP, bool STRICT, addr_space_t AS)
     Define this to return true if EXP is a valid address for mode MODE
     in the named address space AS.  The STRICT parameter says whether
     strict addressing is in effect after reload has finished.  This
     target hook is the same as the `TARGET_LEGITIMATE_ADDRESS_P'
     target hook, except that it includes explicit named address space
     support.

 -- Target Hook: rtx TARGET_ADDR_SPACE_LEGITIMIZE_ADDRESS (rtx X, rtx
          OLDX, enum machine_mode MODE, addr_space_t AS)
     Define this to modify an invalid address X to be a valid address
     with mode MODE in the named address space AS.  This target hook is
     the same as the `TARGET_LEGITIMIZE_ADDRESS' target hook, except
     that it includes explicit named address space support.

 -- Target Hook: bool TARGET_ADDR_SPACE_SUBSET_P (addr_space_t SUBSET,
          addr_space_t SUPERSET)
     Define this to return whether the SUBSET named address space is
     contained within the SUPERSET named address space.  Pointers to a
     named address space that is a subset of another named address space
     will be converted automatically without a cast if used together in
     arithmetic operations.  Pointers to a superset address space can be
     converted to pointers to a subset address space via explicit casts.

 -- Target Hook: rtx TARGET_ADDR_SPACE_CONVERT (rtx OP, tree FROM_TYPE,
          tree TO_TYPE)
     Define this to convert the pointer expression represented by the
     RTL OP with type FROM_TYPE that points to a named address space to
     a new pointer expression with type TO_TYPE that points to a
     different named address space.  When this hook it called, it is
     guaranteed that one of the two address spaces is a subset of the
     other, as determined by the `TARGET_ADDR_SPACE_SUBSET_P' target
     hook.


File: gccint.info,  Node: Misc,  Prev: Named Address Spaces,  Up: Target Macros

17.31 Miscellaneous Parameters
==============================

Here are several miscellaneous parameters.

 -- Macro: HAS_LONG_COND_BRANCH
     Define this boolean macro to indicate whether or not your
     architecture has conditional branches that can span all of memory.
     It is used in conjunction with an optimization that partitions hot
     and cold basic blocks into separate sections of the executable.
     If this macro is set to false, gcc will convert any conditional
     branches that attempt to cross between sections into unconditional
     branches or indirect jumps.

 -- Macro: HAS_LONG_UNCOND_BRANCH
     Define this boolean macro to indicate whether or not your
     architecture has unconditional branches that can span all of
     memory.  It is used in conjunction with an optimization that
     partitions hot and cold basic blocks into separate sections of the
     executable.  If this macro is set to false, gcc will convert any
     unconditional branches that attempt to cross between sections into
     indirect jumps.

 -- Macro: CASE_VECTOR_MODE
     An alias for a machine mode name.  This is the machine mode that
     elements of a jump-table should have.

 -- Macro: CASE_VECTOR_SHORTEN_MODE (MIN_OFFSET, MAX_OFFSET, BODY)
     Optional: return the preferred mode for an `addr_diff_vec' when
     the minimum and maximum offset are known.  If you define this, it
     enables extra code in branch shortening to deal with
     `addr_diff_vec'.  To make this work, you also have to define
     `INSN_ALIGN' and make the alignment for `addr_diff_vec' explicit.
     The BODY argument is provided so that the offset_unsigned and scale
     flags can be updated.

 -- Macro: CASE_VECTOR_PC_RELATIVE
     Define this macro to be a C expression to indicate when jump-tables
     should contain relative addresses.  You need not define this macro
     if jump-tables never contain relative addresses, or jump-tables
     should contain relative addresses only when `-fPIC' or `-fPIC' is
     in effect.

 -- Target Hook: unsigned int TARGET_CASE_VALUES_THRESHOLD (void)
     This function return the smallest number of different values for
     which it is best to use a jump-table instead of a tree of
     conditional branches.  The default is four for machines with a
     `casesi' instruction and five otherwise.  This is best for most
     machines.

 -- Macro: WORD_REGISTER_OPERATIONS
     Define this macro if operations between registers with integral
     mode smaller than a word are always performed on the entire
     register.  Most RISC machines have this property and most CISC
     machines do not.

 -- Macro: LOAD_EXTEND_OP (MEM_MODE)
     Define this macro to be a C expression indicating when insns that
     read memory in MEM_MODE, an integral mode narrower than a word,
     set the bits outside of MEM_MODE to be either the sign-extension
     or the zero-extension of the data read.  Return `SIGN_EXTEND' for
     values of MEM_MODE for which the insn sign-extends, `ZERO_EXTEND'
     for which it zero-extends, and `UNKNOWN' for other modes.

     This macro is not called with MEM_MODE non-integral or with a width
     greater than or equal to `BITS_PER_WORD', so you may return any
     value in this case.  Do not define this macro if it would always
     return `UNKNOWN'.  On machines where this macro is defined, you
     will normally define it as the constant `SIGN_EXTEND' or
     `ZERO_EXTEND'.

     You may return a non-`UNKNOWN' value even if for some hard
     registers the sign extension is not performed, if for the
     `REGNO_REG_CLASS' of these hard registers
     `CANNOT_CHANGE_MODE_CLASS' returns nonzero when the FROM mode is
     MEM_MODE and the TO mode is any integral mode larger than this but
     not larger than `word_mode'.

     You must return `UNKNOWN' if for some hard registers that allow
     this mode, `CANNOT_CHANGE_MODE_CLASS' says that they cannot change
     to `word_mode', but that they can change to another integral mode
     that is larger then MEM_MODE but still smaller than `word_mode'.

 -- Macro: SHORT_IMMEDIATES_SIGN_EXTEND
     Define this macro if loading short immediate values into registers
     sign extends.

 -- Target Hook: unsigned int TARGET_MIN_DIVISIONS_FOR_RECIP_MUL (enum
          machine_mode MODE)
     When `-ffast-math' is in effect, GCC tries to optimize divisions
     by the same divisor, by turning them into multiplications by the
     reciprocal.  This target hook specifies the minimum number of
     divisions that should be there for GCC to perform the optimization
     for a variable of mode MODE.  The default implementation returns 3
     if the machine has an instruction for the division, and 2 if it
     does not.

 -- Macro: MOVE_MAX
     The maximum number of bytes that a single instruction can move
     quickly between memory and registers or between two memory
     locations.

 -- Macro: MAX_MOVE_MAX
     The maximum number of bytes that a single instruction can move
     quickly between memory and registers or between two memory
     locations.  If this is undefined, the default is `MOVE_MAX'.
     Otherwise, it is the constant value that is the largest value that
     `MOVE_MAX' can have at run-time.

 -- Macro: SHIFT_COUNT_TRUNCATED
     A C expression that is nonzero if on this machine the number of
     bits actually used for the count of a shift operation is equal to
     the number of bits needed to represent the size of the object
     being shifted.  When this macro is nonzero, the compiler will
     assume that it is safe to omit a sign-extend, zero-extend, and
     certain bitwise `and' instructions that truncates the count of a
     shift operation.  On machines that have instructions that act on
     bit-fields at variable positions, which may include `bit test'
     instructions, a nonzero `SHIFT_COUNT_TRUNCATED' also enables
     deletion of truncations of the values that serve as arguments to
     bit-field instructions.

     If both types of instructions truncate the count (for shifts) and
     position (for bit-field operations), or if no variable-position
     bit-field instructions exist, you should define this macro.

     However, on some machines, such as the 80386 and the 680x0,
     truncation only applies to shift operations and not the (real or
     pretended) bit-field operations.  Define `SHIFT_COUNT_TRUNCATED'
     to be zero on such machines.  Instead, add patterns to the `md'
     file that include the implied truncation of the shift instructions.

     You need not define this macro if it would always have the value
     of zero.

 -- Target Hook: unsigned HOST_WIDE_INT TARGET_SHIFT_TRUNCATION_MASK
          (enum machine_mode MODE)
     This function describes how the standard shift patterns for MODE
     deal with shifts by negative amounts or by more than the width of
     the mode.  *Note shift patterns::.

     On many machines, the shift patterns will apply a mask M to the
     shift count, meaning that a fixed-width shift of X by Y is
     equivalent to an arbitrary-width shift of X by Y & M.  If this is
     true for mode MODE, the function should return M, otherwise it
     should return 0.  A return value of 0 indicates that no particular
     behavior is guaranteed.

     Note that, unlike `SHIFT_COUNT_TRUNCATED', this function does
     _not_ apply to general shift rtxes; it applies only to instructions
     that are generated by the named shift patterns.

     The default implementation of this function returns
     `GET_MODE_BITSIZE (MODE) - 1' if `SHIFT_COUNT_TRUNCATED' and 0
     otherwise.  This definition is always safe, but if
     `SHIFT_COUNT_TRUNCATED' is false, and some shift patterns
     nevertheless truncate the shift count, you may get better code by
     overriding it.

 -- Macro: TRULY_NOOP_TRUNCATION (OUTPREC, INPREC)
     A C expression which is nonzero if on this machine it is safe to
     "convert" an integer of INPREC bits to one of OUTPREC bits (where
     OUTPREC is smaller than INPREC) by merely operating on it as if it
     had only OUTPREC bits.

     On many machines, this expression can be 1.

     When `TRULY_NOOP_TRUNCATION' returns 1 for a pair of sizes for
     modes for which `MODES_TIEABLE_P' is 0, suboptimal code can result.
     If this is the case, making `TRULY_NOOP_TRUNCATION' return 0 in
     such cases may improve things.

 -- Target Hook: int TARGET_MODE_REP_EXTENDED (enum machine_mode MODE,
          enum machine_mode REP_MODE)
     The representation of an integral mode can be such that the values
     are always extended to a wider integral mode.  Return
     `SIGN_EXTEND' if values of MODE are represented in sign-extended
     form to REP_MODE.  Return `UNKNOWN' otherwise.  (Currently, none
     of the targets use zero-extended representation this way so unlike
     `LOAD_EXTEND_OP', `TARGET_MODE_REP_EXTENDED' is expected to return
     either `SIGN_EXTEND' or `UNKNOWN'.  Also no target extends MODE to
     REP_MODE so that REP_MODE is not the next widest integral mode and
     currently we take advantage of this fact.)

     Similarly to `LOAD_EXTEND_OP' you may return a non-`UNKNOWN' value
     even if the extension is not performed on certain hard registers
     as long as for the `REGNO_REG_CLASS' of these hard registers
     `CANNOT_CHANGE_MODE_CLASS' returns nonzero.

     Note that `TARGET_MODE_REP_EXTENDED' and `LOAD_EXTEND_OP' describe
     two related properties.  If you define `TARGET_MODE_REP_EXTENDED
     (mode, word_mode)' you probably also want to define
     `LOAD_EXTEND_OP (mode)' to return the same type of extension.

     In order to enforce the representation of `mode',
     `TRULY_NOOP_TRUNCATION' should return false when truncating to
     `mode'.

 -- Macro: STORE_FLAG_VALUE
     A C expression describing the value returned by a comparison
     operator with an integral mode and stored by a store-flag
     instruction (`cstoreMODE4') when the condition is true.  This
     description must apply to _all_ the `cstoreMODE4' patterns and all
     the comparison operators whose results have a `MODE_INT' mode.

     A value of 1 or -1 means that the instruction implementing the
     comparison operator returns exactly 1 or -1 when the comparison is
     true and 0 when the comparison is false.  Otherwise, the value
     indicates which bits of the result are guaranteed to be 1 when the
     comparison is true.  This value is interpreted in the mode of the
     comparison operation, which is given by the mode of the first
     operand in the `cstoreMODE4' pattern.  Either the low bit or the
     sign bit of `STORE_FLAG_VALUE' be on.  Presently, only those bits
     are used by the compiler.

     If `STORE_FLAG_VALUE' is neither 1 or -1, the compiler will
     generate code that depends only on the specified bits.  It can also
     replace comparison operators with equivalent operations if they
     cause the required bits to be set, even if the remaining bits are
     undefined.  For example, on a machine whose comparison operators
     return an `SImode' value and where `STORE_FLAG_VALUE' is defined as
     `0x80000000', saying that just the sign bit is relevant, the
     expression

          (ne:SI (and:SI X (const_int POWER-OF-2)) (const_int 0))

     can be converted to

          (ashift:SI X (const_int N))

     where N is the appropriate shift count to move the bit being
     tested into the sign bit.

     There is no way to describe a machine that always sets the
     low-order bit for a true value, but does not guarantee the value
     of any other bits, but we do not know of any machine that has such
     an instruction.  If you are trying to port GCC to such a machine,
     include an instruction to perform a logical-and of the result with
     1 in the pattern for the comparison operators and let us know at
     <gcc@gcc.gnu.org>.

     Often, a machine will have multiple instructions that obtain a
     value from a comparison (or the condition codes).  Here are rules
     to guide the choice of value for `STORE_FLAG_VALUE', and hence the
     instructions to be used:

        * Use the shortest sequence that yields a valid definition for
          `STORE_FLAG_VALUE'.  It is more efficient for the compiler to
          "normalize" the value (convert it to, e.g., 1 or 0) than for
          the comparison operators to do so because there may be
          opportunities to combine the normalization with other
          operations.

        * For equal-length sequences, use a value of 1 or -1, with -1
          being slightly preferred on machines with expensive jumps and
          1 preferred on other machines.

        * As a second choice, choose a value of `0x80000001' if
          instructions exist that set both the sign and low-order bits
          but do not define the others.

        * Otherwise, use a value of `0x80000000'.

     Many machines can produce both the value chosen for
     `STORE_FLAG_VALUE' and its negation in the same number of
     instructions.  On those machines, you should also define a pattern
     for those cases, e.g., one matching

          (set A (neg:M (ne:M B C)))

     Some machines can also perform `and' or `plus' operations on
     condition code values with less instructions than the corresponding
     `cstoreMODE4' insn followed by `and' or `plus'.  On those
     machines, define the appropriate patterns.  Use the names `incscc'
     and `decscc', respectively, for the patterns which perform `plus'
     or `minus' operations on condition code values.  See `rs6000.md'
     for some examples.  The GNU Superoptimizer can be used to find
     such instruction sequences on other machines.

     If this macro is not defined, the default value, 1, is used.  You
     need not define `STORE_FLAG_VALUE' if the machine has no store-flag
     instructions, or if the value generated by these instructions is 1.

 -- Macro: FLOAT_STORE_FLAG_VALUE (MODE)
     A C expression that gives a nonzero `REAL_VALUE_TYPE' value that is
     returned when comparison operators with floating-point results are
     true.  Define this macro on machines that have comparison
     operations that return floating-point values.  If there are no
     such operations, do not define this macro.

 -- Macro: VECTOR_STORE_FLAG_VALUE (MODE)
     A C expression that gives a rtx representing the nonzero true
     element for vector comparisons.  The returned rtx should be valid
     for the inner mode of MODE which is guaranteed to be a vector
     mode.  Define this macro on machines that have vector comparison
     operations that return a vector result.  If there are no such
     operations, do not define this macro.  Typically, this macro is
     defined as `const1_rtx' or `constm1_rtx'.  This macro may return
     `NULL_RTX' to prevent the compiler optimizing such vector
     comparison operations for the given mode.

 -- Macro: CLZ_DEFINED_VALUE_AT_ZERO (MODE, VALUE)
 -- Macro: CTZ_DEFINED_VALUE_AT_ZERO (MODE, VALUE)
     A C expression that indicates whether the architecture defines a
     value for `clz' or `ctz' with a zero operand.  A result of `0'
     indicates the value is undefined.  If the value is defined for
     only the RTL expression, the macro should evaluate to `1'; if the
     value applies also to the corresponding optab entry (which is
     normally the case if it expands directly into the corresponding
     RTL), then the macro should evaluate to `2'.  In the cases where
     the value is defined, VALUE should be set to this value.

     If this macro is not defined, the value of `clz' or `ctz' at zero
     is assumed to be undefined.

     This macro must be defined if the target's expansion for `ffs'
     relies on a particular value to get correct results.  Otherwise it
     is not necessary, though it may be used to optimize some corner
     cases, and to provide a default expansion for the `ffs' optab.

     Note that regardless of this macro the "definedness" of `clz' and
     `ctz' at zero do _not_ extend to the builtin functions visible to
     the user.  Thus one may be free to adjust the value at will to
     match the target expansion of these operations without fear of
     breaking the API.

 -- Macro: Pmode
     An alias for the machine mode for pointers.  On most machines,
     define this to be the integer mode corresponding to the width of a
     hardware pointer; `SImode' on 32-bit machine or `DImode' on 64-bit
     machines.  On some machines you must define this to be one of the
     partial integer modes, such as `PSImode'.

     The width of `Pmode' must be at least as large as the value of
     `POINTER_SIZE'.  If it is not equal, you must define the macro
     `POINTERS_EXTEND_UNSIGNED' to specify how pointers are extended to
     `Pmode'.

 -- Macro: FUNCTION_MODE
     An alias for the machine mode used for memory references to
     functions being called, in `call' RTL expressions.  On most CISC
     machines, where an instruction can begin at any byte address, this
     should be `QImode'.  On most RISC machines, where all instructions
     have fixed size and alignment, this should be a mode with the same
     size and alignment as the machine instruction words - typically
     `SImode' or `HImode'.

 -- Macro: STDC_0_IN_SYSTEM_HEADERS
     In normal operation, the preprocessor expands `__STDC__' to the
     constant 1, to signify that GCC conforms to ISO Standard C.  On
     some hosts, like Solaris, the system compiler uses a different
     convention, where `__STDC__' is normally 0, but is 1 if the user
     specifies strict conformance to the C Standard.

     Defining `STDC_0_IN_SYSTEM_HEADERS' makes GNU CPP follows the host
     convention when processing system header files, but when
     processing user files `__STDC__' will always expand to 1.

 -- C Target Hook: const char * TARGET_C_PREINCLUDE (void)
     Define this hook to return the name of a header file to be
     included at the start of all compilations, as if it had been
     included with `#include <FILE>'.  If this hook returns `NULL', or
     is not defined, or the header is not found, or if the user
     specifies `-ffreestanding' or `-nostdinc', no header is included.

     This hook can be used together with a header provided by the
     system C library to implement ISO C requirements for certain
     macros to be predefined that describe properties of the whole
     implementation rather than just the compiler.

 -- Macro: NO_IMPLICIT_EXTERN_C
     Define this macro if the system header files support C++ as well
     as C.  This macro inhibits the usual method of using system header
     files in C++, which is to pretend that the file's contents are
     enclosed in `extern "C" {...}'.

 -- Macro: REGISTER_TARGET_PRAGMAS ()
     Define this macro if you want to implement any target-specific
     pragmas.  If defined, it is a C expression which makes a series of
     calls to `c_register_pragma' or `c_register_pragma_with_expansion'
     for each pragma.  The macro may also do any setup required for the
     pragmas.

     The primary reason to define this macro is to provide
     compatibility with other compilers for the same target.  In
     general, we discourage definition of target-specific pragmas for
     GCC.

     If the pragma can be implemented by attributes then you should
     consider defining the target hook `TARGET_INSERT_ATTRIBUTES' as
     well.

     Preprocessor macros that appear on pragma lines are not expanded.
     All `#pragma' directives that do not match any registered pragma
     are silently ignored, unless the user specifies
     `-Wunknown-pragmas'.

 -- Function: void c_register_pragma (const char *SPACE, const char
          *NAME, void (*CALLBACK) (struct cpp_reader *))
 -- Function: void c_register_pragma_with_expansion (const char *SPACE,
          const char *NAME, void (*CALLBACK) (struct cpp_reader *))
     Each call to `c_register_pragma' or
     `c_register_pragma_with_expansion' establishes one pragma.  The
     CALLBACK routine will be called when the preprocessor encounters a
     pragma of the form

          #pragma [SPACE] NAME ...

     SPACE is the case-sensitive namespace of the pragma, or `NULL' to
     put the pragma in the global namespace.  The callback routine
     receives PFILE as its first argument, which can be passed on to
     cpplib's functions if necessary.  You can lex tokens after the
     NAME by calling `pragma_lex'.  Tokens that are not read by the
     callback will be silently ignored.  The end of the line is
     indicated by a token of type `CPP_EOF'.  Macro expansion occurs on
     the arguments of pragmas registered with
     `c_register_pragma_with_expansion' but not on the arguments of
     pragmas registered with `c_register_pragma'.

     Note that the use of `pragma_lex' is specific to the C and C++
     compilers.  It will not work in the Java or Fortran compilers, or
     any other language compilers for that matter.  Thus if
     `pragma_lex' is going to be called from target-specific code, it
     must only be done so when building the C and C++ compilers.  This
     can be done by defining the variables `c_target_objs' and
     `cxx_target_objs' in the target entry in the `config.gcc' file.
     These variables should name the target-specific, language-specific
     object file which contains the code that uses `pragma_lex'.  Note
     it will also be necessary to add a rule to the makefile fragment
     pointed to by `tmake_file' that shows how to build this object
     file.

 -- Macro: HANDLE_PRAGMA_PACK_WITH_EXPANSION
     Define this macro if macros should be expanded in the arguments of
     `#pragma pack'.

 -- Macro: TARGET_DEFAULT_PACK_STRUCT
     If your target requires a structure packing default other than 0
     (meaning the machine default), define this macro to the necessary
     value (in bytes).  This must be a value that would also be valid
     to use with `#pragma pack()' (that is, a small power of two).

 -- Macro: DOLLARS_IN_IDENTIFIERS
     Define this macro to control use of the character `$' in
     identifier names for the C family of languages.  0 means `$' is
     not allowed by default; 1 means it is allowed.  1 is the default;
     there is no need to define this macro in that case.

 -- Macro: INSN_SETS_ARE_DELAYED (INSN)
     Define this macro as a C expression that is nonzero if it is safe
     for the delay slot scheduler to place instructions in the delay
     slot of INSN, even if they appear to use a resource set or
     clobbered in INSN.  INSN is always a `jump_insn' or an `insn'; GCC
     knows that every `call_insn' has this behavior.  On machines where
     some `insn' or `jump_insn' is really a function call and hence has
     this behavior, you should define this macro.

     You need not define this macro if it would always return zero.

 -- Macro: INSN_REFERENCES_ARE_DELAYED (INSN)
     Define this macro as a C expression that is nonzero if it is safe
     for the delay slot scheduler to place instructions in the delay
     slot of INSN, even if they appear to set or clobber a resource
     referenced in INSN.  INSN is always a `jump_insn' or an `insn'.
     On machines where some `insn' or `jump_insn' is really a function
     call and its operands are registers whose use is actually in the
     subroutine it calls, you should define this macro.  Doing so
     allows the delay slot scheduler to move instructions which copy
     arguments into the argument registers into the delay slot of INSN.

     You need not define this macro if it would always return zero.

 -- Macro: MULTIPLE_SYMBOL_SPACES
     Define this macro as a C expression that is nonzero if, in some
     cases, global symbols from one translation unit may not be bound
     to undefined symbols in another translation unit without user
     intervention.  For instance, under Microsoft Windows symbols must
     be explicitly imported from shared libraries (DLLs).

     You need not define this macro if it would always evaluate to zero.

 -- Target Hook: tree TARGET_MD_ASM_CLOBBERS (tree OUTPUTS, tree
          INPUTS, tree CLOBBERS)
     This target hook should add to CLOBBERS `STRING_CST' trees for any
     hard regs the port wishes to automatically clobber for an asm.  It
     should return the result of the last `tree_cons' used to add a
     clobber.  The OUTPUTS, INPUTS and CLOBBER lists are the
     corresponding parameters to the asm and may be inspected to avoid
     clobbering a register that is an input or output of the asm.  You
     can use `tree_overlaps_hard_reg_set', declared in `tree.h', to test
     for overlap with regards to asm-declared registers.

 -- Macro: MATH_LIBRARY
     Define this macro as a C string constant for the linker argument
     to link in the system math library, minus the initial `"-l"', or
     `""' if the target does not have a separate math library.

     You need only define this macro if the default of `"m"' is wrong.

 -- Macro: LIBRARY_PATH_ENV
     Define this macro as a C string constant for the environment
     variable that specifies where the linker should look for libraries.

     You need only define this macro if the default of `"LIBRARY_PATH"'
     is wrong.

 -- Macro: TARGET_POSIX_IO
     Define this macro if the target supports the following POSIX file
     functions, access, mkdir and  file locking with fcntl / F_SETLKW.
     Defining `TARGET_POSIX_IO' will enable the test coverage code to
     use file locking when exiting a program, which avoids race
     conditions if the program has forked. It will also create
     directories at run-time for cross-profiling.

 -- Macro: MAX_CONDITIONAL_EXECUTE
     A C expression for the maximum number of instructions to execute
     via conditional execution instructions instead of a branch.  A
     value of `BRANCH_COST'+1 is the default if the machine does not
     use cc0, and 1 if it does use cc0.

 -- Macro: IFCVT_MODIFY_TESTS (CE_INFO, TRUE_EXPR, FALSE_EXPR)
     Used if the target needs to perform machine-dependent
     modifications on the conditionals used for turning basic blocks
     into conditionally executed code.  CE_INFO points to a data
     structure, `struct ce_if_block', which contains information about
     the currently processed blocks.  TRUE_EXPR and FALSE_EXPR are the
     tests that are used for converting the then-block and the
     else-block, respectively.  Set either TRUE_EXPR or FALSE_EXPR to a
     null pointer if the tests cannot be converted.

 -- Macro: IFCVT_MODIFY_MULTIPLE_TESTS (CE_INFO, BB, TRUE_EXPR,
          FALSE_EXPR)
     Like `IFCVT_MODIFY_TESTS', but used when converting more
     complicated if-statements into conditions combined by `and' and
     `or' operations.  BB contains the basic block that contains the
     test that is currently being processed and about to be turned into
     a condition.

 -- Macro: IFCVT_MODIFY_INSN (CE_INFO, PATTERN, INSN)
     A C expression to modify the PATTERN of an INSN that is to be
     converted to conditional execution format.  CE_INFO points to a
     data structure, `struct ce_if_block', which contains information
     about the currently processed blocks.

 -- Macro: IFCVT_MODIFY_FINAL (CE_INFO)
     A C expression to perform any final machine dependent
     modifications in converting code to conditional execution.  The
     involved basic blocks can be found in the `struct ce_if_block'
     structure that is pointed to by CE_INFO.

 -- Macro: IFCVT_MODIFY_CANCEL (CE_INFO)
     A C expression to cancel any machine dependent modifications in
     converting code to conditional execution.  The involved basic
     blocks can be found in the `struct ce_if_block' structure that is
     pointed to by CE_INFO.

 -- Macro: IFCVT_MACHDEP_INIT (CE_INFO)
     A C expression to initialize any machine specific data for
     if-conversion of the if-block in the `struct ce_if_block'
     structure that is pointed to by CE_INFO.

 -- Target Hook: void TARGET_MACHINE_DEPENDENT_REORG (void)
     If non-null, this hook performs a target-specific pass over the
     instruction stream.  The compiler will run it at all optimization
     levels, just before the point at which it normally does
     delayed-branch scheduling.

     The exact purpose of the hook varies from target to target.  Some
     use it to do transformations that are necessary for correctness,
     such as laying out in-function constant pools or avoiding hardware
     hazards.  Others use it as an opportunity to do some
     machine-dependent optimizations.

     You need not implement the hook if it has nothing to do.  The
     default definition is null.

 -- Target Hook: void TARGET_INIT_BUILTINS (void)
     Define this hook if you have any machine-specific built-in
     functions that need to be defined.  It should be a function that
     performs the necessary setup.

     Machine specific built-in functions can be useful to expand
     special machine instructions that would otherwise not normally be
     generated because they have no equivalent in the source language
     (for example, SIMD vector instructions or prefetch instructions).

     To create a built-in function, call the function
     `lang_hooks.builtin_function' which is defined by the language
     front end.  You can use any type nodes set up by
     `build_common_tree_nodes'; only language front ends that use those
     two functions will call `TARGET_INIT_BUILTINS'.

 -- Target Hook: tree TARGET_BUILTIN_DECL (unsigned CODE, bool
          INITIALIZE_P)
     Define this hook if you have any machine-specific built-in
     functions that need to be defined.  It should be a function that
     returns the builtin function declaration for the builtin function
     code CODE.  If there is no such builtin and it cannot be
     initialized at this time if INITIALIZE_P is true the function
     should return `NULL_TREE'.  If CODE is out of range the function
     should return `error_mark_node'.

 -- Target Hook: rtx TARGET_EXPAND_BUILTIN (tree EXP, rtx TARGET, rtx
          SUBTARGET, enum machine_mode MODE, int IGNORE)
     Expand a call to a machine specific built-in function that was set
     up by `TARGET_INIT_BUILTINS'.  EXP is the expression for the
     function call; the result should go to TARGET if that is
     convenient, and have mode MODE if that is convenient.  SUBTARGET
     may be used as the target for computing one of EXP's operands.
     IGNORE is nonzero if the value is to be ignored.  This function
     should return the result of the call to the built-in function.

 -- Target Hook: tree TARGET_RESOLVE_OVERLOADED_BUILTIN (unsigned int
          LOC, tree FNDECL, void *ARGLIST)
     Select a replacement for a machine specific built-in function that
     was set up by `TARGET_INIT_BUILTINS'.  This is done _before_
     regular type checking, and so allows the target to implement a
     crude form of function overloading.  FNDECL is the declaration of
     the built-in function.  ARGLIST is the list of arguments passed to
     the built-in function.  The result is a complete expression that
     implements the operation, usually another `CALL_EXPR'.  ARGLIST
     really has type `VEC(tree,gc)*'

 -- Target Hook: tree TARGET_FOLD_BUILTIN (tree FNDECL, int N_ARGS,
          tree *ARGP, bool IGNORE)
     Fold a call to a machine specific built-in function that was set
     up by `TARGET_INIT_BUILTINS'.  FNDECL is the declaration of the
     built-in function.  N_ARGS is the number of arguments passed to
     the function; the arguments themselves are pointed to by ARGP.
     The result is another tree containing a simplified expression for
     the call's result.  If IGNORE is true the value will be ignored.

 -- Target Hook: int TARGET_COMPARE_VERSION_PRIORITY (tree DECL1, tree
          DECL2)
     This hook is used to compare the target attributes in two
     functions to determine which function's features get higher
     priority.  This is used during function multi-versioning to figure
     out the order in which two versions must be dispatched.  A
     function version with a higher priority is checked for dispatching
     earlier.  DECL1 and DECL2 are  the two function decls that will be
     compared.

 -- Target Hook: tree TARGET_GET_FUNCTION_VERSIONS_DISPATCHER (void
          *DECL)
     This hook is used to get the dispatcher function for a set of
     function versions.  The dispatcher function is called to invoke
     the right function version at run-time. DECL is one version from a
     set of semantically identical versions.

 -- Target Hook: tree TARGET_GENERATE_VERSION_DISPATCHER_BODY (void
          *ARG)
     This hook is used to generate the dispatcher logic to invoke the
     right function version at run-time for a given set of function
     versions.  ARG points to the callgraph node of the dispatcher
     function whose body must be generated.

 -- Target Hook: const char * TARGET_INVALID_WITHIN_DOLOOP (const_rtx
          INSN)
     Take an instruction in INSN and return NULL if it is valid within a
     low-overhead loop, otherwise return a string explaining why doloop
     could not be applied.

     Many targets use special registers for low-overhead looping. For
     any instruction that clobbers these this function should return a
     string indicating the reason why the doloop could not be applied.
     By default, the RTL loop optimizer does not use a present doloop
     pattern for loops containing function calls or branch on table
     instructions.

 -- Target Hook: bool TARGET_LEGITIMATE_COMBINED_INSN (rtx INSN)
     Take an instruction in INSN and return `false' if the instruction
     is not appropriate as a combination of two or more instructions.
     The default is to accept all instructions.

 -- Macro: MD_CAN_REDIRECT_BRANCH (BRANCH1, BRANCH2)
     Take a branch insn in BRANCH1 and another in BRANCH2.  Return true
     if redirecting BRANCH1 to the destination of BRANCH2 is possible.

     On some targets, branches may have a limited range.  Optimizing the
     filling of delay slots can result in branches being redirected,
     and this may in turn cause a branch offset to overflow.

 -- Target Hook: bool TARGET_CAN_FOLLOW_JUMP (const_rtx FOLLOWER,
          const_rtx FOLLOWEE)
     FOLLOWER and FOLLOWEE are JUMP_INSN instructions;  return true if
     FOLLOWER may be modified to follow FOLLOWEE;  false, if it can't.
     For example, on some targets, certain kinds of branches can't be
     made to  follow through a hot/cold partitioning.

 -- Target Hook: bool TARGET_COMMUTATIVE_P (const_rtx X, int OUTER_CODE)
     This target hook returns `true' if X is considered to be
     commutative.  Usually, this is just COMMUTATIVE_P (X), but the HP
     PA doesn't consider PLUS to be commutative inside a MEM.
     OUTER_CODE is the rtx code of the enclosing rtl, if known,
     otherwise it is UNKNOWN.

 -- Target Hook: rtx TARGET_ALLOCATE_INITIAL_VALUE (rtx HARD_REG)
     When the initial value of a hard register has been copied in a
     pseudo register, it is often not necessary to actually allocate
     another register to this pseudo register, because the original
     hard register or a stack slot it has been saved into can be used.
     `TARGET_ALLOCATE_INITIAL_VALUE' is called at the start of register
     allocation once for each hard register that had its initial value
     copied by using `get_func_hard_reg_initial_val' or
     `get_hard_reg_initial_val'.  Possible values are `NULL_RTX', if
     you don't want to do any special allocation, a `REG' rtx--that
     would typically be the hard register itself, if it is known not to
     be clobbered--or a `MEM'.  If you are returning a `MEM', this is
     only a hint for the allocator; it might decide to use another
     register anyways.  You may use `current_function_is_leaf' or
     `REG_N_SETS' in the hook to determine if the hard register in
     question will not be clobbered.  The default value of this hook is
     `NULL', which disables any special allocation.

 -- Target Hook: int TARGET_UNSPEC_MAY_TRAP_P (const_rtx X, unsigned
          FLAGS)
     This target hook returns nonzero if X, an `unspec' or
     `unspec_volatile' operation, might cause a trap.  Targets can use
     this hook to enhance precision of analysis for `unspec' and
     `unspec_volatile' operations.  You may call `may_trap_p_1' to
     analyze inner elements of X in which case FLAGS should be passed
     along.

 -- Target Hook: void TARGET_SET_CURRENT_FUNCTION (tree DECL)
     The compiler invokes this hook whenever it changes its current
     function context (`cfun').  You can define this function if the
     back end needs to perform any initialization or reset actions on a
     per-function basis.  For example, it may be used to implement
     function attributes that affect register usage or code generation
     patterns.  The argument DECL is the declaration for the new
     function context, and may be null to indicate that the compiler
     has left a function context and is returning to processing at the
     top level.  The default hook function does nothing.

     GCC sets `cfun' to a dummy function context during initialization
     of some parts of the back end.  The hook function is not invoked
     in this situation; you need not worry about the hook being invoked
     recursively, or when the back end is in a partially-initialized
     state.  `cfun' might be `NULL' to indicate processing at top level,
     outside of any function scope.

 -- Macro: TARGET_OBJECT_SUFFIX
     Define this macro to be a C string representing the suffix for
     object files on your target machine.  If you do not define this
     macro, GCC will use `.o' as the suffix for object files.

 -- Macro: TARGET_EXECUTABLE_SUFFIX
     Define this macro to be a C string representing the suffix to be
     automatically added to executable files on your target machine.
     If you do not define this macro, GCC will use the null string as
     the suffix for executable files.

 -- Macro: COLLECT_EXPORT_LIST
     If defined, `collect2' will scan the individual object files
     specified on its command line and create an export list for the
     linker.  Define this macro for systems like AIX, where the linker
     discards object files that are not referenced from `main' and uses
     export lists.

 -- Macro: MODIFY_JNI_METHOD_CALL (MDECL)
     Define this macro to a C expression representing a variant of the
     method call MDECL, if Java Native Interface (JNI) methods must be
     invoked differently from other methods on your target.  For
     example, on 32-bit Microsoft Windows, JNI methods must be invoked
     using the `stdcall' calling convention and this macro is then
     defined as this expression:

          build_type_attribute_variant (MDECL,
                                        build_tree_list
                                        (get_identifier ("stdcall"),
                                         NULL))

 -- Target Hook: bool TARGET_CANNOT_MODIFY_JUMPS_P (void)
     This target hook returns `true' past the point in which new jump
     instructions could be created.  On machines that require a
     register for every jump such as the SHmedia ISA of SH5, this point
     would typically be reload, so this target hook should be defined
     to a function such as:

          static bool
          cannot_modify_jumps_past_reload_p ()
          {
            return (reload_completed || reload_in_progress);
          }

 -- Target Hook: reg_class_t TARGET_BRANCH_TARGET_REGISTER_CLASS (void)
     This target hook returns a register class for which branch target
     register optimizations should be applied.  All registers in this
     class should be usable interchangeably.  After reload, registers
     in this class will be re-allocated and loads will be hoisted out
     of loops and be subjected to inter-block scheduling.

 -- Target Hook: bool TARGET_BRANCH_TARGET_REGISTER_CALLEE_SAVED (bool
          AFTER_PROLOGUE_EPILOGUE_GEN)
     Branch target register optimization will by default exclude
     callee-saved registers that are not already live during the
     current function; if this target hook returns true, they will be
     included.  The target code must than make sure that all target
     registers in the class returned by
     `TARGET_BRANCH_TARGET_REGISTER_CLASS' that might need saving are
     saved.  AFTER_PROLOGUE_EPILOGUE_GEN indicates if prologues and
     epilogues have already been generated.  Note, even if you only
     return true when AFTER_PROLOGUE_EPILOGUE_GEN is false, you still
     are likely to have to make special provisions in
     `INITIAL_ELIMINATION_OFFSET' to reserve space for caller-saved
     target registers.

 -- Target Hook: bool TARGET_HAVE_CONDITIONAL_EXECUTION (void)
     This target hook returns true if the target supports conditional
     execution.  This target hook is required only when the target has
     several different modes and they have different conditional
     execution capability, such as ARM.

 -- Target Hook: unsigned TARGET_LOOP_UNROLL_ADJUST (unsigned NUNROLL,
          struct loop *LOOP)
     This target hook returns a new value for the number of times LOOP
     should be unrolled. The parameter NUNROLL is the number of times
     the loop is to be unrolled. The parameter LOOP is a pointer to the
     loop, which is going to be checked for unrolling. This target hook
     is required only when the target has special constraints like
     maximum number of memory accesses.

 -- Macro: POWI_MAX_MULTS
     If defined, this macro is interpreted as a signed integer C
     expression that specifies the maximum number of floating point
     multiplications that should be emitted when expanding
     exponentiation by an integer constant inline.  When this value is
     defined, exponentiation requiring more than this number of
     multiplications is implemented by calling the system library's
     `pow', `powf' or `powl' routines.  The default value places no
     upper bound on the multiplication count.

 -- Macro: void TARGET_EXTRA_INCLUDES (const char *SYSROOT, const char
          *IPREFIX, int STDINC)
     This target hook should register any extra include files for the
     target.  The parameter STDINC indicates if normal include files
     are present.  The parameter SYSROOT is the system root directory.
     The parameter IPREFIX is the prefix for the gcc directory.

 -- Macro: void TARGET_EXTRA_PRE_INCLUDES (const char *SYSROOT, const
          char *IPREFIX, int STDINC)
     This target hook should register any extra include files for the
     target before any standard headers.  The parameter STDINC
     indicates if normal include files are present.  The parameter
     SYSROOT is the system root directory.  The parameter IPREFIX is
     the prefix for the gcc directory.

 -- Macro: void TARGET_OPTF (char *PATH)
     This target hook should register special include paths for the
     target.  The parameter PATH is the include to register.  On Darwin
     systems, this is used for Framework includes, which have semantics
     that are different from `-I'.

 -- Macro: bool TARGET_USE_LOCAL_THUNK_ALIAS_P (tree FNDECL)
     This target macro returns `true' if it is safe to use a local alias
     for a virtual function FNDECL when constructing thunks, `false'
     otherwise.  By default, the macro returns `true' for all
     functions, if a target supports aliases (i.e. defines
     `ASM_OUTPUT_DEF'), `false' otherwise,

 -- Macro: TARGET_FORMAT_TYPES
     If defined, this macro is the name of a global variable containing
     target-specific format checking information for the `-Wformat'
     option.  The default is to have no target-specific format checks.

 -- Macro: TARGET_N_FORMAT_TYPES
     If defined, this macro is the number of entries in
     `TARGET_FORMAT_TYPES'.

 -- Macro: TARGET_OVERRIDES_FORMAT_ATTRIBUTES
     If defined, this macro is the name of a global variable containing
     target-specific format overrides for the `-Wformat' option. The
     default is to have no target-specific format overrides. If defined,
     `TARGET_FORMAT_TYPES' must be defined, too.

 -- Macro: TARGET_OVERRIDES_FORMAT_ATTRIBUTES_COUNT
     If defined, this macro specifies the number of entries in
     `TARGET_OVERRIDES_FORMAT_ATTRIBUTES'.

 -- Macro: TARGET_OVERRIDES_FORMAT_INIT
     If defined, this macro specifies the optional initialization
     routine for target specific customizations of the system printf
     and scanf formatter settings.

 -- Target Hook: bool TARGET_RELAXED_ORDERING
     If set to `true', means that the target's memory model does not
     guarantee that loads which do not depend on one another will access
     main memory in the order of the instruction stream; if ordering is
     important, an explicit memory barrier must be used.  This is true
     of many recent processors which implement a policy of "relaxed,"
     "weak," or "release" memory consistency, such as Alpha, PowerPC,
     and ia64.  The default is `false'.

 -- Target Hook: const char * TARGET_INVALID_ARG_FOR_UNPROTOTYPED_FN
          (const_tree TYPELIST, const_tree FUNCDECL, const_tree VAL)
     If defined, this macro returns the diagnostic message when it is
     illegal to pass argument VAL to function FUNCDECL with prototype
     TYPELIST.

 -- Target Hook: const char * TARGET_INVALID_CONVERSION (const_tree
          FROMTYPE, const_tree TOTYPE)
     If defined, this macro returns the diagnostic message when it is
     invalid to convert from FROMTYPE to TOTYPE, or `NULL' if validity
     should be determined by the front end.

 -- Target Hook: const char * TARGET_INVALID_UNARY_OP (int OP,
          const_tree TYPE)
     If defined, this macro returns the diagnostic message when it is
     invalid to apply operation OP (where unary plus is denoted by
     `CONVERT_EXPR') to an operand of type TYPE, or `NULL' if validity
     should be determined by the front end.

 -- Target Hook: const char * TARGET_INVALID_BINARY_OP (int OP,
          const_tree TYPE1, const_tree TYPE2)
     If defined, this macro returns the diagnostic message when it is
     invalid to apply operation OP to operands of types TYPE1 and
     TYPE2, or `NULL' if validity should be determined by the front end.

 -- Target Hook: const char * TARGET_INVALID_PARAMETER_TYPE (const_tree
          TYPE)
     If defined, this macro returns the diagnostic message when it is
     invalid for functions to include parameters of type TYPE, or
     `NULL' if validity should be determined by the front end.  This is
     currently used only by the C and C++ front ends.

 -- Target Hook: const char * TARGET_INVALID_RETURN_TYPE (const_tree
          TYPE)
     If defined, this macro returns the diagnostic message when it is
     invalid for functions to have return type TYPE, or `NULL' if
     validity should be determined by the front end.  This is currently
     used only by the C and C++ front ends.

 -- Target Hook: tree TARGET_PROMOTED_TYPE (const_tree TYPE)
     If defined, this target hook returns the type to which values of
     TYPE should be promoted when they appear in expressions, analogous
     to the integer promotions, or `NULL_TREE' to use the front end's
     normal promotion rules.  This hook is useful when there are
     target-specific types with special promotion rules.  This is
     currently used only by the C and C++ front ends.

 -- Target Hook: tree TARGET_CONVERT_TO_TYPE (tree TYPE, tree EXPR)
     If defined, this hook returns the result of converting EXPR to
     TYPE.  It should return the converted expression, or `NULL_TREE'
     to apply the front end's normal conversion rules.  This hook is
     useful when there are target-specific types with special
     conversion rules.  This is currently used only by the C and C++
     front ends.

 -- Macro: TARGET_USE_JCR_SECTION
     This macro determines whether to use the JCR section to register
     Java classes. By default, TARGET_USE_JCR_SECTION is defined to 1
     if both SUPPORTS_WEAK and TARGET_HAVE_NAMED_SECTIONS are true,
     else 0.

 -- Macro: OBJC_JBLEN
     This macro determines the size of the objective C jump buffer for
     the NeXT runtime. By default, OBJC_JBLEN is defined to an
     innocuous value.

 -- Macro: LIBGCC2_UNWIND_ATTRIBUTE
     Define this macro if any target-specific attributes need to be
     attached to the functions in `libgcc' that provide low-level
     support for call stack unwinding.  It is used in declarations in
     `unwind-generic.h' and the associated definitions of those
     functions.

 -- Target Hook: void TARGET_UPDATE_STACK_BOUNDARY (void)
     Define this macro to update the current function stack boundary if
     necessary.

 -- Target Hook: rtx TARGET_GET_DRAP_RTX (void)
     This hook should return an rtx for Dynamic Realign Argument
     Pointer (DRAP) if a different argument pointer register is needed
     to access the function's argument list due to stack realignment.
     Return `NULL' if no DRAP is needed.

 -- Target Hook: bool TARGET_ALLOCATE_STACK_SLOTS_FOR_ARGS (void)
     When optimization is disabled, this hook indicates whether or not
     arguments should be allocated to stack slots.  Normally, GCC
     allocates stacks slots for arguments when not optimizing in order
     to make debugging easier.  However, when a function is declared
     with `__attribute__((naked))', there is no stack frame, and the
     compiler cannot safely move arguments from the registers in which
     they are passed to the stack.  Therefore, this hook should return
     true in general, but false for naked functions.  The default
     implementation always returns true.

 -- Target Hook: unsigned HOST_WIDE_INT TARGET_CONST_ANCHOR
     On some architectures it can take multiple instructions to
     synthesize a constant.  If there is another constant already in a
     register that is close enough in value then it is preferable that
     the new constant is computed from this register using immediate
     addition or subtraction.  We accomplish this through CSE.  Besides
     the value of the constant we also add a lower and an upper
     constant anchor to the available expressions.  These are then
     queried when encountering new constants.  The anchors are computed
     by rounding the constant up and down to a multiple of the value of
     `TARGET_CONST_ANCHOR'.  `TARGET_CONST_ANCHOR' should be the
     maximum positive value accepted by immediate-add plus one.  We
     currently assume that the value of `TARGET_CONST_ANCHOR' is a
     power of 2.  For example, on MIPS, where add-immediate takes a
     16-bit signed value, `TARGET_CONST_ANCHOR' is set to `0x8000'.
     The default value is zero, which disables this optimization.

 -- Target Hook: unsigned HOST_WIDE_INT TARGET_ASAN_SHADOW_OFFSET (void)
     Return the offset bitwise ored into shifted address to get
     corresponding Address Sanitizer shadow memory address.  NULL if
     Address Sanitizer is not supported by the target.

 -- Target Hook: unsigned HOST_WIDE_INT TARGET_MEMMODEL_CHECK (unsigned
          HOST_WIDE_INT VAL)
     Validate target specific memory model mask bits. When NULL no
     target specific memory model bits are allowed.

 -- Target Hook: unsigned char TARGET_ATOMIC_TEST_AND_SET_TRUEVAL
     This value should be set if the result written by
     `atomic_test_and_set' is not exactly 1, i.e. the `bool' `true'.


File: gccint.info,  Node: Host Config,  Next: Fragments,  Prev: Target Macros,  Up: Top

18 Host Configuration
*********************

Most details about the machine and system on which the compiler is
actually running are detected by the `configure' script.  Some things
are impossible for `configure' to detect; these are described in two
ways, either by macros defined in a file named `xm-MACHINE.h' or by
hook functions in the file specified by the OUT_HOST_HOOK_OBJ variable
in `config.gcc'.  (The intention is that very few hosts will need a
header file but nearly every fully supported host will need to override
some hooks.)

 If you need to define only a few macros, and they have simple
definitions, consider using the `xm_defines' variable in your
`config.gcc' entry instead of creating a host configuration header.
*Note System Config::.

* Menu:

* Host Common::         Things every host probably needs implemented.
* Filesystem::          Your host can't have the letter `a' in filenames?
* Host Misc::           Rare configuration options for hosts.


File: gccint.info,  Node: Host Common,  Next: Filesystem,  Up: Host Config

18.1 Host Common
================

Some things are just not portable, even between similar operating
systems, and are too difficult for autoconf to detect.  They get
implemented using hook functions in the file specified by the
HOST_HOOK_OBJ variable in `config.gcc'.

 -- Host Hook: void HOST_HOOKS_EXTRA_SIGNALS (void)
     This host hook is used to set up handling for extra signals.  The
     most common thing to do in this hook is to detect stack overflow.

 -- Host Hook: void * HOST_HOOKS_GT_PCH_GET_ADDRESS (size_t SIZE, int
          FD)
     This host hook returns the address of some space that is likely to
     be free in some subsequent invocation of the compiler.  We intend
     to load the PCH data at this address such that the data need not
     be relocated.  The area should be able to hold SIZE bytes.  If the
     host uses `mmap', FD is an open file descriptor that can be used
     for probing.

 -- Host Hook: int HOST_HOOKS_GT_PCH_USE_ADDRESS (void * ADDRESS,
          size_t SIZE, int FD, size_t OFFSET)
     This host hook is called when a PCH file is about to be loaded.
     We want to load SIZE bytes from FD at OFFSET into memory at
     ADDRESS.  The given address will be the result of a previous
     invocation of `HOST_HOOKS_GT_PCH_GET_ADDRESS'.  Return -1 if we
     couldn't allocate SIZE bytes at ADDRESS.  Return 0 if the memory
     is allocated but the data is not loaded.  Return 1 if the hook has
     performed everything.

     If the implementation uses reserved address space, free any
     reserved space beyond SIZE, regardless of the return value.  If no
     PCH will be loaded, this hook may be called with SIZE zero, in
     which case all reserved address space should be freed.

     Do not try to handle values of ADDRESS that could not have been
     returned by this executable; just return -1.  Such values usually
     indicate an out-of-date PCH file (built by some other GCC
     executable), and such a PCH file won't work.

 -- Host Hook: size_t HOST_HOOKS_GT_PCH_ALLOC_GRANULARITY (void);
     This host hook returns the alignment required for allocating
     virtual memory.  Usually this is the same as getpagesize, but on
     some hosts the alignment for reserving memory differs from the
     pagesize for committing memory.


File: gccint.info,  Node: Filesystem,  Next: Host Misc,  Prev: Host Common,  Up: Host Config

18.2 Host Filesystem
====================

GCC needs to know a number of things about the semantics of the host
machine's filesystem.  Filesystems with Unix and MS-DOS semantics are
automatically detected.  For other systems, you can define the
following macros in `xm-MACHINE.h'.

`HAVE_DOS_BASED_FILE_SYSTEM'
     This macro is automatically defined by `system.h' if the host file
     system obeys the semantics defined by MS-DOS instead of Unix.  DOS
     file systems are case insensitive, file specifications may begin
     with a drive letter, and both forward slash and backslash (`/' and
     `\') are directory separators.

`DIR_SEPARATOR'
`DIR_SEPARATOR_2'
     If defined, these macros expand to character constants specifying
     separators for directory names within a file specification.
     `system.h' will automatically give them appropriate values on Unix
     and MS-DOS file systems.  If your file system is neither of these,
     define one or both appropriately in `xm-MACHINE.h'.

     However, operating systems like VMS, where constructing a pathname
     is more complicated than just stringing together directory names
     separated by a special character, should not define either of these
     macros.

`PATH_SEPARATOR'
     If defined, this macro should expand to a character constant
     specifying the separator for elements of search paths.  The default
     value is a colon (`:').  DOS-based systems usually, but not
     always, use semicolon (`;').

`VMS'
     Define this macro if the host system is VMS.

`HOST_OBJECT_SUFFIX'
     Define this macro to be a C string representing the suffix for
     object files on your host machine.  If you do not define this
     macro, GCC will use `.o' as the suffix for object files.

`HOST_EXECUTABLE_SUFFIX'
     Define this macro to be a C string representing the suffix for
     executable files on your host machine.  If you do not define this
     macro, GCC will use the null string as the suffix for executable
     files.

`HOST_BIT_BUCKET'
     A pathname defined by the host operating system, which can be
     opened as a file and written to, but all the information written
     is discarded.  This is commonly known as a "bit bucket" or "null
     device".  If you do not define this macro, GCC will use
     `/dev/null' as the bit bucket.  If the host does not support a bit
     bucket, define this macro to an invalid filename.

`UPDATE_PATH_HOST_CANONICALIZE (PATH)'
     If defined, a C statement (sans semicolon) that performs
     host-dependent canonicalization when a path used in a compilation
     driver or preprocessor is canonicalized.  PATH is a malloc-ed path
     to be canonicalized.  If the C statement does canonicalize PATH
     into a different buffer, the old path should be freed and the new
     buffer should have been allocated with malloc.

`DUMPFILE_FORMAT'
     Define this macro to be a C string representing the format to use
     for constructing the index part of debugging dump file names.  The
     resultant string must fit in fifteen bytes.  The full filename
     will be the concatenation of: the prefix of the assembler file
     name, the string resulting from applying this format to an index
     number, and a string unique to each dump file kind, e.g. `rtl'.

     If you do not define this macro, GCC will use `.%02d.'.  You should
     define this macro if using the default will create an invalid file
     name.

`DELETE_IF_ORDINARY'
     Define this macro to be a C statement (sans semicolon) that
     performs host-dependent removal of ordinary temp files in the
     compilation driver.

     If you do not define this macro, GCC will use the default version.
     You should define this macro if the default version does not
     reliably remove the temp file as, for example, on VMS which allows
     multiple versions of a file.

`HOST_LACKS_INODE_NUMBERS'
     Define this macro if the host filesystem does not report
     meaningful inode numbers in struct stat.


File: gccint.info,  Node: Host Misc,  Prev: Filesystem,  Up: Host Config

18.3 Host Misc
==============

`FATAL_EXIT_CODE'
     A C expression for the status code to be returned when the compiler
     exits after serious errors.  The default is the system-provided
     macro `EXIT_FAILURE', or `1' if the system doesn't define that
     macro.  Define this macro only if these defaults are incorrect.

`SUCCESS_EXIT_CODE'
     A C expression for the status code to be returned when the compiler
     exits without serious errors.  (Warnings are not serious errors.)
     The default is the system-provided macro `EXIT_SUCCESS', or `0' if
     the system doesn't define that macro.  Define this macro only if
     these defaults are incorrect.

`USE_C_ALLOCA'
     Define this macro if GCC should use the C implementation of
     `alloca' provided by `libiberty.a'.  This only affects how some
     parts of the compiler itself allocate memory.  It does not change
     code generation.

     When GCC is built with a compiler other than itself, the C `alloca'
     is always used.  This is because most other implementations have
     serious bugs.  You should define this macro only on a system where
     no stack-based `alloca' can possibly work.  For instance, if a
     system has a small limit on the size of the stack, GCC's builtin
     `alloca' will not work reliably.

`COLLECT2_HOST_INITIALIZATION'
     If defined, a C statement (sans semicolon) that performs
     host-dependent initialization when `collect2' is being initialized.

`GCC_DRIVER_HOST_INITIALIZATION'
     If defined, a C statement (sans semicolon) that performs
     host-dependent initialization when a compilation driver is being
     initialized.

`HOST_LONG_LONG_FORMAT'
     If defined, the string used to indicate an argument of type `long
     long' to functions like `printf'.  The default value is `"ll"'.

`HOST_LONG_FORMAT'
     If defined, the string used to indicate an argument of type `long'
     to functions like `printf'.  The default value is `"l"'.

`HOST_PTR_PRINTF'
     If defined, the string used to indicate an argument of type `void
     *' to functions like `printf'.  The default value is `"%p"'.

 In addition, if `configure' generates an incorrect definition of any
of the macros in `auto-host.h', you can override that definition in a
host configuration header.  If you need to do this, first see if it is
possible to fix `configure'.


File: gccint.info,  Node: Fragments,  Next: Collect2,  Prev: Host Config,  Up: Top

19 Makefile Fragments
*********************

When you configure GCC using the `configure' script, it will construct
the file `Makefile' from the template file `Makefile.in'.  When it does
this, it can incorporate makefile fragments from the `config'
directory.  These are used to set Makefile parameters that are not
amenable to being calculated by autoconf.  The list of fragments to
incorporate is set by `config.gcc' (and occasionally `config.build' and
`config.host'); *Note System Config::.

 Fragments are named either `t-TARGET' or `x-HOST', depending on
whether they are relevant to configuring GCC to produce code for a
particular target, or to configuring GCC to run on a particular host.
Here TARGET and HOST are mnemonics which usually have some relationship
to the canonical system name, but no formal connection.

 If these files do not exist, it means nothing needs to be added for a
given target or host.  Most targets need a few `t-TARGET' fragments,
but needing `x-HOST' fragments is rare.

* Menu:

* Target Fragment:: Writing `t-TARGET' files.
* Host Fragment::   Writing `x-HOST' files.


File: gccint.info,  Node: Target Fragment,  Next: Host Fragment,  Up: Fragments

19.1 Target Makefile Fragments
==============================

Target makefile fragments can set these Makefile variables.

`LIBGCC2_CFLAGS'
     Compiler flags to use when compiling `libgcc2.c'.

`LIB2FUNCS_EXTRA'
     A list of source file names to be compiled or assembled and
     inserted into `libgcc.a'.

`CRTSTUFF_T_CFLAGS'
     Special flags used when compiling `crtstuff.c'.  *Note
     Initialization::.

`CRTSTUFF_T_CFLAGS_S'
     Special flags used when compiling `crtstuff.c' for shared linking.
     Used if you use `crtbeginS.o' and `crtendS.o' in `EXTRA-PARTS'.
     *Note Initialization::.

`MULTILIB_OPTIONS'
     For some targets, invoking GCC in different ways produces objects
     that can not be linked together.  For example, for some targets GCC
     produces both big and little endian code.  For these targets, you
     must arrange for multiple versions of `libgcc.a' to be compiled,
     one for each set of incompatible options.  When GCC invokes the
     linker, it arranges to link in the right version of `libgcc.a',
     based on the command line options used.

     The `MULTILIB_OPTIONS' macro lists the set of options for which
     special versions of `libgcc.a' must be built.  Write options that
     are mutually incompatible side by side, separated by a slash.
     Write options that may be used together separated by a space.  The
     build procedure will build all combinations of compatible options.

     For example, if you set `MULTILIB_OPTIONS' to `m68000/m68020
     msoft-float', `Makefile' will build special versions of `libgcc.a'
     using the following sets of options:  `-m68000', `-m68020',
     `-msoft-float', `-m68000 -msoft-float', and `-m68020 -msoft-float'.

`MULTILIB_DIRNAMES'
     If `MULTILIB_OPTIONS' is used, this variable specifies the
     directory names that should be used to hold the various libraries.
     Write one element in `MULTILIB_DIRNAMES' for each element in
     `MULTILIB_OPTIONS'.  If `MULTILIB_DIRNAMES' is not used, the
     default value will be `MULTILIB_OPTIONS', with all slashes treated
     as spaces.

     `MULTILIB_DIRNAMES' describes the multilib directories using GCC
     conventions and is applied to directories that are part of the GCC
     installation.  When multilib-enabled, the compiler will add a
     subdirectory of the form PREFIX/MULTILIB before each directory in
     the search path for libraries and crt files.

     For example, if `MULTILIB_OPTIONS' is set to `m68000/m68020
     msoft-float', then the default value of `MULTILIB_DIRNAMES' is
     `m68000 m68020 msoft-float'.  You may specify a different value if
     you desire a different set of directory names.

`MULTILIB_MATCHES'
     Sometimes the same option may be written in two different ways.
     If an option is listed in `MULTILIB_OPTIONS', GCC needs to know
     about any synonyms.  In that case, set `MULTILIB_MATCHES' to a
     list of items of the form `option=option' to describe all relevant
     synonyms.  For example, `m68000=mc68000 m68020=mc68020'.

`MULTILIB_EXCEPTIONS'
     Sometimes when there are multiple sets of `MULTILIB_OPTIONS' being
     specified, there are combinations that should not be built.  In
     that case, set `MULTILIB_EXCEPTIONS' to be all of the switch
     exceptions in shell case syntax that should not be built.

     For example the ARM processor cannot execute both hardware floating
     point instructions and the reduced size THUMB instructions at the
     same time, so there is no need to build libraries with both of
     these options enabled.  Therefore `MULTILIB_EXCEPTIONS' is set to:
          *mthumb/*mhard-float*

`MULTILIB_REQUIRED'
     Sometimes when there are only a few combinations are required, it
     would be a big effort to come up with a `MULTILIB_EXCEPTIONS' list
     to cover all undesired ones.  In such a case, just listing all the
     required combinations in `MULTILIB_REQUIRED' would be more
     straightforward.

     The way to specify the entries in `MULTILIB_REQUIRED' is same with
     the way used for `MULTILIB_EXCEPTIONS', only this time what are
     required will be specified.  Suppose there are multiple sets of
     `MULTILIB_OPTIONS' and only two combinations are required, one for
     ARMv7-M and one for ARMv7-R with hard floating-point ABI and FPU,
     the `MULTILIB_REQUIRED' can be set to:
          `MULTILIB_REQUIRED' =  mthumb/march=armv7-m
          `MULTILIB_REQUIRED' += march=armv7-r/mfloat-abi=hard/mfpu=vfpv3-d16

     The `MULTILIB_REQUIRED' can be used together with
     `MULTILIB_EXCEPTIONS'.  The option combinations generated from
     `MULTILIB_OPTIONS' will be filtered by `MULTILIB_EXCEPTIONS' and
     then by `MULTILIB_REQUIRED'.

`MULTILIB_REUSE'
     Sometimes it is desirable to reuse one existing multilib for
     different sets of options.  Such kind of reuse can minimize the
     number of multilib variants.  And for some targets it is better to
     reuse an existing multilib than to fall back to default multilib
     when there is no corresponding multilib.  This can be done by
     adding reuse rules to `MULTILIB_REUSE'.

     A reuse rule is comprised of two parts connected by equality sign.
     The left part is option set used to build multilib and the right
     part is option set that will reuse this multilib.  The order of
     options in the left part matters and should be same with those
     specified in `MULTILIB_REQUIRED' or aligned with order in
     `MULTILIB_OPTIONS'.  There is no such limitation for options in
     right part as we don't build multilib from them.  But the equality
     sign in both parts should be replaced with period.

     The `MULTILIB_REUSE' is different from `MULTILIB_MATCHES' in that
     it sets up relations between two option sets rather than two
     options.  Here is an example to demo how we reuse libraries built
     in Thumb mode for applications built in ARM mode:
          `MULTILIB_REUSE' = mthumb/march.armv7-r=marm/march.armv7-r

     Before the advent of `MULTILIB_REUSE', GCC select multilib by
     comparing command line options with options used to build
     multilib.  The `MULTILIB_REUSE' is complementary to that way.
     Only when the original comparison matches nothing it will work to
     see if it is OK to reuse some existing multilib.

`MULTILIB_EXTRA_OPTS'
     Sometimes it is desirable that when building multiple versions of
     `libgcc.a' certain options should always be passed on to the
     compiler.  In that case, set `MULTILIB_EXTRA_OPTS' to be the list
     of options to be used for all builds.  If you set this, you should
     probably set `CRTSTUFF_T_CFLAGS' to a dash followed by it.

`MULTILIB_OSDIRNAMES'
     If `MULTILIB_OPTIONS' is used, this variable specifies a list of
     subdirectory names, that are used to modify the search path
     depending on the chosen multilib.  Unlike `MULTILIB_DIRNAMES',
     `MULTILIB_OSDIRNAMES' describes the multilib directories using
     operating systems conventions, and is applied to the directories
     such as `lib' or those in the `LIBRARY_PATH' environment variable.
     The format is either the same as of `MULTILIB_DIRNAMES', or a set
     of mappings.  When it is the same as `MULTILIB_DIRNAMES', it
     describes the multilib directories using operating system
     conventions, rather than GCC conventions.  When it is a set of
     mappings of the form GCCDIR=OSDIR, the left side gives the GCC
     convention and the right gives the equivalent OS defined location.
     If the OSDIR part begins with a `!', GCC will not search in the
     non-multilib directory and use exclusively the multilib directory.
     Otherwise, the compiler will examine the search path for libraries
     and crt files twice; the first time it will add MULTILIB to each
     directory in the search path, the second it will not.

     For configurations that support both multilib and multiarch,
     `MULTILIB_OSDIRNAMES' also encodes the multiarch name, thus
     subsuming `MULTIARCH_DIRNAME'.  The multiarch name is appended to
     each directory name, separated by a colon (e.g.
     `../lib32:i386-linux-gnu').

     Each multiarch subdirectory will be searched before the
     corresponding OS multilib directory, for example
     `/lib/i386-linux-gnu' before `/lib/../lib32'.  The multiarch name
     will also be used to modify the system header search path, as
     explained for `MULTIARCH_DIRNAME'.

`MULTIARCH_DIRNAME'
     This variable specifies the multiarch name for configurations that
     are multiarch-enabled but not multilibbed configurations.

     The multiarch name is used to augment the search path for
     libraries, crt files and system header files with additional
     locations.  The compiler will add a multiarch subdirectory of the
     form PREFIX/MULTIARCH before each directory in the library and crt
     search path.  It will also add two directories
     `LOCAL_INCLUDE_DIR'/MULTIARCH and
     `NATIVE_SYSTEM_HEADER_DIR'/MULTIARCH) to the system header search
     path, respectively before `LOCAL_INCLUDE_DIR' and
     `NATIVE_SYSTEM_HEADER_DIR'.

     `MULTIARCH_DIRNAME' is not used for configurations that support
     both multilib and multiarch.  In that case, multiarch names are
     encoded in `MULTILIB_OSDIRNAMES' instead.

     More documentation about multiarch can be found at
     `http://wiki.debian.org/Multiarch'.

`SPECS'
     Unfortunately, setting `MULTILIB_EXTRA_OPTS' is not enough, since
     it does not affect the build of target libraries, at least not the
     build of the default multilib.  One possible work-around is to use
     `DRIVER_SELF_SPECS' to bring options from the `specs' file as if
     they had been passed in the compiler driver command line.
     However, you don't want to be adding these options after the
     toolchain is installed, so you can instead tweak the `specs' file
     that will be used during the toolchain build, while you still
     install the original, built-in `specs'.  The trick is to set
     `SPECS' to some other filename (say `specs.install'), that will
     then be created out of the built-in specs, and introduce a
     `Makefile' rule to generate the `specs' file that's going to be
     used at build time out of your `specs.install'.

`T_CFLAGS'
     These are extra flags to pass to the C compiler.  They are used
     both when building GCC, and when compiling things with the
     just-built GCC.  This variable is deprecated and should not be
     used.


File: gccint.info,  Node: Host Fragment,  Prev: Target Fragment,  Up: Fragments

19.2 Host Makefile Fragments
============================

The use of `x-HOST' fragments is discouraged.  You should only use it
for makefile dependencies.


File: gccint.info,  Node: Collect2,  Next: Header Dirs,  Prev: Fragments,  Up: Top

20 `collect2'
*************

GCC uses a utility called `collect2' on nearly all systems to arrange
to call various initialization functions at start time.

 The program `collect2' works by linking the program once and looking
through the linker output file for symbols with particular names
indicating they are constructor functions.  If it finds any, it creates
a new temporary `.c' file containing a table of them, compiles it, and
links the program a second time including that file.

 The actual calls to the constructors are carried out by a subroutine
called `__main', which is called (automatically) at the beginning of
the body of `main' (provided `main' was compiled with GNU CC).  Calling
`__main' is necessary, even when compiling C code, to allow linking C
and C++ object code together.  (If you use `-nostdlib', you get an
unresolved reference to `__main', since it's defined in the standard
GCC library.  Include `-lgcc' at the end of your compiler command line
to resolve this reference.)

 The program `collect2' is installed as `ld' in the directory where the
passes of the compiler are installed.  When `collect2' needs to find
the _real_ `ld', it tries the following file names:

   * a hard coded linker file name, if GCC was configured with the
     `--with-ld' option.

   * `real-ld' in the directories listed in the compiler's search
     directories.

   * `real-ld' in the directories listed in the environment variable
     `PATH'.

   * The file specified in the `REAL_LD_FILE_NAME' configuration macro,
     if specified.

   * `ld' in the compiler's search directories, except that `collect2'
     will not execute itself recursively.

   * `ld' in `PATH'.

 "The compiler's search directories" means all the directories where
`gcc' searches for passes of the compiler.  This includes directories
that you specify with `-B'.

 Cross-compilers search a little differently:

   * `real-ld' in the compiler's search directories.

   * `TARGET-real-ld' in `PATH'.

   * The file specified in the `REAL_LD_FILE_NAME' configuration macro,
     if specified.

   * `ld' in the compiler's search directories.

   * `TARGET-ld' in `PATH'.

 `collect2' explicitly avoids running `ld' using the file name under
which `collect2' itself was invoked.  In fact, it remembers up a list
of such names--in case one copy of `collect2' finds another copy (or
version) of `collect2' installed as `ld' in a second place in the
search path.

 `collect2' searches for the utilities `nm' and `strip' using the same
algorithm as above for `ld'.


File: gccint.info,  Node: Header Dirs,  Next: Type Information,  Prev: Collect2,  Up: Top

21 Standard Header File Directories
***********************************

`GCC_INCLUDE_DIR' means the same thing for native and cross.  It is
where GCC stores its private include files, and also where GCC stores
the fixed include files.  A cross compiled GCC runs `fixincludes' on
the header files in `$(tooldir)/include'.  (If the cross compilation
header files need to be fixed, they must be installed before GCC is
built.  If the cross compilation header files are already suitable for
GCC, nothing special need be done).

 `GPLUSPLUS_INCLUDE_DIR' means the same thing for native and cross.  It
is where `g++' looks first for header files.  The C++ library installs
only target independent header files in that directory.

 `LOCAL_INCLUDE_DIR' is used only by native compilers.  GCC doesn't
install anything there.  It is normally `/usr/local/include'.  This is
where local additions to a packaged system should place header files.

 `CROSS_INCLUDE_DIR' is used only by cross compilers.  GCC doesn't
install anything there.

 `TOOL_INCLUDE_DIR' is used for both native and cross compilers.  It is
the place for other packages to install header files that GCC will use.
For a cross-compiler, this is the equivalent of `/usr/include'.  When
you build a cross-compiler, `fixincludes' processes any header files in
this directory.


File: gccint.info,  Node: Type Information,  Next: Plugins,  Prev: Header Dirs,  Up: Top

22 Memory Management and Type Information
*****************************************

GCC uses some fairly sophisticated memory management techniques, which
involve determining information about GCC's data structures from GCC's
source code and using this information to perform garbage collection and
implement precompiled headers.

 A full C++ parser would be too complicated for this task, so a limited
subset of C++ is interpreted and special markers are used to determine
what parts of the source to look at.  All `struct', `union' and
`template' structure declarations that define data structures that are
allocated under control of the garbage collector must be marked.  All
global variables that hold pointers to garbage-collected memory must
also be marked.  Finally, all global variables that need to be saved
and restored by a precompiled header must be marked.  (The precompiled
header mechanism can only save static variables if they're scalar.
Complex data structures must be allocated in garbage-collected memory
to be saved in a precompiled header.)

 The full format of a marker is
     GTY (([OPTION] [(PARAM)], [OPTION] [(PARAM)] ...))
 but in most cases no options are needed.  The outer double parentheses
are still necessary, though: `GTY(())'.  Markers can appear:

   * In a structure definition, before the open brace;

   * In a global variable declaration, after the keyword `static' or
     `extern'; and

   * In a structure field definition, before the name of the field.

 Here are some examples of marking simple data structures and globals.

     struct GTY(()) TAG
     {
       FIELDS...
     };

     typedef struct GTY(()) TAG
     {
       FIELDS...
     } *TYPENAME;

     static GTY(()) struct TAG *LIST;   /* points to GC memory */
     static GTY(()) int COUNTER;        /* save counter in a PCH */

 The parser understands simple typedefs such as `typedef struct TAG
*NAME;' and `typedef int NAME;'.  These don't need to be marked.

 Since `gengtype''s understanding of C++ is limited, there are several
constructs and declarations that are not supported inside
classes/structures marked for automatic GC code generation.  The
following C++ constructs produce a `gengtype' error on
structures/classes marked for automatic GC code generation:

   * Type definitions inside classes/structures are not supported.

   * Enumerations inside classes/structures are not supported.

 If you have a class or structure using any of the above constructs,
you need to mark that class as `GTY ((user))' and provide your own
marking routines (see section *note User GC:: for details).

 It is always valid to include function definitions inside classes.
Those are always ignored by `gengtype', as it only cares about data
members.

* Menu:

* GTY Options::         What goes inside a `GTY(())'.
* User GC::		Adding user-provided GC marking routines.
* GGC Roots::           Making global variables GGC roots.
* Files::               How the generated files work.
* Invoking the garbage collector::   How to invoke the garbage collector.
* Troubleshooting::     When something does not work as expected.


File: gccint.info,  Node: GTY Options,  Next: User GC,  Up: Type Information

22.1 The Inside of a `GTY(())'
==============================

Sometimes the C code is not enough to fully describe the type
structure.  Extra information can be provided with `GTY' options and
additional markers.  Some options take a parameter, which may be either
a string or a type name, depending on the parameter.  If an option
takes no parameter, it is acceptable either to omit the parameter
entirely, or to provide an empty string as a parameter.  For example,
`GTY ((skip))' and `GTY ((skip ("")))' are equivalent.

 When the parameter is a string, often it is a fragment of C code.  Four
special escapes may be used in these strings, to refer to pieces of the
data structure being marked:

`%h'
     The current structure.

`%1'
     The structure that immediately contains the current structure.

`%0'
     The outermost structure that contains the current structure.

`%a'
     A partial expression of the form `[i1][i2]...' that indexes the
     array item currently being marked.

 For instance, suppose that you have a structure of the form
     struct A {
       ...
     };
     struct B {
       struct A foo[12];
     };
 and `b' is a variable of type `struct B'.  When marking `b.foo[11]',
`%h' would expand to `b.foo[11]', `%0' and `%1' would both expand to
`b', and `%a' would expand to `[11]'.

 As in ordinary C, adjacent strings will be concatenated; this is
helpful when you have a complicated expression.
     GTY ((chain_next ("TREE_CODE (&%h.generic) == INTEGER_TYPE"
                       " ? TYPE_NEXT_VARIANT (&%h.generic)"
                       " : TREE_CHAIN (&%h.generic)")))

 The available options are:

`length ("EXPRESSION")'
     There are two places the type machinery will need to be explicitly
     told the length of an array of non-atomic objects.  The first case
     is when a structure ends in a variable-length array, like this:
          struct GTY(()) rtvec_def {
            int num_elem;         /* number of elements */
            rtx GTY ((length ("%h.num_elem"))) elem[1];
          };

     In this case, the `length' option is used to override the specified
     array length (which should usually be `1').  The parameter of the
     option is a fragment of C code that calculates the length.

     The second case is when a structure or a global variable contains a
     pointer to an array, like this:
          struct gimple_omp_for_iter * GTY((length ("%h.collapse"))) iter;
     In this case, `iter' has been allocated by writing something like
            x->iter = ggc_alloc_cleared_vec_gimple_omp_for_iter (collapse);
     and the `collapse' provides the length of the field.

     This second use of `length' also works on global variables, like: static GTY((length("reg_known_value_size"))) rtx *reg_known_value;

     Note that the `length' option is only meant for use with arrays of
     non-atomic objects, that is, objects that contain pointers
     pointing to other GTY-managed objects.  For other GC-allocated
     arrays and strings you should use `atomic'.

`skip'
     If `skip' is applied to a field, the type machinery will ignore it.
     This is somewhat dangerous; the only safe use is in a union when
     one field really isn't ever used.

`desc ("EXPRESSION")'
`tag ("CONSTANT")'
`default'
     The type machinery needs to be told which field of a `union' is
     currently active.  This is done by giving each field a constant
     `tag' value, and then specifying a discriminator using `desc'.
     The value of the expression given by `desc' is compared against
     each `tag' value, each of which should be different.  If no `tag'
     is matched, the field marked with `default' is used if there is
     one, otherwise no field in the union will be marked.

     In the `desc' option, the "current structure" is the union that it
     discriminates.  Use `%1' to mean the structure containing it.
     There are no escapes available to the `tag' option, since it is a
     constant.

     For example,
          struct GTY(()) tree_binding
          {
            struct tree_common common;
            union tree_binding_u {
              tree GTY ((tag ("0"))) scope;
              struct cp_binding_level * GTY ((tag ("1"))) level;
            } GTY ((desc ("BINDING_HAS_LEVEL_P ((tree)&%0)"))) xscope;
            tree value;
          };

     In this example, the value of BINDING_HAS_LEVEL_P when applied to a
     `struct tree_binding *' is presumed to be 0 or 1.  If 1, the type
     mechanism will treat the field `level' as being present and if 0,
     will treat the field `scope' as being present.

`param_is (TYPE)'
`use_param'
     Sometimes it's convenient to define some data structure to work on
     generic pointers (that is, `PTR') and then use it with a specific
     type.  `param_is' specifies the real type pointed to, and
     `use_param' says where in the generic data structure that type
     should be put.

     For instance, to have a `htab_t' that points to trees, one would
     write the definition of `htab_t' like this:
          typedef struct GTY(()) {
            ...
            void ** GTY ((use_param, ...)) entries;
            ...
          } htab_t;
     and then declare variables like this:
            static htab_t GTY ((param_is (union tree_node))) ict;

`paramN_is (TYPE)'
`use_paramN'
     In more complicated cases, the data structure might need to work on
     several different types, which might not necessarily all be
     pointers.  For this, `param1_is' through `param9_is' may be used to
     specify the real type of a field identified by `use_param1' through
     `use_param9'.

`use_params'
     When a structure contains another structure that is parameterized,
     there's no need to do anything special, the inner structure
     inherits the parameters of the outer one.  When a structure
     contains a pointer to a parameterized structure, the type
     machinery won't automatically detect this (it could, it just
     doesn't yet), so it's necessary to tell it that the pointed-to
     structure should use the same parameters as the outer structure.
     This is done by marking the pointer with the `use_params' option.

`deletable'
     `deletable', when applied to a global variable, indicates that when
     garbage collection runs, there's no need to mark anything pointed
     to by this variable, it can just be set to `NULL' instead.  This
     is used to keep a list of free structures around for re-use.

`if_marked ("EXPRESSION")'
     Suppose you want some kinds of object to be unique, and so you put
     them in a hash table.  If garbage collection marks the hash table,
     these objects will never be freed, even if the last other
     reference to them goes away.  GGC has special handling to deal
     with this: if you use the `if_marked' option on a global hash
     table, GGC will call the routine whose name is the parameter to
     the option on each hash table entry.  If the routine returns
     nonzero, the hash table entry will be marked as usual.  If the
     routine returns zero, the hash table entry will be deleted.

     The routine `ggc_marked_p' can be used to determine if an element
     has been marked already; in fact, the usual case is to use
     `if_marked ("ggc_marked_p")'.

`mark_hook ("HOOK-ROUTINE-NAME")'
     If provided for a structure or union type, the given
     HOOK-ROUTINE-NAME (between double-quotes) is the name of a routine
     called when the garbage collector has just marked the data as
     reachable. This routine should not change the data, or call any ggc
     routine. Its only argument is a pointer to the just marked (const)
     structure or union.

`maybe_undef'
     When applied to a field, `maybe_undef' indicates that it's OK if
     the structure that this fields points to is never defined, so long
     as this field is always `NULL'.  This is used to avoid requiring
     backends to define certain optional structures.  It doesn't work
     with language frontends.

`nested_ptr (TYPE, "TO EXPRESSION", "FROM EXPRESSION")'
     The type machinery expects all pointers to point to the start of an
     object.  Sometimes for abstraction purposes it's convenient to have
     a pointer which points inside an object.  So long as it's possible
     to convert the original object to and from the pointer, such
     pointers can still be used.  TYPE is the type of the original
     object, the TO EXPRESSION returns the pointer given the original
     object, and the FROM EXPRESSION returns the original object given
     the pointer.  The pointer will be available using the `%h' escape.

`chain_next ("EXPRESSION")'
`chain_prev ("EXPRESSION")'
`chain_circular ("EXPRESSION")'
     It's helpful for the type machinery to know if objects are often
     chained together in long lists; this lets it generate code that
     uses less stack space by iterating along the list instead of
     recursing down it.  `chain_next' is an expression for the next
     item in the list, `chain_prev' is an expression for the previous
     item.  For singly linked lists, use only `chain_next'; for doubly
     linked lists, use both.  The machinery requires that taking the
     next item of the previous item gives the original item.
     `chain_circular' is similar to `chain_next', but can be used for
     circular single linked lists.

`reorder ("FUNCTION NAME")'
     Some data structures depend on the relative ordering of pointers.
     If the precompiled header machinery needs to change that ordering,
     it will call the function referenced by the `reorder' option,
     before changing the pointers in the object that's pointed to by
     the field the option applies to.  The function must take four
     arguments, with the signature
     `void *, void *, gt_pointer_operator, void *'.  The first
     parameter is a pointer to the structure that contains the object
     being updated, or the object itself if there is no containing
     structure.  The second parameter is a cookie that should be
     ignored.  The third parameter is a routine that, given a pointer,
     will update it to its correct new value.  The fourth parameter is
     a cookie that must be passed to the second parameter.

     PCH cannot handle data structures that depend on the absolute
     values of pointers.  `reorder' functions can be expensive.  When
     possible, it is better to depend on properties of the data, like
     an ID number or the hash of a string instead.

`variable_size'
     The type machinery expects the types to be of constant size.  When
     this is not true, for example, with structs that have array fields
     or unions, the type machinery cannot tell how many bytes need to
     be allocated at each allocation.  The `variable_size' is used to
     mark such types.  The type machinery then provides allocators that
     take a parameter indicating an exact size of object being
     allocated.  Note that the size must be provided in bytes whereas
     the `length' option works with array lengths in number of elements.

     For example,
          struct GTY((variable_size)) sorted_fields_type {
            int len;
            tree GTY((length ("%h.len"))) elts[1];
          };

     Then the objects of `struct sorted_fields_type' are allocated in GC
     memory as follows:
            field_vec = ggc_alloc_sorted_fields_type (size);

     If FIELD_VEC->ELTS stores N elements, then SIZE could be
     calculated as follows:
            size_t size = sizeof (struct sorted_fields_type) + n * sizeof (tree);

`atomic'
     The `atomic' option can only be used with pointers.  It informs
     the GC machinery that the memory that the pointer points to does
     not contain any pointers, and hence it should be treated by the GC
     and PCH machinery as an "atomic" block of memory that does not
     need to be examined when scanning memory for pointers.  In
     particular, the machinery will not scan that memory for pointers
     to mark them as reachable (when marking pointers for GC) or to
     relocate them (when writing a PCH file).

     The `atomic' option differs from the `skip' option.  `atomic'
     keeps the memory under Garbage Collection, but makes the GC ignore
     the contents of the memory.  `skip' is more drastic in that it
     causes the pointer and the memory to be completely ignored by the
     Garbage Collector.  So, memory marked as `atomic' is automatically
     freed when no longer reachable, while memory marked as `skip' is
     not.

     The `atomic' option must be used with great care, because all
     sorts of problem can occur if used incorrectly, that is, if the
     memory the pointer points to does actually contain a pointer.

     Here is an example of how to use it:
          struct GTY(()) my_struct {
            int number_of_elements;
            unsigned int * GTY ((atomic)) elements;
          };
     In this case, `elements' is a pointer under GC, and the memory it
     points to needs to be allocated using the Garbage Collector, and
     will be freed automatically by the Garbage Collector when it is no
     longer referenced.  But the memory that the pointer points to is
     an array of `unsigned int' elements, and the GC must not try to
     scan it to find pointers to mark or relocate, which is why it is
     marked with the `atomic' option.

     Note that, currently, global variables can not be marked with
     `atomic'; only fields of a struct can.  This is a known
     limitation.  It would be useful to be able to mark global pointers
     with `atomic' to make the PCH machinery aware of them so that they
     are saved and restored correctly to PCH files.

`special ("NAME")'
     The `special' option is used to mark types that have to be dealt
     with by special case machinery.  The parameter is the name of the
     special case.  See `gengtype.c' for further details.  Avoid adding
     new special cases unless there is no other alternative.

`user'
     The `user' option indicates that the code to mark structure fields
     is completely handled by user-provided routines.  See section
     *note User GC:: for details on what functions need to be provided.


File: gccint.info,  Node: User GC,  Next: GGC Roots,  Prev: GTY Options,  Up: Type Information

22.2 Support for user-provided GC marking routines
==================================================

The garbage collector supports types for which no automatic marking
code is generated.  For these types, the user is required to provide
three functions: one to act as a marker for garbage collection, and two
functions to act as marker and pointer walker for pre-compiled headers.

 Given a structure `struct GTY((user)) my_struct', the following
functions should be defined to mark `my_struct':

     void gt_ggc_mx (my_struct *p)
     {
       /* This marks field 'fld'.  */
       gt_ggc_mx (p->fld);
     }

     void gt_pch_nx (my_struct *p)
     {
       /* This marks field 'fld'.  */
       gt_pch_nx (tp->fld);
     }

     void gt_pch_nx (my_struct *p, gt_pointer_operator op, void *cookie)
     {
       /* For every field 'fld', call the given pointer operator.  */
       op (&(tp->fld), cookie);
     }

 In general, each marker `M' should call `M' for every pointer field in
the structure.  Fields that are not allocated in GC or are not pointers
must be ignored.

 For embedded lists (e.g., structures with a `next' or `prev' pointer),
the marker must follow the chain and mark every element in it.

 Note that the rules for the pointer walker `gt_pch_nx (my_struct *,
gt_pointer_operator, void *)' are slightly different.  In this case,
the operation `op' must be applied to the _address_ of every pointer
field.

22.2.1 User-provided marking routines for template types
--------------------------------------------------------

When a template type `TP' is marked with `GTY', all instances of that
type are considered user-provided types.  This means that the
individual instances of `TP' do not need to be marked with `GTY'.  The
user needs to provide template functions to mark all the fields of the
type.

 The following code snippets represent all the functions that need to
be provided. Note that type `TP' may reference to more than one type.
In these snippets, there is only one type `T', but there could be more.

     template<typename T>
     void gt_ggc_mx (TP<T> *tp)
     {
       extern void gt_ggc_mx (T&);

       /* This marks field 'fld' of type 'T'.  */
       gt_ggc_mx (tp->fld);
     }

     template<typename T>
     void gt_pch_nx (TP<T> *tp)
     {
       extern void gt_pch_nx (T&);

       /* This marks field 'fld' of type 'T'.  */
       gt_pch_nx (tp->fld);
     }

     template<typename T>
     void gt_pch_nx (TP<T *> *tp, gt_pointer_operator op, void *cookie)
     {
       /* For every field 'fld' of 'tp' with type 'T *', call the given
          pointer operator.  */
       op (&(tp->fld), cookie);
     }

     template<typename T>
     void gt_pch_nx (TP<T> *tp, gt_pointer_operator, void *cookie)
     {
       extern void gt_pch_nx (T *, gt_pointer_operator, void *);

       /* For every field 'fld' of 'tp' with type 'T', call the pointer
          walker for all the fields of T.  */
       gt_pch_nx (&(tp->fld), op, cookie);
     }

 Support for user-defined types is currently limited. The following
restrictions apply:

  1. Type `TP' and all the argument types `T' must be marked with `GTY'.

  2. Type `TP' can only have type names in its argument list.

  3. The pointer walker functions are different for `TP<T>' and `TP<T
     *>'. In the case of `TP<T>', references to `T' must be handled by
     calling `gt_pch_nx' (which will, in turn, walk all the pointers
     inside fields of `T').  In the case of `TP<T *>', references to `T
     *' must be handled by calling the `op' function on the address of
     the pointer (see the code snippets above).


File: gccint.info,  Node: GGC Roots,  Next: Files,  Prev: User GC,  Up: Type Information

22.3 Marking Roots for the Garbage Collector
============================================

In addition to keeping track of types, the type machinery also locates
the global variables ("roots") that the garbage collector starts at.
Roots must be declared using one of the following syntaxes:

   * `extern GTY(([OPTIONS])) TYPE NAME;'

   * `static GTY(([OPTIONS])) TYPE NAME;'
 The syntax
   * `GTY(([OPTIONS])) TYPE NAME;'
 is _not_ accepted.  There should be an `extern' declaration of such a
variable in a header somewhere--mark that, not the definition.  Or, if
the variable is only used in one file, make it `static'.


File: gccint.info,  Node: Files,  Next: Invoking the garbage collector,  Prev: GGC Roots,  Up: Type Information

22.4 Source Files Containing Type Information
=============================================

Whenever you add `GTY' markers to a source file that previously had
none, or create a new source file containing `GTY' markers, there are
three things you need to do:

  1. You need to add the file to the list of source files the type
     machinery scans.  There are four cases:

       a. For a back-end file, this is usually done automatically; if
          not, you should add it to `target_gtfiles' in the appropriate
          port's entries in `config.gcc'.

       b. For files shared by all front ends, add the filename to the
          `GTFILES' variable in `Makefile.in'.

       c. For files that are part of one front end, add the filename to
          the `gtfiles' variable defined in the appropriate
          `config-lang.in'.  Headers should appear before non-headers
          in this list.

       d. For files that are part of some but not all front ends, add
          the filename to the `gtfiles' variable of _all_ the front ends
          that use it.

  2. If the file was a header file, you'll need to check that it's
     included in the right place to be visible to the generated files.
     For a back-end header file, this should be done automatically.
     For a front-end header file, it needs to be included by the same
     file that includes `gtype-LANG.h'.  For other header files, it
     needs to be included in `gtype-desc.c', which is a generated file,
     so add it to `ifiles' in `open_base_file' in `gengtype.c'.

     For source files that aren't header files, the machinery will
     generate a header file that should be included in the source file
     you just changed.  The file will be called `gt-PATH.h' where PATH
     is the pathname relative to the `gcc' directory with slashes
     replaced by -, so for example the header file to be included in
     `cp/parser.c' is called `gt-cp-parser.c'.  The generated header
     file should be included after everything else in the source file.
     Don't forget to mention this file as a dependency in the
     `Makefile'!


 For language frontends, there is another file that needs to be included
somewhere.  It will be called `gtype-LANG.h', where LANG is the name of
the subdirectory the language is contained in.

 Plugins can add additional root tables.  Run the `gengtype' utility in
plugin mode as `gengtype -P pluginout.h SOURCE-DIR FILE-LIST PLUGIN*.C'
with your plugin files PLUGIN*.C using `GTY' to generate the
PLUGINOUT.H file.  The GCC build tree is needed to be present in that
mode.


File: gccint.info,  Node: Invoking the garbage collector,  Next: Troubleshooting,  Prev: Files,  Up: Type Information

22.5 How to invoke the garbage collector
========================================

The GCC garbage collector GGC is only invoked explicitly. In contrast
with many other garbage collectors, it is not implicitly invoked by
allocation routines when a lot of memory has been consumed. So the only
way to have GGC reclaim storage is to call the `ggc_collect' function
explicitly.  This call is an expensive operation, as it may have to
scan the entire heap.  Beware that local variables (on the GCC call
stack) are not followed by such an invocation (as many other garbage
collectors do): you should reference all your data from static or
external `GTY'-ed variables, and it is advised to call `ggc_collect'
with a shallow call stack.  The GGC is an exact mark and sweep garbage
collector (so it does not scan the call stack for pointers).  In
practice GCC passes don't often call `ggc_collect' themselves, because
it is called by the pass manager between passes.

 At the time of the `ggc_collect' call all pointers in the GC-marked
structures must be valid or `NULL'.  In practice this means that there
should not be uninitialized pointer fields in the structures even if
your code never reads or writes those fields at a particular instance.
One way to ensure this is to use cleared versions of allocators unless
all the fields are initialized manually immediately after allocation.


File: gccint.info,  Node: Troubleshooting,  Prev: Invoking the garbage collector,  Up: Type Information

22.6 Troubleshooting the garbage collector
==========================================

With the current garbage collector implementation, most issues should
show up as GCC compilation errors.  Some of the most commonly
encountered issues are described below.

   * Gengtype does not produce allocators for a `GTY'-marked type.
     Gengtype checks if there is at least one possible path from GC
     roots to at least one instance of each type before outputting
     allocators.  If there is no such path, the `GTY' markers will be
     ignored and no allocators will be output.  Solve this by making
     sure that there exists at least one such path.  If creating it is
     unfeasible or raises a "code smell", consider if you really must
     use GC for allocating such type.

   * Link-time errors about undefined `gt_ggc_r_foo_bar' and
     similarly-named symbols.  Check if your `foo_bar' source file has
     `#include "gt-foo_bar.h"' as its very last line.



File: gccint.info,  Node: Plugins,  Next: LTO,  Prev: Type Information,  Up: Top

23 Plugins
**********

GCC plugin is a loadable module that provides extra features to the
compiler, which they can further pass around as a shareable module.

 GCC plugins provide developers with a rich subset of the GCC API to
allow them to extend GCC as they see fit.  Whether it is writing an
additional optimization pass, transforming code, or analyzing
information, plugins can be quite useful.

* Menu:

* Plugins loading::      How can we load plugins.
* Plugin API::           The APIs for plugins.
* Plugins pass::         How a plugin interact with the pass manager.
* Plugins GC::           How a plugin Interact with GCC Garbage Collector.
* Plugins description::  Giving information about a plugin itself.
* Plugins attr::         Registering custom attributes or pragmas.
* Plugins recording::    Recording information about pass execution.
* Plugins gate::         Controlling which passes are being run.
* Plugins tracking::     Keeping track of available passes.
* Plugins building::     How can we build a plugin.


File: gccint.info,  Node: Plugins loading,  Next: Plugin API,  Up: Plugins

23.1 Loading Plugins
====================

Plugins are supported on platforms that support `-ldl -rdynamic'.  They
are loaded by the compiler using `dlopen' and invoked at pre-determined
locations in the compilation process.

 Plugins are loaded with

 `-fplugin=/path/to/NAME.so' `-fplugin-arg-NAME-KEY1[=VALUE1]'

 The plugin arguments are parsed by GCC and passed to respective
plugins as key-value pairs. Multiple plugins can be invoked by
specifying multiple `-fplugin' arguments.

 A plugin can be simply given by its short name (no dots or slashes).
When simply passing `-fplugin=NAME', the plugin is loaded from the
`plugin' directory, so `-fplugin=NAME' is the same as `-fplugin=`gcc
-print-file-name=plugin`/NAME.so', using backquote shell syntax to
query the `plugin' directory.


File: gccint.info,  Node: Plugin API,  Next: Plugins pass,  Prev: Plugins loading,  Up: Plugins

23.2 Plugin API
===============

Plugins are activated by the compiler at specific events as defined in
`gcc-plugin.h'.  For each event of interest, the plugin should call
`register_callback' specifying the name of the event and address of the
callback function that will handle that event.

 The header `gcc-plugin.h' must be the first gcc header to be included.

23.2.1 Plugin license check
---------------------------

Every plugin should define the global symbol `plugin_is_GPL_compatible'
to assert that it has been licensed under a GPL-compatible license.  If
this symbol does not exist, the compiler will emit a fatal error and
exit with the error message:

     fatal error: plugin NAME is not licensed under a GPL-compatible license
     NAME: undefined symbol: plugin_is_GPL_compatible
     compilation terminated

 The declared type of the symbol should be int, to match a forward
declaration in `gcc-plugin.h' that suppresses C++ mangling.  It does
not need to be in any allocated section, though.  The compiler merely
asserts that the symbol exists in the global scope.  Something like
this is enough:

     int plugin_is_GPL_compatible;

23.2.2 Plugin initialization
----------------------------

Every plugin should export a function called `plugin_init' that is
called right after the plugin is loaded. This function is responsible
for registering all the callbacks required by the plugin and do any
other required initialization.

 This function is called from `compile_file' right before invoking the
parser.  The arguments to `plugin_init' are:

   * `plugin_info': Plugin invocation information.

   * `version': GCC version.

 The `plugin_info' struct is defined as follows:

     struct plugin_name_args
     {
       char *base_name;              /* Short name of the plugin
                                        (filename without .so suffix). */
       const char *full_name;        /* Path to the plugin as specified with
                                        -fplugin=. */
       int argc;                     /* Number of arguments specified with
                                        -fplugin-arg-.... */
       struct plugin_argument *argv; /* Array of ARGC key-value pairs. */
       const char *version;          /* Version string provided by plugin. */
       const char *help;             /* Help string provided by plugin. */
     }

 If initialization fails, `plugin_init' must return a non-zero value.
Otherwise, it should return 0.

 The version of the GCC compiler loading the plugin is described by the
following structure:

     struct plugin_gcc_version
     {
       const char *basever;
       const char *datestamp;
       const char *devphase;
       const char *revision;
       const char *configuration_arguments;
     };

 The function `plugin_default_version_check' takes two pointers to such
structure and compare them field by field. It can be used by the
plugin's `plugin_init' function.

 The version of GCC used to compile the plugin can be found in the
symbol `gcc_version' defined in the header `plugin-version.h'. The
recommended version check to perform looks like

     #include "plugin-version.h"
     ...

     int
     plugin_init (struct plugin_name_args *plugin_info,
                  struct plugin_gcc_version *version)
     {
       if (!plugin_default_version_check (version, &gcc_version))
         return 1;

     }

 but you can also check the individual fields if you want a less strict
check.

23.2.3 Plugin callbacks
-----------------------

Callback functions have the following prototype:

     /* The prototype for a plugin callback function.
          gcc_data  - event-specific data provided by GCC
          user_data - plugin-specific data provided by the plug-in.  */
     typedef void (*plugin_callback_func)(void *gcc_data, void *user_data);

 Callbacks can be invoked at the following pre-determined events:

     enum plugin_event
     {
       PLUGIN_PASS_MANAGER_SETUP,    /* To hook into pass manager.  */
       PLUGIN_FINISH_TYPE,           /* After finishing parsing a type.  */
       PLUGIN_FINISH_DECL,           /* After finishing parsing a declaration. */
       PLUGIN_FINISH_UNIT,           /* Useful for summary processing.  */
       PLUGIN_PRE_GENERICIZE,        /* Allows to see low level AST in C and C++ frontends.  */
       PLUGIN_FINISH,                /* Called before GCC exits.  */
       PLUGIN_INFO,                  /* Information about the plugin. */
       PLUGIN_GGC_START,             /* Called at start of GCC Garbage Collection. */
       PLUGIN_GGC_MARKING,           /* Extend the GGC marking. */
       PLUGIN_GGC_END,               /* Called at end of GGC. */
       PLUGIN_REGISTER_GGC_ROOTS,    /* Register an extra GGC root table. */
       PLUGIN_REGISTER_GGC_CACHES,   /* Register an extra GGC cache table. */
       PLUGIN_ATTRIBUTES,            /* Called during attribute registration */
       PLUGIN_START_UNIT,            /* Called before processing a translation unit.  */
       PLUGIN_PRAGMAS,               /* Called during pragma registration. */
       /* Called before first pass from all_passes.  */
       PLUGIN_ALL_PASSES_START,
       /* Called after last pass from all_passes.  */
       PLUGIN_ALL_PASSES_END,
       /* Called before first ipa pass.  */
       PLUGIN_ALL_IPA_PASSES_START,
       /* Called after last ipa pass.  */
       PLUGIN_ALL_IPA_PASSES_END,
       /* Allows to override pass gate decision for current_pass.  */
       PLUGIN_OVERRIDE_GATE,
       /* Called before executing a pass.  */
       PLUGIN_PASS_EXECUTION,
       /* Called before executing subpasses of a GIMPLE_PASS in
          execute_ipa_pass_list.  */
       PLUGIN_EARLY_GIMPLE_PASSES_START,
       /* Called after executing subpasses of a GIMPLE_PASS in
          execute_ipa_pass_list.  */
       PLUGIN_EARLY_GIMPLE_PASSES_END,
       /* Called when a pass is first instantiated.  */
       PLUGIN_NEW_PASS,

       PLUGIN_EVENT_FIRST_DYNAMIC    /* Dummy event used for indexing callback
                                        array.  */
     };

 In addition, plugins can also look up the enumerator of a named event,
and / or generate new events dynamically, by calling the function
`get_named_event_id'.

 To register a callback, the plugin calls `register_callback' with the
arguments:

   * `char *name': Plugin name.

   * `int event': The event code.

   * `plugin_callback_func callback': The function that handles `event'.

   * `void *user_data': Pointer to plugin-specific data.

 For the PLUGIN_PASS_MANAGER_SETUP, PLUGIN_INFO,
PLUGIN_REGISTER_GGC_ROOTS and PLUGIN_REGISTER_GGC_CACHES pseudo-events
the `callback' should be null, and the `user_data' is specific.

 When the PLUGIN_PRAGMAS event is triggered (with a null pointer as
data from GCC), plugins may register their own pragmas using functions
like `c_register_pragma' or `c_register_pragma_with_expansion'.


File: gccint.info,  Node: Plugins pass,  Next: Plugins GC,  Prev: Plugin API,  Up: Plugins

23.3 Interacting with the pass manager
======================================

There needs to be a way to add/reorder/remove passes dynamically. This
is useful for both analysis plugins (plugging in after a certain pass
such as CFG or an IPA pass) and optimization plugins.

 Basic support for inserting new passes or replacing existing passes is
provided. A plugin registers a new pass with GCC by calling
`register_callback' with the `PLUGIN_PASS_MANAGER_SETUP' event and a
pointer to a `struct register_pass_info' object defined as follows

     enum pass_positioning_ops
     {
       PASS_POS_INSERT_AFTER,  // Insert after the reference pass.
       PASS_POS_INSERT_BEFORE, // Insert before the reference pass.
       PASS_POS_REPLACE        // Replace the reference pass.
     };

     struct register_pass_info
     {
       struct opt_pass *pass;            /* New pass provided by the plugin.  */
       const char *reference_pass_name;  /* Name of the reference pass for hooking
                                            up the new pass.  */
       int ref_pass_instance_number;     /* Insert the pass at the specified
                                            instance number of the reference pass.  */
                                         /* Do it for every instance if it is 0.  */
       enum pass_positioning_ops pos_op; /* how to insert the new pass.  */
     };


     /* Sample plugin code that registers a new pass.  */
     int
     plugin_init (struct plugin_name_args *plugin_info,
                  struct plugin_gcc_version *version)
     {
       struct register_pass_info pass_info;

       ...

       /* Code to fill in the pass_info object with new pass information.  */

       ...

       /* Register the new pass.  */
       register_callback (plugin_info->base_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &pass_info);

       ...
     }


File: gccint.info,  Node: Plugins GC,  Next: Plugins description,  Prev: Plugins pass,  Up: Plugins

23.4 Interacting with the GCC Garbage Collector
===============================================

Some plugins may want to be informed when GGC (the GCC Garbage
Collector) is running. They can register callbacks for the
`PLUGIN_GGC_START' and `PLUGIN_GGC_END' events (for which the callback
is called with a null `gcc_data') to be notified of the start or end of
the GCC garbage collection.

 Some plugins may need to have GGC mark additional data. This can be
done by registering a callback (called with a null `gcc_data') for the
`PLUGIN_GGC_MARKING' event. Such callbacks can call the `ggc_set_mark'
routine, preferably through the `ggc_mark' macro (and conversely, these
routines should usually not be used in plugins outside of the
`PLUGIN_GGC_MARKING' event).

 Some plugins may need to add extra GGC root tables, e.g. to handle
their own `GTY'-ed data. This can be done with the
`PLUGIN_REGISTER_GGC_ROOTS' pseudo-event with a null callback and the
extra root table (of type `struct ggc_root_tab*') as `user_data'.
Plugins that want to use the `if_marked' hash table option can add the
extra GGC cache tables generated by `gengtype' using the
`PLUGIN_REGISTER_GGC_CACHES' pseudo-event with a null callback and the
extra cache table (of type `struct ggc_cache_tab*') as `user_data'.
Running the `gengtype -p SOURCE-DIR FILE-LIST PLUGIN*.C ...' utility
generates these extra root tables.

 You should understand the details of memory management inside GCC
before using `PLUGIN_GGC_MARKING', `PLUGIN_REGISTER_GGC_ROOTS' or
`PLUGIN_REGISTER_GGC_CACHES'.


File: gccint.info,  Node: Plugins description,  Next: Plugins attr,  Prev: Plugins GC,  Up: Plugins

23.5 Giving information about a plugin
======================================

A plugin should give some information to the user about itself. This
uses the following structure:

     struct plugin_info
     {
       const char *version;
       const char *help;
     };

 Such a structure is passed as the `user_data' by the plugin's init
routine using `register_callback' with the `PLUGIN_INFO' pseudo-event
and a null callback.


File: gccint.info,  Node: Plugins attr,  Next: Plugins recording,  Prev: Plugins description,  Up: Plugins

23.6 Registering custom attributes or pragmas
=============================================

For analysis (or other) purposes it is useful to be able to add custom
attributes or pragmas.

 The `PLUGIN_ATTRIBUTES' callback is called during attribute
registration. Use the `register_attribute' function to register custom
attributes.

     /* Attribute handler callback */
     static tree
     handle_user_attribute (tree *node, tree name, tree args,
                            int flags, bool *no_add_attrs)
     {
       return NULL_TREE;
     }

     /* Attribute definition */
     static struct attribute_spec user_attr =
       { "user", 1, 1, false,  false, false, handle_user_attribute, false };

     /* Plugin callback called during attribute registration.
     Registered with register_callback (plugin_name, PLUGIN_ATTRIBUTES, register_attributes, NULL)
     */
     static void
     register_attributes (void *event_data, void *data)
     {
       warning (0, G_("Callback to register attributes"));
       register_attribute (&user_attr);
     }

 The `PLUGIN_PRAGMAS' callback is called during pragmas registration.
Use the `c_register_pragma' or `c_register_pragma_with_expansion'
functions to register custom pragmas.

     /* Plugin callback called during pragmas registration. Registered with
          register_callback (plugin_name, PLUGIN_PRAGMAS,
                             register_my_pragma, NULL);
     */
     static void
     register_my_pragma (void *event_data, void *data)
     {
       warning (0, G_("Callback to register pragmas"));
       c_register_pragma ("GCCPLUGIN", "sayhello", handle_pragma_sayhello);
     }

 It is suggested to pass `"GCCPLUGIN"' (or a short name identifying
your plugin) as the "space" argument of your pragma.


File: gccint.info,  Node: Plugins recording,  Next: Plugins gate,  Prev: Plugins attr,  Up: Plugins

23.7 Recording information about pass execution
===============================================

The event PLUGIN_PASS_EXECUTION passes the pointer to the executed pass
(the same as current_pass) as `gcc_data' to the callback.  You can also
inspect cfun to find out about which function this pass is executed for.
Note that this event will only be invoked if the gate check (if
applicable, modified by PLUGIN_OVERRIDE_GATE) succeeds.  You can use
other hooks, like `PLUGIN_ALL_PASSES_START', `PLUGIN_ALL_PASSES_END',
`PLUGIN_ALL_IPA_PASSES_START', `PLUGIN_ALL_IPA_PASSES_END',
`PLUGIN_EARLY_GIMPLE_PASSES_START', and/or
`PLUGIN_EARLY_GIMPLE_PASSES_END' to manipulate global state in your
plugin(s) in order to get context for the pass execution.


File: gccint.info,  Node: Plugins gate,  Next: Plugins tracking,  Prev: Plugins recording,  Up: Plugins

23.8 Controlling which passes are being run
===========================================

After the original gate function for a pass is called, its result - the
gate status - is stored as an integer.  Then the event
`PLUGIN_OVERRIDE_GATE' is invoked, with a pointer to the gate status in
the `gcc_data' parameter to the callback function.  A nonzero value of
the gate status means that the pass is to be executed.  You can both
read and write the gate status via the passed pointer.


File: gccint.info,  Node: Plugins tracking,  Next: Plugins building,  Prev: Plugins gate,  Up: Plugins

23.9 Keeping track of available passes
======================================

When your plugin is loaded, you can inspect the various pass lists to
determine what passes are available.  However, other plugins might add
new passes.  Also, future changes to GCC might cause generic passes to
be added after plugin loading.  When a pass is first added to one of
the pass lists, the event `PLUGIN_NEW_PASS' is invoked, with the
callback parameter `gcc_data' pointing to the new pass.


File: gccint.info,  Node: Plugins building,  Prev: Plugins tracking,  Up: Plugins

23.10 Building GCC plugins
==========================

If plugins are enabled, GCC installs the headers needed to build a
plugin (somewhere in the installation tree, e.g. under `/usr/local').
In particular a `plugin/include' directory is installed, containing all
the header files needed to build plugins.

 On most systems, you can query this `plugin' directory by invoking
`gcc -print-file-name=plugin' (replace if needed `gcc' with the
appropriate program path).

 Inside plugins, this `plugin' directory name can be queried by calling
`default_plugin_dir_name ()'.

 Plugins may know, when they are compiled, the GCC version for which
`plugin-version.h' is provided.  The constant macros
`GCCPLUGIN_VERSION_MAJOR', `GCCPLUGIN_VERSION_MINOR',
`GCCPLUGIN_VERSION_PATCHLEVEL', `GCCPLUGIN_VERSION' are integer
numbers, so a plugin could ensure it is built for GCC 4.7 with
     #if GCCPLUGIN_VERSION != 4007
     #error this GCC plugin is for GCC 4.7
     #endif

 The following GNU Makefile excerpt shows how to build a simple plugin:

     GCC=gcc
     PLUGIN_SOURCE_FILES= plugin1.c plugin2.c
     PLUGIN_OBJECT_FILES= $(patsubst %.c,%.o,$(PLUGIN_SOURCE_FILES))
     GCCPLUGINS_DIR:= $(shell $(GCC) -print-file-name=plugin)
     CFLAGS+= -I$(GCCPLUGINS_DIR)/include -fPIC -O2

     plugin.so: $(PLUGIN_OBJECT_FILES)
        $(GCC) -shared $^ -o $@

 A single source file plugin may be built with `gcc -I`gcc
-print-file-name=plugin`/include -fPIC -shared -O2 plugin.c -o
plugin.so', using backquote shell syntax to query the `plugin'
directory.

 When a plugin needs to use `gengtype', be sure that both `gengtype'
and `gtype.state' have the same version as the GCC for which the plugin
is built.


File: gccint.info,  Node: LTO,  Next: Funding,  Prev: Plugins,  Up: Top

24 Link Time Optimization
*************************

Link Time Optimization (LTO) gives GCC the capability of dumping its
internal representation (GIMPLE) to disk, so that all the different
compilation units that make up a single executable can be optimized as
a single module.  This expands the scope of inter-procedural
optimizations to encompass the whole program (or, rather, everything
that is visible at link time).

* Menu:

* LTO Overview::            Overview of LTO.
* LTO object file layout::  LTO file sections in ELF.
* IPA::                     Using summary information in IPA passes.
* WHOPR::                   Whole program assumptions,
                            linker plugin and symbol visibilities.
* Internal flags::          Internal flags controlling `lto1'.


File: gccint.info,  Node: LTO Overview,  Next: LTO object file layout,  Up: LTO

24.1 Design Overview
====================

Link time optimization is implemented as a GCC front end for a bytecode
representation of GIMPLE that is emitted in special sections of `.o'
files.  Currently, LTO support is enabled in most ELF-based systems, as
well as darwin, cygwin and mingw systems.

 Since GIMPLE bytecode is saved alongside final object code, object
files generated with LTO support are larger than regular object files.
This "fat" object format makes it easy to integrate LTO into existing
build systems, as one can, for instance, produce archives of the files.
Additionally, one might be able to ship one set of fat objects which
could be used both for development and the production of optimized
builds.  A, perhaps surprising, side effect of this feature is that any
mistake in the toolchain that leads to LTO information not being used
(e.g. an older `libtool' calling `ld' directly).  This is both an
advantage, as the system is more robust, and a disadvantage, as the
user is not informed that the optimization has been disabled.

 The current implementation only produces "fat" objects, effectively
doubling compilation time and increasing file sizes up to 5x the
original size.  This hides the problem that some tools, such as `ar'
and `nm', need to understand symbol tables of LTO sections.  These
tools were extended to use the plugin infrastructure, and with these
problems solved, GCC will also support "slim" objects consisting of the
intermediate code alone.

 At the highest level, LTO splits the compiler in two.  The first half
(the "writer") produces a streaming representation of all the internal
data structures needed to optimize and generate code.  This includes
declarations, types, the callgraph and the GIMPLE representation of
function bodies.

 When `-flto' is given during compilation of a source file, the pass
manager executes all the passes in `all_lto_gen_passes'.  Currently,
this phase is composed of two IPA passes:

   * `pass_ipa_lto_gimple_out' This pass executes the function
     `lto_output' in `lto-streamer-out.c', which traverses the call
     graph encoding every reachable declaration, type and function.
     This generates a memory representation of all the file sections
     described below.

   * `pass_ipa_lto_finish_out' This pass executes the function
     `produce_asm_for_decls' in `lto-streamer-out.c', which takes the
     memory image built in the previous pass and encodes it in the
     corresponding ELF file sections.

 The second half of LTO support is the "reader".  This is implemented
as the GCC front end `lto1' in `lto/lto.c'.  When `collect2' detects a
link set of `.o'/`.a' files with LTO information and the `-flto' is
enabled, it invokes `lto1' which reads the set of files and aggregates
them into a single translation unit for optimization.  The main entry
point for the reader is `lto/lto.c':`lto_main'.

24.1.1 LTO modes of operation
-----------------------------

One of the main goals of the GCC link-time infrastructure was to allow
effective compilation of large programs.  For this reason GCC
implements two link-time compilation modes.

  1. _LTO mode_, in which the whole program is read into the compiler
     at link-time and optimized in a similar way as if it were a single
     source-level compilation unit.

  2. _WHOPR or partitioned mode_, designed to utilize multiple CPUs
     and/or a distributed compilation environment to quickly link large
     applications.  WHOPR stands for WHOle Program optimizeR (not to be
     confused with the semantics of `-fwhole-program').  It partitions
     the aggregated callgraph from many different `.o' files and
     distributes the compilation of the sub-graphs to different CPUs.

     Note that distributed compilation is not implemented yet, but since
     the parallelism is facilitated via generating a `Makefile', it
     would be easy to implement.

 WHOPR splits LTO into three main stages:
  1. Local generation (LGEN) This stage executes in parallel.  Every
     file in the program is compiled into the intermediate language and
     packaged together with the local call-graph and summary
     information.  This stage is the same for both the LTO and WHOPR
     compilation mode.

  2. Whole Program Analysis (WPA) WPA is performed sequentially.  The
     global call-graph is generated, and a global analysis procedure
     makes transformation decisions.  The global call-graph is
     partitioned to facilitate parallel optimization during phase 3.
     The results of the WPA stage are stored into new object files
     which contain the partitions of program expressed in the
     intermediate language and the optimization decisions.

  3. Local transformations (LTRANS) This stage executes in parallel.
     All the decisions made during phase 2 are implemented locally in
     each partitioned object file, and the final object code is
     generated.  Optimizations which cannot be decided efficiently
     during the phase 2 may be performed on the local call-graph
     partitions.

 WHOPR can be seen as an extension of the usual LTO mode of
compilation.  In LTO, WPA and LTRANS are executed within a single
execution of the compiler, after the whole program has been read into
memory.

 When compiling in WHOPR mode, the callgraph is partitioned during the
WPA stage.  The whole program is split into a given number of
partitions of roughly the same size.  The compiler tries to minimize
the number of references which cross partition boundaries.  The main
advantage of WHOPR is to allow the parallel execution of LTRANS stages,
which are the most time-consuming part of the compilation process.
Additionally, it avoids the need to load the whole program into memory.


File: gccint.info,  Node: LTO object file layout,  Next: IPA,  Prev: LTO Overview,  Up: LTO

24.2 LTO file sections
======================

LTO information is stored in several ELF sections inside object files.
Data structures and enum codes for sections are defined in
`lto-streamer.h'.

 These sections are emitted from `lto-streamer-out.c' and mapped in all
at once from `lto/lto.c':`lto_file_read'.  The individual functions
dealing with the reading/writing of each section are described below.

   * Command line options (`.gnu.lto_.opts')

     This section contains the command line options used to generate the
     object files.  This is used at link time to determine the
     optimization level and other settings when they are not explicitly
     specified at the linker command line.

     Currently, GCC does not support combining LTO object files compiled
     with different set of the command line options into a single
     binary.  At link time, the options given on the command line and
     the options saved on all the files in a link-time set are applied
     globally.  No attempt is made at validating the combination of
     flags (other than the usual validation done by option processing).
     This is implemented in `lto/lto.c':`lto_read_all_file_options'.

   * Symbol table (`.gnu.lto_.symtab')

     This table replaces the ELF symbol table for functions and
     variables represented in the LTO IL.  Symbols used and exported by
     the optimized assembly code of "fat" objects might not match the
     ones used and exported by the intermediate code.  This table is
     necessary because the intermediate code is less optimized and thus
     requires a separate symbol table.

     Additionally, the binary code in the "fat" object will lack a call
     to a function, since the call was optimized out at compilation time
     after the intermediate language was streamed out.  In some special
     cases, the same optimization may not happen during link-time
     optimization.  This would lead to an undefined symbol if only one
     symbol table was used.

     The symbol table is emitted in
     `lto-streamer-out.c':`produce_symtab'.

   * Global declarations and types (`.gnu.lto_.decls')

     This section contains an intermediate language dump of all
     declarations and types required to represent the callgraph, static
     variables and top-level debug info.

     The contents of this section are emitted in
     `lto-streamer-out.c':`produce_asm_for_decls'.  Types and symbols
     are emitted in a topological order that preserves the sharing of
     pointers when the file is read back in
     (`lto.c':`read_cgraph_and_symbols').

   * The callgraph (`.gnu.lto_.cgraph')

     This section contains the basic data structure used by the GCC
     inter-procedural optimization infrastructure.  This section stores
     an annotated multi-graph which represents the functions and call
     sites as well as the variables, aliases and top-level `asm'
     statements.

     This section is emitted in `lto-streamer-out.c':`output_cgraph'
     and read in `lto-cgraph.c':`input_cgraph'.

   * IPA references (`.gnu.lto_.refs')

     This section contains references between function and static
     variables.  It is emitted by `lto-cgraph.c':`output_refs' and read
     by `lto-cgraph.c':`input_refs'.

   * Function bodies (`.gnu.lto_.function_body.<name>')

     This section contains function bodies in the intermediate language
     representation.  Every function body is in a separate section to
     allow copying of the section independently to different object
     files or reading the function on demand.

     Functions are emitted in `lto-streamer-out.c':`output_function'
     and read in `lto-streamer-in.c':`input_function'.

   * Static variable initializers (`.gnu.lto_.vars')

     This section contains all the symbols in the global variable pool.
     It is emitted by `lto-cgraph.c':`output_varpool' and read in
     `lto-cgraph.c':`input_cgraph'.

   * Summaries and optimization summaries used by IPA passes
     (`.gnu.lto_.<xxx>', where `<xxx>' is one of `jmpfuncs',
     `pureconst' or `reference')

     These sections are used by IPA passes that need to emit summary
     information during LTO generation to be read and aggregated at
     link time.  Each pass is responsible for implementing two pass
     manager hooks: one for writing the summary and another for reading
     it in.  The format of these sections is entirely up to each
     individual pass.  The only requirement is that the writer and
     reader hooks agree on the format.


File: gccint.info,  Node: IPA,  Next: WHOPR,  Prev: LTO object file layout,  Up: LTO

24.3 Using summary information in IPA passes
============================================

Programs are represented internally as a _callgraph_ (a multi-graph
where nodes are functions and edges are call sites) and a _varpool_ (a
list of static and external variables in the program).

 The inter-procedural optimization is organized as a sequence of
individual passes, which operate on the callgraph and the varpool.  To
make the implementation of WHOPR possible, every inter-procedural
optimization pass is split into several stages that are executed at
different times during WHOPR compilation:

   * LGEN time
       1. _Generate summary_ (`generate_summary' in `struct
          ipa_opt_pass_d').  This stage analyzes every function body
          and variable initializer is examined and stores relevant
          information into a pass-specific data structure.

       2. _Write summary_ (`write_summary' in `struct ipa_opt_pass_d').
          This stage writes all the pass-specific information generated
          by `generate_summary'.  Summaries go into their own
          `LTO_section_*' sections that have to be declared in
          `lto-streamer.h':`enum lto_section_type'.  A new section is
          created by calling `create_output_block' and data can be
          written using the `lto_output_*' routines.

   * WPA time
       1. _Read summary_ (`read_summary' in `struct ipa_opt_pass_d').
          This stage reads all the pass-specific information in exactly
          the same order that it was written by `write_summary'.

       2. _Execute_ (`execute' in `struct opt_pass').  This performs
          inter-procedural propagation.  This must be done without
          actual access to the individual function bodies or variable
          initializers.  Typically, this results in a transitive
          closure operation over the summary information of all the
          nodes in the callgraph.

       3. _Write optimization summary_ (`write_optimization_summary' in
          `struct ipa_opt_pass_d').  This writes the result of the
          inter-procedural propagation into the object file.  This can
          use the same data structures and helper routines used in
          `write_summary'.

   * LTRANS time
       1. _Read optimization summary_ (`read_optimization_summary' in
          `struct ipa_opt_pass_d').  The counterpart to
          `write_optimization_summary'.  This reads the interprocedural
          optimization decisions in exactly the same format emitted by
          `write_optimization_summary'.

       2. _Transform_ (`function_transform' and `variable_transform' in
          `struct ipa_opt_pass_d').  The actual function bodies and
          variable initializers are updated based on the information
          passed down from the _Execute_ stage.

 The implementation of the inter-procedural passes are shared between
LTO, WHOPR and classic non-LTO compilation.

   * During the traditional file-by-file mode every pass executes its
     own _Generate summary_, _Execute_, and _Transform_ stages within
     the single execution context of the compiler.

   * In LTO compilation mode, every pass uses _Generate summary_ and
     _Write summary_ stages at compilation time, while the _Read
     summary_, _Execute_, and _Transform_ stages are executed at link
     time.

   * In WHOPR mode all stages are used.

 To simplify development, the GCC pass manager differentiates between
normal inter-procedural passes and small inter-procedural passes.  A
_small inter-procedural pass_ (`SIMPLE_IPA_PASS') is a pass that does
everything at once and thus it can not be executed during WPA in WHOPR
mode.  It defines only the _Execute_ stage and during this stage it
accesses and modifies the function bodies.  Such passes are useful for
optimization at LGEN or LTRANS time and are used, for example, to
implement early optimization before writing object files.  The simple
inter-procedural passes can also be used for easier prototyping and
development of a new inter-procedural pass.

24.3.1 Virtual clones
---------------------

One of the main challenges of introducing the WHOPR compilation mode
was addressing the interactions between optimization passes.  In LTO
compilation mode, the passes are executed in a sequence, each of which
consists of analysis (or _Generate summary_), propagation (or
_Execute_) and _Transform_ stages.  Once the work of one pass is
finished, the next pass sees the updated program representation and can
execute.  This makes the individual passes dependent on each other.

 In WHOPR mode all passes first execute their _Generate summary_ stage.
Then summary writing marks the end of the LGEN stage.  At WPA time, the
summaries are read back into memory and all passes run the _Execute_
stage.  Optimization summaries are streamed and sent to LTRANS, where
all the passes execute the _Transform_ stage.

 Most optimization passes split naturally into analysis, propagation
and transformation stages.  But some do not.  The main problem arises
when one pass performs changes and the following pass gets confused by
seeing different callgraphs between the _Transform_ stage and the
_Generate summary_ or _Execute_ stage.  This means that the passes are
required to communicate their decisions with each other.

 To facilitate this communication, the GCC callgraph infrastructure
implements _virtual clones_, a method of representing the changes
performed by the optimization passes in the callgraph without needing
to update function bodies.

 A _virtual clone_ in the callgraph is a function that has no
associated body, just a description of how to create its body based on
a different function (which itself may be a virtual clone).

 The description of function modifications includes adjustments to the
function's signature (which allows, for example, removing or adding
function arguments), substitutions to perform on the function body,
and, for inlined functions, a pointer to the function that it will be
inlined into.

 It is also possible to redirect any edge of the callgraph from a
function to its virtual clone.  This implies updating of the call site
to adjust for the new function signature.

 Most of the transformations performed by inter-procedural
optimizations can be represented via virtual clones.  For instance, a
constant propagation pass can produce a virtual clone of the function
which replaces one of its arguments by a constant.  The inliner can
represent its decisions by producing a clone of a function whose body
will be later integrated into a given function.

 Using _virtual clones_, the program can be easily updated during the
_Execute_ stage, solving most of pass interactions problems that would
otherwise occur during _Transform_.

 Virtual clones are later materialized in the LTRANS stage and turned
into real functions.  Passes executed after the virtual clone were
introduced also perform their _Transform_ stage on new functions, so
for a pass there is no significant difference between operating on a
real function or a virtual clone introduced before its _Execute_ stage.

 Optimization passes then work on virtual clones introduced before
their _Execute_ stage as if they were real functions.  The only
difference is that clones are not visible during the _Generate Summary_
stage.

 To keep function summaries updated, the callgraph interface allows an
optimizer to register a callback that is called every time a new clone
is introduced as well as when the actual function or variable is
generated or when a function or variable is removed.  These hooks are
registered in the _Generate summary_ stage and allow the pass to keep
its information intact until the _Execute_ stage.  The same hooks can
also be registered during the _Execute_ stage to keep the optimization
summaries updated for the _Transform_ stage.

24.3.2 IPA references
---------------------

GCC represents IPA references in the callgraph.  For a function or
variable `A', the _IPA reference_ is a list of all locations where the
address of `A' is taken and, when `A' is a variable, a list of all
direct stores and reads to/from `A'.  References represent an oriented
multi-graph on the union of nodes of the callgraph and the varpool.  See
`ipa-reference.c':`ipa_reference_write_optimization_summary' and
`ipa-reference.c':`ipa_reference_read_optimization_summary' for details.

24.3.3 Jump functions
---------------------

Suppose that an optimization pass sees a function `A' and it knows the
values of (some of) its arguments.  The _jump function_ describes the
value of a parameter of a given function call in function `A' based on
this knowledge.

 Jump functions are used by several optimizations, such as the
inter-procedural constant propagation pass and the devirtualization
pass.  The inliner also uses jump functions to perform inlining of
callbacks.


File: gccint.info,  Node: WHOPR,  Next: Internal flags,  Prev: IPA,  Up: LTO

24.4 Whole program assumptions, linker plugin and symbol visibilities
=====================================================================

Link-time optimization gives relatively minor benefits when used alone.
The problem is that propagation of inter-procedural information does
not work well across functions and variables that are called or
referenced by other compilation units (such as from a dynamically
linked library).  We say that such functions and variables are
_externally visible_.

 To make the situation even more difficult, many applications organize
themselves as a set of shared libraries, and the default ELF visibility
rules allow one to overwrite any externally visible symbol with a
different symbol at runtime.  This basically disables any optimizations
across such functions and variables, because the compiler cannot be
sure that the function body it is seeing is the same function body that
will be used at runtime.  Any function or variable not declared
`static' in the sources degrades the quality of inter-procedural
optimization.

 To avoid this problem the compiler must assume that it sees the whole
program when doing link-time optimization.  Strictly speaking, the
whole program is rarely visible even at link-time.  Standard system
libraries are usually linked dynamically or not provided with the
link-time information.  In GCC, the whole program option
(`-fwhole-program') asserts that every function and variable defined in
the current compilation unit is static, except for function `main'
(note: at link time, the current unit is the union of all objects
compiled with LTO).  Since some functions and variables need to be
referenced externally, for example by another DSO or from an assembler
file, GCC also provides the function and variable attribute
`externally_visible' which can be used to disable the effect of
`-fwhole-program' on a specific symbol.

 The whole program mode assumptions are slightly more complex in C++,
where inline functions in headers are put into _COMDAT_ sections.
COMDAT function and variables can be defined by multiple object files
and their bodies are unified at link-time and dynamic link-time.
COMDAT functions are changed to local only when their address is not
taken and thus un-sharing them with a library is not harmful.  COMDAT
variables always remain externally visible, however for readonly
variables it is assumed that their initializers cannot be overwritten
by a different value.

 GCC provides the function and variable attribute `visibility' that can
be used to specify the visibility of externally visible symbols (or
alternatively an `-fdefault-visibility' command line option).  ELF
defines the `default', `protected', `hidden' and `internal'
visibilities.

 The most commonly used is visibility is `hidden'.  It specifies that
the symbol cannot be referenced from outside of the current shared
library.  Unfortunately, this information cannot be used directly by
the link-time optimization in the compiler since the whole shared
library also might contain non-LTO objects and those are not visible to
the compiler.

 GCC solves this problem using linker plugins.  A _linker plugin_ is an
interface to the linker that allows an external program to claim the
ownership of a given object file.  The linker then performs the linking
procedure by querying the plugin about the symbol table of the claimed
objects and once the linking decisions are complete, the plugin is
allowed to provide the final object file before the actual linking is
made.  The linker plugin obtains the symbol resolution information
which specifies which symbols provided by the claimed objects are bound
from the rest of a binary being linked.

 Currently, the linker plugin  works only in combination with the Gold
linker, but a GNU ld implementation is under development.

 GCC is designed to be independent of the rest of the toolchain and
aims to support linkers without plugin support.  For this reason it
does not use the linker plugin by default.  Instead, the object files
are examined by `collect2' before being passed to the linker and
objects found to have LTO sections are passed to `lto1' first.  This
mode does not work for library archives.  The decision on what object
files from the archive are needed depends on the actual linking and
thus GCC would have to implement the linker itself.  The resolution
information is missing too and thus GCC needs to make an educated guess
based on `-fwhole-program'.  Without the linker plugin GCC also assumes
that symbols are declared `hidden' and not referred by non-LTO code by
default.


File: gccint.info,  Node: Internal flags,  Prev: WHOPR,  Up: LTO

24.5 Internal flags controlling `lto1'
======================================

The following flags are passed into `lto1' and are not meant to be used
directly from the command line.

   * -fwpa This option runs the serial part of the link-time optimizer
     performing the inter-procedural propagation (WPA mode).  The
     compiler reads in summary information from all inputs and performs
     an analysis based on summary information only.  It generates
     object files for subsequent runs of the link-time optimizer where
     individual object files are optimized using both summary
     information from the WPA mode and the actual function bodies.  It
     then drives the LTRANS phase.

   * -fltrans This option runs the link-time optimizer in the
     local-transformation (LTRANS) mode, which reads in output from a
     previous run of the LTO in WPA mode.  In the LTRANS mode, LTO
     optimizes an object and produces the final assembly.

   * -fltrans-output-list=FILE This option specifies a file to which
     the names of LTRANS output files are written.  This option is only
     meaningful in conjunction with `-fwpa'.


File: gccint.info,  Node: Funding,  Next: GNU Project,  Prev: LTO,  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: gccint.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: gccint.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: gccint.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: gccint.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: gccint.info,  Node: Option Index,  Next: Concept 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:

* fltrans:                               Internal flags.       (line 18)
* fltrans-output-list:                   Internal flags.       (line 23)
* fwpa:                                  Internal flags.       (line  9)
* msoft-float:                           Soft float library routines.
                                                               (line  6)


File: gccint.info,  Node: Concept Index,  Prev: Option Index,  Up: Top

Concept Index
*************

 [index ]
* Menu:

* ! in constraint:                       Multi-Alternative.  (line   47)
* # in constraint:                       Modifiers.          (line   67)
* # in template:                         Output Template.    (line   66)
* #pragma:                               Misc.               (line  379)
* % in constraint:                       Modifiers.          (line   45)
* % in GTY option:                       GTY Options.        (line   18)
* % in template:                         Output Template.    (line    6)
* & in constraint:                       Modifiers.          (line   25)
* (nil):                                 RTL Objects.        (line   73)
* * in constraint:                       Modifiers.          (line   72)
* * in template:                         Output Statement.   (line   29)
* + in constraint:                       Modifiers.          (line   12)
* -fsection-anchors <1>:                 Anchored Addresses. (line    6)
* -fsection-anchors:                     Special Accessors.  (line  120)
* /c in RTL dump:                        Flags.              (line  221)
* /f in RTL dump:                        Flags.              (line  229)
* /i in RTL dump:                        Flags.              (line  274)
* /j in RTL dump:                        Flags.              (line  286)
* /s in RTL dump:                        Flags.              (line  245)
* /u in RTL dump:                        Flags.              (line  296)
* /v in RTL dump:                        Flags.              (line  328)
* 0 in constraint:                       Simple Constraints. (line  130)
* < in constraint:                       Simple Constraints. (line   48)
* = in constraint:                       Modifiers.          (line    8)
* > in constraint:                       Simple Constraints. (line   61)
* ? in constraint:                       Multi-Alternative.  (line   41)
* \:                                     Output Template.    (line   46)
* __absvdi2:                             Integer library routines.
                                                             (line  107)
* __absvsi2:                             Integer library routines.
                                                             (line  106)
* __addda3:                              Fixed-point fractional library routines.
                                                             (line   45)
* __adddf3:                              Soft float library routines.
                                                             (line   23)
* __adddq3:                              Fixed-point fractional library routines.
                                                             (line   33)
* __addha3:                              Fixed-point fractional library routines.
                                                             (line   43)
* __addhq3:                              Fixed-point fractional library routines.
                                                             (line   30)
* __addqq3:                              Fixed-point fractional library routines.
                                                             (line   29)
* __addsa3:                              Fixed-point fractional library routines.
                                                             (line   44)
* __addsf3:                              Soft float library routines.
                                                             (line   22)
* __addsq3:                              Fixed-point fractional library routines.
                                                             (line   31)
* __addta3:                              Fixed-point fractional library routines.
                                                             (line   47)
* __addtf3:                              Soft float library routines.
                                                             (line   25)
* __adduda3:                             Fixed-point fractional library routines.
                                                             (line   53)
* __addudq3:                             Fixed-point fractional library routines.
                                                             (line   41)
* __adduha3:                             Fixed-point fractional library routines.
                                                             (line   49)
* __adduhq3:                             Fixed-point fractional library routines.
                                                             (line   37)
* __adduqq3:                             Fixed-point fractional library routines.
                                                             (line   35)
* __addusa3:                             Fixed-point fractional library routines.
                                                             (line   51)
* __addusq3:                             Fixed-point fractional library routines.
                                                             (line   39)
* __adduta3:                             Fixed-point fractional library routines.
                                                             (line   55)
* __addvdi3:                             Integer library routines.
                                                             (line  111)
* __addvsi3:                             Integer library routines.
                                                             (line  110)
* __addxf3:                              Soft float library routines.
                                                             (line   27)
* __ashlda3:                             Fixed-point fractional library routines.
                                                             (line  351)
* __ashldi3:                             Integer library routines.
                                                             (line   14)
* __ashldq3:                             Fixed-point fractional library routines.
                                                             (line  340)
* __ashlha3:                             Fixed-point fractional library routines.
                                                             (line  349)
* __ashlhq3:                             Fixed-point fractional library routines.
                                                             (line  337)
* __ashlqq3:                             Fixed-point fractional library routines.
                                                             (line  336)
* __ashlsa3:                             Fixed-point fractional library routines.
                                                             (line  350)
* __ashlsi3:                             Integer library routines.
                                                             (line   13)
* __ashlsq3:                             Fixed-point fractional library routines.
                                                             (line  338)
* __ashlta3:                             Fixed-point fractional library routines.
                                                             (line  353)
* __ashlti3:                             Integer library routines.
                                                             (line   15)
* __ashluda3:                            Fixed-point fractional library routines.
                                                             (line  359)
* __ashludq3:                            Fixed-point fractional library routines.
                                                             (line  348)
* __ashluha3:                            Fixed-point fractional library routines.
                                                             (line  355)
* __ashluhq3:                            Fixed-point fractional library routines.
                                                             (line  344)
* __ashluqq3:                            Fixed-point fractional library routines.
                                                             (line  342)
* __ashlusa3:                            Fixed-point fractional library routines.
                                                             (line  357)
* __ashlusq3:                            Fixed-point fractional library routines.
                                                             (line  346)
* __ashluta3:                            Fixed-point fractional library routines.
                                                             (line  361)
* __ashrda3:                             Fixed-point fractional library routines.
                                                             (line  371)
* __ashrdi3:                             Integer library routines.
                                                             (line   19)
* __ashrdq3:                             Fixed-point fractional library routines.
                                                             (line  368)
* __ashrha3:                             Fixed-point fractional library routines.
                                                             (line  369)
* __ashrhq3:                             Fixed-point fractional library routines.
                                                             (line  365)
* __ashrqq3:                             Fixed-point fractional library routines.
                                                             (line  364)
* __ashrsa3:                             Fixed-point fractional library routines.
                                                             (line  370)
* __ashrsi3:                             Integer library routines.
                                                             (line   18)
* __ashrsq3:                             Fixed-point fractional library routines.
                                                             (line  366)
* __ashrta3:                             Fixed-point fractional library routines.
                                                             (line  373)
* __ashrti3:                             Integer library routines.
                                                             (line   20)
* __bid_adddd3:                          Decimal float library routines.
                                                             (line   25)
* __bid_addsd3:                          Decimal float library routines.
                                                             (line   21)
* __bid_addtd3:                          Decimal float library routines.
                                                             (line   29)
* __bid_divdd3:                          Decimal float library routines.
                                                             (line   68)
* __bid_divsd3:                          Decimal float library routines.
                                                             (line   64)
* __bid_divtd3:                          Decimal float library routines.
                                                             (line   72)
* __bid_eqdd2:                           Decimal float library routines.
                                                             (line  259)
* __bid_eqsd2:                           Decimal float library routines.
                                                             (line  257)
* __bid_eqtd2:                           Decimal float library routines.
                                                             (line  261)
* __bid_extendddtd2:                     Decimal float library routines.
                                                             (line   92)
* __bid_extendddtf:                      Decimal float library routines.
                                                             (line  140)
* __bid_extendddxf:                      Decimal float library routines.
                                                             (line  134)
* __bid_extenddfdd:                      Decimal float library routines.
                                                             (line  147)
* __bid_extenddftd:                      Decimal float library routines.
                                                             (line  107)
* __bid_extendsddd2:                     Decimal float library routines.
                                                             (line   88)
* __bid_extendsddf:                      Decimal float library routines.
                                                             (line  128)
* __bid_extendsdtd2:                     Decimal float library routines.
                                                             (line   90)
* __bid_extendsdtf:                      Decimal float library routines.
                                                             (line  138)
* __bid_extendsdxf:                      Decimal float library routines.
                                                             (line  132)
* __bid_extendsfdd:                      Decimal float library routines.
                                                             (line  103)
* __bid_extendsfsd:                      Decimal float library routines.
                                                             (line  145)
* __bid_extendsftd:                      Decimal float library routines.
                                                             (line  105)
* __bid_extendtftd:                      Decimal float library routines.
                                                             (line  149)
* __bid_extendxftd:                      Decimal float library routines.
                                                             (line  109)
* __bid_fixdddi:                         Decimal float library routines.
                                                             (line  170)
* __bid_fixddsi:                         Decimal float library routines.
                                                             (line  162)
* __bid_fixsddi:                         Decimal float library routines.
                                                             (line  168)
* __bid_fixsdsi:                         Decimal float library routines.
                                                             (line  160)
* __bid_fixtddi:                         Decimal float library routines.
                                                             (line  172)
* __bid_fixtdsi:                         Decimal float library routines.
                                                             (line  164)
* __bid_fixunsdddi:                      Decimal float library routines.
                                                             (line  187)
* __bid_fixunsddsi:                      Decimal float library routines.
                                                             (line  178)
* __bid_fixunssddi:                      Decimal float library routines.
                                                             (line  185)
* __bid_fixunssdsi:                      Decimal float library routines.
                                                             (line  176)
* __bid_fixunstddi:                      Decimal float library routines.
                                                             (line  189)
* __bid_fixunstdsi:                      Decimal float library routines.
                                                             (line  180)
* __bid_floatdidd:                       Decimal float library routines.
                                                             (line  205)
* __bid_floatdisd:                       Decimal float library routines.
                                                             (line  203)
* __bid_floatditd:                       Decimal float library routines.
                                                             (line  207)
* __bid_floatsidd:                       Decimal float library routines.
                                                             (line  196)
* __bid_floatsisd:                       Decimal float library routines.
                                                             (line  194)
* __bid_floatsitd:                       Decimal float library routines.
                                                             (line  198)
* __bid_floatunsdidd:                    Decimal float library routines.
                                                             (line  223)
* __bid_floatunsdisd:                    Decimal float library routines.
                                                             (line  221)
* __bid_floatunsditd:                    Decimal float library routines.
                                                             (line  225)
* __bid_floatunssidd:                    Decimal float library routines.
                                                             (line  214)
* __bid_floatunssisd:                    Decimal float library routines.
                                                             (line  212)
* __bid_floatunssitd:                    Decimal float library routines.
                                                             (line  216)
* __bid_gedd2:                           Decimal float library routines.
                                                             (line  277)
* __bid_gesd2:                           Decimal float library routines.
                                                             (line  275)
* __bid_getd2:                           Decimal float library routines.
                                                             (line  279)
* __bid_gtdd2:                           Decimal float library routines.
                                                             (line  304)
* __bid_gtsd2:                           Decimal float library routines.
                                                             (line  302)
* __bid_gttd2:                           Decimal float library routines.
                                                             (line  306)
* __bid_ledd2:                           Decimal float library routines.
                                                             (line  295)
* __bid_lesd2:                           Decimal float library routines.
                                                             (line  293)
* __bid_letd2:                           Decimal float library routines.
                                                             (line  297)
* __bid_ltdd2:                           Decimal float library routines.
                                                             (line  286)
* __bid_ltsd2:                           Decimal float library routines.
                                                             (line  284)
* __bid_lttd2:                           Decimal float library routines.
                                                             (line  288)
* __bid_muldd3:                          Decimal float library routines.
                                                             (line   54)
* __bid_mulsd3:                          Decimal float library routines.
                                                             (line   50)
* __bid_multd3:                          Decimal float library routines.
                                                             (line   58)
* __bid_nedd2:                           Decimal float library routines.
                                                             (line  268)
* __bid_negdd2:                          Decimal float library routines.
                                                             (line   78)
* __bid_negsd2:                          Decimal float library routines.
                                                             (line   76)
* __bid_negtd2:                          Decimal float library routines.
                                                             (line   80)
* __bid_nesd2:                           Decimal float library routines.
                                                             (line  266)
* __bid_netd2:                           Decimal float library routines.
                                                             (line  270)
* __bid_subdd3:                          Decimal float library routines.
                                                             (line   39)
* __bid_subsd3:                          Decimal float library routines.
                                                             (line   35)
* __bid_subtd3:                          Decimal float library routines.
                                                             (line   43)
* __bid_truncdddf:                       Decimal float library routines.
                                                             (line  153)
* __bid_truncddsd2:                      Decimal float library routines.
                                                             (line   94)
* __bid_truncddsf:                       Decimal float library routines.
                                                             (line  124)
* __bid_truncdfsd:                       Decimal float library routines.
                                                             (line  111)
* __bid_truncsdsf:                       Decimal float library routines.
                                                             (line  151)
* __bid_trunctddd2:                      Decimal float library routines.
                                                             (line   98)
* __bid_trunctddf:                       Decimal float library routines.
                                                             (line  130)
* __bid_trunctdsd2:                      Decimal float library routines.
                                                             (line   96)
* __bid_trunctdsf:                       Decimal float library routines.
                                                             (line  126)
* __bid_trunctdtf:                       Decimal float library routines.
                                                             (line  155)
* __bid_trunctdxf:                       Decimal float library routines.
                                                             (line  136)
* __bid_trunctfdd:                       Decimal float library routines.
                                                             (line  119)
* __bid_trunctfsd:                       Decimal float library routines.
                                                             (line  115)
* __bid_truncxfdd:                       Decimal float library routines.
                                                             (line  117)
* __bid_truncxfsd:                       Decimal float library routines.
                                                             (line  113)
* __bid_unorddd2:                        Decimal float library routines.
                                                             (line  235)
* __bid_unordsd2:                        Decimal float library routines.
                                                             (line  233)
* __bid_unordtd2:                        Decimal float library routines.
                                                             (line  237)
* __bswapdi2:                            Integer library routines.
                                                             (line  162)
* __bswapsi2:                            Integer library routines.
                                                             (line  161)
* __builtin_classify_type:               Varargs.            (line   51)
* __builtin_next_arg:                    Varargs.            (line   42)
* __builtin_saveregs:                    Varargs.            (line   24)
* __clear_cache:                         Miscellaneous routines.
                                                             (line   10)
* __clzdi2:                              Integer library routines.
                                                             (line  131)
* __clzsi2:                              Integer library routines.
                                                             (line  130)
* __clzti2:                              Integer library routines.
                                                             (line  132)
* __cmpda2:                              Fixed-point fractional library routines.
                                                             (line  451)
* __cmpdf2:                              Soft float library routines.
                                                             (line  164)
* __cmpdi2:                              Integer library routines.
                                                             (line   87)
* __cmpdq2:                              Fixed-point fractional library routines.
                                                             (line  441)
* __cmpha2:                              Fixed-point fractional library routines.
                                                             (line  449)
* __cmphq2:                              Fixed-point fractional library routines.
                                                             (line  438)
* __cmpqq2:                              Fixed-point fractional library routines.
                                                             (line  437)
* __cmpsa2:                              Fixed-point fractional library routines.
                                                             (line  450)
* __cmpsf2:                              Soft float library routines.
                                                             (line  163)
* __cmpsq2:                              Fixed-point fractional library routines.
                                                             (line  439)
* __cmpta2:                              Fixed-point fractional library routines.
                                                             (line  453)
* __cmptf2:                              Soft float library routines.
                                                             (line  165)
* __cmpti2:                              Integer library routines.
                                                             (line   88)
* __cmpuda2:                             Fixed-point fractional library routines.
                                                             (line  458)
* __cmpudq2:                             Fixed-point fractional library routines.
                                                             (line  448)
* __cmpuha2:                             Fixed-point fractional library routines.
                                                             (line  455)
* __cmpuhq2:                             Fixed-point fractional library routines.
                                                             (line  444)
* __cmpuqq2:                             Fixed-point fractional library routines.
                                                             (line  443)
* __cmpusa2:                             Fixed-point fractional library routines.
                                                             (line  456)
* __cmpusq2:                             Fixed-point fractional library routines.
                                                             (line  446)
* __cmputa2:                             Fixed-point fractional library routines.
                                                             (line  460)
* __CTOR_LIST__:                         Initialization.     (line   25)
* __ctzdi2:                              Integer library routines.
                                                             (line  138)
* __ctzsi2:                              Integer library routines.
                                                             (line  137)
* __ctzti2:                              Integer library routines.
                                                             (line  139)
* __divda3:                              Fixed-point fractional library routines.
                                                             (line  227)
* __divdc3:                              Soft float library routines.
                                                             (line  252)
* __divdf3:                              Soft float library routines.
                                                             (line   48)
* __divdi3:                              Integer library routines.
                                                             (line   25)
* __divdq3:                              Fixed-point fractional library routines.
                                                             (line  223)
* __divha3:                              Fixed-point fractional library routines.
                                                             (line  225)
* __divhq3:                              Fixed-point fractional library routines.
                                                             (line  220)
* __divqq3:                              Fixed-point fractional library routines.
                                                             (line  219)
* __divsa3:                              Fixed-point fractional library routines.
                                                             (line  226)
* __divsc3:                              Soft float library routines.
                                                             (line  250)
* __divsf3:                              Soft float library routines.
                                                             (line   47)
* __divsi3:                              Integer library routines.
                                                             (line   24)
* __divsq3:                              Fixed-point fractional library routines.
                                                             (line  221)
* __divta3:                              Fixed-point fractional library routines.
                                                             (line  229)
* __divtc3:                              Soft float library routines.
                                                             (line  254)
* __divtf3:                              Soft float library routines.
                                                             (line   50)
* __divti3:                              Integer library routines.
                                                             (line   26)
* __divxc3:                              Soft float library routines.
                                                             (line  256)
* __divxf3:                              Soft float library routines.
                                                             (line   52)
* __dpd_adddd3:                          Decimal float library routines.
                                                             (line   23)
* __dpd_addsd3:                          Decimal float library routines.
                                                             (line   19)
* __dpd_addtd3:                          Decimal float library routines.
                                                             (line   27)
* __dpd_divdd3:                          Decimal float library routines.
                                                             (line   66)
* __dpd_divsd3:                          Decimal float library routines.
                                                             (line   62)
* __dpd_divtd3:                          Decimal float library routines.
                                                             (line   70)
* __dpd_eqdd2:                           Decimal float library routines.
                                                             (line  258)
* __dpd_eqsd2:                           Decimal float library routines.
                                                             (line  256)
* __dpd_eqtd2:                           Decimal float library routines.
                                                             (line  260)
* __dpd_extendddtd2:                     Decimal float library routines.
                                                             (line   91)
* __dpd_extendddtf:                      Decimal float library routines.
                                                             (line  139)
* __dpd_extendddxf:                      Decimal float library routines.
                                                             (line  133)
* __dpd_extenddfdd:                      Decimal float library routines.
                                                             (line  146)
* __dpd_extenddftd:                      Decimal float library routines.
                                                             (line  106)
* __dpd_extendsddd2:                     Decimal float library routines.
                                                             (line   87)
* __dpd_extendsddf:                      Decimal float library routines.
                                                             (line  127)
* __dpd_extendsdtd2:                     Decimal float library routines.
                                                             (line   89)
* __dpd_extendsdtf:                      Decimal float library routines.
                                                             (line  137)
* __dpd_extendsdxf:                      Decimal float library routines.
                                                             (line  131)
* __dpd_extendsfdd:                      Decimal float library routines.
                                                             (line  102)
* __dpd_extendsfsd:                      Decimal float library routines.
                                                             (line  144)
* __dpd_extendsftd:                      Decimal float library routines.
                                                             (line  104)
* __dpd_extendtftd:                      Decimal float library routines.
                                                             (line  148)
* __dpd_extendxftd:                      Decimal float library routines.
                                                             (line  108)
* __dpd_fixdddi:                         Decimal float library routines.
                                                             (line  169)
* __dpd_fixddsi:                         Decimal float library routines.
                                                             (line  161)
* __dpd_fixsddi:                         Decimal float library routines.
                                                             (line  167)
* __dpd_fixsdsi:                         Decimal float library routines.
                                                             (line  159)
* __dpd_fixtddi:                         Decimal float library routines.
                                                             (line  171)
* __dpd_fixtdsi:                         Decimal float library routines.
                                                             (line  163)
* __dpd_fixunsdddi:                      Decimal float library routines.
                                                             (line  186)
* __dpd_fixunsddsi:                      Decimal float library routines.
                                                             (line  177)
* __dpd_fixunssddi:                      Decimal float library routines.
                                                             (line  184)
* __dpd_fixunssdsi:                      Decimal float library routines.
                                                             (line  175)
* __dpd_fixunstddi:                      Decimal float library routines.
                                                             (line  188)
* __dpd_fixunstdsi:                      Decimal float library routines.
                                                             (line  179)
* __dpd_floatdidd:                       Decimal float library routines.
                                                             (line  204)
* __dpd_floatdisd:                       Decimal float library routines.
                                                             (line  202)
* __dpd_floatditd:                       Decimal float library routines.
                                                             (line  206)
* __dpd_floatsidd:                       Decimal float library routines.
                                                             (line  195)
* __dpd_floatsisd:                       Decimal float library routines.
                                                             (line  193)
* __dpd_floatsitd:                       Decimal float library routines.
                                                             (line  197)
* __dpd_floatunsdidd:                    Decimal float library routines.
                                                             (line  222)
* __dpd_floatunsdisd:                    Decimal float library routines.
                                                             (line  220)
* __dpd_floatunsditd:                    Decimal float library routines.
                                                             (line  224)
* __dpd_floatunssidd:                    Decimal float library routines.
                                                             (line  213)
* __dpd_floatunssisd:                    Decimal float library routines.
                                                             (line  211)
* __dpd_floatunssitd:                    Decimal float library routines.
                                                             (line  215)
* __dpd_gedd2:                           Decimal float library routines.
                                                             (line  276)
* __dpd_gesd2:                           Decimal float library routines.
                                                             (line  274)
* __dpd_getd2:                           Decimal float library routines.
                                                             (line  278)
* __dpd_gtdd2:                           Decimal float library routines.
                                                             (line  303)
* __dpd_gtsd2:                           Decimal float library routines.
                                                             (line  301)
* __dpd_gttd2:                           Decimal float library routines.
                                                             (line  305)
* __dpd_ledd2:                           Decimal float library routines.
                                                             (line  294)
* __dpd_lesd2:                           Decimal float library routines.
                                                             (line  292)
* __dpd_letd2:                           Decimal float library routines.
                                                             (line  296)
* __dpd_ltdd2:                           Decimal float library routines.
                                                             (line  285)
* __dpd_ltsd2:                           Decimal float library routines.
                                                             (line  283)
* __dpd_lttd2:                           Decimal float library routines.
                                                             (line  287)
* __dpd_muldd3:                          Decimal float library routines.
                                                             (line   52)
* __dpd_mulsd3:                          Decimal float library routines.
                                                             (line   48)
* __dpd_multd3:                          Decimal float library routines.
                                                             (line   56)
* __dpd_nedd2:                           Decimal float library routines.
                                                             (line  267)
* __dpd_negdd2:                          Decimal float library routines.
                                                             (line   77)
* __dpd_negsd2:                          Decimal float library routines.
                                                             (line   75)
* __dpd_negtd2:                          Decimal float library routines.
                                                             (line   79)
* __dpd_nesd2:                           Decimal float library routines.
                                                             (line  265)
* __dpd_netd2:                           Decimal float library routines.
                                                             (line  269)
* __dpd_subdd3:                          Decimal float library routines.
                                                             (line   37)
* __dpd_subsd3:                          Decimal float library routines.
                                                             (line   33)
* __dpd_subtd3:                          Decimal float library routines.
                                                             (line   41)
* __dpd_truncdddf:                       Decimal float library routines.
                                                             (line  152)
* __dpd_truncddsd2:                      Decimal float library routines.
                                                             (line   93)
* __dpd_truncddsf:                       Decimal float library routines.
                                                             (line  123)
* __dpd_truncdfsd:                       Decimal float library routines.
                                                             (line  110)
* __dpd_truncsdsf:                       Decimal float library routines.
                                                             (line  150)
* __dpd_trunctddd2:                      Decimal float library routines.
                                                             (line   97)
* __dpd_trunctddf:                       Decimal float library routines.
                                                             (line  129)
* __dpd_trunctdsd2:                      Decimal float library routines.
                                                             (line   95)
* __dpd_trunctdsf:                       Decimal float library routines.
                                                             (line  125)
* __dpd_trunctdtf:                       Decimal float library routines.
                                                             (line  154)
* __dpd_trunctdxf:                       Decimal float library routines.
                                                             (line  135)
* __dpd_trunctfdd:                       Decimal float library routines.
                                                             (line  118)
* __dpd_trunctfsd:                       Decimal float library routines.
                                                             (line  114)
* __dpd_truncxfdd:                       Decimal float library routines.
                                                             (line  116)
* __dpd_truncxfsd:                       Decimal float library routines.
                                                             (line  112)
* __dpd_unorddd2:                        Decimal float library routines.
                                                             (line  234)
* __dpd_unordsd2:                        Decimal float library routines.
                                                             (line  232)
* __dpd_unordtd2:                        Decimal float library routines.
                                                             (line  236)
* __DTOR_LIST__:                         Initialization.     (line   25)
* __eqdf2:                               Soft float library routines.
                                                             (line  194)
* __eqsf2:                               Soft float library routines.
                                                             (line  193)
* __eqtf2:                               Soft float library routines.
                                                             (line  195)
* __extenddftf2:                         Soft float library routines.
                                                             (line   68)
* __extenddfxf2:                         Soft float library routines.
                                                             (line   69)
* __extendsfdf2:                         Soft float library routines.
                                                             (line   65)
* __extendsftf2:                         Soft float library routines.
                                                             (line   66)
* __extendsfxf2:                         Soft float library routines.
                                                             (line   67)
* __ffsdi2:                              Integer library routines.
                                                             (line  144)
* __ffsti2:                              Integer library routines.
                                                             (line  145)
* __fixdfdi:                             Soft float library routines.
                                                             (line   88)
* __fixdfsi:                             Soft float library routines.
                                                             (line   81)
* __fixdfti:                             Soft float library routines.
                                                             (line   94)
* __fixsfdi:                             Soft float library routines.
                                                             (line   87)
* __fixsfsi:                             Soft float library routines.
                                                             (line   80)
* __fixsfti:                             Soft float library routines.
                                                             (line   93)
* __fixtfdi:                             Soft float library routines.
                                                             (line   89)
* __fixtfsi:                             Soft float library routines.
                                                             (line   82)
* __fixtfti:                             Soft float library routines.
                                                             (line   95)
* __fixunsdfdi:                          Soft float library routines.
                                                             (line  108)
* __fixunsdfsi:                          Soft float library routines.
                                                             (line  101)
* __fixunsdfti:                          Soft float library routines.
                                                             (line  115)
* __fixunssfdi:                          Soft float library routines.
                                                             (line  107)
* __fixunssfsi:                          Soft float library routines.
                                                             (line  100)
* __fixunssfti:                          Soft float library routines.
                                                             (line  114)
* __fixunstfdi:                          Soft float library routines.
                                                             (line  109)
* __fixunstfsi:                          Soft float library routines.
                                                             (line  102)
* __fixunstfti:                          Soft float library routines.
                                                             (line  116)
* __fixunsxfdi:                          Soft float library routines.
                                                             (line  110)
* __fixunsxfsi:                          Soft float library routines.
                                                             (line  103)
* __fixunsxfti:                          Soft float library routines.
                                                             (line  117)
* __fixxfdi:                             Soft float library routines.
                                                             (line   90)
* __fixxfsi:                             Soft float library routines.
                                                             (line   83)
* __fixxfti:                             Soft float library routines.
                                                             (line   96)
* __floatdidf:                           Soft float library routines.
                                                             (line  128)
* __floatdisf:                           Soft float library routines.
                                                             (line  127)
* __floatditf:                           Soft float library routines.
                                                             (line  129)
* __floatdixf:                           Soft float library routines.
                                                             (line  130)
* __floatsidf:                           Soft float library routines.
                                                             (line  122)
* __floatsisf:                           Soft float library routines.
                                                             (line  121)
* __floatsitf:                           Soft float library routines.
                                                             (line  123)
* __floatsixf:                           Soft float library routines.
                                                             (line  124)
* __floattidf:                           Soft float library routines.
                                                             (line  134)
* __floattisf:                           Soft float library routines.
                                                             (line  133)
* __floattitf:                           Soft float library routines.
                                                             (line  135)
* __floattixf:                           Soft float library routines.
                                                             (line  136)
* __floatundidf:                         Soft float library routines.
                                                             (line  146)
* __floatundisf:                         Soft float library routines.
                                                             (line  145)
* __floatunditf:                         Soft float library routines.
                                                             (line  147)
* __floatundixf:                         Soft float library routines.
                                                             (line  148)
* __floatunsidf:                         Soft float library routines.
                                                             (line  140)
* __floatunsisf:                         Soft float library routines.
                                                             (line  139)
* __floatunsitf:                         Soft float library routines.
                                                             (line  141)
* __floatunsixf:                         Soft float library routines.
                                                             (line  142)
* __floatuntidf:                         Soft float library routines.
                                                             (line  152)
* __floatuntisf:                         Soft float library routines.
                                                             (line  151)
* __floatuntitf:                         Soft float library routines.
                                                             (line  153)
* __floatuntixf:                         Soft float library routines.
                                                             (line  154)
* __fractdadf:                           Fixed-point fractional library routines.
                                                             (line  636)
* __fractdadi:                           Fixed-point fractional library routines.
                                                             (line  633)
* __fractdadq:                           Fixed-point fractional library routines.
                                                             (line  616)
* __fractdaha2:                          Fixed-point fractional library routines.
                                                             (line  617)
* __fractdahi:                           Fixed-point fractional library routines.
                                                             (line  631)
* __fractdahq:                           Fixed-point fractional library routines.
                                                             (line  614)
* __fractdaqi:                           Fixed-point fractional library routines.
                                                             (line  630)
* __fractdaqq:                           Fixed-point fractional library routines.
                                                             (line  613)
* __fractdasa2:                          Fixed-point fractional library routines.
                                                             (line  618)
* __fractdasf:                           Fixed-point fractional library routines.
                                                             (line  635)
* __fractdasi:                           Fixed-point fractional library routines.
                                                             (line  632)
* __fractdasq:                           Fixed-point fractional library routines.
                                                             (line  615)
* __fractdata2:                          Fixed-point fractional library routines.
                                                             (line  619)
* __fractdati:                           Fixed-point fractional library routines.
                                                             (line  634)
* __fractdauda:                          Fixed-point fractional library routines.
                                                             (line  627)
* __fractdaudq:                          Fixed-point fractional library routines.
                                                             (line  624)
* __fractdauha:                          Fixed-point fractional library routines.
                                                             (line  625)
* __fractdauhq:                          Fixed-point fractional library routines.
                                                             (line  621)
* __fractdauqq:                          Fixed-point fractional library routines.
                                                             (line  620)
* __fractdausa:                          Fixed-point fractional library routines.
                                                             (line  626)
* __fractdausq:                          Fixed-point fractional library routines.
                                                             (line  622)
* __fractdauta:                          Fixed-point fractional library routines.
                                                             (line  629)
* __fractdfda:                           Fixed-point fractional library routines.
                                                             (line 1025)
* __fractdfdq:                           Fixed-point fractional library routines.
                                                             (line 1022)
* __fractdfha:                           Fixed-point fractional library routines.
                                                             (line 1023)
* __fractdfhq:                           Fixed-point fractional library routines.
                                                             (line 1020)
* __fractdfqq:                           Fixed-point fractional library routines.
                                                             (line 1019)
* __fractdfsa:                           Fixed-point fractional library routines.
                                                             (line 1024)
* __fractdfsq:                           Fixed-point fractional library routines.
                                                             (line 1021)
* __fractdfta:                           Fixed-point fractional library routines.
                                                             (line 1026)
* __fractdfuda:                          Fixed-point fractional library routines.
                                                             (line 1033)
* __fractdfudq:                          Fixed-point fractional library routines.
                                                             (line 1030)
* __fractdfuha:                          Fixed-point fractional library routines.
                                                             (line 1031)
* __fractdfuhq:                          Fixed-point fractional library routines.
                                                             (line 1028)
* __fractdfuqq:                          Fixed-point fractional library routines.
                                                             (line 1027)
* __fractdfusa:                          Fixed-point fractional library routines.
                                                             (line 1032)
* __fractdfusq:                          Fixed-point fractional library routines.
                                                             (line 1029)
* __fractdfuta:                          Fixed-point fractional library routines.
                                                             (line 1034)
* __fractdida:                           Fixed-point fractional library routines.
                                                             (line  975)
* __fractdidq:                           Fixed-point fractional library routines.
                                                             (line  972)
* __fractdiha:                           Fixed-point fractional library routines.
                                                             (line  973)
* __fractdihq:                           Fixed-point fractional library routines.
                                                             (line  970)
* __fractdiqq:                           Fixed-point fractional library routines.
                                                             (line  969)
* __fractdisa:                           Fixed-point fractional library routines.
                                                             (line  974)
* __fractdisq:                           Fixed-point fractional library routines.
                                                             (line  971)
* __fractdita:                           Fixed-point fractional library routines.
                                                             (line  976)
* __fractdiuda:                          Fixed-point fractional library routines.
                                                             (line  983)
* __fractdiudq:                          Fixed-point fractional library routines.
                                                             (line  980)
* __fractdiuha:                          Fixed-point fractional library routines.
                                                             (line  981)
* __fractdiuhq:                          Fixed-point fractional library routines.
                                                             (line  978)
* __fractdiuqq:                          Fixed-point fractional library routines.
                                                             (line  977)
* __fractdiusa:                          Fixed-point fractional library routines.
                                                             (line  982)
* __fractdiusq:                          Fixed-point fractional library routines.
                                                             (line  979)
* __fractdiuta:                          Fixed-point fractional library routines.
                                                             (line  984)
* __fractdqda:                           Fixed-point fractional library routines.
                                                             (line  544)
* __fractdqdf:                           Fixed-point fractional library routines.
                                                             (line  566)
* __fractdqdi:                           Fixed-point fractional library routines.
                                                             (line  563)
* __fractdqha:                           Fixed-point fractional library routines.
                                                             (line  542)
* __fractdqhi:                           Fixed-point fractional library routines.
                                                             (line  561)
* __fractdqhq2:                          Fixed-point fractional library routines.
                                                             (line  540)
* __fractdqqi:                           Fixed-point fractional library routines.
                                                             (line  560)
* __fractdqqq2:                          Fixed-point fractional library routines.
                                                             (line  539)
* __fractdqsa:                           Fixed-point fractional library routines.
                                                             (line  543)
* __fractdqsf:                           Fixed-point fractional library routines.
                                                             (line  565)
* __fractdqsi:                           Fixed-point fractional library routines.
                                                             (line  562)
* __fractdqsq2:                          Fixed-point fractional library routines.
                                                             (line  541)
* __fractdqta:                           Fixed-point fractional library routines.
                                                             (line  545)
* __fractdqti:                           Fixed-point fractional library routines.
                                                             (line  564)
* __fractdquda:                          Fixed-point fractional library routines.
                                                             (line  557)
* __fractdqudq:                          Fixed-point fractional library routines.
                                                             (line  552)
* __fractdquha:                          Fixed-point fractional library routines.
                                                             (line  554)
* __fractdquhq:                          Fixed-point fractional library routines.
                                                             (line  548)
* __fractdquqq:                          Fixed-point fractional library routines.
                                                             (line  547)
* __fractdqusa:                          Fixed-point fractional library routines.
                                                             (line  555)
* __fractdqusq:                          Fixed-point fractional library routines.
                                                             (line  550)
* __fractdquta:                          Fixed-point fractional library routines.
                                                             (line  559)
* __fracthada2:                          Fixed-point fractional library routines.
                                                             (line  572)
* __fracthadf:                           Fixed-point fractional library routines.
                                                             (line  590)
* __fracthadi:                           Fixed-point fractional library routines.
                                                             (line  587)
* __fracthadq:                           Fixed-point fractional library routines.
                                                             (line  570)
* __fracthahi:                           Fixed-point fractional library routines.
                                                             (line  585)
* __fracthahq:                           Fixed-point fractional library routines.
                                                             (line  568)
* __fracthaqi:                           Fixed-point fractional library routines.
                                                             (line  584)
* __fracthaqq:                           Fixed-point fractional library routines.
                                                             (line  567)
* __fracthasa2:                          Fixed-point fractional library routines.
                                                             (line  571)
* __fracthasf:                           Fixed-point fractional library routines.
                                                             (line  589)
* __fracthasi:                           Fixed-point fractional library routines.
                                                             (line  586)
* __fracthasq:                           Fixed-point fractional library routines.
                                                             (line  569)
* __fracthata2:                          Fixed-point fractional library routines.
                                                             (line  573)
* __fracthati:                           Fixed-point fractional library routines.
                                                             (line  588)
* __fracthauda:                          Fixed-point fractional library routines.
                                                             (line  581)
* __fracthaudq:                          Fixed-point fractional library routines.
                                                             (line  578)
* __fracthauha:                          Fixed-point fractional library routines.
                                                             (line  579)
* __fracthauhq:                          Fixed-point fractional library routines.
                                                             (line  575)
* __fracthauqq:                          Fixed-point fractional library routines.
                                                             (line  574)
* __fracthausa:                          Fixed-point fractional library routines.
                                                             (line  580)
* __fracthausq:                          Fixed-point fractional library routines.
                                                             (line  576)
* __fracthauta:                          Fixed-point fractional library routines.
                                                             (line  583)
* __fracthida:                           Fixed-point fractional library routines.
                                                             (line  943)
* __fracthidq:                           Fixed-point fractional library routines.
                                                             (line  940)
* __fracthiha:                           Fixed-point fractional library routines.
                                                             (line  941)
* __fracthihq:                           Fixed-point fractional library routines.
                                                             (line  938)
* __fracthiqq:                           Fixed-point fractional library routines.
                                                             (line  937)
* __fracthisa:                           Fixed-point fractional library routines.
                                                             (line  942)
* __fracthisq:                           Fixed-point fractional library routines.
                                                             (line  939)
* __fracthita:                           Fixed-point fractional library routines.
                                                             (line  944)
* __fracthiuda:                          Fixed-point fractional library routines.
                                                             (line  951)
* __fracthiudq:                          Fixed-point fractional library routines.
                                                             (line  948)
* __fracthiuha:                          Fixed-point fractional library routines.
                                                             (line  949)
* __fracthiuhq:                          Fixed-point fractional library routines.
                                                             (line  946)
* __fracthiuqq:                          Fixed-point fractional library routines.
                                                             (line  945)
* __fracthiusa:                          Fixed-point fractional library routines.
                                                             (line  950)
* __fracthiusq:                          Fixed-point fractional library routines.
                                                             (line  947)
* __fracthiuta:                          Fixed-point fractional library routines.
                                                             (line  952)
* __fracthqda:                           Fixed-point fractional library routines.
                                                             (line  498)
* __fracthqdf:                           Fixed-point fractional library routines.
                                                             (line  514)
* __fracthqdi:                           Fixed-point fractional library routines.
                                                             (line  511)
* __fracthqdq2:                          Fixed-point fractional library routines.
                                                             (line  495)
* __fracthqha:                           Fixed-point fractional library routines.
                                                             (line  496)
* __fracthqhi:                           Fixed-point fractional library routines.
                                                             (line  509)
* __fracthqqi:                           Fixed-point fractional library routines.
                                                             (line  508)
* __fracthqqq2:                          Fixed-point fractional library routines.
                                                             (line  493)
* __fracthqsa:                           Fixed-point fractional library routines.
                                                             (line  497)
* __fracthqsf:                           Fixed-point fractional library routines.
                                                             (line  513)
* __fracthqsi:                           Fixed-point fractional library routines.
                                                             (line  510)
* __fracthqsq2:                          Fixed-point fractional library routines.
                                                             (line  494)
* __fracthqta:                           Fixed-point fractional library routines.
                                                             (line  499)
* __fracthqti:                           Fixed-point fractional library routines.
                                                             (line  512)
* __fracthquda:                          Fixed-point fractional library routines.
                                                             (line  506)
* __fracthqudq:                          Fixed-point fractional library routines.
                                                             (line  503)
* __fracthquha:                          Fixed-point fractional library routines.
                                                             (line  504)
* __fracthquhq:                          Fixed-point fractional library routines.
                                                             (line  501)
* __fracthquqq:                          Fixed-point fractional library routines.
                                                             (line  500)
* __fracthqusa:                          Fixed-point fractional library routines.
                                                             (line  505)
* __fracthqusq:                          Fixed-point fractional library routines.
                                                             (line  502)
* __fracthquta:                          Fixed-point fractional library routines.
                                                             (line  507)
* __fractqida:                           Fixed-point fractional library routines.
                                                             (line  925)
* __fractqidq:                           Fixed-point fractional library routines.
                                                             (line  922)
* __fractqiha:                           Fixed-point fractional library routines.
                                                             (line  923)
* __fractqihq:                           Fixed-point fractional library routines.
                                                             (line  920)
* __fractqiqq:                           Fixed-point fractional library routines.
                                                             (line  919)
* __fractqisa:                           Fixed-point fractional library routines.
                                                             (line  924)
* __fractqisq:                           Fixed-point fractional library routines.
                                                             (line  921)
* __fractqita:                           Fixed-point fractional library routines.
                                                             (line  926)
* __fractqiuda:                          Fixed-point fractional library routines.
                                                             (line  934)
* __fractqiudq:                          Fixed-point fractional library routines.
                                                             (line  931)
* __fractqiuha:                          Fixed-point fractional library routines.
                                                             (line  932)
* __fractqiuhq:                          Fixed-point fractional library routines.
                                                             (line  928)
* __fractqiuqq:                          Fixed-point fractional library routines.
                                                             (line  927)
* __fractqiusa:                          Fixed-point fractional library routines.
                                                             (line  933)
* __fractqiusq:                          Fixed-point fractional library routines.
                                                             (line  929)
* __fractqiuta:                          Fixed-point fractional library routines.
                                                             (line  936)
* __fractqqda:                           Fixed-point fractional library routines.
                                                             (line  474)
* __fractqqdf:                           Fixed-point fractional library routines.
                                                             (line  492)
* __fractqqdi:                           Fixed-point fractional library routines.
                                                             (line  489)
* __fractqqdq2:                          Fixed-point fractional library routines.
                                                             (line  471)
* __fractqqha:                           Fixed-point fractional library routines.
                                                             (line  472)
* __fractqqhi:                           Fixed-point fractional library routines.
                                                             (line  487)
* __fractqqhq2:                          Fixed-point fractional library routines.
                                                             (line  469)
* __fractqqqi:                           Fixed-point fractional library routines.
                                                             (line  486)
* __fractqqsa:                           Fixed-point fractional library routines.
                                                             (line  473)
* __fractqqsf:                           Fixed-point fractional library routines.
                                                             (line  491)
* __fractqqsi:                           Fixed-point fractional library routines.
                                                             (line  488)
* __fractqqsq2:                          Fixed-point fractional library routines.
                                                             (line  470)
* __fractqqta:                           Fixed-point fractional library routines.
                                                             (line  475)
* __fractqqti:                           Fixed-point fractional library routines.
                                                             (line  490)
* __fractqquda:                          Fixed-point fractional library routines.
                                                             (line  483)
* __fractqqudq:                          Fixed-point fractional library routines.
                                                             (line  480)
* __fractqquha:                          Fixed-point fractional library routines.
                                                             (line  481)
* __fractqquhq:                          Fixed-point fractional library routines.
                                                             (line  477)
* __fractqquqq:                          Fixed-point fractional library routines.
                                                             (line  476)
* __fractqqusa:                          Fixed-point fractional library routines.
                                                             (line  482)
* __fractqqusq:                          Fixed-point fractional library routines.
                                                             (line  478)
* __fractqquta:                          Fixed-point fractional library routines.
                                                             (line  485)
* __fractsada2:                          Fixed-point fractional library routines.
                                                             (line  596)
* __fractsadf:                           Fixed-point fractional library routines.
                                                             (line  612)
* __fractsadi:                           Fixed-point fractional library routines.
                                                             (line  609)
* __fractsadq:                           Fixed-point fractional library routines.
                                                             (line  594)
* __fractsaha2:                          Fixed-point fractional library routines.
                                                             (line  595)
* __fractsahi:                           Fixed-point fractional library routines.
                                                             (line  607)
* __fractsahq:                           Fixed-point fractional library routines.
                                                             (line  592)
* __fractsaqi:                           Fixed-point fractional library routines.
                                                             (line  606)
* __fractsaqq:                           Fixed-point fractional library routines.
                                                             (line  591)
* __fractsasf:                           Fixed-point fractional library routines.
                                                             (line  611)
* __fractsasi:                           Fixed-point fractional library routines.
                                                             (line  608)
* __fractsasq:                           Fixed-point fractional library routines.
                                                             (line  593)
* __fractsata2:                          Fixed-point fractional library routines.
                                                             (line  597)
* __fractsati:                           Fixed-point fractional library routines.
                                                             (line  610)
* __fractsauda:                          Fixed-point fractional library routines.
                                                             (line  604)
* __fractsaudq:                          Fixed-point fractional library routines.
                                                             (line  601)
* __fractsauha:                          Fixed-point fractional library routines.
                                                             (line  602)
* __fractsauhq:                          Fixed-point fractional library routines.
                                                             (line  599)
* __fractsauqq:                          Fixed-point fractional library routines.
                                                             (line  598)
* __fractsausa:                          Fixed-point fractional library routines.
                                                             (line  603)
* __fractsausq:                          Fixed-point fractional library routines.
                                                             (line  600)
* __fractsauta:                          Fixed-point fractional library routines.
                                                             (line  605)
* __fractsfda:                           Fixed-point fractional library routines.
                                                             (line 1009)
* __fractsfdq:                           Fixed-point fractional library routines.
                                                             (line 1006)
* __fractsfha:                           Fixed-point fractional library routines.
                                                             (line 1007)
* __fractsfhq:                           Fixed-point fractional library routines.
                                                             (line 1004)
* __fractsfqq:                           Fixed-point fractional library routines.
                                                             (line 1003)
* __fractsfsa:                           Fixed-point fractional library routines.
                                                             (line 1008)
* __fractsfsq:                           Fixed-point fractional library routines.
                                                             (line 1005)
* __fractsfta:                           Fixed-point fractional library routines.
                                                             (line 1010)
* __fractsfuda:                          Fixed-point fractional library routines.
                                                             (line 1017)
* __fractsfudq:                          Fixed-point fractional library routines.
                                                             (line 1014)
* __fractsfuha:                          Fixed-point fractional library routines.
                                                             (line 1015)
* __fractsfuhq:                          Fixed-point fractional library routines.
                                                             (line 1012)
* __fractsfuqq:                          Fixed-point fractional library routines.
                                                             (line 1011)
* __fractsfusa:                          Fixed-point fractional library routines.
                                                             (line 1016)
* __fractsfusq:                          Fixed-point fractional library routines.
                                                             (line 1013)
* __fractsfuta:                          Fixed-point fractional library routines.
                                                             (line 1018)
* __fractsida:                           Fixed-point fractional library routines.
                                                             (line  959)
* __fractsidq:                           Fixed-point fractional library routines.
                                                             (line  956)
* __fractsiha:                           Fixed-point fractional library routines.
                                                             (line  957)
* __fractsihq:                           Fixed-point fractional library routines.
                                                             (line  954)
* __fractsiqq:                           Fixed-point fractional library routines.
                                                             (line  953)
* __fractsisa:                           Fixed-point fractional library routines.
                                                             (line  958)
* __fractsisq:                           Fixed-point fractional library routines.
                                                             (line  955)
* __fractsita:                           Fixed-point fractional library routines.
                                                             (line  960)
* __fractsiuda:                          Fixed-point fractional library routines.
                                                             (line  967)
* __fractsiudq:                          Fixed-point fractional library routines.
                                                             (line  964)
* __fractsiuha:                          Fixed-point fractional library routines.
                                                             (line  965)
* __fractsiuhq:                          Fixed-point fractional library routines.
                                                             (line  962)
* __fractsiuqq:                          Fixed-point fractional library routines.
                                                             (line  961)
* __fractsiusa:                          Fixed-point fractional library routines.
                                                             (line  966)
* __fractsiusq:                          Fixed-point fractional library routines.
                                                             (line  963)
* __fractsiuta:                          Fixed-point fractional library routines.
                                                             (line  968)
* __fractsqda:                           Fixed-point fractional library routines.
                                                             (line  520)
* __fractsqdf:                           Fixed-point fractional library routines.
                                                             (line  538)
* __fractsqdi:                           Fixed-point fractional library routines.
                                                             (line  535)
* __fractsqdq2:                          Fixed-point fractional library routines.
                                                             (line  517)
* __fractsqha:                           Fixed-point fractional library routines.
                                                             (line  518)
* __fractsqhi:                           Fixed-point fractional library routines.
                                                             (line  533)
* __fractsqhq2:                          Fixed-point fractional library routines.
                                                             (line  516)
* __fractsqqi:                           Fixed-point fractional library routines.
                                                             (line  532)
* __fractsqqq2:                          Fixed-point fractional library routines.
                                                             (line  515)
* __fractsqsa:                           Fixed-point fractional library routines.
                                                             (line  519)
* __fractsqsf:                           Fixed-point fractional library routines.
                                                             (line  537)
* __fractsqsi:                           Fixed-point fractional library routines.
                                                             (line  534)
* __fractsqta:                           Fixed-point fractional library routines.
                                                             (line  521)
* __fractsqti:                           Fixed-point fractional library routines.
                                                             (line  536)
* __fractsquda:                          Fixed-point fractional library routines.
                                                             (line  529)
* __fractsqudq:                          Fixed-point fractional library routines.
                                                             (line  526)
* __fractsquha:                          Fixed-point fractional library routines.
                                                             (line  527)
* __fractsquhq:                          Fixed-point fractional library routines.
                                                             (line  523)
* __fractsquqq:                          Fixed-point fractional library routines.
                                                             (line  522)
* __fractsqusa:                          Fixed-point fractional library routines.
                                                             (line  528)
* __fractsqusq:                          Fixed-point fractional library routines.
                                                             (line  524)
* __fractsquta:                          Fixed-point fractional library routines.
                                                             (line  531)
* __fracttada2:                          Fixed-point fractional library routines.
                                                             (line  643)
* __fracttadf:                           Fixed-point fractional library routines.
                                                             (line  664)
* __fracttadi:                           Fixed-point fractional library routines.
                                                             (line  661)
* __fracttadq:                           Fixed-point fractional library routines.
                                                             (line  640)
* __fracttaha2:                          Fixed-point fractional library routines.
                                                             (line  641)
* __fracttahi:                           Fixed-point fractional library routines.
                                                             (line  659)
* __fracttahq:                           Fixed-point fractional library routines.
                                                             (line  638)
* __fracttaqi:                           Fixed-point fractional library routines.
                                                             (line  658)
* __fracttaqq:                           Fixed-point fractional library routines.
                                                             (line  637)
* __fracttasa2:                          Fixed-point fractional library routines.
                                                             (line  642)
* __fracttasf:                           Fixed-point fractional library routines.
                                                             (line  663)
* __fracttasi:                           Fixed-point fractional library routines.
                                                             (line  660)
* __fracttasq:                           Fixed-point fractional library routines.
                                                             (line  639)
* __fracttati:                           Fixed-point fractional library routines.
                                                             (line  662)
* __fracttauda:                          Fixed-point fractional library routines.
                                                             (line  655)
* __fracttaudq:                          Fixed-point fractional library routines.
                                                             (line  650)
* __fracttauha:                          Fixed-point fractional library routines.
                                                             (line  652)
* __fracttauhq:                          Fixed-point fractional library routines.
                                                             (line  646)
* __fracttauqq:                          Fixed-point fractional library routines.
                                                             (line  645)
* __fracttausa:                          Fixed-point fractional library routines.
                                                             (line  653)
* __fracttausq:                          Fixed-point fractional library routines.
                                                             (line  648)
* __fracttauta:                          Fixed-point fractional library routines.
                                                             (line  657)
* __fracttida:                           Fixed-point fractional library routines.
                                                             (line  991)
* __fracttidq:                           Fixed-point fractional library routines.
                                                             (line  988)
* __fracttiha:                           Fixed-point fractional library routines.
                                                             (line  989)
* __fracttihq:                           Fixed-point fractional library routines.
                                                             (line  986)
* __fracttiqq:                           Fixed-point fractional library routines.
                                                             (line  985)
* __fracttisa:                           Fixed-point fractional library routines.
                                                             (line  990)
* __fracttisq:                           Fixed-point fractional library routines.
                                                             (line  987)
* __fracttita:                           Fixed-point fractional library routines.
                                                             (line  992)
* __fracttiuda:                          Fixed-point fractional library routines.
                                                             (line 1000)
* __fracttiudq:                          Fixed-point fractional library routines.
                                                             (line  997)
* __fracttiuha:                          Fixed-point fractional library routines.
                                                             (line  998)
* __fracttiuhq:                          Fixed-point fractional library routines.
                                                             (line  994)
* __fracttiuqq:                          Fixed-point fractional library routines.
                                                             (line  993)
* __fracttiusa:                          Fixed-point fractional library routines.
                                                             (line  999)
* __fracttiusq:                          Fixed-point fractional library routines.
                                                             (line  995)
* __fracttiuta:                          Fixed-point fractional library routines.
                                                             (line 1002)
* __fractudada:                          Fixed-point fractional library routines.
                                                             (line  858)
* __fractudadf:                          Fixed-point fractional library routines.
                                                             (line  881)
* __fractudadi:                          Fixed-point fractional library routines.
                                                             (line  878)
* __fractudadq:                          Fixed-point fractional library routines.
                                                             (line  855)
* __fractudaha:                          Fixed-point fractional library routines.
                                                             (line  856)
* __fractudahi:                          Fixed-point fractional library routines.
                                                             (line  876)
* __fractudahq:                          Fixed-point fractional library routines.
                                                             (line  852)
* __fractudaqi:                          Fixed-point fractional library routines.
                                                             (line  875)
* __fractudaqq:                          Fixed-point fractional library routines.
                                                             (line  851)
* __fractudasa:                          Fixed-point fractional library routines.
                                                             (line  857)
* __fractudasf:                          Fixed-point fractional library routines.
                                                             (line  880)
* __fractudasi:                          Fixed-point fractional library routines.
                                                             (line  877)
* __fractudasq:                          Fixed-point fractional library routines.
                                                             (line  853)
* __fractudata:                          Fixed-point fractional library routines.
                                                             (line  860)
* __fractudati:                          Fixed-point fractional library routines.
                                                             (line  879)
* __fractudaudq:                         Fixed-point fractional library routines.
                                                             (line  868)
* __fractudauha2:                        Fixed-point fractional library routines.
                                                             (line  870)
* __fractudauhq:                         Fixed-point fractional library routines.
                                                             (line  864)
* __fractudauqq:                         Fixed-point fractional library routines.
                                                             (line  862)
* __fractudausa2:                        Fixed-point fractional library routines.
                                                             (line  872)
* __fractudausq:                         Fixed-point fractional library routines.
                                                             (line  866)
* __fractudauta2:                        Fixed-point fractional library routines.
                                                             (line  874)
* __fractudqda:                          Fixed-point fractional library routines.
                                                             (line  766)
* __fractudqdf:                          Fixed-point fractional library routines.
                                                             (line  791)
* __fractudqdi:                          Fixed-point fractional library routines.
                                                             (line  787)
* __fractudqdq:                          Fixed-point fractional library routines.
                                                             (line  761)
* __fractudqha:                          Fixed-point fractional library routines.
                                                             (line  763)
* __fractudqhi:                          Fixed-point fractional library routines.
                                                             (line  785)
* __fractudqhq:                          Fixed-point fractional library routines.
                                                             (line  757)
* __fractudqqi:                          Fixed-point fractional library routines.
                                                             (line  784)
* __fractudqqq:                          Fixed-point fractional library routines.
                                                             (line  756)
* __fractudqsa:                          Fixed-point fractional library routines.
                                                             (line  764)
* __fractudqsf:                          Fixed-point fractional library routines.
                                                             (line  790)
* __fractudqsi:                          Fixed-point fractional library routines.
                                                             (line  786)
* __fractudqsq:                          Fixed-point fractional library routines.
                                                             (line  759)
* __fractudqta:                          Fixed-point fractional library routines.
                                                             (line  768)
* __fractudqti:                          Fixed-point fractional library routines.
                                                             (line  789)
* __fractudquda:                         Fixed-point fractional library routines.
                                                             (line  780)
* __fractudquha:                         Fixed-point fractional library routines.
                                                             (line  776)
* __fractudquhq2:                        Fixed-point fractional library routines.
                                                             (line  772)
* __fractudquqq2:                        Fixed-point fractional library routines.
                                                             (line  770)
* __fractudqusa:                         Fixed-point fractional library routines.
                                                             (line  778)
* __fractudqusq2:                        Fixed-point fractional library routines.
                                                             (line  774)
* __fractudquta:                         Fixed-point fractional library routines.
                                                             (line  782)
* __fractuhada:                          Fixed-point fractional library routines.
                                                             (line  799)
* __fractuhadf:                          Fixed-point fractional library routines.
                                                             (line  822)
* __fractuhadi:                          Fixed-point fractional library routines.
                                                             (line  819)
* __fractuhadq:                          Fixed-point fractional library routines.
                                                             (line  796)
* __fractuhaha:                          Fixed-point fractional library routines.
                                                             (line  797)
* __fractuhahi:                          Fixed-point fractional library routines.
                                                             (line  817)
* __fractuhahq:                          Fixed-point fractional library routines.
                                                             (line  793)
* __fractuhaqi:                          Fixed-point fractional library routines.
                                                             (line  816)
* __fractuhaqq:                          Fixed-point fractional library routines.
                                                             (line  792)
* __fractuhasa:                          Fixed-point fractional library routines.
                                                             (line  798)
* __fractuhasf:                          Fixed-point fractional library routines.
                                                             (line  821)
* __fractuhasi:                          Fixed-point fractional library routines.
                                                             (line  818)
* __fractuhasq:                          Fixed-point fractional library routines.
                                                             (line  794)
* __fractuhata:                          Fixed-point fractional library routines.
                                                             (line  801)
* __fractuhati:                          Fixed-point fractional library routines.
                                                             (line  820)
* __fractuhauda2:                        Fixed-point fractional library routines.
                                                             (line  813)
* __fractuhaudq:                         Fixed-point fractional library routines.
                                                             (line  809)
* __fractuhauhq:                         Fixed-point fractional library routines.
                                                             (line  805)
* __fractuhauqq:                         Fixed-point fractional library routines.
                                                             (line  803)
* __fractuhausa2:                        Fixed-point fractional library routines.
                                                             (line  811)
* __fractuhausq:                         Fixed-point fractional library routines.
                                                             (line  807)
* __fractuhauta2:                        Fixed-point fractional library routines.
                                                             (line  815)
* __fractuhqda:                          Fixed-point fractional library routines.
                                                             (line  702)
* __fractuhqdf:                          Fixed-point fractional library routines.
                                                             (line  723)
* __fractuhqdi:                          Fixed-point fractional library routines.
                                                             (line  720)
* __fractuhqdq:                          Fixed-point fractional library routines.
                                                             (line  699)
* __fractuhqha:                          Fixed-point fractional library routines.
                                                             (line  700)
* __fractuhqhi:                          Fixed-point fractional library routines.
                                                             (line  718)
* __fractuhqhq:                          Fixed-point fractional library routines.
                                                             (line  697)
* __fractuhqqi:                          Fixed-point fractional library routines.
                                                             (line  717)
* __fractuhqqq:                          Fixed-point fractional library routines.
                                                             (line  696)
* __fractuhqsa:                          Fixed-point fractional library routines.
                                                             (line  701)
* __fractuhqsf:                          Fixed-point fractional library routines.
                                                             (line  722)
* __fractuhqsi:                          Fixed-point fractional library routines.
                                                             (line  719)
* __fractuhqsq:                          Fixed-point fractional library routines.
                                                             (line  698)
* __fractuhqta:                          Fixed-point fractional library routines.
                                                             (line  703)
* __fractuhqti:                          Fixed-point fractional library routines.
                                                             (line  721)
* __fractuhquda:                         Fixed-point fractional library routines.
                                                             (line  714)
* __fractuhqudq2:                        Fixed-point fractional library routines.
                                                             (line  709)
* __fractuhquha:                         Fixed-point fractional library routines.
                                                             (line  711)
* __fractuhquqq2:                        Fixed-point fractional library routines.
                                                             (line  705)
* __fractuhqusa:                         Fixed-point fractional library routines.
                                                             (line  712)
* __fractuhqusq2:                        Fixed-point fractional library routines.
                                                             (line  707)
* __fractuhquta:                         Fixed-point fractional library routines.
                                                             (line  716)
* __fractunsdadi:                        Fixed-point fractional library routines.
                                                             (line 1555)
* __fractunsdahi:                        Fixed-point fractional library routines.
                                                             (line 1553)
* __fractunsdaqi:                        Fixed-point fractional library routines.
                                                             (line 1552)
* __fractunsdasi:                        Fixed-point fractional library routines.
                                                             (line 1554)
* __fractunsdati:                        Fixed-point fractional library routines.
                                                             (line 1556)
* __fractunsdida:                        Fixed-point fractional library routines.
                                                             (line 1707)
* __fractunsdidq:                        Fixed-point fractional library routines.
                                                             (line 1704)
* __fractunsdiha:                        Fixed-point fractional library routines.
                                                             (line 1705)
* __fractunsdihq:                        Fixed-point fractional library routines.
                                                             (line 1702)
* __fractunsdiqq:                        Fixed-point fractional library routines.
                                                             (line 1701)
* __fractunsdisa:                        Fixed-point fractional library routines.
                                                             (line 1706)
* __fractunsdisq:                        Fixed-point fractional library routines.
                                                             (line 1703)
* __fractunsdita:                        Fixed-point fractional library routines.
                                                             (line 1708)
* __fractunsdiuda:                       Fixed-point fractional library routines.
                                                             (line 1720)
* __fractunsdiudq:                       Fixed-point fractional library routines.
                                                             (line 1715)
* __fractunsdiuha:                       Fixed-point fractional library routines.
                                                             (line 1717)
* __fractunsdiuhq:                       Fixed-point fractional library routines.
                                                             (line 1711)
* __fractunsdiuqq:                       Fixed-point fractional library routines.
                                                             (line 1710)
* __fractunsdiusa:                       Fixed-point fractional library routines.
                                                             (line 1718)
* __fractunsdiusq:                       Fixed-point fractional library routines.
                                                             (line 1713)
* __fractunsdiuta:                       Fixed-point fractional library routines.
                                                             (line 1722)
* __fractunsdqdi:                        Fixed-point fractional library routines.
                                                             (line 1539)
* __fractunsdqhi:                        Fixed-point fractional library routines.
                                                             (line 1537)
* __fractunsdqqi:                        Fixed-point fractional library routines.
                                                             (line 1536)
* __fractunsdqsi:                        Fixed-point fractional library routines.
                                                             (line 1538)
* __fractunsdqti:                        Fixed-point fractional library routines.
                                                             (line 1541)
* __fractunshadi:                        Fixed-point fractional library routines.
                                                             (line 1545)
* __fractunshahi:                        Fixed-point fractional library routines.
                                                             (line 1543)
* __fractunshaqi:                        Fixed-point fractional library routines.
                                                             (line 1542)
* __fractunshasi:                        Fixed-point fractional library routines.
                                                             (line 1544)
* __fractunshati:                        Fixed-point fractional library routines.
                                                             (line 1546)
* __fractunshida:                        Fixed-point fractional library routines.
                                                             (line 1663)
* __fractunshidq:                        Fixed-point fractional library routines.
                                                             (line 1660)
* __fractunshiha:                        Fixed-point fractional library routines.
                                                             (line 1661)
* __fractunshihq:                        Fixed-point fractional library routines.
                                                             (line 1658)
* __fractunshiqq:                        Fixed-point fractional library routines.
                                                             (line 1657)
* __fractunshisa:                        Fixed-point fractional library routines.
                                                             (line 1662)
* __fractunshisq:                        Fixed-point fractional library routines.
                                                             (line 1659)
* __fractunshita:                        Fixed-point fractional library routines.
                                                             (line 1664)
* __fractunshiuda:                       Fixed-point fractional library routines.
                                                             (line 1676)
* __fractunshiudq:                       Fixed-point fractional library routines.
                                                             (line 1671)
* __fractunshiuha:                       Fixed-point fractional library routines.
                                                             (line 1673)
* __fractunshiuhq:                       Fixed-point fractional library routines.
                                                             (line 1667)
* __fractunshiuqq:                       Fixed-point fractional library routines.
                                                             (line 1666)
* __fractunshiusa:                       Fixed-point fractional library routines.
                                                             (line 1674)
* __fractunshiusq:                       Fixed-point fractional library routines.
                                                             (line 1669)
* __fractunshiuta:                       Fixed-point fractional library routines.
                                                             (line 1678)
* __fractunshqdi:                        Fixed-point fractional library routines.
                                                             (line 1529)
* __fractunshqhi:                        Fixed-point fractional library routines.
                                                             (line 1527)
* __fractunshqqi:                        Fixed-point fractional library routines.
                                                             (line 1526)
* __fractunshqsi:                        Fixed-point fractional library routines.
                                                             (line 1528)
* __fractunshqti:                        Fixed-point fractional library routines.
                                                             (line 1530)
* __fractunsqida:                        Fixed-point fractional library routines.
                                                             (line 1641)
* __fractunsqidq:                        Fixed-point fractional library routines.
                                                             (line 1638)
* __fractunsqiha:                        Fixed-point fractional library routines.
                                                             (line 1639)
* __fractunsqihq:                        Fixed-point fractional library routines.
                                                             (line 1636)
* __fractunsqiqq:                        Fixed-point fractional library routines.
                                                             (line 1635)
* __fractunsqisa:                        Fixed-point fractional library routines.
                                                             (line 1640)
* __fractunsqisq:                        Fixed-point fractional library routines.
                                                             (line 1637)
* __fractunsqita:                        Fixed-point fractional library routines.
                                                             (line 1642)
* __fractunsqiuda:                       Fixed-point fractional library routines.
                                                             (line 1654)
* __fractunsqiudq:                       Fixed-point fractional library routines.
                                                             (line 1649)
* __fractunsqiuha:                       Fixed-point fractional library routines.
                                                             (line 1651)
* __fractunsqiuhq:                       Fixed-point fractional library routines.
                                                             (line 1645)
* __fractunsqiuqq:                       Fixed-point fractional library routines.
                                                             (line 1644)
* __fractunsqiusa:                       Fixed-point fractional library routines.
                                                             (line 1652)
* __fractunsqiusq:                       Fixed-point fractional library routines.
                                                             (line 1647)
* __fractunsqiuta:                       Fixed-point fractional library routines.
                                                             (line 1656)
* __fractunsqqdi:                        Fixed-point fractional library routines.
                                                             (line 1524)
* __fractunsqqhi:                        Fixed-point fractional library routines.
                                                             (line 1522)
* __fractunsqqqi:                        Fixed-point fractional library routines.
                                                             (line 1521)
* __fractunsqqsi:                        Fixed-point fractional library routines.
                                                             (line 1523)
* __fractunsqqti:                        Fixed-point fractional library routines.
                                                             (line 1525)
* __fractunssadi:                        Fixed-point fractional library routines.
                                                             (line 1550)
* __fractunssahi:                        Fixed-point fractional library routines.
                                                             (line 1548)
* __fractunssaqi:                        Fixed-point fractional library routines.
                                                             (line 1547)
* __fractunssasi:                        Fixed-point fractional library routines.
                                                             (line 1549)
* __fractunssati:                        Fixed-point fractional library routines.
                                                             (line 1551)
* __fractunssida:                        Fixed-point fractional library routines.
                                                             (line 1685)
* __fractunssidq:                        Fixed-point fractional library routines.
                                                             (line 1682)
* __fractunssiha:                        Fixed-point fractional library routines.
                                                             (line 1683)
* __fractunssihq:                        Fixed-point fractional library routines.
                                                             (line 1680)
* __fractunssiqq:                        Fixed-point fractional library routines.
                                                             (line 1679)
* __fractunssisa:                        Fixed-point fractional library routines.
                                                             (line 1684)
* __fractunssisq:                        Fixed-point fractional library routines.
                                                             (line 1681)
* __fractunssita:                        Fixed-point fractional library routines.
                                                             (line 1686)
* __fractunssiuda:                       Fixed-point fractional library routines.
                                                             (line 1698)
* __fractunssiudq:                       Fixed-point fractional library routines.
                                                             (line 1693)
* __fractunssiuha:                       Fixed-point fractional library routines.
                                                             (line 1695)
* __fractunssiuhq:                       Fixed-point fractional library routines.
                                                             (line 1689)
* __fractunssiuqq:                       Fixed-point fractional library routines.
                                                             (line 1688)
* __fractunssiusa:                       Fixed-point fractional library routines.
                                                             (line 1696)
* __fractunssiusq:                       Fixed-point fractional library routines.
                                                             (line 1691)
* __fractunssiuta:                       Fixed-point fractional library routines.
                                                             (line 1700)
* __fractunssqdi:                        Fixed-point fractional library routines.
                                                             (line 1534)
* __fractunssqhi:                        Fixed-point fractional library routines.
                                                             (line 1532)
* __fractunssqqi:                        Fixed-point fractional library routines.
                                                             (line 1531)
* __fractunssqsi:                        Fixed-point fractional library routines.
                                                             (line 1533)
* __fractunssqti:                        Fixed-point fractional library routines.
                                                             (line 1535)
* __fractunstadi:                        Fixed-point fractional library routines.
                                                             (line 1560)
* __fractunstahi:                        Fixed-point fractional library routines.
                                                             (line 1558)
* __fractunstaqi:                        Fixed-point fractional library routines.
                                                             (line 1557)
* __fractunstasi:                        Fixed-point fractional library routines.
                                                             (line 1559)
* __fractunstati:                        Fixed-point fractional library routines.
                                                             (line 1562)
* __fractunstida:                        Fixed-point fractional library routines.
                                                             (line 1730)
* __fractunstidq:                        Fixed-point fractional library routines.
                                                             (line 1727)
* __fractunstiha:                        Fixed-point fractional library routines.
                                                             (line 1728)
* __fractunstihq:                        Fixed-point fractional library routines.
                                                             (line 1724)
* __fractunstiqq:                        Fixed-point fractional library routines.
                                                             (line 1723)
* __fractunstisa:                        Fixed-point fractional library routines.
                                                             (line 1729)
* __fractunstisq:                        Fixed-point fractional library routines.
                                                             (line 1725)
* __fractunstita:                        Fixed-point fractional library routines.
                                                             (line 1732)
* __fractunstiuda:                       Fixed-point fractional library routines.
                                                             (line 1746)
* __fractunstiudq:                       Fixed-point fractional library routines.
                                                             (line 1740)
* __fractunstiuha:                       Fixed-point fractional library routines.
                                                             (line 1742)
* __fractunstiuhq:                       Fixed-point fractional library routines.
                                                             (line 1736)
* __fractunstiuqq:                       Fixed-point fractional library routines.
                                                             (line 1734)
* __fractunstiusa:                       Fixed-point fractional library routines.
                                                             (line 1744)
* __fractunstiusq:                       Fixed-point fractional library routines.
                                                             (line 1738)
* __fractunstiuta:                       Fixed-point fractional library routines.
                                                             (line 1748)
* __fractunsudadi:                       Fixed-point fractional library routines.
                                                             (line 1622)
* __fractunsudahi:                       Fixed-point fractional library routines.
                                                             (line 1618)
* __fractunsudaqi:                       Fixed-point fractional library routines.
                                                             (line 1616)
* __fractunsudasi:                       Fixed-point fractional library routines.
                                                             (line 1620)
* __fractunsudati:                       Fixed-point fractional library routines.
                                                             (line 1624)
* __fractunsudqdi:                       Fixed-point fractional library routines.
                                                             (line 1596)
* __fractunsudqhi:                       Fixed-point fractional library routines.
                                                             (line 1592)
* __fractunsudqqi:                       Fixed-point fractional library routines.
                                                             (line 1590)
* __fractunsudqsi:                       Fixed-point fractional library routines.
                                                             (line 1594)
* __fractunsudqti:                       Fixed-point fractional library routines.
                                                             (line 1598)
* __fractunsuhadi:                       Fixed-point fractional library routines.
                                                             (line 1606)
* __fractunsuhahi:                       Fixed-point fractional library routines.
                                                             (line 1602)
* __fractunsuhaqi:                       Fixed-point fractional library routines.
                                                             (line 1600)
* __fractunsuhasi:                       Fixed-point fractional library routines.
                                                             (line 1604)
* __fractunsuhati:                       Fixed-point fractional library routines.
                                                             (line 1608)
* __fractunsuhqdi:                       Fixed-point fractional library routines.
                                                             (line 1576)
* __fractunsuhqhi:                       Fixed-point fractional library routines.
                                                             (line 1574)
* __fractunsuhqqi:                       Fixed-point fractional library routines.
                                                             (line 1573)
* __fractunsuhqsi:                       Fixed-point fractional library routines.
                                                             (line 1575)
* __fractunsuhqti:                       Fixed-point fractional library routines.
                                                             (line 1578)
* __fractunsuqqdi:                       Fixed-point fractional library routines.
                                                             (line 1570)
* __fractunsuqqhi:                       Fixed-point fractional library routines.
                                                             (line 1566)
* __fractunsuqqqi:                       Fixed-point fractional library routines.
                                                             (line 1564)
* __fractunsuqqsi:                       Fixed-point fractional library routines.
                                                             (line 1568)
* __fractunsuqqti:                       Fixed-point fractional library routines.
                                                             (line 1572)
* __fractunsusadi:                       Fixed-point fractional library routines.
                                                             (line 1612)
* __fractunsusahi:                       Fixed-point fractional library routines.
                                                             (line 1610)
* __fractunsusaqi:                       Fixed-point fractional library routines.
                                                             (line 1609)
* __fractunsusasi:                       Fixed-point fractional library routines.
                                                             (line 1611)
* __fractunsusati:                       Fixed-point fractional library routines.
                                                             (line 1614)
* __fractunsusqdi:                       Fixed-point fractional library routines.
                                                             (line 1586)
* __fractunsusqhi:                       Fixed-point fractional library routines.
                                                             (line 1582)
* __fractunsusqqi:                       Fixed-point fractional library routines.
                                                             (line 1580)
* __fractunsusqsi:                       Fixed-point fractional library routines.
                                                             (line 1584)
* __fractunsusqti:                       Fixed-point fractional library routines.
                                                             (line 1588)
* __fractunsutadi:                       Fixed-point fractional library routines.
                                                             (line 1632)
* __fractunsutahi:                       Fixed-point fractional library routines.
                                                             (line 1628)
* __fractunsutaqi:                       Fixed-point fractional library routines.
                                                             (line 1626)
* __fractunsutasi:                       Fixed-point fractional library routines.
                                                             (line 1630)
* __fractunsutati:                       Fixed-point fractional library routines.
                                                             (line 1634)
* __fractuqqda:                          Fixed-point fractional library routines.
                                                             (line  672)
* __fractuqqdf:                          Fixed-point fractional library routines.
                                                             (line  695)
* __fractuqqdi:                          Fixed-point fractional library routines.
                                                             (line  692)
* __fractuqqdq:                          Fixed-point fractional library routines.
                                                             (line  669)
* __fractuqqha:                          Fixed-point fractional library routines.
                                                             (line  670)
* __fractuqqhi:                          Fixed-point fractional library routines.
                                                             (line  690)
* __fractuqqhq:                          Fixed-point fractional library routines.
                                                             (line  666)
* __fractuqqqi:                          Fixed-point fractional library routines.
                                                             (line  689)
* __fractuqqqq:                          Fixed-point fractional library routines.
                                                             (line  665)
* __fractuqqsa:                          Fixed-point fractional library routines.
                                                             (line  671)
* __fractuqqsf:                          Fixed-point fractional library routines.
                                                             (line  694)
* __fractuqqsi:                          Fixed-point fractional library routines.
                                                             (line  691)
* __fractuqqsq:                          Fixed-point fractional library routines.
                                                             (line  667)
* __fractuqqta:                          Fixed-point fractional library routines.
                                                             (line  674)
* __fractuqqti:                          Fixed-point fractional library routines.
                                                             (line  693)
* __fractuqquda:                         Fixed-point fractional library routines.
                                                             (line  686)
* __fractuqqudq2:                        Fixed-point fractional library routines.
                                                             (line  680)
* __fractuqquha:                         Fixed-point fractional library routines.
                                                             (line  682)
* __fractuqquhq2:                        Fixed-point fractional library routines.
                                                             (line  676)
* __fractuqqusa:                         Fixed-point fractional library routines.
                                                             (line  684)
* __fractuqqusq2:                        Fixed-point fractional library routines.
                                                             (line  678)
* __fractuqquta:                         Fixed-point fractional library routines.
                                                             (line  688)
* __fractusada:                          Fixed-point fractional library routines.
                                                             (line  829)
* __fractusadf:                          Fixed-point fractional library routines.
                                                             (line  850)
* __fractusadi:                          Fixed-point fractional library routines.
                                                             (line  847)
* __fractusadq:                          Fixed-point fractional library routines.
                                                             (line  826)
* __fractusaha:                          Fixed-point fractional library routines.
                                                             (line  827)
* __fractusahi:                          Fixed-point fractional library routines.
                                                             (line  845)
* __fractusahq:                          Fixed-point fractional library routines.
                                                             (line  824)
* __fractusaqi:                          Fixed-point fractional library routines.
                                                             (line  844)
* __fractusaqq:                          Fixed-point fractional library routines.
                                                             (line  823)
* __fractusasa:                          Fixed-point fractional library routines.
                                                             (line  828)
* __fractusasf:                          Fixed-point fractional library routines.
                                                             (line  849)
* __fractusasi:                          Fixed-point fractional library routines.
                                                             (line  846)
* __fractusasq:                          Fixed-point fractional library routines.
                                                             (line  825)
* __fractusata:                          Fixed-point fractional library routines.
                                                             (line  830)
* __fractusati:                          Fixed-point fractional library routines.
                                                             (line  848)
* __fractusauda2:                        Fixed-point fractional library routines.
                                                             (line  841)
* __fractusaudq:                         Fixed-point fractional library routines.
                                                             (line  837)
* __fractusauha2:                        Fixed-point fractional library routines.
                                                             (line  839)
* __fractusauhq:                         Fixed-point fractional library routines.
                                                             (line  833)
* __fractusauqq:                         Fixed-point fractional library routines.
                                                             (line  832)
* __fractusausq:                         Fixed-point fractional library routines.
                                                             (line  835)
* __fractusauta2:                        Fixed-point fractional library routines.
                                                             (line  843)
* __fractusqda:                          Fixed-point fractional library routines.
                                                             (line  731)
* __fractusqdf:                          Fixed-point fractional library routines.
                                                             (line  754)
* __fractusqdi:                          Fixed-point fractional library routines.
                                                             (line  751)
* __fractusqdq:                          Fixed-point fractional library routines.
                                                             (line  728)
* __fractusqha:                          Fixed-point fractional library routines.
                                                             (line  729)
* __fractusqhi:                          Fixed-point fractional library routines.
                                                             (line  749)
* __fractusqhq:                          Fixed-point fractional library routines.
                                                             (line  725)
* __fractusqqi:                          Fixed-point fractional library routines.
                                                             (line  748)
* __fractusqqq:                          Fixed-point fractional library routines.
                                                             (line  724)
* __fractusqsa:                          Fixed-point fractional library routines.
                                                             (line  730)
* __fractusqsf:                          Fixed-point fractional library routines.
                                                             (line  753)
* __fractusqsi:                          Fixed-point fractional library routines.
                                                             (line  750)
* __fractusqsq:                          Fixed-point fractional library routines.
                                                             (line  726)
* __fractusqta:                          Fixed-point fractional library routines.
                                                             (line  733)
* __fractusqti:                          Fixed-point fractional library routines.
                                                             (line  752)
* __fractusquda:                         Fixed-point fractional library routines.
                                                             (line  745)
* __fractusqudq2:                        Fixed-point fractional library routines.
                                                             (line  739)
* __fractusquha:                         Fixed-point fractional library routines.
                                                             (line  741)
* __fractusquhq2:                        Fixed-point fractional library routines.
                                                             (line  737)
* __fractusquqq2:                        Fixed-point fractional library routines.
                                                             (line  735)
* __fractusqusa:                         Fixed-point fractional library routines.
                                                             (line  743)
* __fractusquta:                         Fixed-point fractional library routines.
                                                             (line  747)
* __fractutada:                          Fixed-point fractional library routines.
                                                             (line  893)
* __fractutadf:                          Fixed-point fractional library routines.
                                                             (line  918)
* __fractutadi:                          Fixed-point fractional library routines.
                                                             (line  914)
* __fractutadq:                          Fixed-point fractional library routines.
                                                             (line  888)
* __fractutaha:                          Fixed-point fractional library routines.
                                                             (line  890)
* __fractutahi:                          Fixed-point fractional library routines.
                                                             (line  912)
* __fractutahq:                          Fixed-point fractional library routines.
                                                             (line  884)
* __fractutaqi:                          Fixed-point fractional library routines.
                                                             (line  911)
* __fractutaqq:                          Fixed-point fractional library routines.
                                                             (line  883)
* __fractutasa:                          Fixed-point fractional library routines.
                                                             (line  891)
* __fractutasf:                          Fixed-point fractional library routines.
                                                             (line  917)
* __fractutasi:                          Fixed-point fractional library routines.
                                                             (line  913)
* __fractutasq:                          Fixed-point fractional library routines.
                                                             (line  886)
* __fractutata:                          Fixed-point fractional library routines.
                                                             (line  895)
* __fractutati:                          Fixed-point fractional library routines.
                                                             (line  916)
* __fractutauda2:                        Fixed-point fractional library routines.
                                                             (line  909)
* __fractutaudq:                         Fixed-point fractional library routines.
                                                             (line  903)
* __fractutauha2:                        Fixed-point fractional library routines.
                                                             (line  905)
* __fractutauhq:                         Fixed-point fractional library routines.
                                                             (line  899)
* __fractutauqq:                         Fixed-point fractional library routines.
                                                             (line  897)
* __fractutausa2:                        Fixed-point fractional library routines.
                                                             (line  907)
* __fractutausq:                         Fixed-point fractional library routines.
                                                             (line  901)
* __gedf2:                               Soft float library routines.
                                                             (line  206)
* __gesf2:                               Soft float library routines.
                                                             (line  205)
* __getf2:                               Soft float library routines.
                                                             (line  207)
* __gtdf2:                               Soft float library routines.
                                                             (line  224)
* __gtsf2:                               Soft float library routines.
                                                             (line  223)
* __gttf2:                               Soft float library routines.
                                                             (line  225)
* __ledf2:                               Soft float library routines.
                                                             (line  218)
* __lesf2:                               Soft float library routines.
                                                             (line  217)
* __letf2:                               Soft float library routines.
                                                             (line  219)
* __lshrdi3:                             Integer library routines.
                                                             (line   31)
* __lshrsi3:                             Integer library routines.
                                                             (line   30)
* __lshrti3:                             Integer library routines.
                                                             (line   32)
* __lshruda3:                            Fixed-point fractional library routines.
                                                             (line  390)
* __lshrudq3:                            Fixed-point fractional library routines.
                                                             (line  384)
* __lshruha3:                            Fixed-point fractional library routines.
                                                             (line  386)
* __lshruhq3:                            Fixed-point fractional library routines.
                                                             (line  380)
* __lshruqq3:                            Fixed-point fractional library routines.
                                                             (line  378)
* __lshrusa3:                            Fixed-point fractional library routines.
                                                             (line  388)
* __lshrusq3:                            Fixed-point fractional library routines.
                                                             (line  382)
* __lshruta3:                            Fixed-point fractional library routines.
                                                             (line  392)
* __ltdf2:                               Soft float library routines.
                                                             (line  212)
* __ltsf2:                               Soft float library routines.
                                                             (line  211)
* __lttf2:                               Soft float library routines.
                                                             (line  213)
* __main:                                Collect2.           (line   15)
* __moddi3:                              Integer library routines.
                                                             (line   37)
* __modsi3:                              Integer library routines.
                                                             (line   36)
* __modti3:                              Integer library routines.
                                                             (line   38)
* __morestack_current_segment:           Miscellaneous routines.
                                                             (line   46)
* __morestack_initial_sp:                Miscellaneous routines.
                                                             (line   47)
* __morestack_segments:                  Miscellaneous routines.
                                                             (line   45)
* __mulda3:                              Fixed-point fractional library routines.
                                                             (line  171)
* __muldc3:                              Soft float library routines.
                                                             (line  241)
* __muldf3:                              Soft float library routines.
                                                             (line   40)
* __muldi3:                              Integer library routines.
                                                             (line   43)
* __muldq3:                              Fixed-point fractional library routines.
                                                             (line  159)
* __mulha3:                              Fixed-point fractional library routines.
                                                             (line  169)
* __mulhq3:                              Fixed-point fractional library routines.
                                                             (line  156)
* __mulqq3:                              Fixed-point fractional library routines.
                                                             (line  155)
* __mulsa3:                              Fixed-point fractional library routines.
                                                             (line  170)
* __mulsc3:                              Soft float library routines.
                                                             (line  239)
* __mulsf3:                              Soft float library routines.
                                                             (line   39)
* __mulsi3:                              Integer library routines.
                                                             (line   42)
* __mulsq3:                              Fixed-point fractional library routines.
                                                             (line  157)
* __multa3:                              Fixed-point fractional library routines.
                                                             (line  173)
* __multc3:                              Soft float library routines.
                                                             (line  243)
* __multf3:                              Soft float library routines.
                                                             (line   42)
* __multi3:                              Integer library routines.
                                                             (line   44)
* __muluda3:                             Fixed-point fractional library routines.
                                                             (line  179)
* __muludq3:                             Fixed-point fractional library routines.
                                                             (line  167)
* __muluha3:                             Fixed-point fractional library routines.
                                                             (line  175)
* __muluhq3:                             Fixed-point fractional library routines.
                                                             (line  163)
* __muluqq3:                             Fixed-point fractional library routines.
                                                             (line  161)
* __mulusa3:                             Fixed-point fractional library routines.
                                                             (line  177)
* __mulusq3:                             Fixed-point fractional library routines.
                                                             (line  165)
* __muluta3:                             Fixed-point fractional library routines.
                                                             (line  181)
* __mulvdi3:                             Integer library routines.
                                                             (line  115)
* __mulvsi3:                             Integer library routines.
                                                             (line  114)
* __mulxc3:                              Soft float library routines.
                                                             (line  245)
* __mulxf3:                              Soft float library routines.
                                                             (line   44)
* __nedf2:                               Soft float library routines.
                                                             (line  200)
* __negda2:                              Fixed-point fractional library routines.
                                                             (line  299)
* __negdf2:                              Soft float library routines.
                                                             (line   56)
* __negdi2:                              Integer library routines.
                                                             (line   47)
* __negdq2:                              Fixed-point fractional library routines.
                                                             (line  289)
* __negha2:                              Fixed-point fractional library routines.
                                                             (line  297)
* __neghq2:                              Fixed-point fractional library routines.
                                                             (line  287)
* __negqq2:                              Fixed-point fractional library routines.
                                                             (line  286)
* __negsa2:                              Fixed-point fractional library routines.
                                                             (line  298)
* __negsf2:                              Soft float library routines.
                                                             (line   55)
* __negsq2:                              Fixed-point fractional library routines.
                                                             (line  288)
* __negta2:                              Fixed-point fractional library routines.
                                                             (line  300)
* __negtf2:                              Soft float library routines.
                                                             (line   57)
* __negti2:                              Integer library routines.
                                                             (line   48)
* __neguda2:                             Fixed-point fractional library routines.
                                                             (line  305)
* __negudq2:                             Fixed-point fractional library routines.
                                                             (line  296)
* __neguha2:                             Fixed-point fractional library routines.
                                                             (line  302)
* __neguhq2:                             Fixed-point fractional library routines.
                                                             (line  292)
* __neguqq2:                             Fixed-point fractional library routines.
                                                             (line  291)
* __negusa2:                             Fixed-point fractional library routines.
                                                             (line  303)
* __negusq2:                             Fixed-point fractional library routines.
                                                             (line  294)
* __neguta2:                             Fixed-point fractional library routines.
                                                             (line  307)
* __negvdi2:                             Integer library routines.
                                                             (line  119)
* __negvsi2:                             Integer library routines.
                                                             (line  118)
* __negxf2:                              Soft float library routines.
                                                             (line   58)
* __nesf2:                               Soft float library routines.
                                                             (line  199)
* __netf2:                               Soft float library routines.
                                                             (line  201)
* __paritydi2:                           Integer library routines.
                                                             (line  151)
* __paritysi2:                           Integer library routines.
                                                             (line  150)
* __parityti2:                           Integer library routines.
                                                             (line  152)
* __popcountdi2:                         Integer library routines.
                                                             (line  157)
* __popcountsi2:                         Integer library routines.
                                                             (line  156)
* __popcountti2:                         Integer library routines.
                                                             (line  158)
* __powidf2:                             Soft float library routines.
                                                             (line  233)
* __powisf2:                             Soft float library routines.
                                                             (line  232)
* __powitf2:                             Soft float library routines.
                                                             (line  234)
* __powixf2:                             Soft float library routines.
                                                             (line  235)
* __satfractdadq:                        Fixed-point fractional library routines.
                                                             (line 1153)
* __satfractdaha2:                       Fixed-point fractional library routines.
                                                             (line 1154)
* __satfractdahq:                        Fixed-point fractional library routines.
                                                             (line 1151)
* __satfractdaqq:                        Fixed-point fractional library routines.
                                                             (line 1150)
* __satfractdasa2:                       Fixed-point fractional library routines.
                                                             (line 1155)
* __satfractdasq:                        Fixed-point fractional library routines.
                                                             (line 1152)
* __satfractdata2:                       Fixed-point fractional library routines.
                                                             (line 1156)
* __satfractdauda:                       Fixed-point fractional library routines.
                                                             (line 1166)
* __satfractdaudq:                       Fixed-point fractional library routines.
                                                             (line 1162)
* __satfractdauha:                       Fixed-point fractional library routines.
                                                             (line 1164)
* __satfractdauhq:                       Fixed-point fractional library routines.
                                                             (line 1159)
* __satfractdauqq:                       Fixed-point fractional library routines.
                                                             (line 1158)
* __satfractdausa:                       Fixed-point fractional library routines.
                                                             (line 1165)
* __satfractdausq:                       Fixed-point fractional library routines.
                                                             (line 1160)
* __satfractdauta:                       Fixed-point fractional library routines.
                                                             (line 1168)
* __satfractdfda:                        Fixed-point fractional library routines.
                                                             (line 1506)
* __satfractdfdq:                        Fixed-point fractional library routines.
                                                             (line 1503)
* __satfractdfha:                        Fixed-point fractional library routines.
                                                             (line 1504)
* __satfractdfhq:                        Fixed-point fractional library routines.
                                                             (line 1501)
* __satfractdfqq:                        Fixed-point fractional library routines.
                                                             (line 1500)
* __satfractdfsa:                        Fixed-point fractional library routines.
                                                             (line 1505)
* __satfractdfsq:                        Fixed-point fractional library routines.
                                                             (line 1502)
* __satfractdfta:                        Fixed-point fractional library routines.
                                                             (line 1507)
* __satfractdfuda:                       Fixed-point fractional library routines.
                                                             (line 1515)
* __satfractdfudq:                       Fixed-point fractional library routines.
                                                             (line 1512)
* __satfractdfuha:                       Fixed-point fractional library routines.
                                                             (line 1513)
* __satfractdfuhq:                       Fixed-point fractional library routines.
                                                             (line 1509)
* __satfractdfuqq:                       Fixed-point fractional library routines.
                                                             (line 1508)
* __satfractdfusa:                       Fixed-point fractional library routines.
                                                             (line 1514)
* __satfractdfusq:                       Fixed-point fractional library routines.
                                                             (line 1510)
* __satfractdfuta:                       Fixed-point fractional library routines.
                                                             (line 1517)
* __satfractdida:                        Fixed-point fractional library routines.
                                                             (line 1456)
* __satfractdidq:                        Fixed-point fractional library routines.
                                                             (line 1453)
* __satfractdiha:                        Fixed-point fractional library routines.
                                                             (line 1454)
* __satfractdihq:                        Fixed-point fractional library routines.
                                                             (line 1451)
* __satfractdiqq:                        Fixed-point fractional library routines.
                                                             (line 1450)
* __satfractdisa:                        Fixed-point fractional library routines.
                                                             (line 1455)
* __satfractdisq:                        Fixed-point fractional library routines.
                                                             (line 1452)
* __satfractdita:                        Fixed-point fractional library routines.
                                                             (line 1457)
* __satfractdiuda:                       Fixed-point fractional library routines.
                                                             (line 1464)
* __satfractdiudq:                       Fixed-point fractional library routines.
                                                             (line 1461)
* __satfractdiuha:                       Fixed-point fractional library routines.
                                                             (line 1462)
* __satfractdiuhq:                       Fixed-point fractional library routines.
                                                             (line 1459)
* __satfractdiuqq:                       Fixed-point fractional library routines.
                                                             (line 1458)
* __satfractdiusa:                       Fixed-point fractional library routines.
                                                             (line 1463)
* __satfractdiusq:                       Fixed-point fractional library routines.
                                                             (line 1460)
* __satfractdiuta:                       Fixed-point fractional library routines.
                                                             (line 1465)
* __satfractdqda:                        Fixed-point fractional library routines.
                                                             (line 1098)
* __satfractdqha:                        Fixed-point fractional library routines.
                                                             (line 1096)
* __satfractdqhq2:                       Fixed-point fractional library routines.
                                                             (line 1094)
* __satfractdqqq2:                       Fixed-point fractional library routines.
                                                             (line 1093)
* __satfractdqsa:                        Fixed-point fractional library routines.
                                                             (line 1097)
* __satfractdqsq2:                       Fixed-point fractional library routines.
                                                             (line 1095)
* __satfractdqta:                        Fixed-point fractional library routines.
                                                             (line 1099)
* __satfractdquda:                       Fixed-point fractional library routines.
                                                             (line 1111)
* __satfractdqudq:                       Fixed-point fractional library routines.
                                                             (line 1106)
* __satfractdquha:                       Fixed-point fractional library routines.
                                                             (line 1108)
* __satfractdquhq:                       Fixed-point fractional library routines.
                                                             (line 1102)
* __satfractdquqq:                       Fixed-point fractional library routines.
                                                             (line 1101)
* __satfractdqusa:                       Fixed-point fractional library routines.
                                                             (line 1109)
* __satfractdqusq:                       Fixed-point fractional library routines.
                                                             (line 1104)
* __satfractdquta:                       Fixed-point fractional library routines.
                                                             (line 1113)
* __satfracthada2:                       Fixed-point fractional library routines.
                                                             (line 1119)
* __satfracthadq:                        Fixed-point fractional library routines.
                                                             (line 1117)
* __satfracthahq:                        Fixed-point fractional library routines.
                                                             (line 1115)
* __satfracthaqq:                        Fixed-point fractional library routines.
                                                             (line 1114)
* __satfracthasa2:                       Fixed-point fractional library routines.
                                                             (line 1118)
* __satfracthasq:                        Fixed-point fractional library routines.
                                                             (line 1116)
* __satfracthata2:                       Fixed-point fractional library routines.
                                                             (line 1120)
* __satfracthauda:                       Fixed-point fractional library routines.
                                                             (line 1132)
* __satfracthaudq:                       Fixed-point fractional library routines.
                                                             (line 1127)
* __satfracthauha:                       Fixed-point fractional library routines.
                                                             (line 1129)
* __satfracthauhq:                       Fixed-point fractional library routines.
                                                             (line 1123)
* __satfracthauqq:                       Fixed-point fractional library routines.
                                                             (line 1122)
* __satfracthausa:                       Fixed-point fractional library routines.
                                                             (line 1130)
* __satfracthausq:                       Fixed-point fractional library routines.
                                                             (line 1125)
* __satfracthauta:                       Fixed-point fractional library routines.
                                                             (line 1134)
* __satfracthida:                        Fixed-point fractional library routines.
                                                             (line 1424)
* __satfracthidq:                        Fixed-point fractional library routines.
                                                             (line 1421)
* __satfracthiha:                        Fixed-point fractional library routines.
                                                             (line 1422)
* __satfracthihq:                        Fixed-point fractional library routines.
                                                             (line 1419)
* __satfracthiqq:                        Fixed-point fractional library routines.
                                                             (line 1418)
* __satfracthisa:                        Fixed-point fractional library routines.
                                                             (line 1423)
* __satfracthisq:                        Fixed-point fractional library routines.
                                                             (line 1420)
* __satfracthita:                        Fixed-point fractional library routines.
                                                             (line 1425)
* __satfracthiuda:                       Fixed-point fractional library routines.
                                                             (line 1432)
* __satfracthiudq:                       Fixed-point fractional library routines.
                                                             (line 1429)
* __satfracthiuha:                       Fixed-point fractional library routines.
                                                             (line 1430)
* __satfracthiuhq:                       Fixed-point fractional library routines.
                                                             (line 1427)
* __satfracthiuqq:                       Fixed-point fractional library routines.
                                                             (line 1426)
* __satfracthiusa:                       Fixed-point fractional library routines.
                                                             (line 1431)
* __satfracthiusq:                       Fixed-point fractional library routines.
                                                             (line 1428)
* __satfracthiuta:                       Fixed-point fractional library routines.
                                                             (line 1433)
* __satfracthqda:                        Fixed-point fractional library routines.
                                                             (line 1064)
* __satfracthqdq2:                       Fixed-point fractional library routines.
                                                             (line 1061)
* __satfracthqha:                        Fixed-point fractional library routines.
                                                             (line 1062)
* __satfracthqqq2:                       Fixed-point fractional library routines.
                                                             (line 1059)
* __satfracthqsa:                        Fixed-point fractional library routines.
                                                             (line 1063)
* __satfracthqsq2:                       Fixed-point fractional library routines.
                                                             (line 1060)
* __satfracthqta:                        Fixed-point fractional library routines.
                                                             (line 1065)
* __satfracthquda:                       Fixed-point fractional library routines.
                                                             (line 1072)
* __satfracthqudq:                       Fixed-point fractional library routines.
                                                             (line 1069)
* __satfracthquha:                       Fixed-point fractional library routines.
                                                             (line 1070)
* __satfracthquhq:                       Fixed-point fractional library routines.
                                                             (line 1067)
* __satfracthquqq:                       Fixed-point fractional library routines.
                                                             (line 1066)
* __satfracthqusa:                       Fixed-point fractional library routines.
                                                             (line 1071)
* __satfracthqusq:                       Fixed-point fractional library routines.
                                                             (line 1068)
* __satfracthquta:                       Fixed-point fractional library routines.
                                                             (line 1073)
* __satfractqida:                        Fixed-point fractional library routines.
                                                             (line 1402)
* __satfractqidq:                        Fixed-point fractional library routines.
                                                             (line 1399)
* __satfractqiha:                        Fixed-point fractional library routines.
                                                             (line 1400)
* __satfractqihq:                        Fixed-point fractional library routines.
                                                             (line 1397)
* __satfractqiqq:                        Fixed-point fractional library routines.
                                                             (line 1396)
* __satfractqisa:                        Fixed-point fractional library routines.
                                                             (line 1401)
* __satfractqisq:                        Fixed-point fractional library routines.
                                                             (line 1398)
* __satfractqita:                        Fixed-point fractional library routines.
                                                             (line 1403)
* __satfractqiuda:                       Fixed-point fractional library routines.
                                                             (line 1415)
* __satfractqiudq:                       Fixed-point fractional library routines.
                                                             (line 1410)
* __satfractqiuha:                       Fixed-point fractional library routines.
                                                             (line 1412)
* __satfractqiuhq:                       Fixed-point fractional library routines.
                                                             (line 1406)
* __satfractqiuqq:                       Fixed-point fractional library routines.
                                                             (line 1405)
* __satfractqiusa:                       Fixed-point fractional library routines.
                                                             (line 1413)
* __satfractqiusq:                       Fixed-point fractional library routines.
                                                             (line 1408)
* __satfractqiuta:                       Fixed-point fractional library routines.
                                                             (line 1417)
* __satfractqqda:                        Fixed-point fractional library routines.
                                                             (line 1043)
* __satfractqqdq2:                       Fixed-point fractional library routines.
                                                             (line 1040)
* __satfractqqha:                        Fixed-point fractional library routines.
                                                             (line 1041)
* __satfractqqhq2:                       Fixed-point fractional library routines.
                                                             (line 1038)
* __satfractqqsa:                        Fixed-point fractional library routines.
                                                             (line 1042)
* __satfractqqsq2:                       Fixed-point fractional library routines.
                                                             (line 1039)
* __satfractqqta:                        Fixed-point fractional library routines.
                                                             (line 1044)
* __satfractqquda:                       Fixed-point fractional library routines.
                                                             (line 1056)
* __satfractqqudq:                       Fixed-point fractional library routines.
                                                             (line 1051)
* __satfractqquha:                       Fixed-point fractional library routines.
                                                             (line 1053)
* __satfractqquhq:                       Fixed-point fractional library routines.
                                                             (line 1047)
* __satfractqquqq:                       Fixed-point fractional library routines.
                                                             (line 1046)
* __satfractqqusa:                       Fixed-point fractional library routines.
                                                             (line 1054)
* __satfractqqusq:                       Fixed-point fractional library routines.
                                                             (line 1049)
* __satfractqquta:                       Fixed-point fractional library routines.
                                                             (line 1058)
* __satfractsada2:                       Fixed-point fractional library routines.
                                                             (line 1140)
* __satfractsadq:                        Fixed-point fractional library routines.
                                                             (line 1138)
* __satfractsaha2:                       Fixed-point fractional library routines.
                                                             (line 1139)
* __satfractsahq:                        Fixed-point fractional library routines.
                                                             (line 1136)
* __satfractsaqq:                        Fixed-point fractional library routines.
                                                             (line 1135)
* __satfractsasq:                        Fixed-point fractional library routines.
                                                             (line 1137)
* __satfractsata2:                       Fixed-point fractional library routines.
                                                             (line 1141)
* __satfractsauda:                       Fixed-point fractional library routines.
                                                             (line 1148)
* __satfractsaudq:                       Fixed-point fractional library routines.
                                                             (line 1145)
* __satfractsauha:                       Fixed-point fractional library routines.
                                                             (line 1146)
* __satfractsauhq:                       Fixed-point fractional library routines.
                                                             (line 1143)
* __satfractsauqq:                       Fixed-point fractional library routines.
                                                             (line 1142)
* __satfractsausa:                       Fixed-point fractional library routines.
                                                             (line 1147)
* __satfractsausq:                       Fixed-point fractional library routines.
                                                             (line 1144)
* __satfractsauta:                       Fixed-point fractional library routines.
                                                             (line 1149)
* __satfractsfda:                        Fixed-point fractional library routines.
                                                             (line 1490)
* __satfractsfdq:                        Fixed-point fractional library routines.
                                                             (line 1487)
* __satfractsfha:                        Fixed-point fractional library routines.
                                                             (line 1488)
* __satfractsfhq:                        Fixed-point fractional library routines.
                                                             (line 1485)
* __satfractsfqq:                        Fixed-point fractional library routines.
                                                             (line 1484)
* __satfractsfsa:                        Fixed-point fractional library routines.
                                                             (line 1489)
* __satfractsfsq:                        Fixed-point fractional library routines.
                                                             (line 1486)
* __satfractsfta:                        Fixed-point fractional library routines.
                                                             (line 1491)
* __satfractsfuda:                       Fixed-point fractional library routines.
                                                             (line 1498)
* __satfractsfudq:                       Fixed-point fractional library routines.
                                                             (line 1495)
* __satfractsfuha:                       Fixed-point fractional library routines.
                                                             (line 1496)
* __satfractsfuhq:                       Fixed-point fractional library routines.
                                                             (line 1493)
* __satfractsfuqq:                       Fixed-point fractional library routines.
                                                             (line 1492)
* __satfractsfusa:                       Fixed-point fractional library routines.
                                                             (line 1497)
* __satfractsfusq:                       Fixed-point fractional library routines.
                                                             (line 1494)
* __satfractsfuta:                       Fixed-point fractional library routines.
                                                             (line 1499)
* __satfractsida:                        Fixed-point fractional library routines.
                                                             (line 1440)
* __satfractsidq:                        Fixed-point fractional library routines.
                                                             (line 1437)
* __satfractsiha:                        Fixed-point fractional library routines.
                                                             (line 1438)
* __satfractsihq:                        Fixed-point fractional library routines.
                                                             (line 1435)
* __satfractsiqq:                        Fixed-point fractional library routines.
                                                             (line 1434)
* __satfractsisa:                        Fixed-point fractional library routines.
                                                             (line 1439)
* __satfractsisq:                        Fixed-point fractional library routines.
                                                             (line 1436)
* __satfractsita:                        Fixed-point fractional library routines.
                                                             (line 1441)
* __satfractsiuda:                       Fixed-point fractional library routines.
                                                             (line 1448)
* __satfractsiudq:                       Fixed-point fractional library routines.
                                                             (line 1445)
* __satfractsiuha:                       Fixed-point fractional library routines.
                                                             (line 1446)
* __satfractsiuhq:                       Fixed-point fractional library routines.
                                                             (line 1443)
* __satfractsiuqq:                       Fixed-point fractional library routines.
                                                             (line 1442)
* __satfractsiusa:                       Fixed-point fractional library routines.
                                                             (line 1447)
* __satfractsiusq:                       Fixed-point fractional library routines.
                                                             (line 1444)
* __satfractsiuta:                       Fixed-point fractional library routines.
                                                             (line 1449)
* __satfractsqda:                        Fixed-point fractional library routines.
                                                             (line 1079)
* __satfractsqdq2:                       Fixed-point fractional library routines.
                                                             (line 1076)
* __satfractsqha:                        Fixed-point fractional library routines.
                                                             (line 1077)
* __satfractsqhq2:                       Fixed-point fractional library routines.
                                                             (line 1075)
* __satfractsqqq2:                       Fixed-point fractional library routines.
                                                             (line 1074)
* __satfractsqsa:                        Fixed-point fractional library routines.
                                                             (line 1078)
* __satfractsqta:                        Fixed-point fractional library routines.
                                                             (line 1080)
* __satfractsquda:                       Fixed-point fractional library routines.
                                                             (line 1090)
* __satfractsqudq:                       Fixed-point fractional library routines.
                                                             (line 1086)
* __satfractsquha:                       Fixed-point fractional library routines.
                                                             (line 1088)
* __satfractsquhq:                       Fixed-point fractional library routines.
                                                             (line 1083)
* __satfractsquqq:                       Fixed-point fractional library routines.
                                                             (line 1082)
* __satfractsqusa:                       Fixed-point fractional library routines.
                                                             (line 1089)
* __satfractsqusq:                       Fixed-point fractional library routines.
                                                             (line 1084)
* __satfractsquta:                       Fixed-point fractional library routines.
                                                             (line 1092)
* __satfracttada2:                       Fixed-point fractional library routines.
                                                             (line 1175)
* __satfracttadq:                        Fixed-point fractional library routines.
                                                             (line 1172)
* __satfracttaha2:                       Fixed-point fractional library routines.
                                                             (line 1173)
* __satfracttahq:                        Fixed-point fractional library routines.
                                                             (line 1170)
* __satfracttaqq:                        Fixed-point fractional library routines.
                                                             (line 1169)
* __satfracttasa2:                       Fixed-point fractional library routines.
                                                             (line 1174)
* __satfracttasq:                        Fixed-point fractional library routines.
                                                             (line 1171)
* __satfracttauda:                       Fixed-point fractional library routines.
                                                             (line 1187)
* __satfracttaudq:                       Fixed-point fractional library routines.
                                                             (line 1182)
* __satfracttauha:                       Fixed-point fractional library routines.
                                                             (line 1184)
* __satfracttauhq:                       Fixed-point fractional library routines.
                                                             (line 1178)
* __satfracttauqq:                       Fixed-point fractional library routines.
                                                             (line 1177)
* __satfracttausa:                       Fixed-point fractional library routines.
                                                             (line 1185)
* __satfracttausq:                       Fixed-point fractional library routines.
                                                             (line 1180)
* __satfracttauta:                       Fixed-point fractional library routines.
                                                             (line 1189)
* __satfracttida:                        Fixed-point fractional library routines.
                                                             (line 1472)
* __satfracttidq:                        Fixed-point fractional library routines.
                                                             (line 1469)
* __satfracttiha:                        Fixed-point fractional library routines.
                                                             (line 1470)
* __satfracttihq:                        Fixed-point fractional library routines.
                                                             (line 1467)
* __satfracttiqq:                        Fixed-point fractional library routines.
                                                             (line 1466)
* __satfracttisa:                        Fixed-point fractional library routines.
                                                             (line 1471)
* __satfracttisq:                        Fixed-point fractional library routines.
                                                             (line 1468)
* __satfracttita:                        Fixed-point fractional library routines.
                                                             (line 1473)
* __satfracttiuda:                       Fixed-point fractional library routines.
                                                             (line 1481)
* __satfracttiudq:                       Fixed-point fractional library routines.
                                                             (line 1478)
* __satfracttiuha:                       Fixed-point fractional library routines.
                                                             (line 1479)
* __satfracttiuhq:                       Fixed-point fractional library routines.
                                                             (line 1475)
* __satfracttiuqq:                       Fixed-point fractional library routines.
                                                             (line 1474)
* __satfracttiusa:                       Fixed-point fractional library routines.
                                                             (line 1480)
* __satfracttiusq:                       Fixed-point fractional library routines.
                                                             (line 1476)
* __satfracttiuta:                       Fixed-point fractional library routines.
                                                             (line 1483)
* __satfractudada:                       Fixed-point fractional library routines.
                                                             (line 1351)
* __satfractudadq:                       Fixed-point fractional library routines.
                                                             (line 1347)
* __satfractudaha:                       Fixed-point fractional library routines.
                                                             (line 1349)
* __satfractudahq:                       Fixed-point fractional library routines.
                                                             (line 1344)
* __satfractudaqq:                       Fixed-point fractional library routines.
                                                             (line 1343)
* __satfractudasa:                       Fixed-point fractional library routines.
                                                             (line 1350)
* __satfractudasq:                       Fixed-point fractional library routines.
                                                             (line 1345)
* __satfractudata:                       Fixed-point fractional library routines.
                                                             (line 1353)
* __satfractudaudq:                      Fixed-point fractional library routines.
                                                             (line 1361)
* __satfractudauha2:                     Fixed-point fractional library routines.
                                                             (line 1363)
* __satfractudauhq:                      Fixed-point fractional library routines.
                                                             (line 1357)
* __satfractudauqq:                      Fixed-point fractional library routines.
                                                             (line 1355)
* __satfractudausa2:                     Fixed-point fractional library routines.
                                                             (line 1365)
* __satfractudausq:                      Fixed-point fractional library routines.
                                                             (line 1359)
* __satfractudauta2:                     Fixed-point fractional library routines.
                                                             (line 1367)
* __satfractudqda:                       Fixed-point fractional library routines.
                                                             (line 1276)
* __satfractudqdq:                       Fixed-point fractional library routines.
                                                             (line 1271)
* __satfractudqha:                       Fixed-point fractional library routines.
                                                             (line 1273)
* __satfractudqhq:                       Fixed-point fractional library routines.
                                                             (line 1267)
* __satfractudqqq:                       Fixed-point fractional library routines.
                                                             (line 1266)
* __satfractudqsa:                       Fixed-point fractional library routines.
                                                             (line 1274)
* __satfractudqsq:                       Fixed-point fractional library routines.
                                                             (line 1269)
* __satfractudqta:                       Fixed-point fractional library routines.
                                                             (line 1278)
* __satfractudquda:                      Fixed-point fractional library routines.
                                                             (line 1290)
* __satfractudquha:                      Fixed-point fractional library routines.
                                                             (line 1286)
* __satfractudquhq2:                     Fixed-point fractional library routines.
                                                             (line 1282)
* __satfractudquqq2:                     Fixed-point fractional library routines.
                                                             (line 1280)
* __satfractudqusa:                      Fixed-point fractional library routines.
                                                             (line 1288)
* __satfractudqusq2:                     Fixed-point fractional library routines.
                                                             (line 1284)
* __satfractudquta:                      Fixed-point fractional library routines.
                                                             (line 1292)
* __satfractuhada:                       Fixed-point fractional library routines.
                                                             (line 1304)
* __satfractuhadq:                       Fixed-point fractional library routines.
                                                             (line 1299)
* __satfractuhaha:                       Fixed-point fractional library routines.
                                                             (line 1301)
* __satfractuhahq:                       Fixed-point fractional library routines.
                                                             (line 1295)
* __satfractuhaqq:                       Fixed-point fractional library routines.
                                                             (line 1294)
* __satfractuhasa:                       Fixed-point fractional library routines.
                                                             (line 1302)
* __satfractuhasq:                       Fixed-point fractional library routines.
                                                             (line 1297)
* __satfractuhata:                       Fixed-point fractional library routines.
                                                             (line 1306)
* __satfractuhauda2:                     Fixed-point fractional library routines.
                                                             (line 1318)
* __satfractuhaudq:                      Fixed-point fractional library routines.
                                                             (line 1314)
* __satfractuhauhq:                      Fixed-point fractional library routines.
                                                             (line 1310)
* __satfractuhauqq:                      Fixed-point fractional library routines.
                                                             (line 1308)
* __satfractuhausa2:                     Fixed-point fractional library routines.
                                                             (line 1316)
* __satfractuhausq:                      Fixed-point fractional library routines.
                                                             (line 1312)
* __satfractuhauta2:                     Fixed-point fractional library routines.
                                                             (line 1320)
* __satfractuhqda:                       Fixed-point fractional library routines.
                                                             (line 1224)
* __satfractuhqdq:                       Fixed-point fractional library routines.
                                                             (line 1221)
* __satfractuhqha:                       Fixed-point fractional library routines.
                                                             (line 1222)
* __satfractuhqhq:                       Fixed-point fractional library routines.
                                                             (line 1219)
* __satfractuhqqq:                       Fixed-point fractional library routines.
                                                             (line 1218)
* __satfractuhqsa:                       Fixed-point fractional library routines.
                                                             (line 1223)
* __satfractuhqsq:                       Fixed-point fractional library routines.
                                                             (line 1220)
* __satfractuhqta:                       Fixed-point fractional library routines.
                                                             (line 1225)
* __satfractuhquda:                      Fixed-point fractional library routines.
                                                             (line 1236)
* __satfractuhqudq2:                     Fixed-point fractional library routines.
                                                             (line 1231)
* __satfractuhquha:                      Fixed-point fractional library routines.
                                                             (line 1233)
* __satfractuhquqq2:                     Fixed-point fractional library routines.
                                                             (line 1227)
* __satfractuhqusa:                      Fixed-point fractional library routines.
                                                             (line 1234)
* __satfractuhqusq2:                     Fixed-point fractional library routines.
                                                             (line 1229)
* __satfractuhquta:                      Fixed-point fractional library routines.
                                                             (line 1238)
* __satfractunsdida:                     Fixed-point fractional library routines.
                                                             (line 1834)
* __satfractunsdidq:                     Fixed-point fractional library routines.
                                                             (line 1831)
* __satfractunsdiha:                     Fixed-point fractional library routines.
                                                             (line 1832)
* __satfractunsdihq:                     Fixed-point fractional library routines.
                                                             (line 1828)
* __satfractunsdiqq:                     Fixed-point fractional library routines.
                                                             (line 1827)
* __satfractunsdisa:                     Fixed-point fractional library routines.
                                                             (line 1833)
* __satfractunsdisq:                     Fixed-point fractional library routines.
                                                             (line 1829)
* __satfractunsdita:                     Fixed-point fractional library routines.
                                                             (line 1836)
* __satfractunsdiuda:                    Fixed-point fractional library routines.
                                                             (line 1850)
* __satfractunsdiudq:                    Fixed-point fractional library routines.
                                                             (line 1844)
* __satfractunsdiuha:                    Fixed-point fractional library routines.
                                                             (line 1846)
* __satfractunsdiuhq:                    Fixed-point fractional library routines.
                                                             (line 1840)
* __satfractunsdiuqq:                    Fixed-point fractional library routines.
                                                             (line 1838)
* __satfractunsdiusa:                    Fixed-point fractional library routines.
                                                             (line 1848)
* __satfractunsdiusq:                    Fixed-point fractional library routines.
                                                             (line 1842)
* __satfractunsdiuta:                    Fixed-point fractional library routines.
                                                             (line 1852)
* __satfractunshida:                     Fixed-point fractional library routines.
                                                             (line 1786)
* __satfractunshidq:                     Fixed-point fractional library routines.
                                                             (line 1783)
* __satfractunshiha:                     Fixed-point fractional library routines.
                                                             (line 1784)
* __satfractunshihq:                     Fixed-point fractional library routines.
                                                             (line 1780)
* __satfractunshiqq:                     Fixed-point fractional library routines.
                                                             (line 1779)
* __satfractunshisa:                     Fixed-point fractional library routines.
                                                             (line 1785)
* __satfractunshisq:                     Fixed-point fractional library routines.
                                                             (line 1781)
* __satfractunshita:                     Fixed-point fractional library routines.
                                                             (line 1788)
* __satfractunshiuda:                    Fixed-point fractional library routines.
                                                             (line 1802)
* __satfractunshiudq:                    Fixed-point fractional library routines.
                                                             (line 1796)
* __satfractunshiuha:                    Fixed-point fractional library routines.
                                                             (line 1798)
* __satfractunshiuhq:                    Fixed-point fractional library routines.
                                                             (line 1792)
* __satfractunshiuqq:                    Fixed-point fractional library routines.
                                                             (line 1790)
* __satfractunshiusa:                    Fixed-point fractional library routines.
                                                             (line 1800)
* __satfractunshiusq:                    Fixed-point fractional library routines.
                                                             (line 1794)
* __satfractunshiuta:                    Fixed-point fractional library routines.
                                                             (line 1804)
* __satfractunsqida:                     Fixed-point fractional library routines.
                                                             (line 1760)
* __satfractunsqidq:                     Fixed-point fractional library routines.
                                                             (line 1757)
* __satfractunsqiha:                     Fixed-point fractional library routines.
                                                             (line 1758)
* __satfractunsqihq:                     Fixed-point fractional library routines.
                                                             (line 1754)
* __satfractunsqiqq:                     Fixed-point fractional library routines.
                                                             (line 1753)
* __satfractunsqisa:                     Fixed-point fractional library routines.
                                                             (line 1759)
* __satfractunsqisq:                     Fixed-point fractional library routines.
                                                             (line 1755)
* __satfractunsqita:                     Fixed-point fractional library routines.
                                                             (line 1762)
* __satfractunsqiuda:                    Fixed-point fractional library routines.
                                                             (line 1776)
* __satfractunsqiudq:                    Fixed-point fractional library routines.
                                                             (line 1770)
* __satfractunsqiuha:                    Fixed-point fractional library routines.
                                                             (line 1772)
* __satfractunsqiuhq:                    Fixed-point fractional library routines.
                                                             (line 1766)
* __satfractunsqiuqq:                    Fixed-point fractional library routines.
                                                             (line 1764)
* __satfractunsqiusa:                    Fixed-point fractional library routines.
                                                             (line 1774)
* __satfractunsqiusq:                    Fixed-point fractional library routines.
                                                             (line 1768)
* __satfractunsqiuta:                    Fixed-point fractional library routines.
                                                             (line 1778)
* __satfractunssida:                     Fixed-point fractional library routines.
                                                             (line 1811)
* __satfractunssidq:                     Fixed-point fractional library routines.
                                                             (line 1808)
* __satfractunssiha:                     Fixed-point fractional library routines.
                                                             (line 1809)
* __satfractunssihq:                     Fixed-point fractional library routines.
                                                             (line 1806)
* __satfractunssiqq:                     Fixed-point fractional library routines.
                                                             (line 1805)
* __satfractunssisa:                     Fixed-point fractional library routines.
                                                             (line 1810)
* __satfractunssisq:                     Fixed-point fractional library routines.
                                                             (line 1807)
* __satfractunssita:                     Fixed-point fractional library routines.
                                                             (line 1812)
* __satfractunssiuda:                    Fixed-point fractional library routines.
                                                             (line 1824)
* __satfractunssiudq:                    Fixed-point fractional library routines.
                                                             (line 1819)
* __satfractunssiuha:                    Fixed-point fractional library routines.
                                                             (line 1821)
* __satfractunssiuhq:                    Fixed-point fractional library routines.
                                                             (line 1815)
* __satfractunssiuqq:                    Fixed-point fractional library routines.
                                                             (line 1814)
* __satfractunssiusa:                    Fixed-point fractional library routines.
                                                             (line 1822)
* __satfractunssiusq:                    Fixed-point fractional library routines.
                                                             (line 1817)
* __satfractunssiuta:                    Fixed-point fractional library routines.
                                                             (line 1826)
* __satfractunstida:                     Fixed-point fractional library routines.
                                                             (line 1864)
* __satfractunstidq:                     Fixed-point fractional library routines.
                                                             (line 1859)
* __satfractunstiha:                     Fixed-point fractional library routines.
                                                             (line 1861)
* __satfractunstihq:                     Fixed-point fractional library routines.
                                                             (line 1855)
* __satfractunstiqq:                     Fixed-point fractional library routines.
                                                             (line 1854)
* __satfractunstisa:                     Fixed-point fractional library routines.
                                                             (line 1862)
* __satfractunstisq:                     Fixed-point fractional library routines.
                                                             (line 1857)
* __satfractunstita:                     Fixed-point fractional library routines.
                                                             (line 1866)
* __satfractunstiuda:                    Fixed-point fractional library routines.
                                                             (line 1880)
* __satfractunstiudq:                    Fixed-point fractional library routines.
                                                             (line 1874)
* __satfractunstiuha:                    Fixed-point fractional library routines.
                                                             (line 1876)
* __satfractunstiuhq:                    Fixed-point fractional library routines.
                                                             (line 1870)
* __satfractunstiuqq:                    Fixed-point fractional library routines.
                                                             (line 1868)
* __satfractunstiusa:                    Fixed-point fractional library routines.
                                                             (line 1878)
* __satfractunstiusq:                    Fixed-point fractional library routines.
                                                             (line 1872)
* __satfractunstiuta:                    Fixed-point fractional library routines.
                                                             (line 1882)
* __satfractuqqda:                       Fixed-point fractional library routines.
                                                             (line 1201)
* __satfractuqqdq:                       Fixed-point fractional library routines.
                                                             (line 1196)
* __satfractuqqha:                       Fixed-point fractional library routines.
                                                             (line 1198)
* __satfractuqqhq:                       Fixed-point fractional library routines.
                                                             (line 1192)
* __satfractuqqqq:                       Fixed-point fractional library routines.
                                                             (line 1191)
* __satfractuqqsa:                       Fixed-point fractional library routines.
                                                             (line 1199)
* __satfractuqqsq:                       Fixed-point fractional library routines.
                                                             (line 1194)
* __satfractuqqta:                       Fixed-point fractional library routines.
                                                             (line 1203)
* __satfractuqquda:                      Fixed-point fractional library routines.
                                                             (line 1215)
* __satfractuqqudq2:                     Fixed-point fractional library routines.
                                                             (line 1209)
* __satfractuqquha:                      Fixed-point fractional library routines.
                                                             (line 1211)
* __satfractuqquhq2:                     Fixed-point fractional library routines.
                                                             (line 1205)
* __satfractuqqusa:                      Fixed-point fractional library routines.
                                                             (line 1213)
* __satfractuqqusq2:                     Fixed-point fractional library routines.
                                                             (line 1207)
* __satfractuqquta:                      Fixed-point fractional library routines.
                                                             (line 1217)
* __satfractusada:                       Fixed-point fractional library routines.
                                                             (line 1327)
* __satfractusadq:                       Fixed-point fractional library routines.
                                                             (line 1324)
* __satfractusaha:                       Fixed-point fractional library routines.
                                                             (line 1325)
* __satfractusahq:                       Fixed-point fractional library routines.
                                                             (line 1322)
* __satfractusaqq:                       Fixed-point fractional library routines.
                                                             (line 1321)
* __satfractusasa:                       Fixed-point fractional library routines.
                                                             (line 1326)
* __satfractusasq:                       Fixed-point fractional library routines.
                                                             (line 1323)
* __satfractusata:                       Fixed-point fractional library routines.
                                                             (line 1328)
* __satfractusauda2:                     Fixed-point fractional library routines.
                                                             (line 1339)
* __satfractusaudq:                      Fixed-point fractional library routines.
                                                             (line 1335)
* __satfractusauha2:                     Fixed-point fractional library routines.
                                                             (line 1337)
* __satfractusauhq:                      Fixed-point fractional library routines.
                                                             (line 1331)
* __satfractusauqq:                      Fixed-point fractional library routines.
                                                             (line 1330)
* __satfractusausq:                      Fixed-point fractional library routines.
                                                             (line 1333)
* __satfractusauta2:                     Fixed-point fractional library routines.
                                                             (line 1341)
* __satfractusqda:                       Fixed-point fractional library routines.
                                                             (line 1248)
* __satfractusqdq:                       Fixed-point fractional library routines.
                                                             (line 1244)
* __satfractusqha:                       Fixed-point fractional library routines.
                                                             (line 1246)
* __satfractusqhq:                       Fixed-point fractional library routines.
                                                             (line 1241)
* __satfractusqqq:                       Fixed-point fractional library routines.
                                                             (line 1240)
* __satfractusqsa:                       Fixed-point fractional library routines.
                                                             (line 1247)
* __satfractusqsq:                       Fixed-point fractional library routines.
                                                             (line 1242)
* __satfractusqta:                       Fixed-point fractional library routines.
                                                             (line 1250)
* __satfractusquda:                      Fixed-point fractional library routines.
                                                             (line 1262)
* __satfractusqudq2:                     Fixed-point fractional library routines.
                                                             (line 1256)
* __satfractusquha:                      Fixed-point fractional library routines.
                                                             (line 1258)
* __satfractusquhq2:                     Fixed-point fractional library routines.
                                                             (line 1254)
* __satfractusquqq2:                     Fixed-point fractional library routines.
                                                             (line 1252)
* __satfractusqusa:                      Fixed-point fractional library routines.
                                                             (line 1260)
* __satfractusquta:                      Fixed-point fractional library routines.
                                                             (line 1264)
* __satfractutada:                       Fixed-point fractional library routines.
                                                             (line 1379)
* __satfractutadq:                       Fixed-point fractional library routines.
                                                             (line 1374)
* __satfractutaha:                       Fixed-point fractional library routines.
                                                             (line 1376)
* __satfractutahq:                       Fixed-point fractional library routines.
                                                             (line 1370)
* __satfractutaqq:                       Fixed-point fractional library routines.
                                                             (line 1369)
* __satfractutasa:                       Fixed-point fractional library routines.
                                                             (line 1377)
* __satfractutasq:                       Fixed-point fractional library routines.
                                                             (line 1372)
* __satfractutata:                       Fixed-point fractional library routines.
                                                             (line 1381)
* __satfractutauda2:                     Fixed-point fractional library routines.
                                                             (line 1395)
* __satfractutaudq:                      Fixed-point fractional library routines.
                                                             (line 1389)
* __satfractutauha2:                     Fixed-point fractional library routines.
                                                             (line 1391)
* __satfractutauhq:                      Fixed-point fractional library routines.
                                                             (line 1385)
* __satfractutauqq:                      Fixed-point fractional library routines.
                                                             (line 1383)
* __satfractutausa2:                     Fixed-point fractional library routines.
                                                             (line 1393)
* __satfractutausq:                      Fixed-point fractional library routines.
                                                             (line 1387)
* __splitstack_find:                     Miscellaneous routines.
                                                             (line   18)
* __ssaddda3:                            Fixed-point fractional library routines.
                                                             (line   67)
* __ssadddq3:                            Fixed-point fractional library routines.
                                                             (line   63)
* __ssaddha3:                            Fixed-point fractional library routines.
                                                             (line   65)
* __ssaddhq3:                            Fixed-point fractional library routines.
                                                             (line   60)
* __ssaddqq3:                            Fixed-point fractional library routines.
                                                             (line   59)
* __ssaddsa3:                            Fixed-point fractional library routines.
                                                             (line   66)
* __ssaddsq3:                            Fixed-point fractional library routines.
                                                             (line   61)
* __ssaddta3:                            Fixed-point fractional library routines.
                                                             (line   69)
* __ssashlda3:                           Fixed-point fractional library routines.
                                                             (line  402)
* __ssashldq3:                           Fixed-point fractional library routines.
                                                             (line  399)
* __ssashlha3:                           Fixed-point fractional library routines.
                                                             (line  400)
* __ssashlhq3:                           Fixed-point fractional library routines.
                                                             (line  396)
* __ssashlsa3:                           Fixed-point fractional library routines.
                                                             (line  401)
* __ssashlsq3:                           Fixed-point fractional library routines.
                                                             (line  397)
* __ssashlta3:                           Fixed-point fractional library routines.
                                                             (line  404)
* __ssdivda3:                            Fixed-point fractional library routines.
                                                             (line  261)
* __ssdivdq3:                            Fixed-point fractional library routines.
                                                             (line  257)
* __ssdivha3:                            Fixed-point fractional library routines.
                                                             (line  259)
* __ssdivhq3:                            Fixed-point fractional library routines.
                                                             (line  254)
* __ssdivqq3:                            Fixed-point fractional library routines.
                                                             (line  253)
* __ssdivsa3:                            Fixed-point fractional library routines.
                                                             (line  260)
* __ssdivsq3:                            Fixed-point fractional library routines.
                                                             (line  255)
* __ssdivta3:                            Fixed-point fractional library routines.
                                                             (line  263)
* __ssmulda3:                            Fixed-point fractional library routines.
                                                             (line  193)
* __ssmuldq3:                            Fixed-point fractional library routines.
                                                             (line  189)
* __ssmulha3:                            Fixed-point fractional library routines.
                                                             (line  191)
* __ssmulhq3:                            Fixed-point fractional library routines.
                                                             (line  186)
* __ssmulqq3:                            Fixed-point fractional library routines.
                                                             (line  185)
* __ssmulsa3:                            Fixed-point fractional library routines.
                                                             (line  192)
* __ssmulsq3:                            Fixed-point fractional library routines.
                                                             (line  187)
* __ssmulta3:                            Fixed-point fractional library routines.
                                                             (line  195)
* __ssnegda2:                            Fixed-point fractional library routines.
                                                             (line  316)
* __ssnegdq2:                            Fixed-point fractional library routines.
                                                             (line  313)
* __ssnegha2:                            Fixed-point fractional library routines.
                                                             (line  314)
* __ssneghq2:                            Fixed-point fractional library routines.
                                                             (line  311)
* __ssnegqq2:                            Fixed-point fractional library routines.
                                                             (line  310)
* __ssnegsa2:                            Fixed-point fractional library routines.
                                                             (line  315)
* __ssnegsq2:                            Fixed-point fractional library routines.
                                                             (line  312)
* __ssnegta2:                            Fixed-point fractional library routines.
                                                             (line  317)
* __sssubda3:                            Fixed-point fractional library routines.
                                                             (line  129)
* __sssubdq3:                            Fixed-point fractional library routines.
                                                             (line  125)
* __sssubha3:                            Fixed-point fractional library routines.
                                                             (line  127)
* __sssubhq3:                            Fixed-point fractional library routines.
                                                             (line  122)
* __sssubqq3:                            Fixed-point fractional library routines.
                                                             (line  121)
* __sssubsa3:                            Fixed-point fractional library routines.
                                                             (line  128)
* __sssubsq3:                            Fixed-point fractional library routines.
                                                             (line  123)
* __sssubta3:                            Fixed-point fractional library routines.
                                                             (line  131)
* __subda3:                              Fixed-point fractional library routines.
                                                             (line  107)
* __subdf3:                              Soft float library routines.
                                                             (line   31)
* __subdq3:                              Fixed-point fractional library routines.
                                                             (line   95)
* __subha3:                              Fixed-point fractional library routines.
                                                             (line  105)
* __subhq3:                              Fixed-point fractional library routines.
                                                             (line   92)
* __subqq3:                              Fixed-point fractional library routines.
                                                             (line   91)
* __subsa3:                              Fixed-point fractional library routines.
                                                             (line  106)
* __subsf3:                              Soft float library routines.
                                                             (line   30)
* __subsq3:                              Fixed-point fractional library routines.
                                                             (line   93)
* __subta3:                              Fixed-point fractional library routines.
                                                             (line  109)
* __subtf3:                              Soft float library routines.
                                                             (line   33)
* __subuda3:                             Fixed-point fractional library routines.
                                                             (line  115)
* __subudq3:                             Fixed-point fractional library routines.
                                                             (line  103)
* __subuha3:                             Fixed-point fractional library routines.
                                                             (line  111)
* __subuhq3:                             Fixed-point fractional library routines.
                                                             (line   99)
* __subuqq3:                             Fixed-point fractional library routines.
                                                             (line   97)
* __subusa3:                             Fixed-point fractional library routines.
                                                             (line  113)
* __subusq3:                             Fixed-point fractional library routines.
                                                             (line  101)
* __subuta3:                             Fixed-point fractional library routines.
                                                             (line  117)
* __subvdi3:                             Integer library routines.
                                                             (line  123)
* __subvsi3:                             Integer library routines.
                                                             (line  122)
* __subxf3:                              Soft float library routines.
                                                             (line   35)
* __truncdfsf2:                          Soft float library routines.
                                                             (line   76)
* __trunctfdf2:                          Soft float library routines.
                                                             (line   73)
* __trunctfsf2:                          Soft float library routines.
                                                             (line   75)
* __truncxfdf2:                          Soft float library routines.
                                                             (line   72)
* __truncxfsf2:                          Soft float library routines.
                                                             (line   74)
* __ucmpdi2:                             Integer library routines.
                                                             (line   93)
* __ucmpti2:                             Integer library routines.
                                                             (line   95)
* __udivdi3:                             Integer library routines.
                                                             (line   54)
* __udivmoddi4:                          Integer library routines.
                                                             (line   61)
* __udivmodti4:                          Integer library routines.
                                                             (line   63)
* __udivsi3:                             Integer library routines.
                                                             (line   52)
* __udivti3:                             Integer library routines.
                                                             (line   56)
* __udivuda3:                            Fixed-point fractional library routines.
                                                             (line  246)
* __udivudq3:                            Fixed-point fractional library routines.
                                                             (line  240)
* __udivuha3:                            Fixed-point fractional library routines.
                                                             (line  242)
* __udivuhq3:                            Fixed-point fractional library routines.
                                                             (line  236)
* __udivuqq3:                            Fixed-point fractional library routines.
                                                             (line  234)
* __udivusa3:                            Fixed-point fractional library routines.
                                                             (line  244)
* __udivusq3:                            Fixed-point fractional library routines.
                                                             (line  238)
* __udivuta3:                            Fixed-point fractional library routines.
                                                             (line  248)
* __umoddi3:                             Integer library routines.
                                                             (line   71)
* __umodsi3:                             Integer library routines.
                                                             (line   69)
* __umodti3:                             Integer library routines.
                                                             (line   73)
* __unorddf2:                            Soft float library routines.
                                                             (line  173)
* __unordsf2:                            Soft float library routines.
                                                             (line  172)
* __unordtf2:                            Soft float library routines.
                                                             (line  174)
* __usadduda3:                           Fixed-point fractional library routines.
                                                             (line   85)
* __usaddudq3:                           Fixed-point fractional library routines.
                                                             (line   79)
* __usadduha3:                           Fixed-point fractional library routines.
                                                             (line   81)
* __usadduhq3:                           Fixed-point fractional library routines.
                                                             (line   75)
* __usadduqq3:                           Fixed-point fractional library routines.
                                                             (line   73)
* __usaddusa3:                           Fixed-point fractional library routines.
                                                             (line   83)
* __usaddusq3:                           Fixed-point fractional library routines.
                                                             (line   77)
* __usadduta3:                           Fixed-point fractional library routines.
                                                             (line   87)
* __usashluda3:                          Fixed-point fractional library routines.
                                                             (line  421)
* __usashludq3:                          Fixed-point fractional library routines.
                                                             (line  415)
* __usashluha3:                          Fixed-point fractional library routines.
                                                             (line  417)
* __usashluhq3:                          Fixed-point fractional library routines.
                                                             (line  411)
* __usashluqq3:                          Fixed-point fractional library routines.
                                                             (line  409)
* __usashlusa3:                          Fixed-point fractional library routines.
                                                             (line  419)
* __usashlusq3:                          Fixed-point fractional library routines.
                                                             (line  413)
* __usashluta3:                          Fixed-point fractional library routines.
                                                             (line  423)
* __usdivuda3:                           Fixed-point fractional library routines.
                                                             (line  280)
* __usdivudq3:                           Fixed-point fractional library routines.
                                                             (line  274)
* __usdivuha3:                           Fixed-point fractional library routines.
                                                             (line  276)
* __usdivuhq3:                           Fixed-point fractional library routines.
                                                             (line  270)
* __usdivuqq3:                           Fixed-point fractional library routines.
                                                             (line  268)
* __usdivusa3:                           Fixed-point fractional library routines.
                                                             (line  278)
* __usdivusq3:                           Fixed-point fractional library routines.
                                                             (line  272)
* __usdivuta3:                           Fixed-point fractional library routines.
                                                             (line  282)
* __usmuluda3:                           Fixed-point fractional library routines.
                                                             (line  212)
* __usmuludq3:                           Fixed-point fractional library routines.
                                                             (line  206)
* __usmuluha3:                           Fixed-point fractional library routines.
                                                             (line  208)
* __usmuluhq3:                           Fixed-point fractional library routines.
                                                             (line  202)
* __usmuluqq3:                           Fixed-point fractional library routines.
                                                             (line  200)
* __usmulusa3:                           Fixed-point fractional library routines.
                                                             (line  210)
* __usmulusq3:                           Fixed-point fractional library routines.
                                                             (line  204)
* __usmuluta3:                           Fixed-point fractional library routines.
                                                             (line  214)
* __usneguda2:                           Fixed-point fractional library routines.
                                                             (line  331)
* __usnegudq2:                           Fixed-point fractional library routines.
                                                             (line  326)
* __usneguha2:                           Fixed-point fractional library routines.
                                                             (line  328)
* __usneguhq2:                           Fixed-point fractional library routines.
                                                             (line  322)
* __usneguqq2:                           Fixed-point fractional library routines.
                                                             (line  321)
* __usnegusa2:                           Fixed-point fractional library routines.
                                                             (line  329)
* __usnegusq2:                           Fixed-point fractional library routines.
                                                             (line  324)
* __usneguta2:                           Fixed-point fractional library routines.
                                                             (line  333)
* __ussubuda3:                           Fixed-point fractional library routines.
                                                             (line  148)
* __ussubudq3:                           Fixed-point fractional library routines.
                                                             (line  142)
* __ussubuha3:                           Fixed-point fractional library routines.
                                                             (line  144)
* __ussubuhq3:                           Fixed-point fractional library routines.
                                                             (line  138)
* __ussubuqq3:                           Fixed-point fractional library routines.
                                                             (line  136)
* __ussubusa3:                           Fixed-point fractional library routines.
                                                             (line  146)
* __ussubusq3:                           Fixed-point fractional library routines.
                                                             (line  140)
* __ussubuta3:                           Fixed-point fractional library routines.
                                                             (line  150)
* abort:                                 Portability.        (line   21)
* abs:                                   Arithmetic.         (line  200)
* abs and attributes:                    Expressions.        (line   85)
* ABS_EXPR:                              Unary and Binary Expressions.
                                                             (line    6)
* absence_set:                           Processor pipeline description.
                                                             (line  224)
* absM2 instruction pattern:             Standard Names.     (line  535)
* absolute value:                        Arithmetic.         (line  200)
* access to operands:                    Accessors.          (line    6)
* access to special operands:            Special Accessors.  (line    6)
* accessors:                             Accessors.          (line    6)
* ACCUM_TYPE_SIZE:                       Type Layout.        (line   88)
* ACCUMULATE_OUTGOING_ARGS:              Stack Arguments.    (line   49)
* ACCUMULATE_OUTGOING_ARGS and stack frames: Function Entry. (line  135)
* ADA_LONG_TYPE_SIZE:                    Type Layout.        (line   26)
* Adding a new GIMPLE statement code:    Adding a new GIMPLE statement code.
                                                             (line    6)
* ADDITIONAL_REGISTER_NAMES:             Instruction Output. (line   15)
* addM3 instruction pattern:             Standard Names.     (line  263)
* addMODEcc instruction pattern:         Standard Names.     (line 1050)
* addr_diff_vec:                         Side Effects.       (line  308)
* addr_diff_vec, length of:              Insn Lengths.       (line   26)
* ADDR_EXPR:                             Storage References. (line    6)
* addr_vec:                              Side Effects.       (line  303)
* addr_vec, length of:                   Insn Lengths.       (line   26)
* address constraints:                   Simple Constraints. (line  164)
* address_operand <1>:                   Simple Constraints. (line  168)
* address_operand:                       Machine-Independent Predicates.
                                                             (line   63)
* addressing modes:                      Addressing Modes.   (line    6)
* ADJUST_FIELD_ALIGN:                    Storage Layout.     (line  197)
* ADJUST_INSN_LENGTH:                    Insn Lengths.       (line   35)
* ADJUST_REG_ALLOC_ORDER:                Allocation Order.   (line   23)
* aggregates as return values:           Aggregate Return.   (line    6)
* alias:                                 Alias analysis.     (line    6)
* ALL_REGS:                              Register Classes.   (line   17)
* allocate_stack instruction pattern:    Standard Names.     (line 1375)
* alternate entry points:                Insns.              (line  146)
* anchored addresses:                    Anchored Addresses. (line    6)
* and:                                   Arithmetic.         (line  158)
* and and attributes:                    Expressions.        (line   50)
* and, canonicalization of:              Insn Canonicalizations.
                                                             (line   52)
* andM3 instruction pattern:             Standard Names.     (line  269)
* annotations:                           Annotations.        (line    6)
* APPLY_RESULT_SIZE:                     Scalar Return.      (line  112)
* ARG_POINTER_CFA_OFFSET:                Frame Layout.       (line  194)
* ARG_POINTER_REGNUM:                    Frame Registers.    (line   41)
* ARG_POINTER_REGNUM and virtual registers: Regs and Memory. (line   65)
* arg_pointer_rtx:                       Frame Registers.    (line  104)
* ARGS_GROW_DOWNWARD:                    Frame Layout.       (line   35)
* argument passing:                      Interface.          (line   36)
* arguments in registers:                Register Arguments. (line    6)
* arguments on stack:                    Stack Arguments.    (line    6)
* arithmetic library:                    Soft float library routines.
                                                             (line    6)
* arithmetic shift:                      Arithmetic.         (line  173)
* arithmetic shift with signed saturation: Arithmetic.       (line  173)
* arithmetic shift with unsigned saturation: Arithmetic.     (line  173)
* arithmetic, in RTL:                    Arithmetic.         (line    6)
* ARITHMETIC_TYPE_P:                     Types for C++.      (line   61)
* array:                                 Types.              (line    6)
* ARRAY_RANGE_REF:                       Storage References. (line    6)
* ARRAY_REF:                             Storage References. (line    6)
* ARRAY_TYPE:                            Types.              (line    6)
* AS_NEEDS_DASH_FOR_PIPED_INPUT:         Driver.             (line   89)
* ashift:                                Arithmetic.         (line  173)
* ashift and attributes:                 Expressions.        (line   85)
* ashiftrt:                              Arithmetic.         (line  190)
* ashiftrt and attributes:               Expressions.        (line   85)
* ashlM3 instruction pattern:            Standard Names.     (line  510)
* ashrM3 instruction pattern:            Standard Names.     (line  520)
* ASM_APP_OFF:                           File Framework.     (line   78)
* ASM_APP_ON:                            File Framework.     (line   71)
* ASM_COMMENT_START:                     File Framework.     (line   66)
* ASM_DECLARE_FUNCTION_NAME:             Label Output.       (line  111)
* ASM_DECLARE_FUNCTION_SIZE:             Label Output.       (line  126)
* ASM_DECLARE_OBJECT_NAME:               Label Output.       (line  139)
* ASM_DECLARE_REGISTER_GLOBAL:           Label Output.       (line  168)
* ASM_FINAL_SPEC:                        Driver.             (line   82)
* ASM_FINISH_DECLARE_OBJECT:             Label Output.       (line  176)
* ASM_FORMAT_PRIVATE_NAME:               Label Output.       (line  395)
* asm_fprintf:                           Instruction Output. (line  151)
* ASM_FPRINTF_EXTENSIONS:                Instruction Output. (line  162)
* ASM_GENERATE_INTERNAL_LABEL:           Label Output.       (line  379)
* asm_input:                             Side Effects.       (line  290)
* asm_input and /v:                      Flags.              (line   76)
* ASM_MAYBE_OUTPUT_ENCODED_ADDR_RTX:     Exception Handling. (line   82)
* ASM_NO_SKIP_IN_TEXT:                   Alignment Output.   (line   79)
* asm_noperands:                         Insns.              (line  314)
* asm_operands and /v:                   Flags.              (line   76)
* asm_operands, RTL sharing:             Sharing.            (line   45)
* asm_operands, usage:                   Assembler.          (line    6)
* ASM_OUTPUT_ADDR_DIFF_ELT:              Dispatch Tables.    (line    9)
* ASM_OUTPUT_ADDR_VEC_ELT:               Dispatch Tables.    (line   26)
* ASM_OUTPUT_ALIGN:                      Alignment Output.   (line   86)
* ASM_OUTPUT_ALIGN_WITH_NOP:             Alignment Output.   (line   91)
* ASM_OUTPUT_ALIGNED_BSS:                Uninitialized Data. (line   46)
* ASM_OUTPUT_ALIGNED_COMMON:             Uninitialized Data. (line   30)
* ASM_OUTPUT_ALIGNED_DECL_COMMON:        Uninitialized Data. (line   38)
* ASM_OUTPUT_ALIGNED_DECL_LOCAL:         Uninitialized Data. (line   91)
* ASM_OUTPUT_ALIGNED_LOCAL:              Uninitialized Data. (line   83)
* ASM_OUTPUT_ASCII:                      Data Output.        (line   51)
* ASM_OUTPUT_CASE_END:                   Dispatch Tables.    (line   51)
* ASM_OUTPUT_CASE_LABEL:                 Dispatch Tables.    (line   38)
* ASM_OUTPUT_COMMON:                     Uninitialized Data. (line   10)
* ASM_OUTPUT_DEBUG_LABEL:                Label Output.       (line  367)
* ASM_OUTPUT_DEF:                        Label Output.       (line  416)
* ASM_OUTPUT_DEF_FROM_DECLS:             Label Output.       (line  424)
* ASM_OUTPUT_DWARF_DELTA:                SDB and DWARF.      (line   74)
* ASM_OUTPUT_DWARF_OFFSET:               SDB and DWARF.      (line   83)
* ASM_OUTPUT_DWARF_PCREL:                SDB and DWARF.      (line   89)
* ASM_OUTPUT_DWARF_TABLE_REF:            SDB and DWARF.      (line   94)
* ASM_OUTPUT_DWARF_VMS_DELTA:            SDB and DWARF.      (line   78)
* ASM_OUTPUT_EXTERNAL:                   Label Output.       (line  296)
* ASM_OUTPUT_FDESC:                      Data Output.        (line   60)
* ASM_OUTPUT_FUNCTION_LABEL:             Label Output.       (line   17)
* ASM_OUTPUT_INTERNAL_LABEL:             Label Output.       (line   29)
* ASM_OUTPUT_LABEL:                      Label Output.       (line    9)
* ASM_OUTPUT_LABEL_REF:                  Label Output.       (line  340)
* ASM_OUTPUT_LABELREF:                   Label Output.       (line  318)
* ASM_OUTPUT_LOCAL:                      Uninitialized Data. (line   70)
* ASM_OUTPUT_MAX_SKIP_ALIGN:             Alignment Output.   (line   95)
* ASM_OUTPUT_MEASURED_SIZE:              Label Output.       (line   53)
* ASM_OUTPUT_OPCODE:                     Instruction Output. (line   36)
* ASM_OUTPUT_POOL_EPILOGUE:              Data Output.        (line  110)
* ASM_OUTPUT_POOL_PROLOGUE:              Data Output.        (line   73)
* ASM_OUTPUT_REG_POP:                    Instruction Output. (line  206)
* ASM_OUTPUT_REG_PUSH:                   Instruction Output. (line  201)
* ASM_OUTPUT_SIZE_DIRECTIVE:             Label Output.       (line   47)
* ASM_OUTPUT_SKIP:                       Alignment Output.   (line   73)
* ASM_OUTPUT_SOURCE_FILENAME:            File Framework.     (line   85)
* ASM_OUTPUT_SPECIAL_POOL_ENTRY:         Data Output.        (line   85)
* ASM_OUTPUT_SYMBOL_REF:                 Label Output.       (line  333)
* ASM_OUTPUT_TYPE_DIRECTIVE:             Label Output.       (line  101)
* ASM_OUTPUT_WEAK_ALIAS:                 Label Output.       (line  442)
* ASM_OUTPUT_WEAKREF:                    Label Output.       (line  228)
* ASM_PREFERRED_EH_DATA_FORMAT:          Exception Handling. (line   67)
* ASM_SPEC:                              Driver.             (line   74)
* ASM_STABD_OP:                          DBX Options.        (line   36)
* ASM_STABN_OP:                          DBX Options.        (line   43)
* ASM_STABS_OP:                          DBX Options.        (line   29)
* ASM_WEAKEN_DECL:                       Label Output.       (line  220)
* ASM_WEAKEN_LABEL:                      Label Output.       (line  207)
* assemble_name:                         Label Output.       (line    8)
* assemble_name_raw:                     Label Output.       (line   28)
* assembler format:                      File Framework.     (line    6)
* assembler instructions in RTL:         Assembler.          (line    6)
* ASSEMBLER_DIALECT:                     Instruction Output. (line  174)
* assigning attribute values to insns:   Tagging Insns.      (line    6)
* ASSUME_EXTENDED_UNWIND_CONTEXT:        Frame Registers.    (line  164)
* asterisk in template:                  Output Statement.   (line   29)
* atan2M3 instruction pattern:           Standard Names.     (line  618)
* atomic:                                GTY Options.        (line  254)
* atomic_add_fetchMODE instruction pattern: Standard Names.  (line 1808)
* atomic_addMODE instruction pattern:    Standard Names.     (line 1779)
* atomic_and_fetchMODE instruction pattern: Standard Names.  (line 1808)
* atomic_andMODE instruction pattern:    Standard Names.     (line 1779)
* atomic_compare_and_swapMODE instruction pattern: Standard Names.
                                                             (line 1715)
* atomic_exchangeMODE instruction pattern: Standard Names.   (line 1767)
* atomic_fetch_addMODE instruction pattern: Standard Names.  (line 1793)
* atomic_fetch_andMODE instruction pattern: Standard Names.  (line 1793)
* atomic_fetch_nandMODE instruction pattern: Standard Names. (line 1793)
* atomic_fetch_orMODE instruction pattern: Standard Names.   (line 1793)
* atomic_fetch_subMODE instruction pattern: Standard Names.  (line 1793)
* atomic_fetch_xorMODE instruction pattern: Standard Names.  (line 1793)
* atomic_loadMODE instruction pattern:   Standard Names.     (line 1746)
* atomic_nand_fetchMODE instruction pattern: Standard Names. (line 1808)
* atomic_nandMODE instruction pattern:   Standard Names.     (line 1779)
* atomic_or_fetchMODE instruction pattern: Standard Names.   (line 1808)
* atomic_orMODE instruction pattern:     Standard Names.     (line 1779)
* atomic_storeMODE instruction pattern:  Standard Names.     (line 1756)
* atomic_sub_fetchMODE instruction pattern: Standard Names.  (line 1808)
* atomic_subMODE instruction pattern:    Standard Names.     (line 1779)
* atomic_test_and_set instruction pattern: Standard Names.   (line 1825)
* atomic_xor_fetchMODE instruction pattern: Standard Names.  (line 1808)
* atomic_xorMODE instruction pattern:    Standard Names.     (line 1779)
* attr <1>:                              Tagging Insns.      (line   54)
* attr:                                  Expressions.        (line  165)
* attr_flag:                             Expressions.        (line  140)
* attribute expressions:                 Expressions.        (line    6)
* attribute specifications:              Attr Example.       (line    6)
* attribute specifications example:      Attr Example.       (line    6)
* ATTRIBUTE_ALIGNED_VALUE:               Storage Layout.     (line  179)
* attributes:                            Attributes.         (line    6)
* attributes, defining:                  Defining Attributes.
                                                             (line    6)
* attributes, target-specific:           Target Attributes.  (line    6)
* autoincrement addressing, availability: Portability.       (line   21)
* autoincrement/decrement addressing:    Simple Constraints. (line   30)
* automata_option:                       Processor pipeline description.
                                                             (line  305)
* automaton based pipeline description:  Processor pipeline description.
                                                             (line    6)
* automaton based scheduler:             Processor pipeline description.
                                                             (line    6)
* AVOID_CCMODE_COPIES:                   Values in Registers.
                                                             (line  153)
* backslash:                             Output Template.    (line   46)
* barrier:                               Insns.              (line  166)
* barrier and /f:                        Flags.              (line  107)
* barrier and /v:                        Flags.              (line   44)
* BASE_REG_CLASS:                        Register Classes.   (line  114)
* basic block:                           Basic Blocks.       (line    6)
* Basic Statements:                      Basic Statements.   (line    6)
* basic-block.h:                         Control Flow.       (line    6)
* BASIC_BLOCK:                           Basic Blocks.       (line   14)
* basic_block:                           Basic Blocks.       (line    6)
* BB_HEAD, BB_END:                       Maintaining the CFG.
                                                             (line   77)
* bb_seq:                                GIMPLE sequences.   (line   73)
* BIGGEST_ALIGNMENT:                     Storage Layout.     (line  169)
* BIGGEST_FIELD_ALIGNMENT:               Storage Layout.     (line  190)
* BImode:                                Machine Modes.      (line   22)
* BIND_EXPR:                             Unary and Binary Expressions.
                                                             (line    6)
* BINFO_TYPE:                            Classes.            (line    6)
* bit-fields:                            Bit-Fields.         (line    6)
* BIT_AND_EXPR:                          Unary and Binary Expressions.
                                                             (line    6)
* BIT_IOR_EXPR:                          Unary and Binary Expressions.
                                                             (line    6)
* BIT_NOT_EXPR:                          Unary and Binary Expressions.
                                                             (line    6)
* BIT_XOR_EXPR:                          Unary and Binary Expressions.
                                                             (line    6)
* BITFIELD_NBYTES_LIMITED:               Storage Layout.     (line  394)
* BITS_BIG_ENDIAN:                       Storage Layout.     (line   12)
* BITS_BIG_ENDIAN, effect on sign_extract: Bit-Fields.       (line    8)
* BITS_PER_UNIT:                         Storage Layout.     (line   51)
* BITS_PER_WORD:                         Storage Layout.     (line   56)
* bitwise complement:                    Arithmetic.         (line  154)
* bitwise exclusive-or:                  Arithmetic.         (line  168)
* bitwise inclusive-or:                  Arithmetic.         (line  163)
* bitwise logical-and:                   Arithmetic.         (line  158)
* BLKmode:                               Machine Modes.      (line  183)
* BLKmode, and function return values:   Calls.              (line   23)
* BLOCK_FOR_INSN, gimple_bb:             Maintaining the CFG.
                                                             (line   29)
* BLOCK_REG_PADDING:                     Register Arguments. (line  230)
* blockage instruction pattern:          Standard Names.     (line 1578)
* Blocks:                                Blocks.             (line    6)
* bool:                                  Misc.               (line  857)
* BOOL_TYPE_SIZE:                        Type Layout.        (line   44)
* BOOLEAN_TYPE:                          Types.              (line    6)
* branch prediction:                     Profile information.
                                                             (line   24)
* BRANCH_COST:                           Costs.              (line  105)
* break_out_memory_refs:                 Addressing Modes.   (line  135)
* BREAK_STMT:                            Statements for C++. (line    6)
* BSS_SECTION_ASM_OP:                    Sections.           (line   68)
* bswap:                                 Arithmetic.         (line  247)
* bswapM2 instruction pattern:           Standard Names.     (line  528)
* btruncM2 instruction pattern:          Standard Names.     (line  636)
* build0:                                Macros and Functions.
                                                             (line   16)
* build1:                                Macros and Functions.
                                                             (line   17)
* build2:                                Macros and Functions.
                                                             (line   18)
* build3:                                Macros and Functions.
                                                             (line   19)
* build4:                                Macros and Functions.
                                                             (line   20)
* build5:                                Macros and Functions.
                                                             (line   21)
* build6:                                Macros and Functions.
                                                             (line   22)
* builtin_longjmp instruction pattern:   Standard Names.     (line 1475)
* builtin_setjmp_receiver instruction pattern: Standard Names.
                                                             (line 1465)
* builtin_setjmp_setup instruction pattern: Standard Names.  (line 1454)
* byte_mode:                             Machine Modes.      (line  336)
* BYTES_BIG_ENDIAN:                      Storage Layout.     (line   24)
* BYTES_BIG_ENDIAN, effect on subreg:    Regs and Memory.    (line  221)
* C statements for assembler output:     Output Statement.   (line    6)
* C99 math functions, implicit usage:    Library Calls.      (line   70)
* C_COMMON_OVERRIDE_OPTIONS:             Run-time Target.    (line  137)
* c_register_pragma:                     Misc.               (line  402)
* c_register_pragma_with_expansion:      Misc.               (line  404)
* call <1>:                              Side Effects.       (line   92)
* call:                                  Flags.              (line  221)
* call instruction pattern:              Standard Names.     (line 1107)
* call usage:                            Calls.              (line   10)
* call, in call_insn:                    Flags.              (line   33)
* call, in mem:                          Flags.              (line   81)
* call-clobbered register:               Register Basics.    (line   35)
* call-saved register:                   Register Basics.    (line   35)
* call-used register:                    Register Basics.    (line   35)
* CALL_EXPR:                             Unary and Binary Expressions.
                                                             (line    6)
* call_insn:                             Insns.              (line   95)
* call_insn and /c:                      Flags.              (line   33)
* call_insn and /f:                      Flags.              (line  107)
* call_insn and /i:                      Flags.              (line   24)
* call_insn and /j:                      Flags.              (line  161)
* call_insn and /s:                      Flags.              (line   49)
* call_insn and /u:                      Flags.              (line   19)
* call_insn and /u or /i:                Flags.              (line   29)
* call_insn and /v:                      Flags.              (line   44)
* CALL_INSN_FUNCTION_USAGE:              Insns.              (line  101)
* call_pop instruction pattern:          Standard Names.     (line 1135)
* CALL_POPS_ARGS:                        Stack Arguments.    (line  133)
* CALL_REALLY_USED_REGISTERS:            Register Basics.    (line   46)
* CALL_USED_REGISTERS:                   Register Basics.    (line   35)
* call_used_regs:                        Register Basics.    (line   59)
* call_value instruction pattern:        Standard Names.     (line 1127)
* call_value_pop instruction pattern:    Standard Names.     (line 1135)
* CALLER_SAVE_PROFITABLE:                Caller Saves.       (line   11)
* calling conventions:                   Stack and Calling.  (line    6)
* calling functions in RTL:              Calls.              (line    6)
* can_create_pseudo_p:                   Standard Names.     (line   75)
* can_fallthru:                          Basic Blocks.       (line   67)
* canadian:                              Configure Terms.    (line    6)
* CANNOT_CHANGE_MODE_CLASS:              Register Classes.   (line  538)
* CANNOT_CHANGE_MODE_CLASS and subreg semantics: Regs and Memory.
                                                             (line  280)
* canonicalization of instructions:      Insn Canonicalizations.
                                                             (line    6)
* canonicalize_funcptr_for_compare instruction pattern: Standard Names.
                                                             (line 1306)
* CASE_VECTOR_MODE:                      Misc.               (line   27)
* CASE_VECTOR_PC_RELATIVE:               Misc.               (line   40)
* CASE_VECTOR_SHORTEN_MODE:              Misc.               (line   31)
* casesi instruction pattern:            Standard Names.     (line 1229)
* cbranchMODE4 instruction pattern:      Standard Names.     (line 1096)
* cc0 <1>:                               CC0 Condition Codes.
                                                             (line    6)
* cc0:                                   Regs and Memory.    (line  307)
* cc0, RTL sharing:                      Sharing.            (line   27)
* cc0_rtx:                               Regs and Memory.    (line  333)
* CC1_SPEC:                              Driver.             (line   56)
* CC1PLUS_SPEC:                          Driver.             (line   64)
* cc_status:                             CC0 Condition Codes.
                                                             (line    6)
* CC_STATUS_MDEP:                        CC0 Condition Codes.
                                                             (line   17)
* CC_STATUS_MDEP_INIT:                   CC0 Condition Codes.
                                                             (line   23)
* CCmode <1>:                            MODE_CC Condition Codes.
                                                             (line    6)
* CCmode:                                Machine Modes.      (line  176)
* CDImode:                               Machine Modes.      (line  202)
* CEIL_DIV_EXPR:                         Unary and Binary Expressions.
                                                             (line    6)
* CEIL_MOD_EXPR:                         Unary and Binary Expressions.
                                                             (line    6)
* ceilM2 instruction pattern:            Standard Names.     (line  652)
* CFA_FRAME_BASE_OFFSET:                 Frame Layout.       (line  226)
* CFG verification:                      Maintaining the CFG.
                                                             (line  119)
* CFG, Control Flow Graph:               Control Flow.       (line    6)
* cfghooks.h:                            Maintaining the CFG.
                                                             (line    6)
* cgraph_finalize_function:              Parsing pass.       (line   52)
* chain_circular:                        GTY Options.        (line  196)
* chain_next:                            GTY Options.        (line  196)
* chain_prev:                            GTY Options.        (line  196)
* change_address:                        Standard Names.     (line   47)
* CHAR_TYPE_SIZE:                        Type Layout.        (line   39)
* check_stack instruction pattern:       Standard Names.     (line 1393)
* CHImode:                               Machine Modes.      (line  202)
* class definitions, register:           Register Classes.   (line    6)
* class preference constraints:          Class Preferences.  (line    6)
* class, scope:                          Classes.            (line    6)
* CLASS_MAX_NREGS:                       Register Classes.   (line  526)
* CLASS_TYPE_P:                          Types for C++.      (line   65)
* classes of RTX codes:                  RTL Classes.        (line    6)
* CLASSTYPE_DECLARED_CLASS:              Classes.            (line    6)
* CLASSTYPE_HAS_MUTABLE:                 Classes.            (line   85)
* CLASSTYPE_NON_POD_P:                   Classes.            (line   90)
* CLEANUP_DECL:                          Statements for C++. (line    6)
* CLEANUP_EXPR:                          Statements for C++. (line    6)
* CLEANUP_POINT_EXPR:                    Unary and Binary Expressions.
                                                             (line    6)
* CLEANUP_STMT:                          Statements for C++. (line    6)
* Cleanups:                              Cleanups.           (line    6)
* CLEAR_BY_PIECES_P:                     Costs.              (line  188)
* clear_cache instruction pattern:       Standard Names.     (line 1885)
* CLEAR_INSN_CACHE:                      Trampolines.        (line   99)
* CLEAR_RATIO:                           Costs.              (line  176)
* clobber:                               Side Effects.       (line  106)
* clrsb:                                 Arithmetic.         (line  216)
* clz:                                   Arithmetic.         (line  223)
* CLZ_DEFINED_VALUE_AT_ZERO:             Misc.               (line  305)
* clzM2 instruction pattern:             Standard Names.     (line  717)
* cmpmemM instruction pattern:           Standard Names.     (line  850)
* cmpstrM instruction pattern:           Standard Names.     (line  829)
* cmpstrnM instruction pattern:          Standard Names.     (line  816)
* code generation RTL sequences:         Expander Definitions.
                                                             (line    6)
* code iterators in .md files:           Code Iterators.     (line    6)
* CODE_LABEL:                            Basic Blocks.       (line   50)
* code_label:                            Insns.              (line  125)
* code_label and /i:                     Flags.              (line   59)
* code_label and /v:                     Flags.              (line   44)
* CODE_LABEL_NUMBER:                     Insns.              (line  125)
* codes, RTL expression:                 RTL Objects.        (line   47)
* COImode:                               Machine Modes.      (line  202)
* COLLECT2_HOST_INITIALIZATION:          Host Misc.          (line   32)
* COLLECT_EXPORT_LIST:                   Misc.               (line  756)
* COLLECT_SHARED_FINI_FUNC:              Macros for Initialization.
                                                             (line   44)
* COLLECT_SHARED_INIT_FUNC:              Macros for Initialization.
                                                             (line   33)
* commit_edge_insertions:                Maintaining the CFG.
                                                             (line  107)
* compare:                               Arithmetic.         (line   43)
* compare, canonicalization of:          Insn Canonicalizations.
                                                             (line   37)
* comparison_operator:                   Machine-Independent Predicates.
                                                             (line  111)
* compiler passes and files:             Passes.             (line    6)
* complement, bitwise:                   Arithmetic.         (line  154)
* COMPLEX_CST:                           Constant expressions.
                                                             (line    6)
* COMPLEX_EXPR:                          Unary and Binary Expressions.
                                                             (line    6)
* COMPLEX_TYPE:                          Types.              (line    6)
* COMPONENT_REF:                         Storage References. (line    6)
* Compound Expressions:                  Compound Expressions.
                                                             (line    6)
* Compound Lvalues:                      Compound Lvalues.   (line    6)
* COMPOUND_EXPR:                         Unary and Binary Expressions.
                                                             (line    6)
* COMPOUND_LITERAL_EXPR:                 Unary and Binary Expressions.
                                                             (line    6)
* COMPOUND_LITERAL_EXPR_DECL:            Unary and Binary Expressions.
                                                             (line  375)
* COMPOUND_LITERAL_EXPR_DECL_EXPR:       Unary and Binary Expressions.
                                                             (line  375)
* computed jump:                         Edges.              (line  128)
* computing the length of an insn:       Insn Lengths.       (line    6)
* concat:                                Regs and Memory.    (line  385)
* concatn:                               Regs and Memory.    (line  391)
* cond:                                  Comparisons.        (line   90)
* cond and attributes:                   Expressions.        (line   37)
* cond_exec:                             Side Effects.       (line  254)
* COND_EXPR:                             Unary and Binary Expressions.
                                                             (line    6)
* condition code register:               Regs and Memory.    (line  307)
* condition code status:                 Condition Code.     (line    6)
* condition codes:                       Comparisons.        (line   20)
* conditional execution <1>:             Cond Exec Macros.   (line    6)
* conditional execution:                 Conditional Execution.
                                                             (line    6)
* Conditional Expressions:               Conditional Expressions.
                                                             (line    6)
* conditions, in patterns:               Patterns.           (line   43)
* configuration file <1>:                Host Misc.          (line    6)
* configuration file:                    Filesystem.         (line    6)
* configure terms:                       Configure Terms.    (line    6)
* CONJ_EXPR:                             Unary and Binary Expressions.
                                                             (line    6)
* const:                                 Constants.          (line  110)
* CONST0_RTX:                            Constants.          (line  130)
* const0_rtx:                            Constants.          (line   21)
* CONST1_RTX:                            Constants.          (line  130)
* const1_rtx:                            Constants.          (line   21)
* CONST2_RTX:                            Constants.          (line  130)
* const2_rtx:                            Constants.          (line   21)
* CONST_DECL:                            Declarations.       (line    6)
* const_double:                          Constants.          (line   37)
* const_double, RTL sharing:             Sharing.            (line   29)
* CONST_DOUBLE_LOW:                      Constants.          (line   50)
* CONST_DOUBLE_OK_FOR_CONSTRAINT_P:      Old Constraints.    (line   69)
* CONST_DOUBLE_OK_FOR_LETTER_P:          Old Constraints.    (line   54)
* const_double_operand:                  Machine-Independent Predicates.
                                                             (line   21)
* const_fixed:                           Constants.          (line   63)
* const_int:                             Constants.          (line    8)
* const_int and attribute tests:         Expressions.        (line   47)
* const_int and attributes:              Expressions.        (line   10)
* const_int, RTL sharing:                Sharing.            (line   23)
* const_int_operand:                     Machine-Independent Predicates.
                                                             (line   16)
* CONST_OK_FOR_CONSTRAINT_P:             Old Constraints.    (line   49)
* CONST_OK_FOR_LETTER_P:                 Old Constraints.    (line   40)
* const_string:                          Constants.          (line   82)
* const_string and attributes:           Expressions.        (line   20)
* const_true_rtx:                        Constants.          (line   31)
* const_vector:                          Constants.          (line   70)
* const_vector, RTL sharing:             Sharing.            (line   32)
* constant attributes:                   Constant Attributes.
                                                             (line    6)
* constant definitions:                  Constant Definitions.
                                                             (line    6)
* CONSTANT_ADDRESS_P:                    Addressing Modes.   (line   29)
* CONSTANT_ALIGNMENT:                    Storage Layout.     (line  237)
* CONSTANT_P:                            Addressing Modes.   (line   36)
* CONSTANT_POOL_ADDRESS_P:               Flags.              (line   10)
* CONSTANT_POOL_BEFORE_FUNCTION:         Data Output.        (line   65)
* constants in constraints:              Simple Constraints. (line   70)
* constm1_rtx:                           Constants.          (line   21)
* constraint modifier characters:        Modifiers.          (line    6)
* constraint, matching:                  Simple Constraints. (line  142)
* CONSTRAINT_LEN:                        Old Constraints.    (line   12)
* constraint_num:                        C Constraint Interface.
                                                             (line   38)
* constraint_satisfied_p:                C Constraint Interface.
                                                             (line   54)
* constraints:                           Constraints.        (line    6)
* constraints, defining:                 Define Constraints. (line    6)
* constraints, defining, obsolete method: Old Constraints.   (line    6)
* constraints, machine specific:         Machine Constraints.
                                                             (line    6)
* constraints, testing:                  C Constraint Interface.
                                                             (line    6)
* CONSTRUCTOR:                           Unary and Binary Expressions.
                                                             (line    6)
* constructors, automatic calls:         Collect2.           (line   15)
* constructors, output of:               Initialization.     (line    6)
* container:                             Containers.         (line    6)
* CONTINUE_STMT:                         Statements for C++. (line    6)
* contributors:                          Contributors.       (line    6)
* controlling register usage:            Register Basics.    (line   73)
* controlling the compilation driver:    Driver.             (line    6)
* conventions, run-time:                 Interface.          (line    6)
* conversions:                           Conversions.        (line    6)
* CONVERT_EXPR:                          Unary and Binary Expressions.
                                                             (line    6)
* copy_rtx:                              Addressing Modes.   (line  190)
* copy_rtx_if_shared:                    Sharing.            (line   64)
* copysignM3 instruction pattern:        Standard Names.     (line  698)
* cosM2 instruction pattern:             Standard Names.     (line  564)
* costs of instructions:                 Costs.              (line    6)
* CP_INTEGRAL_TYPE:                      Types for C++.      (line   57)
* cp_namespace_decls:                    Namespaces.         (line   49)
* CP_TYPE_CONST_NON_VOLATILE_P:          Types for C++.      (line   33)
* CP_TYPE_CONST_P:                       Types for C++.      (line   24)
* cp_type_quals:                         Types for C++.      (line    6)
* CP_TYPE_RESTRICT_P:                    Types for C++.      (line   30)
* CP_TYPE_VOLATILE_P:                    Types for C++.      (line   27)
* CPLUSPLUS_CPP_SPEC:                    Driver.             (line   51)
* CPP_SPEC:                              Driver.             (line   44)
* CQImode:                               Machine Modes.      (line  202)
* cross compilation and floating point:  Floating Point.     (line    6)
* CRT_CALL_STATIC_FUNCTION:              Sections.           (line  121)
* crtl->args.pops_args:                  Function Entry.     (line  106)
* crtl->args.pretend_args_size:          Function Entry.     (line  112)
* crtl->outgoing_args_size:              Stack Arguments.    (line   48)
* CRTSTUFF_T_CFLAGS:                     Target Fragment.    (line   15)
* CRTSTUFF_T_CFLAGS_S:                   Target Fragment.    (line   19)
* CSImode:                               Machine Modes.      (line  202)
* cstoreMODE4 instruction pattern:       Standard Names.     (line 1057)
* CTImode:                               Machine Modes.      (line  202)
* ctrapMM4 instruction pattern:          Standard Names.     (line 1547)
* ctz:                                   Arithmetic.         (line  231)
* CTZ_DEFINED_VALUE_AT_ZERO:             Misc.               (line  306)
* ctzM2 instruction pattern:             Standard Names.     (line  726)
* CUMULATIVE_ARGS:                       Register Arguments. (line  128)
* current_function_is_leaf:              Leaf Functions.     (line   51)
* current_function_uses_only_leaf_regs:  Leaf Functions.     (line   51)
* current_insn_predicate:                Conditional Execution.
                                                             (line   26)
* DAmode:                                Machine Modes.      (line  152)
* data bypass:                           Processor pipeline description.
                                                             (line  106)
* data dependence delays:                Processor pipeline description.
                                                             (line    6)
* Data Dependency Analysis:              Dependency analysis.
                                                             (line    6)
* data structures:                       Per-Function Data.  (line    6)
* DATA_ALIGNMENT:                        Storage Layout.     (line  224)
* DATA_SECTION_ASM_OP:                   Sections.           (line   53)
* DBR_OUTPUT_SEQEND:                     Instruction Output. (line  135)
* dbr_sequence_length:                   Instruction Output. (line  134)
* DBX_BLOCKS_FUNCTION_RELATIVE:          DBX Options.        (line  103)
* DBX_CONTIN_CHAR:                       DBX Options.        (line   66)
* DBX_CONTIN_LENGTH:                     DBX Options.        (line   56)
* DBX_DEBUGGING_INFO:                    DBX Options.        (line    9)
* DBX_FUNCTION_FIRST:                    DBX Options.        (line   97)
* DBX_LINES_FUNCTION_RELATIVE:           DBX Options.        (line  109)
* DBX_NO_XREFS:                          DBX Options.        (line   50)
* DBX_OUTPUT_MAIN_SOURCE_FILE_END:       File Names and DBX. (line   34)
* DBX_OUTPUT_MAIN_SOURCE_FILENAME:       File Names and DBX. (line    9)
* DBX_OUTPUT_NULL_N_SO_AT_MAIN_SOURCE_FILE_END: File Names and DBX.
                                                             (line   42)
* DBX_OUTPUT_SOURCE_LINE:                DBX Hooks.          (line    9)
* DBX_REGISTER_NUMBER:                   All Debuggers.      (line    9)
* DBX_REGPARM_STABS_CODE:                DBX Options.        (line   87)
* DBX_REGPARM_STABS_LETTER:              DBX Options.        (line   92)
* DBX_STATIC_CONST_VAR_CODE:             DBX Options.        (line   82)
* DBX_STATIC_STAB_DATA_SECTION:          DBX Options.        (line   73)
* DBX_TYPE_DECL_STABS_CODE:              DBX Options.        (line   78)
* DBX_USE_BINCL:                         DBX Options.        (line  115)
* DCmode:                                Machine Modes.      (line  197)
* DDmode:                                Machine Modes.      (line   90)
* De Morgan's law:                       Insn Canonicalizations.
                                                             (line   52)
* dead_or_set_p:                         define_peephole.    (line   65)
* debug_expr:                            Debug Information.  (line   22)
* DEBUG_EXPR_DECL:                       Declarations.       (line    6)
* debug_insn:                            Insns.              (line  245)
* DEBUG_SYMS_TEXT:                       DBX Options.        (line   25)
* DEBUGGER_ARG_OFFSET:                   All Debuggers.      (line   37)
* DEBUGGER_AUTO_OFFSET:                  All Debuggers.      (line   28)
* decimal float library:                 Decimal float library routines.
                                                             (line    6)
* DECL_ALIGN:                            Declarations.       (line    6)
* DECL_ANTICIPATED:                      Functions for C++.  (line   42)
* DECL_ARGUMENTS:                        Function Basics.    (line   36)
* DECL_ARRAY_DELETE_OPERATOR_P:          Functions for C++.  (line  158)
* DECL_ARTIFICIAL <1>:                   Function Properties.
                                                             (line   47)
* DECL_ARTIFICIAL <2>:                   Function Basics.    (line    6)
* DECL_ARTIFICIAL:                       Working with declarations.
                                                             (line   24)
* DECL_ASSEMBLER_NAME:                   Function Basics.    (line    6)
* DECL_ATTRIBUTES:                       Attributes.         (line   22)
* DECL_BASE_CONSTRUCTOR_P:               Functions for C++.  (line   88)
* DECL_COMPLETE_CONSTRUCTOR_P:           Functions for C++.  (line   84)
* DECL_COMPLETE_DESTRUCTOR_P:            Functions for C++.  (line   98)
* DECL_CONST_MEMFUNC_P:                  Functions for C++.  (line   71)
* DECL_CONSTRUCTOR_P:                    Functions for C++.  (line   77)
* DECL_CONTEXT:                          Namespaces.         (line   31)
* DECL_CONV_FN_P:                        Functions for C++.  (line  105)
* DECL_COPY_CONSTRUCTOR_P:               Functions for C++.  (line   92)
* DECL_DESTRUCTOR_P:                     Functions for C++.  (line   95)
* DECL_EXTERN_C_FUNCTION_P:              Functions for C++.  (line   46)
* DECL_EXTERNAL <1>:                     Function Properties.
                                                             (line   25)
* DECL_EXTERNAL:                         Declarations.       (line    6)
* DECL_FUNCTION_MEMBER_P:                Functions for C++.  (line   61)
* DECL_FUNCTION_SPECIFIC_OPTIMIZATION <1>: Function Properties.
                                                             (line   61)
* DECL_FUNCTION_SPECIFIC_OPTIMIZATION:   Function Basics.    (line    6)
* DECL_FUNCTION_SPECIFIC_TARGET <1>:     Function Properties.
                                                             (line   55)
* DECL_FUNCTION_SPECIFIC_TARGET:         Function Basics.    (line    6)
* DECL_GLOBAL_CTOR_P:                    Functions for C++.  (line  108)
* DECL_GLOBAL_DTOR_P:                    Functions for C++.  (line  112)
* DECL_INITIAL <1>:                      Function Basics.    (line   51)
* DECL_INITIAL:                          Declarations.       (line    6)
* DECL_LINKONCE_P:                       Functions for C++.  (line   50)
* DECL_LOCAL_FUNCTION_P:                 Functions for C++.  (line   38)
* DECL_MAIN_P:                           Functions for C++.  (line   34)
* DECL_NAME <1>:                         Namespaces.         (line   20)
* DECL_NAME <2>:                         Function Basics.    (line    6)
* DECL_NAME:                             Working with declarations.
                                                             (line    7)
* DECL_NAMESPACE_ALIAS:                  Namespaces.         (line   35)
* DECL_NAMESPACE_STD_P:                  Namespaces.         (line   45)
* DECL_NON_THUNK_FUNCTION_P:             Functions for C++.  (line  138)
* DECL_NONCONVERTING_P:                  Functions for C++.  (line   80)
* DECL_NONSTATIC_MEMBER_FUNCTION_P:      Functions for C++.  (line   68)
* DECL_OVERLOADED_OPERATOR_P:            Functions for C++.  (line  102)
* DECL_PURE_P:                           Function Properties.
                                                             (line   40)
* DECL_RESULT:                           Function Basics.    (line   41)
* DECL_SAVED_TREE:                       Function Basics.    (line   44)
* DECL_SIZE:                             Declarations.       (line    6)
* DECL_STATIC_FUNCTION_P:                Functions for C++.  (line   65)
* DECL_STMT:                             Statements for C++. (line    6)
* DECL_STMT_DECL:                        Statements for C++. (line    6)
* DECL_THUNK_P:                          Functions for C++.  (line  116)
* DECL_VIRTUAL_P:                        Function Properties.
                                                             (line   44)
* DECL_VOLATILE_MEMFUNC_P:               Functions for C++.  (line   74)
* declaration:                           Declarations.       (line    6)
* declarations, RTL:                     RTL Declarations.   (line    6)
* DECLARE_LIBRARY_RENAMES:               Library Calls.      (line    9)
* decrement_and_branch_until_zero instruction pattern: Standard Names.
                                                             (line 1267)
* default:                               GTY Options.        (line   82)
* default_file_start:                    File Framework.     (line    8)
* DEFAULT_GDB_EXTENSIONS:                DBX Options.        (line   18)
* DEFAULT_PCC_STRUCT_RETURN:             Aggregate Return.   (line   35)
* DEFAULT_SIGNED_CHAR:                   Type Layout.        (line  161)
* define_address_constraint:             Define Constraints. (line  107)
* define_asm_attributes:                 Tagging Insns.      (line   73)
* define_attr:                           Defining Attributes.
                                                             (line    6)
* define_automaton:                      Processor pipeline description.
                                                             (line   53)
* define_bypass:                         Processor pipeline description.
                                                             (line  197)
* define_c_enum:                         Constant Definitions.
                                                             (line   49)
* define_code_attr:                      Code Iterators.     (line    6)
* define_code_iterator:                  Code Iterators.     (line    6)
* define_cond_exec:                      Conditional Execution.
                                                             (line   13)
* define_constants:                      Constant Definitions.
                                                             (line    6)
* define_constraint:                     Define Constraints. (line   48)
* define_cpu_unit:                       Processor pipeline description.
                                                             (line   68)
* define_delay:                          Delay Slots.        (line   25)
* define_enum:                           Constant Definitions.
                                                             (line  118)
* define_enum_attr <1>:                  Constant Definitions.
                                                             (line  136)
* define_enum_attr:                      Defining Attributes.
                                                             (line   76)
* define_expand:                         Expander Definitions.
                                                             (line   11)
* define_insn:                           Patterns.           (line    6)
* define_insn example:                   Example.            (line    6)
* define_insn_and_split:                 Insn Splitting.     (line  170)
* define_insn_reservation:               Processor pipeline description.
                                                             (line  106)
* define_int_attr:                       Int Iterators.      (line    6)
* define_int_iterator:                   Int Iterators.      (line    6)
* define_memory_constraint:              Define Constraints. (line   88)
* define_mode_attr:                      Substitutions.      (line    6)
* define_mode_iterator:                  Defining Mode Iterators.
                                                             (line    6)
* define_peephole:                       define_peephole.    (line    6)
* define_peephole2:                      define_peephole2.   (line    6)
* define_predicate:                      Defining Predicates.
                                                             (line    6)
* define_query_cpu_unit:                 Processor pipeline description.
                                                             (line   90)
* define_register_constraint:            Define Constraints. (line   28)
* define_reservation:                    Processor pipeline description.
                                                             (line  186)
* define_special_predicate:              Defining Predicates.
                                                             (line    6)
* define_split:                          Insn Splitting.     (line   32)
* define_subst <1>:                      Subst Iterators.    (line    6)
* define_subst <2>:                      Define Subst Output Template.
                                                             (line    6)
* define_subst <3>:                      Define Subst Pattern Matching.
                                                             (line    6)
* define_subst <4>:                      Define Subst Example.
                                                             (line    6)
* define_subst:                          Define Subst.       (line    6)
* define_subst_attr:                     Subst Iterators.    (line    6)
* defining attributes and their values:  Defining Attributes.
                                                             (line    6)
* defining constraints:                  Define Constraints. (line    6)
* defining constraints, obsolete method: Old Constraints.    (line    6)
* defining jump instruction patterns:    Jump Patterns.      (line    6)
* defining looping instruction patterns: Looping Patterns.   (line    6)
* defining peephole optimizers:          Peephole Definitions.
                                                             (line    6)
* defining predicates:                   Defining Predicates.
                                                             (line    6)
* defining RTL sequences for code generation: Expander Definitions.
                                                             (line    6)
* delay slots, defining:                 Delay Slots.        (line    6)
* deletable:                             GTY Options.        (line  150)
* DELETE_IF_ORDINARY:                    Filesystem.         (line   79)
* Dependent Patterns:                    Dependent Patterns. (line    6)
* desc:                                  GTY Options.        (line   82)
* destructors, output of:                Initialization.     (line    6)
* deterministic finite state automaton:  Processor pipeline description.
                                                             (line    6)
* DF_SIZE:                               Type Layout.        (line  137)
* DFmode:                                Machine Modes.      (line   73)
* digits in constraint:                  Simple Constraints. (line  130)
* DImode:                                Machine Modes.      (line   45)
* DIR_SEPARATOR:                         Filesystem.         (line   18)
* DIR_SEPARATOR_2:                       Filesystem.         (line   19)
* directory options .md:                 Including Patterns. (line   44)
* disabling certain registers:           Register Basics.    (line   73)
* dispatch table:                        Dispatch Tables.    (line    8)
* div:                                   Arithmetic.         (line  116)
* div and attributes:                    Expressions.        (line   85)
* division:                              Arithmetic.         (line  116)
* divM3 instruction pattern:             Standard Names.     (line  269)
* divmodM4 instruction pattern:          Standard Names.     (line  490)
* DO_BODY:                               Statements for C++. (line    6)
* DO_COND:                               Statements for C++. (line    6)
* DO_STMT:                               Statements for C++. (line    6)
* DOLLARS_IN_IDENTIFIERS:                Misc.               (line  446)
* doloop_begin instruction pattern:      Standard Names.     (line 1299)
* doloop_end instruction pattern:        Standard Names.     (line 1277)
* DONE:                                  Expander Definitions.
                                                             (line   77)
* DONT_USE_BUILTIN_SETJMP:               Exception Region Output.
                                                             (line   79)
* DOUBLE_TYPE_SIZE:                      Type Layout.        (line   53)
* DQmode:                                Machine Modes.      (line  115)
* driver:                                Driver.             (line    6)
* DRIVER_SELF_SPECS:                     Driver.             (line    9)
* DUMPFILE_FORMAT:                       Filesystem.         (line   67)
* DWARF2_ASM_LINE_DEBUG_INFO:            SDB and DWARF.      (line   50)
* DWARF2_DEBUGGING_INFO:                 SDB and DWARF.      (line   13)
* DWARF2_FRAME_INFO:                     SDB and DWARF.      (line   30)
* DWARF2_FRAME_REG_OUT:                  Frame Registers.    (line  150)
* DWARF2_UNWIND_INFO:                    Exception Region Output.
                                                             (line   40)
* DWARF_ALT_FRAME_RETURN_COLUMN:         Frame Layout.       (line  152)
* DWARF_CIE_DATA_ALIGNMENT:              Exception Region Output.
                                                             (line   91)
* DWARF_FRAME_REGISTERS:                 Frame Registers.    (line  110)
* DWARF_FRAME_REGNUM:                    Frame Registers.    (line  142)
* DWARF_REG_TO_UNWIND_COLUMN:            Frame Registers.    (line  134)
* DWARF_ZERO_REG:                        Frame Layout.       (line  163)
* DYNAMIC_CHAIN_ADDRESS:                 Frame Layout.       (line   92)
* E in constraint:                       Simple Constraints. (line   89)
* earlyclobber operand:                  Modifiers.          (line   25)
* edge:                                  Edges.              (line    6)
* edge in the flow graph:                Edges.              (line    6)
* edge iterators:                        Edges.              (line   15)
* edge splitting:                        Maintaining the CFG.
                                                             (line  107)
* EDGE_ABNORMAL:                         Edges.              (line  128)
* EDGE_ABNORMAL, EDGE_ABNORMAL_CALL:     Edges.              (line  172)
* EDGE_ABNORMAL, EDGE_EH:                Edges.              (line   96)
* EDGE_ABNORMAL, EDGE_SIBCALL:           Edges.              (line  122)
* EDGE_FALLTHRU, force_nonfallthru:      Edges.              (line   86)
* EDOM, implicit usage:                  Library Calls.      (line   52)
* EH_FRAME_IN_DATA_SECTION:              Exception Region Output.
                                                             (line   20)
* EH_FRAME_SECTION_NAME:                 Exception Region Output.
                                                             (line   10)
* eh_return instruction pattern:         Standard Names.     (line 1481)
* EH_RETURN_DATA_REGNO:                  Exception Handling. (line    7)
* EH_RETURN_HANDLER_RTX:                 Exception Handling. (line   39)
* EH_RETURN_STACKADJ_RTX:                Exception Handling. (line   22)
* EH_TABLES_CAN_BE_READ_ONLY:            Exception Region Output.
                                                             (line   29)
* EH_USES:                               Function Entry.     (line  158)
* ei_edge:                               Edges.              (line   43)
* ei_end_p:                              Edges.              (line   27)
* ei_last:                               Edges.              (line   23)
* ei_next:                               Edges.              (line   35)
* ei_one_before_end_p:                   Edges.              (line   31)
* ei_prev:                               Edges.              (line   39)
* ei_safe_safe:                          Edges.              (line   47)
* ei_start:                              Edges.              (line   19)
* ELIMINABLE_REGS:                       Elimination.        (line   47)
* ELSE_CLAUSE:                           Statements for C++. (line    6)
* Embedded C:                            Fixed-point fractional library routines.
                                                             (line    6)
* EMIT_MODE_SET:                         Mode Switching.     (line   75)
* Empty Statements:                      Empty Statements.   (line    6)
* EMPTY_CLASS_EXPR:                      Statements for C++. (line    6)
* EMPTY_FIELD_BOUNDARY:                  Storage Layout.     (line  307)
* Emulated TLS:                          Emulated TLS.       (line    6)
* enabled:                               Disable Insn Alternatives.
                                                             (line    6)
* ENDFILE_SPEC:                          Driver.             (line  156)
* endianness:                            Portability.        (line   21)
* ENTRY_BLOCK_PTR, EXIT_BLOCK_PTR:       Basic Blocks.       (line   10)
* enum machine_mode:                     Machine Modes.      (line    6)
* enum reg_class:                        Register Classes.   (line   72)
* ENUMERAL_TYPE:                         Types.              (line    6)
* enumerations:                          Constant Definitions.
                                                             (line   49)
* epilogue:                              Function Entry.     (line    6)
* epilogue instruction pattern:          Standard Names.     (line 1519)
* EPILOGUE_USES:                         Function Entry.     (line  152)
* eq:                                    Comparisons.        (line   52)
* eq and attributes:                     Expressions.        (line   85)
* eq_attr:                               Expressions.        (line  106)
* EQ_EXPR:                               Unary and Binary Expressions.
                                                             (line    6)
* equal:                                 Comparisons.        (line   52)
* errno, implicit usage:                 Library Calls.      (line   64)
* EXACT_DIV_EXPR:                        Unary and Binary Expressions.
                                                             (line    6)
* examining SSA_NAMEs:                   SSA.                (line  216)
* exception handling <1>:                Exception Handling. (line    6)
* exception handling:                    Edges.              (line   96)
* exception_receiver instruction pattern: Standard Names.    (line 1445)
* exclamation point:                     Multi-Alternative.  (line   47)
* exclusion_set:                         Processor pipeline description.
                                                             (line  224)
* exclusive-or, bitwise:                 Arithmetic.         (line  168)
* EXIT_EXPR:                             Unary and Binary Expressions.
                                                             (line    6)
* EXIT_IGNORE_STACK:                     Function Entry.     (line  140)
* expander definitions:                  Expander Definitions.
                                                             (line    6)
* expM2 instruction pattern:             Standard Names.     (line  593)
* EXPR_FILENAME:                         Working with declarations.
                                                             (line   14)
* EXPR_LINENO:                           Working with declarations.
                                                             (line   20)
* expr_list:                             Insns.              (line  552)
* EXPR_STMT:                             Statements for C++. (line    6)
* EXPR_STMT_EXPR:                        Statements for C++. (line    6)
* expression:                            Expression trees.   (line    6)
* expression codes:                      RTL Objects.        (line   47)
* extendMN2 instruction pattern:         Standard Names.     (line  908)
* extensible constraints:                Simple Constraints. (line  173)
* EXTRA_ADDRESS_CONSTRAINT:              Old Constraints.    (line  123)
* EXTRA_CONSTRAINT:                      Old Constraints.    (line   74)
* EXTRA_CONSTRAINT_STR:                  Old Constraints.    (line   95)
* EXTRA_MEMORY_CONSTRAINT:               Old Constraints.    (line  100)
* EXTRA_SPECS:                           Driver.             (line  183)
* extv instruction pattern:              Standard Names.     (line  999)
* extvM instruction pattern:             Standard Names.     (line  944)
* extvmisalignM instruction pattern:     Standard Names.     (line  954)
* extzv instruction pattern:             Standard Names.     (line 1017)
* extzvM instruction pattern:            Standard Names.     (line  968)
* extzvmisalignM instruction pattern:    Standard Names.     (line  971)
* F in constraint:                       Simple Constraints. (line   94)
* FAIL:                                  Expander Definitions.
                                                             (line   83)
* fall-thru:                             Edges.              (line   69)
* FATAL_EXIT_CODE:                       Host Misc.          (line    6)
* FDL, GNU Free Documentation License:   GNU Free Documentation License.
                                                             (line    6)
* features, optional, in system conventions: Run-time Target.
                                                             (line   59)
* ffs:                                   Arithmetic.         (line  211)
* ffsM2 instruction pattern:             Standard Names.     (line  707)
* FIELD_DECL:                            Declarations.       (line    6)
* file_end_indicate_exec_stack:          File Framework.     (line   41)
* files and passes of the compiler:      Passes.             (line    6)
* files, generated:                      Files.              (line    6)
* final_absence_set:                     Processor pipeline description.
                                                             (line  224)
* FINAL_PRESCAN_INSN:                    Instruction Output. (line   61)
* final_presence_set:                    Processor pipeline description.
                                                             (line  224)
* final_sequence:                        Instruction Output. (line  145)
* FIND_BASE_TERM:                        Addressing Modes.   (line  119)
* FINI_ARRAY_SECTION_ASM_OP:             Sections.           (line  114)
* FINI_SECTION_ASM_OP:                   Sections.           (line   99)
* finite state automaton minimization:   Processor pipeline description.
                                                             (line  305)
* FIRST_PARM_OFFSET:                     Frame Layout.       (line   67)
* FIRST_PARM_OFFSET and virtual registers: Regs and Memory.  (line   65)
* FIRST_PSEUDO_REGISTER:                 Register Basics.    (line    9)
* FIRST_STACK_REG:                       Stack Registers.    (line   27)
* FIRST_VIRTUAL_REGISTER:                Regs and Memory.    (line   51)
* fix:                                   Conversions.        (line   66)
* FIX_TRUNC_EXPR:                        Unary and Binary Expressions.
                                                             (line    6)
* fix_truncMN2 instruction pattern:      Standard Names.     (line  895)
* fixed register:                        Register Basics.    (line   15)
* fixed-point fractional library:        Fixed-point fractional library routines.
                                                             (line    6)
* FIXED_CONVERT_EXPR:                    Unary and Binary Expressions.
                                                             (line    6)
* FIXED_CST:                             Constant expressions.
                                                             (line    6)
* FIXED_POINT_TYPE:                      Types.              (line    6)
* FIXED_REGISTERS:                       Register Basics.    (line   15)
* fixed_regs:                            Register Basics.    (line   59)
* fixMN2 instruction pattern:            Standard Names.     (line  875)
* fixuns_truncMN2 instruction pattern:   Standard Names.     (line  899)
* fixunsMN2 instruction pattern:         Standard Names.     (line  884)
* flags in RTL expression:               Flags.              (line    6)
* float:                                 Conversions.        (line   58)
* FLOAT_EXPR:                            Unary and Binary Expressions.
                                                             (line    6)
* float_extend:                          Conversions.        (line   33)
* FLOAT_LIB_COMPARE_RETURNS_BOOL:        Library Calls.      (line   33)
* FLOAT_STORE_FLAG_VALUE:                Misc.               (line  287)
* float_truncate:                        Conversions.        (line   53)
* FLOAT_TYPE_SIZE:                       Type Layout.        (line   49)
* FLOAT_WORDS_BIG_ENDIAN:                Storage Layout.     (line   42)
* FLOAT_WORDS_BIG_ENDIAN, (lack of) effect on subreg: Regs and Memory.
                                                             (line  226)
* floating point and cross compilation:  Floating Point.     (line    6)
* floatMN2 instruction pattern:          Standard Names.     (line  867)
* floatunsMN2 instruction pattern:       Standard Names.     (line  871)
* FLOOR_DIV_EXPR:                        Unary and Binary Expressions.
                                                             (line    6)
* FLOOR_MOD_EXPR:                        Unary and Binary Expressions.
                                                             (line    6)
* floorM2 instruction pattern:           Standard Names.     (line  628)
* flow-insensitive alias analysis:       Alias analysis.     (line    6)
* flow-sensitive alias analysis:         Alias analysis.     (line    6)
* fma:                                   Arithmetic.         (line  111)
* fmaM4 instruction pattern:             Standard Names.     (line  279)
* fmodM3 instruction pattern:            Standard Names.     (line  546)
* fmsM4 instruction pattern:             Standard Names.     (line  286)
* fnmaM4 instruction pattern:            Standard Names.     (line  292)
* fnmsM4 instruction pattern:            Standard Names.     (line  298)
* FOR_BODY:                              Statements for C++. (line    6)
* FOR_COND:                              Statements for C++. (line    6)
* FOR_EXPR:                              Statements for C++. (line    6)
* FOR_INIT_STMT:                         Statements for C++. (line    6)
* FOR_STMT:                              Statements for C++. (line    6)
* FORCE_CODE_SECTION_ALIGN:              Sections.           (line  145)
* force_reg:                             Standard Names.     (line   36)
* fract_convert:                         Conversions.        (line   82)
* FRACT_TYPE_SIZE:                       Type Layout.        (line   68)
* fractional types:                      Fixed-point fractional library routines.
                                                             (line    6)
* fractMN2 instruction pattern:          Standard Names.     (line  917)
* fractunsMN2 instruction pattern:       Standard Names.     (line  932)
* frame layout:                          Frame Layout.       (line    6)
* FRAME_ADDR_RTX:                        Frame Layout.       (line  116)
* FRAME_GROWS_DOWNWARD:                  Frame Layout.       (line   31)
* FRAME_GROWS_DOWNWARD and virtual registers: Regs and Memory.
                                                             (line   69)
* FRAME_POINTER_CFA_OFFSET:              Frame Layout.       (line  212)
* frame_pointer_needed:                  Function Entry.     (line   34)
* FRAME_POINTER_REGNUM:                  Frame Registers.    (line   14)
* FRAME_POINTER_REGNUM and virtual registers: Regs and Memory.
                                                             (line   74)
* frame_pointer_rtx:                     Frame Registers.    (line  104)
* frame_related:                         Flags.              (line  229)
* frame_related, in insn, call_insn, jump_insn, barrier, and set: Flags.
                                                             (line  107)
* frame_related, in mem:                 Flags.              (line   85)
* frame_related, in reg:                 Flags.              (line   94)
* frame_related, in symbol_ref:          Flags.              (line  165)
* frequency, count, BB_FREQ_BASE:        Profile information.
                                                             (line   30)
* ftruncM2 instruction pattern:          Standard Names.     (line  890)
* function <1>:                          Functions for C++.  (line    6)
* function:                              Functions.          (line    6)
* function call conventions:             Interface.          (line    6)
* function entry and exit:               Function Entry.     (line    6)
* function entry point, alternate function entry point: Edges.
                                                             (line  181)
* function properties:                   Function Properties.
                                                             (line    6)
* function-call insns:                   Calls.              (line    6)
* FUNCTION_ARG_OFFSET:                   Register Arguments. (line  198)
* FUNCTION_ARG_PADDING:                  Register Arguments. (line  205)
* FUNCTION_ARG_REGNO_P:                  Register Arguments. (line  253)
* FUNCTION_BOUNDARY:                     Storage Layout.     (line  166)
* FUNCTION_DECL <1>:                     Functions for C++.  (line    6)
* FUNCTION_DECL:                         Functions.          (line    6)
* FUNCTION_MODE:                         Misc.               (line  342)
* FUNCTION_PROFILER:                     Profiling.          (line    9)
* FUNCTION_TYPE:                         Types.              (line    6)
* FUNCTION_VALUE:                        Scalar Return.      (line   52)
* FUNCTION_VALUE_REGNO_P:                Scalar Return.      (line   78)
* functions, leaf:                       Leaf Functions.     (line    6)
* fundamental type:                      Types.              (line    6)
* g in constraint:                       Simple Constraints. (line  120)
* G in constraint:                       Simple Constraints. (line   98)
* garbage collector, invocation:         Invoking the garbage collector.
                                                             (line    6)
* garbage collector, troubleshooting:    Troubleshooting.    (line    6)
* GCC and portability:                   Portability.        (line    6)
* GCC_DRIVER_HOST_INITIALIZATION:        Host Misc.          (line   36)
* gcov_type:                             Profile information.
                                                             (line   41)
* ge:                                    Comparisons.        (line   72)
* ge and attributes:                     Expressions.        (line   85)
* GE_EXPR:                               Unary and Binary Expressions.
                                                             (line    6)
* GEN_ERRNO_RTX:                         Library Calls.      (line   65)
* gencodes:                              RTL passes.         (line   18)
* general_operand:                       Machine-Independent Predicates.
                                                             (line  105)
* GENERAL_REGS:                          Register Classes.   (line   23)
* generated files:                       Files.              (line    6)
* generating assembler output:           Output Statement.   (line    6)
* generating insns:                      RTL Template.       (line    6)
* GENERIC <1>:                           GENERIC.            (line    6)
* GENERIC:                               Parsing pass.       (line    6)
* generic predicates:                    Machine-Independent Predicates.
                                                             (line    6)
* genflags:                              RTL passes.         (line   18)
* get_attr:                              Expressions.        (line  101)
* get_attr_length:                       Insn Lengths.       (line   46)
* GET_CLASS_NARROWEST_MODE:              Machine Modes.      (line  333)
* GET_CODE:                              RTL Objects.        (line   47)
* get_frame_size:                        Elimination.        (line   34)
* get_insns:                             Insns.              (line   34)
* get_last_insn:                         Insns.              (line   34)
* GET_MODE:                              Machine Modes.      (line  280)
* GET_MODE_ALIGNMENT:                    Machine Modes.      (line  320)
* GET_MODE_BITSIZE:                      Machine Modes.      (line  304)
* GET_MODE_CLASS:                        Machine Modes.      (line  294)
* GET_MODE_FBIT:                         Machine Modes.      (line  311)
* GET_MODE_IBIT:                         Machine Modes.      (line  307)
* GET_MODE_MASK:                         Machine Modes.      (line  315)
* GET_MODE_NAME:                         Machine Modes.      (line  291)
* GET_MODE_NUNITS:                       Machine Modes.      (line  329)
* GET_MODE_SIZE:                         Machine Modes.      (line  301)
* GET_MODE_UNIT_SIZE:                    Machine Modes.      (line  323)
* GET_MODE_WIDER_MODE:                   Machine Modes.      (line  297)
* GET_RTX_CLASS:                         RTL Classes.        (line    6)
* GET_RTX_FORMAT:                        RTL Classes.        (line  131)
* GET_RTX_LENGTH:                        RTL Classes.        (line  128)
* get_thread_pointerMODE instruction pattern: Standard Names.
                                                             (line 1856)
* geu:                                   Comparisons.        (line   72)
* geu and attributes:                    Expressions.        (line   85)
* GGC:                                   Type Information.   (line    6)
* ggc_collect:                           Invoking the garbage collector.
                                                             (line    6)
* GIMPLE <1>:                            GIMPLE.             (line    6)
* GIMPLE <2>:                            Gimplification pass.
                                                             (line    6)
* GIMPLE:                                Parsing pass.       (line   14)
* GIMPLE Exception Handling:             GIMPLE Exception Handling.
                                                             (line    6)
* GIMPLE instruction set:                GIMPLE instruction set.
                                                             (line    6)
* GIMPLE sequences:                      GIMPLE sequences.   (line    6)
* GIMPLE statement iterators <1>:        Maintaining the CFG.
                                                             (line   34)
* GIMPLE statement iterators:            Basic Blocks.       (line   78)
* gimple_addresses_taken:                Manipulating GIMPLE statements.
                                                             (line   90)
* GIMPLE_ASM:                            GIMPLE_ASM.         (line    6)
* gimple_asm_clear_volatile:             GIMPLE_ASM.         (line   63)
* gimple_asm_clobber_op:                 GIMPLE_ASM.         (line   46)
* gimple_asm_input_op:                   GIMPLE_ASM.         (line   30)
* gimple_asm_nclobbers:                  GIMPLE_ASM.         (line   27)
* gimple_asm_ninputs:                    GIMPLE_ASM.         (line   21)
* gimple_asm_noutputs:                   GIMPLE_ASM.         (line   24)
* gimple_asm_output_op:                  GIMPLE_ASM.         (line   38)
* gimple_asm_set_clobber_op:             GIMPLE_ASM.         (line   50)
* gimple_asm_set_input_op:               GIMPLE_ASM.         (line   34)
* gimple_asm_set_output_op:              GIMPLE_ASM.         (line   42)
* gimple_asm_set_volatile:               GIMPLE_ASM.         (line   60)
* gimple_asm_string:                     GIMPLE_ASM.         (line   53)
* gimple_asm_volatile_p:                 GIMPLE_ASM.         (line   57)
* GIMPLE_ASSIGN:                         GIMPLE_ASSIGN.      (line    6)
* gimple_assign_cast_p <1>:              GIMPLE_ASSIGN.      (line   93)
* gimple_assign_cast_p:                  Logical Operators.  (line  160)
* gimple_assign_lhs:                     GIMPLE_ASSIGN.      (line   51)
* gimple_assign_lhs_ptr:                 GIMPLE_ASSIGN.      (line   54)
* gimple_assign_rhs1:                    GIMPLE_ASSIGN.      (line   57)
* gimple_assign_rhs1_ptr:                GIMPLE_ASSIGN.      (line   60)
* gimple_assign_rhs2:                    GIMPLE_ASSIGN.      (line   64)
* gimple_assign_rhs2_ptr:                GIMPLE_ASSIGN.      (line   67)
* gimple_assign_rhs3:                    GIMPLE_ASSIGN.      (line   71)
* gimple_assign_rhs3_ptr:                GIMPLE_ASSIGN.      (line   74)
* gimple_assign_rhs_class:               GIMPLE_ASSIGN.      (line   46)
* gimple_assign_rhs_code:                GIMPLE_ASSIGN.      (line   41)
* gimple_assign_set_lhs:                 GIMPLE_ASSIGN.      (line   78)
* gimple_assign_set_rhs1:                GIMPLE_ASSIGN.      (line   81)
* gimple_assign_set_rhs2:                GIMPLE_ASSIGN.      (line   85)
* gimple_assign_set_rhs3:                GIMPLE_ASSIGN.      (line   89)
* gimple_bb:                             Manipulating GIMPLE statements.
                                                             (line   18)
* GIMPLE_BIND:                           GIMPLE_BIND.        (line    6)
* gimple_bind_add_seq:                   GIMPLE_BIND.        (line   36)
* gimple_bind_add_stmt:                  GIMPLE_BIND.        (line   32)
* gimple_bind_append_vars:               GIMPLE_BIND.        (line   19)
* gimple_bind_block:                     GIMPLE_BIND.        (line   40)
* gimple_bind_body:                      GIMPLE_BIND.        (line   23)
* gimple_bind_set_block:                 GIMPLE_BIND.        (line   45)
* gimple_bind_set_body:                  GIMPLE_BIND.        (line   28)
* gimple_bind_set_vars:                  GIMPLE_BIND.        (line   15)
* gimple_bind_vars:                      GIMPLE_BIND.        (line   12)
* gimple_block:                          Manipulating GIMPLE statements.
                                                             (line   21)
* gimple_build_asm:                      GIMPLE_ASM.         (line    8)
* gimple_build_asm_vec:                  GIMPLE_ASM.         (line   17)
* gimple_build_assign:                   GIMPLE_ASSIGN.      (line    7)
* gimple_build_assign_with_ops:          GIMPLE_ASSIGN.      (line   30)
* gimple_build_bind:                     GIMPLE_BIND.        (line    8)
* gimple_build_call:                     GIMPLE_CALL.        (line    8)
* gimple_build_call_from_tree:           GIMPLE_CALL.        (line   16)
* gimple_build_call_vec:                 GIMPLE_CALL.        (line   25)
* gimple_build_catch:                    GIMPLE_CATCH.       (line    8)
* gimple_build_cond:                     GIMPLE_COND.        (line    8)
* gimple_build_cond_from_tree:           GIMPLE_COND.        (line   16)
* gimple_build_debug_bind:               GIMPLE_DEBUG.       (line    8)
* gimple_build_eh_filter:                GIMPLE_EH_FILTER.   (line    8)
* gimple_build_goto:                     GIMPLE_LABEL.       (line   18)
* gimple_build_label:                    GIMPLE_LABEL.       (line    7)
* gimple_build_nop:                      GIMPLE_NOP.         (line    7)
* gimple_build_omp_atomic_load:          GIMPLE_OMP_ATOMIC_LOAD.
                                                             (line    8)
* gimple_build_omp_atomic_store:         GIMPLE_OMP_ATOMIC_STORE.
                                                             (line    7)
* gimple_build_omp_continue:             GIMPLE_OMP_CONTINUE.
                                                             (line    8)
* gimple_build_omp_critical:             GIMPLE_OMP_CRITICAL.
                                                             (line    8)
* gimple_build_omp_for:                  GIMPLE_OMP_FOR.     (line    9)
* gimple_build_omp_master:               GIMPLE_OMP_MASTER.  (line    7)
* gimple_build_omp_ordered:              GIMPLE_OMP_ORDERED. (line    7)
* gimple_build_omp_parallel:             GIMPLE_OMP_PARALLEL.
                                                             (line    8)
* gimple_build_omp_return:               GIMPLE_OMP_RETURN.  (line    7)
* gimple_build_omp_section:              GIMPLE_OMP_SECTION. (line    7)
* gimple_build_omp_sections:             GIMPLE_OMP_SECTIONS.
                                                             (line    8)
* gimple_build_omp_sections_switch:      GIMPLE_OMP_SECTIONS.
                                                             (line   14)
* gimple_build_omp_single:               GIMPLE_OMP_SINGLE.  (line    8)
* gimple_build_resx:                     GIMPLE_RESX.        (line    7)
* gimple_build_return:                   GIMPLE_RETURN.      (line    7)
* gimple_build_switch:                   GIMPLE_SWITCH.      (line    8)
* gimple_build_try:                      GIMPLE_TRY.         (line    8)
* gimple_build_wce:                      GIMPLE_WITH_CLEANUP_EXPR.
                                                             (line    7)
* GIMPLE_CALL:                           GIMPLE_CALL.        (line    6)
* gimple_call_arg:                       GIMPLE_CALL.        (line   66)
* gimple_call_arg_ptr:                   GIMPLE_CALL.        (line   71)
* gimple_call_cannot_inline_p:           GIMPLE_CALL.        (line   91)
* gimple_call_chain:                     GIMPLE_CALL.        (line   57)
* gimple_call_copy_skip_args:            GIMPLE_CALL.        (line   98)
* gimple_call_fn:                        GIMPLE_CALL.        (line   38)
* gimple_call_fndecl:                    GIMPLE_CALL.        (line   46)
* gimple_call_lhs:                       GIMPLE_CALL.        (line   29)
* gimple_call_lhs_ptr:                   GIMPLE_CALL.        (line   32)
* gimple_call_mark_uninlinable:          GIMPLE_CALL.        (line   88)
* gimple_call_noreturn_p:                GIMPLE_CALL.        (line   94)
* gimple_call_num_args:                  GIMPLE_CALL.        (line   63)
* gimple_call_return_type:               GIMPLE_CALL.        (line   54)
* gimple_call_set_arg:                   GIMPLE_CALL.        (line   76)
* gimple_call_set_chain:                 GIMPLE_CALL.        (line   60)
* gimple_call_set_fn:                    GIMPLE_CALL.        (line   42)
* gimple_call_set_fndecl:                GIMPLE_CALL.        (line   51)
* gimple_call_set_lhs:                   GIMPLE_CALL.        (line   35)
* gimple_call_set_tail:                  GIMPLE_CALL.        (line   80)
* gimple_call_tail_p:                    GIMPLE_CALL.        (line   85)
* GIMPLE_CATCH:                          GIMPLE_CATCH.       (line    6)
* gimple_catch_handler:                  GIMPLE_CATCH.       (line   20)
* gimple_catch_set_handler:              GIMPLE_CATCH.       (line   28)
* gimple_catch_set_types:                GIMPLE_CATCH.       (line   24)
* gimple_catch_types:                    GIMPLE_CATCH.       (line   13)
* gimple_catch_types_ptr:                GIMPLE_CATCH.       (line   16)
* gimple_code:                           Manipulating GIMPLE statements.
                                                             (line   15)
* GIMPLE_COND:                           GIMPLE_COND.        (line    6)
* gimple_cond_code:                      GIMPLE_COND.        (line   21)
* gimple_cond_false_label:               GIMPLE_COND.        (line   60)
* gimple_cond_lhs:                       GIMPLE_COND.        (line   30)
* gimple_cond_make_false:                GIMPLE_COND.        (line   64)
* gimple_cond_make_true:                 GIMPLE_COND.        (line   67)
* gimple_cond_rhs:                       GIMPLE_COND.        (line   38)
* gimple_cond_set_code:                  GIMPLE_COND.        (line   26)
* gimple_cond_set_false_label:           GIMPLE_COND.        (line   56)
* gimple_cond_set_lhs:                   GIMPLE_COND.        (line   34)
* gimple_cond_set_rhs:                   GIMPLE_COND.        (line   42)
* gimple_cond_set_true_label:            GIMPLE_COND.        (line   51)
* gimple_cond_true_label:                GIMPLE_COND.        (line   46)
* gimple_copy:                           Manipulating GIMPLE statements.
                                                             (line  147)
* GIMPLE_DEBUG:                          GIMPLE_DEBUG.       (line    6)
* GIMPLE_DEBUG_BIND:                     GIMPLE_DEBUG.       (line    6)
* gimple_debug_bind_get_value:           GIMPLE_DEBUG.       (line   48)
* gimple_debug_bind_get_value_ptr:       GIMPLE_DEBUG.       (line   53)
* gimple_debug_bind_get_var:             GIMPLE_DEBUG.       (line   45)
* gimple_debug_bind_has_value_p:         GIMPLE_DEBUG.       (line   70)
* gimple_debug_bind_p:                   Logical Operators.  (line  164)
* gimple_debug_bind_reset_value:         GIMPLE_DEBUG.       (line   66)
* gimple_debug_bind_set_value:           GIMPLE_DEBUG.       (line   62)
* gimple_debug_bind_set_var:             GIMPLE_DEBUG.       (line   58)
* gimple_def_ops:                        Manipulating GIMPLE statements.
                                                             (line   94)
* GIMPLE_EH_FILTER:                      GIMPLE_EH_FILTER.   (line    6)
* gimple_eh_filter_failure:              GIMPLE_EH_FILTER.   (line   19)
* gimple_eh_filter_must_not_throw:       GIMPLE_EH_FILTER.   (line   33)
* gimple_eh_filter_set_failure:          GIMPLE_EH_FILTER.   (line   29)
* gimple_eh_filter_set_must_not_throw:   GIMPLE_EH_FILTER.   (line   37)
* gimple_eh_filter_set_types:            GIMPLE_EH_FILTER.   (line   24)
* gimple_eh_filter_types:                GIMPLE_EH_FILTER.   (line   12)
* gimple_eh_filter_types_ptr:            GIMPLE_EH_FILTER.   (line   15)
* gimple_expr_code:                      Manipulating GIMPLE statements.
                                                             (line   31)
* gimple_expr_type:                      Manipulating GIMPLE statements.
                                                             (line   24)
* gimple_goto_dest:                      GIMPLE_LABEL.       (line   21)
* gimple_goto_set_dest:                  GIMPLE_LABEL.       (line   24)
* gimple_has_mem_ops:                    Manipulating GIMPLE statements.
                                                             (line   72)
* gimple_has_ops:                        Manipulating GIMPLE statements.
                                                             (line   69)
* gimple_has_volatile_ops:               Manipulating GIMPLE statements.
                                                             (line  134)
* GIMPLE_LABEL:                          GIMPLE_LABEL.       (line    6)
* gimple_label_label:                    GIMPLE_LABEL.       (line   11)
* gimple_label_set_label:                GIMPLE_LABEL.       (line   14)
* gimple_loaded_syms:                    Manipulating GIMPLE statements.
                                                             (line  122)
* gimple_locus:                          Manipulating GIMPLE statements.
                                                             (line   42)
* gimple_locus_empty_p:                  Manipulating GIMPLE statements.
                                                             (line   48)
* gimple_modified_p:                     Manipulating GIMPLE statements.
                                                             (line  130)
* gimple_no_warning_p:                   Manipulating GIMPLE statements.
                                                             (line   51)
* GIMPLE_NOP:                            GIMPLE_NOP.         (line    6)
* gimple_nop_p:                          GIMPLE_NOP.         (line   10)
* gimple_num_ops <1>:                    Manipulating GIMPLE statements.
                                                             (line   75)
* gimple_num_ops:                        Logical Operators.  (line   78)
* GIMPLE_OMP_ATOMIC_LOAD:                GIMPLE_OMP_ATOMIC_LOAD.
                                                             (line    6)
* gimple_omp_atomic_load_lhs:            GIMPLE_OMP_ATOMIC_LOAD.
                                                             (line   17)
* gimple_omp_atomic_load_rhs:            GIMPLE_OMP_ATOMIC_LOAD.
                                                             (line   24)
* gimple_omp_atomic_load_set_lhs:        GIMPLE_OMP_ATOMIC_LOAD.
                                                             (line   14)
* gimple_omp_atomic_load_set_rhs:        GIMPLE_OMP_ATOMIC_LOAD.
                                                             (line   21)
* GIMPLE_OMP_ATOMIC_STORE:               GIMPLE_OMP_ATOMIC_STORE.
                                                             (line    6)
* gimple_omp_atomic_store_set_val:       GIMPLE_OMP_ATOMIC_STORE.
                                                             (line   12)
* gimple_omp_atomic_store_val:           GIMPLE_OMP_ATOMIC_STORE.
                                                             (line   15)
* gimple_omp_body:                       GIMPLE_OMP_PARALLEL.
                                                             (line   24)
* GIMPLE_OMP_CONTINUE:                   GIMPLE_OMP_CONTINUE.
                                                             (line    6)
* gimple_omp_continue_control_def:       GIMPLE_OMP_CONTINUE.
                                                             (line   13)
* gimple_omp_continue_control_def_ptr:   GIMPLE_OMP_CONTINUE.
                                                             (line   17)
* gimple_omp_continue_control_use:       GIMPLE_OMP_CONTINUE.
                                                             (line   24)
* gimple_omp_continue_control_use_ptr:   GIMPLE_OMP_CONTINUE.
                                                             (line   28)
* gimple_omp_continue_set_control_def:   GIMPLE_OMP_CONTINUE.
                                                             (line   20)
* gimple_omp_continue_set_control_use:   GIMPLE_OMP_CONTINUE.
                                                             (line   31)
* GIMPLE_OMP_CRITICAL:                   GIMPLE_OMP_CRITICAL.
                                                             (line    6)
* gimple_omp_critical_name:              GIMPLE_OMP_CRITICAL.
                                                             (line   13)
* gimple_omp_critical_name_ptr:          GIMPLE_OMP_CRITICAL.
                                                             (line   16)
* gimple_omp_critical_set_name:          GIMPLE_OMP_CRITICAL.
                                                             (line   21)
* GIMPLE_OMP_FOR:                        GIMPLE_OMP_FOR.     (line    6)
* gimple_omp_for_clauses:                GIMPLE_OMP_FOR.     (line   20)
* gimple_omp_for_clauses_ptr:            GIMPLE_OMP_FOR.     (line   23)
* gimple_omp_for_cond:                   GIMPLE_OMP_FOR.     (line   83)
* gimple_omp_for_final:                  GIMPLE_OMP_FOR.     (line   51)
* gimple_omp_for_final_ptr:              GIMPLE_OMP_FOR.     (line   54)
* gimple_omp_for_incr:                   GIMPLE_OMP_FOR.     (line   61)
* gimple_omp_for_incr_ptr:               GIMPLE_OMP_FOR.     (line   64)
* gimple_omp_for_index:                  GIMPLE_OMP_FOR.     (line   31)
* gimple_omp_for_index_ptr:              GIMPLE_OMP_FOR.     (line   34)
* gimple_omp_for_initial:                GIMPLE_OMP_FOR.     (line   41)
* gimple_omp_for_initial_ptr:            GIMPLE_OMP_FOR.     (line   44)
* gimple_omp_for_pre_body:               GIMPLE_OMP_FOR.     (line   70)
* gimple_omp_for_set_clauses:            GIMPLE_OMP_FOR.     (line   27)
* gimple_omp_for_set_cond:               GIMPLE_OMP_FOR.     (line   80)
* gimple_omp_for_set_final:              GIMPLE_OMP_FOR.     (line   58)
* gimple_omp_for_set_incr:               GIMPLE_OMP_FOR.     (line   67)
* gimple_omp_for_set_index:              GIMPLE_OMP_FOR.     (line   38)
* gimple_omp_for_set_initial:            GIMPLE_OMP_FOR.     (line   48)
* gimple_omp_for_set_pre_body:           GIMPLE_OMP_FOR.     (line   75)
* GIMPLE_OMP_MASTER:                     GIMPLE_OMP_MASTER.  (line    6)
* GIMPLE_OMP_ORDERED:                    GIMPLE_OMP_ORDERED. (line    6)
* GIMPLE_OMP_PARALLEL:                   GIMPLE_OMP_PARALLEL.
                                                             (line    6)
* gimple_omp_parallel_child_fn:          GIMPLE_OMP_PARALLEL.
                                                             (line   42)
* gimple_omp_parallel_child_fn_ptr:      GIMPLE_OMP_PARALLEL.
                                                             (line   46)
* gimple_omp_parallel_clauses:           GIMPLE_OMP_PARALLEL.
                                                             (line   31)
* gimple_omp_parallel_clauses_ptr:       GIMPLE_OMP_PARALLEL.
                                                             (line   34)
* gimple_omp_parallel_combined_p:        GIMPLE_OMP_PARALLEL.
                                                             (line   16)
* gimple_omp_parallel_data_arg:          GIMPLE_OMP_PARALLEL.
                                                             (line   54)
* gimple_omp_parallel_data_arg_ptr:      GIMPLE_OMP_PARALLEL.
                                                             (line   58)
* gimple_omp_parallel_set_child_fn:      GIMPLE_OMP_PARALLEL.
                                                             (line   51)
* gimple_omp_parallel_set_clauses:       GIMPLE_OMP_PARALLEL.
                                                             (line   38)
* gimple_omp_parallel_set_combined_p:    GIMPLE_OMP_PARALLEL.
                                                             (line   20)
* gimple_omp_parallel_set_data_arg:      GIMPLE_OMP_PARALLEL.
                                                             (line   62)
* GIMPLE_OMP_RETURN:                     GIMPLE_OMP_RETURN.  (line    6)
* gimple_omp_return_nowait_p:            GIMPLE_OMP_RETURN.  (line   14)
* gimple_omp_return_set_nowait:          GIMPLE_OMP_RETURN.  (line   11)
* GIMPLE_OMP_SECTION:                    GIMPLE_OMP_SECTION. (line    6)
* gimple_omp_section_last_p:             GIMPLE_OMP_SECTION. (line   12)
* gimple_omp_section_set_last:           GIMPLE_OMP_SECTION. (line   16)
* GIMPLE_OMP_SECTIONS:                   GIMPLE_OMP_SECTIONS.
                                                             (line    6)
* gimple_omp_sections_clauses:           GIMPLE_OMP_SECTIONS.
                                                             (line   30)
* gimple_omp_sections_clauses_ptr:       GIMPLE_OMP_SECTIONS.
                                                             (line   33)
* gimple_omp_sections_control:           GIMPLE_OMP_SECTIONS.
                                                             (line   17)
* gimple_omp_sections_control_ptr:       GIMPLE_OMP_SECTIONS.
                                                             (line   21)
* gimple_omp_sections_set_clauses:       GIMPLE_OMP_SECTIONS.
                                                             (line   37)
* gimple_omp_sections_set_control:       GIMPLE_OMP_SECTIONS.
                                                             (line   26)
* gimple_omp_set_body:                   GIMPLE_OMP_PARALLEL.
                                                             (line   28)
* GIMPLE_OMP_SINGLE:                     GIMPLE_OMP_SINGLE.  (line    6)
* gimple_omp_single_clauses:             GIMPLE_OMP_SINGLE.  (line   14)
* gimple_omp_single_clauses_ptr:         GIMPLE_OMP_SINGLE.  (line   17)
* gimple_omp_single_set_clauses:         GIMPLE_OMP_SINGLE.  (line   21)
* gimple_op <1>:                         Manipulating GIMPLE statements.
                                                             (line   81)
* gimple_op:                             Logical Operators.  (line   81)
* gimple_op_ptr:                         Manipulating GIMPLE statements.
                                                             (line   84)
* gimple_ops <1>:                        Manipulating GIMPLE statements.
                                                             (line   78)
* gimple_ops:                            Logical Operators.  (line   84)
* GIMPLE_PHI:                            GIMPLE_PHI.         (line    6)
* gimple_phi_arg:                        GIMPLE_PHI.         (line   25)
* gimple_phi_capacity:                   GIMPLE_PHI.         (line    7)
* gimple_phi_num_args:                   GIMPLE_PHI.         (line   11)
* gimple_phi_result:                     GIMPLE_PHI.         (line   16)
* gimple_phi_result_ptr:                 GIMPLE_PHI.         (line   19)
* gimple_phi_set_arg:                    GIMPLE_PHI.         (line   30)
* gimple_phi_set_result:                 GIMPLE_PHI.         (line   22)
* gimple_plf:                            Manipulating GIMPLE statements.
                                                             (line   66)
* GIMPLE_RESX:                           GIMPLE_RESX.        (line    6)
* gimple_resx_region:                    GIMPLE_RESX.        (line   13)
* gimple_resx_set_region:                GIMPLE_RESX.        (line   16)
* GIMPLE_RETURN:                         GIMPLE_RETURN.      (line    6)
* gimple_return_retval:                  GIMPLE_RETURN.      (line   10)
* gimple_return_set_retval:              GIMPLE_RETURN.      (line   14)
* gimple_seq_add_seq:                    GIMPLE sequences.   (line   32)
* gimple_seq_add_stmt:                   GIMPLE sequences.   (line   26)
* gimple_seq_alloc:                      GIMPLE sequences.   (line   62)
* gimple_seq_copy:                       GIMPLE sequences.   (line   67)
* gimple_seq_deep_copy:                  GIMPLE sequences.   (line   37)
* gimple_seq_empty_p:                    GIMPLE sequences.   (line   70)
* gimple_seq_first:                      GIMPLE sequences.   (line   44)
* gimple_seq_init:                       GIMPLE sequences.   (line   59)
* gimple_seq_last:                       GIMPLE sequences.   (line   47)
* gimple_seq_reverse:                    GIMPLE sequences.   (line   40)
* gimple_seq_set_first:                  GIMPLE sequences.   (line   55)
* gimple_seq_set_last:                   GIMPLE sequences.   (line   51)
* gimple_seq_singleton_p:                GIMPLE sequences.   (line   79)
* gimple_set_block:                      Manipulating GIMPLE statements.
                                                             (line   39)
* gimple_set_def_ops:                    Manipulating GIMPLE statements.
                                                             (line   98)
* gimple_set_has_volatile_ops:           Manipulating GIMPLE statements.
                                                             (line  138)
* gimple_set_locus:                      Manipulating GIMPLE statements.
                                                             (line   45)
* gimple_set_op:                         Manipulating GIMPLE statements.
                                                             (line   87)
* gimple_set_plf:                        Manipulating GIMPLE statements.
                                                             (line   62)
* gimple_set_use_ops:                    Manipulating GIMPLE statements.
                                                             (line  105)
* gimple_set_vdef_ops:                   Manipulating GIMPLE statements.
                                                             (line  119)
* gimple_set_visited:                    Manipulating GIMPLE statements.
                                                             (line   55)
* gimple_set_vuse_ops:                   Manipulating GIMPLE statements.
                                                             (line  112)
* gimple_statement_base:                 Tuple representation.
                                                             (line   14)
* gimple_statement_with_ops:             Tuple representation.
                                                             (line   96)
* gimple_stored_syms:                    Manipulating GIMPLE statements.
                                                             (line  126)
* GIMPLE_SWITCH:                         GIMPLE_SWITCH.      (line    6)
* gimple_switch_default_label:           GIMPLE_SWITCH.      (line   39)
* gimple_switch_index:                   GIMPLE_SWITCH.      (line   24)
* gimple_switch_label:                   GIMPLE_SWITCH.      (line   30)
* gimple_switch_num_labels:              GIMPLE_SWITCH.      (line   15)
* gimple_switch_set_default_label:       GIMPLE_SWITCH.      (line   43)
* gimple_switch_set_index:               GIMPLE_SWITCH.      (line   27)
* gimple_switch_set_label:               GIMPLE_SWITCH.      (line   35)
* gimple_switch_set_num_labels:          GIMPLE_SWITCH.      (line   20)
* GIMPLE_TRY:                            GIMPLE_TRY.         (line    6)
* gimple_try_catch_is_cleanup:           GIMPLE_TRY.         (line   20)
* gimple_try_cleanup:                    GIMPLE_TRY.         (line   27)
* gimple_try_eval:                       GIMPLE_TRY.         (line   23)
* gimple_try_kind:                       GIMPLE_TRY.         (line   16)
* gimple_try_set_catch_is_cleanup:       GIMPLE_TRY.         (line   32)
* gimple_try_set_cleanup:                GIMPLE_TRY.         (line   41)
* gimple_try_set_eval:                   GIMPLE_TRY.         (line   36)
* gimple_use_ops:                        Manipulating GIMPLE statements.
                                                             (line  101)
* gimple_vdef_ops:                       Manipulating GIMPLE statements.
                                                             (line  115)
* gimple_visited_p:                      Manipulating GIMPLE statements.
                                                             (line   58)
* gimple_vuse_ops:                       Manipulating GIMPLE statements.
                                                             (line  108)
* gimple_wce_cleanup:                    GIMPLE_WITH_CLEANUP_EXPR.
                                                             (line   11)
* gimple_wce_cleanup_eh_only:            GIMPLE_WITH_CLEANUP_EXPR.
                                                             (line   18)
* gimple_wce_set_cleanup:                GIMPLE_WITH_CLEANUP_EXPR.
                                                             (line   15)
* gimple_wce_set_cleanup_eh_only:        GIMPLE_WITH_CLEANUP_EXPR.
                                                             (line   22)
* GIMPLE_WITH_CLEANUP_EXPR:              GIMPLE_WITH_CLEANUP_EXPR.
                                                             (line    6)
* gimplification <1>:                    Gimplification pass.
                                                             (line    6)
* gimplification:                        Parsing pass.       (line   14)
* gimplifier:                            Parsing pass.       (line   14)
* gimplify_assign:                       GIMPLE_ASSIGN.      (line   19)
* gimplify_expr:                         Gimplification pass.
                                                             (line   18)
* gimplify_function_tree:                Gimplification pass.
                                                             (line   18)
* GLOBAL_INIT_PRIORITY:                  Functions for C++.  (line  141)
* global_regs:                           Register Basics.    (line   59)
* GO_IF_LEGITIMATE_ADDRESS:              Addressing Modes.   (line   91)
* greater than:                          Comparisons.        (line   60)
* gsi_after_labels:                      Sequence iterators. (line   76)
* gsi_bb:                                Sequence iterators. (line   83)
* gsi_commit_edge_inserts <1>:           Maintaining the CFG.
                                                             (line  107)
* gsi_commit_edge_inserts:               Sequence iterators. (line  194)
* gsi_commit_one_edge_insert:            Sequence iterators. (line  190)
* gsi_end_p <1>:                         Maintaining the CFG.
                                                             (line   49)
* gsi_end_p:                             Sequence iterators. (line   60)
* gsi_for_stmt:                          Sequence iterators. (line  157)
* gsi_insert_after <1>:                  Maintaining the CFG.
                                                             (line   61)
* gsi_insert_after:                      Sequence iterators. (line  147)
* gsi_insert_before <1>:                 Maintaining the CFG.
                                                             (line   67)
* gsi_insert_before:                     Sequence iterators. (line  136)
* gsi_insert_on_edge <1>:                Maintaining the CFG.
                                                             (line  107)
* gsi_insert_on_edge:                    Sequence iterators. (line  174)
* gsi_insert_on_edge_immediate:          Sequence iterators. (line  185)
* gsi_insert_seq_after:                  Sequence iterators. (line  154)
* gsi_insert_seq_before:                 Sequence iterators. (line  143)
* gsi_insert_seq_on_edge:                Sequence iterators. (line  179)
* gsi_last <1>:                          Maintaining the CFG.
                                                             (line   45)
* gsi_last:                              Sequence iterators. (line   50)
* gsi_last_bb:                           Sequence iterators. (line   56)
* gsi_link_after:                        Sequence iterators. (line  115)
* gsi_link_before:                       Sequence iterators. (line  105)
* gsi_link_seq_after:                    Sequence iterators. (line  110)
* gsi_link_seq_before:                   Sequence iterators. (line   99)
* gsi_move_after:                        Sequence iterators. (line  161)
* gsi_move_before:                       Sequence iterators. (line  166)
* gsi_move_to_bb_end:                    Sequence iterators. (line  171)
* gsi_next <1>:                          Maintaining the CFG.
                                                             (line   53)
* gsi_next:                              Sequence iterators. (line   66)
* gsi_one_before_end_p:                  Sequence iterators. (line   63)
* gsi_prev <1>:                          Maintaining the CFG.
                                                             (line   57)
* gsi_prev:                              Sequence iterators. (line   69)
* gsi_remove <1>:                        Maintaining the CFG.
                                                             (line   73)
* gsi_remove:                            Sequence iterators. (line   90)
* gsi_replace:                           Sequence iterators. (line  130)
* gsi_seq:                               Sequence iterators. (line   86)
* gsi_split_seq_after:                   Sequence iterators. (line  120)
* gsi_split_seq_before:                  Sequence iterators. (line  125)
* gsi_start <1>:                         Maintaining the CFG.
                                                             (line   41)
* gsi_start:                             Sequence iterators. (line   40)
* gsi_start_bb:                          Sequence iterators. (line   46)
* gsi_stmt:                              Sequence iterators. (line   72)
* gsi_stmt_ptr:                          Sequence iterators. (line   80)
* gt:                                    Comparisons.        (line   60)
* gt and attributes:                     Expressions.        (line   85)
* GT_EXPR:                               Unary and Binary Expressions.
                                                             (line    6)
* gtu:                                   Comparisons.        (line   64)
* gtu and attributes:                    Expressions.        (line   85)
* GTY:                                   Type Information.   (line    6)
* H in constraint:                       Simple Constraints. (line   98)
* HAmode:                                Machine Modes.      (line  144)
* HANDLE_PRAGMA_PACK_WITH_EXPANSION:     Misc.               (line  436)
* HANDLER:                               Statements for C++. (line    6)
* HANDLER_BODY:                          Statements for C++. (line    6)
* HANDLER_PARMS:                         Statements for C++. (line    6)
* hard registers:                        Regs and Memory.    (line    9)
* HARD_FRAME_POINTER_IS_ARG_POINTER:     Frame Registers.    (line   58)
* HARD_FRAME_POINTER_IS_FRAME_POINTER:   Frame Registers.    (line   51)
* HARD_FRAME_POINTER_REGNUM:             Frame Registers.    (line   20)
* HARD_REGNO_CALL_PART_CLOBBERED:        Register Basics.    (line   53)
* HARD_REGNO_CALLER_SAVE_MODE:           Caller Saves.       (line   20)
* HARD_REGNO_MODE_OK:                    Values in Registers.
                                                             (line   58)
* HARD_REGNO_NREGS:                      Values in Registers.
                                                             (line   11)
* HARD_REGNO_NREGS_HAS_PADDING:          Values in Registers.
                                                             (line   25)
* HARD_REGNO_NREGS_WITH_PADDING:         Values in Registers.
                                                             (line   43)
* HARD_REGNO_RENAME_OK:                  Values in Registers.
                                                             (line  119)
* HAS_INIT_SECTION:                      Macros for Initialization.
                                                             (line   19)
* HAS_LONG_COND_BRANCH:                  Misc.               (line    9)
* HAS_LONG_UNCOND_BRANCH:                Misc.               (line   18)
* HAVE_DOS_BASED_FILE_SYSTEM:            Filesystem.         (line   11)
* HAVE_POST_DECREMENT:                   Addressing Modes.   (line   12)
* HAVE_POST_INCREMENT:                   Addressing Modes.   (line   11)
* HAVE_POST_MODIFY_DISP:                 Addressing Modes.   (line   18)
* HAVE_POST_MODIFY_REG:                  Addressing Modes.   (line   24)
* HAVE_PRE_DECREMENT:                    Addressing Modes.   (line   10)
* HAVE_PRE_INCREMENT:                    Addressing Modes.   (line    9)
* HAVE_PRE_MODIFY_DISP:                  Addressing Modes.   (line   17)
* HAVE_PRE_MODIFY_REG:                   Addressing Modes.   (line   23)
* HCmode:                                Machine Modes.      (line  197)
* HFmode:                                Machine Modes.      (line   58)
* high:                                  Constants.          (line  120)
* HImode:                                Machine Modes.      (line   29)
* HImode, in insn:                       Insns.              (line  278)
* HONOR_REG_ALLOC_ORDER:                 Allocation Order.   (line   37)
* host configuration:                    Host Config.        (line    6)
* host functions:                        Host Common.        (line    6)
* host hooks:                            Host Common.        (line    6)
* host makefile fragment:                Host Fragment.      (line    6)
* HOST_BIT_BUCKET:                       Filesystem.         (line   51)
* HOST_EXECUTABLE_SUFFIX:                Filesystem.         (line   45)
* HOST_HOOKS_EXTRA_SIGNALS:              Host Common.        (line   12)
* HOST_HOOKS_GT_PCH_ALLOC_GRANULARITY:   Host Common.        (line   45)
* HOST_HOOKS_GT_PCH_GET_ADDRESS:         Host Common.        (line   17)
* HOST_HOOKS_GT_PCH_USE_ADDRESS:         Host Common.        (line   26)
* HOST_LACKS_INODE_NUMBERS:              Filesystem.         (line   89)
* HOST_LONG_FORMAT:                      Host Misc.          (line   45)
* HOST_LONG_LONG_FORMAT:                 Host Misc.          (line   41)
* HOST_OBJECT_SUFFIX:                    Filesystem.         (line   40)
* HOST_PTR_PRINTF:                       Host Misc.          (line   49)
* HOT_TEXT_SECTION_NAME:                 Sections.           (line   43)
* HQmode:                                Machine Modes.      (line  107)
* I in constraint:                       Simple Constraints. (line   81)
* i in constraint:                       Simple Constraints. (line   70)
* identifier:                            Identifiers.        (line    6)
* IDENTIFIER_LENGTH:                     Identifiers.        (line   22)
* IDENTIFIER_NODE:                       Identifiers.        (line    6)
* IDENTIFIER_OPNAME_P:                   Identifiers.        (line   27)
* IDENTIFIER_POINTER:                    Identifiers.        (line   17)
* IDENTIFIER_TYPENAME_P:                 Identifiers.        (line   33)
* IEEE 754-2008:                         Decimal float library routines.
                                                             (line    6)
* IF_COND:                               Statements for C++. (line    6)
* if_marked:                             GTY Options.        (line  156)
* IF_STMT:                               Statements for C++. (line    6)
* if_then_else:                          Comparisons.        (line   80)
* if_then_else and attributes:           Expressions.        (line   32)
* if_then_else usage:                    Side Effects.       (line   56)
* IFCVT_MACHDEP_INIT:                    Misc.               (line  560)
* IFCVT_MODIFY_CANCEL:                   Misc.               (line  554)
* IFCVT_MODIFY_FINAL:                    Misc.               (line  548)
* IFCVT_MODIFY_INSN:                     Misc.               (line  542)
* IFCVT_MODIFY_MULTIPLE_TESTS:           Misc.               (line  535)
* IFCVT_MODIFY_TESTS:                    Misc.               (line  524)
* IMAGPART_EXPR:                         Unary and Binary Expressions.
                                                             (line    6)
* Immediate Uses:                        SSA Operands.       (line  274)
* immediate_operand:                     Machine-Independent Predicates.
                                                             (line   11)
* IMMEDIATE_PREFIX:                      Instruction Output. (line  155)
* in_struct:                             Flags.              (line  245)
* in_struct, in code_label and note:     Flags.              (line   59)
* in_struct, in insn and jump_insn and call_insn: Flags.     (line   49)
* in_struct, in insn, jump_insn and call_insn: Flags.        (line  148)
* in_struct, in subreg:                  Flags.              (line  187)
* include:                               Including Patterns. (line    6)
* INCLUDE_DEFAULTS:                      Driver.             (line  328)
* inclusive-or, bitwise:                 Arithmetic.         (line  163)
* INCOMING_FRAME_SP_OFFSET:              Frame Layout.       (line  183)
* INCOMING_REGNO:                        Register Basics.    (line   88)
* INCOMING_RETURN_ADDR_RTX:              Frame Layout.       (line  139)
* INCOMING_STACK_BOUNDARY:               Storage Layout.     (line  161)
* INDEX_REG_CLASS:                       Register Classes.   (line  143)
* indirect_jump instruction pattern:     Standard Names.     (line 1225)
* indirect_operand:                      Machine-Independent Predicates.
                                                             (line   71)
* INDIRECT_REF:                          Storage References. (line    6)
* INIT_ARRAY_SECTION_ASM_OP:             Sections.           (line  107)
* INIT_CUMULATIVE_ARGS:                  Register Arguments. (line  150)
* INIT_CUMULATIVE_INCOMING_ARGS:         Register Arguments. (line  177)
* INIT_CUMULATIVE_LIBCALL_ARGS:          Register Arguments. (line  171)
* INIT_ENVIRONMENT:                      Driver.             (line  306)
* INIT_EXPANDERS:                        Per-Function Data.  (line   39)
* INIT_EXPR:                             Unary and Binary Expressions.
                                                             (line    6)
* init_machine_status:                   Per-Function Data.  (line   45)
* init_one_libfunc:                      Library Calls.      (line   15)
* INIT_SECTION_ASM_OP <1>:               Macros for Initialization.
                                                             (line   10)
* INIT_SECTION_ASM_OP:                   Sections.           (line   91)
* INITIAL_ELIMINATION_OFFSET:            Elimination.        (line   85)
* INITIAL_FRAME_ADDRESS_RTX:             Frame Layout.       (line   83)
* INITIAL_FRAME_POINTER_OFFSET:          Elimination.        (line   35)
* initialization routines:               Initialization.     (line    6)
* inlining:                              Target Attributes.  (line   95)
* insert_insn_on_edge:                   Maintaining the CFG.
                                                             (line  107)
* insn:                                  Insns.              (line   63)
* insn and /f:                           Flags.              (line  107)
* insn and /j:                           Flags.              (line  157)
* insn and /s:                           Flags.              (line   49)
* insn and /u:                           Flags.              (line   39)
* insn and /v:                           Flags.              (line   44)
* insn attributes:                       Insn Attributes.    (line    6)
* insn canonicalization:                 Insn Canonicalizations.
                                                             (line    6)
* insn includes:                         Including Patterns. (line    6)
* insn lengths, computing:               Insn Lengths.       (line    6)
* insn notes, notes:                     Basic Blocks.       (line   52)
* insn splitting:                        Insn Splitting.     (line    6)
* insn-attr.h:                           Defining Attributes.
                                                             (line   32)
* INSN_ANNULLED_BRANCH_P:                Flags.              (line   39)
* INSN_CODE:                             Insns.              (line  305)
* INSN_DELETED_P:                        Flags.              (line   44)
* INSN_FROM_TARGET_P:                    Flags.              (line   49)
* insn_list:                             Insns.              (line  552)
* INSN_REFERENCES_ARE_DELAYED:           Misc.               (line  463)
* INSN_SETS_ARE_DELAYED:                 Misc.               (line  452)
* INSN_UID:                              Insns.              (line   23)
* INSN_VAR_LOCATION:                     Insns.              (line  245)
* insns:                                 Insns.              (line    6)
* insns, generating:                     RTL Template.       (line    6)
* insns, recognizing:                    RTL Template.       (line    6)
* instruction attributes:                Insn Attributes.    (line    6)
* instruction latency time:              Processor pipeline description.
                                                             (line    6)
* instruction patterns:                  Patterns.           (line    6)
* instruction splitting:                 Insn Splitting.     (line    6)
* insv instruction pattern:              Standard Names.     (line 1023)
* insvM instruction pattern:             Standard Names.     (line  975)
* insvmisalignM instruction pattern:     Standard Names.     (line  985)
* int iterators in .md files:            Int Iterators.      (line    6)
* INT16_TYPE:                            Type Layout.        (line  254)
* INT32_TYPE:                            Type Layout.        (line  255)
* INT64_TYPE:                            Type Layout.        (line  256)
* INT8_TYPE:                             Type Layout.        (line  253)
* INT_FAST16_TYPE:                       Type Layout.        (line  270)
* INT_FAST32_TYPE:                       Type Layout.        (line  271)
* INT_FAST64_TYPE:                       Type Layout.        (line  272)
* INT_FAST8_TYPE:                        Type Layout.        (line  269)
* INT_LEAST16_TYPE:                      Type Layout.        (line  262)
* INT_LEAST32_TYPE:                      Type Layout.        (line  263)
* INT_LEAST64_TYPE:                      Type Layout.        (line  264)
* INT_LEAST8_TYPE:                       Type Layout.        (line  261)
* INT_TYPE_SIZE:                         Type Layout.        (line   12)
* INTEGER_CST:                           Constant expressions.
                                                             (line    6)
* INTEGER_TYPE:                          Types.              (line    6)
* Interdependence of Patterns:           Dependent Patterns. (line    6)
* interfacing to GCC output:             Interface.          (line    6)
* interlock delays:                      Processor pipeline description.
                                                             (line    6)
* intermediate representation lowering:  Parsing pass.       (line   14)
* INTMAX_TYPE:                           Type Layout.        (line  230)
* INTPTR_TYPE:                           Type Layout.        (line  277)
* introduction:                          Top.                (line    6)
* INVOKE__main:                          Macros for Initialization.
                                                             (line   51)
* ior:                                   Arithmetic.         (line  163)
* ior and attributes:                    Expressions.        (line   50)
* ior, canonicalization of:              Insn Canonicalizations.
                                                             (line   52)
* iorM3 instruction pattern:             Standard Names.     (line  269)
* IRA_HARD_REGNO_ADD_COST_MULTIPLIER:    Allocation Order.   (line   45)
* IS_ASM_LOGICAL_LINE_SEPARATOR:         Data Output.        (line  121)
* is_gimple_addressable:                 Logical Operators.  (line  115)
* is_gimple_asm_val:                     Logical Operators.  (line  119)
* is_gimple_assign:                      Logical Operators.  (line  151)
* is_gimple_call:                        Logical Operators.  (line  154)
* is_gimple_call_addr:                   Logical Operators.  (line  122)
* is_gimple_constant:                    Logical Operators.  (line  130)
* is_gimple_debug:                       Logical Operators.  (line  157)
* is_gimple_ip_invariant:                Logical Operators.  (line  139)
* is_gimple_ip_invariant_address:        Logical Operators.  (line  144)
* is_gimple_mem_ref_addr:                Logical Operators.  (line  126)
* is_gimple_min_invariant:               Logical Operators.  (line  133)
* is_gimple_omp:                         GIMPLE_OMP_PARALLEL.
                                                             (line   65)
* is_gimple_val:                         Logical Operators.  (line  109)
* iterators in .md files:                Iterators.          (line    6)
* IV analysis on GIMPLE:                 Scalar evolutions.  (line    6)
* IV analysis on RTL:                    loop-iv.            (line    6)
* JMP_BUF_SIZE:                          Exception Region Output.
                                                             (line   84)
* jump:                                  Flags.              (line  286)
* jump instruction pattern:              Standard Names.     (line 1102)
* jump instruction patterns:             Jump Patterns.      (line    6)
* jump instructions and set:             Side Effects.       (line   56)
* jump, in call_insn:                    Flags.              (line  161)
* jump, in insn:                         Flags.              (line  157)
* jump, in mem:                          Flags.              (line   70)
* JUMP_ALIGN:                            Alignment Output.   (line    9)
* jump_insn:                             Insns.              (line   73)
* jump_insn and /f:                      Flags.              (line  107)
* jump_insn and /s:                      Flags.              (line   49)
* jump_insn and /u:                      Flags.              (line   39)
* jump_insn and /v:                      Flags.              (line   44)
* JUMP_LABEL:                            Insns.              (line   80)
* JUMP_TABLES_IN_TEXT_SECTION:           Sections.           (line  151)
* Jumps:                                 Jumps.              (line    6)
* LABEL_ALIGN:                           Alignment Output.   (line   58)
* LABEL_ALIGN_AFTER_BARRIER:             Alignment Output.   (line   27)
* LABEL_ALT_ENTRY_P:                     Insns.              (line  146)
* LABEL_ALTERNATE_NAME:                  Edges.              (line  181)
* LABEL_DECL:                            Declarations.       (line    6)
* LABEL_KIND:                            Insns.              (line  146)
* LABEL_NUSES:                           Insns.              (line  142)
* LABEL_PRESERVE_P:                      Flags.              (line   59)
* label_ref:                             Constants.          (line   97)
* label_ref and /v:                      Flags.              (line   65)
* label_ref, RTL sharing:                Sharing.            (line   35)
* LABEL_REF_NONLOCAL_P:                  Flags.              (line   65)
* lang_hooks.gimplify_expr:              Gimplification pass.
                                                             (line   18)
* lang_hooks.parse_file:                 Parsing pass.       (line    6)
* language-dependent trees:              Language-dependent trees.
                                                             (line    6)
* language-independent intermediate representation: Parsing pass.
                                                             (line   14)
* large return values:                   Aggregate Return.   (line    6)
* LARGEST_EXPONENT_IS_NORMAL:            Storage Layout.     (line  486)
* LAST_STACK_REG:                        Stack Registers.    (line   31)
* LAST_VIRTUAL_REGISTER:                 Regs and Memory.    (line   51)
* lceilMN2:                              Standard Names.     (line  693)
* LCSSA:                                 LCSSA.              (line    6)
* LD_FINI_SWITCH:                        Macros for Initialization.
                                                             (line   29)
* LD_INIT_SWITCH:                        Macros for Initialization.
                                                             (line   25)
* LDD_SUFFIX:                            Macros for Initialization.
                                                             (line  122)
* le:                                    Comparisons.        (line   76)
* le and attributes:                     Expressions.        (line   85)
* LE_EXPR:                               Unary and Binary Expressions.
                                                             (line    6)
* leaf functions:                        Leaf Functions.     (line    6)
* leaf_function_p:                       Standard Names.     (line 1187)
* LEAF_REG_REMAP:                        Leaf Functions.     (line   39)
* LEAF_REGISTERS:                        Leaf Functions.     (line   25)
* left rotate:                           Arithmetic.         (line  195)
* left shift:                            Arithmetic.         (line  173)
* LEGITIMATE_PIC_OPERAND_P:              PIC.                (line   32)
* LEGITIMIZE_RELOAD_ADDRESS:             Addressing Modes.   (line  153)
* length:                                GTY Options.        (line   50)
* less than:                             Comparisons.        (line   68)
* less than or equal:                    Comparisons.        (line   76)
* leu:                                   Comparisons.        (line   76)
* leu and attributes:                    Expressions.        (line   85)
* lfloorMN2:                             Standard Names.     (line  688)
* LIB2FUNCS_EXTRA:                       Target Fragment.    (line   11)
* LIB_SPEC:                              Driver.             (line  108)
* LIBCALL_VALUE:                         Scalar Return.      (line   56)
* libgcc.a:                              Library Calls.      (line    6)
* LIBGCC2_CFLAGS:                        Target Fragment.    (line    8)
* LIBGCC2_GNU_PREFIX:                    Type Layout.        (line  128)
* LIBGCC2_HAS_DF_MODE:                   Type Layout.        (line  109)
* LIBGCC2_HAS_TF_MODE:                   Type Layout.        (line  122)
* LIBGCC2_HAS_XF_MODE:                   Type Layout.        (line  116)
* LIBGCC2_LONG_DOUBLE_TYPE_SIZE:         Type Layout.        (line  103)
* LIBGCC2_UNWIND_ATTRIBUTE:              Misc.               (line  963)
* LIBGCC_SPEC:                           Driver.             (line  116)
* library subroutine names:              Library Calls.      (line    6)
* LIBRARY_PATH_ENV:                      Misc.               (line  503)
* LIMIT_RELOAD_CLASS:                    Register Classes.   (line  300)
* Linear loop transformations framework: Lambda.             (line    6)
* LINK_COMMAND_SPEC:                     Driver.             (line  237)
* LINK_EH_SPEC:                          Driver.             (line  143)
* LINK_GCC_C_SEQUENCE_SPEC:              Driver.             (line  233)
* LINK_LIBGCC_SPECIAL_1:                 Driver.             (line  228)
* LINK_SPEC:                             Driver.             (line  101)
* list:                                  Containers.         (line    6)
* Liveness representation:               Liveness information.
                                                             (line    6)
* lo_sum:                                Arithmetic.         (line   24)
* load address instruction:              Simple Constraints. (line  164)
* LOAD_EXTEND_OP:                        Misc.               (line   60)
* load_multiple instruction pattern:     Standard Names.     (line  137)
* Local Register Allocator (LRA):        RTL passes.         (line  200)
* LOCAL_ALIGNMENT:                       Storage Layout.     (line  250)
* LOCAL_CLASS_P:                         Classes.            (line   73)
* LOCAL_DECL_ALIGNMENT:                  Storage Layout.     (line  287)
* LOCAL_INCLUDE_DIR:                     Driver.             (line  313)
* LOCAL_LABEL_PREFIX:                    Instruction Output. (line  153)
* LOCAL_REGNO:                           Register Basics.    (line  102)
* LOG_LINKS:                             Insns.              (line  324)
* Logical Operators:                     Logical Operators.  (line    6)
* logical-and, bitwise:                  Arithmetic.         (line  158)
* LOGICAL_OP_NON_SHORT_CIRCUIT:          Costs.              (line  265)
* logM2 instruction pattern:             Standard Names.     (line  601)
* LONG_ACCUM_TYPE_SIZE:                  Type Layout.        (line   93)
* LONG_DOUBLE_TYPE_SIZE:                 Type Layout.        (line   58)
* LONG_FRACT_TYPE_SIZE:                  Type Layout.        (line   73)
* LONG_LONG_ACCUM_TYPE_SIZE:             Type Layout.        (line   98)
* LONG_LONG_FRACT_TYPE_SIZE:             Type Layout.        (line   78)
* LONG_LONG_TYPE_SIZE:                   Type Layout.        (line   33)
* LONG_TYPE_SIZE:                        Type Layout.        (line   22)
* longjmp and automatic variables:       Interface.          (line   52)
* Loop analysis:                         Loop representation.
                                                             (line    6)
* Loop manipulation:                     Loop manipulation.  (line    6)
* Loop querying:                         Loop querying.      (line    6)
* Loop representation:                   Loop representation.
                                                             (line    6)
* Loop-closed SSA form:                  LCSSA.              (line    6)
* LOOP_ALIGN:                            Alignment Output.   (line   41)
* LOOP_EXPR:                             Unary and Binary Expressions.
                                                             (line    6)
* looping instruction patterns:          Looping Patterns.   (line    6)
* lowering, language-dependent intermediate representation: Parsing pass.
                                                             (line   14)
* lrintMN2:                              Standard Names.     (line  678)
* lroundMN2:                             Standard Names.     (line  683)
* LSHIFT_EXPR:                           Unary and Binary Expressions.
                                                             (line    6)
* lshiftrt:                              Arithmetic.         (line  190)
* lshiftrt and attributes:               Expressions.        (line   85)
* lshrM3 instruction pattern:            Standard Names.     (line  520)
* lt:                                    Comparisons.        (line   68)
* lt and attributes:                     Expressions.        (line   85)
* LT_EXPR:                               Unary and Binary Expressions.
                                                             (line    6)
* LTGT_EXPR:                             Unary and Binary Expressions.
                                                             (line    6)
* lto:                                   LTO.                (line    6)
* ltrans:                                LTO.                (line    6)
* ltu:                                   Comparisons.        (line   68)
* m in constraint:                       Simple Constraints. (line   17)
* machine attributes:                    Target Attributes.  (line    6)
* machine description macros:            Target Macros.      (line    6)
* machine descriptions:                  Machine Desc.       (line    6)
* machine mode conversions:              Conversions.        (line    6)
* machine modes:                         Machine Modes.      (line    6)
* machine specific constraints:          Machine Constraints.
                                                             (line    6)
* machine-independent predicates:        Machine-Independent Predicates.
                                                             (line    6)
* macros, target description:            Target Macros.      (line    6)
* maddMN4 instruction pattern:           Standard Names.     (line  443)
* MAKE_DECL_ONE_ONLY:                    Label Output.       (line  250)
* make_safe_from:                        Expander Definitions.
                                                             (line  151)
* makefile fragment:                     Fragments.          (line    6)
* makefile targets:                      Makefile.           (line    6)
* MALLOC_ABI_ALIGNMENT:                  Storage Layout.     (line  175)
* Manipulating GIMPLE statements:        Manipulating GIMPLE statements.
                                                             (line    6)
* mark_hook:                             GTY Options.        (line  171)
* marking roots:                         GGC Roots.          (line    6)
* MASK_RETURN_ADDR:                      Exception Region Output.
                                                             (line   35)
* match_dup <1>:                         define_peephole2.   (line   28)
* match_dup:                             RTL Template.       (line   73)
* match_dup and attributes:              Insn Lengths.       (line   16)
* match_op_dup:                          RTL Template.       (line  163)
* match_operand:                         RTL Template.       (line   16)
* match_operand and attributes:          Expressions.        (line   55)
* match_operator:                        RTL Template.       (line   95)
* match_par_dup:                         RTL Template.       (line  219)
* match_parallel:                        RTL Template.       (line  172)
* match_scratch <1>:                     define_peephole2.   (line   28)
* match_scratch:                         RTL Template.       (line   58)
* match_test and attributes:             Expressions.        (line   64)
* matching constraint:                   Simple Constraints. (line  142)
* matching operands:                     Output Template.    (line   49)
* math library:                          Soft float library routines.
                                                             (line    6)
* math, in RTL:                          Arithmetic.         (line    6)
* MATH_LIBRARY:                          Misc.               (line  496)
* matherr:                               Library Calls.      (line   52)
* MAX_BITS_PER_WORD:                     Storage Layout.     (line   60)
* MAX_CONDITIONAL_EXECUTE:               Misc.               (line  518)
* MAX_FIXED_MODE_SIZE:                   Storage Layout.     (line  433)
* MAX_MOVE_MAX:                          Misc.               (line  106)
* MAX_OFILE_ALIGNMENT:                   Storage Layout.     (line  212)
* MAX_REGS_PER_ADDRESS:                  Addressing Modes.   (line   43)
* MAX_STACK_ALIGNMENT:                   Storage Layout.     (line  205)
* maxM3 instruction pattern:             Standard Names.     (line  304)
* may_trap_p, tree_could_trap_p:         Edges.              (line  115)
* maybe_undef:                           GTY Options.        (line  179)
* mcount:                                Profiling.          (line   12)
* MD_CAN_REDIRECT_BRANCH:                Misc.               (line  678)
* MD_EXEC_PREFIX:                        Driver.             (line  268)
* MD_FALLBACK_FRAME_STATE_FOR:           Exception Handling. (line   94)
* MD_HANDLE_UNWABI:                      Exception Handling. (line  114)
* MD_STARTFILE_PREFIX:                   Driver.             (line  296)
* MD_STARTFILE_PREFIX_1:                 Driver.             (line  301)
* mem:                                   Regs and Memory.    (line  374)
* mem and /c:                            Flags.              (line   81)
* mem and /f:                            Flags.              (line   85)
* mem and /j:                            Flags.              (line   70)
* mem and /u:                            Flags.              (line  134)
* mem and /v:                            Flags.              (line   76)
* mem, RTL sharing:                      Sharing.            (line   40)
* MEM_ADDR_SPACE:                        Special Accessors.  (line   49)
* MEM_ALIAS_SET:                         Special Accessors.  (line    9)
* MEM_ALIGN:                             Special Accessors.  (line   46)
* MEM_EXPR:                              Special Accessors.  (line   20)
* MEM_KEEP_ALIAS_SET_P:                  Flags.              (line   70)
* MEM_NOTRAP_P:                          Flags.              (line   81)
* MEM_OFFSET:                            Special Accessors.  (line   32)
* MEM_OFFSET_KNOWN_P:                    Special Accessors.  (line   28)
* MEM_POINTER:                           Flags.              (line   85)
* MEM_READONLY_P:                        Flags.              (line  134)
* MEM_REF:                               Storage References. (line    6)
* mem_signal_fenceMODE instruction pattern: Standard Names.  (line 1844)
* MEM_SIZE:                              Special Accessors.  (line   40)
* MEM_SIZE_KNOWN_P:                      Special Accessors.  (line   36)
* mem_thread_fenceMODE instruction pattern: Standard Names.  (line 1836)
* MEM_VOLATILE_P:                        Flags.              (line   76)
* memory model:                          Memory model.       (line    6)
* memory reference, nonoffsettable:      Simple Constraints. (line  256)
* memory references in constraints:      Simple Constraints. (line   17)
* memory_barrier instruction pattern:    Standard Names.     (line 1585)
* MEMORY_MOVE_COST:                      Costs.              (line   54)
* memory_operand:                        Machine-Independent Predicates.
                                                             (line   58)
* METHOD_TYPE:                           Types.              (line    6)
* MIN_UNITS_PER_WORD:                    Storage Layout.     (line   70)
* MINIMUM_ALIGNMENT:                     Storage Layout.     (line  300)
* MINIMUM_ATOMIC_ALIGNMENT:              Storage Layout.     (line  183)
* minM3 instruction pattern:             Standard Names.     (line  304)
* minus:                                 Arithmetic.         (line   36)
* minus and attributes:                  Expressions.        (line   85)
* minus, canonicalization of:            Insn Canonicalizations.
                                                             (line   27)
* MINUS_EXPR:                            Unary and Binary Expressions.
                                                             (line    6)
* MIPS coprocessor-definition macros:    MIPS Coprocessors.  (line    6)
* mod:                                   Arithmetic.         (line  136)
* mod and attributes:                    Expressions.        (line   85)
* mode classes:                          Machine Modes.      (line  219)
* mode iterators in .md files:           Mode Iterators.     (line    6)
* mode switching:                        Mode Switching.     (line    6)
* MODE_ACCUM:                            Machine Modes.      (line  249)
* MODE_AFTER:                            Mode Switching.     (line   49)
* MODE_BASE_REG_CLASS:                   Register Classes.   (line  119)
* MODE_BASE_REG_REG_CLASS:               Register Classes.   (line  125)
* MODE_CC <1>:                           MODE_CC Condition Codes.
                                                             (line    6)
* MODE_CC:                               Machine Modes.      (line  268)
* MODE_CODE_BASE_REG_CLASS:              Register Classes.   (line  133)
* MODE_COMPLEX_FLOAT:                    Machine Modes.      (line  260)
* MODE_COMPLEX_INT:                      Machine Modes.      (line  257)
* MODE_DECIMAL_FLOAT:                    Machine Modes.      (line  237)
* MODE_ENTRY:                            Mode Switching.     (line   55)
* MODE_EXIT:                             Mode Switching.     (line   61)
* MODE_FLOAT:                            Machine Modes.      (line  233)
* MODE_FRACT:                            Machine Modes.      (line  241)
* MODE_FUNCTION:                         Machine Modes.      (line  264)
* MODE_INT:                              Machine Modes.      (line  225)
* MODE_NEEDED:                           Mode Switching.     (line   42)
* MODE_PARTIAL_INT:                      Machine Modes.      (line  229)
* MODE_PRIORITY_TO_MODE:                 Mode Switching.     (line   67)
* MODE_RANDOM:                           Machine Modes.      (line  273)
* MODE_UACCUM:                           Machine Modes.      (line  253)
* MODE_UFRACT:                           Machine Modes.      (line  245)
* MODES_TIEABLE_P:                       Values in Registers.
                                                             (line  129)
* modifiers in constraints:              Modifiers.          (line    6)
* MODIFY_EXPR:                           Unary and Binary Expressions.
                                                             (line    6)
* MODIFY_JNI_METHOD_CALL:                Misc.               (line  763)
* modM3 instruction pattern:             Standard Names.     (line  269)
* modulo scheduling:                     RTL passes.         (line  132)
* MOVE_BY_PIECES_P:                      Costs.              (line  165)
* MOVE_MAX:                              Misc.               (line  101)
* MOVE_MAX_PIECES:                       Costs.              (line  171)
* MOVE_RATIO:                            Costs.              (line  149)
* movM instruction pattern:              Standard Names.     (line   11)
* movmemM instruction pattern:           Standard Names.     (line  750)
* movmisalignM instruction pattern:      Standard Names.     (line  126)
* movMODEcc instruction pattern:         Standard Names.     (line 1037)
* movstr instruction pattern:            Standard Names.     (line  785)
* movstrictM instruction pattern:        Standard Names.     (line  120)
* msubMN4 instruction pattern:           Standard Names.     (line  466)
* mulhisi3 instruction pattern:          Standard Names.     (line  419)
* mulM3 instruction pattern:             Standard Names.     (line  269)
* mulqihi3 instruction pattern:          Standard Names.     (line  423)
* mulsidi3 instruction pattern:          Standard Names.     (line  423)
* mult:                                  Arithmetic.         (line   92)
* mult and attributes:                   Expressions.        (line   85)
* mult, canonicalization of:             Insn Canonicalizations.
                                                             (line   27)
* MULT_EXPR:                             Unary and Binary Expressions.
                                                             (line    6)
* MULT_HIGHPART_EXPR:                    Unary and Binary Expressions.
                                                             (line    6)
* MULTIARCH_DIRNAME:                     Target Fragment.    (line  170)
* MULTILIB_DEFAULTS:                     Driver.             (line  253)
* MULTILIB_DIRNAMES:                     Target Fragment.    (line   44)
* MULTILIB_EXCEPTIONS:                   Target Fragment.    (line   70)
* MULTILIB_EXTRA_OPTS:                   Target Fragment.    (line  132)
* MULTILIB_MATCHES:                      Target Fragment.    (line   63)
* MULTILIB_OPTIONS:                      Target Fragment.    (line   24)
* MULTILIB_OSDIRNAMES:                   Target Fragment.    (line  139)
* MULTILIB_REQUIRED:                     Target Fragment.    (line   82)
* MULTILIB_REUSE:                        Target Fragment.    (line  103)
* multiple alternative constraints:      Multi-Alternative.  (line    6)
* MULTIPLE_SYMBOL_SPACES:                Misc.               (line  476)
* multiplication:                        Arithmetic.         (line   92)
* multiplication with signed saturation: Arithmetic.         (line   92)
* multiplication with unsigned saturation: Arithmetic.       (line   92)
* n in constraint:                       Simple Constraints. (line   75)
* N_REG_CLASSES:                         Register Classes.   (line   83)
* name:                                  Identifiers.        (line    6)
* named address spaces:                  Named Address Spaces.
                                                             (line    6)
* named patterns and conditions:         Patterns.           (line   47)
* names, pattern:                        Standard Names.     (line    6)
* namespace, scope:                      Namespaces.         (line    6)
* NAMESPACE_DECL <1>:                    Namespaces.         (line    6)
* NAMESPACE_DECL:                        Declarations.       (line    6)
* NATIVE_SYSTEM_HEADER_COMPONENT:        Driver.             (line  323)
* ne:                                    Comparisons.        (line   56)
* ne and attributes:                     Expressions.        (line   85)
* NE_EXPR:                               Unary and Binary Expressions.
                                                             (line    6)
* nearbyintM2 instruction pattern:       Standard Names.     (line  660)
* neg:                                   Arithmetic.         (line   81)
* neg and attributes:                    Expressions.        (line   85)
* neg, canonicalization of:              Insn Canonicalizations.
                                                             (line   27)
* NEGATE_EXPR:                           Unary and Binary Expressions.
                                                             (line    6)
* negation:                              Arithmetic.         (line   81)
* negation with signed saturation:       Arithmetic.         (line   81)
* negation with unsigned saturation:     Arithmetic.         (line   81)
* negM2 instruction pattern:             Standard Names.     (line  532)
* nested functions, trampolines for:     Trampolines.        (line    6)
* nested_ptr:                            GTY Options.        (line  186)
* next_bb, prev_bb, FOR_EACH_BB, FOR_ALL_BB: Basic Blocks.   (line   25)
* NEXT_INSN:                             Insns.              (line   30)
* NEXT_OBJC_RUNTIME:                     Library Calls.      (line   88)
* nil:                                   RTL Objects.        (line   73)
* NM_FLAGS:                              Macros for Initialization.
                                                             (line  111)
* NO_DBX_BNSYM_ENSYM:                    DBX Hooks.          (line   26)
* NO_DBX_FUNCTION_END:                   DBX Hooks.          (line   20)
* NO_DBX_GCC_MARKER:                     File Names and DBX. (line   28)
* NO_DBX_MAIN_SOURCE_DIRECTORY:          File Names and DBX. (line   23)
* NO_DOLLAR_IN_LABEL:                    Label Output.       (line   67)
* NO_DOT_IN_LABEL:                       Label Output.       (line   73)
* NO_FUNCTION_CSE:                       Costs.              (line  261)
* NO_IMPLICIT_EXTERN_C:                  Misc.               (line  374)
* NO_PROFILE_COUNTERS:                   Profiling.          (line   28)
* NO_REGS:                               Register Classes.   (line   17)
* NON_LVALUE_EXPR:                       Unary and Binary Expressions.
                                                             (line    6)
* nondeterministic finite state automaton: Processor pipeline description.
                                                             (line  305)
* nonimmediate_operand:                  Machine-Independent Predicates.
                                                             (line  101)
* nonlocal goto handler:                 Edges.              (line  172)
* nonlocal_goto instruction pattern:     Standard Names.     (line 1417)
* nonlocal_goto_receiver instruction pattern: Standard Names.
                                                             (line 1434)
* nonmemory_operand:                     Machine-Independent Predicates.
                                                             (line   97)
* nonoffsettable memory reference:       Simple Constraints. (line  256)
* nop instruction pattern:               Standard Names.     (line 1220)
* NOP_EXPR:                              Unary and Binary Expressions.
                                                             (line    6)
* normal predicates:                     Predicates.         (line   31)
* not:                                   Arithmetic.         (line  154)
* not and attributes:                    Expressions.        (line   50)
* not equal:                             Comparisons.        (line   56)
* not, canonicalization of:              Insn Canonicalizations.
                                                             (line   27)
* note:                                  Insns.              (line  174)
* note and /i:                           Flags.              (line   59)
* note and /v:                           Flags.              (line   44)
* NOTE_INSN_BASIC_BLOCK:                 Basic Blocks.       (line   50)
* NOTE_INSN_BLOCK_BEG:                   Insns.              (line  199)
* NOTE_INSN_BLOCK_END:                   Insns.              (line  199)
* NOTE_INSN_DELETED:                     Insns.              (line  189)
* NOTE_INSN_DELETED_LABEL:               Insns.              (line  194)
* NOTE_INSN_EH_REGION_BEG:               Insns.              (line  205)
* NOTE_INSN_EH_REGION_END:               Insns.              (line  205)
* NOTE_INSN_FUNCTION_BEG:                Insns.              (line  229)
* NOTE_INSN_LOOP_BEG:                    Insns.              (line  213)
* NOTE_INSN_LOOP_CONT:                   Insns.              (line  219)
* NOTE_INSN_LOOP_END:                    Insns.              (line  213)
* NOTE_INSN_LOOP_VTOP:                   Insns.              (line  223)
* NOTE_INSN_VAR_LOCATION:                Insns.              (line  233)
* NOTE_LINE_NUMBER:                      Insns.              (line  174)
* NOTE_SOURCE_FILE:                      Insns.              (line  174)
* NOTE_VAR_LOCATION:                     Insns.              (line  233)
* NOTICE_UPDATE_CC:                      CC0 Condition Codes.
                                                             (line   31)
* NUM_MACHINE_MODES:                     Machine Modes.      (line  286)
* NUM_MODES_FOR_MODE_SWITCHING:          Mode Switching.     (line   30)
* Number of iterations analysis:         Number of iterations.
                                                             (line    6)
* o in constraint:                       Simple Constraints. (line   23)
* OBJC_GEN_METHOD_LABEL:                 Label Output.       (line  452)
* OBJC_JBLEN:                            Misc.               (line  958)
* OBJECT_FORMAT_COFF:                    Macros for Initialization.
                                                             (line   97)
* OFFSET_TYPE:                           Types.              (line    6)
* offsettable address:                   Simple Constraints. (line   23)
* OImode:                                Machine Modes.      (line   51)
* Omega a solver for linear programming problems: Omega.     (line    6)
* OMP_ATOMIC:                            OpenMP.             (line    6)
* OMP_CLAUSE:                            OpenMP.             (line    6)
* OMP_CONTINUE:                          OpenMP.             (line    6)
* OMP_CRITICAL:                          OpenMP.             (line    6)
* OMP_FOR:                               OpenMP.             (line    6)
* OMP_MASTER:                            OpenMP.             (line    6)
* OMP_ORDERED:                           OpenMP.             (line    6)
* OMP_PARALLEL:                          OpenMP.             (line    6)
* OMP_RETURN:                            OpenMP.             (line    6)
* OMP_SECTION:                           OpenMP.             (line    6)
* OMP_SECTIONS:                          OpenMP.             (line    6)
* OMP_SINGLE:                            OpenMP.             (line    6)
* one_cmplM2 instruction pattern:        Standard Names.     (line  747)
* operand access:                        Accessors.          (line    6)
* Operand Access Routines:               SSA Operands.       (line  119)
* operand constraints:                   Constraints.        (line    6)
* Operand Iterators:                     SSA Operands.       (line  119)
* operand predicates:                    Predicates.         (line    6)
* operand substitution:                  Output Template.    (line    6)
* operands <1>:                          Patterns.           (line   53)
* operands:                              SSA Operands.       (line    6)
* Operands:                              Operands.           (line    6)
* operator predicates:                   Predicates.         (line    6)
* optc-gen.awk:                          Options.            (line    6)
* Optimization infrastructure for GIMPLE: Tree SSA.          (line    6)
* OPTIMIZE_MODE_SWITCHING:               Mode Switching.     (line    9)
* option specification files:            Options.            (line    6)
* OPTION_DEFAULT_SPECS:                  Driver.             (line   26)
* optional hardware or system features:  Run-time Target.    (line   59)
* options, directory search:             Including Patterns. (line   44)
* order of register allocation:          Allocation Order.   (line    6)
* ordered_comparison_operator:           Machine-Independent Predicates.
                                                             (line  116)
* ORDERED_EXPR:                          Unary and Binary Expressions.
                                                             (line    6)
* Ordering of Patterns:                  Pattern Ordering.   (line    6)
* ORIGINAL_REGNO:                        Special Accessors.  (line   54)
* other register constraints:            Simple Constraints. (line  173)
* outgoing_args_size:                    Stack Arguments.    (line   48)
* OUTGOING_REG_PARM_STACK_SPACE:         Stack Arguments.    (line   74)
* OUTGOING_REGNO:                        Register Basics.    (line   95)
* output of assembler code:              File Framework.     (line    6)
* output statements:                     Output Statement.   (line    6)
* output templates:                      Output Template.    (line    6)
* output_asm_insn:                       Output Statement.   (line   53)
* OUTPUT_QUOTED_STRING:                  File Framework.     (line  108)
* OVERLAPPING_REGISTER_NAMES:            Instruction Output. (line   21)
* OVERLOAD:                              Functions for C++.  (line    6)
* OVERRIDE_ABI_FORMAT:                   Register Arguments. (line  141)
* OVL_CURRENT:                           Functions for C++.  (line    6)
* OVL_NEXT:                              Functions for C++.  (line    6)
* p in constraint:                       Simple Constraints. (line  164)
* PAD_VARARGS_DOWN:                      Register Arguments. (line  222)
* parallel:                              Side Effects.       (line  210)
* param_is:                              GTY Options.        (line  114)
* parameters, c++ abi:                   C++ ABI.            (line    6)
* parameters, miscellaneous:             Misc.               (line    6)
* parameters, precompiled headers:       PCH Target.         (line    6)
* paramN_is:                             GTY Options.        (line  132)
* parity:                                Arithmetic.         (line  243)
* parityM2 instruction pattern:          Standard Names.     (line  741)
* PARM_BOUNDARY:                         Storage Layout.     (line  140)
* PARM_DECL:                             Declarations.       (line    6)
* PARSE_LDD_OUTPUT:                      Macros for Initialization.
                                                             (line  127)
* pass_duplicate_computed_gotos:         Edges.              (line  162)
* passes and files of the compiler:      Passes.             (line    6)
* passing arguments:                     Interface.          (line   36)
* PATH_SEPARATOR:                        Filesystem.         (line   31)
* PATTERN:                               Insns.              (line  294)
* pattern conditions:                    Patterns.           (line   43)
* pattern names:                         Standard Names.     (line    6)
* Pattern Ordering:                      Pattern Ordering.   (line    6)
* patterns:                              Patterns.           (line    6)
* pc:                                    Regs and Memory.    (line  361)
* pc and attributes:                     Insn Lengths.       (line   20)
* pc, RTL sharing:                       Sharing.            (line   25)
* PC_REGNUM:                             Register Basics.    (line  109)
* pc_rtx:                                Regs and Memory.    (line  366)
* PCC_BITFIELD_TYPE_MATTERS:             Storage Layout.     (line  326)
* PCC_STATIC_STRUCT_RETURN:              Aggregate Return.   (line   65)
* PDImode:                               Machine Modes.      (line   40)
* peephole optimization, RTL representation: Side Effects.   (line  244)
* peephole optimizer definitions:        Peephole Definitions.
                                                             (line    6)
* per-function data:                     Per-Function Data.  (line    6)
* percent sign:                          Output Template.    (line    6)
* PHI nodes:                             SSA.                (line   31)
* PHI_ARG_DEF:                           SSA.                (line   71)
* PHI_ARG_EDGE:                          SSA.                (line   68)
* PHI_ARG_ELT:                           SSA.                (line   63)
* PHI_NUM_ARGS:                          SSA.                (line   59)
* PHI_RESULT:                            SSA.                (line   56)
* PIC:                                   PIC.                (line    6)
* PIC_OFFSET_TABLE_REG_CALL_CLOBBERED:   PIC.                (line   26)
* PIC_OFFSET_TABLE_REGNUM:               PIC.                (line   16)
* pipeline hazard recognizer:            Processor pipeline description.
                                                             (line    6)
* Plugins:                               Plugins.            (line    6)
* plus:                                  Arithmetic.         (line   14)
* plus and attributes:                   Expressions.        (line   85)
* plus, canonicalization of:             Insn Canonicalizations.
                                                             (line   27)
* PLUS_EXPR:                             Unary and Binary Expressions.
                                                             (line    6)
* Pmode:                                 Misc.               (line  330)
* pmode_register_operand:                Machine-Independent Predicates.
                                                             (line   35)
* pointer:                               Types.              (line    6)
* POINTER_PLUS_EXPR:                     Unary and Binary Expressions.
                                                             (line    6)
* POINTER_SIZE:                          Storage Layout.     (line   76)
* POINTER_TYPE:                          Types.              (line    6)
* POINTERS_EXTEND_UNSIGNED:              Storage Layout.     (line   82)
* pop_operand:                           Machine-Independent Predicates.
                                                             (line   88)
* popcount:                              Arithmetic.         (line  239)
* popcountM2 instruction pattern:        Standard Names.     (line  735)
* pops_args:                             Function Entry.     (line  106)
* portability:                           Portability.        (line    6)
* position independent code:             PIC.                (line    6)
* post_dec:                              Incdec.             (line   25)
* post_inc:                              Incdec.             (line   30)
* post_modify:                           Incdec.             (line   33)
* post_order_compute, inverted_post_order_compute, walk_dominator_tree: Basic Blocks.
                                                             (line   34)
* POSTDECREMENT_EXPR:                    Unary and Binary Expressions.
                                                             (line    6)
* POSTINCREMENT_EXPR:                    Unary and Binary Expressions.
                                                             (line    6)
* POWI_MAX_MULTS:                        Misc.               (line  826)
* powM3 instruction pattern:             Standard Names.     (line  609)
* pragma:                                Misc.               (line  379)
* pre_dec:                               Incdec.             (line    8)
* PRE_GCC3_DWARF_FRAME_REGISTERS:        Frame Registers.    (line  127)
* pre_inc:                               Incdec.             (line   22)
* pre_modify:                            Incdec.             (line   51)
* PREDECREMENT_EXPR:                     Unary and Binary Expressions.
                                                             (line    6)
* predefined macros:                     Run-time Target.    (line    6)
* predicates:                            Predicates.         (line    6)
* predicates and machine modes:          Predicates.         (line   31)
* predication <1>:                       Cond Exec Macros.   (line    6)
* predication:                           Conditional Execution.
                                                             (line    6)
* predict.def:                           Profile information.
                                                             (line   24)
* PREFERRED_DEBUGGING_TYPE:              All Debuggers.      (line   42)
* PREFERRED_RELOAD_CLASS:                Register Classes.   (line  253)
* PREFERRED_STACK_BOUNDARY:              Storage Layout.     (line  154)
* prefetch:                              Side Effects.       (line  318)
* prefetch and /v:                       Flags.              (line  214)
* prefetch instruction pattern:          Standard Names.     (line 1562)
* PREFETCH_SCHEDULE_BARRIER_P:           Flags.              (line  214)
* PREINCREMENT_EXPR:                     Unary and Binary Expressions.
                                                             (line    6)
* presence_set:                          Processor pipeline description.
                                                             (line  224)
* preserving SSA form:                   SSA.                (line   76)
* preserving virtual SSA form:           SSA.                (line  184)
* pretend_args_size:                     Function Entry.     (line  112)
* prev_active_insn:                      define_peephole.    (line   60)
* PREV_INSN:                             Insns.              (line   26)
* PRINT_OPERAND:                         Instruction Output. (line   96)
* PRINT_OPERAND_ADDRESS:                 Instruction Output. (line  124)
* PRINT_OPERAND_PUNCT_VALID_P:           Instruction Output. (line  117)
* probe_stack instruction pattern:       Standard Names.     (line 1409)
* probe_stack_address instruction pattern: Standard Names.   (line 1402)
* processor functional units:            Processor pipeline description.
                                                             (line    6)
* processor pipeline description:        Processor pipeline description.
                                                             (line    6)
* product:                               Arithmetic.         (line   92)
* profile feedback:                      Profile information.
                                                             (line   14)
* profile representation:                Profile information.
                                                             (line    6)
* PROFILE_BEFORE_PROLOGUE:               Profiling.          (line   35)
* PROFILE_HOOK:                          Profiling.          (line   23)
* profiling, code generation:            Profiling.          (line    6)
* program counter:                       Regs and Memory.    (line  362)
* prologue:                              Function Entry.     (line    6)
* prologue instruction pattern:          Standard Names.     (line 1500)
* PROMOTE_MODE:                          Storage Layout.     (line   93)
* pseudo registers:                      Regs and Memory.    (line    9)
* PSImode:                               Machine Modes.      (line   32)
* PTRDIFF_TYPE:                          Type Layout.        (line  201)
* purge_dead_edges <1>:                  Maintaining the CFG.
                                                             (line   82)
* purge_dead_edges:                      Edges.              (line  104)
* push address instruction:              Simple Constraints. (line  164)
* PUSH_ARGS:                             Stack Arguments.    (line   18)
* PUSH_ARGS_REVERSED:                    Stack Arguments.    (line   26)
* push_operand:                          Machine-Independent Predicates.
                                                             (line   81)
* push_reload:                           Addressing Modes.   (line  177)
* PUSH_ROUNDING:                         Stack Arguments.    (line   32)
* pushM1 instruction pattern:            Standard Names.     (line  256)
* PUT_CODE:                              RTL Objects.        (line   47)
* PUT_MODE:                              Machine Modes.      (line  283)
* PUT_REG_NOTE_KIND:                     Insns.              (line  357)
* PUT_SDB_:                              SDB and DWARF.      (line  106)
* QCmode:                                Machine Modes.      (line  197)
* QFmode:                                Machine Modes.      (line   54)
* QImode:                                Machine Modes.      (line   25)
* QImode, in insn:                       Insns.              (line  278)
* QQmode:                                Machine Modes.      (line  103)
* qualified type <1>:                    Types for C++.      (line    6)
* qualified type:                        Types.              (line    6)
* querying function unit reservations:   Processor pipeline description.
                                                             (line   90)
* question mark:                         Multi-Alternative.  (line   41)
* quotient:                              Arithmetic.         (line  116)
* r in constraint:                       Simple Constraints. (line   66)
* RDIV_EXPR:                             Unary and Binary Expressions.
                                                             (line    6)
* READONLY_DATA_SECTION_ASM_OP:          Sections.           (line   63)
* real operands:                         SSA Operands.       (line    6)
* REAL_ARITHMETIC:                       Floating Point.     (line   66)
* REAL_CST:                              Constant expressions.
                                                             (line    6)
* REAL_LIBGCC_SPEC:                      Driver.             (line  125)
* REAL_NM_FILE_NAME:                     Macros for Initialization.
                                                             (line  106)
* REAL_TYPE:                             Types.              (line    6)
* REAL_VALUE_ABS:                        Floating Point.     (line   82)
* REAL_VALUE_ATOF:                       Floating Point.     (line   50)
* REAL_VALUE_FIX:                        Floating Point.     (line   41)
* REAL_VALUE_FROM_INT:                   Floating Point.     (line   92)
* REAL_VALUE_ISINF:                      Floating Point.     (line   59)
* REAL_VALUE_ISNAN:                      Floating Point.     (line   62)
* REAL_VALUE_NEGATE:                     Floating Point.     (line   79)
* REAL_VALUE_NEGATIVE:                   Floating Point.     (line   56)
* REAL_VALUE_TO_INT:                     Floating Point.     (line   86)
* REAL_VALUE_TO_TARGET_DECIMAL128:       Data Output.        (line  145)
* REAL_VALUE_TO_TARGET_DECIMAL32:        Data Output.        (line  143)
* REAL_VALUE_TO_TARGET_DECIMAL64:        Data Output.        (line  144)
* REAL_VALUE_TO_TARGET_DOUBLE:           Data Output.        (line  141)
* REAL_VALUE_TO_TARGET_LONG_DOUBLE:      Data Output.        (line  142)
* REAL_VALUE_TO_TARGET_SINGLE:           Data Output.        (line  140)
* REAL_VALUE_TYPE:                       Floating Point.     (line   26)
* REAL_VALUE_UNSIGNED_FIX:               Floating Point.     (line   45)
* REAL_VALUES_EQUAL:                     Floating Point.     (line   32)
* REAL_VALUES_LESS:                      Floating Point.     (line   38)
* REALPART_EXPR:                         Unary and Binary Expressions.
                                                             (line    6)
* recog_data.operand:                    Instruction Output. (line   54)
* recognizing insns:                     RTL Template.       (line    6)
* RECORD_TYPE <1>:                       Classes.            (line    6)
* RECORD_TYPE:                           Types.              (line    6)
* redirect_edge_and_branch:              Profile information.
                                                             (line   71)
* redirect_edge_and_branch, redirect_jump: Maintaining the CFG.
                                                             (line   92)
* reduc_smax_M instruction pattern:      Standard Names.     (line  310)
* reduc_smin_M instruction pattern:      Standard Names.     (line  310)
* reduc_splus_M instruction pattern:     Standard Names.     (line  322)
* reduc_umax_M instruction pattern:      Standard Names.     (line  316)
* reduc_umin_M instruction pattern:      Standard Names.     (line  316)
* reduc_uplus_M instruction pattern:     Standard Names.     (line  328)
* reference:                             Types.              (line    6)
* REFERENCE_TYPE:                        Types.              (line    6)
* reg:                                   Regs and Memory.    (line    9)
* reg and /f:                            Flags.              (line   94)
* reg and /i:                            Flags.              (line   89)
* reg and /v:                            Flags.              (line   98)
* reg, RTL sharing:                      Sharing.            (line   17)
* REG_ALLOC_ORDER:                       Allocation Order.   (line    9)
* REG_BR_PRED:                           Insns.              (line  538)
* REG_BR_PROB:                           Insns.              (line  532)
* REG_BR_PROB_BASE, BB_FREQ_BASE, count: Profile information.
                                                             (line   82)
* REG_BR_PROB_BASE, EDGE_FREQUENCY:      Profile information.
                                                             (line   52)
* REG_CC_SETTER:                         Insns.              (line  503)
* REG_CC_USER:                           Insns.              (line  503)
* REG_CLASS_CONTENTS:                    Register Classes.   (line   93)
* reg_class_contents:                    Register Basics.    (line   59)
* REG_CLASS_FROM_CONSTRAINT:             Old Constraints.    (line   35)
* REG_CLASS_FROM_LETTER:                 Old Constraints.    (line   27)
* REG_CLASS_NAMES:                       Register Classes.   (line   88)
* REG_CROSSING_JUMP:                     Insns.              (line  416)
* REG_DEAD:                              Insns.              (line  368)
* REG_DEAD, REG_UNUSED:                  Liveness information.
                                                             (line   32)
* REG_DEP_ANTI:                          Insns.              (line  525)
* REG_DEP_OUTPUT:                        Insns.              (line  521)
* REG_DEP_TRUE:                          Insns.              (line  518)
* REG_EH_REGION, EDGE_ABNORMAL_CALL:     Edges.              (line  110)
* REG_EQUAL:                             Insns.              (line  431)
* REG_EQUIV:                             Insns.              (line  431)
* REG_EXPR:                              Special Accessors.  (line   60)
* REG_FRAME_RELATED_EXPR:                Insns.              (line  544)
* REG_FUNCTION_VALUE_P:                  Flags.              (line   89)
* REG_INC:                               Insns.              (line  384)
* reg_label and /v:                      Flags.              (line   65)
* REG_LABEL_OPERAND:                     Insns.              (line  398)
* REG_LABEL_TARGET:                      Insns.              (line  407)
* reg_names <1>:                         Instruction Output. (line  108)
* reg_names:                             Register Basics.    (line   59)
* REG_NONNEG:                            Insns.              (line  390)
* REG_NOTE_KIND:                         Insns.              (line  357)
* REG_NOTES:                             Insns.              (line  331)
* REG_OFFSET:                            Special Accessors.  (line   64)
* REG_OK_STRICT:                         Addressing Modes.   (line  100)
* REG_PARM_STACK_SPACE:                  Stack Arguments.    (line   59)
* REG_PARM_STACK_SPACE, and TARGET_FUNCTION_ARG: Register Arguments.
                                                             (line   51)
* REG_POINTER:                           Flags.              (line   94)
* REG_SETJMP:                            Insns.              (line  425)
* REG_UNUSED:                            Insns.              (line  377)
* REG_USERVAR_P:                         Flags.              (line   98)
* REG_VALUE_IN_UNWIND_CONTEXT:           Frame Registers.    (line  157)
* REG_WORDS_BIG_ENDIAN:                  Storage Layout.     (line   36)
* regclass_for_constraint:               C Constraint Interface.
                                                             (line   60)
* register allocation order:             Allocation Order.   (line    6)
* register class definitions:            Register Classes.   (line    6)
* register class preference constraints: Class Preferences.  (line    6)
* register pairs:                        Values in Registers.
                                                             (line   69)
* Register Transfer Language (RTL):      RTL.                (line    6)
* register usage:                        Registers.          (line    6)
* REGISTER_MOVE_COST:                    Costs.              (line   10)
* REGISTER_NAMES:                        Instruction Output. (line    9)
* register_operand:                      Machine-Independent Predicates.
                                                             (line   30)
* REGISTER_PREFIX:                       Instruction Output. (line  152)
* REGISTER_TARGET_PRAGMAS:               Misc.               (line  380)
* registers arguments:                   Register Arguments. (line    6)
* registers in constraints:              Simple Constraints. (line   66)
* REGMODE_NATURAL_SIZE:                  Values in Registers.
                                                             (line   50)
* REGNO_MODE_CODE_OK_FOR_BASE_P:         Register Classes.   (line  176)
* REGNO_MODE_OK_FOR_BASE_P:              Register Classes.   (line  153)
* REGNO_MODE_OK_FOR_REG_BASE_P:          Register Classes.   (line  163)
* REGNO_OK_FOR_BASE_P:                   Register Classes.   (line  149)
* REGNO_OK_FOR_INDEX_P:                  Register Classes.   (line  190)
* REGNO_REG_CLASS:                       Register Classes.   (line  108)
* regs_ever_live:                        Function Entry.     (line   21)
* regular expressions:                   Processor pipeline description.
                                                             (line    6)
* relative costs:                        Costs.              (line    6)
* RELATIVE_PREFIX_NOT_LINKDIR:           Driver.             (line  263)
* reload_completed:                      Standard Names.     (line 1187)
* reload_in instruction pattern:         Standard Names.     (line   99)
* reload_in_progress:                    Standard Names.     (line   57)
* reload_out instruction pattern:        Standard Names.     (line   99)
* reloading:                             RTL passes.         (line  183)
* remainder:                             Arithmetic.         (line  136)
* remainderM3 instruction pattern:       Standard Names.     (line  555)
* reorder:                               GTY Options.        (line  210)
* representation of RTL:                 RTL.                (line    6)
* reservation delays:                    Processor pipeline description.
                                                             (line    6)
* rest_of_decl_compilation:              Parsing pass.       (line   52)
* rest_of_type_compilation:              Parsing pass.       (line   52)
* restore_stack_block instruction pattern: Standard Names.   (line 1322)
* restore_stack_function instruction pattern: Standard Names.
                                                             (line 1322)
* restore_stack_nonlocal instruction pattern: Standard Names.
                                                             (line 1322)
* RESULT_DECL:                           Declarations.       (line    6)
* return:                                Side Effects.       (line   72)
* return instruction pattern:            Standard Names.     (line 1160)
* return values in registers:            Scalar Return.      (line    6)
* RETURN_ADDR_IN_PREVIOUS_FRAME:         Frame Layout.       (line  135)
* RETURN_ADDR_OFFSET:                    Exception Handling. (line   60)
* RETURN_ADDR_RTX:                       Frame Layout.       (line  124)
* RETURN_ADDRESS_POINTER_REGNUM:         Frame Registers.    (line   65)
* RETURN_EXPR:                           Statements for C++. (line    6)
* RETURN_STMT:                           Statements for C++. (line    6)
* return_val:                            Flags.              (line  274)
* return_val, in call_insn:              Flags.              (line   24)
* return_val, in reg:                    Flags.              (line   89)
* return_val, in symbol_ref:             Flags.              (line  202)
* returning aggregate values:            Aggregate Return.   (line    6)
* returning structures and unions:       Interface.          (line   10)
* reverse probability:                   Profile information.
                                                             (line   66)
* REVERSE_CONDITION:                     MODE_CC Condition Codes.
                                                             (line   92)
* REVERSIBLE_CC_MODE:                    MODE_CC Condition Codes.
                                                             (line   78)
* right rotate:                          Arithmetic.         (line  195)
* right shift:                           Arithmetic.         (line  190)
* rintM2 instruction pattern:            Standard Names.     (line  668)
* RISC:                                  Processor pipeline description.
                                                             (line    6)
* roots, marking:                        GGC Roots.          (line    6)
* rotate:                                Arithmetic.         (line  195)
* rotatert:                              Arithmetic.         (line  195)
* rotlM3 instruction pattern:            Standard Names.     (line  520)
* rotrM3 instruction pattern:            Standard Names.     (line  520)
* ROUND_DIV_EXPR:                        Unary and Binary Expressions.
                                                             (line    6)
* ROUND_MOD_EXPR:                        Unary and Binary Expressions.
                                                             (line    6)
* ROUND_TOWARDS_ZERO:                    Storage Layout.     (line  477)
* ROUND_TYPE_ALIGN:                      Storage Layout.     (line  424)
* roundM2 instruction pattern:           Standard Names.     (line  644)
* RSHIFT_EXPR:                           Unary and Binary Expressions.
                                                             (line    6)
* RTL addition:                          Arithmetic.         (line   14)
* RTL addition with signed saturation:   Arithmetic.         (line   14)
* RTL addition with unsigned saturation: Arithmetic.         (line   14)
* RTL classes:                           RTL Classes.        (line    6)
* RTL comparison:                        Arithmetic.         (line   43)
* RTL comparison operations:             Comparisons.        (line    6)
* RTL constant expression types:         Constants.          (line    6)
* RTL constants:                         Constants.          (line    6)
* RTL declarations:                      RTL Declarations.   (line    6)
* RTL difference:                        Arithmetic.         (line   36)
* RTL expression:                        RTL Objects.        (line    6)
* RTL expressions for arithmetic:        Arithmetic.         (line    6)
* RTL format:                            RTL Classes.        (line   72)
* RTL format characters:                 RTL Classes.        (line   77)
* RTL function-call insns:               Calls.              (line    6)
* RTL insn template:                     RTL Template.       (line    6)
* RTL integers:                          RTL Objects.        (line    6)
* RTL memory expressions:                Regs and Memory.    (line    6)
* RTL object types:                      RTL Objects.        (line    6)
* RTL postdecrement:                     Incdec.             (line    6)
* RTL postincrement:                     Incdec.             (line    6)
* RTL predecrement:                      Incdec.             (line    6)
* RTL preincrement:                      Incdec.             (line    6)
* RTL register expressions:              Regs and Memory.    (line    6)
* RTL representation:                    RTL.                (line    6)
* RTL side effect expressions:           Side Effects.       (line    6)
* RTL strings:                           RTL Objects.        (line    6)
* RTL structure sharing assumptions:     Sharing.            (line    6)
* RTL subtraction:                       Arithmetic.         (line   36)
* RTL subtraction with signed saturation: Arithmetic.        (line   36)
* RTL subtraction with unsigned saturation: Arithmetic.      (line   36)
* RTL sum:                               Arithmetic.         (line   14)
* RTL vectors:                           RTL Objects.        (line    6)
* RTL_CONST_CALL_P:                      Flags.              (line   19)
* RTL_CONST_OR_PURE_CALL_P:              Flags.              (line   29)
* RTL_LOOPING_CONST_OR_PURE_CALL_P:      Flags.              (line   33)
* RTL_PURE_CALL_P:                       Flags.              (line   24)
* RTX (See RTL):                         RTL Objects.        (line    6)
* RTX codes, classes of:                 RTL Classes.        (line    6)
* RTX_FRAME_RELATED_P:                   Flags.              (line  107)
* run-time conventions:                  Interface.          (line    6)
* run-time target specification:         Run-time Target.    (line    6)
* s in constraint:                       Simple Constraints. (line  102)
* same_type_p:                           Types.              (line   88)
* SAmode:                                Machine Modes.      (line  148)
* sat_fract:                             Conversions.        (line   90)
* satfractMN2 instruction pattern:       Standard Names.     (line  925)
* satfractunsMN2 instruction pattern:    Standard Names.     (line  938)
* satisfies_constraint_:                 C Constraint Interface.
                                                             (line   47)
* SAVE_EXPR:                             Unary and Binary Expressions.
                                                             (line    6)
* save_stack_block instruction pattern:  Standard Names.     (line 1322)
* save_stack_function instruction pattern: Standard Names.   (line 1322)
* save_stack_nonlocal instruction pattern: Standard Names.   (line 1322)
* SBSS_SECTION_ASM_OP:                   Sections.           (line   76)
* Scalar evolutions:                     Scalar evolutions.  (line    6)
* scalars, returned as values:           Scalar Return.      (line    6)
* SCHED_GROUP_P:                         Flags.              (line  148)
* SCmode:                                Machine Modes.      (line  197)
* scratch:                               Regs and Memory.    (line  298)
* scratch operands:                      Regs and Memory.    (line  298)
* scratch, RTL sharing:                  Sharing.            (line   35)
* scratch_operand:                       Machine-Independent Predicates.
                                                             (line   50)
* SDATA_SECTION_ASM_OP:                  Sections.           (line   58)
* SDB_ALLOW_FORWARD_REFERENCES:          SDB and DWARF.      (line  124)
* SDB_ALLOW_UNKNOWN_REFERENCES:          SDB and DWARF.      (line  119)
* SDB_DEBUGGING_INFO:                    SDB and DWARF.      (line    9)
* SDB_DELIM:                             SDB and DWARF.      (line  112)
* SDB_OUTPUT_SOURCE_LINE:                SDB and DWARF.      (line  129)
* SDmode:                                Machine Modes.      (line   85)
* sdot_prodM instruction pattern:        Standard Names.     (line  334)
* search options:                        Including Patterns. (line   44)
* SECONDARY_INPUT_RELOAD_CLASS:          Register Classes.   (line  396)
* SECONDARY_MEMORY_NEEDED:               Register Classes.   (line  452)
* SECONDARY_MEMORY_NEEDED_MODE:          Register Classes.   (line  471)
* SECONDARY_MEMORY_NEEDED_RTX:           Register Classes.   (line  462)
* SECONDARY_OUTPUT_RELOAD_CLASS:         Register Classes.   (line  397)
* SECONDARY_RELOAD_CLASS:                Register Classes.   (line  395)
* SELECT_CC_MODE:                        MODE_CC Condition Codes.
                                                             (line    7)
* sequence:                              Side Effects.       (line  260)
* Sequence iterators:                    Sequence iterators. (line    6)
* set:                                   Side Effects.       (line   15)
* set and /f:                            Flags.              (line  107)
* SET_ASM_OP:                            Label Output.       (line  419)
* set_attr:                              Tagging Insns.      (line   31)
* set_attr_alternative:                  Tagging Insns.      (line   49)
* set_bb_seq:                            GIMPLE sequences.   (line   76)
* SET_BY_PIECES_P:                       Costs.              (line  206)
* SET_DEST:                              Side Effects.       (line   69)
* SET_IS_RETURN_P:                       Flags.              (line  157)
* SET_LABEL_KIND:                        Insns.              (line  146)
* set_optab_libfunc:                     Library Calls.      (line   15)
* SET_RATIO:                             Costs.              (line  194)
* SET_SRC:                               Side Effects.       (line   69)
* set_thread_pointerMODE instruction pattern: Standard Names.
                                                             (line 1856)
* SET_TYPE_STRUCTURAL_EQUALITY:          Types.              (line    6)
* setmemM instruction pattern:           Standard Names.     (line  793)
* SETUP_FRAME_ADDRESSES:                 Frame Layout.       (line  102)
* SF_SIZE:                               Type Layout.        (line  136)
* SFmode:                                Machine Modes.      (line   66)
* sharing of RTL components:             Sharing.            (line    6)
* shift:                                 Arithmetic.         (line  173)
* SHIFT_COUNT_TRUNCATED:                 Misc.               (line  113)
* SHLIB_SUFFIX:                          Macros for Initialization.
                                                             (line  135)
* SHORT_ACCUM_TYPE_SIZE:                 Type Layout.        (line   83)
* SHORT_FRACT_TYPE_SIZE:                 Type Layout.        (line   63)
* SHORT_IMMEDIATES_SIGN_EXTEND:          Misc.               (line   87)
* SHORT_TYPE_SIZE:                       Type Layout.        (line   16)
* sibcall_epilogue instruction pattern:  Standard Names.     (line 1532)
* sibling call:                          Edges.              (line  122)
* SIBLING_CALL_P:                        Flags.              (line  161)
* SIG_ATOMIC_TYPE:                       Type Layout.        (line  252)
* sign_extend:                           Conversions.        (line   23)
* sign_extract:                          Bit-Fields.         (line    8)
* sign_extract, canonicalization of:     Insn Canonicalizations.
                                                             (line   88)
* signed division:                       Arithmetic.         (line  116)
* signed division with signed saturation: Arithmetic.        (line  116)
* signed maximum:                        Arithmetic.         (line  141)
* signed minimum:                        Arithmetic.         (line  141)
* SImode:                                Machine Modes.      (line   37)
* simple constraints:                    Simple Constraints. (line    6)
* simple_return:                         Side Effects.       (line   86)
* simple_return instruction pattern:     Standard Names.     (line 1176)
* sincos math function, implicit usage:  Library Calls.      (line   78)
* sincosM3 instruction pattern:          Standard Names.     (line  580)
* sinM2 instruction pattern:             Standard Names.     (line  572)
* SIZE_ASM_OP:                           Label Output.       (line   35)
* SIZE_TYPE:                             Type Layout.        (line  175)
* SIZETYPE:                              Type Layout.        (line  191)
* skip:                                  GTY Options.        (line   77)
* SLOW_BYTE_ACCESS:                      Costs.              (line  118)
* SLOW_UNALIGNED_ACCESS:                 Costs.              (line  133)
* smax:                                  Arithmetic.         (line  141)
* smin:                                  Arithmetic.         (line  141)
* sms, swing, software pipelining:       RTL passes.         (line  132)
* smulM3_highpart instruction pattern:   Standard Names.     (line  435)
* soft float library:                    Soft float library routines.
                                                             (line    6)
* special:                               GTY Options.        (line  295)
* special predicates:                    Predicates.         (line   31)
* SPECS:                                 Target Fragment.    (line  191)
* speed of instructions:                 Costs.              (line    6)
* split_block:                           Maintaining the CFG.
                                                             (line   99)
* splitting instructions:                Insn Splitting.     (line    6)
* SQmode:                                Machine Modes.      (line  111)
* sqrt:                                  Arithmetic.         (line  207)
* sqrtM2 instruction pattern:            Standard Names.     (line  538)
* square root:                           Arithmetic.         (line  207)
* ss_abs:                                Arithmetic.         (line  200)
* ss_ashift:                             Arithmetic.         (line  173)
* ss_div:                                Arithmetic.         (line  116)
* ss_minus:                              Arithmetic.         (line   36)
* ss_mult:                               Arithmetic.         (line   92)
* ss_neg:                                Arithmetic.         (line   81)
* ss_plus:                               Arithmetic.         (line   14)
* ss_truncate:                           Conversions.        (line   43)
* SSA:                                   SSA.                (line    6)
* SSA_NAME_DEF_STMT:                     SSA.                (line  219)
* SSA_NAME_VERSION:                      SSA.                (line  224)
* ssaddM3 instruction pattern:           Standard Names.     (line  269)
* ssashlM3 instruction pattern:          Standard Names.     (line  510)
* ssdivM3 instruction pattern:           Standard Names.     (line  269)
* ssmaddMN4 instruction pattern:         Standard Names.     (line  458)
* ssmsubMN4 instruction pattern:         Standard Names.     (line  482)
* ssmulM3 instruction pattern:           Standard Names.     (line  269)
* ssnegM2 instruction pattern:           Standard Names.     (line  532)
* sssubM3 instruction pattern:           Standard Names.     (line  269)
* ssum_widenM3 instruction pattern:      Standard Names.     (line  344)
* stack arguments:                       Stack Arguments.    (line    6)
* stack frame layout:                    Frame Layout.       (line    6)
* stack smashing protection:             Stack Smashing Protection.
                                                             (line    6)
* STACK_ALIGNMENT_NEEDED:                Frame Layout.       (line   48)
* STACK_BOUNDARY:                        Storage Layout.     (line  146)
* STACK_CHECK_BUILTIN:                   Stack Checking.     (line   32)
* STACK_CHECK_FIXED_FRAME_SIZE:          Stack Checking.     (line   83)
* STACK_CHECK_MAX_FRAME_SIZE:            Stack Checking.     (line   74)
* STACK_CHECK_MAX_VAR_SIZE:              Stack Checking.     (line   90)
* STACK_CHECK_MOVING_SP:                 Stack Checking.     (line   54)
* STACK_CHECK_PROBE_INTERVAL_EXP:        Stack Checking.     (line   46)
* STACK_CHECK_PROTECT:                   Stack Checking.     (line   63)
* STACK_CHECK_STATIC_BUILTIN:            Stack Checking.     (line   39)
* STACK_DYNAMIC_OFFSET:                  Frame Layout.       (line   75)
* STACK_DYNAMIC_OFFSET and virtual registers: Regs and Memory.
                                                             (line   83)
* STACK_GROWS_DOWNWARD:                  Frame Layout.       (line    9)
* STACK_PARMS_IN_REG_PARM_AREA:          Stack Arguments.    (line   84)
* STACK_POINTER_OFFSET:                  Frame Layout.       (line   58)
* STACK_POINTER_OFFSET and virtual registers: Regs and Memory.
                                                             (line   93)
* STACK_POINTER_REGNUM:                  Frame Registers.    (line    9)
* STACK_POINTER_REGNUM and virtual registers: Regs and Memory.
                                                             (line   83)
* stack_pointer_rtx:                     Frame Registers.    (line  104)
* stack_protect_set instruction pattern: Standard Names.     (line 1866)
* stack_protect_test instruction pattern: Standard Names.    (line 1876)
* STACK_PUSH_CODE:                       Frame Layout.       (line   17)
* STACK_REG_COVER_CLASS:                 Stack Registers.    (line   23)
* STACK_REGS:                            Stack Registers.    (line   20)
* STACK_SAVEAREA_MODE:                   Storage Layout.     (line  440)
* STACK_SIZE_MODE:                       Storage Layout.     (line  452)
* STACK_SLOT_ALIGNMENT:                  Storage Layout.     (line  271)
* standard pattern names:                Standard Names.     (line    6)
* STANDARD_STARTFILE_PREFIX:             Driver.             (line  275)
* STANDARD_STARTFILE_PREFIX_1:           Driver.             (line  282)
* STANDARD_STARTFILE_PREFIX_2:           Driver.             (line  289)
* STARTFILE_SPEC:                        Driver.             (line  148)
* STARTING_FRAME_OFFSET:                 Frame Layout.       (line   39)
* STARTING_FRAME_OFFSET and virtual registers: Regs and Memory.
                                                             (line   74)
* Statement and operand traversals:      Statement and operand traversals.
                                                             (line    6)
* Statement Sequences:                   Statement Sequences.
                                                             (line    6)
* statements <1>:                        Statements for C++. (line    6)
* statements:                            Function Properties.
                                                             (line    6)
* Statements:                            Statements.         (line    6)
* Static profile estimation:             Profile information.
                                                             (line   24)
* static single assignment:              SSA.                (line    6)
* STATIC_CHAIN_INCOMING_REGNUM:          Frame Registers.    (line   78)
* STATIC_CHAIN_REGNUM:                   Frame Registers.    (line   77)
* stdarg.h and register arguments:       Register Arguments. (line   45)
* STDC_0_IN_SYSTEM_HEADERS:              Misc.               (line  351)
* STMT_EXPR:                             Unary and Binary Expressions.
                                                             (line    6)
* STMT_IS_FULL_EXPR_P:                   Statements for C++. (line   22)
* storage layout:                        Storage Layout.     (line    6)
* STORE_BY_PIECES_P:                     Costs.              (line  213)
* STORE_FLAG_VALUE:                      Misc.               (line  202)
* store_multiple instruction pattern:    Standard Names.     (line  160)
* strcpy:                                Storage Layout.     (line  231)
* STRICT_ALIGNMENT:                      Storage Layout.     (line  321)
* strict_low_part:                       RTL Declarations.   (line    9)
* strict_memory_address_p:               Addressing Modes.   (line  187)
* STRING_CST:                            Constant expressions.
                                                             (line    6)
* STRING_POOL_ADDRESS_P:                 Flags.              (line  165)
* strlenM instruction pattern:           Standard Names.     (line  860)
* structure value address:               Aggregate Return.   (line    6)
* STRUCTURE_SIZE_BOUNDARY:               Storage Layout.     (line  313)
* structures, returning:                 Interface.          (line   10)
* subM3 instruction pattern:             Standard Names.     (line  269)
* SUBOBJECT:                             Statements for C++. (line    6)
* SUBOBJECT_CLEANUP:                     Statements for C++. (line    6)
* subreg:                                Regs and Memory.    (line   97)
* subreg and /s:                         Flags.              (line  187)
* subreg and /u:                         Flags.              (line  180)
* subreg and /u and /v:                  Flags.              (line  170)
* subreg, in strict_low_part:            RTL Declarations.   (line    9)
* SUBREG_BYTE:                           Regs and Memory.    (line  289)
* SUBREG_PROMOTED_UNSIGNED_P:            Flags.              (line  170)
* SUBREG_PROMOTED_UNSIGNED_SET:          Flags.              (line  180)
* SUBREG_PROMOTED_VAR_P:                 Flags.              (line  187)
* SUBREG_REG:                            Regs and Memory.    (line  289)
* subst iterators in .md files:          Subst Iterators.    (line    6)
* SUCCESS_EXIT_CODE:                     Host Misc.          (line   12)
* SUPPORTS_INIT_PRIORITY:                Macros for Initialization.
                                                             (line   58)
* SUPPORTS_ONE_ONLY:                     Label Output.       (line  259)
* SUPPORTS_WEAK:                         Label Output.       (line  233)
* SWITCH_BODY:                           Statements for C++. (line    6)
* SWITCH_COND:                           Statements for C++. (line    6)
* SWITCH_STMT:                           Statements for C++. (line    6)
* SWITCHABLE_TARGET:                     Run-time Target.    (line  165)
* SYMBOL_FLAG_ANCHOR:                    Special Accessors.  (line  120)
* SYMBOL_FLAG_EXTERNAL:                  Special Accessors.  (line  102)
* SYMBOL_FLAG_FUNCTION:                  Special Accessors.  (line   95)
* SYMBOL_FLAG_HAS_BLOCK_INFO:            Special Accessors.  (line  116)
* SYMBOL_FLAG_LOCAL:                     Special Accessors.  (line   98)
* SYMBOL_FLAG_SMALL:                     Special Accessors.  (line  107)
* SYMBOL_FLAG_TLS_SHIFT:                 Special Accessors.  (line  111)
* symbol_ref:                            Constants.          (line   87)
* symbol_ref and /f:                     Flags.              (line  165)
* symbol_ref and /i:                     Flags.              (line  202)
* symbol_ref and /u:                     Flags.              (line   10)
* symbol_ref and /v:                     Flags.              (line  206)
* symbol_ref, RTL sharing:               Sharing.            (line   20)
* SYMBOL_REF_ANCHOR_P:                   Special Accessors.  (line  120)
* SYMBOL_REF_BLOCK:                      Special Accessors.  (line  133)
* SYMBOL_REF_BLOCK_OFFSET:               Special Accessors.  (line  138)
* SYMBOL_REF_CONSTANT:                   Special Accessors.  (line   81)
* SYMBOL_REF_DATA:                       Special Accessors.  (line   85)
* SYMBOL_REF_DECL:                       Special Accessors.  (line   69)
* SYMBOL_REF_EXTERNAL_P:                 Special Accessors.  (line  102)
* SYMBOL_REF_FLAG:                       Flags.              (line  206)
* SYMBOL_REF_FLAG, in TARGET_ENCODE_SECTION_INFO: Sections.  (line  277)
* SYMBOL_REF_FLAGS:                      Special Accessors.  (line   89)
* SYMBOL_REF_FUNCTION_P:                 Special Accessors.  (line   95)
* SYMBOL_REF_HAS_BLOCK_INFO_P:           Special Accessors.  (line  116)
* SYMBOL_REF_LOCAL_P:                    Special Accessors.  (line   98)
* SYMBOL_REF_SMALL_P:                    Special Accessors.  (line  107)
* SYMBOL_REF_TLS_MODEL:                  Special Accessors.  (line  111)
* SYMBOL_REF_USED:                       Flags.              (line  197)
* SYMBOL_REF_WEAK:                       Flags.              (line  202)
* symbolic label:                        Sharing.            (line   20)
* sync_addMODE instruction pattern:      Standard Names.     (line 1631)
* sync_andMODE instruction pattern:      Standard Names.     (line 1631)
* sync_compare_and_swapMODE instruction pattern: Standard Names.
                                                             (line 1591)
* sync_iorMODE instruction pattern:      Standard Names.     (line 1631)
* sync_lock_releaseMODE instruction pattern: Standard Names. (line 1696)
* sync_lock_test_and_setMODE instruction pattern: Standard Names.
                                                             (line 1670)
* sync_nandMODE instruction pattern:     Standard Names.     (line 1631)
* sync_new_addMODE instruction pattern:  Standard Names.     (line 1663)
* sync_new_andMODE instruction pattern:  Standard Names.     (line 1663)
* sync_new_iorMODE instruction pattern:  Standard Names.     (line 1663)
* sync_new_nandMODE instruction pattern: Standard Names.     (line 1663)
* sync_new_subMODE instruction pattern:  Standard Names.     (line 1663)
* sync_new_xorMODE instruction pattern:  Standard Names.     (line 1663)
* sync_old_addMODE instruction pattern:  Standard Names.     (line 1646)
* sync_old_andMODE instruction pattern:  Standard Names.     (line 1646)
* sync_old_iorMODE instruction pattern:  Standard Names.     (line 1646)
* sync_old_nandMODE instruction pattern: Standard Names.     (line 1646)
* sync_old_subMODE instruction pattern:  Standard Names.     (line 1646)
* sync_old_xorMODE instruction pattern:  Standard Names.     (line 1646)
* sync_subMODE instruction pattern:      Standard Names.     (line 1631)
* sync_xorMODE instruction pattern:      Standard Names.     (line 1631)
* SYSROOT_HEADERS_SUFFIX_SPEC:           Driver.             (line  177)
* SYSROOT_SUFFIX_SPEC:                   Driver.             (line  172)
* t-TARGET:                              Target Fragment.    (line    6)
* table jump:                            Basic Blocks.       (line   67)
* tablejump instruction pattern:         Standard Names.     (line 1249)
* tag:                                   GTY Options.        (line   82)
* tagging insns:                         Tagging Insns.      (line    6)
* tail calls:                            Tail Calls.         (line    6)
* TAmode:                                Machine Modes.      (line  156)
* target attributes:                     Target Attributes.  (line    6)
* target description macros:             Target Macros.      (line    6)
* target functions:                      Target Structure.   (line    6)
* target hooks:                          Target Structure.   (line    6)
* target makefile fragment:              Target Fragment.    (line    6)
* target specifications:                 Run-time Target.    (line    6)
* TARGET_ADDR_SPACE_ADDRESS_MODE:        Named Address Spaces.
                                                             (line   45)
* TARGET_ADDR_SPACE_CONVERT:             Named Address Spaces.
                                                             (line   88)
* TARGET_ADDR_SPACE_LEGITIMATE_ADDRESS_P: Named Address Spaces.
                                                             (line   63)
* TARGET_ADDR_SPACE_LEGITIMIZE_ADDRESS:  Named Address Spaces.
                                                             (line   72)
* TARGET_ADDR_SPACE_POINTER_MODE:        Named Address Spaces.
                                                             (line   38)
* TARGET_ADDR_SPACE_SUBSET_P:            Named Address Spaces.
                                                             (line   79)
* TARGET_ADDR_SPACE_VALID_POINTER_MODE:  Named Address Spaces.
                                                             (line   52)
* TARGET_ADDRESS_COST:                   Costs.              (line  302)
* TARGET_ALIGN_ANON_BITFIELD:            Storage Layout.     (line  398)
* TARGET_ALLOCATE_INITIAL_VALUE:         Misc.               (line  700)
* TARGET_ALLOCATE_STACK_SLOTS_FOR_ARGS:  Misc.               (line  980)
* TARGET_ALWAYS_STRIP_DOTDOT:            Driver.             (line  247)
* TARGET_ARG_PARTIAL_BYTES:              Register Arguments. (line   84)
* TARGET_ARM_EABI_UNWINDER:              Exception Region Output.
                                                             (line  129)
* TARGET_ARRAY_MODE_SUPPORTED_P:         Register Arguments. (line  337)
* TARGET_ASAN_SHADOW_OFFSET:             Misc.               (line 1008)
* TARGET_ASM_ALIGNED_DI_OP:              Data Output.        (line   10)
* TARGET_ASM_ALIGNED_HI_OP:              Data Output.        (line    8)
* TARGET_ASM_ALIGNED_SI_OP:              Data Output.        (line    9)
* TARGET_ASM_ALIGNED_TI_OP:              Data Output.        (line   11)
* TARGET_ASM_ASSEMBLE_VISIBILITY:        Label Output.       (line  271)
* TARGET_ASM_BYTE_OP:                    Data Output.        (line    7)
* TARGET_ASM_CAN_OUTPUT_MI_THUNK:        Function Entry.     (line  207)
* TARGET_ASM_CLOSE_PAREN:                Data Output.        (line  131)
* TARGET_ASM_CODE_END:                   File Framework.     (line   59)
* TARGET_ASM_CONSTRUCTOR:                Macros for Initialization.
                                                             (line   69)
* TARGET_ASM_DECLARE_CONSTANT_NAME:      Label Output.       (line  154)
* TARGET_ASM_DESTRUCTOR:                 Macros for Initialization.
                                                             (line   83)
* TARGET_ASM_EMIT_EXCEPT_PERSONALITY:    Dispatch Tables.    (line   82)
* TARGET_ASM_EMIT_EXCEPT_TABLE_LABEL:    Dispatch Tables.    (line   74)
* TARGET_ASM_EMIT_UNWIND_LABEL:          Dispatch Tables.    (line   63)
* TARGET_ASM_EXTERNAL_LIBCALL:           Label Output.       (line  306)
* TARGET_ASM_FILE_END:                   File Framework.     (line   37)
* TARGET_ASM_FILE_START:                 File Framework.     (line    9)
* TARGET_ASM_FILE_START_APP_OFF:         File Framework.     (line   17)
* TARGET_ASM_FILE_START_FILE_DIRECTIVE:  File Framework.     (line   31)
* TARGET_ASM_FINAL_POSTSCAN_INSN:        Instruction Output. (line   84)
* TARGET_ASM_FUNCTION_BEGIN_EPILOGUE:    Function Entry.     (line   61)
* TARGET_ASM_FUNCTION_END_PROLOGUE:      Function Entry.     (line   55)
* TARGET_ASM_FUNCTION_EPILOGUE:          Function Entry.     (line   68)
* TARGET_ASM_FUNCTION_PROLOGUE:          Function Entry.     (line   11)
* TARGET_ASM_FUNCTION_RODATA_SECTION:    Sections.           (line  215)
* TARGET_ASM_FUNCTION_SECTION:           File Framework.     (line  124)
* TARGET_ASM_FUNCTION_SWITCHED_TEXT_SECTIONS: File Framework.
                                                             (line  134)
* TARGET_ASM_GLOBALIZE_DECL_NAME:        Label Output.       (line  199)
* TARGET_ASM_GLOBALIZE_LABEL:            Label Output.       (line  190)
* TARGET_ASM_INIT_SECTIONS:              Sections.           (line  160)
* TARGET_ASM_INTEGER:                    Data Output.        (line   27)
* TARGET_ASM_INTERNAL_LABEL:             Label Output.       (line  350)
* TARGET_ASM_JUMP_ALIGN_MAX_SKIP:        Alignment Output.   (line   22)
* TARGET_ASM_LABEL_ALIGN_AFTER_BARRIER_MAX_SKIP: Alignment Output.
                                                             (line   36)
* TARGET_ASM_LABEL_ALIGN_MAX_SKIP:       Alignment Output.   (line   69)
* TARGET_ASM_LOOP_ALIGN_MAX_SKIP:        Alignment Output.   (line   54)
* TARGET_ASM_LTO_END:                    File Framework.     (line   54)
* TARGET_ASM_LTO_START:                  File Framework.     (line   49)
* TARGET_ASM_MARK_DECL_PRESERVED:        Label Output.       (line  313)
* TARGET_ASM_MERGEABLE_RODATA_PREFIX:    Sections.           (line  222)
* TARGET_ASM_NAMED_SECTION:              File Framework.     (line  116)
* TARGET_ASM_OPEN_PAREN:                 Data Output.        (line  130)
* TARGET_ASM_OUTPUT_ADDR_CONST_EXTRA:    Data Output.        (line   40)
* TARGET_ASM_OUTPUT_ANCHOR:              Anchored Addresses. (line   44)
* TARGET_ASM_OUTPUT_DWARF_DTPREL:        SDB and DWARF.      (line  101)
* TARGET_ASM_OUTPUT_IDENT:               File Framework.     (line  102)
* TARGET_ASM_OUTPUT_MI_THUNK:            Function Entry.     (line  165)
* TARGET_ASM_OUTPUT_SOURCE_FILENAME:     File Framework.     (line   94)
* TARGET_ASM_RECORD_GCC_SWITCHES:        File Framework.     (line  165)
* TARGET_ASM_RECORD_GCC_SWITCHES_SECTION: File Framework.    (line  209)
* TARGET_ASM_RELOC_RW_MASK:              Sections.           (line  169)
* TARGET_ASM_SELECT_RTX_SECTION:         Sections.           (line  232)
* TARGET_ASM_SELECT_SECTION:             Sections.           (line  181)
* TARGET_ASM_TM_CLONE_TABLE_SECTION:     Sections.           (line  227)
* TARGET_ASM_TRAMPOLINE_TEMPLATE:        Trampolines.        (line   29)
* TARGET_ASM_TTYPE:                      Exception Region Output.
                                                             (line  123)
* TARGET_ASM_UNALIGNED_DI_OP:            Data Output.        (line   14)
* TARGET_ASM_UNALIGNED_HI_OP:            Data Output.        (line   12)
* TARGET_ASM_UNALIGNED_SI_OP:            Data Output.        (line   13)
* TARGET_ASM_UNALIGNED_TI_OP:            Data Output.        (line   15)
* TARGET_ASM_UNIQUE_SECTION:             Sections.           (line  202)
* TARGET_ASM_UNWIND_EMIT:                Dispatch Tables.    (line   88)
* TARGET_ASM_UNWIND_EMIT_BEFORE_INSN:    Dispatch Tables.    (line   93)
* TARGET_ATOMIC_TEST_AND_SET_TRUEVAL:    Misc.               (line 1018)
* TARGET_ATTRIBUTE_TABLE:                Target Attributes.  (line   11)
* TARGET_ATTRIBUTE_TAKES_IDENTIFIER_P:   Target Attributes.  (line   19)
* TARGET_BINDS_LOCAL_P:                  Sections.           (line  309)
* TARGET_BRANCH_TARGET_REGISTER_CALLEE_SAVED: Misc.          (line  797)
* TARGET_BRANCH_TARGET_REGISTER_CLASS:   Misc.               (line  789)
* TARGET_BUILD_BUILTIN_VA_LIST:          Register Arguments. (line  273)
* TARGET_BUILTIN_DECL:                   Misc.               (line  597)
* TARGET_BUILTIN_RECIPROCAL:             Addressing Modes.   (line  264)
* TARGET_BUILTIN_SETJMP_FRAME_VALUE:     Frame Layout.       (line  109)
* TARGET_C99_FUNCTIONS:                  Library Calls.      (line   71)
* TARGET_C_PREINCLUDE:                   Misc.               (line  362)
* TARGET_CALLEE_COPIES:                  Register Arguments. (line  116)
* TARGET_CAN_ELIMINATE:                  Elimination.        (line   75)
* TARGET_CAN_FOLLOW_JUMP:                Misc.               (line  687)
* TARGET_CAN_INLINE_P:                   Target Attributes.  (line  158)
* TARGET_CANNOT_FORCE_CONST_MEM:         Addressing Modes.   (line  237)
* TARGET_CANNOT_MODIFY_JUMPS_P:          Misc.               (line  776)
* TARGET_CANONICAL_VA_LIST_TYPE:         Register Arguments. (line  294)
* TARGET_CANONICALIZE_COMPARISON:        MODE_CC Condition Codes.
                                                             (line   57)
* TARGET_CASE_VALUES_THRESHOLD:          Misc.               (line   47)
* TARGET_CC_MODES_COMPATIBLE:            MODE_CC Condition Codes.
                                                             (line  121)
* TARGET_CHECK_PCH_TARGET_FLAGS:         PCH Target.         (line   28)
* TARGET_CHECK_STRING_OBJECT_FORMAT_ARG: Run-time Target.    (line  121)
* TARGET_CLASS_LIKELY_SPILLED_P:         Register Classes.   (line  494)
* TARGET_CLASS_MAX_NREGS:                Register Classes.   (line  511)
* TARGET_COMMUTATIVE_P:                  Misc.               (line  693)
* TARGET_COMP_TYPE_ATTRIBUTES:           Target Attributes.  (line   27)
* TARGET_COMPARE_VERSION_PRIORITY:       Misc.               (line  637)
* TARGET_CONDITIONAL_REGISTER_USAGE:     Register Basics.    (line   60)
* TARGET_CONST_ANCHOR:                   Misc.               (line  991)
* TARGET_CONST_NOT_OK_FOR_DEBUG_P:       Addressing Modes.   (line  232)
* TARGET_CONVERT_TO_TYPE:                Misc.               (line  944)
* TARGET_CPU_CPP_BUILTINS:               Run-time Target.    (line    9)
* TARGET_CXX_ADJUST_CLASS_AT_DEFINITION: C++ ABI.            (line   87)
* TARGET_CXX_CDTOR_RETURNS_THIS:         C++ ABI.            (line   38)
* TARGET_CXX_CLASS_DATA_ALWAYS_COMDAT:   C++ ABI.            (line   62)
* TARGET_CXX_COOKIE_HAS_SIZE:            C++ ABI.            (line   25)
* TARGET_CXX_DECL_MANGLING_CONTEXT:      C++ ABI.            (line   93)
* TARGET_CXX_DETERMINE_CLASS_DATA_VISIBILITY: C++ ABI.       (line   54)
* TARGET_CXX_GET_COOKIE_SIZE:            C++ ABI.            (line   18)
* TARGET_CXX_GUARD_MASK_BIT:             C++ ABI.            (line   12)
* TARGET_CXX_GUARD_TYPE:                 C++ ABI.            (line    7)
* TARGET_CXX_IMPORT_EXPORT_CLASS:        C++ ABI.            (line   30)
* TARGET_CXX_KEY_METHOD_MAY_BE_INLINE:   C++ ABI.            (line   43)
* TARGET_CXX_LIBRARY_RTTI_COMDAT:        C++ ABI.            (line   69)
* TARGET_CXX_USE_AEABI_ATEXIT:           C++ ABI.            (line   74)
* TARGET_CXX_USE_ATEXIT_FOR_CXA_ATEXIT:  C++ ABI.            (line   80)
* TARGET_DEBUG_UNWIND_INFO:              SDB and DWARF.      (line   37)
* TARGET_DECIMAL_FLOAT_SUPPORTED_P:      Storage Layout.     (line  524)
* TARGET_DECLSPEC:                       Target Attributes.  (line   73)
* TARGET_DEFAULT_PACK_STRUCT:            Misc.               (line  440)
* TARGET_DEFAULT_SHORT_ENUMS:            Type Layout.        (line  167)
* TARGET_DEFAULT_TARGET_FLAGS:           Run-time Target.    (line   56)
* TARGET_DEFERRED_OUTPUT_DEFS:           Label Output.       (line  434)
* TARGET_DELAY_SCHED2:                   SDB and DWARF.      (line   66)
* TARGET_DELAY_VARTRACK:                 SDB and DWARF.      (line   70)
* TARGET_DELEGITIMIZE_ADDRESS:           Addressing Modes.   (line  223)
* TARGET_DIFFERENT_ADDR_DISPLACEMENT_P:  Register Classes.   (line  570)
* TARGET_DLLIMPORT_DECL_ATTRIBUTES:      Target Attributes.  (line   55)
* TARGET_DWARF_CALLING_CONVENTION:       SDB and DWARF.      (line   18)
* TARGET_DWARF_HANDLE_FRAME_UNSPEC:      Frame Layout.       (line  172)
* TARGET_DWARF_REGISTER_SPAN:            Exception Region Output.
                                                             (line  106)
* TARGET_EDOM:                           Library Calls.      (line   53)
* TARGET_EMUTLS_DEBUG_FORM_TLS_ADDRESS:  Emulated TLS.       (line   68)
* TARGET_EMUTLS_GET_ADDRESS:             Emulated TLS.       (line   19)
* TARGET_EMUTLS_REGISTER_COMMON:         Emulated TLS.       (line   24)
* TARGET_EMUTLS_TMPL_PREFIX:             Emulated TLS.       (line   45)
* TARGET_EMUTLS_TMPL_SECTION:            Emulated TLS.       (line   36)
* TARGET_EMUTLS_VAR_ALIGN_FIXED:         Emulated TLS.       (line   63)
* TARGET_EMUTLS_VAR_FIELDS:              Emulated TLS.       (line   49)
* TARGET_EMUTLS_VAR_INIT:                Emulated TLS.       (line   57)
* TARGET_EMUTLS_VAR_PREFIX:              Emulated TLS.       (line   41)
* TARGET_EMUTLS_VAR_SECTION:             Emulated TLS.       (line   31)
* TARGET_ENCODE_SECTION_INFO:            Sections.           (line  253)
* TARGET_ENCODE_SECTION_INFO and address validation: Addressing Modes.
                                                             (line   83)
* TARGET_ENCODE_SECTION_INFO usage:      Instruction Output. (line  128)
* TARGET_ENUM_VA_LIST_P:                 Register Arguments. (line  278)
* TARGET_EXCEPT_UNWIND_INFO:             Exception Region Output.
                                                             (line   48)
* TARGET_EXECUTABLE_SUFFIX:              Misc.               (line  750)
* TARGET_EXPAND_BUILTIN:                 Misc.               (line  607)
* TARGET_EXPAND_BUILTIN_SAVEREGS:        Varargs.            (line   67)
* TARGET_EXPAND_TO_RTL_HOOK:             Storage Layout.     (line  530)
* TARGET_EXPR:                           Unary and Binary Expressions.
                                                             (line    6)
* TARGET_EXTRA_INCLUDES:                 Misc.               (line  837)
* TARGET_EXTRA_LIVE_ON_ENTRY:            Tail Calls.         (line   21)
* TARGET_EXTRA_PRE_INCLUDES:             Misc.               (line  844)
* TARGET_FIXED_CONDITION_CODE_REGS:      MODE_CC Condition Codes.
                                                             (line  106)
* TARGET_FIXED_POINT_SUPPORTED_P:        Storage Layout.     (line  527)
* target_flags:                          Run-time Target.    (line   52)
* TARGET_FLAGS_REGNUM:                   Register Arguments. (line  394)
* TARGET_FLT_EVAL_METHOD:                Type Layout.        (line  148)
* TARGET_FN_ABI_VA_LIST:                 Register Arguments. (line  289)
* TARGET_FOLD_BUILTIN:                   Misc.               (line  628)
* TARGET_FORCE_AT_COMP_DIR:              SDB and DWARF.      (line   61)
* TARGET_FORMAT_TYPES:                   Misc.               (line  864)
* TARGET_FRAME_POINTER_REQUIRED:         Elimination.        (line    9)
* TARGET_FUNCTION_ARG:                   Register Arguments. (line   12)
* TARGET_FUNCTION_ARG_ADVANCE:           Register Arguments. (line  187)
* TARGET_FUNCTION_ARG_BOUNDARY:          Register Arguments. (line  241)
* TARGET_FUNCTION_ARG_ROUND_BOUNDARY:    Register Arguments. (line  247)
* TARGET_FUNCTION_ATTRIBUTE_INLINABLE_P: Target Attributes.  (line   95)
* TARGET_FUNCTION_INCOMING_ARG:          Register Arguments. (line   68)
* TARGET_FUNCTION_OK_FOR_SIBCALL:        Tail Calls.         (line    8)
* TARGET_FUNCTION_VALUE:                 Scalar Return.      (line   11)
* TARGET_FUNCTION_VALUE_REGNO_P:         Scalar Return.      (line   97)
* TARGET_GENERATE_VERSION_DISPATCHER_BODY: Misc.             (line  654)
* TARGET_GET_DRAP_RTX:                   Misc.               (line  974)
* TARGET_GET_FUNCTION_VERSIONS_DISPATCHER: Misc.             (line  647)
* TARGET_GET_PCH_VALIDITY:               PCH Target.         (line    7)
* TARGET_GET_RAW_ARG_MODE:               Aggregate Return.   (line   83)
* TARGET_GET_RAW_RESULT_MODE:            Aggregate Return.   (line   78)
* TARGET_GIMPLIFY_VA_ARG_EXPR:           Register Arguments. (line  300)
* TARGET_HANDLE_C_OPTION:                Run-time Target.    (line   75)
* TARGET_HANDLE_OPTION:                  Run-time Target.    (line   62)
* TARGET_HARD_REGNO_SCRATCH_OK:          Values in Registers.
                                                             (line  144)
* TARGET_HAS_SINCOS:                     Library Calls.      (line   79)
* TARGET_HAVE_CONDITIONAL_EXECUTION:     Misc.               (line  811)
* TARGET_HAVE_CTORS_DTORS:               Macros for Initialization.
                                                             (line   64)
* TARGET_HAVE_NAMED_SECTIONS:            File Framework.     (line  141)
* TARGET_HAVE_SRODATA_SECTION:           Sections.           (line  298)
* TARGET_HAVE_SWITCHABLE_BSS_SECTIONS:   File Framework.     (line  146)
* TARGET_HAVE_TLS:                       Sections.           (line  318)
* TARGET_IN_SMALL_DATA_P:                Sections.           (line  294)
* TARGET_INIT_BUILTINS:                  Misc.               (line  580)
* TARGET_INIT_DWARF_REG_SIZES_EXTRA:     Exception Region Output.
                                                             (line  115)
* TARGET_INIT_LIBFUNCS:                  Library Calls.      (line   16)
* TARGET_INSERT_ATTRIBUTES:              Target Attributes.  (line   82)
* TARGET_INSTANTIATE_DECLS:              Storage Layout.     (line  538)
* TARGET_INVALID_ARG_FOR_UNPROTOTYPED_FN: Misc.              (line  898)
* TARGET_INVALID_BINARY_OP:              Misc.               (line  917)
* TARGET_INVALID_CONVERSION:             Misc.               (line  904)
* TARGET_INVALID_PARAMETER_TYPE:         Misc.               (line  923)
* TARGET_INVALID_RETURN_TYPE:            Misc.               (line  930)
* TARGET_INVALID_UNARY_OP:               Misc.               (line  910)
* TARGET_INVALID_WITHIN_DOLOOP:          Misc.               (line  661)
* TARGET_LEGITIMATE_ADDRESS_P:           Addressing Modes.   (line   50)
* TARGET_LEGITIMATE_COMBINED_INSN:       Misc.               (line  673)
* TARGET_LEGITIMATE_CONSTANT_P:          Addressing Modes.   (line  216)
* TARGET_LEGITIMIZE_ADDRESS:             Addressing Modes.   (line  132)
* TARGET_LIB_INT_CMP_BIASED:             Library Calls.      (line   43)
* TARGET_LIBCALL_VALUE:                  Scalar Return.      (line   66)
* TARGET_LIBFUNC_GNU_PREFIX:             Library Calls.      (line   25)
* TARGET_LIBGCC_CMP_RETURN_MODE:         Storage Layout.     (line  461)
* TARGET_LIBGCC_SDATA_SECTION:           Sections.           (line  132)
* TARGET_LIBGCC_SHIFT_COUNT_MODE:        Storage Layout.     (line  467)
* TARGET_LOOP_UNROLL_ADJUST:             Misc.               (line  818)
* TARGET_LRA_P:                          Register Classes.   (line  553)
* TARGET_MACHINE_DEPENDENT_REORG:        Misc.               (line  565)
* TARGET_MANGLE_ASSEMBLER_NAME:          Label Output.       (line  325)
* TARGET_MANGLE_DECL_ASSEMBLER_NAME:     Sections.           (line  243)
* TARGET_MANGLE_TYPE:                    Storage Layout.     (line  542)
* TARGET_MAX_ANCHOR_OFFSET:              Anchored Addresses. (line   39)
* TARGET_MD_ASM_CLOBBERS:                Misc.               (line  486)
* TARGET_MEM_CONSTRAINT:                 Addressing Modes.   (line  109)
* TARGET_MEM_REF:                        Storage References. (line    6)
* TARGET_MEMBER_TYPE_FORCES_BLK:         Storage Layout.     (line  413)
* TARGET_MEMMODEL_CHECK:                 Misc.               (line 1014)
* TARGET_MEMORY_MOVE_COST:               Costs.              (line   81)
* TARGET_MERGE_DECL_ATTRIBUTES:          Target Attributes.  (line   47)
* TARGET_MERGE_TYPE_ATTRIBUTES:          Target Attributes.  (line   39)
* TARGET_MIN_ANCHOR_OFFSET:              Anchored Addresses. (line   33)
* TARGET_MIN_DIVISIONS_FOR_RECIP_MUL:    Misc.               (line   92)
* TARGET_MODE_DEPENDENT_ADDRESS_P:       Addressing Modes.   (line  199)
* TARGET_MODE_REP_EXTENDED:              Misc.               (line  177)
* TARGET_MS_BITFIELD_LAYOUT_P:           Storage Layout.     (line  497)
* TARGET_MUST_PASS_IN_STACK:             Register Arguments. (line   61)
* TARGET_MUST_PASS_IN_STACK, and TARGET_FUNCTION_ARG: Register Arguments.
                                                             (line   51)
* TARGET_N_FORMAT_TYPES:                 Misc.               (line  869)
* TARGET_NARROW_VOLATILE_BITFIELD:       Storage Layout.     (line  404)
* TARGET_OBJC_CONSTRUCT_STRING_OBJECT:   Run-time Target.    (line   90)
* TARGET_OBJC_DECLARE_CLASS_DEFINITION:  Run-time Target.    (line  111)
* TARGET_OBJC_DECLARE_UNRESOLVED_CLASS_REFERENCE: Run-time Target.
                                                             (line  106)
* TARGET_OBJECT_SUFFIX:                  Misc.               (line  745)
* TARGET_OBJFMT_CPP_BUILTINS:            Run-time Target.    (line   46)
* TARGET_OPTF:                           Misc.               (line  851)
* TARGET_OPTION_DEFAULT_PARAMS:          Run-time Target.    (line  161)
* TARGET_OPTION_FUNCTION_VERSIONS:       Target Attributes.  (line  151)
* TARGET_OPTION_INIT_STRUCT:             Run-time Target.    (line  158)
* TARGET_OPTION_OPTIMIZATION_TABLE:      Run-time Target.    (line  144)
* TARGET_OPTION_OVERRIDE:                Target Attributes.  (line  137)
* TARGET_OPTION_PRAGMA_PARSE:            Target Attributes.  (line  131)
* TARGET_OPTION_PRINT:                   Target Attributes.  (line  125)
* TARGET_OPTION_RESTORE:                 Target Attributes.  (line  119)
* TARGET_OPTION_SAVE:                    Target Attributes.  (line  113)
* TARGET_OPTION_VALID_ATTRIBUTE_P:       Target Attributes.  (line  102)
* TARGET_OS_CPP_BUILTINS:                Run-time Target.    (line   42)
* TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE:  Run-time Target.    (line  127)
* TARGET_OVERRIDES_FORMAT_ATTRIBUTES:    Misc.               (line  873)
* TARGET_OVERRIDES_FORMAT_ATTRIBUTES_COUNT: Misc.            (line  879)
* TARGET_OVERRIDES_FORMAT_INIT:          Misc.               (line  883)
* TARGET_PASS_BY_REFERENCE:              Register Arguments. (line  104)
* TARGET_PCH_VALID_P:                    PCH Target.         (line   13)
* TARGET_POSIX_IO:                       Misc.               (line  510)
* TARGET_PREFERRED_OUTPUT_RELOAD_CLASS:  Register Classes.   (line  289)
* TARGET_PREFERRED_RELOAD_CLASS:         Register Classes.   (line  218)
* TARGET_PREFERRED_RENAME_CLASS:         Register Classes.   (line  206)
* TARGET_PREPARE_PCH_SAVE:               PCH Target.         (line   35)
* TARGET_PRETEND_OUTGOING_VARARGS_NAMED: Varargs.            (line  128)
* TARGET_PROFILE_BEFORE_PROLOGUE:        Sections.           (line  302)
* TARGET_PROMOTE_FUNCTION_MODE:          Storage Layout.     (line  118)
* TARGET_PROMOTE_PROTOTYPES:             Stack Arguments.    (line   11)
* TARGET_PROMOTED_TYPE:                  Misc.               (line  936)
* TARGET_PTRMEMFUNC_VBIT_LOCATION:       Type Layout.        (line  295)
* TARGET_REF_MAY_ALIAS_ERRNO:            Register Arguments. (line  311)
* TARGET_REGISTER_MOVE_COST:             Costs.              (line   33)
* TARGET_REGISTER_PRIORITY:              Register Classes.   (line  558)
* TARGET_RELAXED_ORDERING:               Misc.               (line  888)
* TARGET_RESOLVE_OVERLOADED_BUILTIN:     Misc.               (line  617)
* TARGET_RETURN_IN_MEMORY:               Aggregate Return.   (line   17)
* TARGET_RETURN_IN_MSB:                  Scalar Return.      (line  117)
* TARGET_RETURN_POPS_ARGS:               Stack Arguments.    (line   94)
* TARGET_RTX_COSTS:                      Costs.              (line  271)
* TARGET_SCALAR_MODE_SUPPORTED_P:        Register Arguments. (line  319)
* TARGET_SCHED_ADJUST_COST:              Scheduling.         (line   37)
* TARGET_SCHED_ADJUST_PRIORITY:          Scheduling.         (line   52)
* TARGET_SCHED_ALLOC_SCHED_CONTEXT:      Scheduling.         (line  274)
* TARGET_SCHED_CLEAR_SCHED_CONTEXT:      Scheduling.         (line  289)
* TARGET_SCHED_DEPENDENCIES_EVALUATION_HOOK: Scheduling.     (line   89)
* TARGET_SCHED_DFA_NEW_CYCLE:            Scheduling.         (line  235)
* TARGET_SCHED_DFA_POST_ADVANCE_CYCLE:   Scheduling.         (line  160)
* TARGET_SCHED_DFA_POST_CYCLE_INSN:      Scheduling.         (line  144)
* TARGET_SCHED_DFA_PRE_ADVANCE_CYCLE:    Scheduling.         (line  153)
* TARGET_SCHED_DFA_PRE_CYCLE_INSN:       Scheduling.         (line  132)
* TARGET_SCHED_DISPATCH:                 Scheduling.         (line  355)
* TARGET_SCHED_DISPATCH_DO:              Scheduling.         (line  360)
* TARGET_SCHED_EXPOSED_PIPELINE:         Scheduling.         (line  364)
* TARGET_SCHED_FINISH:                   Scheduling.         (line  109)
* TARGET_SCHED_FINISH_GLOBAL:            Scheduling.         (line  126)
* TARGET_SCHED_FIRST_CYCLE_MULTIPASS_BACKTRACK: Scheduling.  (line  215)
* TARGET_SCHED_FIRST_CYCLE_MULTIPASS_BEGIN: Scheduling.      (line  204)
* TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD: Scheduling.
                                                             (line  168)
* TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD_GUARD: Scheduling.
                                                             (line  196)
* TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD_GUARD_SPEC: Scheduling.
                                                             (line  328)
* TARGET_SCHED_FIRST_CYCLE_MULTIPASS_END: Scheduling.        (line  220)
* TARGET_SCHED_FIRST_CYCLE_MULTIPASS_FINI: Scheduling.       (line  230)
* TARGET_SCHED_FIRST_CYCLE_MULTIPASS_INIT: Scheduling.       (line  225)
* TARGET_SCHED_FIRST_CYCLE_MULTIPASS_ISSUE: Scheduling.      (line  210)
* TARGET_SCHED_FREE_SCHED_CONTEXT:       Scheduling.         (line  293)
* TARGET_SCHED_GEN_SPEC_CHECK:           Scheduling.         (line  315)
* TARGET_SCHED_H_I_D_EXTENDED:           Scheduling.         (line  269)
* TARGET_SCHED_INIT:                     Scheduling.         (line   99)
* TARGET_SCHED_INIT_DFA_POST_CYCLE_INSN: Scheduling.         (line  149)
* TARGET_SCHED_INIT_DFA_PRE_CYCLE_INSN:  Scheduling.         (line  141)
* TARGET_SCHED_INIT_GLOBAL:              Scheduling.         (line  118)
* TARGET_SCHED_INIT_SCHED_CONTEXT:       Scheduling.         (line  279)
* TARGET_SCHED_IS_COSTLY_DEPENDENCE:     Scheduling.         (line  246)
* TARGET_SCHED_ISSUE_RATE:               Scheduling.         (line   12)
* TARGET_SCHED_NEEDS_BLOCK_P:            Scheduling.         (line  308)
* TARGET_SCHED_REASSOCIATION_WIDTH:      Scheduling.         (line  370)
* TARGET_SCHED_REORDER:                  Scheduling.         (line   60)
* TARGET_SCHED_REORDER2:                 Scheduling.         (line   77)
* TARGET_SCHED_SET_SCHED_CONTEXT:        Scheduling.         (line  285)
* TARGET_SCHED_SET_SCHED_FLAGS:          Scheduling.         (line  340)
* TARGET_SCHED_SMS_RES_MII:              Scheduling.         (line  346)
* TARGET_SCHED_SPECULATE_INSN:           Scheduling.         (line  297)
* TARGET_SCHED_VARIABLE_ISSUE:           Scheduling.         (line   24)
* TARGET_SECONDARY_RELOAD:               Register Classes.   (line  318)
* TARGET_SECTION_TYPE_FLAGS:             File Framework.     (line  152)
* TARGET_SET_CURRENT_FUNCTION:           Misc.               (line  727)
* TARGET_SET_DEFAULT_TYPE_ATTRIBUTES:    Target Attributes.  (line   34)
* TARGET_SET_UP_BY_PROLOGUE:             Tail Calls.         (line   31)
* TARGET_SETUP_INCOMING_VARARGS:         Varargs.            (line   76)
* TARGET_SHIFT_TRUNCATION_MASK:          Misc.               (line  140)
* TARGET_SMALL_REGISTER_CLASSES_FOR_MODE_P: Register Arguments.
                                                             (line  361)
* TARGET_SPILL_CLASS:                    Register Classes.   (line  578)
* TARGET_SPLIT_COMPLEX_ARG:              Register Arguments. (line  261)
* TARGET_STACK_PROTECT_FAIL:             Stack Smashing Protection.
                                                             (line   17)
* TARGET_STACK_PROTECT_GUARD:            Stack Smashing Protection.
                                                             (line    7)
* TARGET_STATIC_CHAIN:                   Frame Registers.    (line   92)
* TARGET_STRICT_ARGUMENT_NAMING:         Varargs.            (line  112)
* TARGET_STRING_OBJECT_REF_TYPE_P:       Run-time Target.    (line  116)
* TARGET_STRIP_NAME_ENCODING:            Sections.           (line  290)
* TARGET_STRUCT_VALUE_RTX:               Aggregate Return.   (line   45)
* TARGET_SUPPORTS_SPLIT_STACK:           Stack Smashing Protection.
                                                             (line   27)
* TARGET_SUPPORTS_WEAK:                  Label Output.       (line  241)
* TARGET_TERMINATE_DW2_EH_FRAME_INFO:    Exception Region Output.
                                                             (line  100)
* TARGET_TRAMPOLINE_ADJUST_ADDRESS:      Trampolines.        (line   75)
* TARGET_TRAMPOLINE_INIT:                Trampolines.        (line   56)
* TARGET_UNSPEC_MAY_TRAP_P:              Misc.               (line  719)
* TARGET_UNWIND_TABLES_DEFAULT:          Exception Region Output.
                                                             (line   74)
* TARGET_UNWIND_WORD_MODE:               Storage Layout.     (line  473)
* TARGET_UPDATE_STACK_BOUNDARY:          Misc.               (line  970)
* TARGET_USE_ANCHORS_FOR_SYMBOL_P:       Anchored Addresses. (line   55)
* TARGET_USE_BLOCKS_FOR_CONSTANT_P:      Addressing Modes.   (line  251)
* TARGET_USE_BLOCKS_FOR_DECL_P:          Addressing Modes.   (line  257)
* TARGET_USE_JCR_SECTION:                Misc.               (line  952)
* TARGET_USES_WEAK_UNWIND_INFO:          Exception Handling. (line  126)
* TARGET_VALID_DLLIMPORT_ATTRIBUTE_P:    Target Attributes.  (line   68)
* TARGET_VALID_POINTER_MODE:             Register Arguments. (line  306)
* TARGET_VECTOR_ALIGNMENT:               Storage Layout.     (line  264)
* TARGET_VECTOR_MODE_SUPPORTED_P:        Register Arguments. (line  331)
* TARGET_VECTORIZE_ADD_STMT_COST:        Addressing Modes.   (line  373)
* TARGET_VECTORIZE_AUTOVECTORIZE_VECTOR_SIZES: Addressing Modes.
                                                             (line  353)
* TARGET_VECTORIZE_BUILTIN_CONVERSION:   Addressing Modes.   (line  315)
* TARGET_VECTORIZE_BUILTIN_GATHER:       Addressing Modes.   (line  404)
* TARGET_VECTORIZE_BUILTIN_MASK_FOR_LOAD: Addressing Modes.  (line  273)
* TARGET_VECTORIZE_BUILTIN_TM_LOAD:      Addressing Modes.   (line  395)
* TARGET_VECTORIZE_BUILTIN_TM_STORE:     Addressing Modes.   (line  399)
* TARGET_VECTORIZE_BUILTIN_VECTORIZATION_COST: Addressing Modes.
                                                             (line  300)
* TARGET_VECTORIZE_BUILTIN_VECTORIZED_FUNCTION: Addressing Modes.
                                                             (line  327)
* TARGET_VECTORIZE_DESTROY_COST_DATA:    Addressing Modes.   (line  390)
* TARGET_VECTORIZE_FINISH_COST:          Addressing Modes.   (line  384)
* TARGET_VECTORIZE_INIT_COST:            Addressing Modes.   (line  361)
* TARGET_VECTORIZE_PREFERRED_SIMD_MODE:  Addressing Modes.   (line  346)
* TARGET_VECTORIZE_SUPPORT_VECTOR_MISALIGNMENT: Addressing Modes.
                                                             (line  337)
* TARGET_VECTORIZE_VEC_PERM_CONST_OK:    Addressing Modes.   (line  311)
* TARGET_VECTORIZE_VECTOR_ALIGNMENT_REACHABLE: Addressing Modes.
                                                             (line  306)
* TARGET_VTABLE_DATA_ENTRY_DISTANCE:     Type Layout.        (line  348)
* TARGET_VTABLE_ENTRY_ALIGN:             Type Layout.        (line  342)
* TARGET_VTABLE_USES_DESCRIPTORS:        Type Layout.        (line  331)
* TARGET_WANT_DEBUG_PUB_SECTIONS:        SDB and DWARF.      (line   56)
* TARGET_WARN_FUNC_RETURN:               Tail Calls.         (line   36)
* TARGET_WEAK_NOT_IN_ARCHIVE_TOC:        Label Output.       (line  277)
* targetm:                               Target Structure.   (line    7)
* targets, makefile:                     Makefile.           (line    6)
* TCmode:                                Machine Modes.      (line  197)
* TDmode:                                Machine Modes.      (line   94)
* TEMPLATE_DECL:                         Declarations.       (line    6)
* Temporaries:                           Temporaries.        (line    6)
* termination routines:                  Initialization.     (line    6)
* testing constraints:                   C Constraint Interface.
                                                             (line    6)
* TEXT_SECTION_ASM_OP:                   Sections.           (line   38)
* TF_SIZE:                               Type Layout.        (line  139)
* TFmode:                                Machine Modes.      (line   98)
* THEN_CLAUSE:                           Statements for C++. (line    6)
* THREAD_MODEL_SPEC:                     Driver.             (line  163)
* THROW_EXPR:                            Unary and Binary Expressions.
                                                             (line    6)
* THUNK_DECL:                            Declarations.       (line    6)
* THUNK_DELTA:                           Declarations.       (line    6)
* TImode:                                Machine Modes.      (line   48)
* TImode, in insn:                       Insns.              (line  278)
* TLS_COMMON_ASM_OP:                     Sections.           (line   81)
* TLS_SECTION_ASM_FLAG:                  Sections.           (line   86)
* tm.h macros:                           Target Macros.      (line    6)
* TQFmode:                               Machine Modes.      (line   62)
* TQmode:                                Machine Modes.      (line  119)
* TRAMPOLINE_ALIGNMENT:                  Trampolines.        (line   49)
* TRAMPOLINE_SECTION:                    Trampolines.        (line   40)
* TRAMPOLINE_SIZE:                       Trampolines.        (line   45)
* trampolines for nested functions:      Trampolines.        (line    6)
* TRANSFER_FROM_TRAMPOLINE:              Trampolines.        (line  111)
* trap instruction pattern:              Standard Names.     (line 1542)
* tree <1>:                              Macros and Functions.
                                                             (line    6)
* tree:                                  Tree overview.      (line    6)
* Tree SSA:                              Tree SSA.           (line    6)
* TREE_CHAIN:                            Macros and Functions.
                                                             (line    6)
* TREE_CODE:                             Tree overview.      (line    6)
* tree_int_cst_equal:                    Constant expressions.
                                                             (line    6)
* TREE_INT_CST_HIGH:                     Constant expressions.
                                                             (line    6)
* TREE_INT_CST_LOW:                      Constant expressions.
                                                             (line    6)
* tree_int_cst_lt:                       Constant expressions.
                                                             (line    6)
* TREE_LIST:                             Containers.         (line    6)
* TREE_OPERAND:                          Expression trees.   (line    6)
* TREE_PUBLIC <1>:                       Function Properties.
                                                             (line   28)
* TREE_PUBLIC:                           Function Basics.    (line    6)
* TREE_PURPOSE:                          Containers.         (line    6)
* TREE_READONLY:                         Function Properties.
                                                             (line   37)
* tree_size:                             Macros and Functions.
                                                             (line   13)
* TREE_STATIC:                           Function Properties.
                                                             (line   31)
* TREE_STRING_LENGTH:                    Constant expressions.
                                                             (line    6)
* TREE_STRING_POINTER:                   Constant expressions.
                                                             (line    6)
* TREE_THIS_VOLATILE:                    Function Properties.
                                                             (line   34)
* TREE_TYPE <1>:                         Types for C++.      (line    6)
* TREE_TYPE <2>:                         Function Basics.    (line   47)
* TREE_TYPE <3>:                         Expression trees.   (line    6)
* TREE_TYPE <4>:                         Working with declarations.
                                                             (line   11)
* TREE_TYPE <5>:                         Types.              (line    6)
* TREE_TYPE:                             Macros and Functions.
                                                             (line    6)
* TREE_VALUE:                            Containers.         (line    6)
* TREE_VEC:                              Containers.         (line    6)
* TREE_VEC_ELT:                          Containers.         (line    6)
* TREE_VEC_LENGTH:                       Containers.         (line    6)
* TRULY_NOOP_TRUNCATION:                 Misc.               (line  163)
* TRUNC_DIV_EXPR:                        Unary and Binary Expressions.
                                                             (line    6)
* TRUNC_MOD_EXPR:                        Unary and Binary Expressions.
                                                             (line    6)
* truncate:                              Conversions.        (line   38)
* truncMN2 instruction pattern:          Standard Names.     (line  903)
* TRUTH_AND_EXPR:                        Unary and Binary Expressions.
                                                             (line    6)
* TRUTH_ANDIF_EXPR:                      Unary and Binary Expressions.
                                                             (line    6)
* TRUTH_NOT_EXPR:                        Unary and Binary Expressions.
                                                             (line    6)
* TRUTH_OR_EXPR:                         Unary and Binary Expressions.
                                                             (line    6)
* TRUTH_ORIF_EXPR:                       Unary and Binary Expressions.
                                                             (line    6)
* TRUTH_XOR_EXPR:                        Unary and Binary Expressions.
                                                             (line    6)
* TRY_BLOCK:                             Statements for C++. (line    6)
* TRY_HANDLERS:                          Statements for C++. (line    6)
* TRY_STMTS:                             Statements for C++. (line    6)
* Tuple specific accessors:              Tuple specific accessors.
                                                             (line    6)
* tuples:                                Tuple representation.
                                                             (line    6)
* type:                                  Types.              (line    6)
* type declaration:                      Declarations.       (line    6)
* TYPE_ALIGN <1>:                        Types for C++.      (line    6)
* TYPE_ALIGN:                            Types.              (line    6)
* TYPE_ARG_TYPES <1>:                    Types for C++.      (line    6)
* TYPE_ARG_TYPES:                        Types.              (line    6)
* TYPE_ASM_OP:                           Label Output.       (line   79)
* TYPE_ATTRIBUTES:                       Attributes.         (line   25)
* TYPE_BINFO:                            Classes.            (line    6)
* TYPE_BUILT_IN:                         Types for C++.      (line   68)
* TYPE_CANONICAL:                        Types.              (line    6)
* TYPE_CONTEXT <1>:                      Types for C++.      (line    6)
* TYPE_CONTEXT:                          Types.              (line    6)
* TYPE_DECL:                             Declarations.       (line    6)
* TYPE_FIELDS <1>:                       Classes.            (line    6)
* TYPE_FIELDS <2>:                       Types for C++.      (line    6)
* TYPE_FIELDS:                           Types.              (line    6)
* TYPE_HAS_ARRAY_NEW_OPERATOR:           Classes.            (line   96)
* TYPE_HAS_DEFAULT_CONSTRUCTOR:          Classes.            (line   81)
* TYPE_HAS_MUTABLE_P:                    Classes.            (line   86)
* TYPE_HAS_NEW_OPERATOR:                 Classes.            (line   93)
* TYPE_MAIN_VARIANT <1>:                 Types for C++.      (line    6)
* TYPE_MAIN_VARIANT:                     Types.              (line    6)
* TYPE_MAX_VALUE:                        Types.              (line    6)
* TYPE_METHOD_BASETYPE <1>:              Types for C++.      (line    6)
* TYPE_METHOD_BASETYPE:                  Types.              (line    6)
* TYPE_METHODS:                          Classes.            (line    6)
* TYPE_MIN_VALUE:                        Types.              (line    6)
* TYPE_NAME <1>:                         Types for C++.      (line    6)
* TYPE_NAME:                             Types.              (line    6)
* TYPE_NOTHROW_P:                        Functions for C++.  (line  154)
* TYPE_OFFSET_BASETYPE <1>:              Types for C++.      (line    6)
* TYPE_OFFSET_BASETYPE:                  Types.              (line    6)
* TYPE_OPERAND_FMT:                      Label Output.       (line   90)
* TYPE_OVERLOADS_ARRAY_REF:              Classes.            (line  104)
* TYPE_OVERLOADS_ARROW:                  Classes.            (line  107)
* TYPE_OVERLOADS_CALL_EXPR:              Classes.            (line  100)
* TYPE_POLYMORPHIC_P:                    Classes.            (line   77)
* TYPE_PRECISION <1>:                    Types for C++.      (line    6)
* TYPE_PRECISION:                        Types.              (line    6)
* TYPE_PTR_P:                            Types for C++.      (line   74)
* TYPE_PTRDATAMEM_P:                     Types for C++.      (line    6)
* TYPE_PTRFN_P:                          Types for C++.      (line   78)
* TYPE_PTROB_P:                          Types for C++.      (line   81)
* TYPE_PTROBV_P:                         Types for C++.      (line    6)
* TYPE_QUAL_CONST <1>:                   Types for C++.      (line    6)
* TYPE_QUAL_CONST:                       Types.              (line    6)
* TYPE_QUAL_RESTRICT <1>:                Types for C++.      (line    6)
* TYPE_QUAL_RESTRICT:                    Types.              (line    6)
* TYPE_QUAL_VOLATILE <1>:                Types for C++.      (line    6)
* TYPE_QUAL_VOLATILE:                    Types.              (line    6)
* TYPE_RAISES_EXCEPTIONS:                Functions for C++.  (line  149)
* TYPE_SIZE <1>:                         Types for C++.      (line    6)
* TYPE_SIZE:                             Types.              (line    6)
* TYPE_STRUCTURAL_EQUALITY_P:            Types.              (line    6)
* TYPE_UNQUALIFIED <1>:                  Types for C++.      (line    6)
* TYPE_UNQUALIFIED:                      Types.              (line    6)
* TYPE_VFIELD:                           Classes.            (line    6)
* TYPENAME_TYPE:                         Types for C++.      (line    6)
* TYPENAME_TYPE_FULLNAME <1>:            Types for C++.      (line    6)
* TYPENAME_TYPE_FULLNAME:                Types.              (line    6)
* TYPEOF_TYPE:                           Types for C++.      (line    6)
* UDAmode:                               Machine Modes.      (line  168)
* udiv:                                  Arithmetic.         (line  130)
* udivM3 instruction pattern:            Standard Names.     (line  269)
* udivmodM4 instruction pattern:         Standard Names.     (line  507)
* udot_prodM instruction pattern:        Standard Names.     (line  335)
* UDQmode:                               Machine Modes.      (line  136)
* UHAmode:                               Machine Modes.      (line  160)
* UHQmode:                               Machine Modes.      (line  128)
* UINT16_TYPE:                           Type Layout.        (line  258)
* UINT32_TYPE:                           Type Layout.        (line  259)
* UINT64_TYPE:                           Type Layout.        (line  260)
* UINT8_TYPE:                            Type Layout.        (line  257)
* UINT_FAST16_TYPE:                      Type Layout.        (line  274)
* UINT_FAST32_TYPE:                      Type Layout.        (line  275)
* UINT_FAST64_TYPE:                      Type Layout.        (line  276)
* UINT_FAST8_TYPE:                       Type Layout.        (line  273)
* UINT_LEAST16_TYPE:                     Type Layout.        (line  266)
* UINT_LEAST32_TYPE:                     Type Layout.        (line  267)
* UINT_LEAST64_TYPE:                     Type Layout.        (line  268)
* UINT_LEAST8_TYPE:                      Type Layout.        (line  265)
* UINTMAX_TYPE:                          Type Layout.        (line  241)
* UINTPTR_TYPE:                          Type Layout.        (line  278)
* umaddMN4 instruction pattern:          Standard Names.     (line  454)
* umax:                                  Arithmetic.         (line  149)
* umaxM3 instruction pattern:            Standard Names.     (line  269)
* umin:                                  Arithmetic.         (line  149)
* uminM3 instruction pattern:            Standard Names.     (line  269)
* umod:                                  Arithmetic.         (line  136)
* umodM3 instruction pattern:            Standard Names.     (line  269)
* umsubMN4 instruction pattern:          Standard Names.     (line  478)
* umulhisi3 instruction pattern:         Standard Names.     (line  426)
* umulM3_highpart instruction pattern:   Standard Names.     (line  440)
* umulqihi3 instruction pattern:         Standard Names.     (line  426)
* umulsidi3 instruction pattern:         Standard Names.     (line  426)
* unchanging:                            Flags.              (line  296)
* unchanging, in call_insn:              Flags.              (line   19)
* unchanging, in jump_insn, call_insn and insn: Flags.       (line   39)
* unchanging, in mem:                    Flags.              (line  134)
* unchanging, in subreg:                 Flags.              (line  170)
* unchanging, in symbol_ref:             Flags.              (line   10)
* UNEQ_EXPR:                             Unary and Binary Expressions.
                                                             (line    6)
* UNGE_EXPR:                             Unary and Binary Expressions.
                                                             (line    6)
* UNGT_EXPR:                             Unary and Binary Expressions.
                                                             (line    6)
* UNION_TYPE <1>:                        Classes.            (line    6)
* UNION_TYPE:                            Types.              (line    6)
* unions, returning:                     Interface.          (line   10)
* UNITS_PER_WORD:                        Storage Layout.     (line   66)
* UNKNOWN_TYPE <1>:                      Types for C++.      (line    6)
* UNKNOWN_TYPE:                          Types.              (line    6)
* UNLE_EXPR:                             Unary and Binary Expressions.
                                                             (line    6)
* UNLIKELY_EXECUTED_TEXT_SECTION_NAME:   Sections.           (line   49)
* UNLT_EXPR:                             Unary and Binary Expressions.
                                                             (line    6)
* UNORDERED_EXPR:                        Unary and Binary Expressions.
                                                             (line    6)
* unshare_all_rtl:                       Sharing.            (line   58)
* unsigned division:                     Arithmetic.         (line  130)
* unsigned division with unsigned saturation: Arithmetic.    (line  130)
* unsigned greater than:                 Comparisons.        (line   64)
* unsigned less than:                    Comparisons.        (line   68)
* unsigned minimum and maximum:          Arithmetic.         (line  149)
* unsigned_fix:                          Conversions.        (line   77)
* unsigned_float:                        Conversions.        (line   62)
* unsigned_fract_convert:                Conversions.        (line   97)
* unsigned_sat_fract:                    Conversions.        (line  103)
* unspec <1>:                            Constant Definitions.
                                                             (line  111)
* unspec:                                Side Effects.       (line  293)
* unspec_volatile <1>:                   Constant Definitions.
                                                             (line   99)
* unspec_volatile:                       Side Effects.       (line  293)
* untyped_call instruction pattern:      Standard Names.     (line 1145)
* untyped_return instruction pattern:    Standard Names.     (line 1209)
* UPDATE_PATH_HOST_CANONICALIZE (PATH):  Filesystem.         (line   59)
* update_ssa:                            SSA.                (line   76)
* update_stmt <1>:                       SSA Operands.       (line    6)
* update_stmt:                           Manipulating GIMPLE statements.
                                                             (line  141)
* update_stmt_if_modified:               Manipulating GIMPLE statements.
                                                             (line  144)
* UQQmode:                               Machine Modes.      (line  123)
* us_ashift:                             Arithmetic.         (line  173)
* us_minus:                              Arithmetic.         (line   36)
* us_mult:                               Arithmetic.         (line   92)
* us_neg:                                Arithmetic.         (line   81)
* us_plus:                               Arithmetic.         (line   14)
* us_truncate:                           Conversions.        (line   48)
* usaddM3 instruction pattern:           Standard Names.     (line  269)
* USAmode:                               Machine Modes.      (line  164)
* usashlM3 instruction pattern:          Standard Names.     (line  510)
* usdivM3 instruction pattern:           Standard Names.     (line  269)
* use:                                   Side Effects.       (line  168)
* USE_C_ALLOCA:                          Host Misc.          (line   19)
* USE_LD_AS_NEEDED:                      Driver.             (line  136)
* USE_LOAD_POST_DECREMENT:               Costs.              (line  226)
* USE_LOAD_POST_INCREMENT:               Costs.              (line  221)
* USE_LOAD_PRE_DECREMENT:                Costs.              (line  236)
* USE_LOAD_PRE_INCREMENT:                Costs.              (line  231)
* use_param:                             GTY Options.        (line  114)
* use_paramN:                            GTY Options.        (line  132)
* use_params:                            GTY Options.        (line  140)
* USE_SELECT_SECTION_FOR_FUNCTIONS:      Sections.           (line  194)
* USE_STORE_POST_DECREMENT:              Costs.              (line  246)
* USE_STORE_POST_INCREMENT:              Costs.              (line  241)
* USE_STORE_PRE_DECREMENT:               Costs.              (line  256)
* USE_STORE_PRE_INCREMENT:               Costs.              (line  251)
* used:                                  Flags.              (line  314)
* used, in symbol_ref:                   Flags.              (line  197)
* user:                                  GTY Options.        (line  301)
* user gc:                               User GC.            (line    6)
* USER_LABEL_PREFIX:                     Instruction Output. (line  154)
* USING_STMT:                            Statements for C++. (line    6)
* usmaddMN4 instruction pattern:         Standard Names.     (line  462)
* usmsubMN4 instruction pattern:         Standard Names.     (line  486)
* usmulhisi3 instruction pattern:        Standard Names.     (line  430)
* usmulM3 instruction pattern:           Standard Names.     (line  269)
* usmulqihi3 instruction pattern:        Standard Names.     (line  430)
* usmulsidi3 instruction pattern:        Standard Names.     (line  430)
* usnegM2 instruction pattern:           Standard Names.     (line  532)
* USQmode:                               Machine Modes.      (line  132)
* ussubM3 instruction pattern:           Standard Names.     (line  269)
* usum_widenM3 instruction pattern:      Standard Names.     (line  345)
* UTAmode:                               Machine Modes.      (line  172)
* UTQmode:                               Machine Modes.      (line  140)
* V in constraint:                       Simple Constraints. (line   43)
* VA_ARG_EXPR:                           Unary and Binary Expressions.
                                                             (line    6)
* values, returned by functions:         Scalar Return.      (line    6)
* VAR_DECL:                              Declarations.       (line    6)
* var_location:                          Debug Information.  (line   14)
* varargs implementation:                Varargs.            (line    6)
* variable:                              Declarations.       (line    6)
* Variable Location Debug Information in RTL: Debug Information.
                                                             (line    6)
* variable_size:                         GTY Options.        (line  230)
* vashlM3 instruction pattern:           Standard Names.     (line  524)
* vashrM3 instruction pattern:           Standard Names.     (line  524)
* vcondMN instruction pattern:           Standard Names.     (line  214)
* vec_concat:                            Vector Operations.  (line   28)
* vec_duplicate:                         Vector Operations.  (line   33)
* vec_extractM instruction pattern:      Standard Names.     (line  204)
* vec_initM instruction pattern:         Standard Names.     (line  209)
* vec_load_lanesMN instruction pattern:  Standard Names.     (line  166)
* VEC_LSHIFT_EXPR:                       Vectors.            (line    6)
* vec_merge:                             Vector Operations.  (line   11)
* VEC_PACK_FIX_TRUNC_EXPR:               Vectors.            (line    6)
* VEC_PACK_SAT_EXPR:                     Vectors.            (line    6)
* vec_pack_sfix_trunc_M instruction pattern: Standard Names. (line  372)
* vec_pack_ssat_M instruction pattern:   Standard Names.     (line  365)
* VEC_PACK_TRUNC_EXPR:                   Vectors.            (line    6)
* vec_pack_trunc_M instruction pattern:  Standard Names.     (line  358)
* vec_pack_ufix_trunc_M instruction pattern: Standard Names. (line  372)
* vec_pack_usat_M instruction pattern:   Standard Names.     (line  365)
* vec_perm_constM instruction pattern:   Standard Names.     (line  242)
* vec_permM instruction pattern:         Standard Names.     (line  224)
* VEC_RSHIFT_EXPR:                       Vectors.            (line    6)
* vec_select:                            Vector Operations.  (line   19)
* vec_setM instruction pattern:          Standard Names.     (line  199)
* vec_shl_M instruction pattern:         Standard Names.     (line  352)
* vec_shr_M instruction pattern:         Standard Names.     (line  352)
* vec_store_lanesMN instruction pattern: Standard Names.     (line  188)
* VEC_UNPACK_FLOAT_HI_EXPR:              Vectors.            (line    6)
* VEC_UNPACK_FLOAT_LO_EXPR:              Vectors.            (line    6)
* VEC_UNPACK_HI_EXPR:                    Vectors.            (line    6)
* VEC_UNPACK_LO_EXPR:                    Vectors.            (line    6)
* vec_unpacks_float_hi_M instruction pattern: Standard Names.
                                                             (line  394)
* vec_unpacks_float_lo_M instruction pattern: Standard Names.
                                                             (line  394)
* vec_unpacks_hi_M instruction pattern:  Standard Names.     (line  379)
* vec_unpacks_lo_M instruction pattern:  Standard Names.     (line  379)
* vec_unpacku_float_hi_M instruction pattern: Standard Names.
                                                             (line  394)
* vec_unpacku_float_lo_M instruction pattern: Standard Names.
                                                             (line  394)
* vec_unpacku_hi_M instruction pattern:  Standard Names.     (line  387)
* vec_unpacku_lo_M instruction pattern:  Standard Names.     (line  387)
* VEC_WIDEN_MULT_HI_EXPR:                Vectors.            (line    6)
* VEC_WIDEN_MULT_LO_EXPR:                Vectors.            (line    6)
* vec_widen_smult_even_M instruction pattern: Standard Names.
                                                             (line  403)
* vec_widen_smult_hi_M instruction pattern: Standard Names.  (line  403)
* vec_widen_smult_lo_M instruction pattern: Standard Names.  (line  403)
* vec_widen_smult_odd_M instruction pattern: Standard Names. (line  403)
* vec_widen_sshiftl_hi_M instruction pattern: Standard Names.
                                                             (line  412)
* vec_widen_sshiftl_lo_M instruction pattern: Standard Names.
                                                             (line  412)
* vec_widen_umult_even_M instruction pattern: Standard Names.
                                                             (line  403)
* vec_widen_umult_hi_M instruction pattern: Standard Names.  (line  403)
* vec_widen_umult_lo_M instruction pattern: Standard Names.  (line  403)
* vec_widen_umult_odd_M instruction pattern: Standard Names. (line  403)
* vec_widen_ushiftl_hi_M instruction pattern: Standard Names.
                                                             (line  412)
* vec_widen_ushiftl_lo_M instruction pattern: Standard Names.
                                                             (line  412)
* vector:                                Containers.         (line    6)
* vector operations:                     Vector Operations.  (line    6)
* VECTOR_CST:                            Constant expressions.
                                                             (line    6)
* VECTOR_STORE_FLAG_VALUE:               Misc.               (line  294)
* verify_flow_info:                      Maintaining the CFG.
                                                             (line  119)
* virtual operands:                      SSA Operands.       (line    6)
* VIRTUAL_INCOMING_ARGS_REGNUM:          Regs and Memory.    (line   59)
* VIRTUAL_OUTGOING_ARGS_REGNUM:          Regs and Memory.    (line   87)
* VIRTUAL_STACK_DYNAMIC_REGNUM:          Regs and Memory.    (line   78)
* VIRTUAL_STACK_VARS_REGNUM:             Regs and Memory.    (line   69)
* VLIW:                                  Processor pipeline description.
                                                             (line    6)
* vlshrM3 instruction pattern:           Standard Names.     (line  524)
* VMS:                                   Filesystem.         (line   37)
* VMS_DEBUGGING_INFO:                    VMS Debug.          (line    9)
* VOID_TYPE:                             Types.              (line    6)
* VOIDmode:                              Machine Modes.      (line  190)
* volatil:                               Flags.              (line  328)
* volatil, in insn, call_insn, jump_insn, code_label, barrier, and note: Flags.
                                                             (line   44)
* volatil, in label_ref and reg_label:   Flags.              (line   65)
* volatil, in mem, asm_operands, and asm_input: Flags.       (line   76)
* volatil, in reg:                       Flags.              (line   98)
* volatil, in subreg:                    Flags.              (line  170)
* volatil, in symbol_ref:                Flags.              (line  206)
* volatile memory references:            Flags.              (line  329)
* volatile, in prefetch:                 Flags.              (line  214)
* voting between constraint alternatives: Class Preferences. (line    6)
* vrotlM3 instruction pattern:           Standard Names.     (line  524)
* vrotrM3 instruction pattern:           Standard Names.     (line  524)
* walk_dominator_tree:                   SSA.                (line  254)
* walk_gimple_op:                        Statement and operand traversals.
                                                             (line   32)
* walk_gimple_seq:                       Statement and operand traversals.
                                                             (line   50)
* walk_gimple_stmt:                      Statement and operand traversals.
                                                             (line   13)
* walk_use_def_chains:                   SSA.                (line  230)
* WCHAR_TYPE:                            Type Layout.        (line  209)
* WCHAR_TYPE_SIZE:                       Type Layout.        (line  217)
* which_alternative:                     Output Statement.   (line   59)
* WHILE_BODY:                            Statements for C++. (line    6)
* WHILE_COND:                            Statements for C++. (line    6)
* WHILE_STMT:                            Statements for C++. (line    6)
* whopr:                                 LTO.                (line    6)
* WIDEST_HARDWARE_FP_SIZE:               Type Layout.        (line  154)
* window_save instruction pattern:       Standard Names.     (line 1513)
* WINT_TYPE:                             Type Layout.        (line  222)
* word_mode:                             Machine Modes.      (line  336)
* WORD_REGISTER_OPERATIONS:              Misc.               (line   54)
* WORDS_BIG_ENDIAN:                      Storage Layout.     (line   29)
* WORDS_BIG_ENDIAN, effect on subreg:    Regs and Memory.    (line  217)
* wpa:                                   LTO.                (line    6)
* X in constraint:                       Simple Constraints. (line  124)
* x-HOST:                                Host Fragment.      (line    6)
* XCmode:                                Machine Modes.      (line  197)
* XCOFF_DEBUGGING_INFO:                  DBX Options.        (line   13)
* XEXP:                                  Accessors.          (line    6)
* XF_SIZE:                               Type Layout.        (line  138)
* XFmode:                                Machine Modes.      (line   79)
* XINT:                                  Accessors.          (line    6)
* xm-MACHINE.h <1>:                      Host Misc.          (line    6)
* xm-MACHINE.h:                          Filesystem.         (line    6)
* xor:                                   Arithmetic.         (line  168)
* xor, canonicalization of:              Insn Canonicalizations.
                                                             (line   79)
* xorM3 instruction pattern:             Standard Names.     (line  269)
* XSTR:                                  Accessors.          (line    6)
* XVEC:                                  Accessors.          (line   41)
* XVECEXP:                               Accessors.          (line   48)
* XVECLEN:                               Accessors.          (line   44)
* XWINT:                                 Accessors.          (line    6)
* zero_extend:                           Conversions.        (line   28)
* zero_extendMN2 instruction pattern:    Standard Names.     (line  913)
* zero_extract:                          Bit-Fields.         (line   30)
* zero_extract, canonicalization of:     Insn Canonicalizations.
                                                             (line   88)



Tag Table:
Node: Top1854
Node: Contributing4942
Node: Portability5683
Node: Interface7471
Node: Libgcc10511
Node: Integer library routines12352
Node: Soft float library routines19194
Node: Decimal float library routines31131
Node: Fixed-point fractional library routines46888
Node: Exception handling routines147286
Node: Miscellaneous routines148393
Node: Languages150513
Node: Source Tree152062
Node: Configure Terms152644
Node: Top Level155602
Node: gcc Directory159176
Node: Subdirectories160126
Node: Configuration162293
Node: Config Fragments163013
Node: System Config164242
Node: Configuration Files165178
Node: Build168003
Node: Makefile168415
Ref: Makefile-Footnote-1175218
Ref: Makefile-Footnote-2175363
Node: Library Files175435
Node: Headers175997
Node: Documentation178080
Node: Texinfo Manuals178939
Node: Man Page Generation181272
Node: Miscellaneous Docs183187
Node: Front End184581
Node: Front End Directory188274
Node: Front End Config189594
Node: Front End Makefile192420
Node: Back End196202
Node: Testsuites199999
Node: Test Idioms200930
Node: Test Directives204327
Node: Directives204854
Node: Selectors215164
Node: Effective-Target Keywords216522
Ref: arm_neon_ok224081
Ref: arm_neonv2_ok224239
Ref: arm_neon_fp16_ok224411
Node: Add Options234212
Node: Require Support235409
Node: Final Actions237916
Node: Ada Tests243083
Node: C Tests244415
Node: libgcj Tests248838
Node: LTO Testing249965
Node: gcov Testing251612
Node: profopt Testing254599
Node: compat Testing256314
Node: Torture Tests260554
Node: Options262171
Node: Option file format262611
Node: Option properties269601
Node: Passes282480
Node: Parsing pass283224
Node: Gimplification pass286754
Node: Pass manager288587
Node: Tree SSA passes290381
Node: RTL passes312853
Node: RTL325984
Node: RTL Objects328172
Node: RTL Classes332046
Node: Accessors337044
Node: Special Accessors339438
Node: Flags345208
Node: Machine Modes359932
Node: Constants372244
Node: Regs and Memory378974
Node: Arithmetic396875
Node: Comparisons406965
Node: Bit-Fields411257
Node: Vector Operations412809
Node: Conversions414691
Node: RTL Declarations419189
Node: Side Effects420010
Node: Incdec436610
Node: Assembler439945
Node: Debug Information441490
Node: Insns442688
Node: Calls469182
Node: Sharing471775
Node: Reading RTL474885
Node: GENERIC475877
Node: Deficiencies477750
Node: Tree overview477991
Node: Macros and Functions482118
Node: Identifiers482943
Node: Containers484554
Node: Types485711
Node: Declarations497807
Node: Working with declarations498302
Node: Internal structure503908
Node: Current structure hierarchy504292
Node: Adding new DECL node types506386
Node: Attributes510459
Node: Expression trees511704
Node: Constant expressions513457
Node: Storage References517676
Node: Unary and Binary Expressions521195
Node: Vectors541057
Node: Statements545784
Node: Basic Statements546304
Node: Blocks550811
Node: Statement Sequences552215
Node: Empty Statements552548
Node: Jumps553122
Node: Cleanups553775
Node: OpenMP555543
Node: Functions561383
Node: Function Basics561854
Node: Function Properties565539
Node: Language-dependent trees568321
Node: C and C++ Trees569207
Node: Types for C++572111
Node: Namespaces577089
Node: Classes580196
Node: Functions for C++585274
Node: Statements for C++591527
Node: C++ Expressions599575
Node: Java Trees601076
Node: GIMPLE601189
Node: Tuple representation604810
Node: GIMPLE instruction set613086
Node: GIMPLE Exception Handling614754
Node: Temporaries616668
Ref: Temporaries-Footnote-1617983
Node: Operands618046
Node: Compound Expressions618808
Node: Compound Lvalues619042
Node: Conditional Expressions619804
Node: Logical Operators620462
Node: Manipulating GIMPLE statements627219
Node: Tuple specific accessors633153
Node: `GIMPLE_ASM'633972
Node: `GIMPLE_ASSIGN'636605
Node: `GIMPLE_BIND'640711
Node: `GIMPLE_CALL'642518
Node: `GIMPLE_CATCH'646788
Node: `GIMPLE_COND'647932
Node: `GIMPLE_DEBUG'650720
Node: `GIMPLE_EH_FILTER'654103
Node: `GIMPLE_LABEL'655591
Node: `GIMPLE_NOP'656566
Node: `GIMPLE_OMP_ATOMIC_LOAD'656935
Node: `GIMPLE_OMP_ATOMIC_STORE'657845
Node: `GIMPLE_OMP_CONTINUE'658484
Node: `GIMPLE_OMP_CRITICAL'659834
Node: `GIMPLE_OMP_FOR'660771
Node: `GIMPLE_OMP_MASTER'664286
Node: `GIMPLE_OMP_ORDERED'664669
Node: `GIMPLE_OMP_PARALLEL'665069
Node: `GIMPLE_OMP_RETURN'667841
Node: `GIMPLE_OMP_SECTION'668491
Node: `GIMPLE_OMP_SECTIONS'669157
Node: `GIMPLE_OMP_SINGLE'670763
Node: `GIMPLE_PHI'671700
Node: `GIMPLE_RESX'672986
Node: `GIMPLE_RETURN'673705
Node: `GIMPLE_SWITCH'674273
Node: `GIMPLE_TRY'676073
Node: `GIMPLE_WITH_CLEANUP_EXPR'677863
Node: GIMPLE sequences678746
Node: Sequence iterators681952
Node: Adding a new GIMPLE statement code690408
Node: Statement and operand traversals691684
Node: Tree SSA694284
Node: Annotations696070
Node: SSA Operands696596
Node: SSA711127
Node: Alias analysis723247
Node: Memory model727027
Node: Loop Analysis and Representation728390
Node: Loop representation729571
Node: Loop querying736491
Node: Loop manipulation739324
Node: LCSSA741692
Node: Scalar evolutions743764
Node: loop-iv747008
Node: Number of iterations748934
Node: Dependency analysis751743
Node: Lambda758111
Node: Omega759782
Node: Control Flow761347
Node: Basic Blocks763113
Node: Edges768404
Node: Profile information777036
Node: Maintaining the CFG781720
Node: Liveness information787582
Node: Machine Desc789708
Node: Overview792271
Node: Patterns794312
Node: Example797750
Node: RTL Template799185
Node: Output Template809840
Node: Output Statement813805
Node: Predicates818144
Node: Machine-Independent Predicates821062
Node: Defining Predicates826007
Node: Constraints831972
Node: Simple Constraints833454
Node: Multi-Alternative846310
Node: Class Preferences849151
Node: Modifiers850043
Node: Machine Constraints854289
Node: Disable Insn Alternatives904339
Node: Define Constraints907241
Node: C Constraint Interface914028
Node: Standard Names917669
Ref: shift patterns940220
Ref: prologue instruction pattern985160
Ref: window_save instruction pattern985653
Ref: epilogue instruction pattern985928
Node: Pattern Ordering1003499
Node: Dependent Patterns1004735
Node: Jump Patterns1006355
Ref: Jump Patterns-Footnote-11008499
Node: Looping Patterns1008545
Node: Insn Canonicalizations1013273
Node: Expander Definitions1017864
Node: Insn Splitting1026076
Node: Including Patterns1035678
Node: Peephole Definitions1037458
Node: define_peephole1038711
Node: define_peephole21045042
Node: Insn Attributes1048109
Node: Defining Attributes1049215
Ref: define_enum_attr1052426
Node: Expressions1053461
Node: Tagging Insns1060210
Node: Attr Example1064563
Node: Insn Lengths1066937
Node: Constant Attributes1069996
Node: Delay Slots1071165
Node: Processor pipeline description1074389
Ref: Processor pipeline description-Footnote-11093202
Node: Conditional Execution1093524
Node: Define Subst1096586
Node: Define Subst Example1098620
Node: Define Subst Pattern Matching1101614
Node: Define Subst Output Template1102839
Node: Constant Definitions1104909
Ref: define_enum1108691
Node: Iterators1109179
Node: Mode Iterators1109757
Node: Defining Mode Iterators1110735
Node: Substitutions1112229
Node: Examples1114470
Node: Code Iterators1115918
Node: Int Iterators1118197
Node: Subst Iterators1120655
Node: Target Macros1122347
Node: Target Structure1125435
Node: Driver1127550
Node: Run-time Target1146333
Node: Per-Function Data1155486
Node: Storage Layout1158251
Node: Type Layout1184326
Node: Registers1199653
Node: Register Basics1200627
Node: Allocation Order1206132
Node: Values in Registers1208578
Node: Leaf Functions1216067
Node: Stack Registers1218925
Node: Register Classes1220197
Node: Old Constraints1250202
Node: Stack and Calling1257354
Node: Frame Layout1257888
Node: Exception Handling1268768
Node: Stack Checking1274990
Node: Frame Registers1279803
Node: Elimination1288062
Node: Stack Arguments1292291
Node: Register Arguments1299153
Node: Scalar Return1319469
Node: Aggregate Return1325555
Node: Caller Saves1329765
Node: Function Entry1330943
Node: Profiling1342047
Node: Tail Calls1343746
Node: Stack Smashing Protection1345649
Node: Varargs1347277
Node: Trampolines1353973
Node: Library Calls1360016
Node: Addressing Modes1364955
Node: Anchored Addresses1384989
Node: Condition Code1387638
Node: CC0 Condition Codes1389767
Node: MODE_CC Condition Codes1393013
Node: Cond Exec Macros1399534
Node: Costs1399880
Node: Scheduling1416349
Node: Sections1435755
Node: PIC1451453
Node: Assembler Format1453513
Node: File Framework1454651
Ref: TARGET_HAVE_SWITCHABLE_BSS_SECTIONS1461592
Node: Data Output1464857
Node: Uninitialized Data1472633
Node: Label Output1477644
Node: Initialization1500612
Node: Macros for Initialization1506574
Node: Instruction Output1513297
Node: Dispatch Tables1523799
Node: Exception Region Output1528177
Node: Alignment Output1534860
Node: Debugging Info1539405
Node: All Debuggers1540075
Node: DBX Options1542930
Node: DBX Hooks1548379
Node: File Names and DBX1549688
Node: SDB and DWARF1551800
Node: VMS Debug1557872
Node: Floating Point1558459
Node: Mode Switching1562935
Node: Target Attributes1566931
Node: Emulated TLS1575245
Node: MIPS Coprocessors1578635
Node: PCH Target1579932
Node: C++ ABI1581774
Node: Named Address Spaces1586566
Node: Misc1591505
Ref: TARGET_SHIFT_TRUNCATION_MASK1598247
Node: Host Config1643413
Node: Host Common1644481
Node: Filesystem1646860
Node: Host Misc1650975
Node: Fragments1653424
Node: Target Fragment1654619
Node: Host Fragment1665252
Node: Collect21665492
Node: Header Dirs1668128
Node: Type Information1669551
Node: GTY Options1672774
Node: User GC1687095
Node: GGC Roots1690822
Node: Files1691538
Node: Invoking the garbage collector1694245
Node: Troubleshooting1695748
Node: Plugins1696824
Node: Plugins loading1697942
Node: Plugin API1698811
Node: Plugins pass1705840
Node: Plugins GC1707809
Node: Plugins description1709469
Node: Plugins attr1710004
Node: Plugins recording1711889
Node: Plugins gate1712739
Node: Plugins tracking1713330
Node: Plugins building1713918
Node: LTO1715704
Node: LTO Overview1716565
Node: LTO object file layout1722397
Node: IPA1727029
Node: WHOPR1735994
Node: Internal flags1740685
Node: Funding1741897
Node: GNU Project1744380
Node: Copying1745029
Node: GNU Free Documentation License1782560
Node: Contributors1807700
Node: Option Index1845105
Node: Concept Index1845909

End Tag Table
