aboutsummaryrefslogtreecommitdiff
path: root/gcc-1.40/gcc.info-7
diff options
context:
space:
mode:
authorAndrew Lee <alee14498@protonmail.com>2021-08-15 00:34:05 -0400
committerAndrew Lee <alee14498@protonmail.com>2021-08-15 00:34:05 -0400
commit60cc83bf91bfc9bb02f6304b5d6c8234ba6d210f (patch)
treefdc0be85a1ca35e34c3ae2c805fe9b718e3c1091 /gcc-1.40/gcc.info-7
parentdd8dfab51b832a654365ed00c06bf802ff628bfa (diff)
downloadlinux-0.01-distro-60cc83bf91bfc9bb02f6304b5d6c8234ba6d210f.tar.gz
linux-0.01-distro-60cc83bf91bfc9bb02f6304b5d6c8234ba6d210f.tar.bz2
linux-0.01-distro-60cc83bf91bfc9bb02f6304b5d6c8234ba6d210f.zip
Added gccHEADmaster
Diffstat (limited to 'gcc-1.40/gcc.info-7')
-rw-r--r--gcc-1.40/gcc.info-7970
1 files changed, 970 insertions, 0 deletions
diff --git a/gcc-1.40/gcc.info-7 b/gcc-1.40/gcc.info-7
new file mode 100644
index 0000000..ed72551
--- /dev/null
+++ b/gcc-1.40/gcc.info-7
@@ -0,0 +1,970 @@
+Info file gcc.info, produced by Makeinfo, -*- Text -*- from input
+file gcc.texinfo.
+
+ This file documents the use and the internals of the GNU compiler.
+
+ Copyright (C) 1988, 1989, 1990 Free Software Foundation, Inc.
+
+ Permission is granted to make and distribute verbatim copies of
+this manual provided the copyright notice and this permission notice
+are preserved on all copies.
+
+ Permission is granted to copy and distribute modified versions of
+this manual under the conditions for verbatim copying, provided also
+that the sections entitled "GNU General Public License" and "Protect
+Your Freedom--Fight `Look And Feel'" are included exactly as in the
+original, and provided that the entire resulting derived work is
+distributed under the terms of a permission notice identical to this
+one.
+
+ Permission is granted to copy and distribute translations of this
+manual into another language, under the above conditions for modified
+versions, except that the sections entitled "GNU General Public
+License" and "Protect Your Freedom--Fight `Look And Feel'" and this
+permission notice may be included in translations approved by the
+Free Software Foundation instead of in the original English.
+
+
+File: gcc.info, Node: Sharing, Prev: Calls, Up: RTL
+
+Structure Sharing Assumptions
+=============================
+
+ The compiler assumes that certain kinds of RTL expressions are
+unique; there do not exist two distinct objects representing the same
+value. In other cases, it makes an opposite assumption: that no RTL
+expression object of a certain kind appears in more than one place in
+the containing structure.
+
+ These assumptions refer to a single function; except for the RTL
+objects that describe global variables and external functions, no RTL
+objects are common to two functions.
+
+ * Each pseudo-register has only a single `reg' object to represent
+ it, and therefore only a single machine mode.
+
+ * For any symbolic label, there is only one `symbol_ref' object
+ referring to it.
+
+ * There is only one `const_int' expression with value zero, and
+ only one with value one.
+
+ * There is only one `pc' expression.
+
+ * There is only one `cc0' expression.
+
+ * There is only one `const_double' expression with mode `SFmode'
+ and value zero, and only one with mode `DFmode' and value zero.
+
+ * No `label_ref' appears in more than one place in the RTL
+ structure; in other words, it is safe to do a tree-walk of all
+ the insns in the function and assume that each time a
+ `label_ref' is seen it is distinct from all others that are seen.
+
+ * Only one `mem' object is normally created for each static
+ variable or stack slot, so these objects are frequently shared
+ in all the places they appear. However, separate but equal
+ objects for these variables are occasionally made.
+
+ * When a single `asm' statement has multiple output operands, a
+ distinct `asm_operands' RTX is made for each output operand.
+ However, these all share the vector which contains the sequence
+ of input operands. Because this sharing is used later on to
+ test whether two `asm_operands' RTX's come from the same
+ statement, the sharing must be guaranteed to be preserved.
+
+ * No RTL object appears in more than one place in the RTL
+ structure except as described above. Many passes of the
+ compiler rely on this by assuming that they can modify RTL
+ objects in place without unwanted side-effects on other insns.
+
+ * During initial RTL generation, shared structure is freely
+ introduced. After all the RTL for a function has been
+ generated, all shared structure is copied by `unshare_all_rtl'
+ in `emit-rtl.c', after which the above rules are guaranteed to
+ be followed.
+
+ * During the combiner pass, shared structure with an insn can
+ exist temporarily. However, the shared structure is copied
+ before the combiner is finished with the insn. This is done by
+ `copy_substitutions' in `combine.c'.
+
+
+File: gcc.info, Node: Machine Desc, Next: Machine Macros, Prev: RTL, Up: Top
+
+Machine Descriptions
+********************
+
+ A machine description has two parts: a file of instruction
+patterns (`.md' file) and a C header file of macro definitions.
+
+ The `.md' file for a target machine contains a pattern for each
+instruction that the target machine supports (or at least each
+instruction that is worth telling the compiler about). It may also
+contain comments. A semicolon causes the rest of the line to be a
+comment, unless the semicolon is inside a quoted string.
+
+ See the next chapter for information on the C header file.
+
+* Menu:
+
+* Patterns:: How to write instruction patterns.
+* Example:: An explained example of a `define_insn' pattern.
+* RTL Template:: The RTL template defines what insns match a pattern.
+* Output Template:: The output template says how to make assembler code
+ from such an insn.
+* Output Statement:: For more generality, write C code to output
+ the assembler code.
+* Constraints:: When not all operands are general operands.
+* Standard Names:: Names mark patterns to use for code generation.
+* Pattern Ordering:: When the order of patterns makes a difference.
+* Dependent Patterns:: Having one pattern may make you need another.
+* Jump Patterns:: Special considerations for patterns for jump insns.
+* Peephole Definitions::Defining machine-specific peephole optimizations.
+* Expander Definitions::Generating a sequence of several RTL insns
+ for a standard operation.
+
+
+File: gcc.info, Node: Patterns, Next: Example, Prev: Machine Desc, Up: Machine Desc
+
+Everything about Instruction Patterns
+=====================================
+
+ Each instruction pattern contains an incomplete RTL expression,
+with pieces to be filled in later, operand constraints that restrict
+how the pieces can be filled in, and an output pattern or C code to
+generate the assembler output, all wrapped up in a `define_insn'
+expression.
+
+ A `define_insn' is an RTL expression containing four or five
+operands:
+
+ 1. An optional name. The presence of a name indicate that this
+ instruction pattern can perform a certain standard job for the
+ RTL-generation pass of the compiler. This pass knows certain
+ names and will use the instruction patterns with those names, if
+ the names are defined in the machine description.
+
+ The absence of a name is indicated by writing an empty string
+ where the name should go. Nameless instruction patterns are
+ never used for generating RTL code, but they may permit several
+ simpler insns to be combined later on.
+
+ Names that are not thus known and used in RTL-generation have
+ no effect; they are equivalent to no name at all.
+
+ 2. The "RTL template" (*note RTL Template::.) is a vector of
+ incomplete RTL expressions which show what the instruction
+ should look like. It is incomplete because it may contain
+ `match_operand' and `match_dup' expressions that stand for
+ operands of the instruction.
+
+ If the vector has only one element, that element is the
+ template for the instruction pattern. If the vector has
+ multiple elements, then the instruction pattern is a `parallel'
+ expression containing the elements described.
+
+ 3. A condition. This is a string which contains a C expression
+ that is the final test to decide whether an insn body matches
+ this pattern.
+
+ For a named pattern, the condition (if present) may not
+ depend on the data in the insn being matched, but only the
+ target-machine-type flags. The compiler needs to test these
+ conditions during initialization in order to learn exactly which
+ named instructions are available in a particular run.
+
+ For nameless patterns, the condition is applied only when
+ matching an individual insn, and only after the insn has matched
+ the pattern's recognition template. The insn's operands may be
+ found in the vector `operands'.
+
+ 4. The "output template": a string that says how to output matching
+ insns as assembler code. `%' in this string specifies where to
+ substitute the value of an operand. *Note Output Template::.
+
+ When simple substitution isn't general enough, you can
+ specify a piece of C code to compute the output. *Note Output
+ Statement::.
+
+ 5. Optionally, some "machine-specific information". The meaning of
+ this information is defined only by an individual machine
+ description; typically it might say whether this insn alters the
+ condition codes, or how many bytes of output it generates.
+
+ This operand is written as a string containing a C
+ initializer (complete with braces) for the structure type
+ `INSN_MACHINE_INFO', whose definition is up to you (*note
+ Misc::.).
+
+
+File: gcc.info, Node: Example, Next: RTL Template, Prev: Patterns, Up: Machine Desc
+
+Example of `define_insn'
+========================
+
+ Here is an actual example of an instruction pattern, for the
+68000/68020.
+
+ (define_insn "tstsi"
+ [(set (cc0)
+ (match_operand:SI 0 "general_operand" "rm"))]
+ ""
+ "*
+ { if (TARGET_68020 || ! ADDRESS_REG_P (operands[0]))
+ return \"tstl %0\";
+ return \"cmpl #0,%0\"; }")
+
+ This is an instruction that sets the condition codes based on the
+value of a general operand. It has no condition, so any insn whose
+RTL description has the form shown may be handled according to this
+pattern. The name `tstsi' means "test a `SImode' value" and tells
+the RTL generation pass that, when it is necessary to test such a
+value, an insn to do so can be constructed using this pattern.
+
+ The output control string is a piece of C code which chooses which
+output template to return based on the kind of operand and the
+specific type of CPU for which code is being generated.
+
+ `"rm"' is an operand constraint. Its meaning is explained below.
+
+
+File: gcc.info, Node: RTL Template, Next: Output Template, Prev: Example, Up: Machine Desc
+
+RTL Template for Generating and Recognizing Insns
+=================================================
+
+ The RTL template is used to define which insns match the
+particular pattern and how to find their operands. For named
+patterns, the RTL template also says how to construct an insn from
+specified operands.
+
+ Construction involves substituting specified operands into a copy
+of the template. Matching involves determining the values that serve
+as the operands in the insn being matched. Both of these activities
+are controlled by special expression types that direct matching and
+substitution of the operands.
+
+`(match_operand:M N PRED CONSTRAINT)'
+ This expression is a placeholder for operand number N of the
+ insn. When constructing an insn, operand number N will be
+ substituted at this point. When matching an insn, whatever
+ appears at this position in the insn will be taken as operand
+ number N; but it must satisfy PRED or this instruction pattern
+ will not match at all.
+
+ Operand numbers must be chosen consecutively counting from zero
+ in each instruction pattern. There may be only one
+ `match_operand' expression in the pattern for each operand
+ number. Usually operands are numbered in the order of
+ appearance in `match_operand' expressions.
+
+ PRED is a string that is the name of a C function that accepts
+ two arguments, an expression and a machine mode. During
+ matching, the function will be called with the putative operand
+ as the expression and M as the mode argument. If it returns
+ zero, this instruction pattern fails to match. PRED may be an
+ empty string; then it means no test is to be done on the
+ operand, so anything which occurs in this position is valid.
+
+ CONSTRAINT controls reloading and the choice of the best
+ register class to use for a value, as explained later (*note
+ Constraints::.).
+
+ People are often unclear on the difference between the
+ constraint and the predicate. The predicate helps decide
+ whether a given insn matches the pattern. The constraint plays
+ no role in this decision; instead, it controls various decisions
+ in the case of an insn which does match.
+
+ Most often, PRED is `"general_operand"'. This function checks
+ that the putative operand is either a constant, a register or a
+ memory reference, and that it is valid for mode M.
+
+ For an operand that must be a register, PRED should be
+ `"register_operand"'. It would be valid to use
+ `"general_operand"', since the reload pass would copy any
+ non-register operands through registers, but this would make GNU
+ CC do extra work, and it would prevent the register allocator
+ from doing the best possible job.
+
+ For an operand that must be a constant, either PRED should be
+ `"immediate_operand"', or the instruction pattern's extra
+ condition should check for constants, or both. You cannot
+ expect the constraints to do this work! If the constraints
+ allow only constants, but the predicate allows something else,
+ the compiler will crash when that case arises.
+
+`(match_dup N)'
+ This expression is also a placeholder for operand number N. It
+ is used when the operand needs to appear more than once in the
+ insn.
+
+ In construction, `match_dup' behaves exactly like
+ `match_operand': the operand is substituted into the insn being
+ constructed. But in matching, `match_dup' behaves differently.
+ It assumes that operand number N has already been determined by
+ a `match_operand' appearing earlier in the recognition template,
+ and it matches only an identical-looking expression.
+
+`(match_operator:M N "PREDICATE" [OPERANDS...])'
+ This pattern is a kind of placeholder for a variable RTL
+ expression code.
+
+ When constructing an insn, it stands for an RTL expression whose
+ expression code is taken from that of operand N, and whose
+ operands are constructed from the patterns OPERANDS.
+
+ When matching an expression, it matches an expression if the
+ function PREDICATE returns nonzero on that expression *and* the
+ patterns OPERANDS match the operands of the expression.
+
+ Suppose that the function `commutative_operator' is defined as
+ follows, to match any expression whose operator is one of the
+ six commutative arithmetic operators of RTL and whose mode is
+ MODE:
+
+ int
+ commutative_operator (x, mode)
+ rtx x;
+ enum machine_mode mode;
+ {
+ enum rtx_code code = GET_CODE (x);
+ if (GET_MODE (x) != mode)
+ return 0;
+ return (code == PLUS || code == MULT || code == UMULT
+ || code == AND || code == IOR || code == XOR);
+ }
+
+ Then the following pattern will match any RTL expression
+ consisting of a commutative operator applied to two general
+ operands:
+
+ (match_operator:SI 2 "commutative_operator"
+ [(match_operand:SI 3 "general_operand" "g")
+ (match_operand:SI 4 "general_operand" "g")])
+
+ Here the vector `[OPERANDS...]' contains two patterns because
+ the expressions to be matched all contain two operands.
+
+ When this pattern does match, the two operands of the
+ commutative operator are recorded as operands 3 and 4 of the
+ insn. (This is done by the two instances of `match_operand'.)
+ Operand 2 of the insn will be the entire commutative expression:
+ use `GET_CODE (operands[2])' to see which commutative operator
+ was used.
+
+ The machine mode M of `match_operator' works like that of
+ `match_operand': it is passed as the second argument to the
+ predicate function, and that function is solely responsible for
+ deciding whether the expression to be matched "has" that mode.
+
+ When constructing an insn, argument 2 of the gen-function will
+ specify the operation (i.e. the expression code) for the
+ expression to be made. It should be an RTL expression, whose
+ expression code is copied into a new expression whose operands
+ are arguments 3 and 4 of the gen-function. The subexpressions
+ of argument 2 are not used; only its expression code matters.
+
+ There is no way to specify constraints in `match_operator'. The
+ operand of the insn which corresponds to the `match_operator'
+ never has any constraints because it is never reloaded as a whole.
+ However, if parts of its OPERANDS are matched by `match_operand'
+ patterns, those parts may have constraints of their own.
+
+`(address (match_operand:M N "address_operand" ""))'
+ This complex of expressions is a placeholder for an operand
+ number N in a "load address" instruction: an operand which
+ specifies a memory location in the usual way, but for which the
+ actual operand value used is the address of the location, not
+ the contents of the location.
+
+ `address' expressions never appear in RTL code, only in machine
+ descriptions. And they are used only in machine descriptions
+ that do not use the operand constraint feature. When operand
+ constraints are in use, the letter `p' in the constraint serves
+ this purpose.
+
+ M is the machine mode of the *memory location being addressed*,
+ not the machine mode of the address itself. That mode is always
+ the same on a given target machine (it is `Pmode', which
+ normally is `SImode'), so there is no point in mentioning it;
+ thus, no machine mode is written in the `address' expression.
+ If some day support is added for machines in which addresses of
+ different kinds of objects appear differently or are used
+ differently (such as the PDP-10), different formats would
+ perhaps need different machine modes and these modes might be
+ written in the `address' expression.
+
+
+File: gcc.info, Node: Output Template, Next: Output Statement, Prev: RTL Template, Up: Machine Desc
+
+Output Templates and Operand Substitution
+=========================================
+
+ The "output template" is a string which specifies how to output
+the assembler code for an instruction pattern. Most of the template
+is a fixed string which is output literally. The character `%' is
+used to specify where to substitute an operand; it can also be used
+to identify places where different variants of the assembler require
+different syntax.
+
+ In the simplest case, a `%' followed by a digit N says to output
+operand N at that point in the string.
+
+ `%' followed by a letter and a digit says to output an operand in
+an alternate fashion. Four letters have standard, built-in meanings
+described below. The machine description macro `PRINT_OPERAND' can
+define additional letters with nonstandard meanings.
+
+ `%cDIGIT' can be used to substitute an operand that is a constant
+value without the syntax that normally indicates an immediate operand.
+
+ `%nDIGIT' is like `%cDIGIT' except that the value of the constant
+is negated before printing.
+
+ `%aDIGIT' can be used to substitute an operand as if it were a
+memory reference, with the actual operand treated as the address.
+This may be useful when outputting a "load address" instruction,
+because often the assembler syntax for such an instruction requires
+you to write the operand as if it were a memory reference.
+
+ `%lDIGIT' is used to substitute a `label_ref' into a jump
+instruction.
+
+ `%' followed by a punctuation character specifies a substitution
+that does not use an operand. Only one case is standard: `%%'
+outputs a `%' into the assembler code. Other nonstandard cases can
+be defined in the `PRINT_OPERAND' macro. You must also define which
+punctuation characters are valid with the
+`PRINT_OPERAND_PUNCT_VALID_P' macro.
+
+ The template may generate multiple assembler instructions. Write
+the text for the instructions, with `\;' between them.
+
+ When the RTL contains two operands which are required by
+constraint to match each other, the output template must refer only
+to the lower-numbered operand. Matching operands are not always
+identical, and the rest of the compiler arranges to put the proper
+RTL expression for printing into the lower-numbered operand.
+
+ One use of nonstandard letters or punctuation following `%' is to
+distinguish between different assembler languages for the same
+machine; for example, Motorola syntax versus MIT syntax for the
+68000. Motorola syntax requires periods in most opcode names, while
+MIT syntax does not. For example, the opcode `movel' in MIT syntax
+is `move.l' in Motorola syntax. The same file of patterns is used
+for both kinds of output syntax, but the character sequence `%.' is
+used in each place where Motorola syntax wants a period. The
+`PRINT_OPERAND' macro for Motorola syntax defines the sequence to
+output a period; the macro for MIT syntax defines it to do nothing.
+
+
+File: gcc.info, Node: Output Statement, Next: Constraints, Prev: Output Template, Up: Machine Desc
+
+C Statements for Generating Assembler Output
+============================================
+
+ Often a single fixed template string cannot produce correct and
+efficient assembler code for all the cases that are recognized by a
+single instruction pattern. For example, the opcodes may depend on
+the kinds of operands; or some unfortunate combinations of operands
+may require extra machine instructions.
+
+ If the output control string starts with a `*', then it is not an
+output template but rather a piece of C program that should compute a
+template. It should execute a `return' statement to return the
+template-string you want. Most such templates use C string literals,
+which require doublequote characters to delimit them. To include
+these doublequote characters in the string, prefix each one with `\'.
+
+ The operands may be found in the array `operands', whose C data
+type is `rtx []'.
+
+ It is possible to output an assembler instruction and then go on
+to output or compute more of them, using the subroutine
+`output_asm_insn'. This receives two arguments: a template-string
+and a vector of operands. The vector may be `operands', or it may be
+another array of `rtx' that you declare locally and initialize
+yourself.
+
+ When an insn pattern has multiple alternatives in its constraints,
+often the appearance of the assembler code is determined mostly by
+which alternative was matched. When this is so, the C code can test
+the variable `which_alternative', which is the ordinal number of the
+alternative that was actually satisfied (0 for the first, 1 for the
+second alternative, etc.).
+
+ For example, suppose there are two opcodes for storing zero,
+`clrreg' for registers and `clrmem' for memory locations. Here is
+how a pattern could use `which_alternative' to choose between them:
+
+ (define_insn ""
+ [(set (match_operand:SI 0 "general_operand" "r,m")
+ (const_int 0))]
+ ""
+ "*
+ return (which_alternative == 0
+ ? \"clrreg %0\" : \"clrmem %0\");
+ ")
+
+
+File: gcc.info, Node: Constraints, Next: Standard Names, Prev: Output Statement, Up: Machine Desc
+
+Operand Constraints
+===================
+
+ Each `match_operand' in an instruction pattern can specify a
+constraint for the type of operands allowed. 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.
+* Class Preferences:: Constraints guide which hard register to put things in.
+* Modifiers:: More precise control over effects of constraints.
+* No Constraints:: Describing a clean machine without constraints.
+
+
+File: gcc.info, Node: Simple Constraints, Next: Multi-Alternative, Prev: Constraints, 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:
+
+`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).
+
+ When the constraint letter `o' is used, the reload pass may
+ generate instructions which copy a nonoffsettable address into
+ an index register. The idea is that the register can be used as
+ a replacement offsettable address. But this method requires
+ that there be patterns to copy any kind of address into a
+ register. Auto-increment and auto-decrement addresses are an
+ exception; there need not be an instruction that can copy such
+ an address into a register, because reload handles these cases
+ specially.
+
+ Most older machine designs have "load address" instructions
+ which do just what is needed here. Some RISC machines do not
+ advertise such instructions, but the possible addresses on these
+ machines are very limited, so it is easy to fake them.
+
+`<'
+ 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.
+
+`d', `a', `f', ...
+ Other letters can be defined in machine-dependent fashion to
+ stand for particular classes of registers. `d', `a' and `f' are
+ defined on the 68000/68020 to stand for data, address and
+ floating point registers.
+
+`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', ...
+ Other letters in the range `I' through `M' 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.
+
+`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.
+
+`N' (a digit)
+ An operand that matches operand number N is allowed. If a digit
+ is used together with letters, the digit should come last.
+
+ This is called a "matching constraint" and what it really means
+ is that the assembler has only a single operand that fills two
+ roles considered separate in the RTL insn. For example, an add
+ insn has two input operands and one output operand in the RTL,
+ but on most machines an add instruction really has only two
+ operands, one of them an input-output operand.
+
+ Matching constraints work only in circumstances like that add
+ insn. More precisely, the matching constraint must appear in an
+ input-only operand and the operand that it matches must be an
+ output-only operand with a lower number. Thus, operand N must
+ have `=' in its constraint.
+
+ For operands to match in a particular case usually means that
+ they are identical-looking RTL expressions. But in a few
+ special cases specific kinds of dissimilarity are allowed. For
+ example, `*x' as an input operand will match `*x++' as an output
+ operand. For proper results in such cases, the output template
+ should always use the output-operand's number when printing the
+ operand.
+
+`p'
+ An operand that is a valid memory address is allowed. This is
+ for "load address" and "push address" instructions.
+
+ `p' in the constraint must be accompanies by `address_operand'
+ as the predicate in the `match_operand'.
+
+ In order to have valid assembler code, each operand must satisfy
+its constraint. But a failure to do so does not prevent the pattern
+from applying to an insn. Instead, it directs the compiler to modify
+the code so that the constraint will be satisfied. Usually this is
+done by copying an operand into a register.
+
+ Contrast, therefore, the two instruction patterns that follow:
+
+ (define_insn ""
+ [(set (match_operand:SI 0 "general_operand" "r")
+ (plus:SI (match_dup 0)
+ (match_operand:SI 1 "general_operand" "r")))]
+ ""
+ "...")
+
+which has two operands, one of which must appear in two places, and
+
+ (define_insn ""
+ [(set (match_operand:SI 0 "general_operand" "r")
+ (plus:SI (match_operand:SI 1 "general_operand" "0")
+ (match_operand:SI 2 "general_operand" "r")))]
+ ""
+ "...")
+
+which has three operands, two of which are required by a constraint
+to be identical. If we are considering an insn of the form
+
+ (insn N PREV NEXT
+ (set (reg:SI 3)
+ (plus:SI (reg:SI 6) (reg:SI 109)))
+ ...)
+
+the first pattern would not apply at all, because this insn does not
+contain two identical subexpressions in the right place. The pattern
+would say, "That does not look like an add instruction; try other
+patterns." The second pattern would say, "Yes, that's an add
+instruction, but there is something wrong with it." It would direct
+the reload pass of the compiler to generate additional insns to make
+the constraint true. The results might look like this:
+
+ (insn N2 PREV N
+ (set (reg:SI 3) (reg:SI 6))
+ ...)
+
+ (insn N N2 NEXT
+ (set (reg:SI 3)
+ (plus:SI (reg:SI 3) (reg:SI 109)))
+ ...)
+
+ It is up to you to make sure that each operand, in each pattern,
+has constraints that can handle any RTL expression that could be
+present for that operand. (When multiple alternatives are in use,
+each pattern must, for each possible combination of operand
+expressions, have at least one alternative which can handle that
+combination of operands.) The constraints don't need to *allow* any
+possible operand--when this is the case, they do not constrain--but
+they must at least point the way to reloading any possible operand so
+that it will fit.
+
+ * If the constraint accepts whatever operands the predicate
+ permits, there is no problem: reloading is never necessary for
+ this operand.
+
+ For example, an operand whose constraints permit everything
+ except registers is safe provided its predicate rejects registers.
+
+ An operand whose predicate accepts only constant values is safe
+ provided its constraints include the letter `i'. If any
+ possible constant value is accepted, then nothing less than `i'
+ will do; if the predicate is more selective, then the
+ constraints may also be more selective.
+
+ * Any operand expression can be reloaded by copying it into a
+ register. So if an operand's constraints allow some kind of
+ register, it is certain to be safe. It need not permit all
+ classes of registers; the compiler knows how to copy a register
+ into another register of the proper class in order to make an
+ instruction valid.
+
+ * A nonoffsettable memory reference can be reloaded by copying the
+ address into a register. So if the constraint uses the letter
+ `o', all memory references are taken care of.
+
+ * A constant operand can be reloaded by allocating space in memory
+ to hold it as preinitialized data. Then the memory reference
+ can be used in place of the constant. So if the constraint uses
+ the letters `o' or `m', constant operands are not a problem.
+
+ If the operand's predicate can recognize registers, but the
+constraint does not permit them, it can make the compiler crash.
+When this operand happens to be a register, the reload pass will be
+stymied, because it does not know how to copy a register temporarily
+into memory.
+
+
+File: gcc.info, Node: Multi-Alternative, Next: Class Preferences, 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. Here is how it is done for fullword logical-or
+on the 68000:
+
+ (define_insn "iorsi3"
+ [(set (match_operand:SI 0 "general_operand" "=m,d")
+ (ior:SI (match_operand:SI 1 "general_operand" "%0,0")
+ (match_operand:SI 2 "general_operand" "dKs,dmKs")))]
+ ...)
+
+ The first alternative has `m' (memory) for operand 0, `0' for
+operand 1 (meaning it must match operand 0), and `dKs' for operand 2.
+The second alternative has `d' (data register) for operand 0, `0' for
+operand 1, and `dmKs' for operand 2. The `=' and `%' in the
+constraints apply to all the alternatives; their meaning is explained
+in the next section.
+
+ 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.
+ When operands must be copied into registers, the compiler will
+ never choose this alternative as the one to strive for.
+
+ When an insn pattern has multiple alternatives in its constraints,
+often the appearance of the assembler code is determined mostly by
+which alternative was matched. When this is so, the C code for
+writing the assembler code can use the variable `which_alternative',
+which is the ordinal number of the alternative that was actually
+satisfied (0 for the first, 1 for the second alternative, etc.). For
+example:
+
+ (define_insn ""
+ [(set (match_operand:SI 0 "general_operand" "r,m")
+ (const_int 0))]
+ ""
+ "*
+ return (which_alternative == 0
+ ? \"clrreg %0\" : \"clrmem %0\");
+ ")
+
+
+File: gcc.info, Node: Class Preferences, Next: Modifiers, Prev: Multi-Alternative, Up: Constraints
+
+Register Class Preferences
+--------------------------
+
+ The operand constraints have another function: they enable the
+compiler to decide which kind of hardware register a pseudo register
+is best allocated to. The compiler examines the constraints that
+apply to the insns that use the pseudo register, looking for the
+machine-dependent letters such as `d' and `a' that specify classes of
+registers. The pseudo register is put in whichever class gets the
+most "votes". The constraint letters `g' and `r' also vote: they
+vote in favor of a general register. The machine description says
+which registers are considered general.
+
+ Of course, on some machines all registers are equivalent, and no
+register classes are defined. Then none of this complexity is
+relevant.
+
+
+File: gcc.info, Node: Modifiers, Next: No Constraints, Prev: Class Preferences, Up: Constraints
+
+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.
+
+`&'
+ Means (in a particular alternative) that this operand is written
+ 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.
+
+ `&' does not obviate the need to write `='.
+
+`%'
+ Declares the instruction to be commutative for this operand and
+ the following operand. This means that the compiler may
+ interchange the two operands if that is the cheapest way to make
+ all operands fit the constraints. This is often used in
+ patterns for addition instructions that really have only two
+ operands: the result must go in one of the arguments. Here for
+ example, is how the 68000 halfword-add instruction is defined:
+
+ (define_insn "addhi3"
+ [(set (match_operand:HI 0 "general_operand" "=m,r")
+ (plus:HI (match_operand:HI 1 "general_operand" "%0,0")
+ (match_operand:HI 2 "general_operand" "di,g")))]
+ ...)
+
+ Note that in previous versions of GNU CC the `%' constraint
+ modifier always applied to operands 1 and 2 regardless of which
+ operand it was written in. The usual custom was to write it in
+ operand 0. Now it must be in operand 1 if the operands to be
+ exchanged are 1 and 2.
+
+`#'
+ 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.
+
+ Here is an example: the 68000 has an instruction to sign-extend
+ a halfword in a data register, and can also sign-extend a value
+ by copying it into an address register. While either kind of
+ register is acceptable, the constraints on an address-register
+ destination are less strict, so it is best if register
+ allocation makes an address register its goal. Therefore, `*'
+ is used so that the `d' constraint letter (for data register) is
+ ignored when computing register preferences.
+
+ (define_insn "extendhisi2"
+ [(set (match_operand:SI 0 "general_operand" "=*d,a")
+ (sign_extend:SI
+ (match_operand:HI 1 "general_operand" "0,g")))]
+ ...)
+
+
+File: gcc.info, Node: No Constraints, Prev: Modifiers, Up: Constraints
+
+Not Using Constraints
+---------------------
+
+ Some machines are so clean that operand constraints are not
+required. For example, on the Vax, an operand valid in one context
+is valid in any other context. On such a machine, every operand
+constraint would be `g', excepting only operands of "load address"
+instructions which are written as if they referred to a memory
+location's contents but actual refer to its address. They would have
+constraint `p'.
+
+ For such machines, instead of writing `g' and `p' for all the
+constraints, you can choose to write a description with empty
+constraints. Then you write `""' for the constraint in every
+`match_operand'. Address operands are identified by writing an
+`address' expression around the `match_operand', not by their
+constraints.
+
+ When the machine description has just empty constraints, certain
+parts of compilation are skipped, making the compiler faster.
+However, few machines actually do not need constraints; all machine
+descriptions now in existence use constraints.
+
+ \ No newline at end of file