home *** CD-ROM | disk | FTP | other *** search
Text File | 1992-07-06 | 139.0 KB | 3,346 lines |
- @c Copyright (C) 1988, 1989, 1992 Free Software Foundation, Inc.
- @c This is part of the GCC manual.
- @c For copying conditions, see the file gcc.texi.
-
- @ifset INTERNALS
- @node Machine Desc
- @chapter Machine Descriptions
- @cindex machine descriptions
-
- A machine description has two parts: a file of instruction patterns
- (@file{.md} file) and a C header file of macro definitions.
-
- The @file{.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 @code{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.
- * Insn Canonicalizations::Canonicalization of Instructions
- * Peephole Definitions::Defining machine-specific peephole optimizations.
- * Expander Definitions::Generating a sequence of several RTL insns
- for a standard operation.
- * Insn Splitting:: Splitting Instructions into Multiple Instructions
- * Insn Attributes:: Specifying the value of attributes for generated insns.
- @end menu
-
- @node Patterns, Example, Machine Desc, Machine Desc
- @section Everything about Instruction Patterns
- @cindex patterns
- @cindex instruction patterns
-
- @findex define_insn
- 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 @code{define_insn} expression.
-
- A @code{define_insn} is an RTL expression containing four or five operands:
-
- @enumerate
- @item
- 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.
-
- @item
- The @dfn{RTL template} (@pxref{RTL Template}) is a vector of incomplete
- RTL expressions which show what the instruction should look like. It is
- incomplete because it may contain @code{match_operand},
- @code{match_operator}, and @code{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 @code{parallel} expression containing the
- elements described.
-
- @item
- @cindex pattern conditions
- @cindex conditions, in patterns
- 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.
-
- @cindex named patterns and conditions
- 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.
-
- @findex operands
- 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
- @code{operands}.
-
- @item
- The @dfn{output template}: a string that says how to output matching
- insns as assembler code. @samp{%} in this string specifies where
- to substitute the value of an operand. @xref{Output Template}.
-
- When simple substitution isn't general enough, you can specify a piece
- of C code to compute the output. @xref{Output Statement}.
-
- @item
- Optionally, a vector containing the values of attributes for insns matching
- this pattern. @xref{Insn Attributes}.
- @end enumerate
-
- @node Example, RTL Template, Patterns, Machine Desc
- @section Example of @code{define_insn}
- @cindex @code{define_insn} example
-
- Here is an actual example of an instruction pattern, for the 68000/68020.
-
- @example
- (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\"; @}")
- @end example
-
- 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
- @samp{tstsi} means ``test a @code{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.
-
- @samp{"rm"} is an operand constraint. Its meaning is explained below.
-
- @node RTL Template, Output Template, Example, Machine Desc
- @section RTL Template for Generating and Recognizing Insns
- @cindex RTL insn template
- @cindex generating insns
- @cindex insns, generating
- @cindex recognizing insns
- @cindex insns, recognizing
-
- 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.
-
- @table @code
- @findex match_operand
- @item (match_operand:@var{m} @var{n} @var{predicate} @var{constraint})
- This expression is a placeholder for operand number @var{n} of
- the insn. When constructing an insn, operand number @var{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 @var{n}; but it must satisfy @var{predicate} or this instruction
- pattern will not match at all.
-
- Operand numbers must be chosen consecutively counting from zero in
- each instruction pattern. There may be only one @code{match_operand}
- expression in the pattern for each operand number. Usually operands
- are numbered in the order of appearance in @code{match_operand}
- expressions.
-
- @var{predicate} 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
- @var{m} as the mode argument (if @var{m} is not specified,
- @code{VOIDmode} will be used, which normally causes @var{predicate} to accept
- any mode). If it returns zero, this instruction pattern fails to match.
- @var{predicate} may be an empty string; then it means no test is to be done
- on the operand, so anything which occurs in this position is valid.
-
- Most of the time, @var{predicate} will reject modes other than @var{m}---but
- not always. For example, the predicate @code{address_operand} uses
- @var{m} as the mode of memory ref that the address should be valid for.
- Many predicates accept @code{const_int} nodes even though their mode is
- @code{VOIDmode}.
-
- @var{constraint} controls reloading and the choice of the best register
- class to use for a value, as explained later (@pxref{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.
-
- @findex general_operand
- On CISC machines, @var{predicate} is most often @code{"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 @var{m}.
-
- @findex register_operand
- For an operand that must be a register, @var{predicate} should be
- @code{"register_operand"}. It would be valid to use
- @code{"general_operand"}, since the reload pass would copy any
- non-register operands through registers, but this would make GNU CC do
- extra work, it would prevent invariant operands (such as constant) from
- being removed from loops, and it would prevent the register allocator
- from doing the best possible job. On RISC machines, it is usually most
- efficient to allow @var{predicate} to accept only objects that the
- constraints allow.
-
- @findex immediate_operand
- For an operand that must be a constant, either use
- @code{"immediate_operand"} for @var{predicate}, or make the instruction
- pattern's extra condition require a constant, 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.
-
- @findex match_scratch
- @item (match_scratch:@var{m} @var{n} @var{constraint})
- This expression is also a placeholder for operand number @var{n}
- and indicates that operand must be a @code{scratch} or @code{reg}
- expression.
-
- When matching patterns, this is completely equivalent to
-
- @example
- (match_operand:@var{m} @var{n} "scratch_operand" @var{pred})
- @end example
-
- but, when generating RTL, it produces a (@code{scratch}:@var{m})
- expression.
-
- If the last few expressions in a @code{parallel} are @code{clobber}
- expressions whose operands are either a hard register or
- @code{match_scratch}, the combiner can add them when necessary.
- @xref{Side Effects}.
-
- @findex match_dup
- @item (match_dup @var{n})
- This expression is also a placeholder for operand number @var{n}.
- It is used when the operand needs to appear more than once in the
- insn.
-
- In construction, @code{match_dup} behaves exactly like
- @code{match_operand}: the operand is substituted into the insn being
- constructed. But in matching, @code{match_dup} behaves differently.
- It assumes that operand number @var{n} has already been determined by
- a @code{match_operand} appearing earlier in the recognition template,
- and it matches only an identical-looking expression.
-
- @findex match_operator
- @item (match_operator:@var{m} @var{n} @var{predicate} [@var{operands}@dots{}])
- 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 @var{n}, and whose
- operands are constructed from the patterns @var{operands}.
-
- When matching an expression, it matches an expression if the function
- @var{predicate} returns nonzero on that expression @emph{and} the
- patterns @var{operands} match the operands of the expression.
-
- Suppose that the function @code{commutative_operator} is defined as
- follows, to match any expression whose operator is one of the
- commutative arithmetic operators of RTL and whose mode is @var{mode}:
-
- @example
- 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 GET_RTX_CLASS (code) == 'c' || code == EQ || code == NE;
- @}
- @end example
-
- Then the following pattern will match any RTL expression consisting
- of a commutative operator applied to two general operands:
-
- @example
- (match_operator:SI 3 "commutative_operator"
- [(match_operand:SI 1 "general_operand" "g")
- (match_operand:SI 2 "general_operand" "g")])
- @end example
-
- Here the vector @code{[@var{operands}@dots{}]} contains two patterns
- because the expressions to be matched all contain two operands.
-
- When this pattern does match, the two operands of the commutative
- operator are recorded as operands 1 and 2 of the insn. (This is done
- by the two instances of @code{match_operand}.) Operand 3 of the insn
- will be the entire commutative expression: use @code{GET_CODE
- (operands[3])} to see which commutative operator was used.
-
- The machine mode @var{m} of @code{match_operator} works like that of
- @code{match_operand}: it is passed as the second argument to the
- predicate function, and that function is solely responsible for
- deciding whether the expression to be matched ``has'' that mode.
-
- When constructing an insn, argument 3 of the gen-function will specify
- the operation (i.e. the expression code) for the expression to be
- made. It should be an RTL expression, whose expression code is copied
- into a new expression whose operands are arguments 1 and 2 of the
- gen-function. The subexpressions of argument 3 are not used;
- only its expression code matters.
-
- When @code{match_operator} is used in a pattern for matching an insn,
- it usually best if the operand number of the @code{match_operator}
- is higher than that of the actual operands of the insn. This improves
- register allocation because the register allocator often looks at
- operands 1 and 2 of insns to see if it can do register tying.
-
- There is no way to specify constraints in @code{match_operator}. The
- operand of the insn which corresponds to the @code{match_operator}
- never has any constraints because it is never reloaded as a whole.
- However, if parts of its @var{operands} are matched by
- @code{match_operand} patterns, those parts may have constraints of
- their own.
-
- @findex match_parallel
- @item (match_parallel @var{n} @var{predicate} [@var{subpat}@dots{}])
- This pattern is a placeholder for an insn that consists of a
- @code{parallel} expression with a variable number of elements. This
- expression should only appear at the top level of an insn pattern.
-
- When constructing an insn, operand number @var{n} will be substituted at
- this point. When matching an insn, it matches if the body of the insn
- is a @code{parallel} expression with at least as many elements as the
- vector of @var{subpat} expressions in the @code{match_parallel}, if each
- @var{subpat} matches the corresponding element of the @code{parallel},
- @emph{and} the function @var{predicate} returns nonzero on the
- @code{parallel} that is the body of the insn. It is the responsibility
- of the predicate to validate elements of the @code{parallel} beyond
- those listed in the @code{match_parallel}.@refill
-
- A typical use of @code{match_parallel} is to match load and store
- multiple expressions, which can contains a variable number of elements
- in a @code{parallel}. For example,
-
- @example
- (define_insn ""
- [(match_parallel 0 "load_multiple_operation"
- [(set (match_operand:SI 1 "gen_reg_operand" "=r")
- (match_operand:SI 2 "memory_operand" "m"))
- (use (reg:SI 179))
- (clobber (reg:SI 179))])]
- ""
- "loadm 0,0,%1,%2")
- @end example
-
- This example comes from @file{a29k.md}. The function
- @code{load_multiple_operations} is defined in @file{a29k.c} and checks
- that subsequent elements in the @code{parallel} are the same as the
- @code{set} in the pattern, except that they are referencing subsequent
- registers and memory locations.
-
- An insn that matches this pattern might look like:
-
- @example
- (parallel [(set (reg:SI 20) (mem:SI (reg:SI 100)))
- (use (reg:SI 179))
- (clobber (reg:SI 179))
- (set (reg:SI 21) (mem:SI (plus:SI (reg:SI 100) (const_int 4))))
- (set (reg:SI 22) (mem:SI (plus:SI (reg:SI 100) (const_int 8))))])
- @end example
-
- @findex address
- @item (address (match_operand:@var{m} @var{n} "address_operand" ""))
- This complex of expressions is a placeholder for an operand number
- @var{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.
-
- @code{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 @samp{p} in the constraint serves this purpose.
-
- @var{m} is the machine mode of the @emph{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 @code{Pmode}, which
- normally is @code{SImode}), so there is no point in mentioning it;
- thus, no machine mode is written in the @code{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 @code{address}
- expression.
- @end table
-
- @node Output Template, Output Statement, RTL Template, Machine Desc
- @section Output Templates and Operand Substitution
- @cindex output templates
- @cindex operand substitution
-
- @cindex @samp{%} in template
- @cindex percent sign
- The @dfn{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 @samp{%} 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 @samp{%} followed by a digit @var{n} says to output
- operand @var{n} at that point in the string.
-
- @samp{%} 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 @code{PRINT_OPERAND} can define
- additional letters with nonstandard meanings.
-
- @samp{%c@var{digit}} can be used to substitute an operand that is a
- constant value without the syntax that normally indicates an immediate
- operand.
-
- @samp{%n@var{digit}} is like @samp{%c@var{digit}} except that the value of
- the constant is negated before printing.
-
- @samp{%a@var{digit}} 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.
-
- @samp{%l@var{digit}} is used to substitute a @code{label_ref} into a jump
- instruction.
-
- @samp{%} followed by a punctuation character specifies a substitution that
- does not use an operand. Only one case is standard: @samp{%%} outputs a
- @samp{%} into the assembler code. Other nonstandard cases can be
- defined in the @code{PRINT_OPERAND} macro. You must also define
- which punctuation characters are valid with the
- @code{PRINT_OPERAND_PUNCT_VALID_P} macro.
-
- @cindex \
- @cindex backslash
- The template may generate multiple assembler instructions. Write the text
- for the instructions, with @samp{\;} between them.
-
- @cindex matching operands
- 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 @samp{%} 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 @samp{movel} in MIT syntax is @samp{move.l} in Motorola
- syntax. The same file of patterns is used for both kinds of output syntax,
- but the character sequence @samp{%.} is used in each place where Motorola
- syntax wants a period. The @code{PRINT_OPERAND} macro for Motorola syntax
- defines the sequence to output a period; the macro for MIT syntax defines
- it to do nothing.
-
- @node Output Statement, Constraints, Output Template, Machine Desc
- @section C Statements for Generating Assembler Output
- @cindex output statements
- @cindex C statements for assembler output
- @cindex 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 @samp{@@}, then it is actually
- a series of templates, each on a separate line. (Blank lines and
- leading spaces and tabs are ignored.) The templates correspond to the
- pattern's constraint alternatives (@pxref{Multi-Alternative}). For example,
- if a target machine has a two-address add instruction @samp{addr} to add
- into a register and another @samp{addm} to add a register to memory, you
- might write this pattern:
-
- @example
- (define_insn "addsi3"
- [(set (match_operand:SI 0 "general_operand" "=r,m")
- (plus:SI (match_operand:SI 1 "general_operand" "0,0")
- (match_operand:SI 2 "general_operand" "g,r")))]
- ""
- "@@
- addr %1,%0
- addm %1,%0")
- @end example
-
- @cindex @code{*} in template
- @cindex asterisk in template
- If the output control string starts with a @samp{*}, then it is not an
- output template but rather a piece of C program that should compute a
- template. It should execute a @code{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 @samp{\}.
-
- The operands may be found in the array @code{operands}, whose C data type
- is @code{rtx []}.
-
- It is very common to select different ways of generating assembler code
- based on whether an immediate operand is within a certain range. Be
- careful when doing this, because the result of @code{INTVAL} is an
- integer on the host machine. If the host machine has more bits in an
- @code{int} than the target machine has in the mode in which the constant
- will be used, then some of the bits you get from @code{INTVAL} will be
- superfluous. For proper results, you must carefully disregard the
- values of those bits.
-
- @findex output_asm_insn
- It is possible to output an assembler instruction and then go on to output
- or compute more of them, using the subroutine @code{output_asm_insn}. This
- receives two arguments: a template-string and a vector of operands. The
- vector may be @code{operands}, or it may be another array of @code{rtx}
- that you declare locally and initialize yourself.
-
- @findex which_alternative
- 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
- @code{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, @samp{clrreg}
- for registers and @samp{clrmem} for memory locations. Here is how
- a pattern could use @code{which_alternative} to choose between them:
-
- @example
- (define_insn ""
- [(set (match_operand:SI 0 "general_operand" "=r,m")
- (const_int 0))]
- ""
- "*
- return (which_alternative == 0
- ? \"clrreg %0\" : \"clrmem %0\");
- ")
- @end example
-
- The example above, where the assembler code to generate was
- @emph{solely} determined by the alternative, could also have been specified
- as follows, having the output control string start with a @samp{@@}:
-
- @example
- (define_insn ""
- [(set (match_operand:SI 0 "general_operand" "=r,m")
- (const_int 0))]
- ""
- "@@
- clrreg %0
- clrmem %0")
- @end example
-
- @node Constraints, Standard Names, Output Statement, Machine Desc
- @section Operand Constraints
- @cindex operand constraints
- @cindex constraints
-
- Each @code{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.
- @end menu
-
- @node Simple Constraints, Multi-Alternative, Constraints, Constraints
- @subsection Simple Constraints
- @cindex 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:
-
- @table @asis
- @cindex @samp{m} in constraint
- @cindex memory references in constraints
- @item @samp{m}
- A memory operand is allowed, with any kind of address that the machine
- supports in general.
-
- @cindex offsettable address
- @cindex @samp{o} in constraint
- @item @samp{o}
- A memory operand is allowed, but only if the address is
- @dfn{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.
-
- @cindex autoincrement/decrement addressing
- 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 @samp{o} is valid only when accompanied
- by both @samp{<} (if the target machine has predecrement addressing)
- and @samp{>} (if the target machine has preincrement addressing).
-
- @cindex @samp{V} in constraint
- @item @samp{V}
- A memory operand that is not offsettable. In other words, anything that
- would fit the @samp{m} constraint but not the @samp{o} constraint.
-
- @cindex @samp{<} in constraint
- @item @samp{<}
- A memory operand with autodecrement addressing (either predecrement or
- postdecrement) is allowed.
-
- @cindex @samp{>} in constraint
- @item @samp{>}
- A memory operand with autoincrement addressing (either preincrement or
- postincrement) is allowed.
-
- @cindex @samp{r} in constraint
- @cindex registers in constraints
- @item @samp{r}
- A register operand is allowed provided that it is in a general
- register.
-
- @cindex @samp{d} in constraint
- @item @samp{d}, @samp{a}, @samp{f}, @dots{}
- Other letters can be defined in machine-dependent fashion to stand for
- particular classes of registers. @samp{d}, @samp{a} and @samp{f} are
- defined on the 68000/68020 to stand for data, address and floating
- point registers.
-
- @cindex constants in constraints
- @cindex @samp{i} in constraint
- @item @samp{i}
- An immediate integer operand (one with constant value) is allowed.
- This includes symbolic constants whose values will be known only at
- assembly time.
-
- @cindex @samp{n} in constraint
- @item @samp{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 @samp{n}
- rather than @samp{i}.
-
- @cindex @samp{I} in constraint
- @item @samp{I}, @samp{J}, @samp{K}, @dots{} @samp{P}
- Other letters in the range @samp{I} through @samp{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, @samp{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.
-
- @cindex @samp{E} in constraint
- @item @samp{E}
- An immediate floating operand (expression code @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).
-
- @cindex @samp{F} in constraint
- @item @samp{F}
- An immediate floating operand (expression code @code{const_double}) is
- allowed.
-
- @cindex @samp{G} in constraint
- @cindex @samp{H} in constraint
- @item @samp{G}, @samp{H}
- @samp{G} and @samp{H} may be defined in a machine-dependent fashion to
- permit immediate floating operands in particular ranges of values.
-
- @cindex @samp{s} in constraint
- @item @samp{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 @samp{s} instead of @samp{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 @samp{moveq} instruction. We arrange for this to happen
- by defining the letter @samp{K} to mean ``any integer outside the
- range -128 to 127'', and then specifying @samp{Ks} in the operand
- constraints.
-
- @cindex @samp{g} in constraint
- @item @samp{g}
- Any register, memory or immediate integer operand is allowed, except for
- registers that are not general registers.
-
- @cindex @samp{X} in constraint
- @item @samp{X}
- Any operand whatsoever is allowed, even if it does not satisfy
- @code{general_operand}. This is normally used in the constraint of
- a @code{match_scratch} when certain alternatives will not actually
- require a scratch register.
-
- @cindex @samp{0} in constraint
- @cindex digits in constraint
- @item @samp{0}, @samp{1}, @samp{2}, @dots{} @samp{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.
-
- @cindex matching constraint
- @cindex constraint, matching
- This is called a @dfn{matching constraint} and what it really means is
- that the assembler has only a single operand that fills two roles
- considered separate in the RTL insn. For example, an add insn has two
- input operands and one output operand in the RTL, but on most CISC
- machines an add instruction really has only two operands, one of them an
- input-output operand:
-
- @example
- addl #35,r12
- @end example
-
- Matching constraints are used in these circumstances.
- More precisely, the two operands that match must include one input-only
- operand and one output-only operand. Moreover, the digit must be a
- smaller number than the number of the operand that uses it in the
- constraint.
-
- For operands to match in a particular case usually means that they
- are identical-looking RTL expressions. But in a few special cases
- specific kinds of dissimilarity are allowed. For example, @code{*x}
- as an input operand will match @code{*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.
-
- @cindex load address instruction
- @cindex push address instruction
- @cindex address constraints
- @cindex @samp{p} in constraint
- @item @samp{p}
- An operand that is a valid memory address is allowed. This is
- for ``load address'' and ``push address'' instructions.
-
- @findex address_operand
- @samp{p} in the constraint must be accompanied by @code{address_operand}
- as the predicate in the @code{match_operand}. This predicate interprets
- the mode specified in the @code{match_operand} as the mode of the memory
- reference for which the address would be valid.
-
- @cindex extensible constraints
- @cindex @samp{Q}, in constraint
- @item @samp{Q}, @samp{R}, @samp{S}, @dots{} @samp{U}
- Letters in the range @samp{Q} through @samp{U} may be defined in a
- machine-dependent fashion to stand for arbitrary operand types.
- The machine description macro @code{EXTRA_CONSTRAINT} is passed the
- operand as its first argument and the constraint letter as its
- second operand.
-
- A typical use for this would be to distinguish certain types of
- memory references that affect other insn operands.
-
- Do not define these constraint letters to accept register references
- (@code{reg}); the reload pass does not expect this and would not handle
- it properly.
- @end table
-
- 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:
-
- @example
- (define_insn ""
- [(set (match_operand:SI 0 "general_operand" "=r")
- (plus:SI (match_dup 0)
- (match_operand:SI 1 "general_operand" "r")))]
- ""
- "@dots{}")
- @end example
-
- @noindent
- which has two operands, one of which must appear in two places, and
-
- @example
- (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")))]
- ""
- "@dots{}")
- @end example
-
- @noindent
- which has three operands, two of which are required by a constraint to be
- identical. If we are considering an insn of the form
-
- @example
- (insn @var{n} @var{prev} @var{next}
- (set (reg:SI 3)
- (plus:SI (reg:SI 6) (reg:SI 109)))
- @dots{})
- @end example
-
- @noindent
- 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:
-
- @example
- (insn @var{n2} @var{prev} @var{n}
- (set (reg:SI 3) (reg:SI 6))
- @dots{})
-
- (insn @var{n} @var{n2} @var{next}
- (set (reg:SI 3)
- (plus:SI (reg:SI 3) (reg:SI 109)))
- @dots{})
- @end example
-
- 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 @emph{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.
-
- @itemize @bullet
- @item
- 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 @samp{i}. If any possible
- constant value is accepted, then nothing less than @samp{i} will do;
- if the predicate is more selective, then the constraints may also be
- more selective.
-
- @item
- 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.
-
- @cindex nonoffsettable memory reference
- @cindex memory reference, nonoffsettable
- @item
- A nonoffsettable memory reference can be reloaded by copying the
- address into a register. So if the constraint uses the letter
- @samp{o}, all memory references are taken care of.
-
- @item
- 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
- @samp{o} or @samp{m}, constant operands are not a problem.
-
- @item
- If the constraint permits a constant and a pseudo register used in an insn
- was not allocated to a hard register and is equivalent to a constant,
- the register will be replaced with the constant. If the predicate does
- not permit a constant and the insn is re-recognized for some reason, the
- compiler will crash. Thus the predicate must always recognize any
- objects allowed by the constraint.
- @end itemize
-
- 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.
-
- @node Multi-Alternative, Class Preferences, Simple Constraints, Constraints
- @subsection Multiple Alternative Constraints
- @cindex 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:
-
- @example
- (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")))]
- @dots{})
- @end example
-
- The first alternative has @samp{m} (memory) for operand 0, @samp{0} for
- operand 1 (meaning it must match operand 0), and @samp{dKs} for operand
- 2. The second alternative has @samp{d} (data register) for operand 0,
- @samp{0} for operand 1, and @samp{dmKs} for operand 2. The @samp{=} and
- @samp{%} in the constraints apply to all the alternatives; their
- meaning is explained in the next section (@pxref{Class Preferences}).
-
- If all the operands fit any one alternative, the instruction is valid.
- Otherwise, for each alternative, the compiler counts how many instructions
- must be added to copy the operands so that that alternative applies.
- The alternative requiring the least copying is chosen. If two alternatives
- need the same amount of copying, the one that comes first is chosen.
- These choices can be altered with the @samp{?} and @samp{!} characters:
-
- @table @code
- @cindex @samp{?} in constraint
- @cindex question mark
- @item ?
- Disparage slightly the alternative that the @samp{?} appears in,
- as a choice when no alternative applies exactly. The compiler regards
- this alternative as one unit more costly for each @samp{?} that appears
- in it.
-
- @cindex @samp{!} in constraint
- @cindex exclamation point
- @item !
- Disparage severely the alternative that the @samp{!} appears in.
- This alternative can still be used if it fits without reloading,
- but if reloading is needed, some other alternative will be used.
- @end table
-
- 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 @code{which_alternative}, which is
- the ordinal number of the alternative that was actually satisfied (0 for
- the first, 1 for the second alternative, etc.). @xref{Output Statement}.
-
- @node Class Preferences, Modifiers, Multi-Alternative, Constraints
- @subsection Register Class Preferences
- @cindex class preference constraints
- @cindex register class preference constraints
-
- @cindex voting between constraint alternatives
- 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 @samp{d} and @samp{a} that specify classes of registers.
- The pseudo register is put in whichever class gets the most ``votes''.
- The constraint letters @samp{g} and @samp{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.
-
- @node Modifiers, No Constraints, Class Preferences, Constraints
- @subsection Constraint Modifier Characters
- @cindex modifiers in constraints
- @cindex constraint modifier characters
-
- @table @samp
- @cindex @samp{=} in constraint
- @item =
- Means that this operand is write-only for this instruction: the previous
- value is discarded and replaced by output data.
-
- @cindex @samp{+} in constraint
- @item +
- 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. @samp{=} identifies an output; @samp{+}
- identifies an operand that is both input and output; all other operands
- are assumed to be input only.
-
- @cindex @samp{&} in constraint
- @item &
- 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.
-
- @samp{&} applies only to the alternative in which it is written. In
- constraints with multiple alternatives, sometimes one alternative
- requires @samp{&} while others do not. See, for example, the
- @samp{movdf} insn of the 68000.
-
- @samp{&} does not obviate the need to write @samp{=}.
-
- @cindex @samp{%} in constraint
- @item %
- 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:
-
- @example
- (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")))]
- @dots{})
- @end example
-
- @cindex @samp{#} in constraint
- @item #
- 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.
-
- @cindex @samp{*} in constraint
- @item *
- Says that the following character should be ignored when choosing
- register preferences. @samp{*} has no effect on the meaning of the
- constraint as a constraint, and no effect on reloading.
-
- Here is an example: the 68000 has an instruction to sign-extend a
- halfword in a data register, and can also sign-extend a value by
- copying it into an address register. While either kind of register is
- acceptable, the constraints on an address-register destination are
- less strict, so it is best if register allocation makes an address
- register its goal. Therefore, @samp{*} is used so that the @samp{d}
- constraint letter (for data register) is ignored when computing
- register preferences.
-
- @example
- (define_insn "extendhisi2"
- [(set (match_operand:SI 0 "general_operand" "=*d,a")
- (sign_extend:SI
- (match_operand:HI 1 "general_operand" "0,g")))]
- @dots{})
- @end example
- @end table
-
- @node No Constraints,, Modifiers, Constraints
- @subsection Not Using Constraints
- @cindex no constraints
- @cindex 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 @samp{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 @samp{p}.
-
- @cindex empty constraints
- For such machines, instead of writing @samp{g} and @samp{p} for all
- the constraints, you can choose to write a description with empty constraints.
- Then you write @samp{""} for the constraint in every @code{match_operand}.
- Address operands are identified by writing an @code{address} expression
- around the @code{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.
-
- @node Standard Names, Pattern Ordering, Constraints, Machine Desc
- @section Standard Names for Patterns Used in Generation
- @cindex standard pattern names
- @cindex pattern names
- @cindex names, pattern
-
- Here is a table of the instruction names that are meaningful in the RTL
- generation pass of the compiler. Giving one of these names to an
- instruction pattern tells the RTL generation pass that it can use the
- pattern in to accomplish a certain task.
-
- @table @asis
- @cindex @code{mov@var{m}} instruction pattern
- @item @samp{mov@var{m}}
- Here @var{m} stands for a two-letter machine mode name, in lower case.
- This instruction pattern moves data with that machine mode from operand
- 1 to operand 0. For example, @samp{movsi} moves full-word data.
-
- If operand 0 is a @code{subreg} with mode @var{m} of a register whose
- own mode is wider than @var{m}, the effect of this instruction is
- to store the specified value in the part of the register that corresponds
- to mode @var{m}. The effect on the rest of the register is undefined.
-
- This class of patterns is special in several ways. First of all, each
- of these names @emph{must} be defined, because there is no other way
- to copy a datum from one place to another.
-
- Second, these patterns are not used solely in the RTL generation pass.
- Even the reload pass can generate move insns to copy values from stack
- slots into temporary registers. When it does so, one of the operands is
- a hard register and the other is an operand that can need to be reloaded
- into a register.
-
- @findex force_reg
- Therefore, when given such a pair of operands, the pattern must generate
- RTL which needs no reloading and needs no temporary registers---no
- registers other than the operands. For example, if you support the
- pattern with a @code{define_expand}, then in such a case the
- @code{define_expand} mustn't call @code{force_reg} or any other such
- function which might generate new pseudo registers.
-
- This requirement exists even for subword modes on a RISC machine where
- fetching those modes from memory normally requires several insns and
- some temporary registers. Look in @file{spur.md} to see how the
- requirement can be satisfied.
-
- @findex change_address
- During reload a memory reference with an invalid address may be passed
- as an operand. Such an address will be replaced with a valid address
- later in the reload pass. In this case, nothing may be done with the
- address except to use it as it stands. If it is copied, it will not be
- replaced with a valid address. No attempt should be made to make such
- an address into a valid address and no routine (such as
- @code{change_address}) that will do so may be called. Note that
- @code{general_operand} will fail when applied to such an address.
-
- @findex reload_in_progress
- The global variable @code{reload_in_progress} (which must be explicitly
- declared if required) can be used to determine whether such special
- handling is required.
-
- The variety of operands that have reloads depends on the rest of the
- machine description, but typically on a RISC machine these can only be
- pseudo registers that did not get hard registers, while on other
- machines explicit memory references will get optional reloads.
-
- If a scratch register is required to move an object to or from memory,
- it can be allocated using @code{gen_reg_rtx} prior to reload. But this
- is impossible during and after reload. If there are cases needing
- scratch registers after reload, you must define
- @code{SECONDARY_INPUT_RELOAD_CLASS} and/or
- @code{SECONDARY_OUTPUT_RELOAD_CLASS} to detect them, and provide
- patterns @samp{reload_in@var{m}} or @samp{reload_out@var{m}} to handle
- them. @xref{Register Classes}.
-
- The constraints on a @samp{move@var{m}} must permit moving any hard
- register to any other hard register provided that
- @code{HARD_REGNO_MODE_OK} permits mode @var{m} in both registers and
- @code{REGISTER_MOVE_COST} applied to their classes returns a value of 2.
-
- It is obligatory to support floating point @samp{move@var{m}}
- instructions into and out of any registers that can hold fixed point
- values, because unions and structures (which have modes @code{SImode} or
- @code{DImode}) can be in those registers and they may have floating
- point members.
-
- There may also be a need to support fixed point @samp{move@var{m}}
- instructions in and out of floating point registers. Unfortunately, I
- have forgotten why this was so, and I don't know whether it is still
- true. If @code{HARD_REGNO_MODE_OK} rejects fixed point values in
- floating point registers, then the constraints of the fixed point
- @samp{move@var{m}} instructions must be designed to avoid ever trying to
- reload into a floating point register.
-
- @cindex @code{reload_in} instruction pattern
- @cindex @code{reload_out} instruction pattern
- @item @samp{reload_in@var{m}}
- @itemx @samp{reload_out@var{m}}
- Like @samp{mov@var{m}}, but used when a scratch register is required to
- move between operand 0 and operand 1. Operand 2 describes the scratch
- register. See the discussion of the @code{SECONDARY_RELOAD_CLASS}
- macro in @pxref{Register Classes}.
-
- @cindex @code{movstrict@var{m}} instruction pattern
- @item @samp{movstrict@var{m}}
- Like @samp{mov@var{m}} except that if operand 0 is a @code{subreg}
- with mode @var{m} of a register whose natural mode is wider,
- the @samp{movstrict@var{m}} instruction is guaranteed not to alter
- any of the register except the part which belongs to mode @var{m}.
-
- @cindex @code{load_multiple} instruction pattern
- @item @code{load_multiple}
- Load several consecutive memory locations into consecutive registers.
- Operand 0 is the first of the consecutive registers, operand 1
- is the first memory location, and operand 2 is a constant: the
- number of consecutive registers.
-
- Define this only if the target machine really has such an instruction;
- do not define this if the most efficient way of loading consecutive
- registers from memory is to do them one at a time.
-
- On some machines, there are restrictions as to which consecutive
- registers can be stored into memory, such as particular starting or
- ending register numbers or only a range of valid counts. For those
- machines, use a @code{define_expand} (@pxref{Expander Definitions})
- and make the pattern fail if the restrictions are not met.
-
- Write the generated insn as a @code{parallel} with elements being a
- @code{set} of one register from the appropriate memory location (you may
- also need @code{use} or @code{clobber} elements). Use a
- @code{match_parallel} (@pxref{RTL Template}) to recognize the insn. See
- @file{a29k.md} and @file{rs6000.md} for examples of the use of this insn
- pattern.
-
- @cindex @samp{store_multiple} instruction pattern
- @item @code{store_multiple}
- Similar to @samp{load_multiple}, but store several consecutive registers
- into consecutive memory locations. Operand 0 is the first of the
- consecutive memory locations, operand 1 is the first register, and
- operand 2 is a constant: the number of consecutive registers.
-
- @cindex @code{add@var{m}3} instruction pattern
- @item @samp{add@var{m}3}
- Add operand 2 and operand 1, storing the result in operand 0. All operands
- must have mode @var{m}. This can be used even on two-address machines, by
- means of constraints requiring operands 1 and 0 to be the same location.
-
- @cindex @code{sub@var{m}3} instruction pattern
- @cindex @code{mul@var{m}3} instruction pattern
- @cindex @code{div@var{m}3} instruction pattern
- @cindex @code{udiv@var{m}3} instruction pattern
- @cindex @code{mod@var{m}3} instruction pattern
- @cindex @code{umod@var{m}3} instruction pattern
- @cindex @code{min@var{m}3} instruction pattern
- @cindex @code{max@var{m}3} instruction pattern
- @cindex @code{umin@var{m}3} instruction pattern
- @cindex @code{umax@var{m}3} instruction pattern
- @cindex @code{and@var{m}3} instruction pattern
- @cindex @code{ior@var{m}3} instruction pattern
- @cindex @code{xor@var{m}3} instruction pattern
- @item @samp{sub@var{m}3}, @samp{mul@var{m}3}
- @itemx @samp{div@var{m}3}, @samp{udiv@var{m}3}, @samp{mod@var{m}3}, @samp{umod@var{m}3}
- @itemx @samp{smin@var{m}3}, @samp{smax@var{m}3}, @samp{umin@var{m}3}, @samp{umax@var{m}3}
- @itemx @samp{and@var{m}3}, @samp{ior@var{m}3}, @samp{xor@var{m}3}
- Similar, for other arithmetic operations.
-
- @cindex @code{mulhisi3} instruction pattern
- @item @samp{mulhisi3}
- Multiply operands 1 and 2, which have mode @code{HImode}, and store
- a @code{SImode} product in operand 0.
-
- @cindex @code{mulqihi3} instruction pattern
- @cindex @code{mulsidi3} instruction pattern
- @item @samp{mulqihi3}, @samp{mulsidi3}
- Similar widening-multiplication instructions of other widths.
-
- @cindex @code{umulqihi3} instruction pattern
- @cindex @code{umulhisi3} instruction pattern
- @cindex @code{umulsidi3} instruction pattern
- @item @samp{umulqihi3}, @samp{umulhisi3}, @samp{umulsidi3}
- Similar widening-multiplication instructions that do unsigned
- multiplication.
-
- @cindex @code{divmod@var{m}4} instruction pattern
- @item @samp{divmod@var{m}4}
- Signed division that produces both a quotient and a remainder.
- Operand 1 is divided by operand 2 to produce a quotient stored
- in operand 0 and a remainder stored in operand 3.
-
- For machines with an instruction that produces both a quotient and a
- remainder, provide a pattern for @samp{divmod@var{m}4} but do not
- provide patterns for @samp{div@var{m}3} and @samp{mod@var{m}3}. This
- allows optimization in the relatively common case when both the quotient
- and remainder are computed.
-
- If an instruction that just produces a quotient or just a remainder
- exists and is more efficient than the instruction that produces both,
- write the output routine of @samp{divmod@var{m}4} to call
- @code{find_reg_note} and look for a @code{REG_UNUSED} note on the
- quotient or remainder and generate the appropriate instruction.
-
- @cindex @code{udivmod@var{m}4} instruction pattern
- @item @samp{udivmod@var{m}4}
- Similar, but does unsigned division.
-
- @cindex @code{ashl@var{m}3} instruction pattern
- @item @samp{ashl@var{m}3}
- Arithmetic-shift operand 1 left by a number of bits specified by operand
- 2, and store the result in operand 0. Here @var{m} is the mode of
- operand 0 and operand 1; operand 2's mode is specified by the
- instruction pattern, and the compiler will convert the operand to that
- mode before generating the instruction.
-
- @cindex @code{ashr@var{m}3} instruction pattern
- @cindex @code{lshl@var{m}3} instruction pattern
- @cindex @code{lshr@var{m}3} instruction pattern
- @cindex @code{rotl@var{m}3} instruction pattern
- @cindex @code{rotr@var{m}3} instruction pattern
- @item @samp{ashr@var{m}3}, @samp{lshl@var{m}3}, @samp{lshr@var{m}3}, @samp{rotl@var{m}3}, @samp{rotr@var{m}3}
- Other shift and rotate instructions, analogous to the
- @code{ashl@var{m}3} instructions.
-
- Logical and arithmetic left shift are the same. Machines that do not
- allow negative shift counts often have only one instruction for
- shifting left. On such machines, you should define a pattern named
- @samp{ashl@var{m}3} and leave @samp{lshl@var{m}3} undefined.
-
- @cindex @code{neg@var{m}2} instruction pattern
- @item @samp{neg@var{m}2}
- Negate operand 1 and store the result in operand 0.
-
- @cindex @code{abs@var{m}2} instruction pattern
- @item @samp{abs@var{m}2}
- Store the absolute value of operand 1 into operand 0.
-
- @cindex @code{sqrt@var{m}2} instruction pattern
- @item @samp{sqrt@var{m}2}
- Store the square root of operand 1 into operand 0.
-
- The @code{sqrt} built-in function of C always uses the mode which
- corresponds to the C data type @code{double}.
-
- @cindex @code{ffs@var{m}2} instruction pattern
- @item @samp{ffs@var{m}2}
- Store into operand 0 one plus the index of the least significant 1-bit
- of operand 1. If operand 1 is zero, store zero. @var{m} is the mode
- of operand 0; operand 1's mode is specified by the instruction
- pattern, and the compiler will convert the operand to that mode before
- generating the instruction.
-
- The @code{ffs} built-in function of C always uses the mode which
- corresponds to the C data type @code{int}.
-
- @cindex @code{one_cmpl@var{m}2} instruction pattern
- @item @samp{one_cmpl@var{m}2}
- Store the bitwise-complement of operand 1 into operand 0.
-
- @cindex @code{cmp@var{m}} instruction pattern
- @item @samp{cmp@var{m}}
- Compare operand 0 and operand 1, and set the condition codes.
- The RTL pattern should look like this:
-
- @example
- (set (cc0) (compare (match_operand:@var{m} 0 @dots{})
- (match_operand:@var{m} 1 @dots{})))
- @end example
-
- @cindex @code{tst@var{m}} instruction pattern
- @item @samp{tst@var{m}}
- Compare operand 0 against zero, and set the condition codes.
- The RTL pattern should look like this:
-
- @example
- (set (cc0) (match_operand:@var{m} 0 @dots{}))
- @end example
-
- @samp{tst@var{m}} patterns should not be defined for machines that do
- not use @code{(cc0)}. Doing so would confuse the optimizer since it
- would no longer be clear which @code{set} operations were comparisons.
- The @samp{cmp@var{m}} patterns should be used instead.
-
- @cindex @code{movstr@var{m}} instruction pattern
- @item @samp{movstr@var{m}}
- Block move instruction. The addresses of the destination and source
- strings are the first two operands, and both are in mode @code{Pmode}.
- The number of bytes to move is the third operand, in mode @var{m}.
-
- The fourth operand is the known shared alignment of the source and
- destination, in the form of a @code{const_int} rtx. Thus, if the
- compiler knows that both source and destination are word-aligned,
- it may provide the value 4 for this operand.
-
- These patterns need not give special consideration to the possibility
- that the source and destination strings might overlap.
-
- @cindex @code{cmpstr@var{m}} instruction pattern
- @item @samp{cmpstr@var{m}}
- Block compare instruction, with five operands. Operand 0 is the output;
- it has mode @var{m}. The remaining four operands are like the operands
- of @samp{movstr@var{m}}. The two memory blocks specified are compared
- byte by byte in lexicographic order. The effect of the instruction is
- to store a value in operand 0 whose sign indicates the result of the
- comparison.
-
- @cindex @code{float@var{mn}2} instruction pattern
- @item @samp{float@var{m}@var{n}2}
- Convert signed integer operand 1 (valid for fixed point mode @var{m}) to
- floating point mode @var{n} and store in operand 0 (which has mode
- @var{n}).
-
- @cindex @code{floatuns@var{mn}2} instruction pattern
- @item @samp{floatuns@var{m}@var{n}2}
- Convert unsigned integer operand 1 (valid for fixed point mode @var{m})
- to floating point mode @var{n} and store in operand 0 (which has mode
- @var{n}).
-
- @cindex @code{fix@var{mn}2} instruction pattern
- @item @samp{fix@var{m}@var{n}2}
- Convert operand 1 (valid for floating point mode @var{m}) to fixed
- point mode @var{n} as a signed number and store in operand 0 (which
- has mode @var{n}). This instruction's result is defined only when
- the value of operand 1 is an integer.
-
- @cindex @code{fixuns@var{mn}2} instruction pattern
- @item @samp{fixuns@var{m}@var{n}2}
- Convert operand 1 (valid for floating point mode @var{m}) to fixed
- point mode @var{n} as an unsigned number and store in operand 0 (which
- has mode @var{n}). This instruction's result is defined only when the
- value of operand 1 is an integer.
-
- @cindex @code{ftrunc@var{m}2} instruction pattern
- @item @samp{ftrunc@var{m}2}
- Convert operand 1 (valid for floating point mode @var{m}) to an
- integer value, still represented in floating point mode @var{m}, and
- store it in operand 0 (valid for floating point mode @var{m}).
-
- @cindex @code{fix_trunc@var{mn}2} instruction pattern
- @item @samp{fix_trunc@var{m}@var{n}2}
- Like @samp{fix@var{m}@var{n}2} but works for any floating point value
- of mode @var{m} by converting the value to an integer.
-
- @cindex @code{fixuns_trunc@var{mn}2} instruction pattern
- @item @samp{fixuns_trunc@var{m}@var{n}2}
- Like @samp{fixuns@var{m}@var{n}2} but works for any floating point
- value of mode @var{m} by converting the value to an integer.
-
- @cindex @code{trunc@var{mn}} instruction pattern
- @item @samp{trunc@var{m}@var{n}}
- Truncate operand 1 (valid for mode @var{m}) to mode @var{n} and
- store in operand 0 (which has mode @var{n}). Both modes must be fixed
- point or both floating point.
-
- @cindex @code{extend@var{mn}} instruction pattern
- @item @samp{extend@var{m}@var{n}}
- Sign-extend operand 1 (valid for mode @var{m}) to mode @var{n} and
- store in operand 0 (which has mode @var{n}). Both modes must be fixed
- point or both floating point.
-
- @cindex @code{zero_extend@var{mn}} instruction pattern
- @item @samp{zero_extend@var{m}@var{n}}
- Zero-extend operand 1 (valid for mode @var{m}) to mode @var{n} and
- store in operand 0 (which has mode @var{n}). Both modes must be fixed
- point.
-
- @cindex @code{extv} instruction pattern
- @item @samp{extv}
- Extract a bit field from operand 1 (a register or memory operand), where
- operand 2 specifies the width in bits and operand 3 the starting bit,
- and store it in operand 0. Operand 0 must have mode @code{word_mode}.
- Operand 1 may have mode @code{byte_mode} or @code{word_mode}; often
- @code{word_mode} is allowed only for registers. Operands 2 and 3 must
- be valid for @code{word_mode}.
-
- The RTL generation pass generates this instruction only with constants
- for operands 2 and 3.
-
- The bit-field value is sign-extended to a full word integer
- before it is stored in operand 0.
-
- @cindex @code{extzv} instruction pattern
- @item @samp{extzv}
- Like @samp{extv} except that the bit-field value is zero-extended.
-
- @cindex @code{insv} instruction pattern
- @item @samp{insv}
- Store operand 3 (which must be valid for @code{word_mode}) into a bit
- field in operand 0, where operand 1 specifies the width in bits and
- operand 2 the starting bit. Operand 0 may have mode @code{byte_mode} or
- @code{word_mode}; often @code{word_mode} is allowed only for registers.
- Operands 1 and 2 must be valid for @code{word_mode}.
-
- The RTL generation pass generates this instruction only with constants
- for operands 1 and 2.
-
- @cindex @code{s@var{cond}} instruction pattern
- @item @samp{s@var{cond}}
- Store zero or nonzero in the operand according to the condition codes.
- Value stored is nonzero iff the condition @var{cond} is true.
- @var{cond} is the name of a comparison operation expression code, such
- as @code{eq}, @code{lt} or @code{leu}.
-
- You specify the mode that the operand must have when you write the
- @code{match_operand} expression. The compiler automatically sees
- which mode you have used and supplies an operand of that mode.
-
- The value stored for a true condition must have 1 as its low bit, or
- else must be negative. Otherwise the instruction is not suitable and
- you should omit it from the machine description. You describe to the
- compiler exactly which value is stored by defining the macro
- @code{STORE_FLAG_VALUE} (@pxref{Misc}). If a description cannot be
- found that can be used for all the @samp{s@var{cond}} patterns, you
- should omit those operations from the machine description.
-
- These operations may fail, but should do so only in relatively
- uncommon cases; if they would fail for common cases involving
- integer comparisons, it is best to omit these patterns.
-
- If these operations are omitted, the compiler will usually generate code
- that copies the constant one to the target and branches around an
- assignment of zero to the target. If this code is more efficient than
- the potential instructions used for the @samp{s@var{cond}} pattern
- followed by those required to convert the result into a 1 or a zero in
- @code{SImode}, you should omit the @samp{s@var{cond}} operations from
- the machine description.
-
- @cindex @code{b@var{cond}} instruction pattern
- @item @samp{b@var{cond}}
- Conditional branch instruction. Operand 0 is a @code{label_ref} that
- refers to the label to jump to. Jump if the condition codes meet
- condition @var{cond}.
-
- Some machines do not follow the model assumed here where a comparison
- instruction is followed by a conditional branch instruction. In that
- case, the @samp{cmp@var{m}} (and @samp{tst@var{m}}) patterns should
- simply store the operands away and generate all the required insns in a
- @code{define_expand} (@pxref{Expander Definitions}) for the conditional
- branch operations. All calls to expand @samp{v@var{cond}} patterns are
- immediately preceded by calls to expand either a @samp{cmp@var{m}}
- pattern or a @samp{tst@var{m}} pattern.
-
- Machines that use a pseudo register for the condition code value, or
- where the mode used for the comparison depends on the condition being
- tested, should also use the above mechanism. @xref{Jump Patterns}
-
- The above discussion also applies to @samp{s@var{cond}} patterns.
-
- @cindex @code{call} instruction pattern
- @item @samp{call}
- Subroutine call instruction returning no value. Operand 0 is the
- function to call; operand 1 is the number of bytes of arguments pushed
- (in mode @code{SImode}, except it is normally a @code{const_int});
- operand 2 is the number of registers used as operands.
-
- On most machines, operand 2 is not actually stored into the RTL
- pattern. It is supplied for the sake of some RISC machines which need
- to put this information into the assembler code; they can put it in
- the RTL instead of operand 1.
-
- Operand 0 should be a @code{mem} RTX whose address is the address of the
- function. Note, however, that this address can be a @code{symbol_ref}
- expression even if it would not be a legitimate memory address on the
- target machine. If it is also not a valid argument for a call
- instruction, the pattern for this operation should be a
- @code{define_expand} (@pxref{Expander Definitions}) that places the
- address into a register and uses that register in the call instruction.
-
- @cindex @code{call_value} instruction pattern
- @item @samp{call_value}
- Subroutine call instruction returning a value. Operand 0 is the hard
- register in which the value is returned. There are three more
- operands, the same as the three operands of the @samp{call}
- instruction (but with numbers increased by one).
-
- Subroutines that return @code{BLKmode} objects use the @samp{call}
- insn.
-
- @cindex @code{call_pop} instruction pattern
- @cindex @code{call_value_pop} instruction pattern
- @item @samp{call_pop}, @samp{call_value_pop}
- Similar to @samp{call} and @samp{call_value}, except used if defined and
- if @code{RETURN_POPS_ARGS} is non-zero. They should emit a @code{parallel}
- that contains both the function call and a @code{set} to indicate the
- adjustment made to the frame pointer.
-
- For machines where @code{RETURN_POPS_ARGS} can be non-zero, the use of these
- patterns increases the number of functions for which the frame pointer
- can be eliminated, if desired.
-
- @cindex @code{return} instruction pattern
- @item @samp{return}
- Subroutine return instruction. This instruction pattern name should be
- defined only if a single instruction can do all the work of returning
- from a function.
-
- Like the @samp{mov@var{m}} patterns, this pattern is also used after the
- RTL generation phase. In this case it is to support machines where
- multiple instructions are usually needed to return from a function, but
- some class of functions only requires one instruction to implement a
- return. Normally, the applicable functions are those which do not need
- to save any registers or allocate stack space.
-
- @findex reload_completed
- @findex leaf_function_p
- For such machines, the condition specified in this pattern should only
- be true when @code{reload_completed} is non-zero and the function's
- epilogue would only be a single instruction. For machines with register
- windows, the routine @code{leaf_function_p} may be used to determine if
- a register window push is required.
-
- Machines that have conditional return instructions should define patterns
- such as
-
- @example
- (define_insn ""
- [(set (pc)
- (if_then_else (match_operator 0 "comparison_operator"
- [(cc0) (const_int 0)])
- (return)
- (pc)))]
- "@var{condition}"
- "@dots{}")
- @end example
-
- where @var{condition} would normally be the same condition specified on the
- named @samp{return} pattern.
-
- @cindex @code{nop} instruction pattern
- @item @samp{nop}
- No-op instruction. This instruction pattern name should always be defined
- to output a no-op in assembler code. @code{(const_int 0)} will do as an
- RTL pattern.
-
- @cindex @code{indirect_jump} instruction pattern
- @item @samp{indirect_jump}
- An instruction to jump to an address which is operand zero.
- This pattern name is mandatory on all machines.
-
- @cindex @code{casesi} instruction pattern
- @item @samp{casesi}
- Instruction to jump through a dispatch table, including bounds checking.
- This instruction takes five operands:
-
- @enumerate
- @item
- The index to dispatch on, which has mode @code{SImode}.
-
- @item
- The lower bound for indices in the table, an integer constant.
-
- @item
- The total range of indices in the table---the largest index
- minus the smallest one (both inclusive).
-
- @item
- A label that precedes the table itself.
-
- @item
- A label to jump to if the index has a value outside the bounds.
- (If the machine-description macro @code{CASE_DROPS_THROUGH} is defined,
- then an out-of-bounds index drops through to the code following
- the jump table instead of jumping to this label. In that case,
- this label is not actually used by the @samp{casesi} instruction,
- but it is always provided as an operand.)
- @end enumerate
-
- The table is a @code{addr_vec} or @code{addr_diff_vec} inside of a
- @code{jump_insn}. The number of elements in the table is one plus the
- difference between the upper bound and the lower bound.
-
- @cindex @code{tablejump} instruction pattern
- @item @samp{tablejump}
- Instruction to jump to a variable address. This is a low-level
- capability which can be used to implement a dispatch table when there
- is no @samp{casesi} pattern.
-
- This pattern requires two operands: the address or offset, and a label
- which should immediately precede the jump table. If the macro
- @code{CASE_VECTOR_PC_RELATIVE} is defined then the first operand is an
- offset which counts from the address of the table; otherwise, it is an
- absolute address to jump to. In either case, the first operand has
- mode @code{Pmode}.
-
- The @samp{tablejump} insn is always the last insn before the jump
- table it uses. Its assembler code normally has no need to use the
- second operand, but you should incorporate it in the RTL pattern so
- that the jump optimizer will not delete the table as unreachable code.
-
- @cindex @code{save_stack_block} instruction pattern
- @cindex @code{save_stack_function} instruction pattern
- @cindex @code{save_stack_nonlocal} instruction pattern
- @cindex @code{restore_stack_block} instruction pattern
- @cindex @code{restore_stack_function} instruction pattern
- @cindex @code{restore_stack_nonlocal} instruction pattern
- @item @samp{save_stack_block}
- @itemx @samp{save_stack_function}
- @itemx @samp{save_stack_nonlocal}
- @itemx @samp{restore_stack_block}
- @itemx @samp{restore_stack_function}
- @itemx @samp{restore_stack_nonlocal}
- Most machines save and restore the stack pointer by copying it to or
- from an object of mode @code{Pmode}. Do not define these patterns on
- such machines.
-
- Some machines require special handling for stack pointer saves and
- restores. On those machines, define the patterns corresponding to the
- non-standard cases by using a @code{define_expand} (@pxref{Expander
- Definitions}) that produces the required insns. The three types of
- saves and restores are:
-
- @enumerate
- @item
- @samp{save_stack_block} saves the stack pointer at the start of a block
- that allocates a variable-sized object and @samp{restore_stack_block}
- restores the stack pointer when the block is exited.
-
- @item
- @samp{save_stack_function} and @samp{restore_stack_function} operate
- similarly for the outermost block of a function and are used when the
- function allocates variable-sized objects or calls @code{alloca}. Only
- the epilogue uses the restored stack pointer, allowing a simpler save or
- restore sequence on some machines.
-
- @item
- @samp{save_stack_nonlocal} is used in functions that contain labels
- branched to by nested functions. It saves the stack pointer in such a
- way that the inner function can use @samp{restore_stack_nonlocal} to
- restore the stack pointer. The compiler generates code to restore the
- frame and argument pointer registers, but some machines require saving
- and restoring additional data such as register window information or
- stack backchains. Place insns in these patterns to save and restore any
- such required data.
- @end enumerate
-
- When saving the stack pointer, operand 0 is the save area and operand 1
- is the stack pointer. The mode used to allocate the save area is the
- mode of operand 0. You must specify an integral mode, or
- @code{VOIDmode} if no save area is needed for a particular type of save
- (either because no save is needed or because a machine-specific save
- area can be used). Operand 0 is the stack pointer and operand 1 is the
- save area for restore operations. If @samp{save_stack_block} is
- defined, operand 0 must not be @code{VOIDmode} since these saves can be
- arbitrarily nested.
-
- A save area is a @code{mem} that is at a constant offset from
- @code{virtual_stack_vars_rtx} when the stack pointer is saved for use by
- nonlocal gotos and a @code{reg} in the other two cases.
-
- @cindex @code{allocate_stack} instruction pattern
- @item @samp{allocate_stack}
- Subtract operand 0 from the stack pointer to create space for
- for dynamically allocated data.
-
- Do not define this pattern if all that must be done is the subtraction.
- On some machines require other operations such as stack probes or
- maintaining the back chain. Define this pattern to emit those
- operations in addition to updating the stack pointer.
- @end table
-
- @node Pattern Ordering, Dependent Patterns, Standard Names, Machine Desc
- @section When the Order of Patterns Matters
- @cindex Pattern Ordering
- @cindex Ordering of Patterns
-
- Sometimes an insn can match more than one instruction pattern. Then the
- pattern that appears first in the machine description is the one used.
- Therefore, more specific patterns (patterns that will match fewer things)
- and faster instructions (those that will produce better code when they
- do match) should usually go first in the description.
-
- In some cases the effect of ordering the patterns can be used to hide
- a pattern when it is not valid. For example, the 68000 has an
- instruction for converting a fullword to floating point and another
- for converting a byte to floating point. An instruction converting
- an integer to floating point could match either one. We put the
- pattern to convert the fullword first to make sure that one will
- be used rather than the other. (Otherwise a large integer might
- be generated as a single-byte immediate quantity, which would not work.)
- Instead of using this pattern ordering it would be possible to make the
- pattern for convert-a-byte smart enough to deal properly with any
- constant value.
-
- @node Dependent Patterns, Jump Patterns, Pattern Ordering, Machine Desc
- @section Interdependence of Patterns
- @cindex Dependent Patterns
- @cindex Interdependence of Patterns
-
- Every machine description must have a named pattern for each of the
- conditional branch names @samp{b@var{cond}}. The recognition template
- must always have the form
-
- @example
- (set (pc)
- (if_then_else (@var{cond} (cc0) (const_int 0))
- (label_ref (match_operand 0 "" ""))
- (pc)))
- @end example
-
- @noindent
- In addition, every machine description must have an anonymous pattern
- for each of the possible reverse-conditional branches. Their templates
- look like
-
- @example
- (set (pc)
- (if_then_else (@var{cond} (cc0) (const_int 0))
- (pc)
- (label_ref (match_operand 0 "" ""))))
- @end example
-
- @noindent
- They are necessary because jump optimization can turn direct-conditional
- branches into reverse-conditional branches.
-
- It is often convenient to use the @code{match_operator} construct to
- reduce the number of patterns that must be specified for branches. For
- example,
-
- @example
- (define_insn ""
- [(set (pc)
- (if_then_else (match_operator 0 "comparison_operator"
- [(cc0) (const_int 0)])
- (pc)
- (label_ref (match_operand 1 "" ""))))]
- "@var{condition}"
- "@dots{}")
- @end example
-
- In some cases machines support instructions identical except for the
- machine mode of one or more operands. For example, there may be
- ``sign-extend halfword'' and ``sign-extend byte'' instructions whose
- patterns are
-
- @example
- (set (match_operand:SI 0 @dots{})
- (extend:SI (match_operand:HI 1 @dots{})))
-
- (set (match_operand:SI 0 @dots{})
- (extend:SI (match_operand:QI 1 @dots{})))
- @end example
-
- @noindent
- Constant integers do not specify a machine mode, so an instruction to
- extend a constant value could match either pattern. The pattern it
- actually will match is the one that appears first in the file. For correct
- results, this must be the one for the widest possible mode (@code{HImode},
- here). If the pattern matches the @code{QImode} instruction, the results
- will be incorrect if the constant value does not actually fit that mode.
-
- Such instructions to extend constants are rarely generated because they are
- optimized away, but they do occasionally happen in nonoptimized
- compilations.
-
- If a constraint in a pattern allows a constant, the reload pass may
- replace a register with a constant permitted by the constraint in some
- cases. Similarly for memory references. You must ensure that the
- predicate permits all objects allowed by the constraints to prevent the
- compiler from crashing.
-
- Because of this substitution, you should not provide separate patterns
- for increment and decrement instructions. Instead, they should be
- generated from the same pattern that supports register-register add
- insns by examining the operands and generating the appropriate machine
- instruction.
-
- @node Jump Patterns, Insn Canonicalizations, Dependent Patterns, Machine Desc
- @section Defining Jump Instruction Patterns
- @cindex jump instruction patterns
- @cindex defining jump instruction patterns
-
- For most machines, GNU CC assumes that the machine has a condition code.
- A comparison insn sets the condition code, recording the results of both
- signed and unsigned comparison of the given operands. A separate branch
- insn tests the condition code and branches or not according its value.
- The branch insns come in distinct signed and unsigned flavors. Many
- common machines, such as the Vax, the 68000 and the 32000, work this
- way.
-
- Some machines have distinct signed and unsigned compare instructions, and
- only one set of conditional branch instructions. The easiest way to handle
- these machines is to treat them just like the others until the final stage
- where assembly code is written. At this time, when outputting code for the
- compare instruction, peek ahead at the following branch using
- @code{next_cc0_user (insn)}. (The variable @code{insn} refers to the insn
- being output, in the output-writing code in an instruction pattern.) If
- the RTL says that is an unsigned branch, output an unsigned compare;
- otherwise output a signed compare. When the branch itself is output, you
- can treat signed and unsigned branches identically.
-
- The reason you can do this is that GNU CC always generates a pair of
- consecutive RTL insns, possibly separated by @code{note} insns, one to
- set the condition code and one to test it, and keeps the pair inviolate
- until the end.
-
- To go with this technique, you must define the machine-description macro
- @code{NOTICE_UPDATE_CC} to do @code{CC_STATUS_INIT}; in other words, no
- compare instruction is superfluous.
-
- Some machines have compare-and-branch instructions and no condition code.
- A similar technique works for them. When it is time to ``output'' a
- compare instruction, record its operands in two static variables. When
- outputting the branch-on-condition-code instruction that follows, actually
- output a compare-and-branch instruction that uses the remembered operands.
-
- It also works to define patterns for compare-and-branch instructions.
- In optimizing compilation, the pair of compare and branch instructions
- will be combined according to these patterns. But this does not happen
- if optimization is not requested. So you must use one of the solutions
- above in addition to any special patterns you define.
-
- In many RISC machines, most instructions do not affect the condition
- code and there may not even be a separate condition code register. On
- these machines, the restriction that the definition and use of the
- condition code be adjacent insns is not necessary and can prevent
- important optimizations. For example, on the IBM RS/6000, there is a
- delay for taken branches unless the condition code register is set three
- instructions earlier than the conditional branch. The instruction
- scheduler cannot perform this optimization if it is not permitted to
- separate the definition and use of the condition code register.
-
- On these machines, do not use @code{(cc0)}, but instead use a register
- to represent the condition code. If there is a specific condition code
- register in the machine, use a hard register. If the condition code or
- comparison result can be placed in any general register, or if there are
- multiple condition registers, use a pseudo register.
-
- @findex prev_cc0_setter
- @findex next_cc0_user
- On some machines, the type of branch instruction generated may depend on
- the way the condition code was produced; for example, on the 68k and
- Sparc, setting the condition code directly from an add or subtract
- instruction does not clear the overflow bit the way that a test
- instruction does, so a different branch instruction must be used for
- some conditional branches. For machines that use @code{(cc0)}, the set
- and use of the condition code must be adjacent (separated only by
- @code{note} insns) allowing flags in @code{cc_status} to be used.
- (@xref{Condition Code}.) Also, the comparison and branch insns can be
- located from each other by using the functions @code{prev_cc0_setter}
- and @code{next_cc0_user}.
-
- However, this is not true on machines that do not use @code{(cc0)}. On
- those machines, no assumptions can be made about the adjacency of the
- compare and branch insns and the above methods cannot be used. Instead,
- we use the machine mode of the condition code register to record
- different formats of the condition code register.
-
- Registers used to store the condition code value should have a mode that
- is in class @code{MODE_CC}. Normally, it will be @code{CCmode}. If
- additional modes are required (as for the add example mentioned above in
- the Sparc), define the macro @code{EXTRA_CC_MODES} to list the
- additional modes required (@pxref{Condition Code}). Also define
- @code{EXTRA_CC_NAMES} to list the names of those modes and
- @code{SELECT_CC_MODE} to choose a mode given an operand of a compare.
-
- If it is known during RTL generation that a different mode will be
- required (for example, if the machine has separate compare instructions
- for signed and unsigned quantities, like most IBM processors), they can
- be specified at that time.
-
- If the cases that require different modes would be made by instruction
- combination, the macro @code{SELECT_CC_MODE} determines which machine
- mode should be used for the comparison result. The patterns should be
- written using that mode. To support the case of the add on the Sparc
- discussed above, we have the pattern
-
- @example
- (define_insn ""
- [(set (reg:CC_NOOV 0)
- (compare:CC_NOOV (plus:SI (match_operand:SI 0 "register_operand" "%r")
- (match_operand:SI 1 "arith_operand" "rI"))
- (const_int 0)))]
- ""
- "@dots{}")
- @end example
-
- The @code{SELECT_CC_MODE} macro on the Sparc returns @code{CC_NOOVmode}
- for comparisons whose argument is a @code{plus}.
-
- @node Insn Canonicalizations, Peephole Definitions, Jump Patterns, Machine Desc
- @section Canonicalization of Instructions
- @cindex canonicalization of instructions
- @cindex insn canonicalization
-
- There are often cases where multiple RTL expressions could represent an
- operation performed by a single machine instruction. This situation is
- most commonly encountered with logical, branch, and multiply-accumulate
- instructions. In such cases, the compiler attempts to convert these
- multiple RTL expressions into a single canonical form to reduce the
- number of insn patterns required.
-
- In addition to algebraic simplifications, following canonicalizations
- are performed:
-
- @itemize @bullet
- @item
- For commutative and comparison operators, a constant is always made the
- second operand. If a machine only supports a constant as the second
- operand, only patterns that match a constant in the second operand need
- be supplied.
-
- @cindex @code{neg}, canonicalization of
- @cindex @code{not}, canonicalization of
- @cindex @code{mult}, canonicalization of
- @cindex @code{plus}, canonicalization of
- @cindex @code{minus}, canonicalization of
- For these operators, if only one operand is a @code{neg}, @code{not},
- @code{mult}, @code{plus}, or @code{minus} expression, it will be the
- first operand.
-
- @cindex @code{compare}, canonicalization of
- @item
- For the @code{compare} operator, a constant is always the second operand
- on machines where @code{cc0} is used (@pxref{Jump Patterns}). On other
- machines, there are rare cases where the compiler might want to construct
- a @code{compare} with a constant as the first operand. However, these
- cases are not common enough for it to be worthwhile to provide a pattern
- matching a constant as the first operand unless the machine actually has
- such an instruction.
-
- An operand of @code{neg}, @code{not}, @code{mult}, @code{plus}, or
- @code{minus} is made the first operand under the same conditions as
- above.
-
- @item
- @code{(minus @var{x} (const_int @var{n}))} is converted to
- @code{(plus @var{x} (const_int @var{-n}))}.
-
- @item
- Within address computations (i.e., inside @code{mem}), a left shift is
- converted into the appropriate multiplication by a power of two.
-
- @cindex @code{ior}, canonicalization of
- @cindex @code{and}, canonicalization of
- @cindex De Morgan's law
- De`Morgan's Law is used to move bitwise negation inside a bitwise
- logical-and or logical-or operation. If this results in only one
- operand being a @code{not} expression, it will be the first one.
-
- A machine that has an instruction that performs a bitwise logical-and of one
- operand with the bitwise negation of the other should specify the pattern
- for that instruction as
-
- @example
- (define_insn ""
- [(set (match_operand:@var{m} 0 @dots{})
- (and:@var{m} (not:@var{m} (match_operand:@var{m} 1 @dots{}))
- (match_operand:@var{m} 2 @dots{})))]
- "@dots{}"
- "@dots{}")
- @end example
-
- @noindent
- Similarly, a pattern for a ``NAND'' instruction should be written
-
- @example
- (define_insn ""
- [(set (match_operand:@var{m} 0 @dots{})
- (ior:@var{m} (not:@var{m} (match_operand:@var{m} 1 @dots{}))
- (not:@var{m} (match_operand:@var{m} 2 @dots{}))))]
- "@dots{}"
- "@dots{}")
- @end example
-
- In both cases, it is not necessary to include patterns for the many
- logically equivalent RTL expressions.
-
- @cindex @code{xor}, canonicalization of
- @item
- The only possible RTL expressions involving both bitwise exclusive-or
- and bitwise negation are @code{(xor:@var{m} @var{x}) @var{y})}
- and @code{(not:@var{m} (xor:@var{m} @var{x} @var{y}))}.@refill
-
- @item
- The sum of three items, one of which is a constant, will only appear in
- the form
-
- @example
- (plus:@var{m} (plus:@var{m} @var{x} @var{y}) @var{constant})
- @end example
-
- @item
- On machines that do not use @code{cc0},
- @code{(compare @var{x} (const_int 0))} will be converted to
- @var{x}.@refill
-
- @cindex @code{zero_extract}, canonicalization of
- @cindex @code{sign_extract}, canonicalization of
- @item
- Equality comparisons of a group of bits (usually a single bit) with zero
- will be written using @code{zero_extract} rather than the equivalent
- @code{and} or @code{sign_extract} operations.
-
- @end itemize
-
- @node Peephole Definitions, Expander Definitions, Insn Canonicalizations, Machine Desc
- @section Defining Machine-Specific Peephole Optimizers
- @cindex peephole optimizer definitions
- @cindex defining peephole optimizers
-
- In addition to instruction patterns the @file{md} file may contain
- definitions of machine-specific peephole optimizations.
-
- The combiner does not notice certain peephole optimizations when the data
- flow in the program does not suggest that it should try them. For example,
- sometimes two consecutive insns related in purpose can be combined even
- though the second one does not appear to use a register computed in the
- first one. A machine-specific peephole optimizer can detect such
- opportunities.
-
- A definition looks like this:
-
- @example
- (define_peephole
- [@var{insn-pattern-1}
- @var{insn-pattern-2}
- @dots{}]
- "@var{condition}"
- "@var{template}"
- "@var{optional insn-attributes}")
- @end example
-
- @noindent
- The last string operand may be omitted if you are not using any
- machine-specific information in this machine description. If present,
- it must obey the same rules as in a @code{define_insn}.
-
- In this skeleton, @var{insn-pattern-1} and so on are patterns to match
- consecutive insns. The optimization applies to a sequence of insns when
- @var{insn-pattern-1} matches the first one, @var{insn-pattern-2} matches
- the next, and so on.@refill
-
- Each of the insns matched by a peephole must also match a
- @code{define_insn}. Peepholes are checked only at the last stage just
- before code generation, and only optionally. Therefore, any insn which
- would match a peephole but no @code{define_insn} will cause a crash in code
- generation in an unoptimized compilation, or at various optimization
- stages.
-
- The operands of the insns are matched with @code{match_operands},
- @code{match_operator}, and @code{match_dup}, as usual. What is not
- usual is that the operand numbers apply to all the insn patterns in the
- definition. So, you can check for identical operands in two insns by
- using @code{match_operand} in one insn and @code{match_dup} in the
- other.
-
- The operand constraints used in @code{match_operand} patterns do not have
- any direct effect on the applicability of the peephole, but they will
- be validated afterward, so make sure your constraints are general enough
- to apply whenever the peephole matches. If the peephole matches
- but the constraints are not satisfied, the compiler will crash.
-
- It is safe to omit constraints in all the operands of the peephole; or
- you can write constraints which serve as a double-check on the criteria
- previously tested.
-
- Once a sequence of insns matches the patterns, the @var{condition} is
- checked. This is a C expression which makes the final decision whether to
- perform the optimization (we do so if the expression is nonzero). If
- @var{condition} is omitted (in other words, the string is empty) then the
- optimization is applied to every sequence of insns that matches the
- patterns.
-
- The defined peephole optimizations are applied after register allocation
- is complete. Therefore, the peephole definition can check which
- operands have ended up in which kinds of registers, just by looking at
- the operands.
-
- @findex prev_nonnote_insn
- The way to refer to the operands in @var{condition} is to write
- @code{operands[@var{i}]} for operand number @var{i} (as matched by
- @code{(match_operand @var{i} @dots{})}). Use the variable @code{insn}
- to refer to the last of the insns being matched; use
- @code{prev_nonnote_insn} to find the preceding insns.
-
- @findex dead_or_set_p
- When optimizing computations with intermediate results, you can use
- @var{condition} to match only when the intermediate results are not used
- elsewhere. Use the C expression @code{dead_or_set_p (@var{insn},
- @var{op})}, where @var{insn} is the insn in which you expect the value
- to be used for the last time (from the value of @code{insn}, together
- with use of @code{prev_nonnote_insn}), and @var{op} is the intermediate
- value (from @code{operands[@var{i}]}).@refill
-
- Applying the optimization means replacing the sequence of insns with one
- new insn. The @var{template} controls ultimate output of assembler code
- for this combined insn. It works exactly like the template of a
- @code{define_insn}. Operand numbers in this template are the same ones
- used in matching the original sequence of insns.
-
- The result of a defined peephole optimizer does not need to match any of
- the insn patterns in the machine description; it does not even have an
- opportunity to match them. The peephole optimizer definition itself serves
- as the insn pattern to control how the insn is output.
-
- Defined peephole optimizers are run as assembler code is being output,
- so the insns they produce are never combined or rearranged in any way.
-
- Here is an example, taken from the 68000 machine description:
-
- @example
- (define_peephole
- [(set (reg:SI 15) (plus:SI (reg:SI 15) (const_int 4)))
- (set (match_operand:DF 0 "register_operand" "=f")
- (match_operand:DF 1 "register_operand" "ad"))]
- "FP_REG_P (operands[0]) && ! FP_REG_P (operands[1])"
- "*
- @{
- rtx xoperands[2];
- xoperands[1] = gen_rtx (REG, SImode, REGNO (operands[1]) + 1);
- #ifdef MOTOROLA
- output_asm_insn (\"move.l %1,(sp)\", xoperands);
- output_asm_insn (\"move.l %1,-(sp)\", operands);
- return \"fmove.d (sp)+,%0\";
- #else
- output_asm_insn (\"movel %1,sp@@\", xoperands);
- output_asm_insn (\"movel %1,sp@@-\", operands);
- return \"fmoved sp@@+,%0\";
- #endif
- @}
- ")
- @end example
-
- The effect of this optimization is to change
-
- @example
- jbsr _foobar
- addql #4,sp
- movel d1,sp@@-
- movel d0,sp@@-
- fmoved sp@@+,fp0
- @end example
-
- @noindent
- into
-
- @example
- jbsr _foobar
- movel d1,sp@@
- movel d0,sp@@-
- fmoved sp@@+,fp0
- @end example
-
- @ignore
- @findex CC_REVERSED
- If a peephole matches a sequence including one or more jump insns, you must
- take account of the flags such as @code{CC_REVERSED} which specify that the
- condition codes are represented in an unusual manner. The compiler
- automatically alters any ordinary conditional jumps which occur in such
- situations, but the compiler cannot alter jumps which have been replaced by
- peephole optimizations. So it is up to you to alter the assembler code
- that the peephole produces. Supply C code to write the assembler output,
- and in this C code check the condition code status flags and change the
- assembler code as appropriate.
- @end ignore
-
- @var{insn-pattern-1} and so on look @emph{almost} like the second
- operand of @code{define_insn}. There is one important difference: the
- second operand of @code{define_insn} consists of one or more RTX's
- enclosed in square brackets. Usually, there is only one: then the same
- action can be written as an element of a @code{define_peephole}. But
- when there are multiple actions in a @code{define_insn}, they are
- implicitly enclosed in a @code{parallel}. Then you must explicitly
- write the @code{parallel}, and the square brackets within it, in the
- @code{define_peephole}. Thus, if an insn pattern looks like this,
-
- @example
- (define_insn "divmodsi4"
- [(set (match_operand:SI 0 "general_operand" "=d")
- (div:SI (match_operand:SI 1 "general_operand" "0")
- (match_operand:SI 2 "general_operand" "dmsK")))
- (set (match_operand:SI 3 "general_operand" "=d")
- (mod:SI (match_dup 1) (match_dup 2)))]
- "TARGET_68020"
- "divsl%.l %2,%3:%0")
- @end example
-
- @noindent
- then the way to mention this insn in a peephole is as follows:
-
- @example
- (define_peephole
- [@dots{}
- (parallel
- [(set (match_operand:SI 0 "general_operand" "=d")
- (div:SI (match_operand:SI 1 "general_operand" "0")
- (match_operand:SI 2 "general_operand" "dmsK")))
- (set (match_operand:SI 3 "general_operand" "=d")
- (mod:SI (match_dup 1) (match_dup 2)))])
- @dots{}]
- @dots{})
- @end example
-
- @node Expander Definitions, Insn Splitting, Peephole Definitions, Machine Desc
- @section Defining RTL Sequences for Code Generation
- @cindex expander definitions
- @cindex code generation RTL sequences
- @cindex defining RTL sequences for code generation
-
- On some target machines, some standard pattern names for RTL generation
- cannot be handled with single insn, but a sequence of RTL insns can
- represent them. For these target machines, you can write a
- @code{define_expand} to specify how to generate the sequence of RTL.
-
- @findex define_expand
- A @code{define_expand} is an RTL expression that looks almost like a
- @code{define_insn}; but, unlike the latter, a @code{define_expand} is used
- only for RTL generation and it can produce more than one RTL insn.
-
- A @code{define_expand} RTX has four operands:
-
- @itemize @bullet
- @item
- The name. Each @code{define_expand} must have a name, since the only
- use for it is to refer to it by name.
-
- @findex define_peephole
- @item
- The RTL template. This is just like the RTL template for a
- @code{define_peephole} in that it is a vector of RTL expressions
- each being one insn.
-
- @item
- The condition, a string containing a C expression. This expression is
- used to express how the availability of this pattern depends on
- subclasses of target machine, selected by command-line options when
- GNU CC is run. This is just like the condition of a
- @code{define_insn} that has a standard name.
-
- @item
- The preparation statements, a string containing zero or more C
- statements which are to be executed before RTL code is generated from
- the RTL template.
-
- Usually these statements prepare temporary registers for use as
- internal operands in the RTL template, but they can also generate RTL
- insns directly by calling routines such as @code{emit_insn}, etc.
- Any such insns precede the ones that come from the RTL template.
- @end itemize
-
- Every RTL insn emitted by a @code{define_expand} must match some
- @code{define_insn} in the machine description. Otherwise, the compiler
- will crash when trying to generate code for the insn or trying to optimize
- it.
-
- The RTL template, in addition to controlling generation of RTL insns,
- also describes the operands that need to be specified when this pattern
- is used. In particular, it gives a predicate for each operand.
-
- A true operand, which needs to be specified in order to generate RTL from
- the pattern, should be described with a @code{match_operand} in its first
- occurrence in the RTL template. This enters information on the operand's
- predicate into the tables that record such things. GNU CC uses the
- information to preload the operand into a register if that is required for
- valid RTL code. If the operand is referred to more than once, subsequent
- references should use @code{match_dup}.
-
- The RTL template may also refer to internal ``operands'' which are
- temporary registers or labels used only within the sequence made by the
- @code{define_expand}. Internal operands are substituted into the RTL
- template with @code{match_dup}, never with @code{match_operand}. The
- values of the internal operands are not passed in as arguments by the
- compiler when it requests use of this pattern. Instead, they are computed
- within the pattern, in the preparation statements. These statements
- compute the values and store them into the appropriate elements of
- @code{operands} so that @code{match_dup} can find them.
-
- There are two special macros defined for use in the preparation statements:
- @code{DONE} and @code{FAIL}. Use them with a following semicolon,
- as a statement.
-
- @table @code
-
- @findex DONE
- @item DONE
- Use the @code{DONE} macro to end RTL generation for the pattern. The
- only RTL insns resulting from the pattern on this occasion will be
- those already emitted by explicit calls to @code{emit_insn} within the
- preparation statements; the RTL template will not be generated.
-
- @findex FAIL
- @item FAIL
- Make the pattern fail on this occasion. When a pattern fails, it means
- that the pattern was not truly available. The calling routines in the
- compiler will try other strategies for code generation using other patterns.
-
- Failure is currently supported only for binary (addition, multiplication,
- shifting, etc.) and bitfield (@code{extv}, @code{extzv}, and @code{insv})
- operations.
- @end table
-
- Here is an example, the definition of left-shift for the SPUR chip:
-
- @example
- (define_expand "ashlsi3"
- [(set (match_operand:SI 0 "register_operand" "")
- (ashift:SI
- (match_operand:SI 1 "register_operand" "")
- (match_operand:SI 2 "nonmemory_operand" "")))]
- ""
- "
- @{
- if (GET_CODE (operands[2]) != CONST_INT
- || (unsigned) INTVAL (operands[2]) > 3)
- FAIL;
- @}")
- @end example
-
- @noindent
- This example uses @code{define_expand} so that it can generate an RTL insn
- for shifting when the shift-count is in the supported range of 0 to 3 but
- fail in other cases where machine insns aren't available. When it fails,
- the compiler tries another strategy using different patterns (such as, a
- library call).
-
- If the compiler were able to handle nontrivial condition-strings in
- patterns with names, then it would be possible to use a
- @code{define_insn} in that case. Here is another case (zero-extension
- on the 68000) which makes more use of the power of @code{define_expand}:
-
- @example
- (define_expand "zero_extendhisi2"
- [(set (match_operand:SI 0 "general_operand" "")
- (const_int 0))
- (set (strict_low_part
- (subreg:HI
- (match_dup 0)
- 0))
- (match_operand:HI 1 "general_operand" ""))]
- ""
- "operands[1] = make_safe_from (operands[1], operands[0]);")
- @end example
-
- @noindent
- @findex make_safe_from
- Here two RTL insns are generated, one to clear the entire output operand
- and the other to copy the input operand into its low half. This sequence
- is incorrect if the input operand refers to [the old value of] the output
- operand, so the preparation statement makes sure this isn't so. The
- function @code{make_safe_from} copies the @code{operands[1]} into a
- temporary register if it refers to @code{operands[0]}. It does this
- by emitting another RTL insn.
-
- Finally, a third example shows the use of an internal operand.
- Zero-extension on the SPUR chip is done by @code{and}-ing the result
- against a halfword mask. But this mask cannot be represented by a
- @code{const_int} because the constant value is too large to be legitimate
- on this machine. So it must be copied into a register with
- @code{force_reg} and then the register used in the @code{and}.
-
- @example
- (define_expand "zero_extendhisi2"
- [(set (match_operand:SI 0 "register_operand" "")
- (and:SI (subreg:SI
- (match_operand:HI 1 "register_operand" "")
- 0)
- (match_dup 2)))]
- ""
- "operands[2]
- = force_reg (SImode, gen_rtx (CONST_INT,
- VOIDmode, 65535)); ")
- @end example
-
- @strong{Note:} If the @code{define_expand} is used to serve a
- standard binary or unary arithmetic operation or a bitfield operation,
- then the last insn it generates must not be a @code{code_label},
- @code{barrier} or @code{note}. It must be an @code{insn},
- @code{jump_insn} or @code{call_insn}. If you don't need a real insn
- at the end, emit an insn to copy the result of the operation into
- itself. Such an insn will generate no code, but it can avoid problems
- in the compiler.@refill
-
- @node Insn Splitting, Insn Attributes, Expander Definitions, Machine Desc
- @section Splitting Instructions into Multiple Instructions
- @cindex insn splitting
- @cindex instruction splitting
- @cindex splitting instructions
-
- There are two cases where you should specify how to split a pattern into
- multiple insns. On machines that have instructions requiring delay
- slots (@pxref{Delay Slots}) or that have instructions whose output is
- not available for multiple cycles (@pxref{Function Units}), the compiler
- phases that optimize these cases need to be able to move insns into
- one-cycle delay slots. However, some insns may generate more than one
- machine instruction. These insns cannot be placed into a delay slot.
-
- Often you can rewrite the single insn as a list of individual insns,
- each corresponding to one machine instruction. The disadvantage of
- doing so is that it will cause the compilation to be slower and require
- more space. If the resulting insns are too complex, it may also
- suppress some optimizations. The compiler splits the insn if there is a
- reason to believe that it might improve instruction or delay slot
- scheduling.
-
- The insn combiner phase also splits putative insns. If three insns are
- merged into one insn with a complex expression that cannot be matched by
- some @code{define_insn} pattern, the combiner phase attempts to split
- the complex pattern into two insns that are recognized. Usually it can
- break the complex pattern into two patterns by splitting out some
- subexpression. However, in some other cases, such as performing an
- addition of a large constant in two insns on a RISC machine, the way to
- split the addition into two insns is machine-dependent.
-
- @cindex define_split
- The @code{define_split} definition tells the compiler how to split a
- complex insn into several simpler insns. It looks like this:
-
- @example
- (define_split
- [@var{insn-pattern}]
- "@var{condition}"
- [@var{new-insn-pattern-1}
- @var{new-insn-pattern-2}
- @dots{}]
- "@var{preparation statements}")
- @end example
-
- @var{insn-pattern} is a pattern that needs to be split and
- @var{condition} is the final condition to be tested, as in a
- @code{define_insn}. When an insn matching @var{insn-pattern} and
- satisfying @var{condition} is found, it is replaced in the insn list
- with the insns given by @var{new-insn-pattern-1},
- @var{new-insn-pattern-2}, etc.
-
- The @var{preparation statements} are similar to those specified for
- @code{define_expand} (@pxref{Expander Definitions}) and are executed
- before the new RTL is generated to prepare for the generated code
- or emit some insns whose pattern is not fixed.
-
- Patterns are matched against @var{insn-pattern} in two different
- circumstances. If an insn needs to be split for delay slot scheduling
- or insn scheduling, the insn is already known to be valid, which means
- that it must have been matched by some @code{define_insn} and, if
- @code{reload_completed} is non-zero, is known to satisfy the constraints
- of that @code{define_insn}. In that case, the new insn patterns must
- also be insns that are matched by some @code{define_insn} and, if
- @code{reload_completed} is non-zero, must also satisfy the constraints
- of those definitions.
-
- As an example of this usage of @code{define_split}, consider the following
- example from @file{a29k.md}, which splits a @code{sign_extend} from
- @code{HImode} to @code{SImode} into a pair of shift insns:
-
- @example
- (define_split
- [(set (match_operand:SI 0 "gen_reg_operand" "")
- (sign_extend:SI (match_operand:HI 1 "gen_reg_operand" "")))]
- ""
- [(set (match_dup 0)
- (ashift:SI (match_dup 1)
- (const_int 16)))
- (set (match_dup 0)
- (ashiftrt:SI (match_dup 0)
- (const_int 16)))]
- "
- @{ operands[1] = gen_lowpart (SImode, operands[1]); @}")
- @end example
-
- When the combiner phase tries to split an insn pattern, it is always the
- case that the pattern is @emph{not} matched by any @code{define_insn}.
- The combiner pass first tries to split a single @code{set} expression
- and then the same @code{set} expression inside a @code{parallel}, but
- followed by a @code{clobber} of a pseudo-reg to use as a scratch
- register. In these cases, the combiner expects exactly two new insn
- patterns to be generated. It will verify that these patterns match some
- @code{define_insn} definitions, so you need not do this test in the
- @code{define_split} (of course, there is no point in writing a
- @code{define_split} that will never produce insns that match).
-
- Here is an example of this use of @code{define_split}, taken from
- @file{rs6000.md}:
-
- @example
- (define_split
- [(set (match_operand:SI 0 "gen_reg_operand" "")
- (plus:SI (match_operand:SI 1 "gen_reg_operand" "")
- (match_operand:SI 2 "non_add_cint_operand" "")))]
- ""
- [(set (match_dup 0) (plus:SI (match_dup 1) (match_dup 3)))
- (set (match_dup 0) (plus:SI (match_dup 0) (match_dup 4)))]
- "
- @{
- int low = INTVAL (operands[2]) & 0xffff;
- int high = (unsigned) INTVAL (operands[2]) >> 16;
-
- if (low & 0x8000)
- high++, low |= 0xffff0000;
-
- operands[3] = gen_rtx (CONST_INT, VOIDmode, high << 16);
- operands[4] = gen_rtx (CONST_INT, VOIDmode, low);
- @}")
- @end example
-
- Here the predicate @code{non_add_cint_operand} matches any
- @code{const_int} that is @emph{not} a valid operand of a single add
- insn. Write the add with the smaller displacement is written so that it
- can be substituted into the address of a subsequent operation.
-
- An example that uses a scratch register, from the same file, generates
- an equality comparison of a register and a large constant:
-
- @example
- (define_split
- [(set (match_operand:CC 0 "cc_reg_operand" "")
- (compare:CC (match_operand:SI 1 "gen_reg_operand" "")
- (match_operand:SI 2 "non_short_cint_operand" "")))
- (clobber (match_operand:SI 3 "gen_reg_operand" ""))]
- "find_single_use (operands[0], insn, 0)
- && (GET_CODE (*find_single_use (operands[0], insn, 0)) == EQ
- || GET_CODE (*find_single_use (operands[0], insn, 0)) == NE)"
- [(set (match_dup 3) (xor:SI (match_dup 1) (match_dup 4)))
- (set (match_dup 0) (compare:CC (match_dup 3) (match_dup 5)))]
- "
- @{
- /* Get the constant we are comparing against, C, and see what it looks like
- sign-extended to 16 bits. Then see what constant could be XOR'ed
- with C to get the sign-extended value. */
-
- int c = INTVAL (operands[2]);
- int sextc = (c << 16) >> 16;
- int xorv = c ^ sextc;
-
- operands[4] = gen_rtx (CONST_INT, VOIDmode, xorv);
- operands[5] = gen_rtx (CONST_INT, VOIDmode, sextc);
- @}")
- @end example
-
- To avoid confusion, don't write a single @code{define_split} that
- accepts some insns that match some @code{define_insn} as well as some
- insns that don't. Instead, write two separate @code{define_split}
- definitions, one for the insns that are valid and one for the insns that
- are not valid.
-
- @node Insn Attributes,, Insn Splitting, Machine Desc
- @section Instruction Attributes
- @cindex insn attributes
- @cindex instruction attributes
-
- In addition to describing the instruction supported by the target machine,
- the @file{md} file also defines a group of @dfn{attributes} and a set of
- values for each. Every generated insn is assigned a value for each attribute.
- One possible attribute would be the effect that the insn has on the machine's
- condition code. This attribute can then be used by @code{NOTICE_UPDATE_CC}
- to track the condition codes.
-
- @menu
- * Defining Attributes:: Specifying attributes and their values.
- * Expressions:: Valid expressions for attribute values.
- * Tagging Insns:: Assigning attribute values to insns.
- * Attr Example:: An example of assigning attributes.
- * Insn Lengths:: Computing the length of insns.
- * Constant Attributes:: Defining attributes that are constant.
- * Delay Slots:: Defining delay slots required for a machine.
- * Function Units:: Specifying information for insn scheduling.
- @end menu
-
- @node Defining Attributes, Expressions, Insn Attributes, Insn Attributes
- @subsection Defining Attributes and their Values
- @cindex defining attributes and their values
- @cindex attributes, defining
-
- @findex define_attr
- The @code{define_attr} expression is used to define each attribute required
- by the target machine. It looks like:
-
- @example
- (define_attr @var{name} @var{list-of-values} @var{default})
- @end example
-
- @var{name} is a string specifying the name of the attribute being defined.
-
- @var{list-of-values} is either a string that specifies a comma-separated
- list of values that can be assigned to the attribute, or a null string to
- indicate that the attribute takes numeric values.
-
- @var{default} is an attribute expression that gives the value of this
- attribute for insns that match patterns whose definition does not include
- an explicit value for this attribute. @xref{Attr Example}, for more
- information on the handling of defaults. @xref{Constant Attributes},
- for information on attributes that do not depend on any particular insn.
-
- @findex insn-attr.h
- For each defined attribute, a number of definitions are written to the
- @file{insn-attr.h} file. For cases where an explicit set of values is
- specified for an attribute, the following are defined:
-
- @itemize @bullet
- @item
- A @samp{#define} is written for the symbol @samp{HAVE_ATTR_@var{name}}.
-
- @item
- An enumeral class is defined for @samp{attr_@var{name}} with
- elements of the form @samp{@var{upper-name}_@var{upper-value}} where
- the attribute name and value are first converted to upper case.
-
- @item
- A function @samp{get_attr_@var{name}} is defined that is passed an insn and
- returns the attribute value for that insn.
- @end itemize
-
- For example, if the following is present in the @file{md} file:
-
- @example
- (define_attr "type" "branch,fp,load,store,arith" @dots{})
- @end example
-
- @noindent
- the following lines will be written to the file @file{insn-attr.h}.
-
- @example
- #define HAVE_ATTR_type
- enum attr_type @{TYPE_BRANCH, TYPE_FP, TYPE_LOAD,
- TYPE_STORE, TYPE_ARITH@};
- extern enum attr_type get_attr_type ();
- @end example
-
- If the attribute takes numeric values, no @code{enum} type will be
- defined and the function to obtain the attribute's value will return
- @code{int}.
-
- @node Expressions, Tagging Insns, Defining Attributes, Insn Attributes
- @subsection Attribute Expressions
- @cindex attribute expressions
-
- RTL expressions used to define attributes use the codes described above
- plus a few specific to attribute definitions, to be discussed below.
- Attribute value expressions must have one of the following forms:
-
- @table @code
- @cindex @code{const_int} and attributes
- @item (const_int @var{i})
- The integer @var{i} specifies the value of a numeric attribute. @var{i}
- must be non-negative.
-
- The value of a numeric attribute can be specified either with a
- @code{const_int} or as an integer represented as a string in
- @code{const_string}, @code{eq_attr} (see below), and @code{set_attr}
- (@pxref{Tagging Insns}) expressions.
-
- @cindex @code{const_string} and attributes
- @item (const_string @var{value})
- The string @var{value} specifies a constant attribute value.
- If @var{value} is specified as @samp{"*"}, it means that the default value of
- the attribute is to be used for the insn containing this expression.
- @samp{"*"} obviously cannot be used in the @var{default} expression
- of a @code{define_attr}.@refill
-
- If the attribute whose value is being specified is numeric, @var{value}
- must be a string containing a non-negative integer (normally
- @code{const_int} would be used in this case). Otherwise, it must
- contain one of the valid values for the attribute.
-
- @cindex @code{if_then_else} and attributes
- @item (if_then_else @var{test} @var{true-value} @var{false-value})
- @var{test} specifies an attribute test, whose format is defined below.
- The value of this expression is @var{true-value} if @var{test} is true,
- otherwise it is @var{false-value}.
-
- @cindex @code{cond} and attributes
- @item (cond [@var{test1} @var{value1} @dots{}] @var{default})
- The first operand of this expression is a vector containing an even
- number of expressions and consisting of pairs of @var{test} and @var{value}
- expressions. The value of the @code{cond} expression is that of the
- @var{value} corresponding to the first true @var{test} expression. If
- none of the @var{test} expressions are true, the value of the @code{cond}
- expression is that of the @var{default} expression.
- @end table
-
- @var{test} expressions can have one of the following forms:
-
- @table @code
- @cindex @code{const_int} and attribute tests
- @item (const_int @var{i})
- This test is true if @var{i} is non-zero and false otherwise.
-
- @cindex @code{not} and attributes
- @cindex @code{ior} and attributes
- @cindex @code{and} and attributes
- @item (not @var{test})
- @itemx (ior @var{test1} @var{test2})
- @itemx (and @var{test1} @var{test2})
- These tests are true if the indicated logical function is true.
-
- @cindex @code{match_operand} and attributes
- @item (match_operand:@var{m} @var{n} @var{pred} @var{constraints})
- This test is true if operand @var{n} of the insn whose attribute value
- is being determined has mode @var{m} (this part of the test is ignored
- if @var{m} is @code{VOIDmode}) and the function specified by the string
- @var{pred} returns a non-zero value when passed operand @var{n} and mode
- @var{m} (this part of the test is ignored if @var{pred} is the null
- string).
-
- The @var{constraints} operand is ignored and should be the null string.
-
- @cindex @code{le} and attributes
- @cindex @code{leu} and attributes
- @cindex @code{lt} and attributes
- @cindex @code{gt} and attributes
- @cindex @code{gtu} and attributes
- @cindex @code{ge} and attributes
- @cindex @code{geu} and attributes
- @cindex @code{ne} and attributes
- @cindex @code{eq} and attributes
- @cindex @code{plus} and attributes
- @cindex @code{minus} and attributes
- @cindex @code{mult} and attributes
- @cindex @code{div} and attributes
- @cindex @code{mod} and attributes
- @cindex @code{abs} and attributes
- @cindex @code{neg} and attributes
- @cindex @code{lshift} and attributes
- @cindex @code{ashift} and attributes
- @cindex @code{lshiftrt} and attributes
- @cindex @code{ashiftrt} and attributes
- @item (le @var{arith1} @var{arith2})
- @itemx (leu @var{arith1} @var{arith2})
- @itemx (lt @var{arith1} @var{arith2})
- @itemx (ltu @var{arith1} @var{arith2})
- @itemx (gt @var{arith1} @var{arith2})
- @itemx (gtu @var{arith1} @var{arith2})
- @itemx (ge @var{arith1} @var{arith2})
- @itemx (geu @var{arith1} @var{arith2})
- @itemx (ne @var{arith1} @var{arith2})
- @itemx (eq @var{arith1} @var{arith2})
- These tests are true if the indicated comparison of the two arithmetic
- expressions is true. Arithmetic expressions are formed with
- @code{plus}, @code{minus}, @code{mult}, @code{div}, @code{mod},
- @code{abs}, @code{neg}, @code{and}, @code{ior}, @code{xor}, @code{not},
- @code{lshift}, @code{ashift}, @code{lshiftrt}, and @code{ashiftrt}
- expressions.@refill
-
- @findex get_attr
- @code{const_int} and @code{symbol_ref} are always valid terms (@pxref{Insn
- Lengths},for additional forms). @code{symbol_ref} is a string
- denoting a C expression that yields an @code{int} when evaluated by the
- @samp{get_attr_@dots{}} routine. It should normally be a global
- variable.@refill
-
- @findex eq_attr
- @item (eq_attr @var{name} @var{value})
- @var{name} is a string specifying the name of an attribute.
-
- @var{value} is a string that is either a valid value for attribute
- @var{name}, a comma-separated list of values, or @samp{!} followed by a
- value or list. If @var{value} does not begin with a @samp{!}, this
- test is true if the value of the @var{name} attribute of the current
- insn is in the list specified by @var{value}. If @var{value} begins
- with a @samp{!}, this test is true if the attribute's value is
- @emph{not} in the specified list.
-
- For example,
-
- @example
- (eq_attr "type" "load,store")
- @end example
-
- @noindent
- is equivalent to
-
- @example
- (ior (eq_attr "type" "load") (eq_attr "type" "store"))
- @end example
-
- If @var{name} specifies an attribute of @samp{alternative}, it refers to the
- value of the compiler variable @code{which_alternative}
- (@pxref{Output Statement}) and the values must be small integers. For
- example,@refill
-
- @example
- (eq_attr "alternative" "2,3")
- @end example
-
- @noindent
- is equivalent to
-
- @example
- (ior (eq (symbol_ref "which_alternative") (const_int 2))
- (eq (symbol_ref "which_alternative") (const_int 3)))
- @end example
-
- Note that, for most attributes, an @code{eq_attr} test is simplified in cases
- where the value of the attribute being tested is known for all insns matching
- a particular pattern. This is by far the most common case.@refill
- @end table
-
- @node Tagging Insns, Attr Example, Expressions, Insn Attributes
- @subsection Assigning Attribute Values to Insns
- @cindex tagging insns
- @cindex assigning attribute values to insns
-
- The value assigned to an attribute of an insn is primarily determined by
- which pattern is matched by that insn (or which @code{define_peephole}
- generated it). Every @code{define_insn} and @code{define_peephole} can
- have an optional last argument to specify the values of attributes for
- matching insns. The value of any attribute not specified in a particular
- insn is set to the default value for that attribute, as specified in its
- @code{define_attr}. Extensive use of default values for attributes
- permits the specification of the values for only one or two attributes
- in the definition of most insn patterns, as seen in the example in the
- next section.@refill
-
- The optional last argument of @code{define_insn} and
- @code{define_peephole} is a vector of expressions, each of which defines
- the value for a single attribute. The most general way of assigning an
- attribute's value is to use a @code{set} expression whose first operand is an
- @code{attr} expression giving the name of the attribute being set. The
- second operand of the @code{set} is an attribute expression
- (@pxref{Expressions}) giving the value of the attribute.@refill
-
- When the attribute value depends on the @samp{alternative} attribute
- (i.e., which is the applicable alternative in the constraint of the
- insn), the @code{set_attr_alternative} expression can can be used. It
- allows the specification of a vector of attribute expressions, one for
- each alternative.
-
- @findex set_attr
- When the generality of arbitrary attribute expressions is not required,
- the simpler @code{set_attr} expression can be used, which allows
- specifying a string giving either a single attribute value or a list
- of attribute values, one for each alternative.
-
- The form of each of the above specifications is shown below. In each case,
- @var{name} is a string specifying the attribute to be set.
-
- @table @code
- @item (set_attr @var{name} @var{value-string})
- @var{value-string} is either a string giving the desired attribute value,
- or a string containing a comma-separated list giving the values for
- succeeding alternatives. The number of elements must match the number
- of alternatives in the constraint of the insn pattern.
-
- Note that it may be useful to specify @samp{*} for some alternative, in
- which case the attribute will assume its default value for insns matching
- that alternative.
-
- @findex set_attr_alternative
- @item (set_attr_alternative @var{name} [@var{value1} @var{value2} @dots{}])
- Depending on the alternative of the insn, the value will be one of the
- specified values. This is a shorthand for using a @code{cond} with
- tests on the @samp{alternative} attribute.
-
- @findex attr
- @item (set (attr @var{name}) @var{value})
- The first operand of this @code{set} must be the special RTL expression
- @code{attr}, whose sole operand is a string giving the name of the
- attribute being set. @var{value} is the value of the attribute.
- @end table
-
- The following shows three different ways of representing the same
- attribute value specification:
-
- @example
- (set_attr "type" "load,store,arith")
-
- (set_attr_alternative "type"
- [(const_string "load") (const_string "store")
- (const_string "arith")])
-
- (set (attr "type")
- (cond [(eq_attr "alternative" "1") (const_string "load")
- (eq_attr "alternative" "2") (const_string "store")]
- (const_string "arith")))
- @end example
-
- @findex define_asm_attributes
- The @code{define_asm_attributes} expression provides a mechanism to
- specify the attributes assigned to insns produced from an @code{asm}
- statement. It has the form:
-
- @example
- (define_asm_attributes [@var{attr-sets}])
- @end example
-
- @noindent
- where @var{attr-sets} is specified the same as for @code{define_insn}
- and @code{define_peephole} expressions.
-
- These values will typically be the ``worst case'' attribute values. For
- example, they might indicate that the condition code will be clobbered.
-
- A specification for a @code{length} attribute is handled specially. To
- compute the length of an @code{asm} insn, the length specified in the
- @code{define_asm_attributes} expression is multiplied by the number of
- machine instructions specified in the @code{asm} statement, determined
- by counting the number of semicolons and newlines in the string.
- Therefore, the value of the @code{length} attribute specified in a
- @code{define_asm_attributes} should be the maximum possible length of a
- single machine instruction.
-
- @node Attr Example, Insn Lengths, Tagging Insns, Insn Attributes
- @subsection Example of Attribute Specifications
- @cindex attribute specifications example
- @cindex attribute specifications
-
- The judicious use of defaulting is important in the efficient use of
- insn attributes. Typically, insns are divided into @dfn{types} and an
- attribute, customarily called @code{type}, is used to represent this
- value. This attribute is normally used only to define the default value
- for other attributes. An example will clarify this usage.
-
- Assume we have a RISC machine with a condition code and in which only
- full-word operations are performed in registers. Let us assume that we
- can divide all insns into loads, stores, (integer) arithmetic
- operations, floating point operations, and branches.
-
- Here we will concern ourselves with determining the effect of an insn on
- the condition code and will limit ourselves to the following possible
- effects: The condition code can be set unpredictably (clobbered), not
- be changed, be set to agree with the results of the operation, or only
- changed if the item previously set into the condition code has been
- modified.
-
- Here is part of a sample @file{md} file for such a machine:
-
- @example
- (define_attr "type" "load,store,arith,fp,branch" (const_string "arith"))
-
- (define_attr "cc" "clobber,unchanged,set,change0"
- (cond [(eq_attr "type" "load")
- (const_string "change0")
- (eq_attr "type" "store,branch")
- (const_string "unchanged")
- (eq_attr "type" "arith")
- (if_then_else (match_operand:SI 0 "" "")
- (const_string "set")
- (const_string "clobber"))]
- (const_string "clobber")))
-
- (define_insn ""
- [(set (match_operand:SI 0 "general_operand" "=r,r,m")
- (match_operand:SI 1 "general_operand" "r,m,r"))]
- ""
- "@@
- move %0,%1
- load %0,%1
- store %0,%1"
- [(set_attr "type" "arith,load,store")])
- @end example
-
- Note that we assume in the above example that arithmetic operations
- performed on quantities smaller than a machine word clobber the condition
- code since they will set the condition code to a value corresponding to the
- full-word result.
-
- @node Insn Lengths, Constant Attributes, Attr Example, Insn Attributes
- @subsection Computing the Length of an Insn
- @cindex insn lengths, computing
- @cindex computing the length of an insn
-
- For many machines, multiple types of branch instructions are provided, each
- for different length branch displacements. In most cases, the assembler
- will choose the correct instruction to use. However, when the assembler
- cannot do so, GCC can when a special attribute, the @samp{length}
- attribute, is defined. This attribute must be defined to have numeric
- values by specifying a null string in its @code{define_attr}.
-
- In the case of the @samp{length} attribute, two additional forms of
- arithmetic terms are allowed in test expressions:
-
- @table @code
- @cindex @code{match_dup} and attributes
- @item (match_dup @var{n})
- This refers to the address of operand @var{n} of the current insn, which
- must be a @code{label_ref}.
-
- @cindex @code{pc} and attributes
- @item (pc)
- This refers to the address of the @emph{current} insn. It might have
- been more consistent with other usage to make this the address of the
- @emph{next} insn but this would be confusing because the length of the
- current insn is to be computed.
- @end table
-
- @cindex @code{addr_vec}, length of
- @cindex @code{addr_diff_vec}, length of
- For normal insns, the length will be determined by value of the
- @samp{length} attribute. In the case of @code{addr_vec} and
- @code{addr_diff_vec} insn patterns, the length will be computed as
- the number of vectors multiplied by the size of each vector.@refill
-
- The following macros can be used to refine the length computation:
-
- @table @code
- @findex FIRST_INSN_ADDRESS
- @item FIRST_INSN_ADDRESS
- When the @code{length} insn attribute is used, this macro specifies the
- value to be assigned to the address of the first insn in a function. If
- not specified, 0 is used.
-
- @findex ADJUST_INSN_LENGTH
- @item ADJUST_INSN_LENGTH (@var{insn}, @var{length})
- If defined, modifies the length assigned to instruction @var{insn} as a
- function of the context in which it is used. @var{length} is an lvalue
- that contains the initially computed length of the insn and should be
- updated with the correct length of the insn. If updating is required,
- @var{insn} must not be a varying-length insn.
-
- This macro will normally not be required. A case in which it is
- required is the ROMP. On this machine, the size of an @code{addr_vec}
- insn must be increased by two to compensate for the fact that alignment
- may be required.
- @end table
-
- @findex get_attr_length
- The routine that returns the value of the @code{length} attribute,
- @code{get_attr_length}, can be used by the output routine to determine
- the form of the branch instruction to be written, as the example
- below illustrates.
-
- As an example of the specification of variable-length branches, consider
- the IBM 360. If we adopt the convention that a register will be set to
- the starting address of a function, we can jump to labels within 4K of
- the start using a four-byte instruction. Otherwise, we need a six-byte
- sequence to load the address from memory and then branch to it.
-
- On such a machine, a pattern for a branch instruction might be specified
- as follows:
-
- @example
- (define_insn "jump"
- [(set (pc)
- (label_ref (match_operand 0 "" "")))]
- ""
- "*
- @{
- return (get_attr_length (insn) == 4
- ? \"b %l0\" : \"l r15,=a(%l0); br r15\");
- @}"
- [(set (attr "length") (if_then_else (lt (match_dup 0) (const_int 4096))
- (const_int 4)
- (const_int 6)))])
- @end example
-
- @node Constant Attributes, Delay Slots, Insn Lengths, Insn Attributes
- @subsection Constant Attributes
- @cindex constant attributes
-
- A special form of @code{define_attr}, where the expression for the
- default value is a @code{const} expression, indicates an attribute that
- is constant for a given run of the compiler. Constant attributes may be
- used to specify which variety of processor is used. For example,
-
- @example
- (define_attr "cpu" "m88100,m88110,m88000"
- (const
- (cond [(symbol_ref "TARGET_88100") (const_string "m88100")
- (symbol_ref "TARGET_88110") (const_string "m88110")]
- (const_string "m88000"))))
-
- (define_attr "memory" "fast,slow"
- (const
- (if_then_else (symbol_ref "TARGET_FAST_MEM")
- (const_string "fast")
- (const_string "slow"))))
- @end example
-
- The routine generated for constant attributes has no parameters as it
- does not depend on any particular insn. RTL expressions used to define
- the value of a constant attribute may use the @code{symbol_ref} form,
- but may not use either the @code{match_operand} form or @code{eq_attr}
- forms involving insn attributes.
-
- @node Delay Slots, Function Units, Constant Attributes, Insn Attributes
- @subsection Delay Slot Scheduling
- @cindex delay slots, defining
-
- The insn attribute mechanism can be used to specify the requirements for
- delay slots, if any, on a target machine. An instruction is said to
- require a @dfn{delay slot} if some instructions that are physically
- after the instruction are executed as if they were located before it.
- Classic examples are branch and call instructions, which often execute
- the following instruction before the branch or call is performed.
-
- On some machines, conditional branch instructions can optionally
- @dfn{annul} instructions in the delay slot. This means that the
- instruction will not be executed for certain branch outcomes. Both
- instructions that annul if the branch is true and instructions that
- annul if the branch is false are supported.
-
- Delay slot scheduling differs from instruction scheduling in that
- determining whether an instruction needs a delay slot is dependent only
- on the type of instruction being generated, not on data flow between the
- instructions. See the next section for a discussion of data-dependent
- instruction scheduling.
-
- @findex define_delay
- The requirement of an insn needing one or more delay slots is indicated
- via the @code{define_delay} expression. It has the following form:
-
- @example
- (define_delay @var{test}
- [@var{delay-1} @var{annul-true-1} @var{annul-false-1}
- @var{delay-2} @var{annul-true-2} @var{annul-false-2}
- @dots{}])
- @end example
-
- @var{test} is an attribute test that indicates whether this
- @code{define_delay} applies to a particular insn. If so, the number of
- required delay slots is determined by the length of the vector specified
- as the second argument. An insn placed in delay slot @var{n} must
- satisfy attribute test @var{delay-n}. @var{annul-true-n} is an
- attribute test that specifies which insns may be annulled if the branch
- is true. Similarly, @var{annul-false-n} specifies which insns in the
- delay slot may be annulled if the branch is false. If annulling is not
- supported for that delay slot, @code{(nil)} should be coded.@refill
-
- For example, in the common case where branch and call insns require
- a single delay slot, which may contain any insn other than a branch or
- call, the following would be placed in the @file{md} file:
-
- @example
- (define_delay (eq_attr "type" "branch,call")
- [(eq_attr "type" "!branch,call") (nil) (nil)])
- @end example
-
- Multiple @code{define_delay} expressions may be specified. In this
- case, each such expression specifies different delay slot requirements
- and there must be no insn for which tests in two @code{define_delay}
- expressions are both true.
-
- For example, if we have a machine that requires one delay slot for branches
- but two for calls, no delay slot can contain a branch or call insn,
- and any valid insn in the delay slot for the branch can be annulled if the
- branch is true, we might represent this as follows:
-
- @example
- (define_delay (eq_attr "type" "branch")
- [(eq_attr "type" "!branch,call") (eq_attr "type" "!branch,call") (nil)])
-
- (define_delay (eq_attr "type" "call")
- [(eq_attr "type" "!branch,call") (nil) (nil)
- (eq_attr "type" "!branch,call") (nil) (nil)])
- @end example
-
- @node Function Units,, Delay Slots, Insn Attributes
- @subsection Specifying Function Units
- @cindex function units, for scheduling
-
- On most RISC machines, there are instructions whose results are not
- available for a specific number of cycles. Common cases are instructions
- that load data from memory. On many machines, a pipeline stall will result
- if the data is referenced too soon after the load instruction.
-
- In addition, many newer microprocessors have multiple function units, usually
- one for integer and one for floating point, and often will incur pipeline
- stalls when a result that is needed is not yet ready.
-
- The descriptions in this section allow the specification of how much
- time must elapse between the execution of an instruction and the time
- when its result is used. It also allows specification of when the
- execution of an instruction will delay execution of similar instructions
- due to function unit conflicts.
-
- For the purposes of the specifications in this section, a machine is
- divided into @dfn{function units}, each of which execute a specific
- class of instructions. Function units that accept one instruction each
- cycle and allow a result to be used in the succeeding instruction
- (usually via forwarding) need not be specified. Classic RISC
- microprocessors will normally have a single function unit, which we can
- call @samp{memory}. The newer ``superscalar'' processors will often
- have function units for floating point operations, usually at least
- a floating point adder and multiplier.
-
- @findex define_function_unit
- Each usage of a function units by a class of insns is specified with a
- @code{define_function_unit} expression, which looks like this:
-
- @example
- (define_function_unit @var{name} @var{multiplicity} @var{simultaneity}
- @var{test} @var{ready-delay} @var{busy-delay}
- [@var{conflict-list}])
- @end example
-
- @var{name} is a string giving the name of the function unit.
-
- @var{multiplicity} is an integer specifying the number of identical
- units in the processor. If more than one unit is specified, they will
- be scheduled independently. Only truly independent units should be
- counted; a pipelined unit should be specified as a single unit. (The
- only common example of a machine that has multiple function units for a
- single instruction class that are truly independent and not pipelined
- are the two multiply and two increment units of the CDC 6600.)
-
- @var{simultaneity} specifies the maximum number of insns that can be
- executing in each instance of the function unit simultaneously or zero
- if the unit is pipelined and has no limit.
-
- All @code{define_function_unit} definitions referring to function unit
- @var{name} must have the same name and values for @var{multiplicity} and
- @var{simultaneity}.
-
- @var{test} is an attribute test that selects the insns we are describing
- in this definition. Note that an insn may use more than one function
- unit and a function unit may be specified in more than one
- @code{define_function_unit}.
-
- @var{ready-delay} is an integer that specifies the number of cycles
- after which the result of the instruction can be used without
- introducing any stalls.
-
- @var{busy-delay} is an integer that represents the default cost if an
- insn is scheduled for this unit while the unit is active with another
- insn. If @var{simultaneity} is zero, this specification is ignored.
- Otherwise, a zero value indicates that these insns execute on @var{name}
- in a fully pipelined fashion, even if @var{simultaneity} is non-zero. A
- non-zero value indicates that scheduling a new insn on this unit while
- another is active will incur a cost. A cost of two indicates a single
- cycle delay. For a normal non-pipelined function unit, @var{busy-delay}
- will be twice @var{ready-delay}.
-
- @var{conflict-list} is an optional list giving detailed conflict costs
- for this unit. If specified, it is a list of condition test expressions
- which are applied to insns already executing in @var{name}. For each
- insn that is in the list, @var{busy-delay} will be used for the conflict
- cost, while a value of zero will be used for insns not in the list.
-
- Typical uses of this vector are where a floating point function unit can
- pipeline either single- or double-precision operations, but not both, or
- where a memory unit can pipeline loads, but not stores, etc.
-
- As an example, consider a classic RISC machine where the result of a
- load instruction is not available for two cycles (a single ``delay''
- instruction is required) and where only one load instruction can be executed
- simultaneously. This would be specified as:
-
- @example
- (define_function_unit "memory" 1 1 (eq_attr "type" "load") 2 4)
- @end example
-
- For the case of a floating point function unit that can pipeline either
- single or double precision, but not both, the following could be specified:
-
- @example
- (define_function_unit
- "fp" 1 1 (eq_attr "type" "sp_fp") 4 8 (eq_attr "type" "dp_fp")]
- (define_function_unit
- "fp" 1 1 (eq_attr "type" "dp_fp") 4 8 (eq_attr "type" "sp_fp")]
- @end example
-
- @strong{Note:} No code currently exists to avoid function unit
- conflicts, only data conflicts. Hence @var{multiplicity},
- @var{simultaneity}, @var{busy-cost}, and @var{conflict-list} are
- currently ignored. When such code is written, it is possible that the
- specifications for these values may be changed. It has recently come to
- our attention that these specifications may not allow modeling of some
- of the newer ``superscalar'' processors that have insns using multiple
- pipelined units. These insns will cause a potential conflict for the
- second unit used during their execution and there is no way of
- representing that conflict. We welcome any examples of how function
- unit conflicts work in such processors and suggestions for their
- representation.
- @end ifset
-