Annotation of GNUtools/cc/gcc.info-12, revision 1.1

1.1     ! root        1: This is Info file gcc.info, produced by Makeinfo-1.54 from the input
        !             2: file gcc.texi.
        !             3: 
        !             4:    This file documents the use and the internals of the GNU compiler.
        !             5: 
        !             6:    Published by the Free Software Foundation 675 Massachusetts Avenue
        !             7: Cambridge, MA 02139 USA
        !             8: 
        !             9:    Copyright (C) 1988, 1989, 1992, 1993 Free Software Foundation, Inc.
        !            10: 
        !            11:    Permission is granted to make and distribute verbatim copies of this
        !            12: manual provided the copyright notice and this permission notice are
        !            13: preserved on all copies.
        !            14: 
        !            15:    Permission is granted to copy and distribute modified versions of
        !            16: this manual under the conditions for verbatim copying, provided also
        !            17: that the sections entitled "GNU General Public License" and "Protect
        !            18: Your Freedom--Fight `Look And Feel'" are included exactly as in the
        !            19: original, and provided that the entire resulting derived work is
        !            20: distributed under the terms of a permission notice identical to this
        !            21: one.
        !            22: 
        !            23:    Permission is granted to copy and distribute translations of this
        !            24: manual into another language, under the above conditions for modified
        !            25: versions, except that the sections entitled "GNU General Public
        !            26: License" and "Protect Your Freedom--Fight `Look And Feel'", and this
        !            27: permission notice, may be included in translations approved by the Free
        !            28: Software Foundation instead of in the original English.
        !            29: 
        !            30: 
        !            31: File: gcc.info,  Node: Regs and Memory,  Next: Arithmetic,  Prev: Constants,  Up: RTL
        !            32: 
        !            33: Registers and Memory
        !            34: ====================
        !            35: 
        !            36:    Here are the RTL expression types for describing access to machine
        !            37: registers and to main memory.
        !            38: 
        !            39: `(reg:M N)'
        !            40:      For small values of the integer N (those that are less than
        !            41:      `FIRST_PSEUDO_REGISTER'), this stands for a reference to machine
        !            42:      register number N: a "hard register".  For larger values of N, it
        !            43:      stands for a temporary value or "pseudo register".  The compiler's
        !            44:      strategy is to generate code assuming an unlimited number of such
        !            45:      pseudo registers, and later convert them into hard registers or
        !            46:      into memory references.
        !            47: 
        !            48:      M is the machine mode of the reference.  It is necessary because
        !            49:      machines can generally refer to each register in more than one
        !            50:      mode.  For example, a register may contain a full word but there
        !            51:      may be instructions to refer to it as a half word or as a single
        !            52:      byte, as well as instructions to refer to it as a floating point
        !            53:      number of various precisions.
        !            54: 
        !            55:      Even for a register that the machine can access in only one mode,
        !            56:      the mode must always be specified.
        !            57: 
        !            58:      The symbol `FIRST_PSEUDO_REGISTER' is defined by the machine
        !            59:      description, since the number of hard registers on the machine is
        !            60:      an invariant characteristic of the machine.  Note, however, that
        !            61:      not all of the machine registers must be general registers.  All
        !            62:      the machine registers that can be used for storage of data are
        !            63:      given hard register numbers, even those that can be used only in
        !            64:      certain instructions or can hold only certain types of data.
        !            65: 
        !            66:      A hard register may be accessed in various modes throughout one
        !            67:      function, but each pseudo register is given a natural mode and is
        !            68:      accessed only in that mode.  When it is necessary to describe an
        !            69:      access to a pseudo register using a nonnatural mode, a `subreg'
        !            70:      expression is used.
        !            71: 
        !            72:      A `reg' expression with a machine mode that specifies more than
        !            73:      one word of data may actually stand for several consecutive
        !            74:      registers.  If in addition the register number specifies a
        !            75:      hardware register, then it actually represents several consecutive
        !            76:      hardware registers starting with the specified one.
        !            77: 
        !            78:      Each pseudo register number used in a function's RTL code is
        !            79:      represented by a unique `reg' expression.
        !            80: 
        !            81:      Some pseudo register numbers, those within the range of
        !            82:      `FIRST_VIRTUAL_REGISTER' to `LAST_VIRTUAL_REGISTER' only appear
        !            83:      during the RTL generation phase and are eliminated before the
        !            84:      optimization phases.  These represent locations in the stack frame
        !            85:      that cannot be determined until RTL generation for the function
        !            86:      has been completed.  The following virtual register numbers are
        !            87:      defined:
        !            88: 
        !            89:     `VIRTUAL_INCOMING_ARGS_REGNUM'
        !            90:           This points to the first word of the incoming arguments
        !            91:           passed on the stack.  Normally these arguments are placed
        !            92:           there by the caller, but the callee may have pushed some
        !            93:           arguments that were previously passed in registers.
        !            94: 
        !            95:           When RTL generation is complete, this virtual register is
        !            96:           replaced by the sum of the register given by
        !            97:           `ARG_POINTER_REGNUM' and the value of `FIRST_PARM_OFFSET'.
        !            98: 
        !            99:     `VIRTUAL_STACK_VARS_REGNUM'
        !           100:           If `FRAME_GROWS_DOWNWARD' is defined, this points to
        !           101:           immediately above the first variable on the stack.
        !           102:           Otherwise, it points to the first variable on the stack.
        !           103: 
        !           104:           `VIRTUAL_STACK_VARS_REGNUM' is replaced with the sum of the
        !           105:           register given by `FRAME_POINTER_REGNUM' and the value
        !           106:           `STARTING_FRAME_OFFSET'.
        !           107: 
        !           108:     `VIRTUAL_STACK_DYNAMIC_REGNUM'
        !           109:           This points to the location of dynamically allocated memory
        !           110:           on the stack immediately after the stack pointer has been
        !           111:           adjusted by the amount of memory desired.
        !           112: 
        !           113:           This virtual register is replaced by the sum of the register
        !           114:           given by `STACK_POINTER_REGNUM' and the value
        !           115:           `STACK_DYNAMIC_OFFSET'.
        !           116: 
        !           117:     `VIRTUAL_OUTGOING_ARGS_REGNUM'
        !           118:           This points to the location in the stack at which outgoing
        !           119:           arguments should be written when the stack is pre-pushed
        !           120:           (arguments pushed using push insns should always use
        !           121:           `STACK_POINTER_REGNUM').
        !           122: 
        !           123:           This virtual register is replaced by the sum of the register
        !           124:           given by `STACK_POINTER_REGNUM' and the value
        !           125:           `STACK_POINTER_OFFSET'.
        !           126: 
        !           127: `(subreg:M REG WORDNUM)'
        !           128:      `subreg' expressions are used to refer to a register in a machine
        !           129:      mode other than its natural one, or to refer to one register of a
        !           130:      multi-word `reg' that actually refers to several registers.
        !           131: 
        !           132:      Each pseudo-register has a natural mode.  If it is necessary to
        !           133:      operate on it in a different mode--for example, to perform a
        !           134:      fullword move instruction on a pseudo-register that contains a
        !           135:      single byte--the pseudo-register must be enclosed in a `subreg'.
        !           136:      In such a case, WORDNUM is zero.
        !           137: 
        !           138:      Usually M is at least as narrow as the mode of REG, in which case
        !           139:      it is restricting consideration to only the bits of REG that are
        !           140:      in M.
        !           141: 
        !           142:      Sometimes M is wider than the mode of REG.  These `subreg'
        !           143:      expressions are often called "paradoxical".  They are used in
        !           144:      cases where we want to refer to an object in a wider mode but do
        !           145:      not care what value the additional bits have.  The reload pass
        !           146:      ensures that paradoxical references are only made to hard
        !           147:      registers.
        !           148: 
        !           149:      The other use of `subreg' is to extract the individual registers of
        !           150:      a multi-register value.  Machine modes such as `DImode' and
        !           151:      `TImode' can indicate values longer than a word, values which
        !           152:      usually require two or more consecutive registers.  To access one
        !           153:      of the registers, use a `subreg' with mode `SImode' and a WORDNUM
        !           154:      that says which register.
        !           155: 
        !           156:      Storing in a non-paradoxical `subreg' has undefined results for
        !           157:      bits belonging to the same word as the `subreg'.  This laxity makes
        !           158:      it easier to generate efficient code for such instructions.  To
        !           159:      represent an instruction that preserves all the bits outside of
        !           160:      those in the `subreg', use `strict_low_part' around the `subreg'.
        !           161: 
        !           162:      The compilation parameter `WORDS_BIG_ENDIAN', if set to 1, says
        !           163:      that word number zero is the most significant part; otherwise, it
        !           164:      is the least significant part.
        !           165: 
        !           166:      Between the combiner pass and the reload pass, it is possible to
        !           167:      have a paradoxical `subreg' which contains a `mem' instead of a
        !           168:      `reg' as its first operand.  After the reload pass, it is also
        !           169:      possible to have a non-paradoxical `subreg' which contains a
        !           170:      `mem'; this usually occurs when the `mem' is a stack slot which
        !           171:      replaced a pseudo register.
        !           172: 
        !           173:      Note that it is not valid to access a `DFmode' value in `SFmode'
        !           174:      using a `subreg'.  On some machines the most significant part of a
        !           175:      `DFmode' value does not have the same format as a single-precision
        !           176:      floating value.
        !           177: 
        !           178:      It is also not valid to access a single word of a multi-word value
        !           179:      in a hard register when less registers can hold the value than
        !           180:      would be expected from its size.  For example, some 32-bit
        !           181:      machines have floating-point registers that can hold an entire
        !           182:      `DFmode' value.  If register 10 were such a register `(subreg:SI
        !           183:      (reg:DF 10) 1)' would be invalid because there is no way to
        !           184:      convert that reference to a single machine register.  The reload
        !           185:      pass prevents `subreg' expressions such as these from being formed.
        !           186: 
        !           187:      The first operand of a `subreg' expression is customarily accessed
        !           188:      with the `SUBREG_REG' macro and the second operand is customarily
        !           189:      accessed with the `SUBREG_WORD' macro.
        !           190: 
        !           191: `(scratch:M)'
        !           192:      This represents a scratch register that will be required for the
        !           193:      execution of a single instruction and not used subsequently.  It is
        !           194:      converted into a `reg' by either the local register allocator or
        !           195:      the reload pass.
        !           196: 
        !           197:      `scratch' is usually present inside a `clobber' operation (*note
        !           198:      Side Effects::.).
        !           199: 
        !           200: `(cc0)'
        !           201:      This refers to the machine's condition code register.  It has no
        !           202:      operands and may not have a machine mode.  There are two ways to
        !           203:      use it:
        !           204: 
        !           205:         * To stand for a complete set of condition code flags.  This is
        !           206:           best on most machines, where each comparison sets the entire
        !           207:           series of flags.
        !           208: 
        !           209:           With this technique, `(cc0)' may be validly used in only two
        !           210:           contexts: as the destination of an assignment (in test and
        !           211:           compare instructions) and in comparison operators comparing
        !           212:           against zero (`const_int' with value zero; that is to say,
        !           213:           `const0_rtx').
        !           214: 
        !           215:         * To stand for a single flag that is the result of a single
        !           216:           condition.  This is useful on machines that have only a
        !           217:           single flag bit, and in which comparison instructions must
        !           218:           specify the condition to test.
        !           219: 
        !           220:           With this technique, `(cc0)' may be validly used in only two
        !           221:           contexts: as the destination of an assignment (in test and
        !           222:           compare instructions) where the source is a comparison
        !           223:           operator, and as the first operand of `if_then_else' (in a
        !           224:           conditional branch).
        !           225: 
        !           226:      There is only one expression object of code `cc0'; it is the value
        !           227:      of the variable `cc0_rtx'.  Any attempt to create an expression of
        !           228:      code `cc0' will return `cc0_rtx'.
        !           229: 
        !           230:      Instructions can set the condition code implicitly.  On many
        !           231:      machines, nearly all instructions set the condition code based on
        !           232:      the value that they compute or store.  It is not necessary to
        !           233:      record these actions explicitly in the RTL because the machine
        !           234:      description includes a prescription for recognizing the
        !           235:      instructions that do so (by means of the macro
        !           236:      `NOTICE_UPDATE_CC').  *Note Condition Code::.  Only instructions
        !           237:      whose sole purpose is to set the condition code, and instructions
        !           238:      that use the condition code, need mention `(cc0)'.
        !           239: 
        !           240:      On some machines, the condition code register is given a register
        !           241:      number and a `reg' is used instead of `(cc0)'.  This is usually the
        !           242:      preferable approach if only a small subset of instructions modify
        !           243:      the condition code.  Other machines store condition codes in
        !           244:      general registers; in such cases a pseudo register should be used.
        !           245: 
        !           246:      Some machines, such as the Sparc and RS/6000, have two sets of
        !           247:      arithmetic instructions, one that sets and one that does not set
        !           248:      the condition code.  This is best handled by normally generating
        !           249:      the instruction that does not set the condition code, and making a
        !           250:      pattern that both performs the arithmetic and sets the condition
        !           251:      code register (which would not be `(cc0)' in this case).  For
        !           252:      examples, search for `addcc' and `andcc' in `sparc.md'.
        !           253: 
        !           254: `(pc)'
        !           255:      This represents the machine's program counter.  It has no operands
        !           256:      and may not have a machine mode.  `(pc)' may be validly used only
        !           257:      in certain specific contexts in jump instructions.
        !           258: 
        !           259:      There is only one expression object of code `pc'; it is the value
        !           260:      of the variable `pc_rtx'.  Any attempt to create an expression of
        !           261:      code `pc' will return `pc_rtx'.
        !           262: 
        !           263:      All instructions that do not jump alter the program counter
        !           264:      implicitly by incrementing it, but there is no need to mention
        !           265:      this in the RTL.
        !           266: 
        !           267: `(mem:M ADDR)'
        !           268:      This RTX represents a reference to main memory at an address
        !           269:      represented by the expression ADDR.  M specifies how large a unit
        !           270:      of memory is accessed.
        !           271: 
        !           272: 
        !           273: File: gcc.info,  Node: Arithmetic,  Next: Comparisons,  Prev: Regs and Memory,  Up: RTL
        !           274: 
        !           275: RTL Expressions for Arithmetic
        !           276: ==============================
        !           277: 
        !           278:    Unless otherwise specified, all the operands of arithmetic
        !           279: expressions must be valid for mode M.  An operand is valid for mode M
        !           280: if it has mode M, or if it is a `const_int' or `const_double' and M is
        !           281: a mode of class `MODE_INT'.
        !           282: 
        !           283:    For commutative binary operations, constants should be placed in the
        !           284: second operand.
        !           285: 
        !           286: `(plus:M X Y)'
        !           287:      Represents the sum of the values represented by X and Y carried
        !           288:      out in machine mode M.
        !           289: 
        !           290: `(lo_sum:M X Y)'
        !           291:      Like `plus', except that it represents that sum of X and the
        !           292:      low-order bits of Y.  The number of low order bits is
        !           293:      machine-dependent but is normally the number of bits in a `Pmode'
        !           294:      item minus the number of bits set by the `high' code (*note
        !           295:      Constants::.).
        !           296: 
        !           297:      M should be `Pmode'.
        !           298: 
        !           299: `(minus:M X Y)'
        !           300:      Like `plus' but represents subtraction.
        !           301: 
        !           302: `(compare:M X Y)'
        !           303:      Represents the result of subtracting Y from X for purposes of
        !           304:      comparison.  The result is computed without overflow, as if with
        !           305:      infinite precision.
        !           306: 
        !           307:      Of course, machines can't really subtract with infinite precision.
        !           308:      However, they can pretend to do so when only the sign of the
        !           309:      result will be used, which is the case when the result is stored
        !           310:      in the condition code.   And that is the only way this kind of
        !           311:      expression may validly be used: as a value to be stored in the
        !           312:      condition codes.
        !           313: 
        !           314:      The mode M is not related to the modes of X and Y, but instead is
        !           315:      the mode of the condition code value.  If `(cc0)' is used, it is
        !           316:      `VOIDmode'.  Otherwise it is some mode in class `MODE_CC', often
        !           317:      `CCmode'.  *Note Condition Code::.
        !           318: 
        !           319:      Normally, X and Y must have the same mode.  Otherwise, `compare'
        !           320:      is valid only if the mode of X is in class `MODE_INT' and Y is a
        !           321:      `const_int' or `const_double' with mode `VOIDmode'.  The mode of X
        !           322:      determines what mode the comparison is to be done in; thus it must
        !           323:      not be `VOIDmode'.
        !           324: 
        !           325:      If one of the operands is a constant, it should be placed in the
        !           326:      second operand and the comparison code adjusted as appropriate.
        !           327: 
        !           328:      A `compare' specifying two `VOIDmode' constants is not valid since
        !           329:      there is no way to know in what mode the comparison is to be
        !           330:      performed; the comparison must either be folded during the
        !           331:      compilation or the first operand must be loaded into a register
        !           332:      while its mode is still known.
        !           333: 
        !           334: `(neg:M X)'
        !           335:      Represents the negation (subtraction from zero) of the value
        !           336:      represented by X, carried out in mode M.
        !           337: 
        !           338: `(mult:M X Y)'
        !           339:      Represents the signed product of the values represented by X and Y
        !           340:      carried out in machine mode M.
        !           341: 
        !           342:      Some machines support a multiplication that generates a product
        !           343:      wider than the operands.  Write the pattern for this as
        !           344: 
        !           345:           (mult:M (sign_extend:M X) (sign_extend:M Y))
        !           346: 
        !           347:      where M is wider than the modes of X and Y, which need not be the
        !           348:      same.
        !           349: 
        !           350:      Write patterns for unsigned widening multiplication similarly using
        !           351:      `zero_extend'.
        !           352: 
        !           353: `(div:M X Y)'
        !           354:      Represents the quotient in signed division of X by Y, carried out
        !           355:      in machine mode M.  If M is a floating point mode, it represents
        !           356:      the exact quotient; otherwise, the integerized quotient.
        !           357: 
        !           358:      Some machines have division instructions in which the operands and
        !           359:      quotient widths are not all the same; you should represent such
        !           360:      instructions using `truncate' and `sign_extend' as in,
        !           361: 
        !           362:           (truncate:M1 (div:M2 X (sign_extend:M2 Y)))
        !           363: 
        !           364: `(udiv:M X Y)'
        !           365:      Like `div' but represents unsigned division.
        !           366: 
        !           367: `(mod:M X Y)'
        !           368: `(umod:M X Y)'
        !           369:      Like `div' and `udiv' but represent the remainder instead of the
        !           370:      quotient.
        !           371: 
        !           372: `(smin:M X Y)'
        !           373: `(smax:M X Y)'
        !           374:      Represents the smaller (for `smin') or larger (for `smax') of X
        !           375:      and Y, interpreted as signed integers in mode M.
        !           376: 
        !           377: `(umin:M X Y)'
        !           378: `(umax:M X Y)'
        !           379:      Like `smin' and `smax', but the values are interpreted as unsigned
        !           380:      integers.
        !           381: 
        !           382: `(not:M X)'
        !           383:      Represents the bitwise complement of the value represented by X,
        !           384:      carried out in mode M, which must be a fixed-point machine mode.
        !           385: 
        !           386: `(and:M X Y)'
        !           387:      Represents the bitwise logical-and of the values represented by X
        !           388:      and Y, carried out in machine mode M, which must be a fixed-point
        !           389:      machine mode.
        !           390: 
        !           391: `(ior:M X Y)'
        !           392:      Represents the bitwise inclusive-or of the values represented by X
        !           393:      and Y, carried out in machine mode M, which must be a fixed-point
        !           394:      mode.
        !           395: 
        !           396: `(xor:M X Y)'
        !           397:      Represents the bitwise exclusive-or of the values represented by X
        !           398:      and Y, carried out in machine mode M, which must be a fixed-point
        !           399:      mode.
        !           400: 
        !           401: `(ashift:M X C)'
        !           402:      Represents the result of arithmetically shifting X left by C
        !           403:      places.  X have mode M, a fixed-point machine mode.  C be a
        !           404:      fixed-point mode or be a constant with mode `VOIDmode'; which mode
        !           405:      is determined by the mode called for in the machine description
        !           406:      entry for the left-shift instruction.  For example, on the Vax,
        !           407:      the mode of C is `QImode' regardless of M.
        !           408: 
        !           409: `(lshift:M X C)'
        !           410:      Like `ashift' but for logical left shift.  `ashift' and `lshift'
        !           411:      are identical operations; we customarily use `ashift' for both.
        !           412: 
        !           413: `(lshiftrt:M X C)'
        !           414: `(ashiftrt:M X C)'
        !           415:      Like `lshift' and `ashift' but for right shift.  Unlike the case
        !           416:      for left shift, these two operations are distinct.
        !           417: 
        !           418: `(rotate:M X C)'
        !           419: `(rotatert:M X C)'
        !           420:      Similar but represent left and right rotate.  If C is a constant,
        !           421:      use `rotate'.
        !           422: 
        !           423: `(abs:M X)'
        !           424:      Represents the absolute value of X, computed in mode M.
        !           425: 
        !           426: `(sqrt:M X)'
        !           427:      Represents the square root of X, computed in mode M.  Most often M
        !           428:      will be a floating point mode.
        !           429: 
        !           430: `(ffs:M X)'
        !           431:      Represents one plus the index of the least significant 1-bit in X,
        !           432:      represented as an integer of mode M.  (The value is zero if X is
        !           433:      zero.)  The mode of X need not be M; depending on the target
        !           434:      machine, various mode combinations may be valid.
        !           435: 
        !           436: 
        !           437: File: gcc.info,  Node: Comparisons,  Next: Bit Fields,  Prev: Arithmetic,  Up: RTL
        !           438: 
        !           439: Comparison Operations
        !           440: =====================
        !           441: 
        !           442:    Comparison operators test a relation on two operands and are
        !           443: considered to represent a machine-dependent nonzero value described by,
        !           444: but not necessarily equal to, `STORE_FLAG_VALUE' (*note Misc::.) if the
        !           445: relation holds, or zero if it does not.  The mode of the comparison
        !           446: operation is independent of the mode of the data being compared.  If
        !           447: the comparison operation is being tested (e.g., the first operand of an
        !           448: `if_then_else'), the mode must be `VOIDmode'.  If the comparison
        !           449: operation is producing data to be stored in some variable, the mode
        !           450: must be in class `MODE_INT'.  All comparison operations producing data
        !           451: must use the same mode, which is machine-specific.
        !           452: 
        !           453:    There are two ways that comparison operations may be used.  The
        !           454: comparison operators may be used to compare the condition codes `(cc0)'
        !           455: against zero, as in `(eq (cc0) (const_int 0))'.  Such a construct
        !           456: actually refers to the result of the preceding instruction in which the
        !           457: condition codes were set.  The instructing setting the condition code
        !           458: must be adjacent to the instruction using the condition code; only
        !           459: `note' insns may separate them.
        !           460: 
        !           461:    Alternatively, a comparison operation may directly compare two data
        !           462: objects.  The mode of the comparison is determined by the operands; they
        !           463: must both be valid for a common machine mode.  A comparison with both
        !           464: operands constant would be invalid as the machine mode could not be
        !           465: deduced from it, but such a comparison should never exist in RTL due to
        !           466: constant folding.
        !           467: 
        !           468:    In the example above, if `(cc0)' were last set to `(compare X Y)',
        !           469: the comparison operation is identical to `(eq X Y)'.  Usually only one
        !           470: style of comparisons is supported on a particular machine, but the
        !           471: combine pass will try to merge the operations to produce the `eq' shown
        !           472: in case it exists in the context of the particular insn involved.
        !           473: 
        !           474:    Inequality comparisons come in two flavors, signed and unsigned.
        !           475: Thus, there are distinct expression codes `gt' and `gtu' for signed and
        !           476: unsigned greater-than.  These can produce different results for the same
        !           477: pair of integer values: for example, 1 is signed greater-than -1 but not
        !           478: unsigned greater-than, because -1 when regarded as unsigned is actually
        !           479: `0xffffffff' which is greater than 1.
        !           480: 
        !           481:    The signed comparisons are also used for floating point values.
        !           482: Floating point comparisons are distinguished by the machine modes of
        !           483: the operands.
        !           484: 
        !           485: `(eq:M X Y)'
        !           486:      1 if the values represented by X and Y are equal, otherwise 0.
        !           487: 
        !           488: `(ne:M X Y)'
        !           489:      1 if the values represented by X and Y are not equal, otherwise 0.
        !           490: 
        !           491: `(gt:M X Y)'
        !           492:      1 if the X is greater than Y.  If they are fixed-point, the
        !           493:      comparison is done in a signed sense.
        !           494: 
        !           495: `(gtu:M X Y)'
        !           496:      Like `gt' but does unsigned comparison, on fixed-point numbers
        !           497:      only.
        !           498: 
        !           499: `(lt:M X Y)'
        !           500: `(ltu:M X Y)'
        !           501:      Like `gt' and `gtu' but test for "less than".
        !           502: 
        !           503: `(ge:M X Y)'
        !           504: `(geu:M X Y)'
        !           505:      Like `gt' and `gtu' but test for "greater than or equal".
        !           506: 
        !           507: `(le:M X Y)'
        !           508: `(leu:M X Y)'
        !           509:      Like `gt' and `gtu' but test for "less than or equal".
        !           510: 
        !           511: `(if_then_else COND THEN ELSE)'
        !           512:      This is not a comparison operation but is listed here because it is
        !           513:      always used in conjunction with a comparison operation.  To be
        !           514:      precise, COND is a comparison expression.  This expression
        !           515:      represents a choice, according to COND, between the value
        !           516:      represented by THEN and the one represented by ELSE.
        !           517: 
        !           518:      On most machines, `if_then_else' expressions are valid only to
        !           519:      express conditional jumps.
        !           520: 
        !           521: `(cond [TEST1 VALUE1 TEST2 VALUE2 ...] DEFAULT)'
        !           522:      Similar to `if_then_else', but more general.  Each of TEST1,
        !           523:      TEST2, ... is performed in turn.  The result of this expression is
        !           524:      the VALUE corresponding to the first non-zero test, or DEFAULT if
        !           525:      none of the tests are non-zero expressions.
        !           526: 
        !           527:      This is currently not valid for instruction patterns and is
        !           528:      supported only for insn attributes.  *Note Insn Attributes::.
        !           529: 
        !           530: 
        !           531: File: gcc.info,  Node: Bit Fields,  Next: Conversions,  Prev: Comparisons,  Up: RTL
        !           532: 
        !           533: Bit Fields
        !           534: ==========
        !           535: 
        !           536:    Special expression codes exist to represent bitfield instructions.
        !           537: These types of expressions are lvalues in RTL; they may appear on the
        !           538: left side of an assignment, indicating insertion of a value into the
        !           539: specified bit field.
        !           540: 
        !           541: `(sign_extract:M LOC SIZE POS)'
        !           542:      This represents a reference to a sign-extended bit field contained
        !           543:      or starting in LOC (a memory or register reference).  The bit field
        !           544:      is SIZE bits wide and starts at bit POS.  The compilation option
        !           545:      `BITS_BIG_ENDIAN' says which end of the memory unit POS counts
        !           546:      from.
        !           547: 
        !           548:      If LOC is in memory, its mode must be a single-byte integer mode.
        !           549:      If LOC is in a register, the mode to use is specified by the
        !           550:      operand of the `insv' or `extv' pattern (*note Standard Names::.)
        !           551:      and is usually a full-word integer mode.
        !           552: 
        !           553:      The mode of POS is machine-specific and is also specified in the
        !           554:      `insv' or `extv' pattern.
        !           555: 
        !           556:      The mode M is the same as the mode that would be used for LOC if
        !           557:      it were a register.
        !           558: 
        !           559: `(zero_extract:M LOC SIZE POS)'
        !           560:      Like `sign_extract' but refers to an unsigned or zero-extended bit
        !           561:      field.  The same sequence of bits are extracted, but they are
        !           562:      filled to an entire word with zeros instead of by sign-extension.
        !           563: 
        !           564: 
        !           565: File: gcc.info,  Node: Conversions,  Next: RTL Declarations,  Prev: Bit Fields,  Up: RTL
        !           566: 
        !           567: Conversions
        !           568: ===========
        !           569: 
        !           570:    All conversions between machine modes must be represented by
        !           571: explicit conversion operations.  For example, an expression which is
        !           572: the sum of a byte and a full word cannot be written as `(plus:SI
        !           573: (reg:QI 34) (reg:SI 80))' because the `plus' operation requires two
        !           574: operands of the same machine mode.  Therefore, the byte-sized operand
        !           575: is enclosed in a conversion operation, as in
        !           576: 
        !           577:      (plus:SI (sign_extend:SI (reg:QI 34)) (reg:SI 80))
        !           578: 
        !           579:    The conversion operation is not a mere placeholder, because there
        !           580: may be more than one way of converting from a given starting mode to
        !           581: the desired final mode.  The conversion operation code says how to do
        !           582: it.
        !           583: 
        !           584:    For all conversion operations, X must not be `VOIDmode' because the
        !           585: mode in which to do the conversion would not be known.  The conversion
        !           586: must either be done at compile-time or X must be placed into a register.
        !           587: 
        !           588: `(sign_extend:M X)'
        !           589:      Represents the result of sign-extending the value X to machine
        !           590:      mode M.  M must be a fixed-point mode and X a fixed-point value of
        !           591:      a mode narrower than M.
        !           592: 
        !           593: `(zero_extend:M X)'
        !           594:      Represents the result of zero-extending the value X to machine
        !           595:      mode M.  M must be a fixed-point mode and X a fixed-point value of
        !           596:      a mode narrower than M.
        !           597: 
        !           598: `(float_extend:M X)'
        !           599:      Represents the result of extending the value X to machine mode M.
        !           600:      m must be a floating point mode and X a floating point value of a
        !           601:      mode narrower than M.
        !           602: 
        !           603: `(truncate:M X)'
        !           604:      Represents the result of truncating the value X to machine mode M.
        !           605:      M must be a fixed-point mode and X a fixed-point value of a mode
        !           606:      wider than M.
        !           607: 
        !           608: `(float_truncate:M X)'
        !           609:      Represents the result of truncating the value X to machine mode M.
        !           610:      M must be a floating point mode and X a floating point value of a
        !           611:      mode wider than M.
        !           612: 
        !           613: `(float:M X)'
        !           614:      Represents the result of converting fixed point value X, regarded
        !           615:      as signed, to floating point mode M.
        !           616: 
        !           617: `(unsigned_float:M X)'
        !           618:      Represents the result of converting fixed point value X, regarded
        !           619:      as unsigned, to floating point mode M.
        !           620: 
        !           621: `(fix:M X)'
        !           622:      When M is a fixed point mode, represents the result of converting
        !           623:      floating point value X to mode M, regarded as signed.  How
        !           624:      rounding is done is not specified, so this operation may be used
        !           625:      validly in compiling C code only for integer-valued operands.
        !           626: 
        !           627: `(unsigned_fix:M X)'
        !           628:      Represents the result of converting floating point value X to
        !           629:      fixed point mode M, regarded as unsigned.  How rounding is done is
        !           630:      not specified.
        !           631: 
        !           632: `(fix:M X)'
        !           633:      When M is a floating point mode, represents the result of
        !           634:      converting floating point value X (valid for mode M) to an
        !           635:      integer, still represented in floating point mode M, by rounding
        !           636:      towards zero.
        !           637: 
        !           638: 
        !           639: File: gcc.info,  Node: RTL Declarations,  Next: Side Effects,  Prev: Conversions,  Up: RTL
        !           640: 
        !           641: Declarations
        !           642: ============
        !           643: 
        !           644:    Declaration expression codes do not represent arithmetic operations
        !           645: but rather state assertions about their operands.
        !           646: 
        !           647: `(strict_low_part (subreg:M (reg:N R) 0))'
        !           648:      This expression code is used in only one context: as the
        !           649:      destination operand of a `set' expression.  In addition, the
        !           650:      operand of this expression must be a non-paradoxical `subreg'
        !           651:      expression.
        !           652: 
        !           653:      The presence of `strict_low_part' says that the part of the
        !           654:      register which is meaningful in mode N, but is not part of mode M,
        !           655:      is not to be altered.  Normally, an assignment to such a subreg is
        !           656:      allowed to have undefined effects on the rest of the register when
        !           657:      M is less than a word.
        !           658: 
        !           659: 
        !           660: File: gcc.info,  Node: Side Effects,  Next: Incdec,  Prev: RTL Declarations,  Up: RTL
        !           661: 
        !           662: Side Effect Expressions
        !           663: =======================
        !           664: 
        !           665:    The expression codes described so far represent values, not actions.
        !           666: But machine instructions never produce values; they are meaningful only
        !           667: for their side effects on the state of the machine.  Special expression
        !           668: codes are used to represent side effects.
        !           669: 
        !           670:    The body of an instruction is always one of these side effect codes;
        !           671: the codes described above, which represent values, appear only as the
        !           672: operands of these.
        !           673: 
        !           674: `(set LVAL X)'
        !           675:      Represents the action of storing the value of X into the place
        !           676:      represented by LVAL.  LVAL must be an expression representing a
        !           677:      place that can be stored in: `reg' (or `subreg' or
        !           678:      `strict_low_part'), `mem', `pc' or `cc0'.
        !           679: 
        !           680:      If LVAL is a `reg', `subreg' or `mem', it has a machine mode; then
        !           681:      X must be valid for that mode.
        !           682: 
        !           683:      If LVAL is a `reg' whose machine mode is less than the full width
        !           684:      of the register, then it means that the part of the register
        !           685:      specified by the machine mode is given the specified value and the
        !           686:      rest of the register receives an undefined value.  Likewise, if
        !           687:      LVAL is a `subreg' whose machine mode is narrower than the mode of
        !           688:      the register, the rest of the register can be changed in an
        !           689:      undefined way.
        !           690: 
        !           691:      If LVAL is a `strict_low_part' of a `subreg', then the part of the
        !           692:      register specified by the machine mode of the `subreg' is given
        !           693:      the value X and the rest of the register is not changed.
        !           694: 
        !           695:      If LVAL is `(cc0)', it has no machine mode, and X may be either a
        !           696:      `compare' expression or a value that may have any mode.  The
        !           697:      latter case represents a "test" instruction.  The expression `(set
        !           698:      (cc0) (reg:M N))' is equivalent to `(set (cc0) (compare (reg:M N)
        !           699:      (const_int 0)))'.  Use the former expression to save space during
        !           700:      the compilation.
        !           701: 
        !           702:      If LVAL is `(pc)', we have a jump instruction, and the
        !           703:      possibilities for X are very limited.  It may be a `label_ref'
        !           704:      expression (unconditional jump).  It may be an `if_then_else'
        !           705:      (conditional jump), in which case either the second or the third
        !           706:      operand must be `(pc)' (for the case which does not jump) and the
        !           707:      other of the two must be a `label_ref' (for the case which does
        !           708:      jump).  X may also be a `mem' or `(plus:SI (pc) Y)', where Y may
        !           709:      be a `reg' or a `mem'; these unusual patterns are used to
        !           710:      represent jumps through branch tables.
        !           711: 
        !           712:      If LVAL is neither `(cc0)' nor `(pc)', the mode of LVAL must not
        !           713:      be `VOIDmode' and the mode of X must be valid for the mode of LVAL.
        !           714: 
        !           715:      LVAL is customarily accessed with the `SET_DEST' macro and X with
        !           716:      the `SET_SRC' macro.
        !           717: 
        !           718: `(return)'
        !           719:      As the sole expression in a pattern, represents a return from the
        !           720:      current function, on machines where this can be done with one
        !           721:      instruction, such as Vaxes.  On machines where a multi-instruction
        !           722:      "epilogue" must be executed in order to return from the function,
        !           723:      returning is done by jumping to a label which precedes the
        !           724:      epilogue, and the `return' expression code is never used.
        !           725: 
        !           726:      Inside an `if_then_else' expression, represents the value to be
        !           727:      placed in `pc' to return to the caller.
        !           728: 
        !           729:      Note that an insn pattern of `(return)' is logically equivalent to
        !           730:      `(set (pc) (return))', but the latter form is never used.
        !           731: 
        !           732: `(call FUNCTION NARGS)'
        !           733:      Represents a function call.  FUNCTION is a `mem' expression whose
        !           734:      address is the address of the function to be called.  NARGS is an
        !           735:      expression which can be used for two purposes: on some machines it
        !           736:      represents the number of bytes of stack argument; on others, it
        !           737:      represents the number of argument registers.
        !           738: 
        !           739:      Each machine has a standard machine mode which FUNCTION must have.
        !           740:      The machine description defines macro `FUNCTION_MODE' to expand
        !           741:      into the requisite mode name.  The purpose of this mode is to
        !           742:      specify what kind of addressing is allowed, on machines where the
        !           743:      allowed kinds of addressing depend on the machine mode being
        !           744:      addressed.
        !           745: 
        !           746: `(clobber X)'
        !           747:      Represents the storing or possible storing of an unpredictable,
        !           748:      undescribed value into X, which must be a `reg', `scratch' or
        !           749:      `mem' expression.
        !           750: 
        !           751:      One place this is used is in string instructions that store
        !           752:      standard values into particular hard registers.  It may not be
        !           753:      worth the trouble to describe the values that are stored, but it
        !           754:      is essential to inform the compiler that the registers will be
        !           755:      altered, lest it attempt to keep data in them across the string
        !           756:      instruction.
        !           757: 
        !           758:      If X is `(mem:BLK (const_int 0))', it means that all memory
        !           759:      locations must be presumed clobbered.
        !           760: 
        !           761:      Note that the machine description classifies certain hard
        !           762:      registers as "call-clobbered".  All function call instructions are
        !           763:      assumed by default to clobber these registers, so there is no need
        !           764:      to use `clobber' expressions to indicate this fact.  Also, each
        !           765:      function call is assumed to have the potential to alter any memory
        !           766:      location, unless the function is declared `const'.
        !           767: 
        !           768:      If the last group of expressions in a `parallel' are each a
        !           769:      `clobber' expression whose arguments are `reg' or `match_scratch'
        !           770:      (*note RTL Template::.) expressions, the combiner phase can add
        !           771:      the appropriate `clobber' expressions to an insn it has
        !           772:      constructed when doing so will cause a pattern to be matched.
        !           773: 
        !           774:      This feature can be used, for example, on a machine that whose
        !           775:      multiply and add instructions don't use an MQ register but which
        !           776:      has an add-accumulate instruction that does clobber the MQ
        !           777:      register.  Similarly, a combined instruction might require a
        !           778:      temporary register while the constituent instructions might not.
        !           779: 
        !           780:      When a `clobber' expression for a register appears inside a
        !           781:      `parallel' with other side effects, the register allocator
        !           782:      guarantees that the register is unoccupied both before and after
        !           783:      that insn.  However, the reload phase may allocate a register used
        !           784:      for one of the inputs unless the `&' constraint is specified for
        !           785:      the selected alternative (*note Modifiers::.).  You can clobber
        !           786:      either a specific hard register, a pseudo register, or a `scratch'
        !           787:      expression; in the latter two cases, GNU CC will allocate a hard
        !           788:      register that is available there for use as a temporary.
        !           789: 
        !           790:      For instructions that require a temporary register, you should use
        !           791:      `scratch' instead of a pseudo-register because this will allow the
        !           792:      combiner phase to add the `clobber' when required.  You do this by
        !           793:      coding (`clobber' (`match_scratch' ...)).  If you do clobber a
        !           794:      pseudo register, use one which appears nowhere else--generate a
        !           795:      new one each time.  Otherwise, you may confuse CSE.
        !           796: 
        !           797:      There is one other known use for clobbering a pseudo register in a
        !           798:      `parallel': when one of the input operands of the insn is also
        !           799:      clobbered by the insn.  In this case, using the same pseudo
        !           800:      register in the clobber and elsewhere in the insn produces the
        !           801:      expected results.
        !           802: 
        !           803: `(use X)'
        !           804:      Represents the use of the value of X.  It indicates that the value
        !           805:      in X at this point in the program is needed, even though it may
        !           806:      not be apparent why this is so.  Therefore, the compiler will not
        !           807:      attempt to delete previous instructions whose only effect is to
        !           808:      store a value in X.  X must be a `reg' expression.
        !           809: 
        !           810:      During the delayed branch scheduling phase, X may be an insn.
        !           811:      This indicates that X previously was located at this place in the
        !           812:      code and its data dependencies need to be taken into account.
        !           813:      These `use' insns will be deleted before the delayed branch
        !           814:      scheduling phase exits.
        !           815: 
        !           816: `(parallel [X0 X1 ...])'
        !           817:      Represents several side effects performed in parallel.  The square
        !           818:      brackets stand for a vector; the operand of `parallel' is a vector
        !           819:      of expressions.  X0, X1 and so on are individual side effect
        !           820:      expressions--expressions of code `set', `call', `return',
        !           821:      `clobber' or `use'.
        !           822: 
        !           823:      "In parallel" means that first all the values used in the
        !           824:      individual side-effects are computed, and second all the actual
        !           825:      side-effects are performed.  For example,
        !           826: 
        !           827:           (parallel [(set (reg:SI 1) (mem:SI (reg:SI 1)))
        !           828:                      (set (mem:SI (reg:SI 1)) (reg:SI 1))])
        !           829: 
        !           830:      says unambiguously that the values of hard register 1 and the
        !           831:      memory location addressed by it are interchanged.  In both places
        !           832:      where `(reg:SI 1)' appears as a memory address it refers to the
        !           833:      value in register 1 *before* the execution of the insn.
        !           834: 
        !           835:      It follows that it is *incorrect* to use `parallel' and expect the
        !           836:      result of one `set' to be available for the next one.  For
        !           837:      example, people sometimes attempt to represent a jump-if-zero
        !           838:      instruction this way:
        !           839: 
        !           840:           (parallel [(set (cc0) (reg:SI 34))
        !           841:                      (set (pc) (if_then_else
        !           842:                                   (eq (cc0) (const_int 0))
        !           843:                                   (label_ref ...)
        !           844:                                   (pc)))])
        !           845: 
        !           846:      But this is incorrect, because it says that the jump condition
        !           847:      depends on the condition code value *before* this instruction, not
        !           848:      on the new value that is set by this instruction.
        !           849: 
        !           850:      Peephole optimization, which takes place together with final
        !           851:      assembly code output, can produce insns whose patterns consist of
        !           852:      a `parallel' whose elements are the operands needed to output the
        !           853:      resulting assembler code--often `reg', `mem' or constant
        !           854:      expressions.  This would not be well-formed RTL at any other stage
        !           855:      in compilation, but it is ok then because no further optimization
        !           856:      remains to be done.  However, the definition of the macro
        !           857:      `NOTICE_UPDATE_CC', if any, must deal with such insns if you
        !           858:      define any peephole optimizations.
        !           859: 
        !           860: `(sequence [INSNS ...])'
        !           861:      Represents a sequence of insns.  Each of the INSNS that appears in
        !           862:      the vector is suitable for appearing in the chain of insns, so it
        !           863:      must be an `insn', `jump_insn', `call_insn', `code_label',
        !           864:      `barrier' or `note'.
        !           865: 
        !           866:      A `sequence' RTX is never placed in an actual insn during RTL
        !           867:      generation.  It represents the sequence of insns that result from a
        !           868:      `define_expand' *before* those insns are passed to `emit_insn' to
        !           869:      insert them in the chain of insns.  When actually inserted, the
        !           870:      individual sub-insns are separated out and the `sequence' is
        !           871:      forgotten.
        !           872: 
        !           873:      After delay-slot scheduling is completed, an insn and all the
        !           874:      insns that reside in its delay slots are grouped together into a
        !           875:      `sequence'.  The insn requiring the delay slot is the first insn
        !           876:      in the vector; subsequent insns are to be placed in the delay slot.
        !           877: 
        !           878:      `INSN_ANNULLED_BRANCH_P' is set on an insn in a delay slot to
        !           879:      indicate that a branch insn should be used that will conditionally
        !           880:      annul the effect of the insns in the delay slots.  In such a case,
        !           881:      `INSN_FROM_TARGET_P' indicates that the insn is from the target of
        !           882:      the branch and should be executed only if the branch is taken;
        !           883:      otherwise the insn should be executed only if the branch is not
        !           884:      taken.  *Note Delay Slots::.
        !           885: 
        !           886:    These expression codes appear in place of a side effect, as the body
        !           887: of an insn, though strictly speaking they do not always describe side
        !           888: effects as such:
        !           889: 
        !           890: `(asm_input S)'
        !           891:      Represents literal assembler code as described by the string S.
        !           892: 
        !           893: `(unspec [OPERANDS ...] INDEX)'
        !           894: `(unspec_volatile [OPERANDS ...] INDEX)'
        !           895:      Represents a machine-specific operation on OPERANDS.  INDEX
        !           896:      selects between multiple machine-specific operations.
        !           897:      `unspec_volatile' is used for volatile operations and operations
        !           898:      that may trap; `unspec' is used for other operations.
        !           899: 
        !           900:      These codes may appear inside a `pattern' of an insn, inside a
        !           901:      `parallel', or inside an expression.
        !           902: 
        !           903: `(addr_vec:M [LR0 LR1 ...])'
        !           904:      Represents a table of jump addresses.  The vector elements LR0,
        !           905:      etc., are `label_ref' expressions.  The mode M specifies how much
        !           906:      space is given to each address; normally M would be `Pmode'.
        !           907: 
        !           908: `(addr_diff_vec:M BASE [LR0 LR1 ...])'
        !           909:      Represents a table of jump addresses expressed as offsets from
        !           910:      BASE.  The vector elements LR0, etc., are `label_ref' expressions
        !           911:      and so is BASE.  The mode M specifies how much space is given to
        !           912:      each address-difference.
        !           913: 
        !           914: 
        !           915: File: gcc.info,  Node: Incdec,  Next: Assembler,  Prev: Side Effects,  Up: RTL
        !           916: 
        !           917: Embedded Side-Effects on Addresses
        !           918: ==================================
        !           919: 
        !           920:    Four special side-effect expression codes appear as memory addresses.
        !           921: 
        !           922: `(pre_dec:M X)'
        !           923:      Represents the side effect of decrementing X by a standard amount
        !           924:      and represents also the value that X has after being decremented.
        !           925:      x must be a `reg' or `mem', but most machines allow only a `reg'.
        !           926:      m must be the machine mode for pointers on the machine in use.
        !           927:      The amount X is decremented by is the length in bytes of the
        !           928:      machine mode of the containing memory reference of which this
        !           929:      expression serves as the address.  Here is an example of its use:
        !           930: 
        !           931:           (mem:DF (pre_dec:SI (reg:SI 39)))
        !           932: 
        !           933:      This says to decrement pseudo register 39 by the length of a
        !           934:      `DFmode' value and use the result to address a `DFmode' value.
        !           935: 
        !           936: `(pre_inc:M X)'
        !           937:      Similar, but specifies incrementing X instead of decrementing it.
        !           938: 
        !           939: `(post_dec:M X)'
        !           940:      Represents the same side effect as `pre_dec' but a different
        !           941:      value.  The value represented here is the value X has before being
        !           942:      decremented.
        !           943: 
        !           944: `(post_inc:M X)'
        !           945:      Similar, but specifies incrementing X instead of decrementing it.
        !           946: 
        !           947:    These embedded side effect expressions must be used with care.
        !           948: Instruction patterns may not use them.  Until the `flow' pass of the
        !           949: compiler, they may occur only to represent pushes onto the stack.  The
        !           950: `flow' pass finds cases where registers are incremented or decremented
        !           951: in one instruction and used as an address shortly before or after;
        !           952: these cases are then transformed to use pre- or post-increment or
        !           953: -decrement.
        !           954: 
        !           955:    If a register used as the operand of these expressions is used in
        !           956: another address in an insn, the original value of the register is used.
        !           957: Uses of the register outside of an address are not permitted within the
        !           958: same insn as a use in an embedded side effect expression because such
        !           959: insns behave differently on different machines and hence must be treated
        !           960: as ambiguous and disallowed.
        !           961: 
        !           962:    An instruction that can be represented with an embedded side effect
        !           963: could also be represented using `parallel' containing an additional
        !           964: `set' to describe how the address register is altered.  This is not
        !           965: done because machines that allow these operations at all typically
        !           966: allow them wherever a memory address is called for.  Describing them as
        !           967: additional parallel stores would require doubling the number of entries
        !           968: in the machine description.
        !           969: 
        !           970: 
        !           971: File: gcc.info,  Node: Assembler,  Next: Insns,  Prev: Incdec,  Up: RTL
        !           972: 
        !           973: Assembler Instructions as Expressions
        !           974: =====================================
        !           975: 
        !           976:    The RTX code `asm_operands' represents a value produced by a
        !           977: user-specified assembler instruction.  It is used to represent an `asm'
        !           978: statement with arguments.  An `asm' statement with a single output
        !           979: operand, like this:
        !           980: 
        !           981:      asm ("foo %1,%2,%0" : "=a" (outputvar) : "g" (x + y), "di" (*z));
        !           982: 
        !           983: is represented using a single `asm_operands' RTX which represents the
        !           984: value that is stored in `outputvar':
        !           985: 
        !           986:      (set RTX-FOR-OUTPUTVAR
        !           987:           (asm_operands "foo %1,%2,%0" "a" 0
        !           988:                         [RTX-FOR-ADDITION-RESULT RTX-FOR-*Z]
        !           989:                         [(asm_input:M1 "g")
        !           990:                          (asm_input:M2 "di")]))
        !           991: 
        !           992: Here the operands of the `asm_operands' RTX are the assembler template
        !           993: string, the output-operand's constraint, the index-number of the output
        !           994: operand among the output operands specified, a vector of input operand
        !           995: RTX's, and a vector of input-operand modes and constraints.  The mode
        !           996: M1 is the mode of the sum `x+y'; M2 is that of `*z'.
        !           997: 
        !           998:    When an `asm' statement has multiple output values, its insn has
        !           999: several such `set' RTX's inside of a `parallel'.  Each `set' contains a
        !          1000: `asm_operands'; all of these share the same assembler template and
        !          1001: vectors, but each contains the constraint for the respective output
        !          1002: operand.  They are also distinguished by the output-operand index
        !          1003: number, which is 0, 1, ... for successive output operands.
        !          1004: 

unix.superglobalmegacorp.com

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