Annotation of gcc/gcc.info-7, revision 1.1.1.3

1.1       root        1: Info file gcc.info, produced by Makeinfo, -*- Text -*- from input
                      2: file gcc.texinfo.
                      3: 
                      4: This file documents the use and the internals of the GNU compiler.
                      5: 
1.1.1.2   root        6: Copyright (C) 1988, 1989 Free Software Foundation, Inc.
1.1       root        7: 
                      8: Permission is granted to make and distribute verbatim copies of this
                      9: manual provided the copyright notice and this permission notice are
                     10: preserved on all copies.
                     11: 
                     12: Permission is granted to copy and distribute modified versions of
                     13: this manual under the conditions for verbatim copying, provided also
1.1.1.3 ! root       14: that the sections entitled ``GNU General Public License'' and
        !            15: ``Protect Your Freedom--Fight `Look And Feel''' are included exactly
        !            16: as in the original, and provided that the entire resulting derived
        !            17: work is distributed under the terms of a permission notice identical
        !            18: to this one.
1.1       root       19: 
                     20: Permission is granted to copy and distribute translations of this
                     21: manual into another language, under the above conditions for modified
1.1.1.3 ! root       22: versions, except that the sections entitled ``GNU General Public
        !            23: License'' and ``Protect Your Freedom--Fight `Look And Feel''' and
        !            24: this permission notice may be included in translations approved by
        !            25: the Free Software Foundation instead of in the original English.
1.1.1.2   root       26: 
1.1.1.3 ! root       27: 
        !            28: 
        !            29: File: gcc.info,  Node: Output Statement,  Next: Constraints,  Prev: Output Template,  Up: Machine Desc
        !            30: 
        !            31: C Statements for Generating Assembler Output
        !            32: ============================================
        !            33: 
        !            34: Often a single fixed template string cannot produce correct and
        !            35: efficient assembler code for all the cases that are recognized by a
        !            36: single instruction pattern.  For example, the opcodes may depend on
        !            37: the kinds of operands; or some unfortunate combinations of operands
        !            38: may require extra machine instructions.
        !            39: 
        !            40: If the output control string starts with a `*', then it is not an
        !            41: output template but rather a piece of C program that should compute a
        !            42: template.  It should execute a `return' statement to return the
        !            43: template-string you want.  Most such templates use C string literals,
        !            44: which require doublequote characters to delimit them.  To include
        !            45: these doublequote characters in the string, prefix each one with `\'.
        !            46: 
        !            47: The operands may be found in the array `operands', whose C data type
        !            48: is `rtx []'.
        !            49: 
        !            50: It is possible to output an assembler instruction and then go on to
        !            51: output or compute more of them, using the subroutine
        !            52: `output_asm_insn'.  This receives two arguments: a template-string
        !            53: and a vector of operands.  The vector may be `operands', or it may be
        !            54: another array of `rtx' that you declare locally and initialize
        !            55: yourself.
        !            56: 
        !            57: When an insn pattern has multiple alternatives in its constraints,
        !            58: often the appearance of the assembler code is determined mostly by
        !            59: which alternative was matched.  When this is so, the C code can test
        !            60: the variable `which_alternative', which is the ordinal number of the
        !            61: alternative that was actually satisfied (0 for the first, 1 for the
        !            62: second alternative, etc.).
        !            63: 
        !            64: For example, suppose there are two opcodes for storing zero, `clrreg'
        !            65: for registers and `clrmem' for memory locations.  Here is how a
        !            66: pattern could use `which_alternative' to choose between them:
        !            67: 
        !            68:      (define_insn ""
        !            69:        [(set (match_operand:SI 0 "general_operand" "r,m")
        !            70:              (const_int 0))]
        !            71:        ""
        !            72:        "*
        !            73:        return (which_alternative == 0
        !            74:                ? \"clrreg %0\" : \"clrmem %0\");
        !            75:        ")
        !            76: 
        !            77: 
        !            78: 
        !            79: File: gcc.info,  Node: Constraints,  Next: Standard Names,  Prev: Output Statement,  Up: Machine Desc
        !            80: 
        !            81: Operand Constraints
        !            82: ===================
        !            83: 
        !            84: Each `match_operand' in an instruction pattern can specify a
        !            85: constraint for the type of operands allowed.  Constraints can say
        !            86: whether an operand may be in a register, and which kinds of register;
        !            87: whether the operand can be a memory reference, and which kinds of
        !            88: address; whether the operand may be an immediate constant, and which
        !            89: possible values it may have.  Constraints can also require two
        !            90: operands to match.
        !            91: 
        !            92: * Menu:
        !            93: 
        !            94: * Simple Constraints::  Basic use of constraints.
        !            95: * Multi-Alternative::   When an insn has two alternative constraint-patterns.
        !            96: * Class Preferences::   Constraints guide which hard register to put things in.
        !            97: * Modifiers::           More precise control over effects of constraints.
        !            98: * No Constraints::      Describing a clean machine without constraints.
        !            99: 
        !           100:  
        !           101: 
        !           102: File: gcc.info,  Node: Simple Constraints,  Next: Multi-Alternative,  Prev: Constraints,  Up: Constraints
        !           103: 
        !           104: Simple Constraints
        !           105: ------------------
        !           106: 
        !           107: The simplest kind of constraint is a string full of letters, each of
        !           108: which describes one kind of operand that is permitted.  Here are the
        !           109: letters that are allowed:
        !           110: 
        !           111: `m'
        !           112:      A memory operand is allowed, with any kind of address that the
        !           113:      machine supports in general.
        !           114: 
        !           115: `o'
        !           116:      A memory operand is allowed, but only if the address is
        !           117:      "offsettable".  This means that adding a small integer
        !           118:      (actually, the width in bytes of the operand, as determined by
        !           119:      its machine mode) may be added to the address and the result is
        !           120:      also a valid memory address.
        !           121: 
        !           122:      For example, an address which is constant is offsettable; so is
        !           123:      an address that is the sum of a register and a constant (as long
        !           124:      as a slightly larger constant is also within the range of
        !           125:      address-offsets supported by the machine); but an autoincrement
        !           126:      or autodecrement address is not offsettable.  More complicated
        !           127:      indirect/indexed addresses may or may not be offsettable
        !           128:      depending on the other addressing modes that the machine supports.
        !           129: 
        !           130:      Note that in an output operand which can be matched by another
        !           131:      operand, the constraint letter `o' is valid only when
        !           132:      accompanied by both `<' (if the target machine has predecrement
        !           133:      addressing) and `>' (if the target machine has preincrement
        !           134:      addressing).
        !           135: 
        !           136:      When the constraint letter `o' is used, the reload pass may
        !           137:      generate instructions which copy a nonoffsettable address into
        !           138:      an index register.  The idea is that the register can be used as
        !           139:      a replacement offsettable address.  But this method requires
        !           140:      that there be patterns to copy any kind of address into a
        !           141:      register.  Auto-increment and auto-decrement addresses are an
        !           142:      exception; there need not be an instruction that can copy such
        !           143:      an address into a register, because reload handles these cases
        !           144:      specially.
        !           145: 
        !           146:      Most older machine designs have ``load address'' instructions
        !           147:      which do just what is needed here.  Some RISC machines do not
        !           148:      advertise such instructions, but the possible addresses on these
        !           149:      machines are very limited, so it is easy to fake them.
        !           150: 
        !           151: `<'
        !           152:      A memory operand with autodecrement addressing (either
        !           153:      predecrement or postdecrement) is allowed.
        !           154: 
        !           155: `>'
        !           156:      A memory operand with autoincrement addressing (either
        !           157:      preincrement or postincrement) is allowed.
        !           158: 
        !           159: `r'
        !           160:      A register operand is allowed provided that it is in a general
        !           161:      register.
        !           162: 
        !           163: `d', `a', `f', ...
        !           164:       Other letters can be defined in machine-dependent fashion to
        !           165:      stand for particular classes of registers.  `d', `a' and `f' are
        !           166:      defined on the 68000/68020 to stand for data, address and
        !           167:      floating point registers.
        !           168: 
        !           169: `i'
        !           170:      An immediate integer operand (one with constant value) is allowed.
        !           171:      This includes symbolic constants whose values will be known only
        !           172:      at assembly time.
        !           173: 
        !           174: `n'
        !           175:      An immediate integer operand with a known numeric value is
        !           176:      allowed.  Many systems cannot support assembly-time constants
        !           177:      for operands less than a word wide.  Constraints for these
        !           178:      operands should use `n' rather than `i'.
        !           179: 
        !           180: `I', `J', `K', ...
        !           181:       Other letters in the range `I' through `M' may be defined in a
        !           182:      machine-dependent fashion to permit immediate integer operands
        !           183:      with explicit integer values in specified ranges.  For example,
        !           184:      on the 68000, `I' is defined to stand for the range of values 1
        !           185:      to 8.  This is the range permitted as a shift count in the shift
        !           186:      instructions.
        !           187: 
        !           188: `F'
        !           189:      An immediate floating operand (expression code `const_double')
        !           190:      is allowed.
        !           191: 
        !           192: `G', `H'
        !           193:      `G' and `H' may be defined in a machine-dependent fashion to
        !           194:      permit immediate floating operands in particular ranges of values.
        !           195: 
        !           196: `s'
        !           197:      An immediate integer operand whose value is not an explicit
        !           198:      integer is allowed.
        !           199: 
        !           200:      This might appear strange; if an insn allows a constant operand
        !           201:      with a value not known at compile time, it certainly must allow
        !           202:      any known value.  So why use `s' instead of `i'?  Sometimes it
        !           203:      allows better code to be generated.
        !           204: 
        !           205:      For example, on the 68000 in a fullword instruction it is
        !           206:      possible to use an immediate operand; but if the immediate value
        !           207:      is between -128 and 127, better code results from loading the
        !           208:      value into a register and using the register.  This is because
        !           209:      the load into the register can be done with a `moveq'
        !           210:      instruction.  We arrange for this to happen by defining the
        !           211:      letter `K' to mean ``any integer outside the range -128 to
        !           212:      127'', and then specifying `Ks' in the operand constraints.
        !           213: 
        !           214: `g'
        !           215:      Any register, memory or immediate integer operand is allowed,
        !           216:      except for registers that are not general registers.
        !           217: 
        !           218: `N' (a digit)
        !           219:      An operand that matches operand number N is allowed.  If a digit
        !           220:      is used together with letters, the digit should come last.
        !           221: 
        !           222:      This is called a "matching constraint" and what it really means
        !           223:      is that the assembler has only a single operand that fills two
        !           224:      roles considered separate in the RTL insn.  For example, an add
        !           225:      insn has two input operands and one output operand in the RTL,
        !           226:      but on most machines an add instruction really has only two
        !           227:      operands, one of them an input-output operand.
        !           228: 
        !           229:      Matching constraints work only in circumstances like that add
        !           230:      insn.  More precisely, the matching constraint must appear in an
        !           231:      input-only operand and the operand that it matches must be an
        !           232:      output-only operand with a lower number.  Thus, operand N must
        !           233:      have `=' in its constraint.
        !           234: 
        !           235:      For operands to match in a particular case usually means that
        !           236:      they are identical-looking RTL expressions.  But in a few
        !           237:      special cases specific kinds of dissimilarity are allowed.  For
        !           238:      example, `*x' as an input operand will match `*x++' as an output
        !           239:      operand.  For proper results in such cases, the output template
        !           240:      should always use the output-operand's number when printing the
        !           241:      operand.
        !           242: 
        !           243: `p'
        !           244:      An operand that is a valid memory address is allowed.  This is
        !           245:      for ``load address'' and ``push address'' instructions.
        !           246: 
        !           247:      `p' in the constraint must be accompanies by `address_operand'
        !           248:      as the predicate in the `match_operand'.
        !           249: 
        !           250: In order to have valid assembler code, each operand must satisfy its
        !           251: constraint.  But a failure to do so does not prevent the pattern from
        !           252: applying to an insn.  Instead, it directs the compiler to modify the
        !           253: code so that the constraint will be satisfied.  Usually this is done
        !           254: by copying an operand into a register.
        !           255: 
        !           256: Contrast, therefore, the two instruction patterns that follow:
        !           257: 
        !           258:      (define_insn ""
        !           259:        [(set (match_operand:SI 0 "general_operand" "r")
        !           260:              (plus:SI (match_dup 0)
        !           261:                       (match_operand:SI 1 "general_operand" "r")))]
        !           262:        ""
        !           263:        "...")
        !           264: 
        !           265: which has two operands, one of which must appear in two places, and
        !           266: 
        !           267:      (define_insn ""
        !           268:        [(set (match_operand:SI 0 "general_operand" "r")
        !           269:              (plus:SI (match_operand:SI 1 "general_operand" "0")
        !           270:                       (match_operand:SI 2 "general_operand" "r")))]
        !           271:        ""
        !           272:        "...")
        !           273: 
        !           274: which has three operands, two of which are required by a constraint
        !           275: to be identical.  If we are considering an insn of the form
        !           276: 
        !           277:      (insn N PREV NEXT
        !           278:        (set (reg:SI 3)
        !           279:             (plus:SI (reg:SI 6) (reg:SI 109)))
        !           280:        ...)
        !           281: 
        !           282: the first pattern would not apply at all, because this insn does not
        !           283: contain two identical subexpressions in the right place.  The pattern
        !           284: would say, ``That does not look like an add instruction; try other
        !           285: patterns.'' The second pattern would say, ``Yes, that's an add
        !           286: instruction, but there is something wrong with it.''  It would direct
        !           287: the reload pass of the compiler to generate additional insns to make
        !           288: the constraint true.  The results might look like this:
        !           289: 
        !           290:      (insn N2 PREV N
        !           291:        (set (reg:SI 3) (reg:SI 6))
        !           292:        ...)
        !           293:      
        !           294:      (insn N N2 NEXT
        !           295:        (set (reg:SI 3)
        !           296:             (plus:SI (reg:SI 3) (reg:SI 109)))
        !           297:        ...)
        !           298: 
        !           299: It is up to you to make sure that each operand, in each pattern, has
        !           300: constraints that can handle any RTL expression that could be present
        !           301: for that operand.  (When multiple alternatives are in use, each
        !           302: pattern must, for each possible combination of operand expressions,
        !           303: have at least one alternative which can handle that combination of
        !           304: operands.)  The constraints don't need to *allow* any possible
        !           305: operand--when this is the case, they do not constrain--but they must
        !           306: at least point the way to reloading any possible operand so that it
        !           307: will fit.
        !           308: 
        !           309:    * If the constraint accepts whatever operands the predicate
        !           310:      permits, there is no problem: reloading is never necessary for
        !           311:      this operand.
        !           312: 
        !           313:      For example, an operand whose constraints permit everything
        !           314:      except registers is safe provided its predicate rejects registers.
        !           315: 
        !           316:      An operand whose predicate accepts only constant values is safe
        !           317:      provided its constraints include the letter `i'.  If any
        !           318:      possible constant value is accepted, then nothing less than `i'
        !           319:      will do; if the predicate is more selective, then the
        !           320:      constraints may also be more selective.
        !           321: 
        !           322:    * Any operand expression can be reloaded by copying it into a
        !           323:      register.  So if an operand's constraints allow some kind of
        !           324:      register, it is certain to be safe.  It need not permit all
        !           325:      classes of registers; the compiler knows how to copy a register
        !           326:      into another register of the proper class in order to make an
        !           327:      instruction valid.
        !           328: 
        !           329:    * A nonoffsettable memory reference can be reloaded by copying the
        !           330:      address into a register.  So if the constraint uses the letter
        !           331:      `o', all memory references are taken care of.
        !           332: 
        !           333:    * A constant operand can be reloaded by allocating space in memory
        !           334:      to hold it as preinitialized data.  Then the memory reference
        !           335:      can be used in place of the constant.  So if the constraint uses
        !           336:      the letters `o' or `m', constant operands are not a problem.
        !           337: 
        !           338: If the operand's predicate can recognize registers, but the
        !           339: constraint does not permit them, it can make the compiler crash. 
        !           340: When this operand happens to be a register, the reload pass will be
        !           341: stymied, because it does not know how to copy a register temporarily
        !           342: into memory.
        !           343: 
        !           344: 
        !           345: 
        !           346: File: gcc.info,  Node: Multi-Alternative,  Next: Class Preferences,  Prev: Simple Constraints,  Up: Constraints
        !           347: 
        !           348: Multiple Alternative Constraints
        !           349: --------------------------------
        !           350: 
        !           351: Sometimes a single instruction has multiple alternative sets of
        !           352: possible operands.  For example, on the 68000, a logical-or
        !           353: instruction can combine register or an immediate value into memory,
        !           354: or it can combine any kind of operand into a register; but it cannot
        !           355: combine one memory location into another.
        !           356: 
        !           357: These constraints are represented as multiple alternatives.  An
        !           358: alternative can be described by a series of letters for each operand.
        !           359: The overall constraint for an operand is made from the letters for
        !           360: this operand from the first alternative, a comma, the letters for
        !           361: this operand from the second alternative, a comma, and so on until
        !           362: the last alternative.  Here is how it is done for fullword logical-or
        !           363: on the 68000:
        !           364: 
        !           365:      (define_insn "iorsi3"
        !           366:        [(set (match_operand:SI 0 "general_operand" "=m,d")
        !           367:              (ior:SI (match_operand:SI 1 "general_operand" "%0,0")
        !           368:                      (match_operand:SI 2 "general_operand" "dKs,dmKs")))]
        !           369:        ...)
        !           370: 
        !           371: The first alternative has `m' (memory) for operand 0, `0' for operand
        !           372: 1 (meaning it must match operand 0), and `dKs' for operand 2.  The
        !           373: second alternative has `d' (data register) for operand 0, `0' for
        !           374: operand 1, and `dmKs' for operand 2.  The `=' and `%' in the
        !           375: constraints apply to all the alternatives; their meaning is explained
        !           376: in the next section.
        !           377: 
        !           378: If all the operands fit any one alternative, the instruction is valid.
        !           379: Otherwise, for each alternative, the compiler counts how many
        !           380: instructions must be added to copy the operands so that that
        !           381: alternative applies.  The alternative requiring the least copying is
        !           382: chosen.  If two alternatives need the same amount of copying, the one
        !           383: that comes first is chosen.  These choices can be altered with the
        !           384: `?' and `!' characters:
        !           385: 
        !           386: `?'
        !           387:      Disparage slightly the alternative that the `?' appears in, as a
        !           388:      choice when no alternative applies exactly.  The compiler
        !           389:      regards this alternative as one unit more costly for each `?'
        !           390:      that appears in it.
        !           391: 
        !           392: `!'
        !           393:      Disparage severely the alternative that the `!' appears in. 
        !           394:      When operands must be copied into registers, the compiler will
        !           395:      never choose this alternative as the one to strive for.
        !           396: 
        !           397: When an insn pattern has multiple alternatives in its constraints,
        !           398: often the appearance of the assembler code is determined mostly by
        !           399: which alternative was matched.  When this is so, the C code for
        !           400: writing the assembler code can use the variable `which_alternative',
        !           401: which is the ordinal number of the alternative that was actually
        !           402: satisfied (0 for the first, 1 for the second alternative, etc.).  For
        !           403: example:
        !           404: 
        !           405:      (define_insn ""
        !           406:        [(set (match_operand:SI 0 "general_operand" "r,m")
        !           407:              (const_int 0))]
        !           408:        ""
        !           409:        "*
        !           410:        return (which_alternative == 0
        !           411:                ? \"clrreg %0\" : \"clrmem %0\");
        !           412:        ")
        !           413: 
        !           414: 
        !           415: 
        !           416: File: gcc.info,  Node: Class Preferences,  Next: Modifiers,  Prev: Multi-Alternative,  Up: Constraints
        !           417: 
        !           418: Register Class Preferences
        !           419: --------------------------
        !           420: 
        !           421: The operand constraints have another function: they enable the
        !           422: compiler to decide which kind of hardware register a pseudo register
        !           423: is best allocated to.  The compiler examines the constraints that
        !           424: apply to the insns that use the pseudo register, looking for the
        !           425: machine-dependent letters such as `d' and `a' that specify classes of
        !           426: registers.  The pseudo register is put in whichever class gets the
        !           427: most ``votes''.  The constraint letters `g' and `r' also vote: they
        !           428: vote in favor of a general register.  The machine description says
        !           429: which registers are considered general.
        !           430: 
        !           431: Of course, on some machines all registers are equivalent, and no
        !           432: register classes are defined.  Then none of this complexity is
        !           433: relevant.
        !           434: 
        !           435: 
        !           436: 
        !           437: File: gcc.info,  Node: Modifiers,  Next: No Constraints,  Prev: Class Preferences,  Up: Constraints
        !           438: 
        !           439: Constraint Modifier Characters
        !           440: ------------------------------
        !           441: 
        !           442: `='
        !           443:      Means that this operand is write-only for this instruction: the
        !           444:      previous value is discarded and replaced by output data.
        !           445: 
        !           446: `+'
        !           447:      Means that this operand is both read and written by the
        !           448:      instruction.
        !           449: 
        !           450:      When the compiler fixes up the operands to satisfy the
        !           451:      constraints, it needs to know which operands are inputs to the
        !           452:      instruction and which are outputs from it.  `=' identifies an
        !           453:      output; `+' identifies an operand that is both input and output;
        !           454:      all other operands are assumed to be input only.
        !           455: 
        !           456: `&'
        !           457:      Means (in a particular alternative) that this operand is written
        !           458:      before the instruction is finished using the input operands. 
        !           459:      Therefore, this operand may not lie in a register that is used
        !           460:      as an input operand or as part of any memory address.
        !           461: 
        !           462:      `&' applies only to the alternative in which it is written.  In
        !           463:      constraints with multiple alternatives, sometimes one
        !           464:      alternative requires `&' while others do not.  See, for example,
        !           465:      the `movdf' insn of the 68000.
        !           466: 
        !           467:      `&' does not obviate the need to write `='.
        !           468: 
        !           469: `%'
        !           470:      Declares the instruction to be commutative for this operand and
        !           471:      the following operand.  This means that the compiler may
        !           472:      interchange the two operands if that is the cheapest way to make
        !           473:      all operands fit the constraints.  This is often used in
        !           474:      patterns for addition instructions that really have only two
        !           475:      operands: the result must go in one of the arguments.  Here for
        !           476:      example, is how the 68000 halfword-add instruction is defined:
        !           477: 
        !           478:           (define_insn "addhi3"
        !           479:             [(set (match_operand:HI 0 "general_operand" "=m,r")
        !           480:                (plus:HI (match_operand:HI 1 "general_operand" "%0,0")
        !           481:                         (match_operand:HI 2 "general_operand" "di,g")))]
        !           482:             ...)
        !           483: 
        !           484:      Note that in previous versions of GNU CC the `%' constraint
        !           485:      modifier always applied to operands 1 and 2 regardless of which
        !           486:      operand it was written in.  The usual custom was to write it in
        !           487:      operand 0.  Now it must be in operand 1 if the operands to be
        !           488:      exchanged are 1 and 2.
        !           489: 
        !           490: `#'
        !           491:      Says that all following characters, up to the next comma, are to
        !           492:      be ignored as a constraint.  They are significant only for
        !           493:      choosing register preferences.
        !           494: 
        !           495: `*'
        !           496:      Says that the following character should be ignored when
        !           497:      choosing register preferences.  `*' has no effect on the meaning
        !           498:      of the constraint as a constraint.
        !           499: 
        !           500:      Here is an example: the 68000 has an instruction to sign-extend
        !           501:      a halfword in a data register, and can also sign-extend a value
        !           502:      by copying it into an address register.  While either kind of
        !           503:      register is acceptable, the constraints on an address-register
        !           504:      destination are less strict, so it is best if register
        !           505:      allocation makes an address register its goal.  Therefore, `*'
        !           506:      is used so that the `d' constraint letter (for data register) is
        !           507:      ignored when computing register preferences.
        !           508: 
        !           509:           (define_insn "extendhisi2"
        !           510:             [(set (match_operand:SI 0 "general_operand" "=*d,a")
        !           511:                   (sign_extend:SI
        !           512:                    (match_operand:HI 1 "general_operand" "0,g")))]
        !           513:             ...)
        !           514: 
        !           515: 
        !           516: 
        !           517: File: gcc.info,  Node: No Constraints,  Prev: Modifiers,  Up: Constraints
        !           518: 
        !           519: Not Using Constraints
        !           520: ---------------------
        !           521: 
        !           522: Some machines are so clean that operand constraints are not required.
        !           523: For example, on the Vax, an operand valid in one context is valid in
        !           524: any other context.  On such a machine, every operand constraint would
        !           525: be `g', excepting only operands of ``load address'' instructions
        !           526: which are written as if they referred to a memory location's contents
        !           527: but actual refer to its address.  They would have constraint `p'.
        !           528: 
        !           529: For such machines, instead of writing `g' and `p' for all the
        !           530: constraints, you can choose to write a description with empty
        !           531: constraints.  Then you write `""' for the constraint in every
        !           532: `match_operand'.  Address operands are identified by writing an
        !           533: `address' expression around the `match_operand', not by their
        !           534: constraints.
        !           535: 
        !           536: When the machine description has just empty constraints, certain
        !           537: parts of compilation are skipped, making the compiler faster. 
        !           538: However, few machines actually do not need constraints; all machine
        !           539: descriptions now in existence use constraints.
        !           540: 
        !           541: 
        !           542: 
        !           543: File: gcc.info,  Node: Standard Names,  Next: Pattern Ordering,  Prev: Constraints,  Up: Machine Desc
        !           544: 
        !           545: Standard Names for Patterns Used in Generation
        !           546: ==============================================
        !           547: 
        !           548: Here is a table of the instruction names that are meaningful in the
        !           549: RTL generation pass of the compiler.  Giving one of these names to an
        !           550: instruction pattern tells the RTL generation pass that it can use the
        !           551: pattern in to accomplish a certain task.
        !           552: 
        !           553: `movM'
        !           554:      Here M stands for a two-letter machine mode name, in lower case.
        !           555:      This instruction pattern moves data with that machine mode from
        !           556:      operand 1 to operand 0.  For example, `movsi' moves full-word
        !           557:      data.
        !           558: 
        !           559:      If operand 0 is a `subreg' with mode M of a register whose own
        !           560:      mode is wider than M, the effect of this instruction is to store
        !           561:      the specified value in the part of the register that corresponds
        !           562:      to mode M.  The effect on the rest of the register is undefined.
        !           563: 
        !           564:      This class of patterns is special in several ways.  First of
        !           565:      all, each of these names *must* be defined, because there is no
        !           566:      other way to copy a datum from one place to another.
        !           567: 
        !           568:      Second, these patterns are not used solely in the RTL generation
        !           569:      pass.  Even the reload pass can generate move insns to copy
        !           570:      values from stack slots into temporary registers.  When it does
        !           571:      so, one of the operands is a hard register and the other is an
        !           572:      operand that can need to be reloaded into a register.
        !           573: 
        !           574:      Therefore, when given such a pair of operands, the pattern must
        !           575:      generate RTL which needs no reloading and needs no temporary
        !           576:      registers--no registers other than the operands.  For example,
        !           577:      if you support the pattern with a `define_expand', then in such
        !           578:      a case the `define_expand' mustn't call `force_reg' or any other
        !           579:      such function which might generate new pseudo registers.
        !           580: 
        !           581:      This requirement exists even for subword modes on a RISC machine
        !           582:      where fetching those modes from memory normally requires several
        !           583:      insns and some temporary registers.  Look in `spur.md' to see
        !           584:      how the requirement can be satisfied.
        !           585: 
        !           586:      The variety of operands that have reloads depends on the rest of
        !           587:      the machine description, but typically on a RISC machine these
        !           588:      can only be pseudo registers that did not get hard registers,
        !           589:      while on other machines explicit memory references will get
        !           590:      optional reloads.
        !           591: 
        !           592:      The constraints on a `moveM' must allow any hard register to be
        !           593:      moved to any other hard register (provided that
        !           594:      `HARD_REGNO_MODE_OK' permits mode M in both registers).
        !           595: 
        !           596:      It is obligatory to support floating point `moveM' instructions
1.1.1.2   root      597:      into and out of any registers that can hold fixed point values,
                    598:      because unions and structures (which have modes `SImode' or
                    599:      `DImode') can be in those registers and they may have floating
                    600:      point members.
                    601: 
1.1.1.3 ! root      602:      There may also be a need to support fixed point `moveM'
1.1.1.2   root      603:      instructions in and out of floating point registers. 
                    604:      Unfortunately, I have forgotten why this was so, and I don't
                    605:      know whether it is still true.  If `HARD_REGNO_MODE_OK' rejects
                    606:      fixed point values in floating point registers, then the
1.1.1.3 ! root      607:      constraints of the fixed point `moveM' instructions must be
1.1.1.2   root      608:      designed to avoid ever trying to reload into a floating point
                    609:      register.
                    610: 
1.1.1.3 ! root      611: `movstrictM'
        !           612:      Like `movM' except that if operand 0 is a `subreg' with mode M
        !           613:      of a register whose natural mode is wider, the `movstrictM'
        !           614:      instruction is guaranteed not to alter any of the register
        !           615:      except the part which belongs to mode M.
        !           616: 
        !           617: `addM3'
        !           618:      Add operand 2 and operand 1, storing the result in operand 0. 
        !           619:      All operands must have mode M.  This can be used even on
        !           620:      two-address machines, by means of constraints requiring operands
        !           621:      1 and 0 to be the same location.
        !           622: 
        !           623: `subM3', `mulM3', `umulM3', `divM3', `udivM3', `modM3', `umodM3', `andM3', `iorM3', `xorM3'
        !           624:      Similar, for other arithmetic operations.
        !           625: 
        !           626:      There are special considerations for register classes for
        !           627:      logical-and instructions, affecting also the macro
        !           628:      `PREFERRED_RELOAD_CLASS'.  They apply not only to the patterns
        !           629:      with these standard names, but to any patterns that will match
        !           630:      such an instruction.  *Note Register Classes::.
        !           631: 
        !           632: `mulhisi3'
        !           633:      Multiply operands 1 and 2, which have mode `HImode', and store a
        !           634:      `SImode' product in operand 0.
        !           635: 
        !           636: `mulqihi3', `mulsidi3'
        !           637:      Similar widening-multiplication instructions of other widths.
        !           638: 
        !           639: `umulqihi3', `umulhisi3', `umulsidi3'
        !           640:      Similar widening-multiplication instructions that do unsigned
        !           641:      multiplication.
        !           642: 
        !           643: `divmodM4'
        !           644:      Signed division that produces both a quotient and a remainder. 
        !           645:      Operand 1 is divided by operand 2 to produce a quotient stored
        !           646:      in operand 0 and a remainder stored in operand 3.
        !           647: 
        !           648: `udivmodM4'
        !           649:      Similar, but does unsigned division.
        !           650: 
        !           651: `ashlM3'
        !           652:      Arithmetic-shift operand 1 left by a number of bits specified by
        !           653:      operand 2, and store the result in operand 0.  Operand 2 has
        !           654:      mode `SImode', not mode M.
        !           655: 
        !           656: `ashrM3', `lshlM3', `lshrM3', `rotlM3', `rotrM3'
        !           657:      Other shift and rotate instructions.
        !           658: 
        !           659:      Logical and arithmetic left shift are the same.  Machines that
        !           660:      do not allow negative shift counts often have only one
        !           661:      instruction for shifting left.  On such machines, you should
        !           662:      define a pattern named `ashlM3' and leave `lshlM3' undefined.
        !           663: 
        !           664:      There are special considerations for register classes for shift
        !           665:      instructions, affecting also the macro `PREFERRED_RELOAD_CLASS'.
        !           666:      They apply not only to the patterns with these standard names,
        !           667:      but to any patterns that will match such an instruction.  *Note
        !           668:      Register Classes::.
        !           669: 
        !           670: `negM2'
        !           671:      Negate operand 1 and store the result in operand 0.
        !           672: 
        !           673: `absM2'
        !           674:      Store the absolute value of operand 1 into operand 0.
        !           675: 
        !           676: `sqrtM2'
        !           677:      Store the square root of operand 1 into operand 0.
        !           678: 
        !           679: `ffsM2'
        !           680:      Store into operand 0 one plus the index of the least significant
        !           681:      1-bit of operand 1.  If operand 1 is zero, store zero.  M is the
        !           682:      mode of operand 0; operand 1's mode is specified by the
        !           683:      instruction pattern, and the compiler will convert the operand
        !           684:      to that mode before generating the instruction.
        !           685: 
        !           686: `one_cmplM2'
        !           687:      Store the bitwise-complement of operand 1 into operand 0.
        !           688: 
        !           689: `cmpM'
        !           690:      Compare operand 0 and operand 1, and set the condition codes. 
        !           691:      The RTL pattern should look like this:
        !           692: 
        !           693:           (set (cc0) (compare (match_operand:M 0 ...)
        !           694:                               (match_operand:M 1 ...)))
        !           695: 
        !           696:      Each such definition in the machine description, for integer
        !           697:      mode M, must have a corresponding `tstM' pattern, because
        !           698:      optimization can simplify the compare into a test when operand 1
        !           699:      is zero.
        !           700: 
        !           701: `tstM'
        !           702:      Compare operand 0 against zero, and set the condition codes. 
        !           703:      The RTL pattern should look like this:
        !           704: 
        !           705:           (set (cc0) (match_operand:M 0 ...))
        !           706: 
        !           707: `movstrM'
        !           708:      Block move instruction.  The addresses of the destination and
        !           709:      source strings are the first two operands, and both are in mode
        !           710:      `Pmode'.  The number of bytes to move is the third operand, in
        !           711:      mode M.  The fourth operand is the known shared alignment of the
        !           712:      source and destination, in the form of a `const_int' rtx.
        !           713: 
        !           714: `cmpstrM'
        !           715:      Block compare instruction, with operands like `movstrM' except
        !           716:      that the two memory blocks are compared byte by byte in
        !           717:      lexicographic order.  The effect of the instruction is to set
        !           718:      the condition codes.
        !           719: 
        !           720: `floatMN2'
        !           721:      Convert signed integer operand 1 (valid for fixed point mode M)
        !           722:      to floating point mode N and store in operand 0 (which has mode
        !           723:      N).
        !           724: 
        !           725: `floatunsMN2'
        !           726:      Convert unsigned integer operand 1 (valid for fixed point mode
        !           727:      M) to floating point mode N and store in operand 0 (which has
        !           728:      mode N).
        !           729: 
        !           730: `fixMN2'
        !           731:      Convert operand 1 (valid for floating point mode M) to fixed
        !           732:      point mode N as a signed number and store in operand 0 (which
        !           733:      has mode N).  This instruction's result is defined only when the
        !           734:      value of operand 1 is an integer.
        !           735: 
        !           736: `fixunsMN2'
        !           737:      Convert operand 1 (valid for floating point mode M) to fixed
        !           738:      point mode N as an unsigned number and store in operand 0 (which
        !           739:      has mode N).  This instruction's result is defined only when the
        !           740:      value of operand 1 is an integer.
        !           741: 
        !           742: `ftruncM2'
        !           743:      Convert operand 1 (valid for floating point mode M) to an
        !           744:      integer value, still represented in floating point mode M, and
        !           745:      store it in operand 0 (valid for floating point mode M).
        !           746: 
        !           747: `fix_truncMN2'
        !           748:      Like `fixMN2' but works for any floating point value of mode M
        !           749:      by converting the value to an integer.
        !           750: 
        !           751: `fixuns_truncMN2'
        !           752:      Like `fixunsMN2' but works for any floating point value of mode
        !           753:      M by converting the value to an integer.
        !           754: 
        !           755: `truncMN'
        !           756:      Truncate operand 1 (valid for mode M) to mode N and store in
        !           757:      operand 0 (which has mode N).  Both modes must be fixed point or
        !           758:      both floating point.
        !           759: 
        !           760: `extendMN'
        !           761:      Sign-extend operand 1 (valid for mode M) to mode N and store in
        !           762:      operand 0 (which has mode N).  Both modes must be fixed point or
        !           763:      both floating point.
        !           764: 
        !           765: `zero_extendMN'
        !           766:      Zero-extend operand 1 (valid for mode M) to mode N and store in
        !           767:      operand 0 (which has mode N).  Both modes must be fixed point.
        !           768: 
        !           769: `extv'
        !           770:      Extract a bit-field from operand 1 (a register or memory
        !           771:      operand), where operand 2 specifies the width in bits and
        !           772:      operand 3 the starting bit, and store it in operand 0.  Operand
        !           773:      0 must have `Simode'.  Operand 1 may have mode `QImode' or
        !           774:      `SImode'; often `SImode' is allowed only for registers. 
        !           775:      Operands 2 and 3 must be valid for `SImode'.
        !           776: 
        !           777:      The RTL generation pass generates this instruction only with
        !           778:      constants for operands 2 and 3.
        !           779: 
        !           780:      The bit-field value is sign-extended to a full word integer
        !           781:      before it is stored in operand 0.
        !           782: 
        !           783: `extzv'
        !           784:      Like `extv' except that the bit-field value is zero-extended.
        !           785: 
        !           786: `insv'
        !           787:      Store operand 3 (which must be valid for `SImode') into a
        !           788:      bit-field in operand 0, where operand 1 specifies the width in
        !           789:      bits and operand 2 the starting bit.  Operand 0 may have mode
        !           790:      `QImode' or `SImode'; often `SImode' is allowed only for
        !           791:      registers.  Operands 1 and 2 must be valid for `SImode'.
        !           792: 
        !           793:      The RTL generation pass generates this instruction only with
        !           794:      constants for operands 1 and 2.
        !           795: 
        !           796: `sCOND'
        !           797:      Store zero or nonzero in the operand according to the condition
        !           798:      codes.  Value stored is nonzero iff the condition COND is true. 
        !           799:      COND is the name of a comparison operation expression code, such
        !           800:      as `eq', `lt' or `leu'.
        !           801: 
        !           802:      You specify the mode that the operand must have when you write
        !           803:      the `match_operand' expression.  The compiler automatically sees
        !           804:      which mode you have used and supplies an operand of that mode.
        !           805: 
        !           806:      The value stored for a true condition must have 1 as its low
        !           807:      bit, or else must be negative.  Otherwise the instruction is not
        !           808:      suitable and must be omitted from the machine description.  You
        !           809:      must tell the compiler exactly which value is stored by defining
        !           810:      the macro `STORE_FLAG_VALUE'.
        !           811: 
        !           812: `bCOND'
        !           813:      Conditional branch instruction.  Operand 0 is a `label_ref' that
        !           814:      refers to the label to jump to.  Jump if the condition codes
        !           815:      meet condition COND.
        !           816: 
        !           817: `call'
        !           818:      Subroutine call instruction returning no value.  Operand 0 is
        !           819:      the function to call; operand 1 is the number of bytes of
        !           820:      arguments pushed (in mode `SImode', except it is normally a
        !           821:      `const_int'); operand 2 is the number of registers used as
        !           822:      operands.
        !           823: 
        !           824:      On most machines, operand 2 is not actually stored into the RTL
        !           825:      pattern.  It is supplied for the sake of some RISC machines
        !           826:      which need to put this information into the assembler code; they
        !           827:      can put it in the RTL instead of operand 1.
        !           828: 
        !           829:      Operand 0 should be a `mem' RTX whose address is the address of
        !           830:      the function.
        !           831: 
        !           832: `call_value'
        !           833:      Subroutine call instruction returning a value.  Operand 0 is the
        !           834:      hard register in which the value is returned.  There are three
        !           835:      more operands, the same as the three operands of the `call'
        !           836:      instruction (but with numbers increased by one).
        !           837: 
        !           838:      Subroutines that return `BLKmode' objects use the `call' insn.
        !           839: 
        !           840: `return'
        !           841:      Subroutine return instruction.  This instruction pattern name
        !           842:      should be defined only if a single instruction can do all the
        !           843:      work of returning from a function.
        !           844: 
        !           845: `nop'
        !           846:      No-op instruction.  This instruction pattern name should always
        !           847:      be defined to output a no-op in assembler code.  `(const_int 0)'
        !           848:      will do as an RTL pattern.
        !           849: 
        !           850: `casesi'
        !           851:      Instruction to jump through a dispatch table, including bounds
        !           852:      checking.  This instruction takes five operands:
        !           853: 
        !           854:        1. The index to dispatch on, which has mode `SImode'.
        !           855: 
        !           856:        2. The lower bound for indices in the table, an integer
        !           857:           constant.
        !           858: 
        !           859:        3. The total range of indices in the table--the largest index
        !           860:           minus the smallest one (both inclusive).
        !           861: 
        !           862:        4. A label to jump to if the index has a value outside the
        !           863:           bounds.  (If the machine-description macro
        !           864:           `CASE_DROPS_THROUGH' is defined, then an out-of-bounds
        !           865:           index drops through to the code following the jump table
        !           866:           instead of jumping to this label.  In that case, this label
        !           867:           is not actually used by the `casesi' instruction, but it is
        !           868:           always provided as an operand.)
        !           869: 
        !           870:        5. A label that precedes the table itself.
        !           871: 
        !           872:      The table is a `addr_vec' or `addr_diff_vec' inside of a
        !           873:      `jump_insn'.  The number of elements in the table is one plus
        !           874:      the difference between the upper bound and the lower bound.
        !           875: 
        !           876: `tablejump'
        !           877:      Instruction to jump to a variable address.  This is a low-level
        !           878:      capability which can be used to implement a dispatch table when
        !           879:      there is no `casesi' pattern.
        !           880: 
        !           881:      This pattern requires two operands: the address or offset, and a
        !           882:      label which should immediately precede the jump table.  If the
        !           883:      macro `CASE_VECTOR_PC_RELATIVE' is defined then the first
        !           884:      operand is an absolute address to jump to; otherwise, it is an
        !           885:      offset which counts from the address of the table.
        !           886: 
        !           887:      The `tablejump' insn is always the last insn before the jump
        !           888:      table it uses.  Its assembler code normally has no need to use
        !           889:      the second operand, but you should incorporate it in the RTL
        !           890:      pattern so that the jump optimizer will not delete the table as
        !           891:      unreachable code.
        !           892: 
        !           893: 
        !           894: 
        !           895: File: gcc.info,  Node: Pattern Ordering,  Next: Dependent Patterns,  Prev: Standard Names,  Up: Machine Desc
        !           896: 
        !           897: When the Order of Patterns Matters
        !           898: ==================================
        !           899: 
        !           900: Sometimes an insn can match more than one instruction pattern.  Then
        !           901: the pattern that appears first in the machine description is the one
        !           902: used.  Therefore, more specific patterns (patterns that will match
        !           903: fewer things) and faster instructions (those that will produce better
        !           904: code when they do match) should usually go first in the description.
        !           905: 
        !           906: In some cases the effect of ordering the patterns can be used to hide
        !           907: a pattern when it is not valid.  For example, the 68000 has an
        !           908: instruction for converting a fullword to floating point and another
        !           909: for converting a byte to floating point.  An instruction converting
        !           910: an integer to floating point could match either one.  We put the
        !           911: pattern to convert the fullword first to make sure that one will be
        !           912: used rather than the other.  (Otherwise a large integer might be
        !           913: generated as a single-byte immediate quantity, which would not work.)
        !           914: Instead of using this pattern ordering it would be possible to make
        !           915: the pattern for convert-a-byte smart enough to deal properly with any
        !           916: constant value.
        !           917: 
        !           918: 
        !           919: 
        !           920: File: gcc.info,  Node: Dependent Patterns,  Next: Jump Patterns,  Prev: Pattern Ordering,  Up: Machine Desc
        !           921: 
        !           922: Interdependence of Patterns
        !           923: ===========================
        !           924: 
        !           925: Every machine description must have a named pattern for each of the
        !           926: conditional branch names `bCOND'.  The recognition template must
        !           927: always have the form
        !           928: 
        !           929:      (set (pc)
        !           930:           (if_then_else (COND (cc0) (const_int 0))
        !           931:                         (label_ref (match_operand 0 "" ""))
        !           932:                         (pc)))
        !           933: 
        !           934: In addition, every machine description must have an anonymous pattern
        !           935: for each of the possible reverse-conditional branches.  These
        !           936: patterns look like
        !           937: 
        !           938:      (set (pc)
        !           939:           (if_then_else (COND (cc0) (const_int 0))
        !           940:                         (pc)
        !           941:                         (label_ref (match_operand 0 "" ""))))
        !           942: 
        !           943: They are necessary because jump optimization can turn
        !           944: direct-conditional branches into reverse-conditional branches.
        !           945: 
        !           946: The compiler does more with RTL than just create it from patterns and
        !           947: recognize the patterns: it can perform arithmetic expression codes
        !           948: when constant values for their operands can be determined.  As a
        !           949: result, sometimes having one pattern can require other patterns.  For
        !           950: example, the Vax has no `and' instruction, but it has `and not'
        !           951: instructions.  Here is the definition of one of them:
        !           952: 
        !           953:      (define_insn "andcbsi2"
        !           954:        [(set (match_operand:SI 0 "general_operand" "")
        !           955:              (and:SI (match_dup 0)
        !           956:                      (not:SI (match_operand:SI
        !           957:                                1 "general_operand" ""))))]
        !           958:        ""
        !           959:        "bicl2 %1,%0")
        !           960: 
        !           961: If operand 1 is an explicit integer constant, an instruction
        !           962: constructed using that pattern can be simplified into an `and' like
        !           963: this:
        !           964: 
        !           965:      (set (reg:SI 41)
        !           966:           (and:SI (reg:SI 41)
        !           967:                   (const_int 0xffff7fff)))
        !           968: 
        !           969: (where the integer constant is the one's complement of what appeared
        !           970: in the original instruction).
        !           971: 
        !           972: To avoid a fatal error, the compiler must have a pattern that
        !           973: recognizes such an instruction.  Here is what is used:
        !           974: 
        !           975:      (define_insn ""
        !           976:        [(set (match_operand:SI 0 "general_operand" "")
        !           977:              (and:SI (match_dup 0)
        !           978:                      (match_operand:SI 1 "general_operand" "")))]
        !           979:        "GET_CODE (operands[1]) == CONST_INT"
        !           980:        "*
        !           981:      { operands[1]
        !           982:          = gen_rtx (CONST_INT, VOIDmode, ~INTVAL (operands[1]));
        !           983:        return \"bicl2 %1,%0\";
        !           984:      }")
        !           985: 
        !           986: Whereas a pattern to match a general `and' instruction is impossible
        !           987: to support on the Vax, this pattern is possible because it matches
        !           988: only a constant second argument: a special case that can be output as
        !           989: an `and not' instruction.
        !           990: 
        !           991: A ``compare'' instruction whose RTL looks like this:
        !           992: 
        !           993:      (set (cc0) (compare OPERAND (const_int 0)))
        !           994: 
        !           995: may be simplified by optimization into a ``test'' like this:
        !           996: 
        !           997:      (set (cc0) OPERAND)
        !           998: 
        !           999: So in the machine description, each ``compare'' pattern for an
        !          1000: integer mode must have a corresponding ``test'' pattern that will
        !          1001: match the result of such simplification.
        !          1002: 
        !          1003: In some cases machines support instructions identical except for the
        !          1004: machine mode of one or more operands.  For example, there may be
        !          1005: ``sign-extend halfword'' and ``sign-extend byte'' instructions whose
        !          1006: patterns are
        !          1007: 
        !          1008:      (set (match_operand:SI 0 ...)
        !          1009:           (extend:SI (match_operand:HI 1 ...)))
        !          1010:      
        !          1011:      (set (match_operand:SI 0 ...)
        !          1012:           (extend:SI (match_operand:QI 1 ...)))
        !          1013: 
        !          1014: Constant integers do not specify a machine mode, so an instruction to
        !          1015: extend a constant value could match either pattern.  The pattern it
        !          1016: actually will match is the one that appears first in the file.  For
        !          1017: correct results, this must be the one for the widest possible mode
        !          1018: (`HImode', here).  If the pattern matches the `QImode' instruction,
        !          1019: the results will be incorrect if the constant value does not actually
        !          1020: fit that mode.
        !          1021: 
        !          1022: Such instructions to extend constants are rarely generated because
        !          1023: they are optimized away, but they do occasionally happen in
        !          1024: nonoptimized compilations.
        !          1025: 
        !          1026: When an instruction has the constraint letter `o', the reload pass
        !          1027: may generate instructions which copy a nonoffsettable address into an
        !          1028: index register.  The idea is that the register can be used as a
        !          1029: replacement offsettable address.  In order for these generated
        !          1030: instructions to work, there must be patterns to copy any kind of
        !          1031: valid address into a register.
        !          1032: 
        !          1033: Most older machine designs have ``load address'' instructions which
        !          1034: do just what is needed here.  Some RISC machines do not advertise
        !          1035: such instructions, but the possible addresses on these machines are
        !          1036: very limited, so it is easy to fake them.
        !          1037: 
        !          1038: Auto-increment and auto-decrement addresses are an exception; there
        !          1039: need not be an instruction that can copy such an address into a
        !          1040: register, because reload handles these cases in a different manner.
        !          1041: 
        !          1042: 
        !          1043: 
        !          1044: File: gcc.info,  Node: Jump Patterns,  Next: Peephole Definitions,  Prev: Dependent Patterns,  Up: Machine Desc
        !          1045: 
        !          1046: Defining Jump Instruction Patterns
        !          1047: ==================================
        !          1048: 
        !          1049: GNU CC assumes that the machine has a condition code.  A comparison
        !          1050: insn sets the condition code, recording the results of both signed
        !          1051: and unsigned comparison of the given operands.  A separate branch
        !          1052: insn tests the condition code and branches or not according its
        !          1053: value.  The branch insns come in distinct signed and unsigned
        !          1054: flavors.  Many common machines, such as the Vax, the 68000 and the
        !          1055: 32000, work this way.
        !          1056: 
        !          1057: Some machines have distinct signed and unsigned compare instructions,
        !          1058: and only one set of conditional branch instructions.  The easiest way
        !          1059: to handle these machines is to treat them just like the others until
        !          1060: the final stage where assembly code is written.  At this time, when
        !          1061: outputting code for the compare instruction, peek ahead at the
        !          1062: following branch using `NEXT_INSN (insn)'.  (The variable `insn'
        !          1063: refers to the insn being output, in the output-writing code in an
        !          1064: instruction pattern.)  If the RTL says that is an unsigned branch,
        !          1065: output an unsigned compare; otherwise output a signed compare.  When
        !          1066: the branch itself is output, you can treat signed and unsigned
        !          1067: branches identically.
        !          1068: 
        !          1069: The reason you can do this is that GNU CC always generates a pair of
        !          1070: consecutive RTL insns, one to set the condition code and one to test
        !          1071: it, and keeps the pair inviolate until the end.
        !          1072: 
        !          1073: To go with this technique, you must define the machine-description
        !          1074: macro `NOTICE_UPDATE_CC' to do `CC_STATUS_INIT'; in other words, no
        !          1075: compare instruction is superfluous.
        !          1076: 
        !          1077: Some machines have compare-and-branch instructions and no condition
        !          1078: code.  A similar technique works for them.  When it is time to
        !          1079: ``output'' a compare instruction, record its operands in two static
        !          1080: variables.  When outputting the branch-on-condition-code instruction
        !          1081: that follows, actually output a compare-and-branch instruction that
        !          1082: uses the remembered operands.
        !          1083: 
        !          1084: It also works to define patterns for compare-and-branch instructions.
        !          1085: In optimizing compilation, the pair of compare and branch
        !          1086: instructions will be combined according to these patterns.  But this
        !          1087: does not happen if optimization is not requested.  So you must use
        !          1088: one of the solutions above in addition to any special patterns you
        !          1089: define.
1.1       root     1090: 
                   1091: 

unix.superglobalmegacorp.com

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