]> oss.titaniummirror.com Git - msp430-gcc.git/blobdiff - gcc/doc/gcc.info-13
Imported gcc-4.4.3
[msp430-gcc.git] / gcc / doc / gcc.info-13
diff --git a/gcc/doc/gcc.info-13 b/gcc/doc/gcc.info-13
deleted file mode 100644 (file)
index f7b3b34..0000000
+++ /dev/null
@@ -1,981 +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: Type Attributes,  Next: Alignment,  Prev: Variable Attributes,  Up: C Extensions
-
-Specifying Attributes of Types
-==============================
-
-   The keyword `__attribute__' allows you to specify special attributes
-of `struct' and `union' types when you define such types.  This keyword
-is followed by an attribute specification inside double parentheses.
-Five attributes are currently defined for types: `aligned', `packed',
-`transparent_union', `unused', and `deprecated'.  Other attributes are
-defined for functions (*note Function Attributes::) and for variables
-(*note Variable Attributes::).
-
-   You may also specify any one of these attributes with `__' preceding
-and following its keyword.  This allows you to use these attributes in
-header files without being concerned about a possible macro of the same
-name.  For example, you may use `__aligned__' instead of `aligned'.
-
-   You may specify the `aligned' and `transparent_union' attributes
-either in a `typedef' declaration or just past the closing curly brace
-of a complete enum, struct or union type _definition_ and the `packed'
-attribute only past the closing brace of a definition.
-
-   You may also specify attributes between the enum, struct or union
-tag and the name of the type rather than after the closing brace.
-
-   *Note Attribute Syntax::, for details of the exact syntax for using
-attributes.
-
-`aligned (ALIGNMENT)'
-     This attribute specifies a minimum alignment (in bytes) for
-     variables of the specified type.  For example, the declarations:
-
-          struct S { short f[3]; } __attribute__ ((aligned (8)));
-          typedef int more_aligned_int __attribute__ ((aligned (8)));
-
-     force the compiler to insure (as far as it can) that each variable
-     whose type is `struct S' or `more_aligned_int' will be allocated
-     and aligned _at least_ on a 8-byte boundary.  On a Sparc, having
-     all variables of type `struct S' aligned to 8-byte boundaries
-     allows the compiler to use the `ldd' and `std' (doubleword load and
-     store) instructions when copying one variable of type `struct S' to
-     another, thus improving run-time efficiency.
-
-     Note that the alignment of any given `struct' or `union' type is
-     required by the ISO C standard to be at least a perfect multiple of
-     the lowest common multiple of the alignments of all of the members
-     of the `struct' or `union' in question.  This means that you _can_
-     effectively adjust the alignment of a `struct' or `union' type by
-     attaching an `aligned' attribute to any one of the members of such
-     a type, but the notation illustrated in the example above is a
-     more obvious, intuitive, and readable way to request the compiler
-     to adjust the alignment of an entire `struct' or `union' type.
-
-     As in the preceding example, you can explicitly specify the
-     alignment (in bytes) that you wish the compiler to use for a given
-     `struct' or `union' type.  Alternatively, you can leave out the
-     alignment factor and just ask the compiler to align a type to the
-     maximum useful alignment for the target machine you are compiling
-     for.  For example, you could write:
-
-          struct S { short f[3]; } __attribute__ ((aligned));
-
-     Whenever you leave out the alignment factor in an `aligned'
-     attribute specification, the compiler automatically sets the
-     alignment for the type to the largest alignment which is ever used
-     for any data type on the target machine you are compiling for.
-     Doing this can often make copy operations more efficient, because
-     the compiler can use whatever instructions copy the biggest chunks
-     of memory when performing copies to or from the variables which
-     have types that you have aligned this way.
-
-     In the example above, if the size of each `short' is 2 bytes, then
-     the size of the entire `struct S' type is 6 bytes.  The smallest
-     power of two which is greater than or equal to that is 8, so the
-     compiler sets the alignment for the entire `struct S' type to 8
-     bytes.
-
-     Note that although you can ask the compiler to select a
-     time-efficient alignment for a given type and then declare only
-     individual stand-alone objects of that type, the compiler's
-     ability to select a time-efficient alignment is primarily useful
-     only when you plan to create arrays of variables having the
-     relevant (efficiently aligned) type.  If you declare or use arrays
-     of variables of an efficiently-aligned type, then it is likely
-     that your program will also be doing pointer arithmetic (or
-     subscripting, which amounts to the same thing) on pointers to the
-     relevant type, and the code that the compiler generates for these
-     pointer arithmetic operations will often be more efficient for
-     efficiently-aligned types than for other types.
-
-     The `aligned' attribute can only increase the alignment; but you
-     can decrease it by specifying `packed' as well.  See below.
-
-     Note that the effectiveness of `aligned' attributes may be limited
-     by inherent limitations in your linker.  On many systems, the
-     linker is only able to arrange for variables to be aligned up to a
-     certain maximum alignment.  (For some linkers, the maximum
-     supported alignment may be very very small.)  If your linker is
-     only able to align variables up to a maximum of 8 byte alignment,
-     then specifying `aligned(16)' in an `__attribute__' will still
-     only provide you with 8 byte alignment.  See your linker
-     documentation for further information.
-
-`packed'
-     This attribute, attached to an `enum', `struct', or `union' type
-     definition, specified that the minimum required memory be used to
-     represent the type.
-
-     Specifying this attribute for `struct' and `union' types is
-     equivalent to specifying the `packed' attribute on each of the
-     structure or union members.  Specifying the `-fshort-enums' flag
-     on the line is equivalent to specifying the `packed' attribute on
-     all `enum' definitions.
-
-     You may only specify this attribute after a closing curly brace on
-     an `enum' definition, not in a `typedef' declaration, unless that
-     declaration also contains the definition of the `enum'.
-
-`transparent_union'
-     This attribute, attached to a `union' type definition, indicates
-     that any function parameter having that union type causes calls to
-     that function to be treated in a special way.
-
-     First, the argument corresponding to a transparent union type can
-     be of any type in the union; no cast is required.  Also, if the
-     union contains a pointer type, the corresponding argument can be a
-     null pointer constant or a void pointer expression; and if the
-     union contains a void pointer type, the corresponding argument can
-     be any pointer expression.  If the union member type is a pointer,
-     qualifiers like `const' on the referenced type must be respected,
-     just as with normal pointer conversions.
-
-     Second, the argument is passed to the function using the calling
-     conventions of first member of the transparent union, not the
-     calling conventions of the union itself.  All members of the union
-     must have the same machine representation; this is necessary for
-     this argument passing to work properly.
-
-     Transparent unions are designed for library functions that have
-     multiple interfaces for compatibility reasons.  For example,
-     suppose the `wait' function must accept either a value of type
-     `int *' to comply with Posix, or a value of type `union wait *' to
-     comply with the 4.1BSD interface.  If `wait''s parameter were
-     `void *', `wait' would accept both kinds of arguments, but it
-     would also accept any other pointer type and this would make
-     argument type checking less useful.  Instead, `<sys/wait.h>' might
-     define the interface as follows:
-
-          typedef union
-            {
-              int *__ip;
-              union wait *__up;
-            } wait_status_ptr_t __attribute__ ((__transparent_union__));
-          
-          pid_t wait (wait_status_ptr_t);
-
-     This interface allows either `int *' or `union wait *' arguments
-     to be passed, using the `int *' calling convention.  The program
-     can call `wait' with arguments of either type:
-
-          int w1 () { int w; return wait (&w); }
-          int w2 () { union wait w; return wait (&w); }
-
-     With this interface, `wait''s implementation might look like this:
-
-          pid_t wait (wait_status_ptr_t p)
-          {
-            return waitpid (-1, p.__ip, 0);
-          }
-
-`unused'
-     When attached to a type (including a `union' or a `struct'), this
-     attribute means that variables of that type are meant to appear
-     possibly unused.  GCC will not produce a warning for any variables
-     of that type, even if the variable appears to do nothing.  This is
-     often the case with lock or thread classes, which are usually
-     defined and then not referenced, but contain constructors and
-     destructors that have nontrivial bookkeeping functions.
-
-`deprecated'
-     The `deprecated' attribute results in a warning if the type is
-     used anywhere in the source file.  This is useful when identifying
-     types that are expected to be removed in a future version of a
-     program.  If possible, the warning also includes the location of
-     the declaration of the deprecated type, to enable users to easily
-     find further information about why the type is deprecated, or what
-     they should do instead.  Note that the warnings only occur for
-     uses and then only if the type is being applied to an identifier
-     that itself is not being declared as deprecated.
-
-          typedef int T1 __attribute__ ((deprecated));
-          T1 x;
-          typedef T1 T2;
-          T2 y;
-          typedef T1 T3 __attribute__ ((deprecated));
-          T3 z __attribute__ ((deprecated));
-
-     results in a warning on line 2 and 3 but not lines 4, 5, or 6.  No
-     warning is issued for line 4 because T2 is not explicitly
-     deprecated.  Line 5 has no warning because T3 is explicitly
-     deprecated.  Similarly for line 6.
-
-     The `deprecated' attribute can also be used for functions and
-     variables (*note Function Attributes::, *note Variable
-     Attributes::.)
-
-
-   To specify multiple attributes, separate them by commas within the
-double parentheses: for example, `__attribute__ ((aligned (16),
-packed))'.
-
-\1f
-File: gcc.info,  Node: Inline,  Next: Extended Asm,  Prev: Alignment,  Up: C Extensions
-
-An Inline Function is As Fast As a Macro
-========================================
-
-   By declaring a function `inline', you can direct GCC to integrate
-that function's code into the code for its callers.  This makes
-execution faster by eliminating the function-call overhead; in
-addition, if any of the actual argument values are constant, their known
-values may permit simplifications at compile time so that not all of the
-inline function's code needs to be included.  The effect on code size is
-less predictable; object code may be larger or smaller with function
-inlining, depending on the particular case.  Inlining of functions is an
-optimization and it really "works" only in optimizing compilation.  If
-you don't use `-O', no function is really inline.
-
-   Inline functions are included in the ISO C99 standard, but there are
-currently substantial differences between what GCC implements and what
-the ISO C99 standard requires.
-
-   To declare a function inline, use the `inline' keyword in its
-declaration, like this:
-
-     inline int
-     inc (int *a)
-     {
-       (*a)++;
-     }
-
-   (If you are writing a header file to be included in ISO C programs,
-write `__inline__' instead of `inline'.  *Note Alternate Keywords::.)
-You can also make all "simple enough" functions inline with the option
-`-finline-functions'.
-
-   Note that certain usages in a function definition can make it
-unsuitable for inline substitution.  Among these usages are: use of
-varargs, use of alloca, use of variable sized data types (*note
-Variable Length::), use of computed goto (*note Labels as Values::),
-use of nonlocal goto, and nested functions (*note Nested Functions::).
-Using `-Winline' will warn when a function marked `inline' could not be
-substituted, and will give the reason for the failure.
-
-   Note that in C and Objective-C, unlike C++, the `inline' keyword
-does not affect the linkage of the function.
-
-   GCC automatically inlines member functions defined within the class
-body of C++ programs even if they are not explicitly declared `inline'.
-(You can override this with `-fno-default-inline'; *note Options
-Controlling C++ Dialect: C++ Dialect Options..)
-
-   When a function is both inline and `static', if all calls to the
-function are integrated into the caller, and the function's address is
-never used, then the function's own assembler code is never referenced.
-In this case, GCC does not actually output assembler code for the
-function, unless you specify the option `-fkeep-inline-functions'.
-Some calls cannot be integrated for various reasons (in particular,
-calls that precede the function's definition cannot be integrated, and
-neither can recursive calls within the definition).  If there is a
-nonintegrated call, then the function is compiled to assembler code as
-usual.  The function must also be compiled as usual if the program
-refers to its address, because that can't be inlined.
-
-   When an inline function is not `static', then the compiler must
-assume that there may be calls from other source files; since a global
-symbol can be defined only once in any program, the function must not
-be defined in the other source files, so the calls therein cannot be
-integrated.  Therefore, a non-`static' inline function is always
-compiled on its own in the usual fashion.
-
-   If you specify both `inline' and `extern' in the function
-definition, then the definition is used only for inlining.  In no case
-is the function compiled on its own, not even if you refer to its
-address explicitly.  Such an address becomes an external reference, as
-if you had only declared the function, and had not defined it.
-
-   This combination of `inline' and `extern' has almost the effect of a
-macro.  The way to use it is to put a function definition in a header
-file with these keywords, and put another copy of the definition
-(lacking `inline' and `extern') in a library file.  The definition in
-the header file will cause most calls to the function to be inlined.
-If any uses of the function remain, they will refer to the single copy
-in the library.
-
-   For future compatibility with when GCC implements ISO C99 semantics
-for inline functions, it is best to use `static inline' only.  (The
-existing semantics will remain available when `-std=gnu89' is
-specified, but eventually the default will be `-std=gnu99' and that
-will implement the C99 semantics, though it does not do so yet.)
-
-   GCC does not inline any functions when not optimizing unless you
-specify the `always_inline' attribute for the function, like this:
-
-     /* Prototype.  */
-     inline void foo (const char) __attribute__((always_inline));
-
-\1f
-File: gcc.info,  Node: Extended Asm,  Next: Constraints,  Prev: Inline,  Up: C Extensions
-
-Assembler Instructions with C Expression Operands
-=================================================
-
-   In an assembler instruction using `asm', you can specify the
-operands of the instruction using C expressions.  This means you need
-not guess which registers or memory locations will contain the data you
-want to use.
-
-   You must specify an assembler instruction template much like what
-appears in a machine description, plus an operand constraint string for
-each operand.
-
-   For example, here is how to use the 68881's `fsinx' instruction:
-
-     asm ("fsinx %1,%0" : "=f" (result) : "f" (angle));
-
-Here `angle' is the C expression for the input operand while `result'
-is that of the output operand.  Each has `"f"' as its operand
-constraint, saying that a floating point register is required.  The `='
-in `=f' indicates that the operand is an output; all output operands'
-constraints must use `='.  The constraints use the same language used
-in the machine description (*note Constraints::).
-
-   Each operand is described by an operand-constraint string followed by
-the C expression in parentheses.  A colon separates the assembler
-template from the first output operand and another separates the last
-output operand from the first input, if any.  Commas separate the
-operands within each group.  The total number of operands is currently
-limited to 30; this limitation may be lifted in some future version of
-GCC.
-
-   If there are no output operands but there are input operands, you
-must place two consecutive colons surrounding the place where the output
-operands would go.
-
-   As of GCC version 3.1, it is also possible to specify input and
-output operands using symbolic names which can be referenced within the
-assembler code.  These names are specified inside square brackets
-preceding the constraint string, and can be referenced inside the
-assembler code using `%[NAME]' instead of a percentage sign followed by
-the operand number.  Using named operands the above example could look
-like:
-
-     asm ("fsinx %[angle],%[output]"
-          : [output] "=f" (result)
-          : [angle] "f" (angle));
-
-Note that the symbolic operand names have no relation whatsoever to
-other C identifiers.  You may use any name you like, even those of
-existing C symbols, but must ensure that no two operands within the same
-assembler construct use the same symbolic name.
-
-   Output operand expressions must be lvalues; the compiler can check
-this.  The input operands need not be lvalues.  The compiler cannot
-check whether the operands have data types that are reasonable for the
-instruction being executed.  It does not parse the assembler instruction
-template and does not know what it means or even whether it is valid
-assembler input.  The extended `asm' feature is most often used for
-machine instructions the compiler itself does not know exist.  If the
-output expression cannot be directly addressed (for example, it is a
-bit-field), your constraint must allow a register.  In that case, GCC
-will use the register as the output of the `asm', and then store that
-register into the output.
-
-   The ordinary output operands must be write-only; GCC will assume that
-the values in these operands before the instruction are dead and need
-not be generated.  Extended asm supports input-output or read-write
-operands.  Use the constraint character `+' to indicate such an operand
-and list it with the output operands.
-
-   When the constraints for the read-write operand (or the operand in
-which only some of the bits are to be changed) allows a register, you
-may, as an alternative, logically split its function into two separate
-operands, one input operand and one write-only output operand.  The
-connection between them is expressed by constraints which say they need
-to be in the same location when the instruction executes.  You can use
-the same C expression for both operands, or different expressions.  For
-example, here we write the (fictitious) `combine' instruction with
-`bar' as its read-only source operand and `foo' as its read-write
-destination:
-
-     asm ("combine %2,%0" : "=r" (foo) : "0" (foo), "g" (bar));
-
-The constraint `"0"' for operand 1 says that it must occupy the same
-location as operand 0.  A number in constraint is allowed only in an
-input operand and it must refer to an output operand.
-
-   Only a number in the constraint can guarantee that one operand will
-be in the same place as another.  The mere fact that `foo' is the value
-of both operands is not enough to guarantee that they will be in the
-same place in the generated assembler code.  The following would not
-work reliably:
-
-     asm ("combine %2,%0" : "=r" (foo) : "r" (foo), "g" (bar));
-
-   Various optimizations or reloading could cause operands 0 and 1 to
-be in different registers; GCC knows no reason not to do so.  For
-example, the compiler might find a copy of the value of `foo' in one
-register and use it for operand 1, but generate the output operand 0 in
-a different register (copying it afterward to `foo''s own address).  Of
-course, since the register for operand 1 is not even mentioned in the
-assembler code, the result will not work, but GCC can't tell that.
-
-   As of GCC version 3.1, one may write `[NAME]' instead of the operand
-number for a matching constraint.  For example:
-
-     asm ("cmoveq %1,%2,%[result]"
-          : [result] "=r"(result)
-          : "r" (test), "r"(new), "[result]"(old));
-
-   Some instructions clobber specific hard registers.  To describe this,
-write a third colon after the input operands, followed by the names of
-the clobbered hard registers (given as strings).  Here is a realistic
-example for the VAX:
-
-     asm volatile ("movc3 %0,%1,%2"
-                   : /* no outputs */
-                   : "g" (from), "g" (to), "g" (count)
-                   : "r0", "r1", "r2", "r3", "r4", "r5");
-
-   You may not write a clobber description in a way that overlaps with
-an input or output operand.  For example, you may not have an operand
-describing a register class with one member if you mention that register
-in the clobber list.  There is no way for you to specify that an input
-operand is modified without also specifying it as an output operand.
-Note that if all the output operands you specify are for this purpose
-(and hence unused), you will then also need to specify `volatile' for
-the `asm' construct, as described below, to prevent GCC from deleting
-the `asm' statement as unused.
-
-   If you refer to a particular hardware register from the assembler
-code, you will probably have to list the register after the third colon
-to tell the compiler the register's value is modified.  In some
-assemblers, the register names begin with `%'; to produce one `%' in the
-assembler code, you must write `%%' in the input.
-
-   If your assembler instruction can alter the condition code register,
-add `cc' to the list of clobbered registers.  GCC on some machines
-represents the condition codes as a specific hardware register; `cc'
-serves to name this register.  On other machines, the condition code is
-handled differently, and specifying `cc' has no effect.  But it is
-valid no matter what the machine.
-
-   If your assembler instruction modifies memory in an unpredictable
-fashion, add `memory' to the list of clobbered registers.  This will
-cause GCC to not keep memory values cached in registers across the
-assembler instruction.  You will also want to add the `volatile'
-keyword if the memory affected is not listed in the inputs or outputs
-of the `asm', as the `memory' clobber does not count as a side-effect
-of the `asm'.
-
-   You can put multiple assembler instructions together in a single
-`asm' template, separated by the characters normally used in assembly
-code for the system.  A combination that works in most places is a
-newline to break the line, plus a tab character to move to the
-instruction field (written as `\n\t').  Sometimes semicolons can be
-used, if the assembler allows semicolons as a line-breaking character.
-Note that some assembler dialects use semicolons to start a comment.
-The input operands are guaranteed not to use any of the clobbered
-registers, and neither will the output operands' addresses, so you can
-read and write the clobbered registers as many times as you like.  Here
-is an example of multiple instructions in a template; it assumes the
-subroutine `_foo' accepts arguments in registers 9 and 10:
-
-     asm ("movl %0,r9\n\tmovl %1,r10\n\tcall _foo"
-          : /* no outputs */
-          : "g" (from), "g" (to)
-          : "r9", "r10");
-
-   Unless an output operand has the `&' constraint modifier, GCC may
-allocate it in the same register as an unrelated input operand, on the
-assumption the inputs are consumed before the outputs are produced.
-This assumption may be false if the assembler code actually consists of
-more than one instruction.  In such a case, use `&' for each output
-operand that may not overlap an input.  *Note Modifiers::.
-
-   If you want to test the condition code produced by an assembler
-instruction, you must include a branch and a label in the `asm'
-construct, as follows:
-
-     asm ("clr %0\n\tfrob %1\n\tbeq 0f\n\tmov #1,%0\n0:"
-          : "g" (result)
-          : "g" (input));
-
-This assumes your assembler supports local labels, as the GNU assembler
-and most Unix assemblers do.
-
-   Speaking of labels, jumps from one `asm' to another are not
-supported.  The compiler's optimizers do not know about these jumps, and
-therefore they cannot take account of them when deciding how to
-optimize.
-
-   Usually the most convenient way to use these `asm' instructions is to
-encapsulate them in macros that look like functions.  For example,
-
-     #define sin(x)       \
-     ({ double __value, __arg = (x);   \
-        asm ("fsinx %1,%0": "=f" (__value): "f" (__arg));  \
-        __value; })
-
-Here the variable `__arg' is used to make sure that the instruction
-operates on a proper `double' value, and to accept only those arguments
-`x' which can convert automatically to a `double'.
-
-   Another way to make sure the instruction operates on the correct data
-type is to use a cast in the `asm'.  This is different from using a
-variable `__arg' in that it converts more different types.  For
-example, if the desired type were `int', casting the argument to `int'
-would accept a pointer with no complaint, while assigning the argument
-to an `int' variable named `__arg' would warn about using a pointer
-unless the caller explicitly casts it.
-
-   If an `asm' has output operands, GCC assumes for optimization
-purposes the instruction has no side effects except to change the output
-operands.  This does not mean instructions with a side effect cannot be
-used, but you must be careful, because the compiler may eliminate them
-if the output operands aren't used, or move them out of loops, or
-replace two with one if they constitute a common subexpression.  Also,
-if your instruction does have a side effect on a variable that otherwise
-appears not to change, the old value of the variable may be reused later
-if it happens to be found in a register.
-
-   You can prevent an `asm' instruction from being deleted, moved
-significantly, or combined, by writing the keyword `volatile' after the
-`asm'.  For example:
-
-     #define get_and_set_priority(new)              \
-     ({ int __old;                                  \
-        asm volatile ("get_and_set_priority %0, %1" \
-                      : "=g" (__old) : "g" (new));  \
-        __old; })
-
-If you write an `asm' instruction with no outputs, GCC will know the
-instruction has side-effects and will not delete the instruction or
-move it outside of loops.
-
-   The `volatile' keyword indicates that the instruction has important
-side-effects.  GCC will not delete a volatile `asm' if it is reachable.
-(The instruction can still be deleted if GCC can prove that
-control-flow will never reach the location of the instruction.)  In
-addition, GCC will not reschedule instructions across a volatile `asm'
-instruction.  For example:
-
-     *(volatile int *)addr = foo;
-     asm volatile ("eieio" : : );
-
-Assume `addr' contains the address of a memory mapped device register.
-The PowerPC `eieio' instruction (Enforce In-order Execution of I/O)
-tells the CPU to make sure that the store to that device register
-happens before it issues any other I/O.
-
-   Note that even a volatile `asm' instruction can be moved in ways
-that appear insignificant to the compiler, such as across jump
-instructions.  You can't expect a sequence of volatile `asm'
-instructions to remain perfectly consecutive.  If you want consecutive
-output, use a single `asm'.  Also, GCC will perform some optimizations
-across a volatile `asm' instruction; GCC does not "forget everything"
-when it encounters a volatile `asm' instruction the way some other
-compilers do.
-
-   An `asm' instruction without any operands or clobbers (an "old
-style" `asm') will be treated identically to a volatile `asm'
-instruction.
-
-   It is a natural idea to look for a way to give access to the
-condition code left by the assembler instruction.  However, when we
-attempted to implement this, we found no way to make it work reliably.
-The problem is that output operands might need reloading, which would
-result in additional following "store" instructions.  On most machines,
-these instructions would alter the condition code before there was time
-to test it.  This problem doesn't arise for ordinary "test" and
-"compare" instructions because they don't have any output operands.
-
-   For reasons similar to those described above, it is not possible to
-give an assembler instruction access to the condition code left by
-previous instructions.
-
-   If you are writing a header file that should be includable in ISO C
-programs, write `__asm__' instead of `asm'.  *Note Alternate Keywords::.
-
-i386 floating point asm operands
---------------------------------
-
-   There are several rules on the usage of stack-like regs in
-asm_operands insns.  These rules apply only to the operands that are
-stack-like regs:
-
-  1. Given a set of input regs that die in an asm_operands, it is
-     necessary to know which are implicitly popped by the asm, and
-     which must be explicitly popped by gcc.
-
-     An input reg that is implicitly popped by the asm must be
-     explicitly clobbered, unless it is constrained to match an output
-     operand.
-
-  2. For any input reg that is implicitly popped by an asm, it is
-     necessary to know how to adjust the stack to compensate for the
-     pop.  If any non-popped input is closer to the top of the
-     reg-stack than the implicitly popped reg, it would not be possible
-     to know what the stack looked like--it's not clear how the rest of
-     the stack "slides up".
-
-     All implicitly popped input regs must be closer to the top of the
-     reg-stack than any input that is not implicitly popped.
-
-     It is possible that if an input dies in an insn, reload might use
-     the input reg for an output reload.  Consider this example:
-
-          asm ("foo" : "=t" (a) : "f" (b));
-
-     This asm says that input B is not popped by the asm, and that the
-     asm pushes a result onto the reg-stack, i.e., the stack is one
-     deeper after the asm than it was before.  But, it is possible that
-     reload will think that it can use the same reg for both the input
-     and the output, if input B dies in this insn.
-
-     If any input operand uses the `f' constraint, all output reg
-     constraints must use the `&' earlyclobber.
-
-     The asm above would be written as
-
-          asm ("foo" : "=&t" (a) : "f" (b));
-
-  3. Some operands need to be in particular places on the stack.  All
-     output operands fall in this category--there is no other way to
-     know which regs the outputs appear in unless the user indicates
-     this in the constraints.
-
-     Output operands must specifically indicate which reg an output
-     appears in after an asm.  `=f' is not allowed: the operand
-     constraints must select a class with a single reg.
-
-  4. Output operands may not be "inserted" between existing stack regs.
-     Since no 387 opcode uses a read/write operand, all output operands
-     are dead before the asm_operands, and are pushed by the
-     asm_operands.  It makes no sense to push anywhere but the top of
-     the reg-stack.
-
-     Output operands must start at the top of the reg-stack: output
-     operands may not "skip" a reg.
-
-  5. Some asm statements may need extra stack space for internal
-     calculations.  This can be guaranteed by clobbering stack registers
-     unrelated to the inputs and outputs.
-
-
-   Here are a couple of reasonable asms to want to write.  This asm
-takes one input, which is internally popped, and produces two outputs.
-
-     asm ("fsincos" : "=t" (cos), "=u" (sin) : "0" (inp));
-
-   This asm takes two inputs, which are popped by the `fyl2xp1' opcode,
-and replaces them with one output.  The user must code the `st(1)'
-clobber for reg-stack.c to know that `fyl2xp1' pops both inputs.
-
-     asm ("fyl2xp1" : "=t" (result) : "0" (x), "u" (y) : "st(1)");
-
-\1f
-File: gcc.info,  Node: Constraints,  Next: Asm Labels,  Prev: Extended Asm,  Up: C Extensions
-
-Constraints for `asm' Operands
-==============================
-
-   Here are specific details on what constraint letters you can use with
-`asm' operands.  Constraints can say whether an operand may be in a
-register, and which kinds of register; whether the operand can be a
-memory reference, and which kinds of address; whether the operand may
-be an immediate constant, and which possible values it may have.
-Constraints can also require two operands to match.
-
-* Menu:
-
-* Simple Constraints::  Basic use of constraints.
-* Multi-Alternative::   When an insn has two alternative constraint-patterns.
-* Modifiers::           More precise control over effects of constraints.
-* Machine Constraints:: Special constraints for some particular machines.
-
-\1f
-File: gcc.info,  Node: Simple Constraints,  Next: Multi-Alternative,  Up: Constraints
-
-Simple Constraints
-------------------
-
-   The simplest kind of constraint is a string full of letters, each of
-which describes one kind of operand that is permitted.  Here are the
-letters that are allowed:
-
-whitespace
-     Whitespace characters are ignored and can be inserted at any
-     position except the first.  This enables each alternative for
-     different operands to be visually aligned in the machine
-     description even if they have different number of constraints and
-     modifiers.
-
-`m'
-     A memory operand is allowed, with any kind of address that the
-     machine supports in general.
-
-`o'
-     A memory operand is allowed, but only if the address is
-     "offsettable".  This means that adding a small integer (actually,
-     the width in bytes of the operand, as determined by its machine
-     mode) may be added to the address and the result is also a valid
-     memory address.
-
-     For example, an address which is constant is offsettable; so is an
-     address that is the sum of a register and a constant (as long as a
-     slightly larger constant is also within the range of
-     address-offsets supported by the machine); but an autoincrement or
-     autodecrement address is not offsettable.  More complicated
-     indirect/indexed addresses may or may not be offsettable depending
-     on the other addressing modes that the machine supports.
-
-     Note that in an output operand which can be matched by another
-     operand, the constraint letter `o' is valid only when accompanied
-     by both `<' (if the target machine has predecrement addressing)
-     and `>' (if the target machine has preincrement addressing).
-
-`V'
-     A memory operand that is not offsettable.  In other words,
-     anything that would fit the `m' constraint but not the `o'
-     constraint.
-
-`<'
-     A memory operand with autodecrement addressing (either
-     predecrement or postdecrement) is allowed.
-
-`>'
-     A memory operand with autoincrement addressing (either
-     preincrement or postincrement) is allowed.
-
-`r'
-     A register operand is allowed provided that it is in a general
-     register.
-
-`i'
-     An immediate integer operand (one with constant value) is allowed.
-     This includes symbolic constants whose values will be known only at
-     assembly time.
-
-`n'
-     An immediate integer operand with a known numeric value is allowed.
-     Many systems cannot support assembly-time constants for operands
-     less than a word wide.  Constraints for these operands should use
-     `n' rather than `i'.
-
-`I', `J', `K', ... `P'
-     Other letters in the range `I' through `P' may be defined in a
-     machine-dependent fashion to permit immediate integer operands with
-     explicit integer values in specified ranges.  For example, on the
-     68000, `I' is defined to stand for the range of values 1 to 8.
-     This is the range permitted as a shift count in the shift
-     instructions.
-
-`E'
-     An immediate floating operand (expression code `const_double') is
-     allowed, but only if the target floating point format is the same
-     as that of the host machine (on which the compiler is running).
-
-`F'
-     An immediate floating operand (expression code `const_double') is
-     allowed.
-
-`G', `H'
-     `G' and `H' may be defined in a machine-dependent fashion to
-     permit immediate floating operands in particular ranges of values.
-
-`s'
-     An immediate integer operand whose value is not an explicit
-     integer is allowed.
-
-     This might appear strange; if an insn allows a constant operand
-     with a value not known at compile time, it certainly must allow
-     any known value.  So why use `s' instead of `i'?  Sometimes it
-     allows better code to be generated.
-
-     For example, on the 68000 in a fullword instruction it is possible
-     to use an immediate operand; but if the immediate value is between
-     -128 and 127, better code results from loading the value into a
-     register and using the register.  This is because the load into
-     the register can be done with a `moveq' instruction.  We arrange
-     for this to happen by defining the letter `K' to mean "any integer
-     outside the range -128 to 127", and then specifying `Ks' in the
-     operand constraints.
-
-`g'
-     Any register, memory or immediate integer operand is allowed,
-     except for registers that are not general registers.
-
-`X'
-     Any operand whatsoever is allowed.
-
-`0', `1', `2', ... `9'
-     An operand that matches the specified operand number is allowed.
-     If a digit is used together with letters within the same
-     alternative, the digit should come last.
-
-     This number is allowed to be more than a single digit.  If multiple
-     digits are encountered consecutavely, they are interpreted as a
-     single decimal integer.  There is scant chance for ambiguity,
-     since to-date it has never been desirable that `10' be interpreted
-     as matching either operand 1 _or_ operand 0.  Should this be
-     desired, one can use multiple alternatives instead.
-
-     This is called a "matching constraint" and what it really means is
-     that the assembler has only a single operand that fills two roles
-     which `asm' distinguishes.  For example, an add instruction uses
-     two input operands and an output operand, but on most CISC
-     machines an add instruction really has only two operands, one of
-     them an input-output operand:
-
-          addl #35,r12
-
-     Matching constraints are used in these circumstances.  More
-     precisely, the two operands that match must include one input-only
-     operand and one output-only operand.  Moreover, the digit must be a
-     smaller number than the number of the operand that uses it in the
-     constraint.
-
-`p'
-     An operand that is a valid memory address is allowed.  This is for
-     "load address" and "push address" instructions.
-
-     `p' in the constraint must be accompanied by `address_operand' as
-     the predicate in the `match_operand'.  This predicate interprets
-     the mode specified in the `match_operand' as the mode of the memory
-     reference for which the address would be valid.
-
-OTHER-LETTERS
-     Other letters can be defined in machine-dependent fashion to stand
-     for particular classes of registers or other arbitrary operand
-     types.  `d', `a' and `f' are defined on the 68000/68020 to stand
-     for data, address and floating point registers.
-
-
-\1f
-File: gcc.info,  Node: Multi-Alternative,  Next: Modifiers,  Prev: Simple Constraints,  Up: Constraints
-
-Multiple Alternative Constraints
---------------------------------
-
-   Sometimes a single instruction has multiple alternative sets of
-possible operands.  For example, on the 68000, a logical-or instruction
-can combine register or an immediate value into memory, or it can
-combine any kind of operand into a register; but it cannot combine one
-memory location into another.
-
-   These constraints are represented as multiple alternatives.  An
-alternative can be described by a series of letters for each operand.
-The overall constraint for an operand is made from the letters for this
-operand from the first alternative, a comma, the letters for this
-operand from the second alternative, a comma, and so on until the last
-alternative.
-
-   If all the operands fit any one alternative, the instruction is
-valid.  Otherwise, for each alternative, the compiler counts how many
-instructions must be added to copy the operands so that that
-alternative applies.  The alternative requiring the least copying is
-chosen.  If two alternatives need the same amount of copying, the one
-that comes first is chosen.  These choices can be altered with the `?'
-and `!' characters:
-
-`?'
-     Disparage slightly the alternative that the `?' appears in, as a
-     choice when no alternative applies exactly.  The compiler regards
-     this alternative as one unit more costly for each `?' that appears
-     in it.
-
-`!'
-     Disparage severely the alternative that the `!' appears in.  This
-     alternative can still be used if it fits without reloading, but if
-     reloading is needed, some other alternative will be used.
-
-\1f
-File: gcc.info,  Node: Modifiers,  Next: Machine Constraints,  Prev: Multi-Alternative,  Up: Constraints
-
-Constraint Modifier Characters
-------------------------------
-
-   Here are constraint modifier characters.
-
-`='
-     Means that this operand is write-only for this instruction: the
-     previous value is discarded and replaced by output data.
-
-`+'
-     Means that this operand is both read and written by the
-     instruction.
-
-     When the compiler fixes up the operands to satisfy the constraints,
-     it needs to know which operands are inputs to the instruction and
-     which are outputs from it.  `=' identifies an output; `+'
-     identifies an operand that is both input and output; all other
-     operands are assumed to be input only.
-
-     If you specify `=' or `+' in a constraint, you put it in the first
-     character of the constraint string.
-
-`&'
-     Means (in a particular alternative) that this operand is an
-     "earlyclobber" operand, which is modified before the instruction is
-     finished using the input operands.  Therefore, this operand may
-     not lie in a register that is used as an input operand or as part
-     of any memory address.
-
-     `&' applies only to the alternative in which it is written.  In
-     constraints with multiple alternatives, sometimes one alternative
-     requires `&' while others do not.  See, for example, the `movdf'
-     insn of the 68000.
-
-     An input operand can be tied to an earlyclobber operand if its only
-     use as an input occurs before the early result is written.  Adding
-     alternatives of this form often allows GCC to produce better code
-     when only some of the inputs can be affected by the earlyclobber.
-     See, for example, the `mulsi3' insn of the ARM.
-
-     `&' does not obviate the need to write `='.
-
-`%'
-     Declares the instruction to be commutative for this operand and the
-     following operand.  This means that the compiler may interchange
-     the two operands if that is the cheapest way to make all operands
-     fit the constraints.
-
-`#'
-     Says that all following characters, up to the next comma, are to be
-     ignored as a constraint.  They are significant only for choosing
-     register preferences.
-
-`*'
-     Says that the following character should be ignored when choosing
-     register preferences.  `*' has no effect on the meaning of the
-     constraint as a constraint, and no effect on reloading.
-
-