Annotation of gcc/gcc.info-4, revision 1.1

1.1     ! root        1: Info file gcc.info, produced by Makeinfo, -*- Text -*- from input
        !             2: file gcc.texinfo.
        !             3: 
        !             4: This file documents the use and the internals of the GNU compiler.
        !             5: 
        !             6: Copyright (C) 1988 Free Software Foundation, Inc.
        !             7: 
        !             8: Permission is granted to make and distribute verbatim copies of this
        !             9: manual provided the copyright notice and this permission notice are
        !            10: preserved on all copies.
        !            11: 
        !            12: Permission is granted to copy and distribute modified versions of
        !            13: this manual under the conditions for verbatim copying, provided also
        !            14: that the section entitled ``GNU CC General Public License'' is
        !            15: included exactly as in the original, and provided that the entire
        !            16: resulting derived work is distributed under the terms of a permission
        !            17: notice identical to this one.
        !            18: 
        !            19: Permission is granted to copy and distribute translations of this
        !            20: manual into another language, under the above conditions for modified
        !            21: versions, except that the section entitled ``GNU CC General Public
        !            22: License'' and this permission notice may be included in translations
        !            23: approved by the Free Software Foundation instead of in the original
        !            24: English.
        !            25: 
        !            26: 
        !            27: 
        !            28: File: gcc.info,  Node: Comparisons,  Next: Bit Fields,  Prev: Arithmetic,  Up: RTL
        !            29: 
        !            30: Comparison Operations
        !            31: =====================
        !            32: 
        !            33: Comparison operators test a relation on two operands and are
        !            34: considered to represent the value 1 if the relation holds, or zero if
        !            35: it does not.  The mode of the comparison is determined by the
        !            36: operands; they must both be valid for a common machine mode.  A
        !            37: comparison with both operands constant would be invalid as the
        !            38: machine mode could not be deduced from it, but such a comparison
        !            39: should never exist in RTL due to constant folding.
        !            40: 
        !            41: Inequality comparisons come in two flavors, signed and unsigned. 
        !            42: Thus, there are distinct expression codes `gt' and `gtu' for signed
        !            43: and unsigned greater-than.  These can produce different results for
        !            44: the same pair of integer values: for example, 1 is signed
        !            45: greater-than -1 but not unsigned greater-than, because -1 when
        !            46: regarded as unsigned is actually `0xffffffff' which is greater than 1.
        !            47: 
        !            48: The signed comparisons are also used for floating point values. 
        !            49: Floating point comparisons are distinguished by the machine modes of
        !            50: the operands.
        !            51: 
        !            52: The comparison operators may be used to compare the condition codes
        !            53: `(cc0)' against zero, as in `(eq (cc0) (const_int 0))'.  Such a
        !            54: construct actually refers to the result of the preceding instruction
        !            55: in which the condition codes were set.  The above example stands for
        !            56: 1 if the condition codes were set to say ``zero'' or ``equal'', 0
        !            57: otherwise.  Although the same comparison operators are used for this
        !            58: as may be used in other contexts on actual data, no confusion can
        !            59: result since the machine description would never allow both kinds of
        !            60: uses in the same context.
        !            61: 
        !            62: `(eq X Y)'
        !            63:      1 if the values represented by X and Y are equal, otherwise 0.
        !            64: 
        !            65: `(ne X Y)'
        !            66:      1 if the values represented by X and Y are not equal, otherwise 0.
        !            67: 
        !            68: `(gt X Y)'
        !            69:      1 if the X is greater than Y.  If they are fixed-point, the
        !            70:      comparison is done in a signed sense.
        !            71: 
        !            72: `(gtu X Y)'
        !            73:      Like `gt' but does unsigned comparison, on fixed-point numbers
        !            74:      only.
        !            75: 
        !            76: `(lt X Y)'
        !            77: `(ltu X Y)'
        !            78:      Like `gt' and `gtu' but test for ``less than''.
        !            79: 
        !            80: `(ge X Y)'
        !            81: `(geu X Y)'
        !            82:      Like `gt' and `gtu' but test for ``greater than or equal''.
        !            83: 
        !            84: `(le X Y)'
        !            85: `(leu X Y)'
        !            86:      Like `gt' and `gtu' but test for ``less than or equal''.
        !            87: 
        !            88: `(if_then_else COND THEN ELSE)'
        !            89:      This is not a comparison operation but is listed here because it
        !            90:      is always used in conjunction with a comparison operation.  To
        !            91:      be precise, COND is a comparison expression.  This expression
        !            92:      represents a choice, according to COND, between the value
        !            93:      represented by THEN and the one represented by ELSE.
        !            94: 
        !            95:      On most machines, `if_then_else' expressions are valid only to
        !            96:      express conditional jumps.
        !            97: 
        !            98: 
        !            99: 
        !           100: File: gcc.info,  Node: Bit Fields,  Next: Conversions,  Prev: Comparisons,  Up: RTL
        !           101: 
        !           102: Bit-fields
        !           103: ==========
        !           104: 
        !           105: Special expression codes exist to represent bit-field instructions. 
        !           106: These types of expressions are lvalues in RTL; they may appear on the
        !           107: left side of a assignment, indicating insertion of a value into the
        !           108: specified bit field.
        !           109: 
        !           110: `(sign_extract:SI LOC SIZE POS)'
        !           111:      This represents a reference to a sign-extended bit-field
        !           112:      contained or starting in LOC (a memory or register reference). 
        !           113:      The bit field is SIZE bits wide and starts at bit POS.  The
        !           114:      compilation option `BITS_BIG_ENDIAN' says which end of the
        !           115:      memory unit POS counts from.
        !           116: 
        !           117:      Which machine modes are valid for LOC depends on the machine,
        !           118:      but typically LOC should be a single byte when in memory or a
        !           119:      full word in a register.
        !           120: 
        !           121: `(zero_extract:SI LOC SIZE POS)'
        !           122:      Like `sign_extract' but refers to an unsigned or zero-extended
        !           123:      bit field.  The same sequence of bits are extracted, but they
        !           124:      are filled to an entire word with zeros instead of by
        !           125:      sign-extension.
        !           126: 
        !           127: 
        !           128: 
        !           129: File: gcc.info,  Node: Conversions,  Next: RTL Declarations,  Prev: Bit Fields,  Up: RTL
        !           130: 
        !           131: Conversions
        !           132: ===========
        !           133: 
        !           134: All conversions between machine modes must be represented by explicit
        !           135: conversion operations.  For example, an expression which is the sum
        !           136: of a byte and a full word cannot be written as `(plus:SI (reg:QI 34)
        !           137: (reg:SI 80))' because the `plus' operation requires two operands of
        !           138: the same machine mode.  Therefore, the byte-sized operand is enclosed
        !           139: in a conversion operation, as in
        !           140: 
        !           141:      (plus:SI (sign_extend:SI (reg:QI 34)) (reg:SI 80))
        !           142: 
        !           143: The conversion operation is not a mere placeholder, because there may
        !           144: be more than one way of converting from a given starting mode to the
        !           145: desired final mode.  The conversion operation code says how to do it.
        !           146: 
        !           147: `(sign_extend:M X)'
        !           148:      Represents the result of sign-extending the value X to machine
        !           149:      mode M.  M must be a fixed-point mode and X a fixed-point value
        !           150:      of a mode narrower than M.
        !           151: 
        !           152: `(zero_extend:M X)'
        !           153:      Represents the result of zero-extending the value X to machine
        !           154:      mode M.  M must be a fixed-point mode and X a fixed-point value
        !           155:      of a mode narrower than M.
        !           156: 
        !           157: `(float_extend:M X)'
        !           158:      Represents the result of extending the value X to machine mode
        !           159:      M.  M must be a floating point mode and X a floating point value
        !           160:      of a mode narrower than M.
        !           161: 
        !           162: `(truncate:M X)'
        !           163:      Represents the result of truncating the value X to machine mode
        !           164:      M.  M must be a fixed-point mode and X a fixed-point value of a
        !           165:      mode wider than M.
        !           166: 
        !           167: `(float_truncate:M X)'
        !           168:      Represents the result of truncating the value X to machine mode
        !           169:      M.  M must be a floating point mode and X a floating point value
        !           170:      of a mode wider than M.
        !           171: 
        !           172: `(float:M X)'
        !           173:      Represents the result of converting fixed point value X,
        !           174:      regarded as signed, to floating point mode M.
        !           175: 
        !           176: `(unsigned_float:M X)'
        !           177:      Represents the result of converting fixed point value X,
        !           178:      regarded as unsigned, to floating point mode M.
        !           179: 
        !           180: `(fix:M X)'
        !           181:      When M is a fixed point mode, represents the result of
        !           182:      converting floating point value X to mode M, regarded as signed.
        !           183:      How rounding is done is not specified, so this operation may be
        !           184:      used validly in compiling C code only for integer-valued operands.
        !           185: 
        !           186: `(unsigned_fix:M X)'
        !           187:      Represents the result of converting floating point value X to
        !           188:      fixed point mode M, regarded as unsigned.  How rounding is done
        !           189:      is not specified.
        !           190: 
        !           191: `(fix:M X)'
        !           192:      When M is a floating point mode, represents the result of
        !           193:      converting floating point value X (valid for mode M) to an
        !           194:      integer, still represented in floating point mode M, by rounding
        !           195:      towards zero.
        !           196: 
        !           197: 
        !           198: 
        !           199: File: gcc.info,  Node: RTL Declarations,  Next: Side Effects,  Prev: Conversions,  Up: RTL
        !           200: 
        !           201: Declarations
        !           202: ============
        !           203: 
        !           204: Declaration expression codes do not represent arithmetic operations
        !           205: but rather state assertions about their operands.
        !           206: 
        !           207: `(strict_low_part (subreg:M (reg:N R) 0))'
        !           208:      This expression code is used in only one context: operand 0 of a
        !           209:      `set' expression.  In addition, the operand of this expression
        !           210:      must be a `subreg' expression.
        !           211: 
        !           212:      The presence of `strict_low_part' says that the part of the
        !           213:      register which is meaningful in mode N, but is not part of mode
        !           214:      M, is not to be altered.  Normally, an assignment to such a
        !           215:      subreg is allowed to have undefined effects on the rest of the
        !           216:      register when M is less than a word.
        !           217: 
        !           218: 
        !           219: 
        !           220: File: gcc.info,  Node: Side Effects,  Next: Incdec,  Prev: RTL Declarations,  Up: RTL
        !           221: 
        !           222: Side Effect Expressions
        !           223: =======================
        !           224: 
        !           225: The expression codes described so far represent values, not actions. 
        !           226: But machine instructions never produce values; they are meaningful
        !           227: only for their side effects on the state of the machine.  Special
        !           228: expression codes are used to represent side effects.
        !           229: 
        !           230: The body of an instruction is always one of these side effect codes;
        !           231: the codes described above, which represent values, appear only as the
        !           232: operands of these.
        !           233: 
        !           234: `(set LVAL X)'
        !           235:      Represents the action of storing the value of X into the place
        !           236:      represented by LVAL.  LVAL must be an expression representing a
        !           237:      place that can be stored in: `reg' (or `subreg' or
        !           238:      `strict_low_part'), `mem', `pc' or `cc0'.
        !           239: 
        !           240:      If LVAL is a `reg', `subreg' or `mem', it has a machine mode;
        !           241:      then X must be valid for that mode.
        !           242: 
        !           243:      If LVAL is a `reg' whose machine mode is less than the full
        !           244:      width of the register, then it means that the part of the
        !           245:      register specified by the machine mode is given the specified
        !           246:      value and the rest of the register receives an undefined value. 
        !           247:      Likewise, if LVAL is a `subreg' whose machine mode is narrower
        !           248:      than `SImode', the rest of the register can be changed in an
        !           249:      undefined way.
        !           250: 
        !           251:      If LVAL is a `strict_low_part' of a `subreg', then the part of
        !           252:      the register specified by the machine mode of the `subreg' is
        !           253:      given the value X and the rest of the register is not changed.
        !           254: 
        !           255:      If LVAL is `(cc0)', it has no machine mode, and X may have any
        !           256:      mode.  This represents a ``test'' or ``compare'' instruction.
        !           257: 
        !           258:      If LVAL is `(pc)', we have a jump instruction, and the
        !           259:      possibilities for X are very limited.  It may be a `label_ref'
        !           260:      expression (unconditional jump).  It may be an `if_then_else'
        !           261:      (conditional jump), in which case either the second or the third
        !           262:      operand must be `(pc)' (for the case which does not jump) and
        !           263:      the other of the two must be a `label_ref' (for the case which
        !           264:      does jump).  X may also be a `mem' or `(plus:SI (pc) Y)', where
        !           265:      Y may be a `reg' or a `mem'; these unusual patterns are used to
        !           266:      represent jumps through branch tables.
        !           267: 
        !           268: `(return)'
        !           269:      Represents a return from the current function, on machines where
        !           270:      this can be done with one instruction, such as Vaxes.  On
        !           271:      machines where a multi-instruction ``epilogue'' must be executed
        !           272:      in order to return from the function, returning is done by
        !           273:      jumping to a label which precedes the epilogue, and the `return'
        !           274:      expression code is never used.
        !           275: 
        !           276: `(call FUNCTION NARGS)'
        !           277:      Represents a function call.  FUNCTION is a `mem' expression
        !           278:      whose address is the address of the function to be called. 
        !           279:      NARGS is an expression which can be used for two purposes: on
        !           280:      some machines it represents the number of bytes of stack
        !           281:      argument; on others, it represents the number of argument
        !           282:      registers.
        !           283: 
        !           284:      Each machine has a standard machine mode which FUNCTION must
        !           285:      have.  The machine description defines macro `FUNCTION_MODE' to
        !           286:      expand into the requisite mode name.  The purpose of this mode
        !           287:      is to specify what kind of addressing is allowed, on machines
        !           288:      where the allowed kinds of addressing depend on the machine mode
        !           289:      being addressed.
        !           290: 
        !           291: `(clobber X)'
        !           292:      Represents the storing or possible storing of an unpredictable,
        !           293:      undescribed value into X, which must be a `reg' or `mem'
        !           294:      expression.
        !           295: 
        !           296:      One place this is used is in string instructions that store
        !           297:      standard values into particular hard registers.  It may not be
        !           298:      worth the trouble to describe the values that are stored, but it
        !           299:      is essential to inform the compiler that the registers will be
        !           300:      altered, lest it attempt to keep data in them across the string
        !           301:      instruction.
        !           302: 
        !           303:      X may also be null--a null C pointer, no expression at all. 
        !           304:      Such a `(clobber (null))' expression means that all memory
        !           305:      locations must be presumed clobbered.
        !           306: 
        !           307:      Note that the machine description classifies certain hard
        !           308:      registers as ``call-clobbered''.  All function call instructions
        !           309:      are assumed by default to clobber these registers, so there is
        !           310:      no need to use `clobber' expressions to indicate this fact. 
        !           311:      Also, each function call is assumed to have the potential to
        !           312:      alter any memory location.
        !           313: 
        !           314: `(use X)'
        !           315:      Represents the use of the value of X.  It indicates that the
        !           316:      value in X at this point in the program is needed, even though
        !           317:      it may not be apparent why this is so.  Therefore, the compiler
        !           318:      will not attempt to delete instructions whose only effect is to
        !           319:      store a value in X.  X must be a `reg' expression.
        !           320: 
        !           321: `(parallel [X0 X1 ...])'
        !           322:      Represents several side effects performed in parallel.  The
        !           323:      square brackets stand for a vector; the operand of `parallel' is
        !           324:      a vector of expressions.  X0, X1 and so on are individual side
        !           325:      effects--expressions of code `set', `call', `return', `clobber'
        !           326:      or `use'.
        !           327: 
        !           328:      ``In parallel'' means that first all the values used in the
        !           329:      individual side-effects are computed, and second all the actual
        !           330:      side-effects are performed.  For example,
        !           331: 
        !           332:           (parallel [(set (reg:SI 1) (mem:SI (reg:SI 1)))
        !           333:                      (set (mem:SI (reg:SI 1)) (reg:SI 1))])
        !           334: 
        !           335:      says unambiguously that the values of hard register 1 and the
        !           336:      memory location addressed by it are interchanged.  In both
        !           337:      places where `(reg:SI 1)' appears as a memory address it refers
        !           338:      to the value in register 1 *before* the execution of the
        !           339:      instruction.
        !           340: 
        !           341:      Peephole optimization, which takes place in the last
        !           342:      jump-optimization pass, can produce insns whose patterns consist
        !           343:      of a `parallel' whose elements are the operands needed to output
        !           344:      the resulting assembler code--often `reg', `mem' or constant
        !           345:      expressions.  This would not be well-formed RTL at any other
        !           346:      stage in compilation, but it is ok then because no further
        !           347:      optimization remains to be done.  However, the definition of the
        !           348:      macro `NOTICE_UPDATE_CC' may need to deal with such insns.
        !           349: 
        !           350: `(sequence [INSNS ...])'
        !           351:      Represents a sequence of insns.  Each of the INSNS that appears
        !           352:      in the vector is suitable for appearing in the chain of insns,
        !           353:      so it must be an `insn', `jump_insn', `call_insn', `code_label',
        !           354:      `barrier' or `note'.
        !           355: 
        !           356:      A `sequence' RTX never appears in an actual insn.  It represents
        !           357:      the sequence of insns that result from a `define_expand'
        !           358:      *before* those insns are passed to `emit_insn' to insert them in
        !           359:      the chain of insns.  When actually inserted, the individual
        !           360:      sub-insns are separated out and the `sequence' is forgotten.
        !           361: 
        !           362: Three expression codes appear in place of a side effect, as the body
        !           363: of an insn, though strictly speaking they do not describe side
        !           364: effects as such:
        !           365: 
        !           366: `(asm_input S)'
        !           367:      Represents literal assembler code as described by the string S.
        !           368: 
        !           369: `(addr_vec:M [LR0 LR1 ...])'
        !           370:      Represents a table of jump addresses.  The vector elements LR0,
        !           371:      etc., are `label_ref' expressions.  The mode M specifies how
        !           372:      much space is given to each address; normally M would be `Pmode'.
        !           373: 
        !           374: `(addr_diff_vec:M BASE [LR0 LR1 ...])'
        !           375:      Represents a table of jump addresses expressed as offsets from
        !           376:      BASE.  The vector elements LR0, etc., are `label_ref'
        !           377:      expressions and so is BASE.  The mode M specifies how much space
        !           378:      is given to each address-difference.
        !           379: 
        !           380: 
        !           381: 
        !           382: File: gcc.info,  Node: Incdec,  Next: Assembler,  Prev: Side Effects,  Up: RTL
        !           383: 
        !           384: Embedded Side-Effects on Addresses
        !           385: ==================================
        !           386: 
        !           387: Four special side-effect expression codes appear as memory addresses.
        !           388: 
        !           389: `(pre_dec:M X)'
        !           390:      Represents the side effect of decrementing X by a standard
        !           391:      amount and represents also the value that X has after being
        !           392:      decremented.  X must be a `reg' or `mem', but most machines
        !           393:      allow only a `reg'.  M must be the machine mode for pointers on
        !           394:      the machine in use.  The amount X is decremented by is the
        !           395:      length in bytes of the machine mode of the containing memory
        !           396:      reference of which this expression serves as the address.  Here
        !           397:      is an example of its use:
        !           398: 
        !           399:           (mem:DF (pre_dec:SI (reg:SI 39)))
        !           400: 
        !           401:      This says to decrement pseudo register 39 by the length of a
        !           402:      `DFmode' value and use the result to address a `DFmode' value.
        !           403: 
        !           404: `(pre_inc:M X)'
        !           405:      Similar, but specifies incrementing X instead of decrementing it.
        !           406: 
        !           407: `(post_dec:M X)'
        !           408:      Represents the same side effect as `pre_decrement' but a
        !           409:      different value.  The value represented here is the value X has
        !           410:      before being decremented.
        !           411: 
        !           412: `(post_inc:M X)'
        !           413:      Similar, but specifies incrementing X instead of decrementing it.
        !           414: 
        !           415: These embedded side effect expressions must be used with care. 
        !           416: Instruction patterns may not use them.  Until the `flow' pass of the
        !           417: compiler, they may occur only to represent pushes onto the stack. 
        !           418: The `flow' pass finds cases where registers are incremented or
        !           419: decremented in one instruction and used as an address shortly before
        !           420: or after; these cases are then transformed to use pre- or
        !           421: post-increment or -decrement.
        !           422: 
        !           423: Explicit popping of the stack could be represented with these
        !           424: embedded side effect operators, but that would not be safe; the
        !           425: instruction combination pass could move the popping past pushes, thus
        !           426: changing the meaning of the code.
        !           427: 
        !           428: An instruction that can be represented with an embedded side effect
        !           429: could also be represented using `parallel' containing an additional
        !           430: `set' to describe how the address register is altered.  This is not
        !           431: done because machines that allow these operations at all typically
        !           432: allow them wherever a memory address is called for.  Describing them
        !           433: as additional parallel stores would require doubling the number of
        !           434: entries in the machine description.
        !           435: 
        !           436: 
        !           437: 
        !           438: File: gcc.info,  Node: Assembler,  Next: Insns,  Prev: IncDec,  Up: RTL
        !           439: 
        !           440: Assembler Instructions as Expressions
        !           441: =====================================
        !           442: 
        !           443: The RTX code `asm_operands' represents a value produced by a
        !           444: user-specified assembler instruction.  It is used to represent an
        !           445: `asm' statement with arguments.  An `asm' statement with a single
        !           446: output operand, like this:
        !           447: 
        !           448:      asm ("foo %1,%2,%0" : "a" (outputvar) : "g" (x + y), "di" (*z));
        !           449: 
        !           450: is represented using a single `asm_operands' RTX which represents the
        !           451: value that is stored in `outputvar':
        !           452: 
        !           453:      (set RTX-FOR-OUTPUTVAR
        !           454:           (asm_operands "foo %1,%2,%0" "a" 0
        !           455:                         [RTX-FOR-ADDITION-RESULT RTX-FOR-*Z]
        !           456:                         [(asm_input:M1 "g")
        !           457:                          (asm_input:M2 "di")]))
        !           458: 
        !           459: Here the operands of the `asm_operands' RTX are the assembler
        !           460: template string, the output-operand's constraint, the index-number of
        !           461: the output operand among the output operands specified, a vector of
        !           462: input operand RTX's, and a vector of input-operand modes and
        !           463: constraints.  The mode M1 is the mode of the sum `x+y'; M2 is that of
        !           464: `*z'.
        !           465: 
        !           466: When an `asm' statement has multiple output values, its insn has
        !           467: several such `set' RTX's inside of a `parallel'.  Each `set' contains
        !           468: a `asm_operands'; all of these share the same assembler template and
        !           469: vectors, but each contains the constraint for the respective output
        !           470: operand.  They are also distinguished by the output-operand index
        !           471: number, which is 0, 1, ... for successive output operands.
        !           472: 
        !           473: 
        !           474: 
        !           475: File: gcc.info,  Node: Insns,  Next: Calls,  Prev: Assembler,  Up: RTL
        !           476: 
        !           477: Insns
        !           478: =====
        !           479: 
        !           480: The RTL representation of the code for a function is a doubly-linked
        !           481: chain of objects called "insns".  Insns are expressions with special
        !           482: codes that are used for no other purpose.  Some insns are actual
        !           483: instructions; others represent dispatch tables for `switch'
        !           484: statements; others represent labels to jump to or various sorts of
        !           485: declarative information.
        !           486: 
        !           487: In addition to its own specific data, each insn must have a unique
        !           488: id-number that distinguishes it from all other insns in the current
        !           489: function, and chain pointers to the preceding and following insns. 
        !           490: These three fields occupy the same position in every insn,
        !           491: independent of the expression code of the insn.  They could be
        !           492: accessed with `XEXP' and `XINT', but instead three special macros are
        !           493: always used:
        !           494: 
        !           495: `INSN_UID (I)'
        !           496:      Accesses the unique id of insn I.
        !           497: 
        !           498: `PREV_INSN (I)'
        !           499:      Accesses the chain pointer to the insn preceding I.  If I is the
        !           500:      first insn, this is a null pointer.
        !           501: 
        !           502: `NEXT_INSN (I)'
        !           503:      Accesses the chain pointer to the insn following I.  If I is the
        !           504:      last insn, this is a null pointer.
        !           505: 
        !           506: The `NEXT_INSN' and `PREV_INSN' pointers must always correspond: if I
        !           507: is not the first insn,
        !           508: 
        !           509:      NEXT_INSN (PREV_INSN (INSN)) == INSN
        !           510: 
        !           511: is always true.
        !           512: 
        !           513: Every insn has one of the following six expression codes:
        !           514: 
        !           515: `insn'
        !           516:      The expression code `insn' is used for instructions that do not
        !           517:      jump and do not do function calls.  Insns with code `insn' have
        !           518:      four additional fields beyond the three mandatory ones listed
        !           519:      above.  These four are described in a table below.
        !           520: 
        !           521: `jump_insn'
        !           522:      The expression code `jump_insn' is used for instructions that
        !           523:      may jump (or, more generally, may contain `label_ref'
        !           524:      expressions).  `jump_insn' insns have the same extra fields as
        !           525:      `insn' insns, accessed in the same way.
        !           526: 
        !           527: `call_insn'
        !           528:      The expression code `call_insn' is used for instructions that
        !           529:      may do function calls.  It is important to distinguish these
        !           530:      instructions because they imply that certain registers and
        !           531:      memory locations may be altered unpredictably.
        !           532: 
        !           533:      `call_insn' insns have the same extra fields as `insn' insns,
        !           534:      accessed in the same way.
        !           535: 
        !           536: `code_label'
        !           537:      A `code_label' insn represents a label that a jump insn can jump
        !           538:      to.  It contains one special field of data in addition to the
        !           539:      three standard ones.  It is used to hold the "label number", a
        !           540:      number that identifies this label uniquely among all the labels
        !           541:      in the compilation (not just in the current function). 
        !           542:      Ultimately, the label is represented in the assembler output as
        !           543:      an assembler label `LN' where N is the label number.
        !           544: 
        !           545: `barrier'
        !           546:      Barriers are placed in the instruction stream after
        !           547:      unconditional jump instructions to indicate that the jumps are
        !           548:      unconditional.  They contain no information beyond the three
        !           549:      standard fields.
        !           550: 
        !           551: `note'
        !           552:      `note' insns are used to represent additional debugging and
        !           553:      declarative information.  They contain two nonstandard fields,
        !           554:      an integer which is accessed with the macro `NOTE_LINE_NUMBER'
        !           555:      and a string accessed with `NOTE_SOURCE_FILE'.
        !           556: 
        !           557:      If `NOTE_LINE_NUMBER' is positive, the note represents the
        !           558:      position of a source line and `NOTE_SOURCE_FILE' is the source
        !           559:      file name that the line came from.  These notes control
        !           560:      generation of line number data in the assembler output.
        !           561: 
        !           562:      Otherwise, `NOTE_LINE_NUMBER' is not really a line number but a
        !           563:      code with one of the following values (and `NOTE_SOURCE_FILE'
        !           564:      must contain a null pointer):
        !           565: 
        !           566:     `NOTE_INSN_DELETED'
        !           567:           Such a note is completely ignorable.  Some passes of the
        !           568:           compiler delete insns by altering them into notes of this
        !           569:           kind.
        !           570: 
        !           571:     `NOTE_INSN_BLOCK_BEG'
        !           572:     `NOTE_INSN_BLOCK_END'
        !           573:           These types of notes indicate the position of the beginning
        !           574:           and end of a level of scoping of variable names.  They
        !           575:           control the output of debugging information.
        !           576: 
        !           577:     `NOTE_INSN_LOOP_BEG'
        !           578:     `NOTE_INSN_LOOP_END'
        !           579:           These types of notes indicate the position of the beginning
        !           580:           and end of a `while' or `for' loop.  They enable the loop
        !           581:           optimizer to find loops quickly.
        !           582: 
        !           583: Here is a table of the extra fields of `insn', `jump_insn' and
        !           584: `call_insn' insns:
        !           585: 
        !           586: `PATTERN (I)'
        !           587:      An expression for the side effect performed by this insn.
        !           588: 
        !           589: `REG_NOTES (I)'
        !           590:      A list (chain of `expr_list' expressions) giving information
        !           591:      about the usage of registers in this insn.  This list is set up
        !           592:      by the flow analysis pass; it is a null pointer until then.
        !           593: 
        !           594: `LOG_LINKS (I)'
        !           595:      A list (chain of `insn_list' expressions) of previous
        !           596:      ``related'' insns: insns which store into registers values that
        !           597:      are used for the first time in this insn.  (An additional
        !           598:      constraint is that neither a jump nor a label may come between
        !           599:      the related insns).  This list is set up by the flow analysis
        !           600:      pass; it is a null pointer until then.
        !           601: 
        !           602: `INSN_CODE (I)'
        !           603:      An integer that says which pattern in the machine description
        !           604:      matches this insn, or -1 if the matching has not yet been
        !           605:      attempted.
        !           606: 
        !           607:      Such matching is never attempted and this field is not used on
        !           608:      an insn whose pattern consists of a single `use', `clobber',
        !           609:      `asm', `addr_vec' or `addr_diff_vec' expression.
        !           610: 
        !           611: The `LOG_LINKS' field of an insn is a chain of `insn_list'
        !           612: expressions.  Each of these has two operands: the first is an insn,
        !           613: and the second is another `insn_list' expression (the next one in the
        !           614: chain).  The last `insn_list' in the chain has a null pointer as
        !           615: second operand.  The significant thing about the chain is which insns
        !           616: appear in it (as first operands of `insn_list' expressions).  Their
        !           617: order is not significant.
        !           618: 
        !           619: The `REG_NOTES' field of an insn is a similar chain but of
        !           620: `expr_list' expressions instead of `insn_list'.  There are four kinds
        !           621: of register notes, which are distinguished by the machine mode of the
        !           622: `expr_list', which a register note is really understood as being an
        !           623: `enum reg_note'.  The first operand OP of the `expr_list' is data
        !           624: whose meaning depends on the kind of note.  Here are the four kinds:
        !           625: 
        !           626: `REG_DEAD'
        !           627:      The register OP dies in this insn; that is to say, altering the
        !           628:      value immediately after this insn would not affect the future
        !           629:      behavior of the program.
        !           630: 
        !           631: `REG_INC'
        !           632:      The register OP is incremented (or decremented; at this level
        !           633:      there is no distinction) by an embedded side effect inside this
        !           634:      insn.  This means it appears in a `POST_INC', `PRE_INC',
        !           635:      `POST_DEC' or `PRE_DEC' RTX.
        !           636: 
        !           637: `REG_EQUIV'
        !           638:      The register that is set by this insn will be equal to OP at run
        !           639:      time, and could validly be replaced in all its occurrences by
        !           640:      OP.  (``Validly'' here refers to the data flow of the program;
        !           641:      simple replacement may make some insns invalid.)
        !           642: 
        !           643:      The value which the insn explicitly copies into the register may
        !           644:      look different from OP, but they will be equal at run time.
        !           645: 
        !           646:      For example, when a constant is loaded into a register that is
        !           647:      never assigned any other value, this kind of note is used.
        !           648: 
        !           649:      When a parameter is copied into a pseudo-register at entry to a
        !           650:      function, a note of this kind records that the register is
        !           651:      equivalent to the stack slot where the parameter was passed. 
        !           652:      Although in this case the register may be set by other insns, it
        !           653:      is still valid to replace the register by the stack slot
        !           654:      throughout the function.
        !           655: 
        !           656: `REG_EQUAL'
        !           657:      The register that is set by this insn will be equal to OP at run
        !           658:      time at the end of this insn (but not necessarily elsewhere in
        !           659:      the function).
        !           660: 
        !           661:      The RTX OP is typically an arithmetic expression.  For example,
        !           662:      when a sequence of insns such as a library call is used to
        !           663:      perform an arithmetic operation, this kind of note is attached
        !           664:      to the insn that produces or copies the final value.  It tells
        !           665:      the CSE pass how to think of that value.
        !           666: 
        !           667: `REG_RETVAL'
        !           668:      This insn copies the value of a library call, and OP is the
        !           669:      first insn that was generated to set up the arguments for the
        !           670:      library call.
        !           671: 
        !           672:      Flow analysis uses this note to delete all of a library call
        !           673:      whose result is dead.
        !           674: 
        !           675: `REG_WAS_0'
        !           676:      The register OP contained zero before this insn.  You can rely
        !           677:      on this note if it is present; its absence implies nothing.
        !           678: 
        !           679: `REG_LIBCALL'
        !           680:      This is the inverse of `REG_RETVAL': it is placed on the first
        !           681:      insn of a library call, and it points to the last one.
        !           682: 
        !           683:      Loop optimization uses this note to move an entire library call
        !           684:      out of a loop when its value is constant.
        !           685: 
        !           686: `REG_NONNEG'
        !           687:      The register OP is known to have nonnegative value when this
        !           688:      insn is reached.
        !           689: 
        !           690: (The only difference between the expression codes `insn_list' and
        !           691: `expr_list' is that the first operand of an `insn_list' is assumed to
        !           692: be an insn and is printed in debugging dumps as the insn's unique id;
        !           693: the first operand of an `expr_list' is printed in the ordinary way as
        !           694: an expression.)
        !           695: 
        !           696: 
        !           697: 
        !           698: File: gcc.info,  Node: Calls,  Next: Sharing,  Prev: Insns,  Up: RTL
        !           699: 
        !           700: RTL Representation of Function-Call Insns
        !           701: =========================================
        !           702: 
        !           703: Insns that call subroutines have the RTL expression code `call_insn'.
        !           704: These insns must satisfy special rules, and their bodies must use a
        !           705: special RTL expression code, `call'.
        !           706: 
        !           707: A `call' expression has two operands, as follows:
        !           708: 
        !           709:      (call NBYTES (mem:FM ADDR))
        !           710: 
        !           711: Here NBYTES is an operand that represents the number of bytes of
        !           712: argument data being passed to the subroutine, FM is a machine mode
        !           713: (which must equal as the definition of the `FUNCTION_MODE' macro in
        !           714: the machine description) and ADDR represents the address of the
        !           715: subroutine.
        !           716: 
        !           717: For a subroutine that returns no value, the `call' RTX as shown above
        !           718: is the entire body of the insn.
        !           719: 
        !           720: For a subroutine that returns a value whose mode is not `BLKmode',
        !           721: the value is returned in a hard register.  If this register's number
        !           722: is R, then the body of the call insn looks like this:
        !           723: 
        !           724:      (set (reg:M R)
        !           725:           (call NBYTES (mem:FM ADDR)))
        !           726: 
        !           727: This RTL expression makes it clear (to the optimizer passes) that the
        !           728: appropriate register receives a useful value in this insn.
        !           729: 
        !           730: Immediately after RTL generation, if the value of the subroutine is
        !           731: actually used, this call insn is always followed closely by an insn
        !           732: which refers to the register R.  This remains true through all the
        !           733: optimizer passes until cross jumping occurs.
        !           734: 
        !           735: The following insn has one of two forms.  Either it copies the value
        !           736: into a pseudo-register, like this:
        !           737: 
        !           738:      (set (reg:M P) (reg:M R))
        !           739: 
        !           740: or (in the case where the calling function will simply return
        !           741: whatever value the call produced, and no operation is needed to do
        !           742: this):
        !           743: 
        !           744:      (use (reg:M R))
        !           745: 
        !           746: Between the call insn and this following insn there may intervene
        !           747: only a stack-adjustment insn (and perhaps some `note' insns).
        !           748: 
        !           749: When a subroutine returns a `BLKmode' value, it is handled by passing
        !           750: to the subroutine the address of a place to store the value.  So the
        !           751: call insn itself does not ``return'' any value, and it has the same
        !           752: RTL form as a call that returns nothing.
        !           753: 
        !           754: 
        !           755: 
        !           756: File: gcc.info,  Node: Sharing,  Prev: Calls,  Up: RTL
        !           757: 
        !           758: Structure Sharing Assumptions
        !           759: =============================
        !           760: 
        !           761: The compiler assumes that certain kinds of RTL expressions are
        !           762: unique; there do not exist two distinct objects representing the same
        !           763: value.  In other cases, it makes an opposite assumption: that no RTL
        !           764: expression object of a certain kind appears in more than one place in
        !           765: the containing structure.
        !           766: 
        !           767: These assumptions refer to a single function; except for the RTL
        !           768: objects that describe global variables and external functions, no RTL
        !           769: objects are common to two functions.
        !           770: 
        !           771:    * Each pseudo-register has only a single `reg' object to represent
        !           772:      it, and therefore only a single machine mode.
        !           773: 
        !           774:    * For any symbolic label, there is only one `symbol_ref' object
        !           775:      referring to it.
        !           776: 
        !           777:    * There is only one `const_int' expression with value zero, and
        !           778:      only one with value one.
        !           779: 
        !           780:    * There is only one `pc' expression.
        !           781: 
        !           782:    * There is only one `cc0' expression.
        !           783: 
        !           784:    * There is only one `const_double' expression with mode `SFmode'
        !           785:      and value zero, and only one with mode `DFmode' and value zero.
        !           786: 
        !           787:    * No `label_ref' appears in more than one place in the RTL
        !           788:      structure; in other words, it is safe to do a tree-walk of all
        !           789:      the insns in the function and assume that each time a
        !           790:      `label_ref' is seen it is distinct from all others that are seen.
        !           791: 
        !           792:    * Only one `mem' object is normally created for each static
        !           793:      variable or stack slot, so these objects are frequently shared
        !           794:      in all the places they appear.  However, separate but equal
        !           795:      objects for these variables are occasionally made.
        !           796: 
        !           797:    * No RTL object appears in more than one place in the RTL
        !           798:      structure except as described above.  Many passes of the
        !           799:      compiler rely on this by assuming that they can modify RTL
        !           800:      objects in place without unwanted side-effects on other insns.
        !           801: 
        !           802:    * During initial RTL generation, shared structure is freely
        !           803:      introduced.  After all the RTL for a function has been
        !           804:      generated, all shared structure is copied by `unshare_all_rtl'
        !           805:      in `emit-rtl.c', after which the above rules are guaranteed to
        !           806:      be followed.
        !           807: 
        !           808:    * During the combiner pass, shared structure with an insn can
        !           809:      exist temporarily.  However, the shared structure is copied
        !           810:      before the combiner is finished with the insn.  This is done by
        !           811:      `copy_substitutions' in `combine.c'.
        !           812: 
        !           813: 
        !           814: 
        !           815: File: gcc.info,  Node: Machine Desc,  Next: Machine Macros,  Prev: RTL,  Up: Top
        !           816: 
        !           817: Machine Descriptions
        !           818: ********************
        !           819: 
        !           820: A machine description has two parts: a file of instruction patterns
        !           821: (`.md' file) and a C header file of macro definitions.
        !           822: 
        !           823: The `.md' file for a target machine contains a pattern for each
        !           824: instruction that the target machine supports (or at least each
        !           825: instruction that is worth telling the compiler about).  It may also
        !           826: contain comments.  A semicolon causes the rest of the line to be a
        !           827: comment, unless the semicolon is inside a quoted string.
        !           828: 
        !           829: See the next chapter for information on the C header file.
        !           830: 
        !           831: * Menu:
        !           832: 
        !           833: * Patterns::            How to write instruction patterns.
        !           834: * Example::             An explained example of a `define_insn' pattern.
        !           835: * RTL Template::        The RTL template defines what insns match a pattern.
        !           836: * Output Template::     The output template says how to make assembler code
        !           837:                           from such an insn.
        !           838: * Output Statement::    For more generality, write C code to output 
        !           839:                           the assembler code.
        !           840: * Constraints::         When not all operands are general operands.
        !           841: * Standard Names::      Names mark patterns to use for code generation.
        !           842: * Pattern Ordering::    When the order of patterns makes a difference.
        !           843: * Dependent Patterns::  Having one pattern may make you need another.
        !           844: * Jump Patterns::       Special considerations for patterns for jump insns.
        !           845: * Peephole Definitions::Defining machine-specific peephole optimizations.
        !           846: * Expander Definitions::Generating a sequence of several RTL insns
        !           847:                          for a standard operation.
        !           848: 
        !           849:  
        !           850: 
        !           851: File: gcc.info,  Node: Patterns,  Next: Example,  Prev: Machine Desc,  Up: Machine Desc
        !           852: 
        !           853: Everything about Instruction Patterns
        !           854: =====================================
        !           855: 
        !           856: Each instruction pattern contains an incomplete RTL expression, with
        !           857: pieces to be filled in later, operand constraints that restrict how
        !           858: the pieces can be filled in, and an output pattern or C code to
        !           859: generate the assembler output, all wrapped up in a `define_insn'
        !           860: expression.
        !           861: 
        !           862: A `define_insn' is an RTL expression containing four or five operands:
        !           863: 
        !           864:   1. An optional name.  The presence of a name indicate that this
        !           865:      instruction pattern can perform a certain standard job for the
        !           866:      RTL-generation pass of the compiler.  This pass knows certain
        !           867:      names and will use the instruction patterns with those names, if
        !           868:      the names are defined in the machine description.
        !           869: 
        !           870:      The absence of a name is indicated by writing an empty string
        !           871:      where the name should go.  Nameless instruction patterns are
        !           872:      never used for generating RTL code, but they may permit several
        !           873:      simpler insns to be combined later on.
        !           874: 
        !           875:      Names that are not thus known and used in RTL-generation have no
        !           876:      effect; they are equivalent to no name at all.
        !           877: 
        !           878:   2. The "RTL template" (*note RTL Template::.) is a vector of
        !           879:      incomplete RTL expressions which show what the instruction
        !           880:      should look like.  It is incomplete because it may contain
        !           881:      `match_operand' and `match_dup' expressions that stand for
        !           882:      operands of the instruction.
        !           883: 
        !           884:      If the vector has only one element, that element is what the
        !           885:      instruction should look like.  If the vector has multiple
        !           886:      elements, then the instruction looks like a `parallel'
        !           887:      expression containing that many elements as described.
        !           888: 
        !           889:   3. A condition.  This is a string which contains a C expression
        !           890:      that is the final test to decide whether an insn body matches
        !           891:      this pattern.
        !           892: 
        !           893:      For a named pattern, the condition (if present) may not depend
        !           894:      on the data in the insn being matched, but only the
        !           895:      target-machine-type flags.  The compiler needs to test these
        !           896:      conditions during initialization in order to learn exactly which
        !           897:      named instructions are available in a particular run.
        !           898: 
        !           899:      For nameless patterns, the condition is applied only when
        !           900:      matching an individual insn, and only after the insn has matched
        !           901:      the pattern's recognition template.  The insn's operands may be
        !           902:      found in the vector `operands'.
        !           903: 
        !           904:   4. The "output template": a string that says how to output matching
        !           905:      insns as assembler code.  `%' in this string specifies where to
        !           906:      substitute the value of an operand.  *Note Output Template::.
        !           907: 
        !           908:      When simple substitution isn't general enough, you can specify a
        !           909:      piece of C code to compute the output.  *Note Output Statement::.
        !           910: 
        !           911:   5. Optionally, some "machine-specific information".  The meaning of
        !           912:      this information is defined only by an individual machine
        !           913:      description; typically it might say whether this insn alters the
        !           914:      condition codes, or how many bytes of output it generates.
        !           915: 
        !           916:      This operand is written as a string containing a C initializer
        !           917:      (complete with braces) for the structure type
        !           918:      `INSN_MACHINE_INFO', whose definition is up to you (*note
        !           919:      Misc::.).
        !           920: 
        !           921: 
        !           922: 
        !           923: File: gcc.info,  Node: Example,  Next: RTL Template,  Prev: Patterns,  Up: Machine Desc
        !           924: 
        !           925: Example of `define_insn'
        !           926: ========================
        !           927: 
        !           928: Here is an actual example of an instruction pattern, for the
        !           929: 68000/68020.
        !           930: 
        !           931:      (define_insn "tstsi"
        !           932:        [(set (cc0)
        !           933:              (match_operand:SI 0 "general_operand" "rm"))]
        !           934:        ""
        !           935:        "*
        !           936:      { if (TARGET_68020 || ! ADDRESS_REG_P (operands[0]))
        !           937:          return \"tstl %0\";
        !           938:        return \"cmpl #0,%0\"; }")
        !           939: 
        !           940: This is an instruction that sets the condition codes based on the
        !           941: value of a general operand.  It has no condition, so any insn whose
        !           942: RTL description has the form shown may be handled according to this
        !           943: pattern.  The name `tstsi' means ``test a `SImode' value'' and tells
        !           944: the RTL generation pass that, when it is necessary to test such a
        !           945: value, an insn to do so can be constructed using this pattern.
        !           946: 
        !           947: The output control string is a piece of C code which chooses which
        !           948: output template to return based on the kind of operand and the
        !           949: specific type of CPU for which code is being generated.
        !           950: 
        !           951: `"rm"' is an operand constraint.  Its meaning is explained below.
        !           952: 
        !           953: 
        !           954: 
        !           955: File: gcc.info,  Node: RTL Template,  Next: Output Template,  Prev: Example,  Up: Machine Desc
        !           956: 
        !           957: RTL Template for Generating and Recognizing Insns
        !           958: =================================================
        !           959: 
        !           960: The RTL template is used to define which insns match the particular
        !           961: pattern and how to find their operands.  For named patterns, the RTL
        !           962: template also says how to construct an insn from specified operands.
        !           963: 
        !           964: Construction involves substituting specified operands into a copy of
        !           965: the template.  Matching involves determining the values that serve as
        !           966: the operands in the insn being matched.  Both of these activities are
        !           967: controlled by special expression types that direct matching and
        !           968: substitution of the operands.
        !           969: 
        !           970: `(match_operand:M N TESTFN CONSTRAINT)'
        !           971:      This expression is a placeholder for operand number N of the
        !           972:      insn.  When constructing an insn, operand number N will be
        !           973:      substituted at this point.  When matching an insn, whatever
        !           974:      appears at this position in the insn will be taken as operand
        !           975:      number N; but it must satisfy TESTFN or this instruction pattern
        !           976:      will not match at all.
        !           977: 
        !           978:      Operand numbers must be chosen consecutively counting from zero
        !           979:      in each instruction pattern.  There may be only one
        !           980:      `match_operand' expression in the pattern for each operand
        !           981:      number.  Usually operands are numbered in the order of
        !           982:      appearance in `match_operand' expressions.
        !           983: 
        !           984:      TESTFN is a string that is the name of a C function that accepts
        !           985:      two arguments, a machine mode and an expression.  During
        !           986:      matching, the function will be called with M as the mode
        !           987:      argument and the putative operand as the other argument.  If it
        !           988:      returns zero, this instruction pattern fails to match.  TESTFN
        !           989:      may be an empty string; then it means no test is to be done on
        !           990:      the operand.
        !           991: 
        !           992:      CONSTRAINT is explained later (*note Constraints::.).
        !           993: 
        !           994:      Most often, TESTFN is `"general_operand"'.  It checks that the
        !           995:      putative operand is either a constant, a register or a memory
        !           996:      reference, and that it is valid for mode M.
        !           997: 
        !           998:      For an operand that must be a register, TESTFN should be
        !           999:      `"register_operand"'.  It would be valid to use
        !          1000:      `"general_operand"', since the reload pass would copy any
        !          1001:      non-register operands through registers, but this would make GNU
        !          1002:      CC do extra work, and it would prevent the register allocator
        !          1003:      from doing the best possible job.
        !          1004: 
        !          1005:      For an operand that must be a constant, either TESTFN should be
        !          1006:      `"immediate_operand"', or the instruction pattern's extra
        !          1007:      condition should check for constants, or both.  You cannot
        !          1008:      expect the constraints to do this work!  If the constraints
        !          1009:      allow only constants, but the predicate allows something else,
        !          1010:      the compiler will crash when that case arises.
        !          1011: 
        !          1012: `(match_dup N)'
        !          1013:      This expression is also a placeholder for operand number N.  It
        !          1014:      is used when the operand needs to appear more than once in the
        !          1015:      insn.
        !          1016: 
        !          1017:      In construction, `match_dup' behaves exactly like
        !          1018:      `match_operand': the operand is substituted into the insn being
        !          1019:      constructed.  But in matching, `match_dup' behaves differently. 
        !          1020:      It assumes that operand number N has already been determined by
        !          1021:      a `match_operand' appearing earlier in the recognition template,
        !          1022:      and it matches only an identical-looking expression.
        !          1023: 
        !          1024: `(address (match_operand:M N "address_operand" ""))'
        !          1025:      This complex of expressions is a placeholder for an operand
        !          1026:      number N in a ``load address'' instruction: an operand which
        !          1027:      specifies a memory location in the usual way, but for which the
        !          1028:      actual operand value used is the address of the location, not
        !          1029:      the contents of the location.
        !          1030: 
        !          1031:      `address' expressions never appear in RTL code, only in machine
        !          1032:      descriptions.  And they are used only in machine descriptions
        !          1033:      that do not use the operand constraint feature.  When operand
        !          1034:      constraints are in use, the letter `p' in the constraint serves
        !          1035:      this purpose.
        !          1036: 
        !          1037:      M is the machine mode of the *memory location being addressed*,
        !          1038:      not the machine mode of the address itself.  That mode is always
        !          1039:      the same on a given target machine (it is `Pmode', which
        !          1040:      normally is `SImode'), so there is no point in mentioning it;
        !          1041:      thus, no machine mode is written in the `address' expression. 
        !          1042:      If some day support is added for machines in which addresses of
        !          1043:      different kinds of objects appear differently or are used
        !          1044:      differently (such as the PDP-10), different formats would
        !          1045:      perhaps need different machine modes and these modes might be
        !          1046:      written in the `address' expression.
        !          1047: 
        !          1048: 
        !          1049: 
        !          1050: File: gcc.info,  Node: Output Template,  Next: Output Statement,  Prev: RTL Template,  Up: Machine Desc
        !          1051: 
        !          1052: Output Templates and Operand Substitution
        !          1053: =========================================
        !          1054: 
        !          1055: The "output template" is a string which specifies how to output the
        !          1056: assembler code for an instruction pattern.  Most of the template is a
        !          1057: fixed string which is output literally.  The character `%' is used to
        !          1058: specify where to substitute an operand; it can also be used to
        !          1059: identify places different variants of the assembler require different
        !          1060: syntax.
        !          1061: 
        !          1062: In the simplest case, a `%' followed by a digit N says to output
        !          1063: operand N at that point in the string.
        !          1064: 
        !          1065: `%' followed by a letter and a digit says to output an operand in an
        !          1066: alternate fashion.  Four letters have standard, built-in meanings
        !          1067: described below.  The machine description macro `PRINT_OPERAND' can
        !          1068: define additional letters with nonstandard meanings.
        !          1069: 
        !          1070: `%cDIGIT' can be used to substitute an operand that is a constant
        !          1071: value without the syntax that normally indicates an immediate operand.
        !          1072: 
        !          1073: `%nDIGIT' is like `%cDIGIT' except that the value of the constant is
        !          1074: negated before printing.
        !          1075: 
        !          1076: `%aDIGIT' can be used to substitute an operand as if it were a memory
        !          1077: reference, with the actual operand treated as the address.  This may
        !          1078: be useful when outputting a ``load address'' instruction, because
        !          1079: often the assembler syntax for such an instruction requires you to
        !          1080: write the operand as if it were a memory reference.
        !          1081: 
        !          1082: `%lDIGIT' is used to substitute a `label_ref' into a jump instruction.
        !          1083: 
        !          1084: `%' followed by a punctuation character specifies a substitution that
        !          1085: does not use an operand.  Only one case is standard: `%%' outputs a
        !          1086: `%' into the assembler code.  Other nonstandard cases can be defined
        !          1087: in the `PRINT_OPERAND' macro.
        !          1088: 
        !          1089: The template may generate multiple assembler instructions.  Write the
        !          1090: text for the instructions, with `\;' between them.
        !          1091: 
        !          1092: When the RTL contains two operand which are required by constraint to
        !          1093: match each other, the output template must refer only to the
        !          1094: lower-numbered operand.  Matching operands are not always identical,
        !          1095: and the rest of the compiler arranges to put the proper RTL
        !          1096: expression for printing into the lower-numbered operand.
        !          1097: 
        !          1098: One use of nonstandard letters or punctuation following `%' is to
        !          1099: distinguish between different assembler languages for the same
        !          1100: machine; for example, Motorola syntax versus MIT syntax for the
        !          1101: 68000.  Motorola syntax requires periods in most opcode names, while
        !          1102: MIT syntax does not.  For example, the opcode `movel' in MIT syntax
        !          1103: is `move.l' in Motorola syntax.  The same file of patterns is used
        !          1104: for both kinds of output syntax, but the character sequence `%.' is
        !          1105: used in each place where Motorola syntax wants a period.  The
        !          1106: `PRINT_OPERAND' macro for Motorola syntax defines the sequence to
        !          1107: output a period; the macro for MIT syntax defines it to do nothing.
        !          1108: 
        !          1109: 
        !          1110: 
        !          1111: File: gcc.info,  Node: Output Statement,  Next: Constraints,  Prev: Output Template,  Up: Machine Desc
        !          1112: 
        !          1113: C Statements for Generating Assembler Output
        !          1114: ============================================
        !          1115: 
        !          1116: Often a single fixed template string cannot produce correct and
        !          1117: efficient assembler code for all the cases that are recognized by a
        !          1118: single instruction pattern.  For example, the opcodes may depend on
        !          1119: the kinds of operands; or some unfortunate combinations of operands
        !          1120: may require extra machine instructions.
        !          1121: 
        !          1122: If the output control string starts with a `*', then it is not an
        !          1123: output template but rather a piece of C program that should compute a
        !          1124: template.  It should execute a `return' statement to return the
        !          1125: template-string you want.  Most such templates use C string literals,
        !          1126: which require doublequote characters to delimit them.  To include
        !          1127: these doublequote characters in the string, prefix each one with `\'.
        !          1128: 
        !          1129: The operands may be found in the array `operands', whose C data type
        !          1130: is `rtx []'.
        !          1131: 
        !          1132: It is possible to output an assembler instruction and then go on to
        !          1133: output or compute more of them, using the subroutine
        !          1134: `output_asm_insn'.  This receives two arguments: a template-string
        !          1135: and a vector of operands.  The vector may be `operands', or it may be
        !          1136: another array of `rtx' that you declare locally and initialize
        !          1137: yourself.
        !          1138: 
        !          1139: When an insn pattern has multiple alternatives in its constraints,
        !          1140: often the appearance of the assembler code determined mostly by which
        !          1141: alternative was matched.  When this is so, the C code can test the
        !          1142: variable `which_alternative', which is the ordinal number of the
        !          1143: alternative that was actually satisfied (0 for the first, 1 for the
        !          1144: second alternative, etc.).
        !          1145: 
        !          1146: For example, suppose there are two opcodes for storing zero, `clrreg'
        !          1147: for registers and `clrmem' for memory locations.  Here is how a
        !          1148: pattern could use `which_alternative' to choose between them:
        !          1149: 
        !          1150:      (define_insn ""
        !          1151:        [(set (match_operand:SI 0 "general_operand" "r,m")
        !          1152:              (const_int 0))]
        !          1153:        ""
        !          1154:        "*
        !          1155:        return (which_alternative == 0
        !          1156:                ? \"clrreg %0\" : \"clrmem %0\");
        !          1157:        ")
        !          1158: 
        !          1159: 
        !          1160: 
        !          1161: File: gcc.info,  Node: Constraints,  Next: Standard Names,  Prev: Output Statement,  Up: Machine Desc
        !          1162: 
        !          1163: Operand Constraints
        !          1164: ===================
        !          1165: 
        !          1166: Each `match_operand' in an instruction pattern can specify a
        !          1167: constraint for the type of operands allowed.  Constraints can say
        !          1168: whether an operand may be in a register, and which kinds of register;
        !          1169: whether the operand can be a memory reference, and which kinds of
        !          1170: address; whether the operand may be an immediate constant, and which
        !          1171: possible values it may have.  Constraints can also require two
        !          1172: operands to match.
        !          1173: 
        !          1174: * Menu:
        !          1175: 
        !          1176: * Simple Constraints::  Basic use of constraints.
        !          1177: * Multi-Alternative::   When an insn has two alternative constraint-patterns.
        !          1178: * Class Preferences::   Constraints guide which hard register to put things in.
        !          1179: * Modifiers::           More precise control over effects of constraints.
        !          1180: * No Constraints::      Describing a clean machine without constraints.
        !          1181: 
        !          1182:  

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.