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

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

unix.superglobalmegacorp.com

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