|
|
1.1.1.7 root 1: This is Info file gcc.info, produced by Makeinfo-1.55 from the input
1.1 root 2: file gcc.texi.
3:
4: This file documents the use and the internals of the GNU compiler.
5:
1.1.1.8 ! root 6: Published by the Free Software Foundation 59 Temple Place - Suite 330
! 7: Boston, MA 02111-1307 USA
1.1.1.5 root 8:
1.1.1.8 ! root 9: Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995 Free Software
! 10: Foundation, Inc.
1.1 root 11:
1.1.1.3 root 12: Permission is granted to make and distribute verbatim copies of this
13: manual provided the copyright notice and this permission notice are
14: preserved on all copies.
1.1 root 15:
16: Permission is granted to copy and distribute modified versions of
17: this manual under the conditions for verbatim copying, provided also
1.1.1.7 root 18: that the sections entitled "GNU General Public License," "Funding for
19: Free Software," and "Protect Your Freedom--Fight `Look And Feel'" are
20: included exactly as in the original, and provided that the entire
21: resulting derived work is distributed under the terms of a permission
22: notice identical to this one.
1.1 root 23:
24: Permission is granted to copy and distribute translations of this
25: manual into another language, under the above conditions for modified
1.1.1.3 root 26: versions, except that the sections entitled "GNU General Public
1.1.1.7 root 27: License," "Funding for Free Software," and "Protect Your Freedom--Fight
28: `Look And Feel'", and this permission notice, may be included in
29: translations approved by the Free Software Foundation instead of in the
30: original English.
1.1.1.3 root 31:
32:
1.1.1.8 ! root 33: File: gcc.info, Node: Side Effects, Next: Incdec, Prev: RTL Declarations, Up: RTL
1.1.1.3 root 34:
1.1.1.8 ! root 35: Side Effect Expressions
! 36: =======================
1.1.1.4 root 37:
1.1.1.8 ! root 38: The expression codes described so far represent values, not actions.
! 39: But machine instructions never produce values; they are meaningful only
! 40: for their side effects on the state of the machine. Special expression
! 41: codes are used to represent side effects.
! 42:
! 43: The body of an instruction is always one of these side effect codes;
! 44: the codes described above, which represent values, appear only as the
! 45: operands of these.
! 46:
! 47: `(set LVAL X)'
! 48: Represents the action of storing the value of X into the place
! 49: represented by LVAL. LVAL must be an expression representing a
! 50: place that can be stored in: `reg' (or `subreg' or
! 51: `strict_low_part'), `mem', `pc' or `cc0'.
! 52:
! 53: If LVAL is a `reg', `subreg' or `mem', it has a machine mode; then
! 54: X must be valid for that mode.
! 55:
! 56: If LVAL is a `reg' whose machine mode is less than the full width
! 57: of the register, then it means that the part of the register
! 58: specified by the machine mode is given the specified value and the
! 59: rest of the register receives an undefined value. Likewise, if
! 60: LVAL is a `subreg' whose machine mode is narrower than the mode of
! 61: the register, the rest of the register can be changed in an
! 62: undefined way.
! 63:
! 64: If LVAL is a `strict_low_part' of a `subreg', then the part of the
! 65: register specified by the machine mode of the `subreg' is given
! 66: the value X and the rest of the register is not changed.
! 67:
! 68: If LVAL is `(cc0)', it has no machine mode, and X may be either a
! 69: `compare' expression or a value that may have any mode. The
! 70: latter case represents a "test" instruction. The expression `(set
! 71: (cc0) (reg:M N))' is equivalent to `(set (cc0) (compare (reg:M N)
! 72: (const_int 0)))'. Use the former expression to save space during
! 73: the compilation.
! 74:
! 75: If LVAL is `(pc)', we have a jump instruction, and the
! 76: possibilities for X are very limited. It may be a `label_ref'
! 77: expression (unconditional jump). It may be an `if_then_else'
! 78: (conditional jump), in which case either the second or the third
! 79: operand must be `(pc)' (for the case which does not jump) and the
! 80: other of the two must be a `label_ref' (for the case which does
! 81: jump). X may also be a `mem' or `(plus:SI (pc) Y)', where Y may
! 82: be a `reg' or a `mem'; these unusual patterns are used to
! 83: represent jumps through branch tables.
! 84:
! 85: If LVAL is neither `(cc0)' nor `(pc)', the mode of LVAL must not
! 86: be `VOIDmode' and the mode of X must be valid for the mode of LVAL.
! 87:
! 88: LVAL is customarily accessed with the `SET_DEST' macro and X with
! 89: the `SET_SRC' macro.
! 90:
! 91: `(return)'
! 92: As the sole expression in a pattern, represents a return from the
! 93: current function, on machines where this can be done with one
! 94: instruction, such as Vaxes. On machines where a multi-instruction
! 95: "epilogue" must be executed in order to return from the function,
! 96: returning is done by jumping to a label which precedes the
! 97: epilogue, and the `return' expression code is never used.
! 98:
! 99: Inside an `if_then_else' expression, represents the value to be
! 100: placed in `pc' to return to the caller.
! 101:
! 102: Note that an insn pattern of `(return)' is logically equivalent to
! 103: `(set (pc) (return))', but the latter form is never used.
! 104:
! 105: `(call FUNCTION NARGS)'
! 106: Represents a function call. FUNCTION is a `mem' expression whose
! 107: address is the address of the function to be called. NARGS is an
! 108: expression which can be used for two purposes: on some machines it
! 109: represents the number of bytes of stack argument; on others, it
! 110: represents the number of argument registers.
! 111:
! 112: Each machine has a standard machine mode which FUNCTION must have.
! 113: The machine description defines macro `FUNCTION_MODE' to expand
! 114: into the requisite mode name. The purpose of this mode is to
! 115: specify what kind of addressing is allowed, on machines where the
! 116: allowed kinds of addressing depend on the machine mode being
! 117: addressed.
! 118:
! 119: `(clobber X)'
! 120: Represents the storing or possible storing of an unpredictable,
! 121: undescribed value into X, which must be a `reg', `scratch' or
! 122: `mem' expression.
! 123:
! 124: One place this is used is in string instructions that store
! 125: standard values into particular hard registers. It may not be
! 126: worth the trouble to describe the values that are stored, but it
! 127: is essential to inform the compiler that the registers will be
! 128: altered, lest it attempt to keep data in them across the string
! 129: instruction.
1.1.1.7 root 130:
1.1.1.8 ! root 131: If X is `(mem:BLK (const_int 0))', it means that all memory
! 132: locations must be presumed clobbered.
1.1.1.7 root 133:
1.1.1.8 ! root 134: Note that the machine description classifies certain hard
! 135: registers as "call-clobbered". All function call instructions are
! 136: assumed by default to clobber these registers, so there is no need
! 137: to use `clobber' expressions to indicate this fact. Also, each
! 138: function call is assumed to have the potential to alter any memory
! 139: location, unless the function is declared `const'.
! 140:
! 141: If the last group of expressions in a `parallel' are each a
! 142: `clobber' expression whose arguments are `reg' or `match_scratch'
! 143: (*note RTL Template::.) expressions, the combiner phase can add
! 144: the appropriate `clobber' expressions to an insn it has
! 145: constructed when doing so will cause a pattern to be matched.
! 146:
! 147: This feature can be used, for example, on a machine that whose
! 148: multiply and add instructions don't use an MQ register but which
! 149: has an add-accumulate instruction that does clobber the MQ
! 150: register. Similarly, a combined instruction might require a
! 151: temporary register while the constituent instructions might not.
! 152:
! 153: When a `clobber' expression for a register appears inside a
! 154: `parallel' with other side effects, the register allocator
! 155: guarantees that the register is unoccupied both before and after
! 156: that insn. However, the reload phase may allocate a register used
! 157: for one of the inputs unless the `&' constraint is specified for
! 158: the selected alternative (*note Modifiers::.). You can clobber
! 159: either a specific hard register, a pseudo register, or a `scratch'
! 160: expression; in the latter two cases, GNU CC will allocate a hard
! 161: register that is available there for use as a temporary.
! 162:
! 163: For instructions that require a temporary register, you should use
! 164: `scratch' instead of a pseudo-register because this will allow the
! 165: combiner phase to add the `clobber' when required. You do this by
! 166: coding (`clobber' (`match_scratch' ...)). If you do clobber a
! 167: pseudo register, use one which appears nowhere else--generate a
! 168: new one each time. Otherwise, you may confuse CSE.
! 169:
! 170: There is one other known use for clobbering a pseudo register in a
! 171: `parallel': when one of the input operands of the insn is also
! 172: clobbered by the insn. In this case, using the same pseudo
! 173: register in the clobber and elsewhere in the insn produces the
! 174: expected results.
! 175:
! 176: `(use X)'
! 177: Represents the use of the value of X. It indicates that the value
! 178: in X at this point in the program is needed, even though it may
! 179: not be apparent why this is so. Therefore, the compiler will not
! 180: attempt to delete previous instructions whose only effect is to
! 181: store a value in X. X must be a `reg' expression.
! 182:
! 183: During the delayed branch scheduling phase, X may be an insn.
! 184: This indicates that X previously was located at this place in the
! 185: code and its data dependencies need to be taken into account.
! 186: These `use' insns will be deleted before the delayed branch
! 187: scheduling phase exits.
! 188:
! 189: `(parallel [X0 X1 ...])'
! 190: Represents several side effects performed in parallel. The square
! 191: brackets stand for a vector; the operand of `parallel' is a vector
! 192: of expressions. X0, X1 and so on are individual side effect
! 193: expressions--expressions of code `set', `call', `return',
! 194: `clobber' or `use'.
! 195:
! 196: "In parallel" means that first all the values used in the
! 197: individual side-effects are computed, and second all the actual
! 198: side-effects are performed. For example,
! 199:
! 200: (parallel [(set (reg:SI 1) (mem:SI (reg:SI 1)))
! 201: (set (mem:SI (reg:SI 1)) (reg:SI 1))])
! 202:
! 203: says unambiguously that the values of hard register 1 and the
! 204: memory location addressed by it are interchanged. In both places
! 205: where `(reg:SI 1)' appears as a memory address it refers to the
! 206: value in register 1 *before* the execution of the insn.
! 207:
! 208: It follows that it is *incorrect* to use `parallel' and expect the
! 209: result of one `set' to be available for the next one. For
! 210: example, people sometimes attempt to represent a jump-if-zero
! 211: instruction this way:
! 212:
! 213: (parallel [(set (cc0) (reg:SI 34))
! 214: (set (pc) (if_then_else
! 215: (eq (cc0) (const_int 0))
! 216: (label_ref ...)
! 217: (pc)))])
! 218:
! 219: But this is incorrect, because it says that the jump condition
! 220: depends on the condition code value *before* this instruction, not
! 221: on the new value that is set by this instruction.
! 222:
! 223: Peephole optimization, which takes place together with final
! 224: assembly code output, can produce insns whose patterns consist of
! 225: a `parallel' whose elements are the operands needed to output the
! 226: resulting assembler code--often `reg', `mem' or constant
! 227: expressions. This would not be well-formed RTL at any other stage
! 228: in compilation, but it is ok then because no further optimization
! 229: remains to be done. However, the definition of the macro
! 230: `NOTICE_UPDATE_CC', if any, must deal with such insns if you
! 231: define any peephole optimizations.
! 232:
! 233: `(sequence [INSNS ...])'
! 234: Represents a sequence of insns. Each of the INSNS that appears in
! 235: the vector is suitable for appearing in the chain of insns, so it
! 236: must be an `insn', `jump_insn', `call_insn', `code_label',
! 237: `barrier' or `note'.
! 238:
! 239: A `sequence' RTX is never placed in an actual insn during RTL
! 240: generation. It represents the sequence of insns that result from a
! 241: `define_expand' *before* those insns are passed to `emit_insn' to
! 242: insert them in the chain of insns. When actually inserted, the
! 243: individual sub-insns are separated out and the `sequence' is
! 244: forgotten.
! 245:
! 246: After delay-slot scheduling is completed, an insn and all the
! 247: insns that reside in its delay slots are grouped together into a
! 248: `sequence'. The insn requiring the delay slot is the first insn
! 249: in the vector; subsequent insns are to be placed in the delay slot.
! 250:
! 251: `INSN_ANNULLED_BRANCH_P' is set on an insn in a delay slot to
! 252: indicate that a branch insn should be used that will conditionally
! 253: annul the effect of the insns in the delay slots. In such a case,
! 254: `INSN_FROM_TARGET_P' indicates that the insn is from the target of
! 255: the branch and should be executed only if the branch is taken;
! 256: otherwise the insn should be executed only if the branch is not
! 257: taken. *Note Delay Slots::.
! 258:
! 259: These expression codes appear in place of a side effect, as the body
! 260: of an insn, though strictly speaking they do not always describe side
! 261: effects as such:
! 262:
! 263: `(asm_input S)'
! 264: Represents literal assembler code as described by the string S.
! 265:
! 266: `(unspec [OPERANDS ...] INDEX)'
! 267: `(unspec_volatile [OPERANDS ...] INDEX)'
! 268: Represents a machine-specific operation on OPERANDS. INDEX
! 269: selects between multiple machine-specific operations.
! 270: `unspec_volatile' is used for volatile operations and operations
! 271: that may trap; `unspec' is used for other operations.
! 272:
! 273: These codes may appear inside a `pattern' of an insn, inside a
! 274: `parallel', or inside an expression.
! 275:
! 276: `(addr_vec:M [LR0 LR1 ...])'
! 277: Represents a table of jump addresses. The vector elements LR0,
! 278: etc., are `label_ref' expressions. The mode M specifies how much
! 279: space is given to each address; normally M would be `Pmode'.
! 280:
! 281: `(addr_diff_vec:M BASE [LR0 LR1 ...])'
! 282: Represents a table of jump addresses expressed as offsets from
! 283: BASE. The vector elements LR0, etc., are `label_ref' expressions
! 284: and so is BASE. The mode M specifies how much space is given to
! 285: each address-difference.
1.1.1.4 root 286:
287:
1.1.1.8 ! root 288: File: gcc.info, Node: Incdec, Next: Assembler, Prev: Side Effects, Up: RTL
1.1.1.3 root 289:
1.1.1.8 ! root 290: Embedded Side-Effects on Addresses
! 291: ==================================
1.1.1.4 root 292:
1.1.1.8 ! root 293: Four special side-effect expression codes appear as memory addresses.
1.1.1.7 root 294:
1.1.1.8 ! root 295: `(pre_dec:M X)'
! 296: Represents the side effect of decrementing X by a standard amount
! 297: and represents also the value that X has after being decremented.
! 298: x must be a `reg' or `mem', but most machines allow only a `reg'.
! 299: m must be the machine mode for pointers on the machine in use.
! 300: The amount X is decremented by is the length in bytes of the
! 301: machine mode of the containing memory reference of which this
! 302: expression serves as the address. Here is an example of its use:
! 303:
! 304: (mem:DF (pre_dec:SI (reg:SI 39)))
! 305:
! 306: This says to decrement pseudo register 39 by the length of a
! 307: `DFmode' value and use the result to address a `DFmode' value.
! 308:
! 309: `(pre_inc:M X)'
! 310: Similar, but specifies incrementing X instead of decrementing it.
! 311:
! 312: `(post_dec:M X)'
! 313: Represents the same side effect as `pre_dec' but a different
! 314: value. The value represented here is the value X has before being
! 315: decremented.
! 316:
! 317: `(post_inc:M X)'
! 318: Similar, but specifies incrementing X instead of decrementing it.
! 319:
! 320: These embedded side effect expressions must be used with care.
! 321: Instruction patterns may not use them. Until the `flow' pass of the
! 322: compiler, they may occur only to represent pushes onto the stack. The
! 323: `flow' pass finds cases where registers are incremented or decremented
! 324: in one instruction and used as an address shortly before or after;
! 325: these cases are then transformed to use pre- or post-increment or
! 326: -decrement.
! 327:
! 328: If a register used as the operand of these expressions is used in
! 329: another address in an insn, the original value of the register is used.
! 330: Uses of the register outside of an address are not permitted within the
! 331: same insn as a use in an embedded side effect expression because such
! 332: insns behave differently on different machines and hence must be treated
! 333: as ambiguous and disallowed.
! 334:
! 335: An instruction that can be represented with an embedded side effect
! 336: could also be represented using `parallel' containing an additional
! 337: `set' to describe how the address register is altered. This is not
! 338: done because machines that allow these operations at all typically
! 339: allow them wherever a memory address is called for. Describing them as
! 340: additional parallel stores would require doubling the number of entries
! 341: in the machine description.
1.1.1.3 root 342:
343:
1.1.1.8 ! root 344: File: gcc.info, Node: Assembler, Next: Insns, Prev: Incdec, Up: RTL
1.1.1.5 root 345:
1.1.1.8 ! root 346: Assembler Instructions as Expressions
! 347: =====================================
1.1.1.5 root 348:
1.1.1.8 ! root 349: The RTX code `asm_operands' represents a value produced by a
! 350: user-specified assembler instruction. It is used to represent an `asm'
! 351: statement with arguments. An `asm' statement with a single output
! 352: operand, like this:
! 353:
! 354: asm ("foo %1,%2,%0" : "=a" (outputvar) : "g" (x + y), "di" (*z));
! 355:
! 356: is represented using a single `asm_operands' RTX which represents the
! 357: value that is stored in `outputvar':
! 358:
! 359: (set RTX-FOR-OUTPUTVAR
! 360: (asm_operands "foo %1,%2,%0" "a" 0
! 361: [RTX-FOR-ADDITION-RESULT RTX-FOR-*Z]
! 362: [(asm_input:M1 "g")
! 363: (asm_input:M2 "di")]))
! 364:
! 365: Here the operands of the `asm_operands' RTX are the assembler template
! 366: string, the output-operand's constraint, the index-number of the output
! 367: operand among the output operands specified, a vector of input operand
! 368: RTX's, and a vector of input-operand modes and constraints. The mode
! 369: M1 is the mode of the sum `x+y'; M2 is that of `*z'.
! 370:
! 371: When an `asm' statement has multiple output values, its insn has
! 372: several such `set' RTX's inside of a `parallel'. Each `set' contains a
! 373: `asm_operands'; all of these share the same assembler template and
! 374: vectors, but each contains the constraint for the respective output
! 375: operand. They are also distinguished by the output-operand index
! 376: number, which is 0, 1, ... for successive output operands.
1.1.1.7 root 377:
378:
1.1.1.8 ! root 379: File: gcc.info, Node: Insns, Next: Calls, Prev: Assembler, Up: RTL
1.1.1.7 root 380:
1.1.1.8 ! root 381: Insns
! 382: =====
1.1.1.3 root 383:
1.1.1.8 ! root 384: The RTL representation of the code for a function is a doubly-linked
! 385: chain of objects called "insns". Insns are expressions with special
! 386: codes that are used for no other purpose. Some insns are actual
! 387: instructions; others represent dispatch tables for `switch' statements;
! 388: others represent labels to jump to or various sorts of declarative
! 389: information.
! 390:
! 391: In addition to its own specific data, each insn must have a unique
! 392: id-number that distinguishes it from all other insns in the current
! 393: function (after delayed branch scheduling, copies of an insn with the
! 394: same id-number may be present in multiple places in a function, but
! 395: these copies will always be identical and will only appear inside a
! 396: `sequence'), and chain pointers to the preceding and following insns.
! 397: These three fields occupy the same position in every insn, independent
! 398: of the expression code of the insn. They could be accessed with `XEXP'
! 399: and `XINT', but instead three special macros are always used:
! 400:
! 401: `INSN_UID (I)'
! 402: Accesses the unique id of insn I.
! 403:
! 404: `PREV_INSN (I)'
! 405: Accesses the chain pointer to the insn preceding I. If I is the
! 406: first insn, this is a null pointer.
! 407:
! 408: `NEXT_INSN (I)'
! 409: Accesses the chain pointer to the insn following I. If I is the
! 410: last insn, this is a null pointer.
! 411:
! 412: The first insn in the chain is obtained by calling `get_insns'; the
! 413: last insn is the result of calling `get_last_insn'. Within the chain
! 414: delimited by these insns, the `NEXT_INSN' and `PREV_INSN' pointers must
! 415: always correspond: if INSN is not the first insn,
! 416:
! 417: NEXT_INSN (PREV_INSN (INSN)) == INSN
! 418:
! 419: is always true and if INSN is not the last insn,
! 420:
! 421: PREV_INSN (NEXT_INSN (INSN)) == INSN
! 422:
! 423: is always true.
! 424:
! 425: After delay slot scheduling, some of the insns in the chain might be
! 426: `sequence' expressions, which contain a vector of insns. The value of
! 427: `NEXT_INSN' in all but the last of these insns is the next insn in the
! 428: vector; the value of `NEXT_INSN' of the last insn in the vector is the
! 429: same as the value of `NEXT_INSN' for the `sequence' in which it is
! 430: contained. Similar rules apply for `PREV_INSN'.
! 431:
! 432: This means that the above invariants are not necessarily true for
! 433: insns inside `sequence' expressions. Specifically, if INSN is the
! 434: first insn in a `sequence', `NEXT_INSN (PREV_INSN (INSN))' is the insn
! 435: containing the `sequence' expression, as is the value of `PREV_INSN
! 436: (NEXT_INSN (INSN))' is INSN is the last insn in the `sequence'
! 437: expression. You can use these expressions to find the containing
! 438: `sequence' expression.
! 439:
! 440: Every insn has one of the following six expression codes:
! 441:
! 442: `insn'
! 443: The expression code `insn' is used for instructions that do not
! 444: jump and do not do function calls. `sequence' expressions are
! 445: always contained in insns with code `insn' even if one of those
! 446: insns should jump or do function calls.
! 447:
! 448: Insns with code `insn' have four additional fields beyond the three
! 449: mandatory ones listed above. These four are described in a table
! 450: below.
! 451:
! 452: `jump_insn'
! 453: The expression code `jump_insn' is used for instructions that may
! 454: jump (or, more generally, may contain `label_ref' expressions). If
! 455: there is an instruction to return from the current function, it is
! 456: recorded as a `jump_insn'.
! 457:
! 458: `jump_insn' insns have the same extra fields as `insn' insns,
! 459: accessed in the same way and in addition contain a field
! 460: `JUMP_LABEL' which is defined once jump optimization has completed.
! 461:
! 462: For simple conditional and unconditional jumps, this field
! 463: contains the `code_label' to which this insn will (possibly
! 464: conditionally) branch. In a more complex jump, `JUMP_LABEL'
! 465: records one of the labels that the insn refers to; the only way to
! 466: find the others is to scan the entire body of the insn.
! 467:
! 468: Return insns count as jumps, but since they do not refer to any
! 469: labels, they have zero in the `JUMP_LABEL' field.
! 470:
! 471: `call_insn'
! 472: The expression code `call_insn' is used for instructions that may
! 473: do function calls. It is important to distinguish these
! 474: instructions because they imply that certain registers and memory
! 475: locations may be altered unpredictably.
! 476:
! 477: `call_insn' insns have the same extra fields as `insn' insns,
! 478: accessed in the same way and in addition contain a field
! 479: `CALL_INSN_FUNCTION_USAGE', which contains a list (chain of
! 480: `expr_list' expressions) containing `use' and `clobber'
! 481: expressions that denote hard registers used or clobbered by the
! 482: called function. A register specified in a `clobber' in this list
! 483: is modified *after* the execution of the `call_insn', while a
! 484: register in a `clobber' in the body of the `call_insn' is
! 485: clobbered before the insn completes execution. `clobber'
! 486: expressions in this list augment registers specified in
! 487: `CALL_USED_REGISTERS' (*note Register Basics::.).
! 488:
! 489: `code_label'
! 490: A `code_label' insn represents a label that a jump insn can jump
! 491: to. It contains two special fields of data in addition to the
! 492: three standard ones. `CODE_LABEL_NUMBER' is used to hold the
! 493: "label number", a number that identifies this label uniquely among
! 494: all the labels in the compilation (not just in the current
! 495: function). Ultimately, the label is represented in the assembler
! 496: output as an assembler label, usually of the form `LN' where N is
! 497: the label number.
! 498:
! 499: When a `code_label' appears in an RTL expression, it normally
! 500: appears within a `label_ref' which represents the address of the
! 501: label, as a number.
! 502:
! 503: The field `LABEL_NUSES' is only defined once the jump optimization
! 504: phase is completed and contains the number of times this label is
! 505: referenced in the current function.
! 506:
! 507: `barrier'
! 508: Barriers are placed in the instruction stream when control cannot
! 509: flow past them. They are placed after unconditional jump
! 510: instructions to indicate that the jumps are unconditional and
! 511: after calls to `volatile' functions, which do not return (e.g.,
! 512: `exit'). They contain no information beyond the three standard
! 513: fields.
! 514:
! 515: `note'
! 516: `note' insns are used to represent additional debugging and
! 517: declarative information. They contain two nonstandard fields, an
! 518: integer which is accessed with the macro `NOTE_LINE_NUMBER' and a
! 519: string accessed with `NOTE_SOURCE_FILE'.
! 520:
! 521: If `NOTE_LINE_NUMBER' is positive, the note represents the
! 522: position of a source line and `NOTE_SOURCE_FILE' is the source
! 523: file name that the line came from. These notes control generation
! 524: of line number data in the assembler output.
! 525:
! 526: Otherwise, `NOTE_LINE_NUMBER' is not really a line number but a
! 527: code with one of the following values (and `NOTE_SOURCE_FILE' must
! 528: contain a null pointer):
! 529:
! 530: `NOTE_INSN_DELETED'
! 531: Such a note is completely ignorable. Some passes of the
! 532: compiler delete insns by altering them into notes of this
! 533: kind.
! 534:
! 535: `NOTE_INSN_BLOCK_BEG'
! 536: `NOTE_INSN_BLOCK_END'
! 537: These types of notes indicate the position of the beginning
! 538: and end of a level of scoping of variable names. They
! 539: control the output of debugging information.
! 540:
! 541: `NOTE_INSN_LOOP_BEG'
! 542: `NOTE_INSN_LOOP_END'
! 543: These types of notes indicate the position of the beginning
! 544: and end of a `while' or `for' loop. They enable the loop
! 545: optimizer to find loops quickly.
! 546:
! 547: `NOTE_INSN_LOOP_CONT'
! 548: Appears at the place in a loop that `continue' statements
! 549: jump to.
! 550:
! 551: `NOTE_INSN_LOOP_VTOP'
! 552: This note indicates the place in a loop where the exit test
! 553: begins for those loops in which the exit test has been
! 554: duplicated. This position becomes another virtual start of
! 555: the loop when considering loop invariants.
! 556:
! 557: `NOTE_INSN_FUNCTION_END'
! 558: Appears near the end of the function body, just before the
! 559: label that `return' statements jump to (on machine where a
! 560: single instruction does not suffice for returning). This
! 561: note may be deleted by jump optimization.
! 562:
! 563: `NOTE_INSN_SETJMP'
! 564: Appears following each call to `setjmp' or a related function.
! 565:
! 566: These codes are printed symbolically when they appear in debugging
! 567: dumps.
! 568:
! 569: The machine mode of an insn is normally `VOIDmode', but some phases
! 570: use the mode for various purposes; for example, the reload pass sets it
! 571: to `HImode' if the insn needs reloading but not register elimination
! 572: and `QImode' if both are required. The common subexpression
! 573: elimination pass sets the mode of an insn to `QImode' when it is the
! 574: first insn in a block that has already been processed.
! 575:
! 576: Here is a table of the extra fields of `insn', `jump_insn' and
! 577: `call_insn' insns:
! 578:
! 579: `PATTERN (I)'
! 580: An expression for the side effect performed by this insn. This
! 581: must be one of the following codes: `set', `call', `use',
! 582: `clobber', `return', `asm_input', `asm_output', `addr_vec',
! 583: `addr_diff_vec', `trap_if', `unspec', `unspec_volatile',
! 584: `parallel', or `sequence'. If it is a `parallel', each element of
! 585: the `parallel' must be one these codes, except that `parallel'
! 586: expressions cannot be nested and `addr_vec' and `addr_diff_vec'
! 587: are not permitted inside a `parallel' expression.
! 588:
! 589: `INSN_CODE (I)'
! 590: An integer that says which pattern in the machine description
! 591: matches this insn, or -1 if the matching has not yet been
! 592: attempted.
! 593:
! 594: Such matching is never attempted and this field remains -1 on an
! 595: insn whose pattern consists of a single `use', `clobber',
! 596: `asm_input', `addr_vec' or `addr_diff_vec' expression.
! 597:
! 598: Matching is also never attempted on insns that result from an `asm'
! 599: statement. These contain at least one `asm_operands' expression.
! 600: The function `asm_noperands' returns a non-negative value for such
! 601: insns.
! 602:
! 603: In the debugging output, this field is printed as a number
! 604: followed by a symbolic representation that locates the pattern in
! 605: the `md' file as some small positive or negative offset from a
! 606: named pattern.
! 607:
! 608: `LOG_LINKS (I)'
! 609: A list (chain of `insn_list' expressions) giving information about
! 610: dependencies between instructions within a basic block. Neither a
! 611: jump nor a label may come between the related insns.
! 612:
! 613: `REG_NOTES (I)'
! 614: A list (chain of `expr_list' and `insn_list' expressions) giving
! 615: miscellaneous information about the insn. It is often information
! 616: pertaining to the registers used in this insn.
! 617:
! 618: The `LOG_LINKS' field of an insn is a chain of `insn_list'
! 619: expressions. Each of these has two operands: the first is an insn, and
! 620: the second is another `insn_list' expression (the next one in the
! 621: chain). The last `insn_list' in the chain has a null pointer as second
! 622: operand. The significant thing about the chain is which insns appear
! 623: in it (as first operands of `insn_list' expressions). Their order is
! 624: not significant.
! 625:
! 626: This list is originally set up by the flow analysis pass; it is a
! 627: null pointer until then. Flow only adds links for those data
! 628: dependencies which can be used for instruction combination. For each
! 629: insn, the flow analysis pass adds a link to insns which store into
! 630: registers values that are used for the first time in this insn. The
! 631: instruction scheduling pass adds extra links so that every dependence
! 632: will be represented. Links represent data dependencies,
! 633: antidependencies and output dependencies; the machine mode of the link
! 634: distinguishes these three types: antidependencies have mode
! 635: `REG_DEP_ANTI', output dependencies have mode `REG_DEP_OUTPUT', and
! 636: data dependencies have mode `VOIDmode'.
! 637:
! 638: The `REG_NOTES' field of an insn is a chain similar to the
! 639: `LOG_LINKS' field but it includes `expr_list' expressions in addition
! 640: to `insn_list' expressions. There are several kinds of register notes,
! 641: which are distinguished by the machine mode, which in a register note
! 642: is really understood as being an `enum reg_note'. The first operand OP
! 643: of the note is data whose meaning depends on the kind of note.
! 644:
! 645: The macro `REG_NOTE_KIND (X)' returns the kind of register note.
! 646: Its counterpart, the macro `PUT_REG_NOTE_KIND (X, NEWKIND)' sets the
! 647: register note type of X to be NEWKIND.
! 648:
! 649: Register notes are of three classes: They may say something about an
! 650: input to an insn, they may say something about an output of an insn, or
! 651: they may create a linkage between two insns. There are also a set of
! 652: values that are only used in `LOG_LINKS'.
! 653:
! 654: These register notes annotate inputs to an insn:
! 655:
! 656: `REG_DEAD'
! 657: The value in OP dies in this insn; that is to say, altering the
! 658: value immediately after this insn would not affect the future
! 659: behavior of the program.
! 660:
! 661: This does not necessarily mean that the register OP has no useful
! 662: value after this insn since it may also be an output of the insn.
! 663: In such a case, however, a `REG_DEAD' note would be redundant and
! 664: is usually not present until after the reload pass, but no code
! 665: relies on this fact.
! 666:
! 667: `REG_INC'
! 668: The register OP is incremented (or decremented; at this level
! 669: there is no distinction) by an embedded side effect inside this
! 670: insn. This means it appears in a `post_inc', `pre_inc',
! 671: `post_dec' or `pre_dec' expression.
! 672:
! 673: `REG_NONNEG'
! 674: The register OP is known to have a nonnegative value when this
! 675: insn is reached. This is used so that decrement and branch until
! 676: zero instructions, such as the m68k dbra, can be matched.
! 677:
! 678: The `REG_NONNEG' note is added to insns only if the machine
! 679: description has a `decrement_and_branch_until_zero' pattern.
! 680:
! 681: `REG_NO_CONFLICT'
! 682: This insn does not cause a conflict between OP and the item being
! 683: set by this insn even though it might appear that it does. In
! 684: other words, if the destination register and OP could otherwise be
! 685: assigned the same register, this insn does not prevent that
! 686: assignment.
! 687:
! 688: Insns with this note are usually part of a block that begins with a
! 689: `clobber' insn specifying a multi-word pseudo register (which will
! 690: be the output of the block), a group of insns that each set one
! 691: word of the value and have the `REG_NO_CONFLICT' note attached,
! 692: and a final insn that copies the output to itself with an attached
! 693: `REG_EQUAL' note giving the expression being computed. This block
! 694: is encapsulated with `REG_LIBCALL' and `REG_RETVAL' notes on the
! 695: first and last insns, respectively.
! 696:
! 697: `REG_LABEL'
! 698: This insn uses OP, a `code_label', but is not a `jump_insn'. The
! 699: presence of this note allows jump optimization to be aware that OP
! 700: is, in fact, being used.
! 701:
! 702: The following notes describe attributes of outputs of an insn:
! 703:
! 704: `REG_EQUIV'
! 705: `REG_EQUAL'
! 706: This note is only valid on an insn that sets only one register and
! 707: indicates that that register will be equal to OP at run time; the
! 708: scope of this equivalence differs between the two types of notes.
! 709: The value which the insn explicitly copies into the register may
! 710: look different from OP, but they will be equal at run time. If the
! 711: output of the single `set' is a `strict_low_part' expression, the
! 712: note refers to the register that is contained in `SUBREG_REG' of
! 713: the `subreg' expression.
! 714:
! 715: For `REG_EQUIV', the register is equivalent to OP throughout the
! 716: entire function, and could validly be replaced in all its
! 717: occurrences by OP. ("Validly" here refers to the data flow of the
! 718: program; simple replacement may make some insns invalid.) For
! 719: example, when a constant is loaded into a register that is never
! 720: assigned any other value, this kind of note is used.
! 721:
! 722: When a parameter is copied into a pseudo-register at entry to a
! 723: function, a note of this kind records that the register is
! 724: equivalent to the stack slot where the parameter was passed.
! 725: Although in this case the register may be set by other insns, it
! 726: is still valid to replace the register by the stack slot
! 727: throughout the function.
! 728:
! 729: In the case of `REG_EQUAL', the register that is set by this insn
! 730: will be equal to OP at run time at the end of this insn but not
! 731: necessarily elsewhere in the function. In this case, OP is
! 732: typically an arithmetic expression. For example, when a sequence
! 733: of insns such as a library call is used to perform an arithmetic
! 734: operation, this kind of note is attached to the insn that produces
! 735: or copies the final value.
! 736:
! 737: These two notes are used in different ways by the compiler passes.
! 738: `REG_EQUAL' is used by passes prior to register allocation (such as
! 739: common subexpression elimination and loop optimization) to tell
! 740: them how to think of that value. `REG_EQUIV' notes are used by
! 741: register allocation to indicate that there is an available
! 742: substitute expression (either a constant or a `mem' expression for
! 743: the location of a parameter on the stack) that may be used in
! 744: place of a register if insufficient registers are available.
! 745:
! 746: Except for stack homes for parameters, which are indicated by a
! 747: `REG_EQUIV' note and are not useful to the early optimization
! 748: passes and pseudo registers that are equivalent to a memory
! 749: location throughout there entire life, which is not detected until
! 750: later in the compilation, all equivalences are initially indicated
! 751: by an attached `REG_EQUAL' note. In the early stages of register
! 752: allocation, a `REG_EQUAL' note is changed into a `REG_EQUIV' note
! 753: if OP is a constant and the insn represents the only set of its
! 754: destination register.
! 755:
! 756: Thus, compiler passes prior to register allocation need only check
! 757: for `REG_EQUAL' notes and passes subsequent to register allocation
! 758: need only check for `REG_EQUIV' notes.
! 759:
! 760: `REG_UNUSED'
! 761: The register OP being set by this insn will not be used in a
! 762: subsequent insn. This differs from a `REG_DEAD' note, which
! 763: indicates that the value in an input will not be used subsequently.
! 764: These two notes are independent; both may be present for the same
! 765: register.
1.1.1.7 root 766:
1.1.1.8 ! root 767: `REG_WAS_0'
! 768: The single output of this insn contained zero before this insn.
! 769: OP is the insn that set it to zero. You can rely on this note if
! 770: it is present and OP has not been deleted or turned into a `note';
! 771: its absence implies nothing.
! 772:
! 773: These notes describe linkages between insns. They occur in pairs:
! 774: one insn has one of a pair of notes that points to a second insn, which
! 775: has the inverse note pointing back to the first insn.
! 776:
! 777: `REG_RETVAL'
! 778: This insn copies the value of a multi-insn sequence (for example, a
! 779: library call), and OP is the first insn of the sequence (for a
! 780: library call, the first insn that was generated to set up the
! 781: arguments for the library call).
! 782:
! 783: Loop optimization uses this note to treat such a sequence as a
! 784: single operation for code motion purposes and flow analysis uses
! 785: this note to delete such sequences whose results are dead.
! 786:
! 787: A `REG_EQUAL' note will also usually be attached to this insn to
! 788: provide the expression being computed by the sequence.
! 789:
! 790: `REG_LIBCALL'
! 791: This is the inverse of `REG_RETVAL': it is placed on the first
! 792: insn of a multi-insn sequence, and it points to the last one.
! 793:
! 794: `REG_CC_SETTER'
! 795: `REG_CC_USER'
! 796: On machines that use `cc0', the insns which set and use `cc0' set
! 797: and use `cc0' are adjacent. However, when branch delay slot
! 798: filling is done, this may no longer be true. In this case a
! 799: `REG_CC_USER' note will be placed on the insn setting `cc0' to
! 800: point to the insn using `cc0' and a `REG_CC_SETTER' note will be
! 801: placed on the insn using `cc0' to point to the insn setting `cc0'.
! 802:
! 803: These values are only used in the `LOG_LINKS' field, and indicate
! 804: the type of dependency that each link represents. Links which indicate
! 805: a data dependence (a read after write dependence) do not use any code,
! 806: they simply have mode `VOIDmode', and are printed without any
! 807: descriptive text.
! 808:
! 809: `REG_DEP_ANTI'
! 810: This indicates an anti dependence (a write after read dependence).
! 811:
! 812: `REG_DEP_OUTPUT'
! 813: This indicates an output dependence (a write after write
! 814: dependence).
! 815:
! 816: For convenience, the machine mode in an `insn_list' or `expr_list'
! 817: is printed using these symbolic codes in debugging dumps.
! 818:
! 819: The only difference between the expression codes `insn_list' and
! 820: `expr_list' is that the first operand of an `insn_list' is assumed to
! 821: be an insn and is printed in debugging dumps as the insn's unique id;
! 822: the first operand of an `expr_list' is printed in the ordinary way as
! 823: an expression.
1.1.1.3 root 824:
1.1.1.4 root 825:
1.1.1.8 ! root 826: File: gcc.info, Node: Calls, Next: Sharing, Prev: Insns, Up: RTL
1.1.1.7 root 827:
1.1.1.8 ! root 828: RTL Representation of Function-Call Insns
! 829: =========================================
1.1.1.5 root 830:
1.1.1.8 ! root 831: Insns that call subroutines have the RTL expression code `call_insn'.
! 832: These insns must satisfy special rules, and their bodies must use a
! 833: special RTL expression code, `call'.
! 834:
! 835: A `call' expression has two operands, as follows:
! 836:
! 837: (call (mem:FM ADDR) NBYTES)
! 838:
! 839: Here NBYTES is an operand that represents the number of bytes of
! 840: argument data being passed to the subroutine, FM is a machine mode
! 841: (which must equal as the definition of the `FUNCTION_MODE' macro in the
! 842: machine description) and ADDR represents the address of the subroutine.
! 843:
! 844: For a subroutine that returns no value, the `call' expression as
! 845: shown above is the entire body of the insn, except that the insn might
! 846: also contain `use' or `clobber' expressions.
! 847:
! 848: For a subroutine that returns a value whose mode is not `BLKmode',
! 849: the value is returned in a hard register. If this register's number is
! 850: R, then the body of the call insn looks like this:
! 851:
! 852: (set (reg:M R)
! 853: (call (mem:FM ADDR) NBYTES))
! 854:
! 855: This RTL expression makes it clear (to the optimizer passes) that the
! 856: appropriate register receives a useful value in this insn.
! 857:
! 858: When a subroutine returns a `BLKmode' value, it is handled by
! 859: passing to the subroutine the address of a place to store the value.
! 860: So the call insn itself does not "return" any value, and it has the
! 861: same RTL form as a call that returns nothing.
! 862:
! 863: On some machines, the call instruction itself clobbers some register,
! 864: for example to contain the return address. `call_insn' insns on these
! 865: machines should have a body which is a `parallel' that contains both
! 866: the `call' expression and `clobber' expressions that indicate which
! 867: registers are destroyed. Similarly, if the call instruction requires
! 868: some register other than the stack pointer that is not explicitly
! 869: mentioned it its RTL, a `use' subexpression should mention that
! 870: register.
! 871:
! 872: Functions that are called are assumed to modify all registers listed
! 873: in the configuration macro `CALL_USED_REGISTERS' (*note Register
! 874: Basics::.) and, with the exception of `const' functions and library
! 875: calls, to modify all of memory.
! 876:
! 877: Insns containing just `use' expressions directly precede the
! 878: `call_insn' insn to indicate which registers contain inputs to the
! 879: function. Similarly, if registers other than those in
! 880: `CALL_USED_REGISTERS' are clobbered by the called function, insns
! 881: containing a single `clobber' follow immediately after the call to
! 882: indicate which registers.
1.1.1.3 root 883:
1.1.1.5 root 884:
1.1.1.8 ! root 885: File: gcc.info, Node: Sharing, Next: Reading RTL, Prev: Calls, Up: RTL
1.1.1.7 root 886:
1.1.1.8 ! root 887: Structure Sharing Assumptions
! 888: =============================
1.1.1.7 root 889:
1.1.1.8 ! root 890: The compiler assumes that certain kinds of RTL expressions are
! 891: unique; there do not exist two distinct objects representing the same
! 892: value. In other cases, it makes an opposite assumption: that no RTL
! 893: expression object of a certain kind appears in more than one place in
! 894: the containing structure.
! 895:
! 896: These assumptions refer to a single function; except for the RTL
! 897: objects that describe global variables and external functions, and a
! 898: few standard objects such as small integer constants, no RTL objects
! 899: are common to two functions.
! 900:
! 901: * Each pseudo-register has only a single `reg' object to represent
! 902: it, and therefore only a single machine mode.
! 903:
! 904: * For any symbolic label, there is only one `symbol_ref' object
! 905: referring to it.
! 906:
! 907: * There is only one `const_int' expression with value 0, only one
! 908: with value 1, and only one with value -1. Some other integer
! 909: values are also stored uniquely.
! 910:
! 911: * There is only one `pc' expression.
! 912:
! 913: * There is only one `cc0' expression.
! 914:
! 915: * There is only one `const_double' expression with value 0 for each
! 916: floating point mode. Likewise for values 1 and 2.
! 917:
! 918: * No `label_ref' or `scratch' appears in more than one place in the
! 919: RTL structure; in other words, it is safe to do a tree-walk of all
! 920: the insns in the function and assume that each time a `label_ref'
! 921: or `scratch' is seen it is distinct from all others that are seen.
! 922:
! 923: * Only one `mem' object is normally created for each static variable
! 924: or stack slot, so these objects are frequently shared in all the
! 925: places they appear. However, separate but equal objects for these
! 926: variables are occasionally made.
! 927:
! 928: * When a single `asm' statement has multiple output operands, a
! 929: distinct `asm_operands' expression is made for each output operand.
! 930: However, these all share the vector which contains the sequence of
! 931: input operands. This sharing is used later on to test whether two
! 932: `asm_operands' expressions come from the same statement, so all
! 933: optimizations must carefully preserve the sharing if they copy the
! 934: vector at all.
! 935:
! 936: * No RTL object appears in more than one place in the RTL structure
! 937: except as described above. Many passes of the compiler rely on
! 938: this by assuming that they can modify RTL objects in place without
! 939: unwanted side-effects on other insns.
! 940:
! 941: * During initial RTL generation, shared structure is freely
! 942: introduced. After all the RTL for a function has been generated,
! 943: all shared structure is copied by `unshare_all_rtl' in
! 944: `emit-rtl.c', after which the above rules are guaranteed to be
! 945: followed.
! 946:
! 947: * During the combiner pass, shared structure within an insn can exist
! 948: temporarily. However, the shared structure is copied before the
! 949: combiner is finished with the insn. This is done by calling
! 950: `copy_rtx_if_shared', which is a subroutine of `unshare_all_rtl'.
1.1.1.7 root 951:
1.1.1.8 ! root 952:
! 953: File: gcc.info, Node: Reading RTL, Prev: Sharing, Up: RTL
1.1.1.7 root 954:
1.1.1.8 ! root 955: Reading RTL
! 956: ===========
1.1.1.7 root 957:
1.1.1.8 ! root 958: To read an RTL object from a file, call `read_rtx'. It takes one
! 959: argument, a stdio stream, and returns a single RTL object.
1.1.1.7 root 960:
1.1.1.8 ! root 961: Reading RTL from a file is very slow. This is not currently a
! 962: problem since reading RTL occurs only as part of building the compiler.
1.1.1.7 root 963:
1.1.1.8 ! root 964: People frequently have the idea of using RTL stored as text in a
! 965: file as an interface between a language front end and the bulk of GNU
! 966: CC. This idea is not feasible.
1.1.1.7 root 967:
1.1.1.8 ! root 968: GNU CC was designed to use RTL internally only. Correct RTL for a
! 969: given program is very dependent on the particular target machine. And
! 970: the RTL does not contain all the information about the program.
1.1.1.7 root 971:
1.1.1.8 ! root 972: The proper way to interface GNU CC to a new language front end is
! 973: with the "tree" data structure. There is no manual for this data
! 974: structure, but it is described in the files `tree.h' and `tree.def'.
1.1.1.7 root 975:
1.1.1.8 ! root 976:
! 977: File: gcc.info, Node: Machine Desc, Next: Target Macros, Prev: RTL, Up: Top
1.1.1.7 root 978:
1.1.1.8 ! root 979: Machine Descriptions
! 980: ********************
1.1.1.7 root 981:
1.1.1.8 ! root 982: A machine description has two parts: a file of instruction patterns
! 983: (`.md' file) and a C header file of macro definitions.
1.1.1.7 root 984:
1.1.1.8 ! root 985: The `.md' file for a target machine contains a pattern for each
! 986: instruction that the target machine supports (or at least each
! 987: instruction that is worth telling the compiler about). It may also
! 988: contain comments. A semicolon causes the rest of the line to be a
! 989: comment, unless the semicolon is inside a quoted string.
1.1.1.7 root 990:
1.1.1.8 ! root 991: See the next chapter for information on the C header file.
1.1.1.7 root 992:
1.1.1.8 ! root 993: * Menu:
1.1.1.7 root 994:
1.1.1.8 ! root 995: * Patterns:: How to write instruction patterns.
! 996: * Example:: An explained example of a `define_insn' pattern.
! 997: * RTL Template:: The RTL template defines what insns match a pattern.
! 998: * Output Template:: The output template says how to make assembler code
! 999: from such an insn.
! 1000: * Output Statement:: For more generality, write C code to output
! 1001: the assembler code.
! 1002: * Constraints:: When not all operands are general operands.
! 1003: * Standard Names:: Names mark patterns to use for code generation.
! 1004: * Pattern Ordering:: When the order of patterns makes a difference.
! 1005: * Dependent Patterns:: Having one pattern may make you need another.
! 1006: * Jump Patterns:: Special considerations for patterns for jump insns.
! 1007: * Insn Canonicalizations::Canonicalization of Instructions
! 1008: * Peephole Definitions::Defining machine-specific peephole optimizations.
! 1009: * Expander Definitions::Generating a sequence of several RTL insns
! 1010: for a standard operation.
! 1011: * Insn Splitting:: Splitting Instructions into Multiple Instructions
! 1012: * Insn Attributes:: Specifying the value of attributes for generated insns.
1.1.1.7 root 1013:
1.1.1.8 ! root 1014:
! 1015: File: gcc.info, Node: Patterns, Next: Example, Up: Machine Desc
1.1.1.7 root 1016:
1.1.1.8 ! root 1017: Everything about Instruction Patterns
! 1018: =====================================
1.1.1.7 root 1019:
1.1.1.8 ! root 1020: Each instruction pattern contains an incomplete RTL expression, with
! 1021: pieces to be filled in later, operand constraints that restrict how the
! 1022: pieces can be filled in, and an output pattern or C code to generate
! 1023: the assembler output, all wrapped up in a `define_insn' expression.
! 1024:
! 1025: A `define_insn' is an RTL expression containing four or five
! 1026: operands:
! 1027:
! 1028: 1. An optional name. The presence of a name indicate that this
! 1029: instruction pattern can perform a certain standard job for the
! 1030: RTL-generation pass of the compiler. This pass knows certain
! 1031: names and will use the instruction patterns with those names, if
! 1032: the names are defined in the machine description.
! 1033:
! 1034: The absence of a name is indicated by writing an empty string
! 1035: where the name should go. Nameless instruction patterns are never
! 1036: used for generating RTL code, but they may permit several simpler
! 1037: insns to be combined later on.
! 1038:
! 1039: Names that are not thus known and used in RTL-generation have no
! 1040: effect; they are equivalent to no name at all.
! 1041:
! 1042: 2. The "RTL template" (*note RTL Template::.) is a vector of
! 1043: incomplete RTL expressions which show what the instruction should
! 1044: look like. It is incomplete because it may contain
! 1045: `match_operand', `match_operator', and `match_dup' expressions
! 1046: that stand for operands of the instruction.
! 1047:
! 1048: If the vector has only one element, that element is the template
! 1049: for the instruction pattern. If the vector has multiple elements,
! 1050: then the instruction pattern is a `parallel' expression containing
! 1051: the elements described.
! 1052:
! 1053: 3. A condition. This is a string which contains a C expression that
! 1054: is the final test to decide whether an insn body matches this
! 1055: pattern.
! 1056:
! 1057: For a named pattern, the condition (if present) may not depend on
! 1058: the data in the insn being matched, but only the
! 1059: target-machine-type flags. The compiler needs to test these
! 1060: conditions during initialization in order to learn exactly which
! 1061: named instructions are available in a particular run.
! 1062:
! 1063: For nameless patterns, the condition is applied only when matching
! 1064: an individual insn, and only after the insn has matched the
! 1065: pattern's recognition template. The insn's operands may be found
! 1066: in the vector `operands'.
! 1067:
! 1068: 4. The "output template": a string that says how to output matching
! 1069: insns as assembler code. `%' in this string specifies where to
! 1070: substitute the value of an operand. *Note Output Template::.
1.1.1.7 root 1071:
1.1.1.8 ! root 1072: When simple substitution isn't general enough, you can specify a
! 1073: piece of C code to compute the output. *Note Output Statement::.
1.1.1.7 root 1074:
1.1.1.8 ! root 1075: 5. Optionally, a vector containing the values of attributes for insns
! 1076: matching this pattern. *Note Insn Attributes::.
1.1.1.7 root 1077:
1.1.1.8 ! root 1078:
! 1079: File: gcc.info, Node: Example, Next: RTL Template, Prev: Patterns, Up: Machine Desc
1.1.1.7 root 1080:
1.1.1.8 ! root 1081: Example of `define_insn'
! 1082: ========================
1.1.1.7 root 1083:
1.1.1.8 ! root 1084: Here is an actual example of an instruction pattern, for the
! 1085: 68000/68020.
1.1.1.7 root 1086:
1.1.1.8 ! root 1087: (define_insn "tstsi"
! 1088: [(set (cc0)
! 1089: (match_operand:SI 0 "general_operand" "rm"))]
! 1090: ""
! 1091: "*
! 1092: { if (TARGET_68020 || ! ADDRESS_REG_P (operands[0]))
! 1093: return \"tstl %0\";
! 1094: return \"cmpl #0,%0\"; }")
! 1095:
! 1096: This is an instruction that sets the condition codes based on the
! 1097: value of a general operand. It has no condition, so any insn whose RTL
! 1098: description has the form shown may be handled according to this
! 1099: pattern. The name `tstsi' means "test a `SImode' value" and tells the
! 1100: RTL generation pass that, when it is necessary to test such a value, an
! 1101: insn to do so can be constructed using this pattern.
! 1102:
! 1103: The output control string is a piece of C code which chooses which
! 1104: output template to return based on the kind of operand and the specific
! 1105: type of CPU for which code is being generated.
1.1.1.7 root 1106:
1.1.1.8 ! root 1107: `"rm"' is an operand constraint. Its meaning is explained below.
1.1 root 1108:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.