This is doc/gccint.info, produced by makeinfo version 4.13 from
/mnt/jenkins/workspace/linaro-android_toolchain-4.7-2013.07/build/objdir/../build/../gcc/gcc-linaro-4.7-2013.07/gcc/doc/gccint.texi.

Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2010 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, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2010 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
(Linaro GCC 4.7-2013.07) version 4.7.4.  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.

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

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

`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 `cp' (for C++), `lto' (for LTO), `objc' (for
     Objective-C) and `objcp' (for Objective-C++) 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.

`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.texi'
`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', `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.  In
addition the main directory contains `c-config-lang.in', which contains
limited information for the C language.  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

   * 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.  Use
`*-*-*' to match any target.

 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.

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

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

`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'
     Removes Fortran module files generated for this test.

`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 associated
     macros are called `OPTION_MASK_NAME' and `OPTION_NAME'
     respectively.

     You can disable automatic bit allocation using `MaskExists'.

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

`MaskExists'
     The mask specified by the `Mask' property already exists.  No
     `MASK' or `TARGET' definitions should be added to `options.h' in
     response to this option record.

     The main purpose of this property is to support synonymous options.
     The first option should use `Mask(NAME)' and the others should use
     `Mask(NAME) MaskExists'.

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



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, 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
          pass.  Pseudo-registers spilled by the allocator or the
          reload have still a chance to get hard-registers if the
          reload 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.

   * 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 transfered
     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 `HOST_WIDE_INT'
     must be sign extended to full width (e.g., with `gen_int_mode').

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

     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 VEC1 VEC2)'
     Describes a vector concat operation.  The result is a
     concatenation of the vectors VEC1 and VEC2; its length is the sum
     of the lengths of the two inputs.

`(vec_duplicate:M VEC)'
     This operation converts 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, 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' and `clobber'
     expressions that denote hard registers and `MEM's used or
     clobbered by the called function.

     A `MEM' generally points to a stack slots 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.

     `CLOBBER'ed registers in this list augment registers specified in
     `CALL_USED_REGISTERS' (*note Register Basics::).

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

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

`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 operand with either be both of
     integral type or both of floating type.  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.

     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.


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_PTRMEM_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_PTRMEM_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 (unsigned nlabels, tree
          index, tree default_label, ...)
     Build a `GIMPLE_SWITCH' statement.  `NLABELS' are the number of
     labels excluding the default label.  The default label is passed
     in `DEFAULT_LABEL'.  The rest of the arguments are trees
     representing the labels.  Each label is a tree of code
     `CASE_LABEL_EXPR'.

 -- GIMPLE function: gimple gimple_build_switch_vec (tree index, tree
          default_label, `VEC'(tree,heap) *args)
     This function is an alternate way of building `GIMPLE_SWITCH'
     statements.  `INDEX' and `DEFAULT_LABEL' are as in
     gimple_build_switch.  `ARGS' is a vector of `CASE_LABEL_EXPR' trees
     that contain the labels.

 -- 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).  On the other hand, if your pass
exposes a new symbol that should be put in SSA form for the first time,
the new symbol should be registered with `mark_sym_for_renaming'.

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

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

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

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

 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, and are not
elements of the `BASIC_BLOCK' array.  Therefore they have been assigned
unique, negative index numbers.

 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 (`tree' and RTL), there are
pointers to the head and end of a basic block for both representations.

 For RTL, these pointers are `rtx head, end'.  In the RTL function
representation, the head pointer always points either to a
`NOTE_INSN_BASIC_BLOCK' or to a `CODE_LABEL', if present.  In the RTL
representation of a function, the instruction stream contains not only
the "real" instructions, but also "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, making such updates difficult.   The
`NOTE_INSN_BASIC_BLOCK' note is the only kind of note that may appear
in the instruction stream contained in a basic block.  The instruction
stream of a basic block always follows a `NOTE_INSN_BASIC_BLOCK',  but
zero or more `CODE_LABEL' nodes can precede the block note.   A basic
block ends by control flow instruction or last instruction before
following `CODE_LABEL' or `NOTE_INSN_BASIC_BLOCK'.  A `CODE_LABEL'
cannot appear in 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 `tree' representation, the head and end of the basic block are
being pointed to by the `stmt_list' field, but this special `tree'
should never be referenced directly.  Instead, at the tree level
abstract containers and iterators are used to access statements and
expressions in basic blocks.  These iterators are called "block
statement iterators" (BSIs).  Grep for `^bsi' in the various `tree-*'
files.  The following snippet will pretty-print all the statements of
the program in the GIMPLE representation.

     FOR_EACH_BB (bb)
       {
          block_stmt_iterator si;

          for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si))
            {
               tree stmt = bsi_stmt (si);
               print_generic_stmt (stderr, stmt, 0);
            }
       }


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, 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 `tree' 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.  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 `tree' 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 `tree'
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).  Often the CFG may be better viewed as
integral part of instruction chain, than structure built on the top of
it.  However, in principle the control flow graph for the `tree'
representation is _not_ an integral part of the representation, in that
a function tree may be expanded without first building a  flow graph
for the `tree' representation at all.  This happens when compiling
without any `tree' optimization enabled.  When the `tree' optimizations
are enabled and the instruction stream is rewritten in SSA form, the
CFG is very tightly coupled with the instruction stream.  In
particular, statement insertion and removal has to be done with care.
In fact, the whole `tree' representation can not be easily used or
maintained without proper maintenance of the CFG simultaneously.

 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 `tree' representation, the function `bb_for_stmt'
returns a pointer to the basic block containing the queried statement.

 When changes need to be applied to a function in its `tree'
representation, "block 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 `block_stmt_iterator' data structure and several modifier are
available, including the following:

`bsi_start'
     This function initializes a `block_stmt_iterator' that points to
     the first non-empty statement in a basic block.

`bsi_last'
     This function initializes a `block_stmt_iterator' that points to
     the last statement in a basic block.

`bsi_end_p'
     This predicate is `true' if a `block_stmt_iterator' represents the
     end of a basic block.

`bsi_next'
     This function takes a `block_stmt_iterator' and makes it point to
     its successor.

`bsi_prev'
     This function takes a `block_stmt_iterator' and makes it point to
     its predecessor.

`bsi_insert_after'
     This function inserts a statement after the `block_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.

`bsi_insert_before'
     This function inserts a statement before the `block_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.

`bsi_remove'
     This function removes the `block_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 `tree' representation, the equivalent
functions are `bsi_insert_on_edge' which inserts a block statement
iterator on an edge, and `bsi_commit_edge_inserts' which flushes the
instruction to actual instruction stream.

 While debugging the optimization pass, a `verify_flow_info' function
may be useful to find bugs in the control flow graph updating code.

 Note that at present, the representation of control flow in the `tree'
representation is discarded before expanding to RTL.  Long term the CFG
should be maintained and "expanded" to the RTL representation along
with the function `tree' itself.

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


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.
* Disable Insn Alternatives:: Disable insn alternatives using the `enabled' attribute.
* Machine Constraints:: Existing constraints for some particular machines.
* 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: Disable Insn Alternatives,  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.

     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: Define Constraints,  Prev: Disable Insn Alternatives,  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/arm.h'_

    `f'
          Floating-point register

    `w'
          VFP floating-point register

    `F'
          One of the floating-point constants 0.0, 0.5, 1.0, 2.0, 3.0,
          4.0, 5.0 or 10.0

    `G'
          Floating-point constant that would satisfy the constraint `F'
          if it were negated

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

    `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

    `M'
          A constant in the range supported by `movrcc' instructions

    `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

    `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

    `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: Machine Constraints,  Prev: Modifiers,  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: Machine Constraints,  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.  All operands must have mode M.  This pattern
     is used to implement the `fma', `fmaf', and `fmal' builtin
     functions from the ISO C99 standard.  The `fma' operation may
     produce different results than doing the multiply followed by the
     add if the machine does not perform a rounding step between the
     operations.

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

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

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

`extzv'
     Like `extv' except that the bit-field value is zero-extended.

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

`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
     true, 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.  *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'
     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 transfered
     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 from moving instructions across the boundary defined by
     the blockage insn.  Normally an UNSPEC_VOLATILE pattern.

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

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

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

 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.  Test the flags `very_likely', `likely',
     `very_unlikely', and `unlikely' to determine if a conditional
     branch is expected to be taken.

     If the `very_likely' flag is true, then the `likely' flag is also
     true.  Likewise for the `very_unlikely' and `unlikely' flags.

     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.

     The `very_likely' and `likely' flags are true if the `insn' being
     scheduled is not a conditional branch.  The `very_unlikely' and
     `unlikely' flags are false if the `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: Constant Definitions,  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: Constant Definitions,  Next: Iterators,  Prev: Conditional Execution,  Up: Machine Desc

16.21 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.22 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.


File: gccint.info,  Node: Mode Iterators,  Next: Code Iterators,  Up: Iterators

16.22.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.22.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.22.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.22.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.22.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,  Prev: Code Iterators,  Up: Iterators

16.22.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: 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.

 -- Macro: LINK_ELIMINATE_DUPLICATE_LDIRECTORIES
     A nonzero value causes `collect2' to remove duplicate
     `-LDIRECTORY' search directories from linking commands.  Do not
     give it a nonzero value if removing duplicate search directories
     changes the linker's semantics.

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

 -- Macro: MEMBER_TYPE_FORCES_BLK (FIELD, MODE)
     Return 1 if a structure 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
     `init_decl_processing' in the file `c-decl.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: 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.  Only use this target hook to some
     other expression if pseudos allocated by `local-alloc.c' end up in
     memory because their hard registers were needed for spill
     registers.  If this target hook returns `false' for those classes,
     those pseudos will only be allocated by `global.c', which knows
     how to reallocate the pseudo to another register.  If there would
     not be another register available for reallocation, you should not
     change the implementation of this target hook since the only
     effect of such implementation would be to slow down register
     allocation.

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


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 `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 the
     variable `current_function_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
     `current_function_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 `current_function_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
     `current_function_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.

 -- Macro: DELAY_SLOTS_FOR_EPILOGUE
     Define this macro if the function epilogue contains delay slots to
     which instructions from the rest of the function can be "moved".
     The definition should be a C expression whose value is an integer
     representing the number of delay slots there.

 -- Macro: ELIGIBLE_FOR_EPILOGUE_DELAY (INSN, N)
     A C expression that returns 1 if INSN can be placed in delay slot
     number N of the epilogue.

     The argument N is an integer which identifies the delay slot now
     being considered (since different slots may have different rules of
     eligibility).  It is never negative and is always less than the
     number of epilogue delay slots (what `DELAY_SLOTS_FOR_EPILOGUE'
     returns).  If you reject a particular insn for a given delay slot,
     in principle, it may be reconsidered for a subsequent delay slot.
     Also, other insns may (at least in principle) be considered for
     the so far unfilled delay slot.

     The insns accepted to fill the epilogue delay slots are put in an
     RTL list made with `insn_list' objects, stored in the variable
     `current_function_epilogue_delay_list'.  The insn for the first
     delay slot comes first in the list.  Your definition of the macro
     `TARGET_ASM_FUNCTION_EPILOGUE' should fill the delay slots by
     outputting the insns in this list, usually by calling
     `final_scan_insn'.

     You need not define this macro if you did not define
     `DELAY_SLOTS_FOR_EPILOGUE'.

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


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 tree expression 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.  The compiler has standard ways of doing so in all cases.
     In fact, 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)
     This hook returns `true' if memory address ADDR 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'.

 -- Macro: GO_IF_MODE_DEPENDENT_ADDRESS (ADDR, LABEL)
     A C statement or compound statement with a conditional `goto
     LABEL;' executed if memory address X (an RTX) 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.

     These are obsolete macros, replaced by the
     `TARGET_MODE_DEPENDENT_ADDRESS_P' target hook.

 -- 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: 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: tree TARGET_VECTORIZE_BUILTIN_MUL_WIDEN_EVEN (tree X)
     This hook should return the DECL of a function F that implements
     widening multiplication of the even elements of two input vectors
     of type X.

     If this hook is defined, the autovectorizer will use it along with
     the `TARGET_VECTORIZE_BUILTIN_MUL_WIDEN_ODD' target hook when
     vectorizing widening multiplication in cases that the order of the
     results does not have to be preserved (e.g. used only by a
     reduction computation). Otherwise, the `widen_mult_hi/lo' idioms
     will be used.

 -- Target Hook: tree TARGET_VECTORIZE_BUILTIN_MUL_WIDEN_ODD (tree X)
     This hook should return the DECL of a function F that implements
     widening multiplication of the odd elements of two input vectors
     of type X.

     If this hook is defined, the autovectorizer will use it along with
     the `TARGET_VECTORIZE_BUILTIN_MUL_WIDEN_EVEN' target hook when
     vectorizing widening multiplication in cases that the order of the
     results does not have to be preserved (e.g. used only by a
     reduction computation). Otherwise, the `widen_mult_hi/lo' idioms
     will be used.

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

 -- Macro: CANONICALIZE_COMPARISON (CODE, OP0, OP1)
     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, define this macro to be a C statement 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.  You should modify CODE, OP0, and OP1 as required.

     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 define this macro 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.

 -- Macro: REVERSE_CONDEXEC_PREDICATES_P (OP1, OP2)
     A C expression that returns true if the conditional execution
     predicate OP1, a comparison operation, is the inverse of OP2 and
     vice versa.  Define this to return 0 if the target has conditional
     execution predicates that cannot be reversed safely.  There is no
     need to validate that the arguments of op1 and op2 are the same,
     this is done separately.  If no expansion is specified, this macro
     is defined as follows:

          #define REVERSE_CONDEXEC_PREDICATES_P (x, y) \
             (GET_CODE ((x)) == reversed_comparison_code ((y), NULL))

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

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

 -- Macro: ASM_OUTPUT_IDENT (STREAM, STRING)
     A C statement to output something to the assembler file to handle a
     `#ident' directive containing the text STRING.  If this macro is
     not defined, nothing is output for a `#ident' directive.

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

 -- Macro: ASM_DECLARE_CLASS_REFERENCE (STREAM, NAME)
     A C statement (sans semicolon) to output to the stdio stream
     STREAM commands to declare that the label NAME is an Objective-C
     class reference.  This is only needed for targets whose linkers
     have special support for NeXT-style runtimes.

 -- Macro: ASM_DECLARE_UNRESOLVED_REFERENCE (STREAM, NAME)
     A C statement (sans semicolon) to output to the stdio stream
     STREAM commands to declare that the label NAME is an unresolved
     Objective-C class reference.  This is only needed for targets
     whose linkers have special support for NeXT-style runtimes.


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 either `UNALIGNED_INT_ASM_OP' or
     `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: 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_LBRAC (STREAM, NAME)
     Define this macro to say how to output to STREAM the debugging
     information for the start of a scope level for variable names.  The
     argument NAME is the name of an assembler symbol (for use with
     `assemble_name') whose value is the address where the scope begins.

 -- Macro: DBX_OUTPUT_RBRAC (STREAM, NAME)
     Like `DBX_OUTPUT_LBRAC', but for the end of a scope level.

 -- Macro: DBX_OUTPUT_NFUN (STREAM, LSCOPE_LABEL, DECL)
     Define this macro if the target machine requires special handling
     to output an `N_FUN' entry for the function DECL.

 -- 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: REAL_VALUE_TYPE REAL_VALUE_TRUNCATE (REAL_VALUE_TYPE MODE,
          enum machine_mode X)
     Truncates the floating point value X to fit in MODE.  The return
     value is still a full-size `REAL_VALUE_TYPE', but it has an
     appropriate bit pattern to be output as a floating constant whose
     precision accords with mode MODE.

 -- 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 (MODE, INSN)
     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 the `attribute(option("..."))', and
     it allows the function to set different target machine compile time
     options for the current function that might be different than 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 option' to
     set the machine specific options for functions that occur later in
     the input stream.  The options should be the same as 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_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.

 -- Macro: ALL_COP_ADDITIONAL_REGISTER_NAMES
     A comma-separated list (with leading comma) of pairs describing the
     alternate names of coprocessor registers.  The format of each
     entry should be
          { ALTERNATENAME, REGISTER_NUMBER}
     Default: empty.


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: CASE_USE_BIT_TESTS
     Define this macro to be a C expression to indicate whether C switch
     statements may be implemented by a sequence of bit tests.  This is
     advantageous on processors that can efficiently implement left
     shift of 1 by the number of bits held in a register, but
     inappropriate on targets that would require a loop.  By default,
     this macro returns `true' if the target defines an `ashlsi3'
     pattern, and `false' otherwise.

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

 -- Macro: FIXUNS_TRUNC_LIKE_FIX_TRUNC
     Define this macro if the same instructions that convert a floating
     point number to a signed fixed point number also convert validly
     to an unsigned one.

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

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

 -- Target Hook: bool TARGET_HANDLE_PRAGMA_EXTERN_PREFIX
     True if `#pragma extern_prefix' is to be supported.

 -- 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: 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: 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_INIT_EXTRA_FIELDS (CE_INFO)
     A C expression to initialize any extra fields in a `struct
     ce_if_block' structure, which are defined by the
     `IFCVT_EXTRA_FIELDS' macro.

 -- Macro: IFCVT_EXTRA_FIELDS
     If defined, it should expand to a set of field declarations that
     will be added to the `struct ce_if_block' structure.  These should
     be initialized by the `IFCVT_INIT_EXTRA_FIELDS' macro.

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

 -- 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_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_leaf_function' in
     the hook, functions that use `REG_N_SETS', 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 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_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' and `union'
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.

* Menu:

* GTY Options::         What goes inside a `GTY(())'.
* 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: GGC Roots,  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.  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;

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


File: gccint.info,  Node: GGC Roots,  Next: Files,  Prev: GTY Options,  Up: Type Information

22.2 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.3 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'.  For C, the file is `c-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.4 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 it 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.5 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
**********

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.

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

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

       ...
     }

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

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.

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.

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.

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.

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.

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

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.

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.

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.

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

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
     continuously 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
     since the late 1980s.

   * 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 for GCC 3.x.

   * 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:                               LTO.                 (line 499)
* fltrans-output-list:                   LTO.                 (line 504)
* fwpa:                                  LTO.                 (line 490)
* 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  381)
* % 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  537)
* 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  975)
* 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_COP_ADDITIONAL_REGISTER_NAMES:     MIPS Coprocessors.  (line   32)
* ALL_REGS:                              Register Classes.   (line   17)
* allocate_stack instruction pattern:    Standard Names.     (line 1299)
* alternate entry points:                Insns.              (line  140)
* 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  512)
* ashrM3 instruction pattern:            Standard Names.     (line  522)
* ASM_APP_OFF:                           File Framework.     (line   78)
* ASM_APP_ON:                            File Framework.     (line   71)
* ASM_COMMENT_START:                     File Framework.     (line   66)
* ASM_DECLARE_CLASS_REFERENCE:           Label Output.       (line  465)
* ASM_DECLARE_FUNCTION_NAME:             Label Output.       (line   99)
* ASM_DECLARE_FUNCTION_SIZE:             Label Output.       (line  114)
* ASM_DECLARE_OBJECT_NAME:               Label Output.       (line  127)
* ASM_DECLARE_REGISTER_GLOBAL:           Label Output.       (line  156)
* ASM_DECLARE_UNRESOLVED_REFERENCE:      Label Output.       (line  471)
* ASM_FINAL_SPEC:                        Driver.             (line   82)
* ASM_FINISH_DECLARE_OBJECT:             Label Output.       (line  164)
* ASM_FORMAT_PRIVATE_NAME:               Label Output.       (line  383)
* asm_fprintf:                           Instruction Output. (line  151)
* ASM_FPRINTF_EXTENSIONS:                Instruction Output. (line  162)
* ASM_GENERATE_INTERNAL_LABEL:           Label Output.       (line  367)
* 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  308)
* 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  355)
* ASM_OUTPUT_DEF:                        Label Output.       (line  404)
* ASM_OUTPUT_DEF_FROM_DECLS:             Label Output.       (line  412)
* 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  284)
* ASM_OUTPUT_FDESC:                      Data Output.        (line   60)
* ASM_OUTPUT_FUNCTION_LABEL:             Label Output.       (line   17)
* ASM_OUTPUT_IDENT:                      File Framework.     (line  109)
* ASM_OUTPUT_INTERNAL_LABEL:             Label Output.       (line   29)
* ASM_OUTPUT_LABEL:                      Label Output.       (line    9)
* ASM_OUTPUT_LABEL_REF:                  Label Output.       (line  328)
* ASM_OUTPUT_LABELREF:                   Label Output.       (line  306)
* 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  321)
* ASM_OUTPUT_TYPE_DIRECTIVE:             Label Output.       (line   89)
* ASM_OUTPUT_WEAK_ALIAS:                 Label Output.       (line  430)
* ASM_OUTPUT_WEAKREF:                    Label Output.       (line  216)
* 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  208)
* ASM_WEAKEN_LABEL:                      Label Output.       (line  195)
* 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  607)
* atomic:                                GTY Options.        (line  249)
* atomic_add_fetchMODE instruction pattern: Standard Names.  (line 1723)
* atomic_addMODE instruction pattern:    Standard Names.     (line 1694)
* atomic_and_fetchMODE instruction pattern: Standard Names.  (line 1723)
* atomic_andMODE instruction pattern:    Standard Names.     (line 1694)
* atomic_compare_and_swapMODE instruction pattern: Standard Names.
                                                             (line 1630)
* atomic_exchangeMODE instruction pattern: Standard Names.   (line 1682)
* atomic_fetch_addMODE instruction pattern: Standard Names.  (line 1708)
* atomic_fetch_andMODE instruction pattern: Standard Names.  (line 1708)
* atomic_fetch_nandMODE instruction pattern: Standard Names. (line 1708)
* atomic_fetch_orMODE instruction pattern: Standard Names.   (line 1708)
* atomic_fetch_subMODE instruction pattern: Standard Names.  (line 1708)
* atomic_fetch_xorMODE instruction pattern: Standard Names.  (line 1708)
* atomic_loadMODE instruction pattern:   Standard Names.     (line 1661)
* atomic_nand_fetchMODE instruction pattern: Standard Names. (line 1723)
* atomic_nandMODE instruction pattern:   Standard Names.     (line 1694)
* atomic_or_fetchMODE instruction pattern: Standard Names.   (line 1723)
* atomic_orMODE instruction pattern:     Standard Names.     (line 1694)
* atomic_storeMODE instruction pattern:  Standard Names.     (line 1671)
* atomic_sub_fetchMODE instruction pattern: Standard Names.  (line 1723)
* atomic_subMODE instruction pattern:    Standard Names.     (line 1694)
* atomic_test_and_set instruction pattern: Standard Names.   (line 1740)
* atomic_xor_fetchMODE instruction pattern: Standard Names.  (line 1723)
* atomic_xorMODE instruction pattern:    Standard Names.     (line 1694)
* attr <1>:                              Tagging Insns.      (line   54)
* attr:                                  Expressions.        (line  175)
* 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  160)
* 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   19)
* basic_block:                           Basic Blocks.       (line    6)
* BB_HEAD, BB_END:                       Maintaining the CFG.
                                                             (line   88)
* 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 statement iterators <1>:         Maintaining the CFG.
                                                             (line   45)
* block statement iterators:             Basic Blocks.       (line   68)
* BLOCK_FOR_INSN, bb_for_stmt:           Maintaining the CFG.
                                                             (line   40)
* BLOCK_REG_PADDING:                     Register Arguments. (line  230)
* blockage instruction pattern:          Standard Names.     (line 1495)
* Blocks:                                Blocks.             (line    6)
* bool:                                  Misc.               (line  843)
* 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)
* bsi_commit_edge_inserts:               Maintaining the CFG.
                                                             (line  118)
* bsi_end_p:                             Maintaining the CFG.
                                                             (line   60)
* bsi_insert_after:                      Maintaining the CFG.
                                                             (line   72)
* bsi_insert_before:                     Maintaining the CFG.
                                                             (line   78)
* bsi_insert_on_edge:                    Maintaining the CFG.
                                                             (line  118)
* bsi_last:                              Maintaining the CFG.
                                                             (line   56)
* bsi_next:                              Maintaining the CFG.
                                                             (line   64)
* bsi_prev:                              Maintaining the CFG.
                                                             (line   68)
* bsi_remove:                            Maintaining the CFG.
                                                             (line   84)
* bsi_start:                             Maintaining the CFG.
                                                             (line   52)
* BSS_SECTION_ASM_OP:                    Sections.           (line   68)
* bswap:                                 Arithmetic.         (line  247)
* bswapM2 instruction pattern:           Standard Names.     (line  530)
* btruncM2 instruction pattern:          Standard Names.     (line  625)
* 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 1392)
* builtin_setjmp_receiver instruction pattern: Standard Names.
                                                             (line 1382)
* builtin_setjmp_setup instruction pattern: Standard Names.  (line 1371)
* 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  127)
* c_register_pragma:                     Misc.               (line  404)
* c_register_pragma_with_expansion:      Misc.               (line  406)
* call <1>:                              Side Effects.       (line   92)
* call:                                  Flags.              (line  221)
* call instruction pattern:              Standard Names.     (line 1032)
* 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 1060)
* 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 1052)
* call_value_pop instruction pattern:    Standard Names.     (line 1060)
* 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   57)
* canadian:                              Configure Terms.    (line    6)
* CANNOT_CHANGE_MODE_CLASS:              Register Classes.   (line  540)
* CANNOT_CHANGE_MODE_CLASS and subreg semantics: Regs and Memory.
                                                             (line  280)
* canonicalization of instructions:      Insn Canonicalizations.
                                                             (line    6)
* CANONICALIZE_COMPARISON:               MODE_CC Condition Codes.
                                                             (line   55)
* canonicalize_funcptr_for_compare instruction pattern: Standard Names.
                                                             (line 1230)
* CASE_USE_BIT_TESTS:                    Misc.               (line   54)
* 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 1154)
* cbranchMODE4 instruction pattern:      Standard Names.     (line 1021)
* 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  641)
* CFA_FRAME_BASE_OFFSET:                 Frame Layout.       (line  226)
* 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  191)
* chain_next:                            GTY Options.        (line  191)
* chain_prev:                            GTY Options.        (line  191)
* change_address:                        Standard Names.     (line   47)
* CHAR_TYPE_SIZE:                        Type Layout.        (line   39)
* check_stack instruction pattern:       Standard Names.     (line 1317)
* 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  528)
* 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 1790)
* 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  319)
* clzM2 instruction pattern:             Standard Names.     (line  706)
* cmpmemM instruction pattern:           Standard Names.     (line  839)
* cmpstrM instruction pattern:           Standard Names.     (line  818)
* cmpstrnM instruction pattern:          Standard Names.     (line  805)
* code generation RTL sequences:         Expander Definitions.
                                                             (line    6)
* code iterators in .md files:           Code Iterators.     (line    6)
* code_label:                            Insns.              (line  119)
* code_label and /i:                     Flags.              (line   59)
* code_label and /v:                     Flags.              (line   44)
* CODE_LABEL_NUMBER:                     Insns.              (line  119)
* codes, RTL expression:                 RTL Objects.        (line   47)
* COImode:                               Machine Modes.      (line  202)
* COLLECT2_HOST_INITIALIZATION:          Host Misc.          (line   32)
* COLLECT_EXPORT_LIST:                   Misc.               (line  742)
* 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  118)
* 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  367)
* COMPOUND_LITERAL_EXPR_DECL_EXPR:       Unary and Binary Expressions.
                                                             (line  367)
* 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   99)
* CONST0_RTX:                            Constants.          (line  119)
* const0_rtx:                            Constants.          (line   16)
* CONST1_RTX:                            Constants.          (line  119)
* const1_rtx:                            Constants.          (line   16)
* CONST2_RTX:                            Constants.          (line  119)
* const2_rtx:                            Constants.          (line   16)
* CONST_DECL:                            Declarations.       (line    6)
* const_double:                          Constants.          (line   32)
* const_double, RTL sharing:             Sharing.            (line   29)
* CONST_DOUBLE_LOW:                      Constants.          (line   39)
* 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   52)
* 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   71)
* const_string and attributes:           Expressions.        (line   20)
* const_true_rtx:                        Constants.          (line   26)
* const_vector:                          Constants.          (line   59)
* 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   16)
* 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  188)
* copy_rtx_if_shared:                    Sharing.            (line   64)
* copysignM3 instruction pattern:        Standard Names.     (line  687)
* cosM2 instruction pattern:             Standard Names.     (line  566)
* 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)
* 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  982)
* CTImode:                               Machine Modes.      (line  202)
* ctrapMM4 instruction pattern:          Standard Names.     (line 1464)
* ctz:                                   Arithmetic.         (line  231)
* CTZ_DEFINED_VALUE_AT_ZERO:             Misc.               (line  320)
* ctzM2 instruction pattern:             Standard Names.     (line  715)
* CUMULATIVE_ARGS:                       Register Arguments. (line  128)
* current_function_epilogue_delay_list:  Function Entry.     (line  181)
* current_function_is_leaf:              Leaf Functions.     (line   51)
* current_function_outgoing_args_size:   Stack Arguments.    (line   48)
* current_function_pops_args:            Function Entry.     (line  106)
* current_function_pretend_args_size:    Function Entry.     (line  112)
* 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_LBRAC:                      DBX Hooks.          (line    9)
* 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_NFUN:                       DBX Hooks.          (line   18)
* DBX_OUTPUT_NULL_N_SO_AT_MAIN_SOURCE_FILE_END: File Names and DBX.
                                                             (line   42)
* DBX_OUTPUT_RBRAC:                      DBX Hooks.          (line   15)
* DBX_OUTPUT_SOURCE_LINE:                DBX Hooks.          (line   22)
* 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  239)
* 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 1192)
* default:                               GTY Options.        (line   77)
* 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   72)
* 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)
* 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)
* DELAY_SLOTS_FOR_EPILOGUE:              Function Entry.     (line  163)
* deletable:                             GTY Options.        (line  145)
* DELETE_IF_ORDINARY:                    Filesystem.         (line   79)
* Dependent Patterns:                    Dependent Patterns. (line    6)
* desc:                                  GTY Options.        (line   77)
* 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  492)
* 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  451)
* doloop_begin instruction pattern:      Standard Names.     (line 1223)
* doloop_end instruction pattern:        Standard Names.     (line 1202)
* DONE:                                  Expander Definitions.
                                                             (line   74)
* 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   84)
* 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  118)
* EDGE_ABNORMAL:                         Edges.              (line  128)
* EDGE_ABNORMAL, EDGE_ABNORMAL_CALL:     Edges.              (line  171)
* 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 1398)
* 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)
* ELIGIBLE_FOR_EPILOGUE_DELAY:           Function Entry.     (line  169)
* 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   74)
* 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   28)
* 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 1436)
* 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  218)
* exception handling <1>:                Exception Handling. (line    6)
* exception handling:                    Edges.              (line   96)
* exception_receiver instruction pattern: Standard Names.    (line 1362)
* 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  582)
* EXPR_FILENAME:                         Working with declarations.
                                                             (line   14)
* EXPR_LINENO:                           Working with declarations.
                                                             (line   20)
* expr_list:                             Insns.              (line  546)
* 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  897)
* 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  933)
* extzv instruction pattern:             Standard Names.     (line  948)
* F in constraint:                       Simple Constraints. (line   94)
* FAIL:                                  Expander Definitions.
                                                             (line   80)
* 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  696)
* 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_scan_insn:                       Function Entry.     (line  181)
* 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  884)
* 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  864)
* FIXUNS_TRUNC_LIKE_FIX_TRUNC:           Misc.               (line  100)
* fixuns_truncMN2 instruction pattern:   Standard Names.     (line  888)
* fixunsMN2 instruction pattern:         Standard Names.     (line  873)
* 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  301)
* 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  856)
* floatunsMN2 instruction pattern:       Standard Names.     (line  860)
* FLOOR_DIV_EXPR:                        Unary and Binary Expressions.
                                                             (line    6)
* FLOOR_MOD_EXPR:                        Unary and Binary Expressions.
                                                             (line    6)
* floorM2 instruction pattern:           Standard Names.     (line  617)
* 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  281)
* fmodM3 instruction pattern:            Standard Names.     (line  548)
* fmsM4 instruction pattern:             Standard Names.     (line  290)
* fnmaM4 instruction pattern:            Standard Names.     (line  296)
* fnmsM4 instruction pattern:            Standard Names.     (line  302)
* 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  906)
* fractunsMN2 instruction pattern:       Standard Names.     (line  921)
* 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  879)
* 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  180)
* 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  356)
* 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)
* 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_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_switch_vec:               GIMPLE_SWITCH.      (line   16)
* 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   46)
* gimple_switch_index:                   GIMPLE_SWITCH.      (line   31)
* gimple_switch_label:                   GIMPLE_SWITCH.      (line   37)
* gimple_switch_num_labels:              GIMPLE_SWITCH.      (line   22)
* gimple_switch_set_default_label:       GIMPLE_SWITCH.      (line   50)
* gimple_switch_set_index:               GIMPLE_SWITCH.      (line   34)
* gimple_switch_set_label:               GIMPLE_SWITCH.      (line   42)
* gimple_switch_set_num_labels:          GIMPLE_SWITCH.      (line   27)
* 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)
* GO_IF_MODE_DEPENDENT_ADDRESS:          Addressing Modes.   (line  212)
* greater than:                          Comparisons.        (line   60)
* gsi_after_labels:                      Sequence iterators. (line   76)
* gsi_bb:                                Sequence iterators. (line   83)
* gsi_commit_edge_inserts:               Sequence iterators. (line  194)
* gsi_commit_one_edge_insert:            Sequence iterators. (line  190)
* gsi_end_p:                             Sequence iterators. (line   60)
* gsi_for_stmt:                          Sequence iterators. (line  157)
* gsi_insert_after:                      Sequence iterators. (line  147)
* gsi_insert_before:                     Sequence iterators. (line  136)
* 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:                              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:                              Sequence iterators. (line   66)
* gsi_one_before_end_p:                  Sequence iterators. (line   63)
* gsi_prev:                              Sequence iterators. (line   69)
* 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:                             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  438)
* 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  109)
* HImode:                                Machine Modes.      (line   29)
* HImode, in insn:                       Insns.              (line  272)
* 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  151)
* 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_EXTRA_FIELDS:                    Misc.               (line  582)
* IFCVT_INIT_EXTRA_FIELDS:               Misc.               (line  577)
* IFCVT_MODIFY_CANCEL:                   Misc.               (line  571)
* IFCVT_MODIFY_FINAL:                    Misc.               (line  565)
* IFCVT_MODIFY_INSN:                     Misc.               (line  559)
* IFCVT_MODIFY_MULTIPLE_TESTS:           Misc.               (line  552)
* IFCVT_MODIFY_TESTS:                    Misc.               (line  541)
* 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  334)
* 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 1150)
* 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  312)
* 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  118)
* 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 splitting:                        Insn Splitting.     (line    6)
* insn-attr.h:                           Defining Attributes.
                                                             (line   32)
* INSN_ANNULLED_BRANCH_P:                Flags.              (line   39)
* INSN_CODE:                             Insns.              (line  299)
* INSN_DELETED_P:                        Flags.              (line   44)
* INSN_FROM_TARGET_P:                    Flags.              (line   49)
* insn_list:                             Insns.              (line  546)
* INSN_REFERENCES_ARE_DELAYED:           Misc.               (line  480)
* INSN_SETS_ARE_DELAYED:                 Misc.               (line  469)
* INSN_UID:                              Insns.              (line   23)
* INSN_VAR_LOCATION:                     Insns.              (line  239)
* 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  951)
* int iterators in .md files:            Int Iterators.      (line    6)
* INT16_TYPE:                            Type Layout.        (line  244)
* INT32_TYPE:                            Type Layout.        (line  245)
* INT64_TYPE:                            Type Layout.        (line  246)
* INT8_TYPE:                             Type Layout.        (line  243)
* INT_FAST16_TYPE:                       Type Layout.        (line  260)
* INT_FAST32_TYPE:                       Type Layout.        (line  261)
* INT_FAST64_TYPE:                       Type Layout.        (line  262)
* INT_FAST8_TYPE:                        Type Layout.        (line  259)
* INT_LEAST16_TYPE:                      Type Layout.        (line  252)
* INT_LEAST32_TYPE:                      Type Layout.        (line  253)
* INT_LEAST64_TYPE:                      Type Layout.        (line  254)
* INT_LEAST8_TYPE:                       Type Layout.        (line  251)
* 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  220)
* INTPTR_TYPE:                           Type Layout.        (line  267)
* 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)
* jump:                                  Flags.              (line  286)
* jump instruction pattern:              Standard Names.     (line 1027)
* 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  140)
* LABEL_ALTERNATE_NAME:                  Edges.              (line  180)
* LABEL_DECL:                            Declarations.       (line    6)
* LABEL_KIND:                            Insns.              (line  140)
* LABEL_NUSES:                           Insns.              (line  136)
* LABEL_PRESERVE_P:                      Flags.              (line   59)
* label_ref:                             Constants.          (line   86)
* 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  485)
* LAST_STACK_REG:                        Stack Registers.    (line   31)
* LAST_VIRTUAL_REGISTER:                 Regs and Memory.    (line   51)
* lceilMN2:                              Standard Names.     (line  682)
* 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 1112)
* 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  151)
* 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  677)
* 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  949)
* LIBGCC_SPEC:                           Driver.             (line  116)
* library subroutine names:              Library Calls.      (line    6)
* LIBRARY_PATH_ENV:                      Misc.               (line  520)
* 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_ELIMINATE_DUPLICATE_LDIRECTORIES: Driver.             (line  247)
* 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   69)
* load_multiple instruction pattern:     Standard Names.     (line  137)
* LOCAL_ALIGNMENT:                       Storage Layout.     (line  250)
* LOCAL_CLASS_P:                         Classes.            (line   73)
* LOCAL_DECL_ALIGNMENT:                  Storage Layout.     (line  287)
* LOCAL_INCLUDE_DIR:                     Driver.             (line  319)
* LOCAL_LABEL_PREFIX:                    Instruction Output. (line  153)
* LOCAL_REGNO:                           Register Basics.    (line  102)
* LOG_LINKS:                             Insns.              (line  318)
* Logical Operators:                     Logical Operators.  (line    6)
* logical-and, bitwise:                  Arithmetic.         (line  158)
* logM2 instruction pattern:             Standard Names.     (line  590)
* 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  667)
* lroundMN2:                             Standard Names.     (line  672)
* LSHIFT_EXPR:                           Unary and Binary Expressions.
                                                             (line    6)
* lshiftrt:                              Arithmetic.         (line  190)
* lshiftrt and attributes:               Expressions.        (line   85)
* lshrM3 instruction pattern:            Standard Names.     (line  522)
* 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  445)
* MAKE_DECL_ONE_ONLY:                    Label Output.       (line  238)
* make_safe_from:                        Expander Definitions.
                                                             (line  148)
* 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  166)
* 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  513)
* matherr:                               Library Calls.      (line   52)
* MAX_BITS_PER_WORD:                     Storage Layout.     (line   60)
* MAX_CONDITIONAL_EXECUTE:               Misc.               (line  535)
* MAX_FIXED_MODE_SIZE:                   Storage Layout.     (line  432)
* MAX_MOVE_MAX:                          Misc.               (line  120)
* 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  308)
* may_trap_p, tree_could_trap_p:         Edges.              (line  115)
* maybe_undef:                           GTY Options.        (line  174)
* mcount:                                Profiling.          (line   12)
* MD_CAN_REDIRECT_BRANCH:                Misc.               (line  671)
* MD_EXEC_PREFIX:                        Driver.             (line  274)
* MD_FALLBACK_FRAME_STATE_FOR:           Exception Handling. (line   94)
* MD_HANDLE_UNWABI:                      Exception Handling. (line  114)
* MD_STARTFILE_PREFIX:                   Driver.             (line  302)
* MD_STARTFILE_PREFIX_1:                 Driver.             (line  307)
* 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 1759)
* MEM_SIZE:                              Special Accessors.  (line   40)
* MEM_SIZE_KNOWN_P:                      Special Accessors.  (line   36)
* mem_thread_fenceMODE instruction pattern: Standard Names.  (line 1751)
* MEM_VOLATILE_P:                        Flags.              (line   76)
* MEMBER_TYPE_FORCES_BLK:                Storage Layout.     (line  412)
* 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 1500)
* 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  308)
* 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   54)
* MODE_EXIT:                             Mode Switching.     (line   60)
* 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   66)
* 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  749)
* modM3 instruction pattern:             Standard Names.     (line  269)
* modulo scheduling:                     RTL passes.         (line  131)
* MOVE_BY_PIECES_P:                      Costs.              (line  165)
* MOVE_MAX:                              Misc.               (line  115)
* MOVE_MAX_PIECES:                       Costs.              (line  171)
* MOVE_RATIO:                            Costs.              (line  149)
* movM instruction pattern:              Standard Names.     (line   11)
* movmemM instruction pattern:           Standard Names.     (line  739)
* movmisalignM instruction pattern:      Standard Names.     (line  126)
* movMODEcc instruction pattern:         Standard Names.     (line  962)
* movstr instruction pattern:            Standard Names.     (line  774)
* movstrictM instruction pattern:        Standard Names.     (line  120)
* msubMN4 instruction pattern:           Standard Names.     (line  468)
* mulhisi3 instruction pattern:          Standard Names.     (line  421)
* mulM3 instruction pattern:             Standard Names.     (line  269)
* mulqihi3 instruction pattern:          Standard Names.     (line  425)
* mulsidi3 instruction pattern:          Standard Names.     (line  425)
* 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)
* MULTIARCH_DIRNAME:                     Target Fragment.    (line  141)
* MULTILIB_DEFAULTS:                     Driver.             (line  259)
* MULTILIB_DIRNAMES:                     Target Fragment.    (line   44)
* MULTILIB_EXCEPTIONS:                   Target Fragment.    (line   70)
* MULTILIB_EXTRA_OPTS:                   Target Fragment.    (line  103)
* MULTILIB_MATCHES:                      Target Fragment.    (line   63)
* MULTILIB_OPTIONS:                      Target Fragment.    (line   24)
* MULTILIB_OSDIRNAMES:                   Target Fragment.    (line  110)
* MULTILIB_REQUIRED:                     Target Fragment.    (line   82)
* multiple alternative constraints:      Multi-Alternative.  (line    6)
* MULTIPLE_SYMBOL_SPACES:                Misc.               (line  493)
* 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  329)
* ne:                                    Comparisons.        (line   56)
* ne and attributes:                     Expressions.        (line   85)
* NE_EXPR:                               Unary and Binary Expressions.
                                                             (line    6)
* nearbyintM2 instruction pattern:       Standard Names.     (line  649)
* 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  534)
* nested functions, trampolines for:     Trampolines.        (line    6)
* nested_ptr:                            GTY Options.        (line  181)
* next_bb, prev_bb, FOR_EACH_BB:         Basic Blocks.       (line   10)
* 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   39)
* NO_DBX_FUNCTION_END:                   DBX Hooks.          (line   33)
* 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:                    Misc.               (line  457)
* NO_DOT_IN_LABEL:                       Misc.               (line  463)
* NO_FUNCTION_CSE:                       Costs.              (line  261)
* NO_IMPLICIT_EXTERN_C:                  Misc.               (line  376)
* 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  171)
* nonlocal_goto instruction pattern:     Standard Names.     (line 1334)
* nonlocal_goto_receiver instruction pattern: Standard Names.
                                                             (line 1351)
* nonmemory_operand:                     Machine-Independent Predicates.
                                                             (line   97)
* nonoffsettable memory reference:       Simple Constraints. (line  256)
* nop instruction pattern:               Standard Names.     (line 1145)
* 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  168)
* note and /i:                           Flags.              (line   59)
* note and /v:                           Flags.              (line   44)
* NOTE_INSN_BASIC_BLOCK, CODE_LABEL, notes: Basic Blocks.    (line   41)
* NOTE_INSN_BLOCK_BEG:                   Insns.              (line  193)
* NOTE_INSN_BLOCK_END:                   Insns.              (line  193)
* NOTE_INSN_DELETED:                     Insns.              (line  183)
* NOTE_INSN_DELETED_LABEL:               Insns.              (line  188)
* NOTE_INSN_EH_REGION_BEG:               Insns.              (line  199)
* NOTE_INSN_EH_REGION_END:               Insns.              (line  199)
* NOTE_INSN_FUNCTION_BEG:                Insns.              (line  223)
* NOTE_INSN_LOOP_BEG:                    Insns.              (line  207)
* NOTE_INSN_LOOP_CONT:                   Insns.              (line  213)
* NOTE_INSN_LOOP_END:                    Insns.              (line  207)
* NOTE_INSN_LOOP_VTOP:                   Insns.              (line  217)
* NOTE_INSN_VAR_LOCATION:                Insns.              (line  227)
* NOTE_LINE_NUMBER:                      Insns.              (line  168)
* NOTE_SOURCE_FILE:                      Insns.              (line  168)
* NOTE_VAR_LOCATION:                     Insns.              (line  227)
* 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  440)
* OBJC_JBLEN:                            Misc.               (line  944)
* 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  736)
* 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_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  102)
* 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  109)
* parameters, c++ abi:                   C++ ABI.            (line    6)
* parameters, miscellaneous:             Misc.               (line    6)
* parameters, precompiled headers:       PCH Target.         (line    6)
* paramN_is:                             GTY Options.        (line  127)
* parity:                                Arithmetic.         (line  243)
* parityM2 instruction pattern:          Standard Names.     (line  730)
* PARM_BOUNDARY:                         Storage Layout.     (line  140)
* PARM_DECL:                             Declarations.       (line    6)
* PARSE_LDD_OUTPUT:                      Macros for Initialization.
                                                             (line  127)
* passes and files of the compiler:      Passes.             (line    6)
* passing arguments:                     Interface.          (line   36)
* PATH_SEPARATOR:                        Filesystem.         (line   31)
* PATTERN:                               Insns.              (line  288)
* 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  344)
* 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  724)
* 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)
* POSTDECREMENT_EXPR:                    Unary and Binary Expressions.
                                                             (line    6)
* POSTINCREMENT_EXPR:                    Unary and Binary Expressions.
                                                             (line    6)
* POWI_MAX_MULTS:                        Misc.               (line  812)
* powM3 instruction pattern:             Standard Names.     (line  598)
* pragma:                                Misc.               (line  381)
* 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 1479)
* 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  186)
* 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 1326)
* 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 1417)
* PROMOTE_MODE:                          Storage Layout.     (line   93)
* pseudo registers:                      Regs and Memory.    (line    9)
* PSImode:                               Machine Modes.      (line   32)
* PTRDIFF_TYPE:                          Type Layout.        (line  191)
* purge_dead_edges <1>:                  Maintaining the CFG.
                                                             (line   93)
* 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  175)
* 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  351)
* 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  272)
* 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)
* RANGE_TEST_NON_SHORT_CIRCUIT:          Costs.              (line  265)
* 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   99)
* 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   93)
* 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_TRUNCATE:                   Floating Point.     (line   86)
* 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  103)
* reduc_smax_M instruction pattern:      Standard Names.     (line  314)
* reduc_smin_M instruction pattern:      Standard Names.     (line  314)
* reduc_splus_M instruction pattern:     Standard Names.     (line  326)
* reduc_umax_M instruction pattern:      Standard Names.     (line  320)
* reduc_umin_M instruction pattern:      Standard Names.     (line  320)
* reduc_uplus_M instruction pattern:     Standard Names.     (line  332)
* 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  532)
* REG_BR_PROB:                           Insns.              (line  526)
* 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  497)
* REG_CC_USER:                           Insns.              (line  497)
* 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  410)
* REG_DEAD:                              Insns.              (line  362)
* REG_DEAD, REG_UNUSED:                  Liveness information.
                                                             (line   32)
* REG_DEP_ANTI:                          Insns.              (line  519)
* REG_DEP_OUTPUT:                        Insns.              (line  515)
* REG_DEP_TRUE:                          Insns.              (line  512)
* REG_EH_REGION, EDGE_ABNORMAL_CALL:     Edges.              (line  110)
* REG_EQUAL:                             Insns.              (line  425)
* REG_EQUIV:                             Insns.              (line  425)
* REG_EXPR:                              Special Accessors.  (line   60)
* REG_FRAME_RELATED_EXPR:                Insns.              (line  538)
* REG_FUNCTION_VALUE_P:                  Flags.              (line   89)
* REG_INC:                               Insns.              (line  378)
* reg_label and /v:                      Flags.              (line   65)
* REG_LABEL_OPERAND:                     Insns.              (line  392)
* REG_LABEL_TARGET:                      Insns.              (line  401)
* reg_names <1>:                         Instruction Output. (line  108)
* reg_names:                             Register Basics.    (line   59)
* REG_NONNEG:                            Insns.              (line  384)
* REG_NOTE_KIND:                         Insns.              (line  351)
* REG_NOTES:                             Insns.              (line  325)
* 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  419)
* REG_UNUSED:                            Insns.              (line  371)
* 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  382)
* 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  269)
* reload_completed:                      Standard Names.     (line 1112)
* 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  182)
* remainder:                             Arithmetic.         (line  136)
* remainderM3 instruction pattern:       Standard Names.     (line  557)
* reorder:                               GTY Options.        (line  205)
* 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 1246)
* restore_stack_function instruction pattern: Standard Names.
                                                             (line 1246)
* restore_stack_nonlocal instruction pattern: Standard Names.
                                                             (line 1246)
* RESULT_DECL:                           Declarations.       (line    6)
* return:                                Side Effects.       (line   72)
* return instruction pattern:            Standard Names.     (line 1085)
* 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_CONDEXEC_PREDICATES_P:         Cond Exec Macros.   (line   11)
* REVERSE_CONDITION:                     MODE_CC Condition Codes.
                                                             (line   87)
* REVERSIBLE_CC_MODE:                    MODE_CC Condition Codes.
                                                             (line   73)
* right rotate:                          Arithmetic.         (line  195)
* right shift:                           Arithmetic.         (line  190)
* rintM2 instruction pattern:            Standard Names.     (line  657)
* 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  522)
* rotrM3 instruction pattern:            Standard Names.     (line  522)
* ROUND_DIV_EXPR:                        Unary and Binary Expressions.
                                                             (line    6)
* ROUND_MOD_EXPR:                        Unary and Binary Expressions.
                                                             (line    6)
* ROUND_TOWARDS_ZERO:                    Storage Layout.     (line  476)
* ROUND_TYPE_ALIGN:                      Storage Layout.     (line  423)
* roundM2 instruction pattern:           Standard Names.     (line  633)
* 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  914)
* satfractunsMN2 instruction pattern:    Standard Names.     (line  927)
* satisfies_constraint_:                 C Constraint Interface.
                                                             (line   47)
* SAVE_EXPR:                             Unary and Binary Expressions.
                                                             (line    6)
* save_stack_block instruction pattern:  Standard Names.     (line 1246)
* save_stack_function instruction pattern: Standard Names.   (line 1246)
* save_stack_nonlocal instruction pattern: Standard Names.   (line 1246)
* 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  338)
* 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  407)
* 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  140)
* set_optab_libfunc:                     Library Calls.      (line   15)
* SET_RATIO:                             Costs.              (line  194)
* SET_SRC:                               Side Effects.       (line   69)
* SET_TYPE_STRUCTURAL_EQUALITY:          Types.              (line    6)
* setmemM instruction pattern:           Standard Names.     (line  782)
* 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  127)
* 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   96)
* SHORT_TYPE_SIZE:                       Type Layout.        (line   16)
* sibcall_epilogue instruction pattern:  Standard Names.     (line 1449)
* sibling call:                          Edges.              (line  122)
* SIBLING_CALL_P:                        Flags.              (line  161)
* SIG_ATOMIC_TYPE:                       Type Layout.        (line  242)
* 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 1101)
* sincos math function, implicit usage:  Library Calls.      (line   78)
* sinM2 instruction pattern:             Standard Names.     (line  574)
* SIZE_ASM_OP:                           Label Output.       (line   35)
* SIZE_TYPE:                             Type Layout.        (line  175)
* skip:                                  GTY Options.        (line   72)
* 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  131)
* smulM3_highpart instruction pattern:   Standard Names.     (line  437)
* soft float library:                    Soft float library routines.
                                                             (line    6)
* special:                               GTY Options.        (line  290)
* special predicates:                    Predicates.         (line   31)
* SPECS:                                 Target Fragment.    (line  162)
* speed of instructions:                 Costs.              (line    6)
* split_block:                           Maintaining the CFG.
                                                             (line  110)
* splitting instructions:                Insn Splitting.     (line    6)
* SQmode:                                Machine Modes.      (line  111)
* sqrt:                                  Arithmetic.         (line  207)
* sqrtM2 instruction pattern:            Standard Names.     (line  540)
* 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  221)
* SSA_NAME_VERSION:                      SSA.                (line  226)
* ssaddM3 instruction pattern:           Standard Names.     (line  269)
* ssashlM3 instruction pattern:          Standard Names.     (line  512)
* ssdivM3 instruction pattern:           Standard Names.     (line  269)
* ssmaddMN4 instruction pattern:         Standard Names.     (line  460)
* ssmsubMN4 instruction pattern:         Standard Names.     (line  484)
* ssmulM3 instruction pattern:           Standard Names.     (line  269)
* ssnegM2 instruction pattern:           Standard Names.     (line  534)
* sssubM3 instruction pattern:           Standard Names.     (line  269)
* ssum_widenM3 instruction pattern:      Standard Names.     (line  348)
* 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 1771)
* stack_protect_test instruction pattern: Standard Names.    (line 1781)
* 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  439)
* STACK_SIZE_MODE:                       Storage Layout.     (line  451)
* STACK_SLOT_ALIGNMENT:                  Storage Layout.     (line  271)
* standard pattern names:                Standard Names.     (line    6)
* STANDARD_STARTFILE_PREFIX:             Driver.             (line  281)
* STANDARD_STARTFILE_PREFIX_1:           Driver.             (line  288)
* STANDARD_STARTFILE_PREFIX_2:           Driver.             (line  295)
* 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  365)
* 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  216)
* 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  185)
* STRING_CST:                            Constant expressions.
                                                             (line    6)
* STRING_POOL_ADDRESS_P:                 Flags.              (line  165)
* strlenM instruction pattern:           Standard Names.     (line  849)
* 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)
* SUCCESS_EXIT_CODE:                     Host Misc.          (line   12)
* SUPPORTS_INIT_PRIORITY:                Macros for Initialization.
                                                             (line   58)
* SUPPORTS_ONE_ONLY:                     Label Output.       (line  247)
* SUPPORTS_WEAK:                         Label Output.       (line  221)
* 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  155)
* 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   76)
* 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 1546)
* sync_andMODE instruction pattern:      Standard Names.     (line 1546)
* sync_compare_and_swapMODE instruction pattern: Standard Names.
                                                             (line 1506)
* sync_iorMODE instruction pattern:      Standard Names.     (line 1546)
* sync_lock_releaseMODE instruction pattern: Standard Names. (line 1611)
* sync_lock_test_and_setMODE instruction pattern: Standard Names.
                                                             (line 1585)
* sync_nandMODE instruction pattern:     Standard Names.     (line 1546)
* sync_new_addMODE instruction pattern:  Standard Names.     (line 1578)
* sync_new_andMODE instruction pattern:  Standard Names.     (line 1578)
* sync_new_iorMODE instruction pattern:  Standard Names.     (line 1578)
* sync_new_nandMODE instruction pattern: Standard Names.     (line 1578)
* sync_new_subMODE instruction pattern:  Standard Names.     (line 1578)
* sync_new_xorMODE instruction pattern:  Standard Names.     (line 1578)
* sync_old_addMODE instruction pattern:  Standard Names.     (line 1561)
* sync_old_andMODE instruction pattern:  Standard Names.     (line 1561)
* sync_old_iorMODE instruction pattern:  Standard Names.     (line 1561)
* sync_old_nandMODE instruction pattern: Standard Names.     (line 1561)
* sync_old_subMODE instruction pattern:  Standard Names.     (line 1561)
* sync_old_xorMODE instruction pattern:  Standard Names.     (line 1561)
* sync_subMODE instruction pattern:      Standard Names.     (line 1546)
* sync_xorMODE instruction pattern:      Standard Names.     (line 1546)
* SYSROOT_HEADERS_SUFFIX_SPEC:           Driver.             (line  177)
* SYSROOT_SUFFIX_SPEC:                   Driver.             (line  172)
* t-TARGET:                              Target Fragment.    (line    6)
* table jump:                            Basic Blocks.       (line   57)
* tablejump instruction pattern:         Standard Names.     (line 1174)
* tag:                                   GTY Options.        (line   77)
* 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  301)
* TARGET_ALIGN_ANON_BITFIELD:            Storage Layout.     (line  398)
* TARGET_ALLOCATE_INITIAL_VALUE:         Misc.               (line  686)
* TARGET_ALLOCATE_STACK_SLOTS_FOR_ARGS:  Misc.               (line  966)
* TARGET_ALWAYS_STRIP_DOTDOT:            Driver.             (line  253)
* TARGET_ARG_PARTIAL_BYTES:              Register Arguments. (line   84)
* TARGET_ARM_EABI_UNWINDER:              Exception Region Output.
                                                             (line  122)
* TARGET_ARRAY_MODE_SUPPORTED_P:         Register Arguments. (line  337)
* 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  259)
* TARGET_ASM_BYTE_OP:                    Data Output.        (line    7)
* TARGET_ASM_CAN_OUTPUT_MI_THUNK:        Function Entry.     (line  237)
* 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  142)
* 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  294)
* 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  123)
* TARGET_ASM_FUNCTION_SWITCHED_TEXT_SECTIONS: File Framework.
                                                             (line  133)
* TARGET_ASM_GLOBALIZE_DECL_NAME:        Label Output.       (line  187)
* TARGET_ASM_GLOBALIZE_LABEL:            Label Output.       (line  178)
* TARGET_ASM_INIT_SECTIONS:              Sections.           (line  160)
* TARGET_ASM_INTEGER:                    Data Output.        (line   27)
* TARGET_ASM_INTERNAL_LABEL:             Label Output.       (line  338)
* 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  301)
* TARGET_ASM_MERGEABLE_RODATA_PREFIX:    Sections.           (line  222)
* TARGET_ASM_NAMED_SECTION:              File Framework.     (line  115)
* 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_MI_THUNK:            Function Entry.     (line  195)
* TARGET_ASM_OUTPUT_SOURCE_FILENAME:     File Framework.     (line   94)
* TARGET_ASM_RECORD_GCC_SWITCHES:        File Framework.     (line  164)
* TARGET_ASM_RECORD_GCC_SWITCHES_SECTION: File Framework.    (line  208)
* 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  116)
* 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  994)
* 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  783)
* TARGET_BRANCH_TARGET_REGISTER_CLASS:   Misc.               (line  775)
* TARGET_BUILD_BUILTIN_VA_LIST:          Register Arguments. (line  273)
* TARGET_BUILTIN_DECL:                   Misc.               (line  619)
* TARGET_BUILTIN_RECIPROCAL:             Addressing Modes.   (line  273)
* TARGET_BUILTIN_SETJMP_FRAME_VALUE:     Frame Layout.       (line  109)
* TARGET_C99_FUNCTIONS:                  Library Calls.      (line   71)
* TARGET_CALLEE_COPIES:                  Register Arguments. (line  116)
* TARGET_CAN_ELIMINATE:                  Elimination.        (line   75)
* TARGET_CAN_INLINE_P:                   Target Attributes.  (line  150)
* TARGET_CANNOT_FORCE_CONST_MEM:         Addressing Modes.   (line  252)
* TARGET_CANNOT_MODIFY_JUMPS_P:          Misc.               (line  762)
* TARGET_CANONICAL_VA_LIST_TYPE:         Register Arguments. (line  294)
* TARGET_CASE_VALUES_THRESHOLD:          Misc.               (line   47)
* TARGET_CC_MODES_COMPATIBLE:            MODE_CC Condition Codes.
                                                             (line  116)
* TARGET_CHECK_PCH_TARGET_FLAGS:         PCH Target.         (line   28)
* TARGET_CHECK_STRING_OBJECT_FORMAT_ARG: Run-time Target.    (line  111)
* TARGET_CLASS_LIKELY_SPILLED_P:         Register Classes.   (line  494)
* TARGET_CLASS_MAX_NREGS:                Register Classes.   (line  513)
* TARGET_COMMUTATIVE_P:                  Misc.               (line  679)
* TARGET_COMP_TYPE_ATTRIBUTES:           Target Attributes.  (line   27)
* TARGET_CONDITIONAL_REGISTER_USAGE:     Register Basics.    (line   60)
* TARGET_CONST_ANCHOR:                   Misc.               (line  977)
* TARGET_CONST_NOT_OK_FOR_DEBUG_P:       Addressing Modes.   (line  247)
* TARGET_CONVERT_TO_TYPE:                Misc.               (line  930)
* 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  523)
* TARGET_DECLSPEC:                       Target Attributes.  (line   73)
* TARGET_DEFAULT_PACK_STRUCT:            Misc.               (line  445)
* TARGET_DEFAULT_SHORT_ENUMS:            Type Layout.        (line  167)
* TARGET_DEFAULT_TARGET_FLAGS:           Run-time Target.    (line   56)
* TARGET_DEFERRED_OUTPUT_DEFS:           Label Output.       (line  422)
* TARGET_DELAY_SCHED2:                   SDB and DWARF.      (line   66)
* TARGET_DELAY_VARTRACK:                 SDB and DWARF.      (line   70)
* TARGET_DELEGITIMIZE_ADDRESS:           Addressing Modes.   (line  238)
* 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   99)
* 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  736)
* TARGET_EXPAND_BUILTIN:                 Misc.               (line  629)
* TARGET_EXPAND_BUILTIN_SAVEREGS:        Varargs.            (line   67)
* TARGET_EXPAND_TO_RTL_HOOK:             Storage Layout.     (line  529)
* TARGET_EXPR:                           Unary and Binary Expressions.
                                                             (line    6)
* TARGET_EXTRA_INCLUDES:                 Misc.               (line  823)
* TARGET_EXTRA_LIVE_ON_ENTRY:            Tail Calls.         (line   21)
* TARGET_EXTRA_PRE_INCLUDES:             Misc.               (line  830)
* TARGET_FIXED_CONDITION_CODE_REGS:      MODE_CC Condition Codes.
                                                             (line  101)
* TARGET_FIXED_POINT_SUPPORTED_P:        Storage Layout.     (line  526)
* 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  650)
* TARGET_FORCE_AT_COMP_DIR:              SDB and DWARF.      (line   61)
* TARGET_FORMAT_TYPES:                   Misc.               (line  850)
* 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_GET_DRAP_RTX:                   Misc.               (line  960)
* 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_HANDLE_PRAGMA_EXTERN_PREFIX:    Misc.               (line  442)
* TARGET_HARD_REGNO_SCRATCH_OK:          Values in Registers.
                                                             (line  144)
* TARGET_HAS_SINCOS:                     Library Calls.      (line   79)
* TARGET_HAVE_CONDITIONAL_EXECUTION:     Misc.               (line  797)
* TARGET_HAVE_CTORS_DTORS:               Macros for Initialization.
                                                             (line   64)
* TARGET_HAVE_NAMED_SECTIONS:            File Framework.     (line  140)
* TARGET_HAVE_SRODATA_SECTION:           Sections.           (line  298)
* TARGET_HAVE_SWITCHABLE_BSS_SECTIONS:   File Framework.     (line  145)
* TARGET_HAVE_TLS:                       Sections.           (line  318)
* TARGET_IN_SMALL_DATA_P:                Sections.           (line  294)
* TARGET_INIT_BUILTINS:                  Misc.               (line  602)
* TARGET_INIT_DWARF_REG_SIZES_EXTRA:     Exception Region Output.
                                                             (line  108)
* TARGET_INIT_LIBFUNCS:                  Library Calls.      (line   16)
* TARGET_INSERT_ATTRIBUTES:              Target Attributes.  (line   82)
* TARGET_INSTANTIATE_DECLS:              Storage Layout.     (line  537)
* TARGET_INVALID_ARG_FOR_UNPROTOTYPED_FN: Misc.              (line  884)
* TARGET_INVALID_BINARY_OP:              Misc.               (line  903)
* TARGET_INVALID_CONVERSION:             Misc.               (line  890)
* TARGET_INVALID_PARAMETER_TYPE:         Misc.               (line  909)
* TARGET_INVALID_RETURN_TYPE:            Misc.               (line  916)
* TARGET_INVALID_UNARY_OP:               Misc.               (line  896)
* TARGET_INVALID_WITHIN_DOLOOP:          Misc.               (line  659)
* TARGET_LEGITIMATE_ADDRESS_P:           Addressing Modes.   (line   50)
* TARGET_LEGITIMATE_CONSTANT_P:          Addressing Modes.   (line  231)
* 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  460)
* TARGET_LIBGCC_SDATA_SECTION:           Sections.           (line  132)
* TARGET_LIBGCC_SHIFT_COUNT_MODE:        Storage Layout.     (line  466)
* TARGET_LOOP_UNROLL_ADJUST:             Misc.               (line  804)
* TARGET_MACHINE_DEPENDENT_REORG:        Misc.               (line  587)
* TARGET_MANGLE_ASSEMBLER_NAME:          Label Output.       (line  313)
* TARGET_MANGLE_DECL_ASSEMBLER_NAME:     Sections.           (line  243)
* TARGET_MANGLE_TYPE:                    Storage Layout.     (line  541)
* TARGET_MAX_ANCHOR_OFFSET:              Anchored Addresses. (line   39)
* TARGET_MD_ASM_CLOBBERS:                Misc.               (line  503)
* TARGET_MEM_CONSTRAINT:                 Addressing Modes.   (line  109)
* TARGET_MEM_REF:                        Storage References. (line    6)
* 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  106)
* TARGET_MODE_DEPENDENT_ADDRESS_P:       Addressing Modes.   (line  196)
* TARGET_MODE_REP_EXTENDED:              Misc.               (line  191)
* TARGET_MS_BITFIELD_LAYOUT_P:           Storage Layout.     (line  496)
* 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  855)
* TARGET_NARROW_VOLATILE_BITFIELD:       Storage Layout.     (line  404)
* TARGET_OBJC_CONSTRUCT_STRING_OBJECT:   Run-time Target.    (line   90)
* TARGET_OBJECT_SUFFIX:                  Misc.               (line  731)
* TARGET_OBJFMT_CPP_BUILTINS:            Run-time Target.    (line   46)
* TARGET_OPTF:                           Misc.               (line  837)
* TARGET_OPTION_DEFAULT_PARAMS:          Run-time Target.    (line  151)
* TARGET_OPTION_INIT_STRUCT:             Run-time Target.    (line  148)
* TARGET_OPTION_OPTIMIZATION_TABLE:      Run-time Target.    (line  134)
* 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  117)
* TARGET_OVERRIDES_FORMAT_ATTRIBUTES:    Misc.               (line  859)
* TARGET_OVERRIDES_FORMAT_ATTRIBUTES_COUNT: Misc.            (line  865)
* TARGET_OVERRIDES_FORMAT_INIT:          Misc.               (line  869)
* TARGET_PASS_BY_REFERENCE:              Register Arguments. (line  104)
* TARGET_PCH_VALID_P:                    PCH Target.         (line   13)
* TARGET_POSIX_IO:                       Misc.               (line  527)
* 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  922)
* TARGET_PTRMEMFUNC_VBIT_LOCATION:       Type Layout.        (line  285)
* TARGET_REF_MAY_ALIAS_ERRNO:            Register Arguments. (line  311)
* TARGET_REGISTER_MOVE_COST:             Costs.              (line   33)
* TARGET_RELAXED_ORDERING:               Misc.               (line  874)
* TARGET_RESOLVE_OVERLOADED_BUILTIN:     Misc.               (line  639)
* 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  151)
* TARGET_SET_CURRENT_FUNCTION:           Misc.               (line  713)
* 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  154)
* TARGET_SMALL_REGISTER_CLASSES_FOR_MODE_P: Register Arguments.
                                                             (line  361)
* 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  106)
* 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  229)
* TARGET_TERMINATE_DW2_EH_FRAME_INFO:    Exception Region Output.
                                                             (line   93)
* TARGET_TRAMPOLINE_ADJUST_ADDRESS:      Trampolines.        (line   75)
* TARGET_TRAMPOLINE_INIT:                Trampolines.        (line   56)
* TARGET_UNSPEC_MAY_TRAP_P:              Misc.               (line  705)
* TARGET_UNWIND_TABLES_DEFAULT:          Exception Region Output.
                                                             (line   74)
* TARGET_UNWIND_WORD_MODE:               Storage Layout.     (line  472)
* TARGET_UPDATE_STACK_BOUNDARY:          Misc.               (line  956)
* TARGET_USE_ANCHORS_FOR_SYMBOL_P:       Anchored Addresses. (line   55)
* TARGET_USE_BLOCKS_FOR_CONSTANT_P:      Addressing Modes.   (line  266)
* TARGET_USE_JCR_SECTION:                Misc.               (line  938)
* TARGET_USES_WEAK_UNWIND_INFO:          Exception Handling. (line  125)
* 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_AUTOVECTORIZE_VECTOR_SIZES: Addressing Modes.
                                                             (line  386)
* TARGET_VECTORIZE_BUILTIN_CONVERSION:   Addressing Modes.   (line  348)
* TARGET_VECTORIZE_BUILTIN_GATHER:       Addressing Modes.   (line  402)
* TARGET_VECTORIZE_BUILTIN_MASK_FOR_LOAD: Addressing Modes.  (line  282)
* TARGET_VECTORIZE_BUILTIN_MUL_WIDEN_EVEN: Addressing Modes. (line  308)
* TARGET_VECTORIZE_BUILTIN_MUL_WIDEN_ODD: Addressing Modes.  (line  320)
* TARGET_VECTORIZE_BUILTIN_TM_LOAD:      Addressing Modes.   (line  393)
* TARGET_VECTORIZE_BUILTIN_TM_STORE:     Addressing Modes.   (line  397)
* TARGET_VECTORIZE_BUILTIN_VECTORIZATION_COST: Addressing Modes.
                                                             (line  333)
* TARGET_VECTORIZE_BUILTIN_VECTORIZED_FUNCTION: Addressing Modes.
                                                             (line  360)
* TARGET_VECTORIZE_PREFERRED_SIMD_MODE:  Addressing Modes.   (line  379)
* TARGET_VECTORIZE_SUPPORT_VECTOR_MISALIGNMENT: Addressing Modes.
                                                             (line  370)
* TARGET_VECTORIZE_VEC_PERM_CONST_OK:    Addressing Modes.   (line  344)
* TARGET_VECTORIZE_VECTOR_ALIGNMENT_REACHABLE: Addressing Modes.
                                                             (line  339)
* TARGET_VTABLE_DATA_ENTRY_DISTANCE:     Type Layout.        (line  338)
* TARGET_VTABLE_ENTRY_ALIGN:             Type Layout.        (line  332)
* TARGET_VTABLE_USES_DESCRIPTORS:        Type Layout.        (line  321)
* TARGET_WANT_DEBUG_PUB_SECTIONS:        SDB and DWARF.      (line   56)
* TARGET_WEAK_NOT_IN_ARCHIVE_TOC:        Label Output.       (line  265)
* 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  272)
* 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 1459)
* 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  177)
* 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  892)
* 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   67)
* 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   78)
* 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_PTRFN_P:                          Types for C++.      (line   78)
* TYPE_PTRMEM_P:                         Types for C++.      (line    6)
* 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  509)
* udot_prodM instruction pattern:        Standard Names.     (line  339)
* UDQmode:                               Machine Modes.      (line  136)
* UHAmode:                               Machine Modes.      (line  160)
* UHQmode:                               Machine Modes.      (line  128)
* UINT16_TYPE:                           Type Layout.        (line  248)
* UINT32_TYPE:                           Type Layout.        (line  249)
* UINT64_TYPE:                           Type Layout.        (line  250)
* UINT8_TYPE:                            Type Layout.        (line  247)
* UINT_FAST16_TYPE:                      Type Layout.        (line  264)
* UINT_FAST32_TYPE:                      Type Layout.        (line  265)
* UINT_FAST64_TYPE:                      Type Layout.        (line  266)
* UINT_FAST8_TYPE:                       Type Layout.        (line  263)
* UINT_LEAST16_TYPE:                     Type Layout.        (line  256)
* UINT_LEAST32_TYPE:                     Type Layout.        (line  257)
* UINT_LEAST64_TYPE:                     Type Layout.        (line  258)
* UINT_LEAST8_TYPE:                      Type Layout.        (line  255)
* UINTMAX_TYPE:                          Type Layout.        (line  231)
* UINTPTR_TYPE:                          Type Layout.        (line  268)
* umaddMN4 instruction pattern:          Standard Names.     (line  456)
* 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  480)
* umulhisi3 instruction pattern:         Standard Names.     (line  428)
* umulM3_highpart instruction pattern:   Standard Names.     (line  442)
* umulqihi3 instruction pattern:         Standard Names.     (line  428)
* umulsidi3 instruction pattern:         Standard Names.     (line  428)
* 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 1070)
* untyped_return instruction pattern:    Standard Names.     (line 1134)
* 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  512)
* 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  109)
* use_paramN:                            GTY Options.        (line  127)
* use_params:                            GTY Options.        (line  135)
* 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_LABEL_PREFIX:                     Instruction Output. (line  154)
* USING_STMT:                            Statements for C++. (line    6)
* usmaddMN4 instruction pattern:         Standard Names.     (line  464)
* usmsubMN4 instruction pattern:         Standard Names.     (line  488)
* usmulhisi3 instruction pattern:        Standard Names.     (line  432)
* usmulM3 instruction pattern:           Standard Names.     (line  269)
* usmulqihi3 instruction pattern:        Standard Names.     (line  432)
* usmulsidi3 instruction pattern:        Standard Names.     (line  432)
* usnegM2 instruction pattern:           Standard Names.     (line  534)
* USQmode:                               Machine Modes.      (line  132)
* ussubM3 instruction pattern:           Standard Names.     (line  269)
* usum_widenM3 instruction pattern:      Standard Names.     (line  349)
* 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  225)
* vashlM3 instruction pattern:           Standard Names.     (line  526)
* vashrM3 instruction pattern:           Standard Names.     (line  526)
* 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  376)
* vec_pack_ssat_M instruction pattern:   Standard Names.     (line  369)
* VEC_PACK_TRUNC_EXPR:                   Vectors.            (line    6)
* vec_pack_trunc_M instruction pattern:  Standard Names.     (line  362)
* vec_pack_ufix_trunc_M instruction pattern: Standard Names. (line  376)
* vec_pack_usat_M instruction pattern:   Standard Names.     (line  369)
* 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  356)
* vec_shr_M instruction pattern:         Standard Names.     (line  356)
* 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  398)
* vec_unpacks_float_lo_M instruction pattern: Standard Names.
                                                             (line  398)
* vec_unpacks_hi_M instruction pattern:  Standard Names.     (line  383)
* vec_unpacks_lo_M instruction pattern:  Standard Names.     (line  383)
* vec_unpacku_float_hi_M instruction pattern: Standard Names.
                                                             (line  398)
* vec_unpacku_float_lo_M instruction pattern: Standard Names.
                                                             (line  398)
* vec_unpacku_hi_M instruction pattern:  Standard Names.     (line  391)
* vec_unpacku_lo_M instruction pattern:  Standard Names.     (line  391)
* VEC_WIDEN_MULT_HI_EXPR:                Vectors.            (line    6)
* VEC_WIDEN_MULT_LO_EXPR:                Vectors.            (line    6)
* vec_widen_smult_hi_M instruction pattern: Standard Names.  (line  407)
* vec_widen_smult_lo_M instruction pattern: Standard Names.  (line  407)
* vec_widen_sshiftl_hi_M instruction pattern: Standard Names.
                                                             (line  414)
* vec_widen_sshiftl_lo_M instruction pattern: Standard Names.
                                                             (line  414)
* vec_widen_umult_hi_M instruction pattern: Standard Names.  (line  407)
* vec_widen_umult_lo__M instruction pattern: Standard Names. (line  407)
* vec_widen_ushiftl_hi_M instruction pattern: Standard Names.
                                                             (line  414)
* vec_widen_ushiftl_lo_M instruction pattern: Standard Names.
                                                             (line  414)
* vector:                                Containers.         (line    6)
* vector operations:                     Vector Operations.  (line    6)
* VECTOR_CST:                            Constant expressions.
                                                             (line    6)
* VECTOR_STORE_FLAG_VALUE:               Misc.               (line  308)
* 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  526)
* 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  526)
* vrotrM3 instruction pattern:           Standard Names.     (line  526)
* walk_dominator_tree:                   SSA.                (line  256)
* 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  232)
* WCHAR_TYPE:                            Type Layout.        (line  199)
* WCHAR_TYPE_SIZE:                       Type Layout.        (line  207)
* 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 1430)
* WINT_TYPE:                             Type Layout.        (line  212)
* word_mode:                             Machine Modes.      (line  336)
* WORD_REGISTER_OPERATIONS:              Misc.               (line   63)
* 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  902)
* zero_extract:                          Bit-Fields.         (line   30)
* zero_extract, canonicalization of:     Insn Canonicalizations.
                                                             (line   88)



Tag Table:
Node: Top2135
Node: Contributing5242
Node: Portability5983
Node: Interface7771
Node: Libgcc10811
Node: Integer library routines12652
Node: Soft float library routines19494
Node: Decimal float library routines31431
Node: Fixed-point fractional library routines47188
Node: Exception handling routines147586
Node: Miscellaneous routines148693
Node: Languages150813
Node: Source Tree152362
Node: Configure Terms152944
Node: Top Level155902
Node: gcc Directory159214
Node: Subdirectories160164
Node: Configuration162036
Node: Config Fragments162756
Node: System Config163985
Node: Configuration Files164921
Node: Build167746
Node: Makefile168158
Ref: Makefile-Footnote-1174961
Ref: Makefile-Footnote-2175106
Node: Library Files175178
Node: Headers175740
Node: Documentation177823
Node: Texinfo Manuals178682
Node: Man Page Generation181026
Node: Miscellaneous Docs182941
Node: Front End184330
Node: Front End Directory188023
Node: Front End Config189343
Node: Front End Makefile192285
Node: Back End196067
Node: Testsuites199864
Node: Test Idioms200795
Node: Test Directives204192
Node: Directives204719
Node: Selectors215029
Node: Effective-Target Keywords216171
Ref: arm_neon_ok223479
Ref: arm_neon2_ok223637
Ref: arm_neon_fp16_ok223798
Node: Add Options233122
Node: Require Support234319
Node: Final Actions236826
Node: Ada Tests240889
Node: C Tests242221
Node: libgcj Tests246644
Node: LTO Testing247771
Node: gcov Testing249418
Node: profopt Testing252405
Node: compat Testing254120
Node: Torture Tests258360
Node: Options259977
Node: Option file format260417
Node: Option properties267407
Node: Passes279853
Node: Parsing pass280597
Node: Gimplification pass284127
Node: Pass manager285960
Node: Tree SSA passes287754
Node: RTL passes310226
Node: RTL322569
Node: RTL Objects324757
Node: RTL Classes328631
Node: Accessors333629
Node: Special Accessors336023
Node: Flags341793
Node: Machine Modes356516
Node: Constants368828
Node: Regs and Memory374857
Node: Arithmetic392758
Node: Comparisons402848
Node: Bit-Fields407140
Node: Vector Operations408692
Node: Conversions410527
Node: RTL Declarations415025
Node: Side Effects415846
Node: Incdec432446
Node: Assembler435781
Node: Debug Information437326
Node: Insns438524
Node: Calls464746
Node: Sharing467339
Node: Reading RTL470449
Node: GENERIC471441
Node: Deficiencies473314
Node: Tree overview473555
Node: Macros and Functions477682
Node: Identifiers478507
Node: Containers480118
Node: Types481275
Node: Declarations493371
Node: Working with declarations493866
Node: Internal structure499472
Node: Current structure hierarchy499856
Node: Adding new DECL node types501950
Node: Attributes506023
Node: Expression trees507268
Node: Constant expressions509021
Node: Storage References513240
Node: Unary and Binary Expressions516759
Node: Vectors536177
Node: Statements540201
Node: Basic Statements540721
Node: Blocks545228
Node: Statement Sequences546632
Node: Empty Statements546965
Node: Jumps547539
Node: Cleanups548192
Node: OpenMP549960
Node: Functions555800
Node: Function Basics556271
Node: Function Properties559956
Node: Language-dependent trees562738
Node: C and C++ Trees563624
Node: Types for C++566528
Node: Namespaces571498
Node: Classes574605
Node: Functions for C++579683
Node: Statements for C++585936
Node: C++ Expressions593984
Node: Java Trees595485
Node: GIMPLE595598
Node: Tuple representation599219
Node: GIMPLE instruction set607495
Node: GIMPLE Exception Handling609163
Node: Temporaries611077
Ref: Temporaries-Footnote-1612392
Node: Operands612455
Node: Compound Expressions613217
Node: Compound Lvalues613451
Node: Conditional Expressions614213
Node: Logical Operators614871
Node: Manipulating GIMPLE statements621628
Node: Tuple specific accessors627562
Node: `GIMPLE_ASM'628381
Node: `GIMPLE_ASSIGN'631014
Node: `GIMPLE_BIND'635120
Node: `GIMPLE_CALL'636927
Node: `GIMPLE_CATCH'641197
Node: `GIMPLE_COND'642341
Node: `GIMPLE_DEBUG'645129
Node: `GIMPLE_EH_FILTER'648512
Node: `GIMPLE_LABEL'650000
Node: `GIMPLE_NOP'650975
Node: `GIMPLE_OMP_ATOMIC_LOAD'651344
Node: `GIMPLE_OMP_ATOMIC_STORE'652254
Node: `GIMPLE_OMP_CONTINUE'652893
Node: `GIMPLE_OMP_CRITICAL'654243
Node: `GIMPLE_OMP_FOR'655180
Node: `GIMPLE_OMP_MASTER'658695
Node: `GIMPLE_OMP_ORDERED'659078
Node: `GIMPLE_OMP_PARALLEL'659478
Node: `GIMPLE_OMP_RETURN'662250
Node: `GIMPLE_OMP_SECTION'662900
Node: `GIMPLE_OMP_SECTIONS'663566
Node: `GIMPLE_OMP_SINGLE'665172
Node: `GIMPLE_PHI'666109
Node: `GIMPLE_RESX'667395
Node: `GIMPLE_RETURN'668114
Node: `GIMPLE_SWITCH'668682
Node: `GIMPLE_TRY'670820
Node: `GIMPLE_WITH_CLEANUP_EXPR'672610
Node: GIMPLE sequences673493
Node: Sequence iterators676699
Node: Adding a new GIMPLE statement code685155
Node: Statement and operand traversals686431
Node: Tree SSA689031
Node: Annotations690817
Node: SSA Operands691343
Node: SSA705874
Node: Alias analysis718165
Node: Memory model721945
Node: Loop Analysis and Representation723308
Node: Loop representation724489
Node: Loop querying731409
Node: Loop manipulation734242
Node: LCSSA736610
Node: Scalar evolutions738682
Node: loop-iv741926
Node: Number of iterations743852
Node: Dependency analysis746661
Node: Lambda753029
Node: Omega754700
Node: Control Flow756265
Node: Basic Blocks757260
Node: Edges761828
Node: Profile information770390
Node: Maintaining the CFG775076
Node: Liveness information781953
Node: Machine Desc784079
Node: Overview786547
Node: Patterns788588
Node: Example792026
Node: RTL Template793461
Node: Output Template804116
Node: Output Statement808081
Node: Predicates812043
Node: Machine-Independent Predicates814961
Node: Defining Predicates819906
Node: Constraints825871
Node: Simple Constraints827353
Node: Multi-Alternative840209
Node: Class Preferences843050
Node: Modifiers843942
Node: Machine Constraints848074
Node: Disable Insn Alternatives898063
Node: Define Constraints900956
Node: C Constraint Interface907737
Node: Standard Names911378
Ref: shift patterns933953
Ref: prologue instruction pattern975427
Ref: window_save instruction pattern975920
Ref: epilogue instruction pattern976195
Node: Pattern Ordering993298
Node: Dependent Patterns994534
Node: Jump Patterns996154
Ref: Jump Patterns-Footnote-1998298
Node: Looping Patterns998344
Node: Insn Canonicalizations1003072
Node: Expander Definitions1007663
Node: Insn Splitting1015781
Node: Including Patterns1025383
Node: Peephole Definitions1027163
Node: define_peephole1028416
Node: define_peephole21034747
Node: Insn Attributes1037814
Node: Defining Attributes1038920
Ref: define_enum_attr1041957
Node: Expressions1042992
Node: Tagging Insns1050262
Node: Attr Example1054615
Node: Insn Lengths1056989
Node: Constant Attributes1060048
Node: Delay Slots1061217
Node: Processor pipeline description1064441
Ref: Processor pipeline description-Footnote-11083254
Node: Conditional Execution1083576
Node: Constant Definitions1086646
Ref: define_enum1090437
Node: Iterators1090925
Node: Mode Iterators1091428
Node: Defining Mode Iterators1092406
Node: Substitutions1093900
Node: Examples1096141
Node: Code Iterators1097589
Node: Int Iterators1099868
Node: Target Macros1102302
Node: Target Structure1105390
Node: Driver1107505
Node: Run-time Target1126573
Node: Per-Function Data1135357
Node: Storage Layout1138122
Node: Type Layout1164130
Node: Registers1179012
Node: Register Basics1179986
Node: Allocation Order1185491
Node: Values in Registers1187937
Node: Leaf Functions1195426
Node: Stack Registers1198284
Node: Register Classes1199556
Node: Old Constraints1228170
Node: Stack and Calling1235322
Node: Frame Layout1235856
Node: Exception Handling1246736
Node: Stack Checking1252942
Node: Frame Registers1257755
Node: Elimination1266014
Node: Stack Arguments1270243
Node: Register Arguments1277140
Node: Scalar Return1297456
Node: Aggregate Return1303542
Node: Caller Saves1307752
Node: Function Entry1308930
Node: Profiling1321558
Node: Tail Calls1323257
Node: Stack Smashing Protection1324869
Node: Varargs1326501
Node: Trampolines1333197
Node: Library Calls1339240
Node: Addressing Modes1344179
Node: Anchored Addresses1363988
Node: Condition Code1366637
Node: CC0 Condition Codes1368766
Node: MODE_CC Condition Codes1372012
Node: Cond Exec Macros1378239
Node: Costs1379216
Node: Scheduling1395634
Node: Sections1415040
Node: PIC1430738
Node: Assembler Format1432798
Node: File Framework1433936
Ref: TARGET_HAVE_SWITCHABLE_BSS_SECTIONS1440832
Node: Data Output1444097
Node: Uninitialized Data1451873
Node: Label Output1456884
Node: Initialization1479956
Node: Macros for Initialization1485918
Node: Instruction Output1492641
Node: Dispatch Tables1503143
Node: Exception Region Output1507521
Node: Alignment Output1513879
Node: Debugging Info1518424
Node: All Debuggers1519094
Node: DBX Options1521949
Node: DBX Hooks1527398
Node: File Names and DBX1529324
Node: SDB and DWARF1531436
Node: VMS Debug1537508
Node: Floating Point1538095
Node: Mode Switching1542918
Node: Target Attributes1546844
Node: Emulated TLS1554756
Node: MIPS Coprocessors1558146
Node: PCH Target1559715
Node: C++ ABI1561557
Node: Named Address Spaces1566349
Node: Misc1571288
Ref: TARGET_SHIFT_TRUNCATION_MASK1578716
Node: Host Config1621838
Node: Host Common1622906
Node: Filesystem1625285
Node: Host Misc1629400
Node: Fragments1631849
Node: Target Fragment1633044
Node: Host Fragment1642074
Node: Collect21642314
Node: Header Dirs1644950
Node: Type Information1646373
Node: GTY Options1648730
Node: GGC Roots1662558
Node: Files1663278
Node: Invoking the garbage collector1666024
Node: Troubleshooting1667527
Node: Plugins1668603
Node: LTO1685481
Node: Funding1710527
Node: GNU Project1713010
Node: Copying1713659
Node: GNU Free Documentation License1751190
Node: Contributors1776330
Node: Option Index1813735
Node: Concept Index1814539

End Tag Table
