]> oss.titaniummirror.com Git - msp430-gcc.git/blobdiff - gcc/doc/gcc.info-14
Imported gcc-4.4.3
[msp430-gcc.git] / gcc / doc / gcc.info-14
diff --git a/gcc/doc/gcc.info-14 b/gcc/doc/gcc.info-14
deleted file mode 100644 (file)
index 2ea99d1..0000000
+++ /dev/null
@@ -1,1584 +0,0 @@
-This is doc/gcc.info, produced by makeinfo version 4.5 from
-doc/gcc.texi.
-
-INFO-DIR-SECTION Programming
-START-INFO-DIR-ENTRY
-* gcc: (gcc).                  The GNU Compiler Collection.
-END-INFO-DIR-ENTRY
-   This file documents the use 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: gcc.info,  Node: Machine Constraints,  Prev: Modifiers,  Up: Constraints
-
-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.
-
-   For each machine architecture, the `config/MACHINE/MACHINE.h' file
-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
-interesting for `asm'.  The constraints are defined through these
-macros:
-
-`REG_CLASS_FROM_LETTER'
-     Register class constraints (usually lower case).
-
-`CONST_OK_FOR_LETTER_P'
-     Immediate constant constraints, for non-floating point constants of
-     word size or smaller precision (usually upper case).
-
-`CONST_DOUBLE_OK_FOR_LETTER_P'
-     Immediate constant constraints, for all floating point constants
-     and for constants of greater than word size precision (usually
-     upper case).
-
-`EXTRA_CONSTRAINT'
-     Special cases of registers or memory.  This macro is not required,
-     and is only defined for some machines.
-
-   Inspecting these macro definitions in the compiler source for your
-machine is the best way to be certain you have the right constraints.
-However, here is a summary of the machine-dependent constraints
-available on some particular machines.
-
-_ARM family--`arm.h'_
-
-    `f'
-          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
-
-_AMD 29000 family--`a29k.h'_
-
-    `l'
-          Local register 0
-
-    `b'
-          Byte Pointer (`BP') register
-
-    `q'
-          `Q' register
-
-    `h'
-          Special purpose register
-
-    `A'
-          First accumulator register
-
-    `a'
-          Other accumulator register
-
-    `f'
-          Floating point register
-
-    `I'
-          Constant greater than 0, less than 0x100
-
-    `J'
-          Constant greater than 0, less than 0x10000
-
-    `K'
-          Constant whose high 24 bits are on (1)
-
-    `L'
-          16-bit constant whose high 8 bits are on (1)
-
-    `M'
-          32-bit constant whose high 16 bits are on (1)
-
-    `N'
-          32-bit negative constant that fits in 8 bits
-
-    `O'
-          The constant 0x80000000 or, on the 29050, any 32-bit constant
-          whose low 16 bits are 0.
-
-    `P'
-          16-bit negative constant that fits in 8 bits
-
-    `G'
-    `H'
-          A floating point constant (in `asm' statements, use the
-          machine independent `E' or `F' instead)
-
-_AVR family--`avr.h'_
-
-    `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
-
-_IBM RS6000--`rs6000.h'_
-
-    `b'
-          Address base register
-
-    `f'
-          Floating point 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'
-          `FPMEM' stack memory for FPR-GPR transfers
-
-    `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
-
-    `Q'
-          Memory operand that is an offset from a register (`m' is
-          preferable for `asm' statements)
-
-    `R'
-          AIX TOC entry
-
-    `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
-
-_Intel 386--`i386.h'_
-
-    `q'
-          `a', `b', `c', or `d' register for the i386.  For x86-64 it
-          is equivalent to `r' class. (for 8-bit instructions that do
-          not use upper halves)
-
-    `Q'
-          `a', `b', `c', or `d' register. (for 8-bit instructions, that
-          do use upper halves)
-
-    `R'
-          Legacy register--equivalent to `r' class in i386 mode.  (for
-          non-8-bit registers used together with 8-bit upper halves in
-          a single instruction)
-
-    `A'
-          Specifies the `a' or `d' registers.  This is primarily useful
-          for 64-bit integer values (when in 32-bit mode) intended to
-          be returned with the `d' register holding the most
-          significant bits and the `a' register holding the least
-          significant bits.
-
-    `f'
-          Floating point register
-
-    `t'
-          First (top of stack) floating point register
-
-    `u'
-          Second floating point register
-
-    `a'
-          `a' register
-
-    `b'
-          `b' register
-
-    `c'
-          `c' register
-
-    `d'
-          `d' register
-
-    `D'
-          `di' register
-
-    `S'
-          `si' register
-
-    `x'
-          `xmm' SSE register
-
-    `y'
-          MMX register
-
-    `I'
-          Constant in range 0 to 31 (for 32-bit shifts)
-
-    `J'
-          Constant in range 0 to 63 (for 64-bit shifts)
-
-    `K'
-          `0xff'
-
-    `L'
-          `0xffff'
-
-    `M'
-          0, 1, 2, or 3 (shifts for `lea' instruction)
-
-    `N'
-          Constant in range 0 to 255 (for `out' instruction)
-
-    `Z'
-          Constant in range 0 to `0xffffffff' or symbolic reference
-          known to fit specified range.  (for using immediates in zero
-          extending 32-bit to 64-bit x86-64 instructions)
-
-    `e'
-          Constant in range -2147483648 to 2147483647 or symbolic
-          reference known to fit specified range.  (for using
-          immediates in 64-bit x86-64 instructions)
-
-    `G'
-          Standard 80387 floating point constant
-
-_Intel 960--`i960.h'_
-
-    `f'
-          Floating point register (`fp0' to `fp3')
-
-    `l'
-          Local register (`r0' to `r15')
-
-    `b'
-          Global register (`g0' to `g15')
-
-    `d'
-          Any local or global register
-
-    `I'
-          Integers from 0 to 31
-
-    `J'
-          0
-
-    `K'
-          Integers from -31 to 0
-
-    `G'
-          Floating point 0
-
-    `H'
-          Floating point 1
-
-_MIPS--`mips.h'_
-
-    `d'
-          General-purpose integer register
-
-    `f'
-          Floating-point register (if available)
-
-    `h'
-          `Hi' register
-
-    `l'
-          `Lo' register
-
-    `x'
-          `Hi' or `Lo' register
-
-    `y'
-          General-purpose integer register
-
-    `z'
-          Floating-point status register
-
-    `I'
-          Signed 16-bit constant (for arithmetic instructions)
-
-    `J'
-          Zero
-
-    `K'
-          Zero-extended 16-bit constant (for logic instructions)
-
-    `L'
-          Constant with low 16 bits zero (can be loaded with `lui')
-
-    `M'
-          32-bit constant which requires two instructions to load (a
-          constant which is not `I', `K', or `L')
-
-    `N'
-          Negative 16-bit constant
-
-    `O'
-          Exact power of two
-
-    `P'
-          Positive 16-bit constant
-
-    `G'
-          Floating point zero
-
-    `Q'
-          Memory reference that can be loaded with more than one
-          instruction (`m' is preferable for `asm' statements)
-
-    `R'
-          Memory reference that can be loaded with one instruction (`m'
-          is preferable for `asm' statements)
-
-    `S'
-          Memory reference in external OSF/rose PIC format (`m' is
-          preferable for `asm' statements)
-
-_Motorola 680x0--`m68k.h'_
-
-    `a'
-          Address register
-
-    `d'
-          Data register
-
-    `f'
-          68881 floating-point register, if available
-
-    `x'
-          Sun FPA (floating-point) register, if available
-
-    `y'
-          First 16 Sun FPA registers, 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
-
-    `G'
-          Floating point constant that is not a 68881 constant
-
-    `H'
-          Floating point constant that can be used by Sun FPA
-
-_Motorola 68HC11 & 68HC12 families--`m68hc11.h'_
-
-    `a'
-          Register 'a'
-
-    `b'
-          Register 'b'
-
-    `d'
-          Register 'd'
-
-    `q'
-          An 8-bit register
-
-    `t'
-          Temporary soft register _.tmp
-
-    `u'
-          A soft register _.d1 to _.d31
-
-    `w'
-          Stack pointer register
-
-    `x'
-          Register 'x'
-
-    `y'
-          Register 'y'
-
-    `z'
-          Pseudo register 'z' (replaced by 'x' or 'y' at the end)
-
-    `A'
-          An address register: x, y or z
-
-    `B'
-          An address register: x or y
-
-    `D'
-          Register pair (x:d) to form a 32-bit value
-
-    `L'
-          Constants in the range -65536 to 65535
-
-    `M'
-          Constants whose 16-bit low part is zero
-
-    `N'
-          Constant integer 1 or -1
-
-    `O'
-          Constant integer 16
-
-    `P'
-          Constants in the range -8 to 2
-
-
-_SPARC--`sparc.h'_
-
-    `f'
-          Floating-point register that can hold 32- or 64-bit values.
-
-    `e'
-          Floating-point register that can hold 64- or 128-bit values.
-
-    `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'
-
-    `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.
-
-
-_TMS320C3x/C4x--`c4x.h'_
-
-    `a'
-          Auxiliary (address) register (ar0-ar7)
-
-    `b'
-          Stack pointer register (sp)
-
-    `c'
-          Standard (32-bit) precision integer register
-
-    `f'
-          Extended (40-bit) precision register (r0-r11)
-
-    `k'
-          Block count register (bk)
-
-    `q'
-          Extended (40-bit) precision low register (r0-r7)
-
-    `t'
-          Extended (40-bit) precision register (r0-r1)
-
-    `u'
-          Extended (40-bit) precision register (r2-r3)
-
-    `v'
-          Repeat count register (rc)
-
-    `x'
-          Index register (ir0-ir1)
-
-    `y'
-          Status (condition code) register (st)
-
-    `z'
-          Data page register (dp)
-
-    `G'
-          Floating-point zero
-
-    `H'
-          Immediate 16-bit floating-point constant
-
-    `I'
-          Signed 16-bit constant
-
-    `J'
-          Signed 8-bit constant
-
-    `K'
-          Signed 5-bit constant
-
-    `L'
-          Unsigned 16-bit constant
-
-    `M'
-          Unsigned 8-bit constant
-
-    `N'
-          Ones complement of unsigned 16-bit constant
-
-    `O'
-          High 16-bit constant (32-bit constant with 16 LSBs zero)
-
-    `Q'
-          Indirect memory reference with signed 8-bit or index register
-          displacement
-
-    `R'
-          Indirect memory reference with unsigned 5-bit displacement
-
-    `S'
-          Indirect memory reference with 1 bit or index register
-          displacement
-
-    `T'
-          Direct memory reference
-
-    `U'
-          Symbolic address
-
-
-_S/390 and zSeries--`s390.h'_
-
-    `a'
-          Address register (general purpose register except r0)
-
-    `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'
-          Unsigned 16-bit constant (0-65535)
-
-    `Q'
-          Memory reference without index register
-
-    `S'
-          Symbolic constant suitable for use with the `larl' instruction
-
-
-_Xstormy16--`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 an 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.
-
-
-_Xtensa--`xtensa.h'_
-
-    `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
-
-
-
-\1f
-File: gcc.info,  Node: Asm Labels,  Next: Explicit Reg Vars,  Prev: Constraints,  Up: C Extensions
-
-Controlling Names Used in Assembler Code
-========================================
-
-   You can specify the name to be used in the assembler code for a C
-function or variable by writing the `asm' (or `__asm__') keyword after
-the declarator as follows:
-
-     int foo asm ("myfoo") = 2;
-
-This specifies that the name to be used for the variable `foo' in the
-assembler code should be `myfoo' rather than the usual `_foo'.
-
-   On systems where an underscore is normally prepended to the name of
-a C function or variable, this feature allows you to define names for
-the linker that do not start with an underscore.
-
-   It does not make sense to use this feature with a non-static local
-variable since such variables do not have assembler names.  If you are
-trying to put the variable in a particular register, see *Note Explicit
-Reg Vars::.  GCC presently accepts such code with a warning, but will
-probably be changed to issue an error, rather than a warning, in the
-future.
-
-   You cannot use `asm' in this way in a function _definition_; but you
-can get the same effect by writing a declaration for the function
-before its definition and putting `asm' there, like this:
-
-     extern func () asm ("FUNC");
-     
-     func (x, y)
-          int x, y;
-     ...
-
-   It is up to you to make sure that the assembler names you choose do
-not conflict with any other assembler symbols.  Also, you must not use a
-register name; that would produce completely invalid assembler code.
-GCC does not as yet have the ability to store static variables in
-registers.  Perhaps that will be added.
-
-\1f
-File: gcc.info,  Node: Explicit Reg Vars,  Next: Alternate Keywords,  Prev: Asm Labels,  Up: C Extensions
-
-Variables in Specified Registers
-================================
-
-   GNU C allows you to put a few global variables into specified
-hardware registers.  You can also specify the register in which an
-ordinary register variable should be allocated.
-
-   * Global register variables reserve registers throughout the program.
-     This may be useful in programs such as programming language
-     interpreters which have a couple of global variables that are
-     accessed very often.
-
-   * Local register variables in specific registers do not reserve the
-     registers.  The compiler's data flow analysis is capable of
-     determining where the specified registers contain live values, and
-     where they are available for other uses.  Stores into local
-     register variables may be deleted when they appear to be dead
-     according to dataflow analysis.  References to local register
-     variables may be deleted or moved or simplified.
-
-     These local variables are sometimes convenient for use with the
-     extended `asm' feature (*note Extended Asm::), if you want to
-     write one output of the assembler instruction directly into a
-     particular register.  (This will work provided the register you
-     specify fits the constraints specified for that operand in the
-     `asm'.)
-
-* Menu:
-
-* Global Reg Vars::
-* Local Reg Vars::
-
-\1f
-File: gcc.info,  Node: Global Reg Vars,  Next: Local Reg Vars,  Up: Explicit Reg Vars
-
-Defining Global Register Variables
-----------------------------------
-
-   You can define a global register variable in GNU C like this:
-
-     register int *foo asm ("a5");
-
-Here `a5' is the name of the register which should be used.  Choose a
-register which is normally saved and restored by function calls on your
-machine, so that library routines will not clobber it.
-
-   Naturally the register name is cpu-dependent, so you would need to
-conditionalize your program according to cpu type.  The register `a5'
-would be a good choice on a 68000 for a variable of pointer type.  On
-machines with register windows, be sure to choose a "global" register
-that is not affected magically by the function call mechanism.
-
-   In addition, operating systems on one type of cpu may differ in how
-they name the registers; then you would need additional conditionals.
-For example, some 68000 operating systems call this register `%a5'.
-
-   Eventually there may be a way of asking the compiler to choose a
-register automatically, but first we need to figure out how it should
-choose and how to enable you to guide the choice.  No solution is
-evident.
-
-   Defining a global register variable in a certain register reserves
-that register entirely for this use, at least within the current
-compilation.  The register will not be allocated for any other purpose
-in the functions in the current compilation.  The register will not be
-saved and restored by these functions.  Stores into this register are
-never deleted even if they would appear to be dead, but references may
-be deleted or moved or simplified.
-
-   It is not safe to access the global register variables from signal
-handlers, or from more than one thread of control, because the system
-library routines may temporarily use the register for other things
-(unless you recompile them specially for the task at hand).
-
-   It is not safe for one function that uses a global register variable
-to call another such function `foo' by way of a third function `lose'
-that was compiled without knowledge of this variable (i.e. in a
-different source file in which the variable wasn't declared).  This is
-because `lose' might save the register and put some other value there.
-For example, you can't expect a global register variable to be
-available in the comparison-function that you pass to `qsort', since
-`qsort' might have put something else in that register.  (If you are
-prepared to recompile `qsort' with the same global register variable,
-you can solve this problem.)
-
-   If you want to recompile `qsort' or other source files which do not
-actually use your global register variable, so that they will not use
-that register for any other purpose, then it suffices to specify the
-compiler option `-ffixed-REG'.  You need not actually add a global
-register declaration to their source code.
-
-   A function which can alter the value of a global register variable
-cannot safely be called from a function compiled without this variable,
-because it could clobber the value the caller expects to find there on
-return.  Therefore, the function which is the entry point into the part
-of the program that uses the global register variable must explicitly
-save and restore the value which belongs to its caller.
-
-   On most machines, `longjmp' will restore to each global register
-variable the value it had at the time of the `setjmp'.  On some
-machines, however, `longjmp' will not change the value of global
-register variables.  To be portable, the function that called `setjmp'
-should make other arrangements to save the values of the global register
-variables, and to restore them in a `longjmp'.  This way, the same
-thing will happen regardless of what `longjmp' does.
-
-   All global register variable declarations must precede all function
-definitions.  If such a declaration could appear after function
-definitions, the declaration would be too late to prevent the register
-from being used for other purposes in the preceding functions.
-
-   Global register variables may not have initial values, because an
-executable file has no means to supply initial contents for a register.
-
-   On the Sparc, there are reports that g3 ... g7 are suitable
-registers, but certain library functions, such as `getwd', as well as
-the subroutines for division and remainder, modify g3 and g4.  g1 and
-g2 are local temporaries.
-
-   On the 68000, a2 ... a5 should be suitable, as should d2 ... d7.  Of
-course, it will not do to use more than a few of those.
-
-\1f
-File: gcc.info,  Node: Local Reg Vars,  Prev: Global Reg Vars,  Up: Explicit Reg Vars
-
-Specifying Registers for Local Variables
-----------------------------------------
-
-   You can define a local register variable with a specified register
-like this:
-
-     register int *foo asm ("a5");
-
-Here `a5' is the name of the register which should be used.  Note that
-this is the same syntax used for defining global register variables,
-but for a local variable it would appear within a function.
-
-   Naturally the register name is cpu-dependent, but this is not a
-problem, since specific registers are most often useful with explicit
-assembler instructions (*note Extended Asm::).  Both of these things
-generally require that you conditionalize your program according to cpu
-type.
-
-   In addition, operating systems on one type of cpu may differ in how
-they name the registers; then you would need additional conditionals.
-For example, some 68000 operating systems call this register `%a5'.
-
-   Defining such a register variable does not reserve the register; it
-remains available for other uses in places where flow control determines
-the variable's value is not live.  However, these registers are made
-unavailable for use in the reload pass; excessive use of this feature
-leaves the compiler too few available registers to compile certain
-functions.
-
-   This option does not guarantee that GCC will generate code that has
-this variable in the register you specify at all times.  You may not
-code an explicit reference to this register in an `asm' statement and
-assume it will always refer to this variable.
-
-   Stores into local register variables may be deleted when they appear
-to be dead according to dataflow analysis.  References to local
-register variables may be deleted or moved or simplified.
-
-\1f
-File: gcc.info,  Node: Alternate Keywords,  Next: Incomplete Enums,  Prev: Explicit Reg Vars,  Up: C Extensions
-
-Alternate Keywords
-==================
-
-   The option `-traditional' disables certain keywords; `-ansi' and the
-various `-std' options disable certain others.  This causes trouble
-when you want to use GNU C extensions, or ISO C features, in a
-general-purpose header file that should be usable by all programs,
-including ISO C programs and traditional ones.  The keywords `asm',
-`typeof' and `inline' cannot be used since they won't work in a program
-compiled with `-ansi' (although `inline' can be used in a program
-compiled with `-std=c99'), while the keywords `const', `volatile',
-`signed', `typeof' and `inline' won't work in a program compiled with
-`-traditional'.  The ISO C99 keyword `restrict' is only available when
-`-std=gnu99' (which will eventually be the default) or `-std=c99' (or
-the equivalent `-std=iso9899:1999') is used.
-
-   The way to solve these problems is to put `__' at the beginning and
-end of each problematical keyword.  For example, use `__asm__' instead
-of `asm', `__const__' instead of `const', and `__inline__' instead of
-`inline'.
-
-   Other C compilers won't accept these alternative keywords; if you
-want to compile with another compiler, you can define the alternate
-keywords as macros to replace them with the customary keywords.  It
-looks like this:
-
-     #ifndef __GNUC__
-     #define __asm__ asm
-     #endif
-
-   `-pedantic' and other options cause warnings for many GNU C
-extensions.  You can prevent such warnings within one expression by
-writing `__extension__' before the expression.  `__extension__' has no
-effect aside from this.
-
-\1f
-File: gcc.info,  Node: Incomplete Enums,  Next: Function Names,  Prev: Alternate Keywords,  Up: C Extensions
-
-Incomplete `enum' Types
-=======================
-
-   You can define an `enum' tag without specifying its possible values.
-This results in an incomplete type, much like what you get if you write
-`struct foo' without describing the elements.  A later declaration
-which does specify the possible values completes the type.
-
-   You can't allocate variables or storage using the type while it is
-incomplete.  However, you can work with pointers to that type.
-
-   This extension may not be very useful, but it makes the handling of
-`enum' more consistent with the way `struct' and `union' are handled.
-
-   This extension is not supported by GNU C++.
-
-\1f
-File: gcc.info,  Node: Function Names,  Next: Return Address,  Prev: Incomplete Enums,  Up: C Extensions
-
-Function Names as Strings
-=========================
-
-   GCC predefines two magic identifiers to hold the name of the current
-function.  The identifier `__FUNCTION__' holds the name of the function
-as it appears in the source.  The identifier `__PRETTY_FUNCTION__'
-holds the name of the function pretty printed in a language specific
-fashion.
-
-   These names are always the same in a C function, but in a C++
-function they may be different.  For example, this program:
-
-     extern "C" {
-     extern int printf (char *, ...);
-     }
-     
-     class a {
-      public:
-       sub (int i)
-         {
-           printf ("__FUNCTION__ = %s\n", __FUNCTION__);
-           printf ("__PRETTY_FUNCTION__ = %s\n", __PRETTY_FUNCTION__);
-         }
-     };
-     
-     int
-     main (void)
-     {
-       a ax;
-       ax.sub (0);
-       return 0;
-     }
-
-gives this output:
-
-     __FUNCTION__ = sub
-     __PRETTY_FUNCTION__ = int  a::sub (int)
-
-   The compiler automagically replaces the identifiers with a string
-literal containing the appropriate name.  Thus, they are neither
-preprocessor macros, like `__FILE__' and `__LINE__', nor variables.
-This means that they catenate with other string literals, and that they
-can be used to initialize char arrays.  For example
-
-     char here[] = "Function " __FUNCTION__ " in " __FILE__;
-
-   On the other hand, `#ifdef __FUNCTION__' does not have any special
-meaning inside a function, since the preprocessor does not do anything
-special with the identifier `__FUNCTION__'.
-
-   Note that these semantics are deprecated, and that GCC 3.2 will
-handle `__FUNCTION__' and `__PRETTY_FUNCTION__' the same way as
-`__func__'.  `__func__' is defined by the ISO standard C99:
-
-     The identifier `__func__' is implicitly declared by the translator
-     as if, immediately following the opening brace of each function
-     definition, the declaration
-          static const char __func__[] = "function-name";
-     
-     appeared, where function-name is the name of the lexically-enclosing
-     function.  This name is the unadorned name of the function.
-
-   By this definition, `__func__' is a variable, not a string literal.
-In particular, `__func__' does not catenate with other string literals.
-
-   In `C++', `__FUNCTION__' and `__PRETTY_FUNCTION__' are variables,
-declared in the same way as `__func__'.
-
-\1f
-File: gcc.info,  Node: Return Address,  Next: Vector Extensions,  Prev: Function Names,  Up: C Extensions
-
-Getting the Return or Frame Address of a Function
-=================================================
-
-   These functions may be used to get information about the callers of a
-function.
-
- - Built-in Function: void * __builtin_return_address (unsigned int
-          LEVEL)
-     This function returns the return address of the current function,
-     or of one of its callers.  The LEVEL argument is number of frames
-     to scan up the call stack.  A value of `0' yields the return
-     address of the current function, a value of `1' yields the return
-     address of the caller of the current function, and so forth.
-
-     The LEVEL argument must be a constant integer.
-
-     On some machines it may be impossible to determine the return
-     address of any function other than the current one; in such cases,
-     or when the top of the stack has been reached, this function will
-     return `0' or a random value. In addition,
-     `__builtin_frame_address' may be used to determine if the top of
-     the stack has been reached.
-
-     This function should only be used with a nonzero argument for
-     debugging purposes.
-
- - Built-in Function: void * __builtin_frame_address (unsigned int
-          LEVEL)
-     This function is similar to `__builtin_return_address', but it
-     returns the address of the function frame rather than the return
-     address of the function.  Calling `__builtin_frame_address' with a
-     value of `0' yields the frame address of the current function, a
-     value of `1' yields the frame address of the caller of the current
-     function, and so forth.
-
-     The frame is the area on the stack which holds local variables and
-     saved registers.  The frame address is normally the address of the
-     first word pushed on to the stack by the function.  However, the
-     exact definition depends upon the processor and the calling
-     convention.  If the processor has a dedicated frame pointer
-     register, and the function has a frame, then
-     `__builtin_frame_address' will return the value of the frame
-     pointer register.
-
-     On some machines it may be impossible to determine the frame
-     address of any function other than the current one; in such cases,
-     or when the top of the stack has been reached, this function will
-     return `0' if the first frame pointer is properly initialized by
-     the startup code.
-
-     This function should only be used with a nonzero argument for
-     debugging purposes.
-
-\1f
-File: gcc.info,  Node: Vector Extensions,  Next: Other Builtins,  Prev: Return Address,  Up: C Extensions
-
-Using vector instructions through built-in functions
-====================================================
-
-   On some targets, the instruction set contains SIMD vector
-instructions that operate on multiple values contained in one large
-register at the same time.  For example, on the i386 the MMX, 3Dnow!
-and SSE extensions can be used this way.
-
-   The first step in using these extensions is to provide the necessary
-data types.  This should be done using an appropriate `typedef':
-
-     typedef int v4si __attribute__ ((mode(V4SI)));
-
-   The base type `int' is effectively ignored by the compiler, the
-actual properties of the new type `v4si' are defined by the
-`__attribute__'.  It defines the machine mode to be used; for vector
-types these have the form `VNB'; N should be the number of elements in
-the vector, and B should be the base mode of the individual elements.
-The following can be used as base modes:
-
-`QI'
-     An integer that is as wide as the smallest addressable unit,
-     usually 8 bits.
-
-`HI'
-     An integer, twice as wide as a QI mode integer, usually 16 bits.
-
-`SI'
-     An integer, four times as wide as a QI mode integer, usually 32
-     bits.
-
-`DI'
-     An integer, eight times as wide as a QI mode integer, usually 64
-     bits.
-
-`SF'
-     A floating point value, as wide as a SI mode integer, usually 32
-     bits.
-
-`DF'
-     A floating point value, as wide as a DI mode integer, usually 64
-     bits.
-
-   Not all base types or combinations are always valid; which modes can
-be used is determined by the target machine.  For example, if
-targetting the i386 MMX extensions, only `V8QI', `V4HI' and `V2SI' are
-allowed modes.
-
-   There are no `V1xx' vector modes - they would be identical to the
-corresponding base mode.
-
-   There is no distinction between signed and unsigned vector modes.
-This distinction is made by the operations that perform on the vectors,
-not by the data type.
-
-   The types defined in this manner are somewhat special, they cannot be
-used with most normal C operations (i.e., a vector addition can _not_
-be represented by a normal addition of two vector type variables).  You
-can declare only variables and use them in function calls and returns,
-as well as in assignments and some casts.  It is possible to cast from
-one vector type to another, provided they are of the same size (in
-fact, you can also cast vectors to and from other datatypes of the same
-size).
-
-   A port that supports vector operations provides a set of built-in
-functions that can be used to operate on vectors.  For example, a
-function to add two vectors and multiply the result by a third could
-look like this:
-
-     v4si f (v4si a, v4si b, v4si c)
-     {
-       v4si tmp = __builtin_addv4si (a, b);
-       return __builtin_mulv4si (tmp, c);
-     }
-
-\1f
-File: gcc.info,  Node: Other Builtins,  Next: Target Builtins,  Prev: Vector Extensions,  Up: C Extensions
-
-Other built-in functions provided by GCC
-========================================
-
-   GCC provides a large number of built-in functions other than the ones
-mentioned above.  Some of these are for internal use in the processing
-of exceptions or variable-length argument lists and will not be
-documented here because they may change from time to time; we do not
-recommend general use of these functions.
-
-   The remaining functions are provided for optimization purposes.
-
-   GCC includes built-in versions of many of the functions in the
-standard C library.  The versions prefixed with `__builtin_' will
-always be treated as having the same meaning as the C library function
-even if you specify the `-fno-builtin' option. (*note C Dialect
-Options::) Many of these functions are only optimized in certain cases;
-if they are not optimized in a particular case, a call to the library
-function will be emitted.
-
-   The functions `abort', `exit', `_Exit' and `_exit' are recognized
-and presumed not to return, but otherwise are not built in.  `_exit' is
-not recognized in strict ISO C mode (`-ansi', `-std=c89' or
-`-std=c99').  `_Exit' is not recognized in strict C89 mode (`-ansi' or
-`-std=c89').
-
-   Outside strict ISO C mode, the functions `alloca', `bcmp', `bzero',
-`index', `rindex', `ffs', `fputs_unlocked', `printf_unlocked' and
-`fprintf_unlocked' may be handled as built-in functions.  All these
-functions have corresponding versions prefixed with `__builtin_', which
-may be used even in strict C89 mode.
-
-   The ISO C99 functions `conj', `conjf', `conjl', `creal', `crealf',
-`creall', `cimag', `cimagf', `cimagl', `llabs' and `imaxabs' are
-handled as built-in functions except in strict ISO C89 mode.  There are
-also built-in versions of the ISO C99 functions `cosf', `cosl',
-`fabsf', `fabsl', `sinf', `sinl', `sqrtf', and `sqrtl', that are
-recognized in any mode since ISO C89 reserves these names for the
-purpose to which ISO C99 puts them.  All these functions have
-corresponding versions prefixed with `__builtin_'.
-
-   The ISO C89 functions `abs', `cos', `fabs', `fprintf', `fputs',
-`labs', `memcmp', `memcpy', `memset', `printf', `sin', `sqrt', `strcat',
-`strchr', `strcmp', `strcpy', `strcspn', `strlen', `strncat',
-`strncmp', `strncpy', `strpbrk', `strrchr', `strspn', and `strstr' are
-all recognized as built-in functions unless `-fno-builtin' is specified
-(or `-fno-builtin-FUNCTION' is specified for an individual function).
-All of these functions have corresponding versions prefixed with
-`__builtin_'.
-
-   GCC provides built-in versions of the ISO C99 floating point
-comparison macros that avoid raising exceptions for unordered operands.
-They have the same names as the standard macros ( `isgreater',
-`isgreaterequal', `isless', `islessequal', `islessgreater', and
-`isunordered') , with `__builtin_' prefixed.  We intend for a library
-implementor to be able to simply `#define' each standard macro to its
-built-in equivalent.
-
- - Built-in Function: int __builtin_types_compatible_p (TYPE1, TYPE2)
-     You can use the built-in function `__builtin_types_compatible_p' to
-     determine whether two types are the same.
-
-     This built-in function returns 1 if the unqualified versions of the
-     types TYPE1 and TYPE2 (which are types, not expressions) are
-     compatible, 0 otherwise.  The result of this built-in function can
-     be used in integer constant expressions.
-
-     This built-in function ignores top level qualifiers (e.g., `const',
-     `volatile').  For example, `int' is equivalent to `const int'.
-
-     The type `int[]' and `int[5]' are compatible.  On the other hand,
-     `int' and `char *' are not compatible, even if the size of their
-     types, on the particular architecture are the same.  Also, the
-     amount of pointer indirection is taken into account when
-     determining similarity.  Consequently, `short *' is not similar to
-     `short **'.  Furthermore, two types that are typedefed are
-     considered compatible if their underlying types are compatible.
-
-     An `enum' type is considered to be compatible with another `enum'
-     type.  For example, `enum {foo, bar}' is similar to `enum {hot,
-     dog}'.
-
-     You would typically use this function in code whose execution
-     varies depending on the arguments' types.  For example:
-
-          #define foo(x)                                                  \
-            ({                                                           \
-              typeof (x) tmp;                                             \
-              if (__builtin_types_compatible_p (typeof (x), long double)) \
-                tmp = foo_long_double (tmp);                              \
-              else if (__builtin_types_compatible_p (typeof (x), double)) \
-                tmp = foo_double (tmp);                                   \
-              else if (__builtin_types_compatible_p (typeof (x), float))  \
-                tmp = foo_float (tmp);                                    \
-              else                                                        \
-                abort ();                                                 \
-              tmp;                                                        \
-            })
-
-     _Note:_ This construct is only available for C.
-
-
- - Built-in Function: TYPE __builtin_choose_expr (CONST_EXP, EXP1, EXP2)
-     You can use the built-in function `__builtin_choose_expr' to
-     evaluate code depending on the value of a constant expression.
-     This built-in function returns EXP1 if CONST_EXP, which is a
-     constant expression that must be able to be determined at compile
-     time, is nonzero.  Otherwise it returns 0.
-
-     This built-in function is analogous to the `? :' operator in C,
-     except that the expression returned has its type unaltered by
-     promotion rules.  Also, the built-in function does not evaluate
-     the expression that was not chosen.  For example, if CONST_EXP
-     evaluates to true, EXP2 is not evaluated even if it has
-     side-effects.
-
-     This built-in function can return an lvalue if the chosen argument
-     is an lvalue.
-
-     If EXP1 is returned, the return type is the same as EXP1's type.
-     Similarly, if EXP2 is returned, its return type is the same as
-     EXP2.
-
-     Example:
-
-          #define foo(x)                                                               \
-            __builtin_choose_expr (__builtin_types_compatible_p (typeof (x), double),  \
-              foo_double (x),                                                          \
-              __builtin_choose_expr (__builtin_types_compatible_p (typeof (x), float), \
-                foo_float (x),                                                         \
-                /* The void expression results in a compile-time error             \
-                   when assigning the result to something.  */                     \
-                (void)0))
-
-     _Note:_ This construct is only available for C.  Furthermore, the
-     unused expression (EXP1 or EXP2 depending on the value of
-     CONST_EXP) may still generate syntax errors.  This may change in
-     future revisions.
-
-
- - Built-in Function: int __builtin_constant_p (EXP)
-     You can use the built-in function `__builtin_constant_p' to
-     determine if a value is known to be constant at compile-time and
-     hence that GCC can perform constant-folding on expressions
-     involving that value.  The argument of the function is the value
-     to test.  The function returns the integer 1 if the argument is
-     known to be a compile-time constant and 0 if it is not known to be
-     a compile-time constant.  A return of 0 does not indicate that the
-     value is _not_ a constant, but merely that GCC cannot prove it is
-     a constant with the specified value of the `-O' option.
-
-     You would typically use this function in an embedded application
-     where memory was a critical resource.  If you have some complex
-     calculation, you may want it to be folded if it involves
-     constants, but need to call a function if it does not.  For
-     example:
-
-          #define Scale_Value(X)      \
-            (__builtin_constant_p (X) \
-            ? ((X) * SCALE + OFFSET) : Scale (X))
-
-     You may use this built-in function in either a macro or an inline
-     function.  However, if you use it in an inlined function and pass
-     an argument of the function as the argument to the built-in, GCC
-     will never return 1 when you call the inline function with a
-     string constant or compound literal (*note Compound Literals::)
-     and will not return 1 when you pass a constant numeric value to
-     the inline function unless you specify the `-O' option.
-
-     You may also use `__builtin_constant_p' in initializers for static
-     data.  For instance, you can write
-
-          static const int table[] = {
-             __builtin_constant_p (EXPRESSION) ? (EXPRESSION) : -1,
-             /* ... */
-          };
-
-     This is an acceptable initializer even if EXPRESSION is not a
-     constant expression.  GCC must be more conservative about
-     evaluating the built-in in this case, because it has no
-     opportunity to perform optimization.
-
-     Previous versions of GCC did not accept this built-in in data
-     initializers.  The earliest version where it is completely safe is
-     3.0.1.
-
- - Built-in Function: long __builtin_expect (long EXP, long C)
-     You may use `__builtin_expect' to provide the compiler with branch
-     prediction information.  In general, you should prefer to use
-     actual profile feedback for this (`-fprofile-arcs'), as
-     programmers are notoriously bad at predicting how their programs
-     actually perform.  However, there are applications in which this
-     data is hard to collect.
-
-     The return value is the value of EXP, which should be an integral
-     expression.  The value of C must be a compile-time constant.  The
-     semantics of the built-in are that it is expected that EXP == C.
-     For example:
-
-          if (__builtin_expect (x, 0))
-            foo ();
-
-     would indicate that we do not expect to call `foo', since we
-     expect `x' to be zero.  Since you are limited to integral
-     expressions for EXP, you should use constructions such as
-
-          if (__builtin_expect (ptr != NULL, 1))
-            error ();
-
-     when testing pointer or floating-point values.
-
- - Built-in Function: void __builtin_prefetch (const void *ADDR, ...)
-     This function is used to minimize cache-miss latency by moving
-     data into a cache before it is accessed.  You can insert calls to
-     `__builtin_prefetch' into code for which you know addresses of
-     data in memory that is likely to be accessed soon.  If the target
-     supports them, data prefetch instructions will be generated.  If
-     the prefetch is done early enough before the access then the data
-     will be in the cache by the time it is accessed.
-
-     The value of ADDR is the address of the memory to prefetch.  There
-     are two optional arguments, RW and LOCALITY.  The value of RW is a
-     compile-time constant one or zero; one means that the prefetch is
-     preparing for a write to the memory address and zero, the default,
-     means that the prefetch is preparing for a read.  The value
-     LOCALITY must be a compile-time constant integer between zero and
-     three.  A value of zero means that the data has no temporal
-     locality, so it need not be left in the cache after the access.  A
-     value of three means that the data has a high degree of temporal
-     locality and should be left in all levels of cache possible.
-     Values of one and two mean, respectively, a low or moderate degree
-     of temporal locality.  The default is three.
-
-          for (i = 0; i < n; i++)
-            {
-              a[i] = a[i] + b[i];
-              __builtin_prefetch (&a[i+j], 1, 1);
-              __builtin_prefetch (&b[i+j], 0, 1);
-              /* ... */
-            }
-
-     Data prefetch does not generate faults if ADDR is invalid, but the
-     address expression itself must be valid.  For example, a prefetch
-     of `p->next' will not fault if `p->next' is not a valid address,
-     but evaluation will fault if `p' is not a valid address.
-
-     If the target does not support data prefetch, the address
-     expression is evaluated if it includes side effects but no other
-     code is generated and GCC does not issue a warning.
-
-\1f
-File: gcc.info,  Node: Target Builtins,  Next: Pragmas,  Prev: Other Builtins,  Up: C Extensions
-
-Built-in Functions Specific to Particular Target Machines
-=========================================================
-
-   On some target machines, GCC supports many built-in functions
-specific to those machines.  Generally these generate calls to specific
-machine instructions, but allow the compiler to schedule those calls.
-
-* Menu:
-
-* X86 Built-in Functions::
-* PowerPC AltiVec Built-in Functions::
-