]> oss.titaniummirror.com Git - msp430-gcc.git/blobdiff - gcc/doc/gccint.info-5
State of the tree after a full build and a debian/rules clean. Dirty orig.tar?
[msp430-gcc.git] / gcc / doc / gccint.info-5
diff --git a/gcc/doc/gccint.info-5 b/gcc/doc/gccint.info-5
deleted file mode 100644 (file)
index c9624ef..0000000
+++ /dev/null
@@ -1,1205 +0,0 @@
-This is doc/gccint.info, produced by makeinfo version 4.5 from
-doc/gccint.texi.
-
-INFO-DIR-SECTION Programming
-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.
-
-   Published by the Free Software Foundation
-59 Temple Place - Suite 330
-Boston, MA 02111-1307 USA
-
-   Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
-1999, 2000, 2001, 2002 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.1 or
-any later version published by the Free Software Foundation; with the
-Invariant Sections being "GNU General Public License" and "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.
-
-\1f
-File: gccint.info,  Node: RTL Classes,  Next: Accessors,  Prev: RTL Objects,  Up: RTL
-
-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,
-`rtx.def' defines these classes:
-
-`o'
-     An RTX code that represents an actual object, such as a register
-     (`REG') or a memory location (`MEM', `SYMBOL_REF').  Constants and
-     basic transforms on objects (`ADDRESSOF', `HIGH', `LO_SUM') are
-     also included.  Note that `SUBREG' and `STRICT_LOW_PART' are not
-     in this class, but in class `x'.
-
-`<'
-     An RTX code for a comparison, such as `NE' or `LT'.
-
-`1'
-     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.
-
-`c'
-     An RTX code for a commutative binary operation, such as `PLUS' or
-     `AND'.  `NE' and `EQ' are comparisons, so they have class `<'.
-
-`2'
-     An RTX code for a non-commutative binary operation, such as
-     `MINUS', `DIV', or `ASHIFTRT'.
-
-`b'
-     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::.
-
-`3'
-     An RTX code for other three input operations.  Currently only
-     `IF_THEN_ELSE'.
-
-`i'
-     An RTX code for an entire instruction:  `INSN', `JUMP_INSN', and
-     `CALL_INSN'.  *Note Insns::.
-
-`m'
-     An RTX code for something that matches in insns, such as
-     `MATCH_DUP'.  These only occur in machine descriptions.
-
-`a'
-     An RTX code for an auto-increment addressing mode, such as
-     `POST_INC'.
-
-`x'
-     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'.
-
-   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.
-
-`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.
-
-\1f
-File: gccint.info,  Node: Accessors,  Next: Flags,  Prev: RTL Classes,  Up: RTL
-
-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.
-
-\1f
-File: gccint.info,  Node: Flags,  Next: Machine Modes,  Prev: Accessors,  Up: RTL
-
-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'.
-
-`CONST_OR_PURE_CALL_P (X)'
-     In a `call_insn', `note', or an `expr_list' for notes, indicates
-     that the insn represents a call to a const or pure function.
-     Stored in the `unchanging' field and printed as `/u'.
-
-`INSN_ANNULLED_BRANCH_P (X)'
-     In an `insn' in the delay slot of a branch insn, indicates that an
-     annulling branch should be used.  See the discussion under
-     `sequence' below.  Stored in the `unchanging' field and printed as
-     `/u'.
-
-`INSN_DEAD_CODE_P (X)'
-     In an `insn' during the dead-code elimination pass, nonzero if the
-     insn is dead.  Stored in the `in_struct' field and printed as `/s'.
-
-`INSN_DELETED_P (X)'
-     In an `insn', nonzero if the insn has been deleted.  Stored in the
-     `volatil' field and printed as `/v'.
-
-`INSN_FROM_TARGET_P (X)'
-     In an `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_OUTSIDE_LOOP_P (X)'
-     In `label_ref' expressions, nonzero if this is a reference to a
-     label that is outside the innermost loop containing the reference
-     to the label.  Stored in the `in_struct' field and printed as `/s'.
-
-`LABEL_PRESERVE_P (X)'
-     In a `code_label', 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'.
-
-`LINK_COST_FREE (X)'
-     In the `LOG_LINKS' `insn_list' during scheduling, nonzero when the
-     cost of executing an instruction through the link is zero, i.e.,
-     the link makes the cost free.  Stored in the `call' field and
-     printed as `/c'.
-
-`LINK_COST_ZERO (X)'
-     In the `LOG_LINKS' `insn_list' during scheduling, nonzero when the
-     cost of executing an instruction through the link varies and is
-     unchanged, i.e., the link has zero additional cost.  Stored in the
-     `jump' field and printed as `/j'.
-
-`MEM_IN_STRUCT_P (X)'
-     In `mem' expressions, nonzero for reference to an entire structure,
-     union or array, or to a component of one.  Zero for references to a
-     scalar variable or through a pointer to a scalar.  If both this
-     flag and `MEM_SCALAR_P' are clear, then we don't know whether this
-     `mem' is in a structure or not.  Both flags should never be
-     simultaneously set.  Stored in the `in_struct' field and printed
-     as `/s'.
-
-`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_SCALAR_P (X)'
-     In `mem' expressions, nonzero for reference to a scalar known not
-     to be a member of a structure, union, or array.  Zero for such
-     references and for indirections through pointers, even pointers
-     pointing to scalar types.  If both this flag and `MEM_IN_STRUCT_P'
-     are clear, then we don't know whether this `mem' is in a structure
-     or not.  Both flags should never be simultaneously set.  Stored in
-     the `frame_related' field and printed as `/f'.
-
-`MEM_VOLATILE_P (X)'
-     In `mem' and `asm_operands' expressions, nonzero for volatile
-     memory references.  Stored in the `volatil' field and printed as
-     `/v'.
-
-`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 `integrated' field and printed as `/i'.
-
-`REG_LOOP_TEST_P (X)'
-     In `reg' expressions, nonzero if this register's entire life is
-     contained in the exit test code for some loop.  Stored in the
-     `in_struct' field and printed as `/s'.
-
-`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' 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.
-
-`RTX_INTEGRATED_P (X)'
-     Nonzero in an `insn', `insn_list', or `const' if it resulted from
-     an in-line function call.  Stored in the `integrated' field and
-     printed as `/i'.
-
-`RTX_UNCHANGING_P (X)'
-     Nonzero in a `reg' or `mem' if the memory is set at most once,
-     anywhere.  This does not mean that it is function invariant.
-     Stored in the `unchanging' field and printed as `/u'.
-
-`SCHED_GROUP_P (X)'
-     During instruction scheduling, in an `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)'
-     Nonzero in a `subreg' that has `SUBREG_PROMOTED_VAR_P' nonzero if
-     the object being referenced is kept zero-extended and zero if it
-     is kept sign-extended.  Stored in the `unchanging' field and
-     printed as `/u'.
-
-`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_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'.
-
-`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 `integrated' field and printed as `/i'.
-
-   These are the fields to which the above macros refer:
-
-`call'
-     In the `LOG_LINKS' of an `insn_list' during scheduling, 1 means
-     that the cost of executing an instruction through the link is zero.
-
-     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 `symbol_ref' expressions, 1 means that the reference addresses
-     this function's string constant pool.
-
-     In `mem' expressions, 1 means that the reference is to a scalar.
-
-     In an RTL dump, this flag is represented as `/f'.
-
-`in_struct'
-     In `mem' expressions, it is 1 if the memory datum referred to is
-     all or part of a structure or array; 0 if it is (or might be) a
-     scalar variable.  A reference through a C pointer has 0 because
-     the pointer might point to a scalar variable.  This information
-     allows the compiler to determine something about possible cases of
-     aliasing.
-
-     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' 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'.
-
-`integrated'
-     In an `insn', `insn_list', or `const', 1 means the RTL was
-     produced by procedure integration.
-
-     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 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 the `LOG_LINKS' of an `insn_list' during scheduling, 1 means the
-     cost of executing an instruction through the link varies and is
-     unchanging.
-
-     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', 1 means that this is an annulling branch.
-
-     In a `symbol_ref' expression, 1 means that this symbol addresses
-     something in the per-function constant pool.
-
-     In a `call_insn', `note', or an `expr_list' of notes, 1 means that
-     this instruction is a call to a const or pure 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' or `asm_operands' 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 an RTL dump, this flag is represented as `/v'.
-
-\1f
-File: gccint.info,  Node: Machine Modes,  Next: Constants,  Prev: Flags,  Up: RTL
-
-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 a twelve byte floating point
-     number.  This mode is used for IEEE extended floating point.  On
-     some systems not all bits within these bytes will actually be used.
-
-`TFmode'
-     "Tetra Floating" mode represents a sixteen byte floating point
-     number.  This gets used for both the 96-bit extended IEEE
-     floating-point types padded to 128 bits, and true 128-bit extended
-     IEEE floating-point types.
-
-`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' (see *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_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 modes listed in the `EXTRA_CC_MODES' macro.  *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_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.
-
-\1f
-File: gccint.info,  Node: Constants,  Next: Regs and Memory,  Prev: Machine Modes,  Up: RTL
-
-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)'.
-
-     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 ADDR 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'.
-
-`(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' or `const_double' 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.
-
-     ADDR is used to contain the `mem' expression that corresponds to
-     the location in memory that at which the constant can be found.  If
-     it has not been allocated a memory location, but is on the chain
-     of all `const_double' expressions in this compilation (maintained
-     using an undisplayed field), ADDR contains `const0_rtx'.  If it is
-     not on the chain, ADDR contains `cc0_rtx'.  ADDR is customarily
-     accessed with the macro `CONST_DOUBLE_MEM' and the chain field via
-     `CONST_DOUBLE_CHAIN'.
-
-     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 Cross-compilation::).  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::).
-
-     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.
-
-`(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 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.
-
-`(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'.
-
-\1f
-File: gccint.info,  Node: Regs and Memory,  Next: Arithmetic,  Prev: Constants,  Up: RTL
-
-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, 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:M REG 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--for example, to perform a
-     fullword move instruction on a pseudo-register that contains a
-     single byte--the pseudo-register must be enclosed in a `subreg'.
-     In such a case, BYTENUM is zero.
-
-     Usually M is at least as narrow as the mode of REG, in which case
-     it is restricting consideration to only the bits of REG that are
-     in M.
-
-     Sometimes M is wider than the mode of REG.  These `subreg'
-     expressions are often called "paradoxical".  They are used in
-     cases where we want to refer to an object in a wider mode but do
-     not care what value the additional bits have.  The reload pass
-     ensures that paradoxical references are only made to hard
-     registers.
-
-     The other use of `subreg' is to extract the individual registers of
-     a multi-register value.  Machine modes such as `DImode' and
-     `TImode' can indicate values longer than a word, values which
-     usually require two or more consecutive registers.  To access one
-     of the registers, use a `subreg' with mode `SImode' and a BYTENUM
-     offset that says which register.
-
-     Storing in a non-paradoxical `subreg' has undefined results for
-     bits belonging to the same word as the `subreg'.  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' around the `subreg'.
-
-     The compilation parameter `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.
-
-     The compilation parameter `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'.
-
-     Between the combiner pass and the reload pass, it is possible to
-     have a paradoxical `subreg' which contains a `mem' instead of a
-     `reg' as its first operand.  After the reload pass, it is also
-     possible to have a non-paradoxical `subreg' which contains a
-     `mem'; this usually occurs when the `mem' is a stack slot which
-     replaced a pseudo register.
-
-     Note that it is not valid to access a `DFmode' value in `SFmode'
-     using a `subreg'.  On some machines the most significant part of a
-     `DFmode' value does not have the same format as a single-precision
-     floating value.
-
-     It is also not valid to access a single word of a multi-word value
-     in a hard register when less registers can hold the value than
-     would be expected from its size.  For example, some 32-bit
-     machines have floating-point registers that can hold an entire
-     `DFmode' value.  If register 10 were such a register `(subreg:SI
-     (reg:DF 10) 1)' would be invalid because there is no way to
-     convert that reference to a single machine register.  The reload
-     pass prevents `subreg' expressions such as these from being formed.
-
-     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.
-
-`(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.
-
-`(addressof:M REG)'
-     This RTX represents a request for the address of register REG.
-     Its mode is always `Pmode'.  If there are any `addressof'
-     expressions left in the function after CSE, REG is forced into the
-     stack and the `addressof' expression is replaced with a `plus'
-     expression for the address of its stack slot.
-