Annotation of GNUtools/cc/config/i860/i860.md, revision 1.1

1.1     ! root        1: ;;- Machine description for Intel 860 chip for GNU C compiler
        !             2: ;;   Copyright (C) 1989, 1990 Free Software Foundation, Inc.
        !             3: 
        !             4: ;; This file is part of GNU CC.
        !             5: 
        !             6: ;; GNU CC is free software; you can redistribute it and/or modify
        !             7: ;; it under the terms of the GNU General Public License as published by
        !             8: ;; the Free Software Foundation; either version 2, or (at your option)
        !             9: ;; any later version.
        !            10: 
        !            11: ;; GNU CC is distributed in the hope that it will be useful,
        !            12: ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
        !            13: ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        !            14: ;; GNU General Public License for more details.
        !            15: 
        !            16: ;; You should have received a copy of the GNU General Public License
        !            17: ;; along with GNU CC; see the file COPYING.  If not, write to
        !            18: ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
        !            19: 
        !            20: 
        !            21: ;;- See file "rtl.def" for documentation on define_insn, match_*, et. al.
        !            22: 
        !            23: ;;- cpp macro #define NOTICE_UPDATE_CC in file tm.h handles condition code
        !            24: ;;- updates for most instructions.
        !            25: 
        !            26: ;;- Operand classes for the register allocator:
        !            27: 
        !            28: /* Bit-test instructions.  */
        !            29: 
        !            30: (define_insn ""
        !            31:   [(set (cc0) (eq (and:SI (match_operand:SI 0 "register_operand" "r")
        !            32:                          (match_operand:SI 1 "logic_operand" "rL"))
        !            33:                  (const_int 0)))]
        !            34:   ""
        !            35:   "*
        !            36: {
        !            37:   CC_STATUS_PARTIAL_INIT;
        !            38:   return \"and %1,%0,%?r0\";
        !            39: }")
        !            40: 
        !            41: (define_insn ""
        !            42:   [(set (cc0) (ne (and:SI (match_operand:SI 0 "register_operand" "r")
        !            43:                          (match_operand:SI 1 "logic_operand" "rL"))
        !            44:                  (const_int 0)))]
        !            45:   ""
        !            46:   "*
        !            47: {
        !            48:   CC_STATUS_PARTIAL_INIT;
        !            49:   cc_status.flags |= CC_NEGATED;
        !            50:   return \"and %1,%0,%?r0\";
        !            51: }")
        !            52: 
        !            53: (define_insn ""
        !            54:   [(set (cc0) (eq (and:SI (match_operand:SI 0 "register_operand" "r")
        !            55:                          (match_operand:SI 1 "immediate_operand" "i"))
        !            56:                  (const_int 0)))]
        !            57:   "GET_CODE (operands[1]) == CONST_INT && (INTVAL (operands[1]) & 0xffff) == 0"
        !            58:   "*
        !            59: {
        !            60:   CC_STATUS_PARTIAL_INIT;
        !            61:   return \"andh %H1,%0,%?r0\";
        !            62: }")
        !            63: 
        !            64: (define_insn ""
        !            65:   [(set (cc0) (ne (and:SI (match_operand:SI 0 "register_operand" "r")
        !            66:                          (match_operand:SI 1 "immediate_operand" "i"))
        !            67:                  (const_int 0)))]
        !            68:   "GET_CODE (operands[1]) == CONST_INT && (INTVAL (operands[1]) & 0xffff) == 0"
        !            69:   "*
        !            70: {
        !            71:   CC_STATUS_PARTIAL_INIT;
        !            72:   cc_status.flags |= CC_NEGATED;
        !            73:   return \"andh %H1,%0,%?r0\";
        !            74: }")
        !            75: 
        !            76: (define_insn ""
        !            77:   [(set (cc0) (eq (ashiftrt:SI
        !            78:                   (sign_extend:SI
        !            79:                    (ashift:QI (match_operand:QI 0 "register_operand" "r")
        !            80:                               (match_operand:QI 1 "logic_int" "n")))
        !            81:                   (match_operand:SI 2 "logic_int" "n"))
        !            82:                  (const_int 0)))]
        !            83:   ""
        !            84:   "*
        !            85: {
        !            86:   int width = 8 - INTVAL (operands[2]);
        !            87:   int pos = 8 - width - INTVAL (operands[1]);
        !            88: 
        !            89:   CC_STATUS_PARTIAL_INIT;
        !            90:   operands[2] = gen_rtx (CONST_INT, VOIDmode,
        !            91:                         ~((-1) << width) << pos);
        !            92:   return \"and %2,%0,%?r0\";
        !            93: }")
        !            94: 
        !            95: ;; -------------------------------------------------------------------------
        !            96: ;; SImode signed integer comparisons
        !            97: ;; -------------------------------------------------------------------------
        !            98: 
        !            99: (define_insn "cmpeqsi"
        !           100:   [(set (cc0) (eq (match_operand:SI 0 "logic_operand" "r,rL")
        !           101:                  (match_operand:SI 1 "logic_operand" "L,r")))]
        !           102:   ""
        !           103:   "*
        !           104: {
        !           105:   CC_STATUS_PARTIAL_INIT;
        !           106:   if (REG_P (operands[0]))
        !           107:     return \"xor %1,%0,%?r0\";
        !           108:   else
        !           109:     return \"xor %0,%1,%?r0\";
        !           110: }")
        !           111: 
        !           112: (define_insn "cmpnesi"
        !           113:   [(set (cc0) (ne (match_operand:SI 0 "logic_operand" "r,rL")
        !           114:                  (match_operand:SI 1 "logic_operand" "L,r")))]
        !           115:   ""
        !           116:   "*
        !           117: {
        !           118:   CC_STATUS_PARTIAL_INIT;
        !           119:   cc_status.flags |= CC_NEGATED;
        !           120:   if (REG_P (operands[0]))
        !           121:     return \"xor %1,%0,%?r0\";
        !           122:   else
        !           123:     return \"xor %0,%1,%?r0\";
        !           124: }")
        !           125: 
        !           126: (define_insn "cmpltsi"
        !           127:   [(set (cc0) (lt (match_operand:SI 0 "arith_operand" "r,rI")
        !           128:                  (match_operand:SI 1 "arith_operand" "I,r")))]
        !           129:   ""
        !           130:   "*
        !           131: {
        !           132:   CC_STATUS_PARTIAL_INIT;
        !           133:   if (REG_P (operands[1]))
        !           134:     return \"subs %0,%1,%?r0\";
        !           135:   else
        !           136:     {
        !           137:       cc_status.flags |= CC_REVERSED;
        !           138:       operands[1] = gen_rtx (CONST_INT, VOIDmode, - INTVAL (operands[1]));
        !           139:       return \"adds %1,%0,%?r0\";
        !           140:     }
        !           141: }")
        !           142: 
        !           143: (define_insn "cmpgtsi"
        !           144:   [(set (cc0) (gt (match_operand:SI 0 "arith_operand" "r,rI")
        !           145:                  (match_operand:SI 1 "arith_operand" "I,r")))]
        !           146:   ""
        !           147:   "*
        !           148: {
        !           149:   CC_STATUS_PARTIAL_INIT;
        !           150:   if (REG_P (operands[0]))
        !           151:     return \"subs %1,%0,%?r0\";
        !           152:   else
        !           153:     {
        !           154:       cc_status.flags |= CC_REVERSED;
        !           155:       operands[0] = gen_rtx (CONST_INT, VOIDmode, - INTVAL (operands[0]));
        !           156:       return \"adds %0,%1,%?r0\";
        !           157:     }
        !           158: }")
        !           159: 
        !           160: (define_insn "cmplesi"
        !           161:   [(set (cc0) (le (match_operand:SI 0 "arith_operand" "r,rI")
        !           162:                  (match_operand:SI 1 "arith_operand" "I,r")))]
        !           163:   ""
        !           164:   "*
        !           165: {
        !           166:   CC_STATUS_PARTIAL_INIT;
        !           167:   cc_status.flags |= CC_NEGATED;
        !           168:   if (REG_P (operands[0]))
        !           169:     return \"subs %1,%0,%?r0\";
        !           170:   else
        !           171:     {
        !           172:       cc_status.flags |= CC_REVERSED;
        !           173:       operands[0] = gen_rtx (CONST_INT, VOIDmode, - INTVAL (operands[0]));
        !           174:       return \"adds %0,%1,%?r0\";
        !           175:     }
        !           176: }")
        !           177: 
        !           178: (define_insn "cmpgesi"
        !           179:   [(set (cc0) (ge (match_operand:SI 0 "arith_operand" "r,rI")
        !           180:                  (match_operand:SI 1 "arith_operand" "I,r")))]
        !           181:   ""
        !           182:   "*
        !           183: {
        !           184:   CC_STATUS_PARTIAL_INIT;
        !           185:   cc_status.flags |= CC_NEGATED;
        !           186:   if (REG_P (operands[1]))
        !           187:     return \"subs %0,%1,%?r0\";
        !           188:   else
        !           189:     {
        !           190:       cc_status.flags |= CC_REVERSED;
        !           191:       operands[1] = gen_rtx (CONST_INT, VOIDmode, - INTVAL (operands[1]));
        !           192:       return \"adds %1,%0,%?r0\";
        !           193:     }
        !           194: }")
        !           195: 
        !           196: ;; -------------------------------------------------------------------------
        !           197: ;; SImode unsigned integer comparisons
        !           198: ;; -------------------------------------------------------------------------
        !           199: 
        !           200: ;; WARNING!  There is a small i860 hardware limitation (bug?) which we
        !           201: ;; may run up against (if we are not careful) when we are trying to do
        !           202: ;; unsigned comparisons like (x >= 0), (x < 0), (0 <= x), and (0 > x).
        !           203: ;; Specifically, we must avoid using an `addu' instruction to perform
        !           204: ;; such comparisons because the result (in the CC bit register) will
        !           205: ;; come out wrong.  (This fact is documented in a footnote on page 7-10
        !           206: ;; of the 1991 version of the i860 Microprocessor Family Programmer's
        !           207: ;; Reference Manual).  Note that unsigned comparisons of this sort are
        !           208: ;; always redundant anyway, because an unsigned quantity can never be
        !           209: ;; less than zero.  When we see cases like this, we generate an
        !           210: ;; `or K,%r0,%r0' instruction instead (where K is a constant 0 or -1)
        !           211: ;; so as to get the CC bit register set properly for any subsequent
        !           212: ;; conditional jump instruction.
        !           213: 
        !           214: (define_insn "cmpgeusi"
        !           215:   [(set (cc0) (geu (match_operand:SI 0 "arith_operand" "r,rI")
        !           216:                   (match_operand:SI 1 "arith_operand" "I,r")))]
        !           217:   ""
        !           218:   "*
        !           219: {
        !           220:   CC_STATUS_PARTIAL_INIT;
        !           221:   if (REG_P (operands[1]))
        !           222:     return \"subu %0,%1,%?r0\";
        !           223:   else
        !           224:     {
        !           225:       if (INTVAL (operands[1]) == 0)
        !           226:        return \"or 0,%?r0,%?r0\";
        !           227:       else
        !           228:        {
        !           229:          cc_status.flags |= CC_REVERSED;
        !           230:          operands[1] = gen_rtx (CONST_INT, VOIDmode, - INTVAL (operands[1]));
        !           231:          return \"addu %1,%0,%?r0\";
        !           232:        }
        !           233:     }
        !           234: }")
        !           235: 
        !           236: (define_insn "cmpleusi"
        !           237:   [(set (cc0) (leu (match_operand:SI 0 "arith_operand" "r,rI")
        !           238:                   (match_operand:SI 1 "arith_operand" "I,r")))]
        !           239:   ""
        !           240:   "*
        !           241: {
        !           242:   CC_STATUS_PARTIAL_INIT;
        !           243:   if (REG_P (operands[0]))
        !           244:     return \"subu %1,%0,%?r0\";
        !           245:   else
        !           246:     {
        !           247:       if (INTVAL (operands[0]) == 0)
        !           248:        return \"or 0,%?r0,%?r0\";
        !           249:       else
        !           250:        {
        !           251:          cc_status.flags |= CC_REVERSED;
        !           252:          operands[0] = gen_rtx (CONST_INT, VOIDmode, - INTVAL (operands[0]));
        !           253:          return \"addu %0,%1,%?r0\";
        !           254:        }
        !           255:     }
        !           256: }")
        !           257: 
        !           258: ;; -------------------------------------------------------------------------
        !           259: ;; SFmode floating-point comparisons
        !           260: ;; -------------------------------------------------------------------------
        !           261: 
        !           262: (define_insn "cmpeqsf"
        !           263:   [(set (cc0) (eq (match_operand:SF 0 "reg_or_0_operand" "fG")
        !           264:                  (match_operand:SF 1 "reg_or_0_operand" "fG")))]
        !           265:   ""
        !           266:   "*
        !           267: {
        !           268:   CC_STATUS_PARTIAL_INIT;
        !           269:   return \"pfeq.ss %r0,%r1,%?f0\";
        !           270: }")
        !           271: 
        !           272: (define_insn "cmpnesf"
        !           273:   [(set (cc0) (ne (match_operand:SF 0 "reg_or_0_operand" "fG")
        !           274:                  (match_operand:SF 1 "reg_or_0_operand" "fG")))]
        !           275:   ""
        !           276:   "*
        !           277: {
        !           278:   CC_STATUS_PARTIAL_INIT;
        !           279:   cc_status.flags |= CC_NEGATED;
        !           280:   return \"pfeq.ss %r1,%r0,%?f0\";
        !           281: }")
        !           282: 
        !           283: ;; NOTE:  The i860 Programmer's Reference Manual says that when we are
        !           284: ;; doing (A < B) or (A > B) comparisons, we have to use pfgt for these
        !           285: ;; in order to be IEEE compliant (in case a trap occurs during these
        !           286: ;; operations).  Conversely, for (A <= B) or (A >= B) comparisons, we
        !           287: ;; must use pfle to be IEEE compliant.
        !           288: 
        !           289: (define_insn "cmpltsf"
        !           290:   [(set (cc0) (lt (match_operand:SF 0 "reg_or_0_operand" "fG")
        !           291:                  (match_operand:SF 1 "reg_or_0_operand" "fG")))]
        !           292:   ""
        !           293:   "*
        !           294: {
        !           295:   CC_STATUS_PARTIAL_INIT;
        !           296:   return \"pfgt.ss %r1,%r0,%?f0\";
        !           297: }")
        !           298: 
        !           299: (define_insn "cmpgtsf"
        !           300:   [(set (cc0) (gt (match_operand:SF 0 "reg_or_0_operand" "fG")
        !           301:                  (match_operand:SF 1 "reg_or_0_operand" "fG")))]
        !           302:   ""
        !           303:   "*
        !           304: {
        !           305:   CC_STATUS_PARTIAL_INIT;
        !           306:   return \"pfgt.ss %r0,%r1,%?f0\";
        !           307: }")
        !           308: 
        !           309: ;; NOTE:  The pfle opcode doesn't do what you think it does.  It is
        !           310: ;; bass-ackwards.  It *clears* the CC flag if the first operand is
        !           311: ;; less than or equal to the second.  Thus, we have to set CC_NEGATED
        !           312: ;; for the following two patterns.
        !           313: 
        !           314: (define_insn "cmplesf"
        !           315:   [(set (cc0) (le (match_operand:SF 0 "reg_or_0_operand" "fG")
        !           316:                  (match_operand:SF 1 "reg_or_0_operand" "fG")))]
        !           317:   ""
        !           318:   "*
        !           319: {
        !           320:   CC_STATUS_PARTIAL_INIT;
        !           321:   cc_status.flags |= CC_NEGATED;
        !           322:   return \"pfle.ss %r0,%r1,%?f0\";
        !           323: }")
        !           324: 
        !           325: (define_insn "cmpgesf"
        !           326:   [(set (cc0) (ge (match_operand:SF 0 "reg_or_0_operand" "fG")
        !           327:                  (match_operand:SF 1 "reg_or_0_operand" "fG")))]
        !           328:   ""
        !           329:   "*
        !           330: {
        !           331:   CC_STATUS_PARTIAL_INIT;
        !           332:   cc_status.flags |= CC_NEGATED;
        !           333:   return \"pfle.ss %r1,%r0,%?f0\";
        !           334: }")
        !           335: 
        !           336: ;; -------------------------------------------------------------------------
        !           337: ;; DFmode floating-point comparisons
        !           338: ;; -------------------------------------------------------------------------
        !           339: 
        !           340: (define_insn "cmpeqdf"
        !           341:   [(set (cc0) (eq (match_operand:DF 0 "reg_or_0_operand" "fG")
        !           342:                  (match_operand:DF 1 "reg_or_0_operand" "fG")))]
        !           343:   ""
        !           344:   "*
        !           345: {
        !           346:   CC_STATUS_PARTIAL_INIT;
        !           347:   return \"pfeq.dd %r0,%r1,%?f0\";
        !           348: }")
        !           349: 
        !           350: (define_insn "cmpnedf"
        !           351:   [(set (cc0) (ne (match_operand:DF 0 "reg_or_0_operand" "fG")
        !           352:                  (match_operand:DF 1 "reg_or_0_operand" "fG")))]
        !           353:   ""
        !           354:   "*
        !           355: {
        !           356:   CC_STATUS_PARTIAL_INIT;
        !           357:   cc_status.flags |= CC_NEGATED;
        !           358:   return \"pfeq.dd %r1,%r0,%?f0\";
        !           359: }")
        !           360: 
        !           361: ;; NOTE:  The i860 Programmer's Reference Manual says that when we are
        !           362: ;; doing (A < B) or (A > B) comparisons, we have to use pfgt for these
        !           363: ;; in order to be IEEE compliant (in case a trap occurs during these
        !           364: ;; operations).  Conversely, for (A <= B) or (A >= B) comparisons, we
        !           365: ;; must use pfle to be IEEE compliant.
        !           366: 
        !           367: (define_insn "cmpltdf"
        !           368:   [(set (cc0) (lt (match_operand:DF 0 "reg_or_0_operand" "fG")
        !           369:                  (match_operand:DF 1 "reg_or_0_operand" "fG")))]
        !           370:   ""
        !           371:   "*
        !           372: {
        !           373:   CC_STATUS_PARTIAL_INIT;
        !           374:   return \"pfgt.dd %r1,%r0,%?f0\";
        !           375: }")
        !           376: 
        !           377: (define_insn "cmpgtdf"
        !           378:   [(set (cc0) (gt (match_operand:DF 0 "reg_or_0_operand" "fG")
        !           379:                  (match_operand:DF 1 "reg_or_0_operand" "fG")))]
        !           380:   ""
        !           381:   "*
        !           382: {
        !           383:   CC_STATUS_PARTIAL_INIT;
        !           384:   return \"pfgt.dd %r0,%r1,%?f0\";
        !           385: }")
        !           386: 
        !           387: ;; NOTE:  The pfle opcode doesn't do what you think it does.  It is
        !           388: ;; bass-ackwards.  It *clears* the CC flag if the first operand is
        !           389: ;; less than or equal to the second.  Thus, we have to set CC_NEGATED
        !           390: ;; for the following two patterns.
        !           391: 
        !           392: (define_insn "cmpledf"
        !           393:   [(set (cc0) (le (match_operand:DF 0 "reg_or_0_operand" "fG")
        !           394:                  (match_operand:DF 1 "reg_or_0_operand" "fG")))]
        !           395:   ""
        !           396:   "*
        !           397: {
        !           398:   CC_STATUS_PARTIAL_INIT;
        !           399:   cc_status.flags |= CC_NEGATED;
        !           400:   return \"pfle.dd %r0,%r1,%?f0\";
        !           401: }")
        !           402: 
        !           403: (define_insn "cmpgedf"
        !           404:   [(set (cc0) (ge (match_operand:DF 0 "reg_or_0_operand" "fG")
        !           405:                  (match_operand:DF 1 "reg_or_0_operand" "fG")))]
        !           406:   ""
        !           407:   "*
        !           408: {
        !           409:   CC_STATUS_PARTIAL_INIT;
        !           410:   cc_status.flags |= CC_NEGATED;
        !           411:   return \"pfle.dd %r1,%r0,%?f0\";
        !           412: }")
        !           413: 
        !           414: ;; ------------------------------------------------------------------------
        !           415: ;; Integer EQ/NE comparisons against constant values which will fit in the
        !           416: ;; 16-bit immediate field of an instruction.  These are made by combining.
        !           417: ;; ------------------------------------------------------------------------
        !           418: 
        !           419: (define_insn ""
        !           420:   [(set (cc0) (eq (zero_extend:SI (match_operand:HI 0 "load_operand" "m"))
        !           421:                  (match_operand:SI 1 "small_int" "I")))]
        !           422:   "INTVAL (operands[1]) >= 0"
        !           423:   "*
        !           424: {
        !           425:   CC_STATUS_PARTIAL_INIT;
        !           426:   return \"ld.s %0,%?r31\;xor %1,%?r31,%?r0\";
        !           427: }")
        !           428: 
        !           429: (define_insn ""
        !           430:   [(set (cc0) (eq (match_operand:SI 0 "small_int" "I")
        !           431:                  (zero_extend:SI (match_operand:HI 1 "load_operand" "m"))))]
        !           432:   "INTVAL (operands[0]) >= 0"
        !           433:   "*
        !           434: {
        !           435:   CC_STATUS_PARTIAL_INIT;
        !           436:   return \"ld.s %1,%?r31\;xor %0,%?r31,%?r0\";
        !           437: }")
        !           438: 
        !           439: ;; ------------------------------------------------------------------------
        !           440: ;; Define the real conditional branch instructions.
        !           441: ;; ------------------------------------------------------------------------
        !           442: 
        !           443: (define_insn "cbranch"
        !           444:   [(set (pc) (if_then_else (eq (cc0) (const_int 0))
        !           445:                           (label_ref (match_operand 0 "" ""))
        !           446:                           (pc)))]
        !           447:   ""
        !           448:   "*
        !           449: {
        !           450:   if ((cc_prev_status.flags & CC_NEGATED) == 0)
        !           451:     return \"bnc %l0\";
        !           452:   else
        !           453:     return \"bc %l0\";
        !           454: }")
        !           455: 
        !           456: (define_insn "flipped_cbranch"
        !           457:   [(set (pc) (if_then_else (ne (cc0)
        !           458:                               (const_int 0))
        !           459:                           (pc)
        !           460:                           (label_ref (match_operand 0 "" ""))))]
        !           461:   ""
        !           462:   "*
        !           463: {
        !           464:   if ((cc_prev_status.flags & CC_NEGATED) == 0)
        !           465:     return \"bnc %l0\";
        !           466:   else
        !           467:     return \"bc %l0\";
        !           468: }")
        !           469: 
        !           470: (define_insn "inverse_cbranch"
        !           471:   [(set (pc) (if_then_else (eq (cc0)
        !           472:                               (const_int 0))
        !           473:                           (pc)
        !           474:                           (label_ref (match_operand 0 "" ""))))]
        !           475:   ""
        !           476:   "*
        !           477: {
        !           478:   if ((cc_prev_status.flags & CC_NEGATED) == 0)
        !           479:     return \"bc %l0\";
        !           480:   else
        !           481:     return \"bnc %l0\";
        !           482: }")
        !           483: 
        !           484: 
        !           485: (define_insn "flipped_inverse_cbranch"
        !           486:   [(set (pc) (if_then_else (ne (cc0)
        !           487:                               (const_int 0))
        !           488:                           (label_ref (match_operand 0 "" ""))
        !           489:                           (pc)))]
        !           490:   ""
        !           491:   "*
        !           492: {
        !           493:   if ((cc_prev_status.flags & CC_NEGATED) == 0)
        !           494:     return \"bc %l0\";
        !           495:   else
        !           496:     return \"bnc %l0\";
        !           497: }")
        !           498: 
        !           499: ;; Simple BTE/BTNE compare-and-branch insns made by combining.
        !           500: ;; Note that it is wrong to add similar patterns for QI or HImode
        !           501: ;; because bte/btne always compare the whole register.
        !           502: 
        !           503: (define_insn ""
        !           504:   [(set (pc)
        !           505:         (if_then_else (eq (match_operand:SI 0 "register_operand" "r")
        !           506:                          (match_operand:SI 1 "bte_operand" "rK"))
        !           507:                      (label_ref (match_operand 2 "" ""))
        !           508:                      (pc)))]
        !           509:   ""
        !           510:   "bte %1,%0,%2")
        !           511: 
        !           512: (define_insn ""
        !           513:   [(set (pc)
        !           514:         (if_then_else (ne (match_operand:SI 0 "register_operand" "r")
        !           515:                          (match_operand:SI 1 "bte_operand" "rK"))
        !           516:                      (label_ref (match_operand 2 "" ""))
        !           517:                      (pc)))]
        !           518:   ""
        !           519:   "btne %1,%0,%2")
        !           520: 
        !           521: (define_insn ""
        !           522:   [(set (pc)
        !           523:         (if_then_else (eq (match_operand:SI 0 "register_operand" "r")
        !           524:                          (match_operand:SI 1 "bte_operand" "rK"))
        !           525:                      (pc)
        !           526:                      (label_ref (match_operand 2 "" ""))))]
        !           527:   ""
        !           528:   "btne %1,%0,%2")
        !           529: 
        !           530: (define_insn ""
        !           531:   [(set (pc)
        !           532:         (if_then_else (ne (match_operand:SI 0 "register_operand" "r")
        !           533:                          (match_operand:SI 1 "bte_operand" "rK"))
        !           534:                      (pc)
        !           535:                      (label_ref (match_operand 2 "" ""))))]
        !           536:   ""
        !           537:   "bte %1,%0,%2")
        !           538: 
        !           539: ;; Load byte/halfword, zero-extend, & compare-and-branch insns.
        !           540: ;; These are made by combining.
        !           541: 
        !           542: (define_insn ""
        !           543:   [(set (pc)
        !           544:         (if_then_else (eq (zero_extend:SI (match_operand:QI 0 "memory_operand" "m"))
        !           545:                           (match_operand:SI 1 "bte_operand" "K"))
        !           546:                       (label_ref (match_operand 2 "" ""))
        !           547:                       (pc)))
        !           548:    (match_scratch:SI 3 "=r")]
        !           549:   ""
        !           550:   "ld.b %0,%3;bte %1,%3,%2")
        !           551: 
        !           552: (define_insn ""
        !           553:   [(set (pc)
        !           554:         (if_then_else (ne (zero_extend:SI (match_operand:QI 0 "memory_operand" "m"))
        !           555:                           (match_operand:SI 1 "bte_operand" "K"))
        !           556:                       (label_ref (match_operand 2 "" ""))
        !           557:                       (pc)))
        !           558:    (match_scratch:SI 3 "=r")]
        !           559:   ""
        !           560:   "ld.b %0,%3;btne %1,%3,%2")
        !           561: 
        !           562: (define_insn ""
        !           563:   [(set (pc)
        !           564:         (if_then_else (eq (zero_extend:SI (match_operand:QI 0 "memory_operand" "m"))
        !           565:                           (match_operand:SI 1 "bte_operand" "K"))
        !           566:                       (pc)
        !           567:                       (label_ref (match_operand 2 "" ""))))
        !           568:    (match_scratch:SI 3 "=r")]
        !           569:   ""
        !           570:   "ld.b %0,%3;btne %1,%3,%2")
        !           571: 
        !           572: (define_insn ""
        !           573:   [(set (pc)
        !           574:         (if_then_else (ne (zero_extend:SI (match_operand:QI 0 "memory_operand" "m"))
        !           575:                           (match_operand:SI 1 "bte_operand" "K"))
        !           576:                       (pc)
        !           577:                       (label_ref (match_operand 2 "" ""))))
        !           578:    (match_scratch:SI 3 "=r")]
        !           579:   ""
        !           580:   "ld.b %0,%3;bte %1,%3,%2")
        !           581: 
        !           582: (define_insn ""
        !           583:   [(set (pc)
        !           584:         (if_then_else (eq (zero_extend:SI (match_operand:HI 0 "memory_operand" "m"))
        !           585:                           (match_operand:SI 1 "bte_operand" "K"))
        !           586:                       (label_ref (match_operand 2 "" ""))
        !           587:                       (pc)))
        !           588:    (match_scratch:SI 3 "=r")]
        !           589:   ""
        !           590:   "ld.s %0,%3;bte %1,%3,%2")
        !           591: 
        !           592: (define_insn ""
        !           593:   [(set (pc)
        !           594:         (if_then_else (ne (zero_extend:SI (match_operand:HI 0 "memory_operand" "m"))
        !           595:                           (match_operand:SI 1 "bte_operand" "K"))
        !           596:                       (label_ref (match_operand 2 "" ""))
        !           597:                       (pc)))
        !           598:    (match_scratch:SI 3 "=r")]
        !           599:   ""
        !           600:   "ld.s %0,%3;btne %1,%3,%2")
        !           601: 
        !           602: (define_insn ""
        !           603:   [(set (pc)
        !           604:         (if_then_else (eq (zero_extend:SI (match_operand:HI 0 "memory_operand" "m"))
        !           605:                           (match_operand:SI 1 "bte_operand" "K"))
        !           606:                       (pc)
        !           607:                       (label_ref (match_operand 2 "" ""))))
        !           608:    (match_scratch:SI 3 "=r")]
        !           609:   ""
        !           610:   "ld.s %0,%3;btne %1,%3,%2")
        !           611: 
        !           612: (define_insn ""
        !           613:   [(set (pc)
        !           614:         (if_then_else (ne (zero_extend:SI (match_operand:HI 0 "memory_operand" "m"))
        !           615:                           (match_operand:SI 1 "bte_operand" "K"))
        !           616:                       (pc)
        !           617:                       (label_ref (match_operand 2 "" ""))))
        !           618:    (match_scratch:SI 3 "=r")]
        !           619:   ""
        !           620:   "ld.s %0,%3;bte %1,%3,%2")
        !           621: 
        !           622: 
        !           623: ;; Generation of conditionals.
        !           624: 
        !           625: ;; We save the compare operands in the cmpxx patterns and use then when
        !           626: ;; we generate the branch.
        !           627: 
        !           628: (define_expand "cmpsi"
        !           629:   [(set (cc0) (compare (match_operand:SI 0 "register_operand" "")
        !           630:                       (match_operand:SI 1 "compare_operand" "")))]
        !           631:   ""
        !           632:   "
        !           633: { i860_compare_op0 = operands[0];
        !           634:   i860_compare_op1 = operands[1];
        !           635:   DONE;
        !           636: }")
        !           637: 
        !           638: (define_expand "cmpsf"
        !           639:   [(set (cc0) (compare (match_operand:SF 0 "register_operand" "")
        !           640:                       (match_operand:SF 1 "register_operand" "")))]
        !           641:   ""
        !           642:   "
        !           643: { i860_compare_op0 = operands[0];
        !           644:   i860_compare_op1 = operands[1];
        !           645:   DONE;
        !           646: }")
        !           647: 
        !           648: (define_expand "cmpdf"
        !           649:   [(set (cc0) (compare (match_operand:DF 0 "register_operand" "")
        !           650:                       (match_operand:DF 1 "register_operand" "")))]
        !           651:   ""
        !           652:   "
        !           653: { i860_compare_op0 = operands[0];
        !           654:   i860_compare_op1 = operands[1];
        !           655:   DONE;
        !           656: }")
        !           657: 
        !           658: ;; These are the standard-named conditional branch patterns.
        !           659: ;; Detailed comments are found in the first one only.
        !           660: 
        !           661: (define_expand "beq"
        !           662:   [(set (pc)
        !           663:        (if_then_else (eq (cc0)
        !           664:                          (const_int 0))
        !           665:                      (label_ref (match_operand 0 "" ""))
        !           666:                      (pc)))]
        !           667:   ""
        !           668:   "
        !           669: {
        !           670:   /* Emit a single-condition compare insn according to
        !           671:      the type of operands and the condition to be tested.  */
        !           672: 
        !           673:   if (GET_MODE_CLASS (GET_MODE (i860_compare_op0)) == MODE_INT)
        !           674:     emit_insn (gen_cmpeqsi (i860_compare_op0, i860_compare_op1));
        !           675:   else if (GET_MODE (i860_compare_op0) == SFmode)
        !           676:     emit_insn (gen_cmpeqsf (i860_compare_op0, i860_compare_op1));
        !           677:   else if (GET_MODE (i860_compare_op0) == DFmode)
        !           678:     emit_insn (gen_cmpeqdf (i860_compare_op0, i860_compare_op1));
        !           679:   else
        !           680:     abort ();
        !           681: 
        !           682:   /* Emit branch-if-true.  */
        !           683: 
        !           684:   emit_jump_insn (gen_flipped_inverse_cbranch (operands[0]));
        !           685:   DONE;
        !           686: }")
        !           687: 
        !           688: (define_expand "bne"
        !           689:   [(set (pc)
        !           690:        (if_then_else (ne (cc0)
        !           691:                          (const_int 0))
        !           692:                      (label_ref (match_operand 0 "" ""))
        !           693:                      (pc)))]
        !           694:   ""
        !           695:   "
        !           696: {
        !           697:   if (GET_MODE_CLASS (GET_MODE (i860_compare_op0)) == MODE_INT)
        !           698:     emit_insn (gen_cmpeqsi (i860_compare_op0, i860_compare_op1));
        !           699:   else if (GET_MODE (i860_compare_op0) == SFmode)
        !           700:     emit_insn (gen_cmpeqsf (i860_compare_op0, i860_compare_op1));
        !           701:   else if (GET_MODE (i860_compare_op0) == DFmode)
        !           702:     emit_insn (gen_cmpeqdf (i860_compare_op0, i860_compare_op1));
        !           703:   else
        !           704:     abort ();
        !           705: 
        !           706:   emit_jump_insn (gen_flipped_cbranch (operands[0]));
        !           707: 
        !           708:   DONE;
        !           709: }")
        !           710: 
        !           711: (define_expand "bgt"
        !           712:   [(set (pc)
        !           713:        (if_then_else (gt (cc0)
        !           714:                          (const_int 0))
        !           715:                      (label_ref (match_operand 0 "" ""))
        !           716:                      (pc)))]
        !           717:   ""
        !           718:   "
        !           719: {
        !           720:   if (GET_MODE_CLASS (GET_MODE (i860_compare_op0)) == MODE_INT)
        !           721:     emit_insn (gen_cmpgtsi (i860_compare_op0, i860_compare_op1));
        !           722:   else if (GET_MODE (i860_compare_op0) == SFmode)
        !           723:     emit_insn (gen_cmpgtsf (i860_compare_op0, i860_compare_op1));
        !           724:   else if (GET_MODE (i860_compare_op0) == DFmode)
        !           725:     emit_insn (gen_cmpgtdf (i860_compare_op0, i860_compare_op1));
        !           726:   else
        !           727:     abort ();
        !           728: 
        !           729:   emit_jump_insn (gen_flipped_inverse_cbranch (operands[0]));
        !           730:   DONE;
        !           731: }")
        !           732: 
        !           733: (define_expand "blt"
        !           734:   [(set (pc)
        !           735:        (if_then_else (lt (cc0)
        !           736:                          (const_int 0))
        !           737:                      (label_ref (match_operand 0 "" ""))
        !           738:                      (pc)))]
        !           739:   ""
        !           740:   "
        !           741: {
        !           742:   if (GET_MODE_CLASS (GET_MODE (i860_compare_op0)) == MODE_INT)
        !           743:     emit_insn (gen_cmpltsi (i860_compare_op0, i860_compare_op1));
        !           744:   else if (GET_MODE (i860_compare_op0) == SFmode)
        !           745:     emit_insn (gen_cmpltsf (i860_compare_op0, i860_compare_op1));
        !           746:   else if (GET_MODE (i860_compare_op0) == DFmode)
        !           747:     emit_insn (gen_cmpltdf (i860_compare_op0, i860_compare_op1));
        !           748:   else
        !           749:     abort ();
        !           750: 
        !           751:   emit_jump_insn (gen_flipped_inverse_cbranch (operands[0]));
        !           752:   DONE;
        !           753: }")
        !           754: 
        !           755: (define_expand "ble"
        !           756:   [(set (pc)
        !           757:        (if_then_else (le (cc0)
        !           758:                          (const_int 0))
        !           759:                      (label_ref (match_operand 0 "" ""))
        !           760:                      (pc)))]
        !           761:   ""
        !           762:   "
        !           763: {
        !           764:   if (GET_MODE_CLASS (GET_MODE (i860_compare_op0)) == MODE_INT)
        !           765:     {
        !           766:       emit_insn (gen_cmpgtsi (i860_compare_op0, i860_compare_op1));
        !           767:       emit_jump_insn (gen_flipped_cbranch (operands[0]));
        !           768:     }
        !           769:   else
        !           770:     {
        !           771:       if (GET_MODE (i860_compare_op0) == SFmode)
        !           772:        emit_insn (gen_cmplesf (i860_compare_op0, i860_compare_op1));
        !           773:       else if (GET_MODE (i860_compare_op0) == DFmode)
        !           774:        emit_insn (gen_cmpledf (i860_compare_op0, i860_compare_op1));
        !           775:       else
        !           776:        abort ();
        !           777:       emit_jump_insn (gen_flipped_inverse_cbranch (operands[0]));
        !           778:     }
        !           779:   DONE;
        !           780: }")
        !           781: 
        !           782: (define_expand "bge"
        !           783:   [(set (pc)
        !           784:        (if_then_else (ge (cc0)
        !           785:                          (const_int 0))
        !           786:                      (label_ref (match_operand 0 "" ""))
        !           787:                      (pc)))]
        !           788:   ""
        !           789:   "
        !           790: {
        !           791:   if (GET_MODE_CLASS (GET_MODE (i860_compare_op0)) == MODE_INT)
        !           792:     {
        !           793:       emit_insn (gen_cmpltsi (i860_compare_op0, i860_compare_op1));
        !           794:       emit_jump_insn (gen_flipped_cbranch (operands[0]));
        !           795:     }
        !           796:   else
        !           797:     {
        !           798:       if (GET_MODE (i860_compare_op0) == SFmode)
        !           799:        emit_insn (gen_cmpgesf (i860_compare_op0, i860_compare_op1));
        !           800:       else if (GET_MODE (i860_compare_op0) == DFmode)
        !           801:        emit_insn (gen_cmpgedf (i860_compare_op0, i860_compare_op1));
        !           802:       else
        !           803:        abort ();
        !           804:       emit_jump_insn (gen_flipped_inverse_cbranch (operands[0]));
        !           805:     }
        !           806:   DONE;
        !           807: }")
        !           808: 
        !           809: (define_expand "bgtu"
        !           810:   [(set (pc)
        !           811:        (if_then_else (gtu (cc0)
        !           812:                           (const_int 0))
        !           813:                      (label_ref (match_operand 0 "" ""))
        !           814:                      (pc)))]
        !           815:   ""
        !           816:   "
        !           817: {
        !           818:   if (GET_MODE_CLASS (GET_MODE (i860_compare_op0)) != MODE_INT)
        !           819:     abort ();
        !           820: 
        !           821:   emit_insn (gen_cmpleusi (i860_compare_op0, i860_compare_op1));
        !           822:   emit_jump_insn (gen_flipped_cbranch (operands[0]));
        !           823:   DONE;
        !           824: }")
        !           825: 
        !           826: (define_expand "bltu"
        !           827:   [(set (pc)
        !           828:        (if_then_else (ltu (cc0)
        !           829:                           (const_int 0))
        !           830:                      (label_ref (match_operand 0 "" ""))
        !           831:                      (pc)))]
        !           832:   ""
        !           833:   "
        !           834: {
        !           835:   if (GET_MODE_CLASS (GET_MODE (i860_compare_op0)) != MODE_INT)
        !           836:     abort ();
        !           837: 
        !           838:   emit_insn (gen_cmpgeusi (i860_compare_op0, i860_compare_op1));
        !           839:   emit_jump_insn (gen_flipped_cbranch (operands[0]));
        !           840:   DONE;
        !           841: }")
        !           842: 
        !           843: (define_expand "bgeu"
        !           844:   [(set (pc)
        !           845:        (if_then_else (geu (cc0)
        !           846:                           (const_int 0))
        !           847:                      (label_ref (match_operand 0 "" ""))
        !           848:                      (pc)))]
        !           849:   ""
        !           850:   "
        !           851: {
        !           852:   if (GET_MODE_CLASS (GET_MODE (i860_compare_op0)) != MODE_INT)
        !           853:     abort ();
        !           854: 
        !           855:   emit_insn (gen_cmpgeusi (i860_compare_op0, i860_compare_op1));
        !           856:   emit_jump_insn (gen_flipped_inverse_cbranch (operands[0]));
        !           857:   DONE;
        !           858: }")
        !           859: 
        !           860: (define_expand "bleu"
        !           861:   [(set (pc)
        !           862:        (if_then_else (leu (cc0)
        !           863:                           (const_int 0))
        !           864:                      (label_ref (match_operand 0 "" ""))
        !           865:                      (pc)))]
        !           866:   ""
        !           867:   "
        !           868: {
        !           869:   if (GET_MODE_CLASS (GET_MODE (i860_compare_op0)) != MODE_INT)
        !           870:     abort ();
        !           871: 
        !           872:   emit_insn (gen_cmpleusi (i860_compare_op0, i860_compare_op1));
        !           873:   emit_jump_insn (gen_flipped_inverse_cbranch (operands[0]));
        !           874:   DONE;
        !           875: }")
        !           876: 
        !           877: ;; Move instructions
        !           878: 
        !           879: ;; Note that source operands for `mov' pseudo-instructions are no longer
        !           880: ;; allowed (by the svr4 assembler) to be "big" things, i.e. constants that
        !           881: ;; won't fit in 16-bits.  (This includes any sort of a relocatable address
        !           882: ;; also.)  Thus, we must use an explicit orh/or pair of instructions if
        !           883: ;; the source operand is something "big".
        !           884: 
        !           885: (define_insn "movsi"
        !           886:   [(set (match_operand:SI 0 "general_operand" "=r,m,f")
        !           887:        (match_operand:SI 1 "general_operand" "rmif,rfJ,rmfJ"))]
        !           888:   ""
        !           889:   "*
        !           890: {
        !           891:   if (GET_CODE (operands[0]) == MEM)
        !           892:     {
        !           893:       if (CONSTANT_ADDRESS_P (XEXP (operands[0], 0)))
        !           894:        return output_store (operands);
        !           895:       if (FP_REG_P (operands[1]))
        !           896:        return \"fst.l %1,%0\";
        !           897:       return \"st.l %r1,%0\";
        !           898:     }
        !           899:   if (GET_CODE (operands[1]) == MEM)
        !           900:     {
        !           901:       if (CONSTANT_ADDRESS_P (XEXP (operands[1], 0)))
        !           902:        return output_load (operands);
        !           903:       if (FP_REG_P (operands[0]))
        !           904:        return \"fld.l %1,%0\";
        !           905:       return \"ld.l %1,%0\";
        !           906:     }
        !           907:   if (FP_REG_P (operands[1]) && FP_REG_P (operands[0]))
        !           908:     return \"fmov.ss %1,%0\";
        !           909:   if (FP_REG_P (operands[1]))
        !           910:     return \"fxfr %1,%0\";
        !           911:   if (FP_REG_P (operands[0]) && operands[1] == const0_rtx)
        !           912:     return \"fmov.ss %?f0,%0\";
        !           913:   if (FP_REG_P (operands[0]))
        !           914:     return \"ixfr %1,%0\";
        !           915: 
        !           916:   if (GET_CODE (operands[1]) == REG)
        !           917:     return \"shl %?r0,%1,%0\";
        !           918: 
        !           919:   CC_STATUS_PARTIAL_INIT;
        !           920: 
        !           921:   if (GET_CODE (operands[1]) == CONST_INT)
        !           922:     {
        !           923:       if((INTVAL (operands[1]) & 0xffff0000) == 0)
        !           924:         return \"or %L1,%?r0,%0\";
        !           925:       if((INTVAL (operands[1]) & 0x0000ffff) == 0)
        !           926:         return \"orh %H1,%?r0,%0\";
        !           927:     }
        !           928:   return \"orh %H1,%?r0,%0\;or %L1,%0,%0\";
        !           929: }")
        !           930:  
        !           931: (define_insn "movhi"
        !           932:   [(set (match_operand:HI 0 "general_operand" "=r,m,!*f,!r")
        !           933:        (match_operand:HI 1 "general_operand" "rmi,rJ,rJ*f,*f"))]
        !           934:   ""
        !           935:   "*
        !           936: {
        !           937:   if (GET_CODE (operands[0]) == MEM)
        !           938:     {
        !           939:       if (CONSTANT_ADDRESS_P (XEXP (operands[0], 0)))
        !           940:        return output_store (operands);
        !           941:       return \"st.s %r1,%0\";
        !           942:     }
        !           943:   if (GET_CODE (operands[1]) == MEM)
        !           944:     {
        !           945:       if (CONSTANT_ADDRESS_P (XEXP (operands[1], 0)))
        !           946:        return output_load (operands);
        !           947:       return \"ld.s %1,%0\";
        !           948:     }
        !           949:   if (FP_REG_P (operands[1]) && FP_REG_P (operands[0]))
        !           950:     return \"fmov.ss %1,%0\";
        !           951:   if (FP_REG_P (operands[1]))
        !           952:     return \"fxfr %1,%0\";
        !           953:   if (FP_REG_P (operands[0]) && operands[1] == const0_rtx)
        !           954:     return \"fmov.ss %?f0,%0\";
        !           955:   if (FP_REG_P (operands[0]))
        !           956:     return \"ixfr %1,%0\";
        !           957: 
        !           958:   if (GET_CODE (operands[1]) == REG)
        !           959:     return \"shl %?r0,%1,%0\";
        !           960: 
        !           961:   CC_STATUS_PARTIAL_INIT;
        !           962: 
        !           963:   return \"or %L1,%?r0,%0\";
        !           964: }")
        !           965: 
        !           966: (define_insn "movqi"
        !           967:   [(set (match_operand:QI 0 "general_operand" "=r,m,!*f,!r")
        !           968:        (match_operand:QI 1 "general_operand" "rmi,rJ,rJ*f,*f"))]
        !           969:   ""
        !           970:   "*
        !           971: {
        !           972:   if (GET_CODE (operands[0]) == MEM)
        !           973:     {
        !           974:       if (CONSTANT_ADDRESS_P (XEXP (operands[0], 0)))
        !           975:        return output_store (operands);
        !           976:       return \"st.b %r1,%0\";
        !           977:     }
        !           978:   if (GET_CODE (operands[1]) == MEM)
        !           979:     {
        !           980:       if (CONSTANT_ADDRESS_P (XEXP (operands[1], 0)))
        !           981:        return output_load (operands);
        !           982:       return \"ld.b %1,%0\";
        !           983:     }
        !           984:   if (FP_REG_P (operands[1]) && FP_REG_P (operands[0]))
        !           985:     return \"fmov.ss %1,%0\";
        !           986:   if (FP_REG_P (operands[1]))
        !           987:     return \"fxfr %1,%0\";
        !           988:   if (FP_REG_P (operands[0]) && operands[1] == const0_rtx)
        !           989:     return \"fmov.ss %?f0,%0\";
        !           990:   if (FP_REG_P (operands[0]))
        !           991:     return \"ixfr %1,%0\";
        !           992: 
        !           993:   if (GET_CODE (operands[1]) == REG)
        !           994:     return \"shl %?r0,%1,%0\";
        !           995: 
        !           996:   CC_STATUS_PARTIAL_INIT;
        !           997: 
        !           998:   return \"or %L1,%?r0,%0\";
        !           999: }")
        !          1000: 
        !          1001: ;; The definition of this insn does not really explain what it does,
        !          1002: ;; but it should suffice
        !          1003: ;; that anything generated as this insn will be recognized as one
        !          1004: ;; and that it won't successfully combine with anything.
        !          1005: (define_expand "movstrsi"
        !          1006:   [(parallel [(set (mem:BLK (match_operand:BLK 0 "general_operand" ""))
        !          1007:                   (mem:BLK (match_operand:BLK 1 "general_operand" "")))
        !          1008:              (use (match_operand:SI 2 "nonmemory_operand" ""))
        !          1009:              (use (match_operand:SI 3 "immediate_operand" ""))
        !          1010:              (clobber (match_dup 4))
        !          1011:              (clobber (match_dup 5))
        !          1012:              (clobber (match_dup 6))
        !          1013:              (clobber (match_dup 0))
        !          1014:              (clobber (match_dup 1))])]
        !          1015:   ""
        !          1016:   "
        !          1017: {
        !          1018:   operands[0] = copy_to_mode_reg (SImode, XEXP (operands[0], 0));
        !          1019:   operands[1] = copy_to_mode_reg (SImode, XEXP (operands[1], 0));
        !          1020:   operands[4] = gen_reg_rtx (SImode);
        !          1021:   operands[5] = gen_reg_rtx (SImode);
        !          1022:   operands[6] = gen_reg_rtx (SImode);
        !          1023: }")
        !          1024: 
        !          1025: (define_insn ""
        !          1026:   [(set (mem:BLK (match_operand:SI 0 "register_operand" "r"))
        !          1027:        (mem:BLK (match_operand:SI 1 "register_operand" "r")))
        !          1028:    (use (match_operand:SI 2 "general_operand" "rn"))
        !          1029:    (use (match_operand:SI 3 "immediate_operand" "i"))
        !          1030:    (clobber (match_operand:SI 4 "register_operand" "=r"))
        !          1031:    (clobber (match_operand:SI 5 "register_operand" "=r"))
        !          1032:    (clobber (match_operand:SI 6 "register_operand" "=r"))
        !          1033:    (clobber (match_dup 0))
        !          1034:    (clobber (match_dup 1))]
        !          1035:   ""
        !          1036:   "* return output_block_move (operands);")
        !          1037: 
        !          1038: ;; Floating point move insns
        !          1039: 
        !          1040: ;; This pattern forces (set (reg:DF ...) (const_double ...))
        !          1041: ;; to be reloaded by putting the constant into memory.
        !          1042: ;; It must come before the more general movdf pattern.
        !          1043: (define_insn ""
        !          1044:   [(set (match_operand:DF 0 "general_operand" "=r,f,o")
        !          1045:        (match_operand:DF 1 "" "mG,m,G"))]
        !          1046:   "GET_CODE (operands[1]) == CONST_DOUBLE"
        !          1047:   "*
        !          1048: {
        !          1049:   if (FP_REG_P (operands[0]) || operands[1] == CONST0_RTX (DFmode))
        !          1050:     return output_fp_move_double (operands);
        !          1051:   return output_move_double (operands);
        !          1052: }")
        !          1053: 
        !          1054: (define_insn "movdf"
        !          1055:   [(set (match_operand:DF 0 "general_operand" "=*rm,*r,?f,?*rm")
        !          1056:        (match_operand:DF 1 "general_operand" "*r,m,*rfmG,f"))]
        !          1057:   ""
        !          1058:   "*
        !          1059: {
        !          1060:   if (GET_CODE (operands[0]) == MEM
        !          1061:       && CONSTANT_ADDRESS_P (XEXP (operands[0], 0)))
        !          1062:     return output_store (operands);
        !          1063:   if (GET_CODE (operands[1]) == MEM
        !          1064:       && CONSTANT_ADDRESS_P (XEXP (operands[1], 0)))
        !          1065:     return output_load (operands);
        !          1066: 
        !          1067:   if (FP_REG_P (operands[0]) || FP_REG_P (operands[1]))
        !          1068:     return output_fp_move_double (operands);
        !          1069:   return output_move_double (operands);
        !          1070: }")
        !          1071: 
        !          1072: (define_insn "movdi"
        !          1073:   [(set (match_operand:DI 0 "general_operand" "=rm,r,?f,?rm")
        !          1074:        (match_operand:DI 1 "general_operand" "r,miF,rfmG,f"))]
        !          1075:   ""
        !          1076:   "*
        !          1077: {
        !          1078:   if (GET_CODE (operands[0]) == MEM
        !          1079:       && CONSTANT_ADDRESS_P (XEXP (operands[0], 0)))
        !          1080:     return output_store (operands);
        !          1081:   if (GET_CODE (operands[1]) == MEM
        !          1082:       && CONSTANT_ADDRESS_P (XEXP (operands[1], 0)))
        !          1083:     return output_load (operands);
        !          1084: 
        !          1085:   /* ??? How can we have a DFmode arg here with DImode above? */
        !          1086:   if (FP_REG_P (operands[0]) && operands[1] == CONST0_RTX (DFmode))
        !          1087:     return \"fmov.dd %?f0,%0\";
        !          1088: 
        !          1089:   if (FP_REG_P (operands[0]) || FP_REG_P (operands[1]))
        !          1090:     return output_fp_move_double (operands);
        !          1091:   return output_move_double (operands);
        !          1092: }")
        !          1093: 
        !          1094: ;; The alternative m/r is separate from m/f
        !          1095: ;; The first alternative is separate from the second for the same reason.
        !          1096: (define_insn "movsf"
        !          1097:   [(set (match_operand:SF 0 "general_operand" "=*rf,*rf,*r,m,m")
        !          1098:        (match_operand:SF 1 "general_operand" "*r,fmG,F,*r,f"))]
        !          1099:   ""
        !          1100:   "*
        !          1101: {
        !          1102:   if (GET_CODE (operands[0]) == MEM
        !          1103:       && CONSTANT_ADDRESS_P (XEXP (operands[0], 0)))
        !          1104:     return output_store (operands);
        !          1105:   if (GET_CODE (operands[1]) == MEM
        !          1106:       && CONSTANT_ADDRESS_P (XEXP (operands[1], 0)))
        !          1107:     return output_load (operands);
        !          1108:   if (FP_REG_P (operands[0]))
        !          1109:     {
        !          1110:       if (FP_REG_P (operands[1]))
        !          1111:        return \"fmov.ss %1,%0\";
        !          1112:       if (GET_CODE (operands[1]) == REG)
        !          1113:        return \"ixfr %1,%0\";
        !          1114:       if (operands[1] == CONST0_RTX (SFmode))
        !          1115:         return \"fmov.ss %?f0,%0\";
        !          1116:       if (CONSTANT_ADDRESS_P (XEXP (operands[1], 0)))
        !          1117:        {
        !          1118:          if (! ((cc_prev_status.flags & CC_KNOW_HI_R31)
        !          1119:                 && (cc_prev_status.flags & CC_HI_R31_ADJ)
        !          1120:                 && cc_prev_status.mdep == XEXP(operands[1],0)))
        !          1121:            {
        !          1122:              CC_STATUS_INIT;
        !          1123:              cc_status.flags |= CC_KNOW_HI_R31 | CC_HI_R31_ADJ;
        !          1124:              cc_status.mdep = XEXP (operands[1], 0);
        !          1125:              return \"orh %h1,%?r0,%?r31\;fld.l %L1(%?r31),%0\";
        !          1126:            }
        !          1127:          return \"fld.l %L1(%?r31),%0\";
        !          1128:        }
        !          1129:       return \"fld.l %1,%0\";
        !          1130:     }
        !          1131:   if (FP_REG_P (operands[1]) || GET_CODE (operands[1]) == CONST_DOUBLE)
        !          1132:     {
        !          1133:       if (GET_CODE (operands[0]) == REG && FP_REG_P (operands[1]))
        !          1134:        return \"fxfr %1,%0\";
        !          1135:       if (GET_CODE (operands[0]) == REG)
        !          1136:        {
        !          1137:          CC_STATUS_PARTIAL_INIT;
        !          1138:          if (GET_CODE (operands[1]) == CONST_DOUBLE)
        !          1139:            {
        !          1140:              register unsigned long ul;
        !          1141: 
        !          1142:               ul = sfmode_constant_to_ulong (operands[1]);
        !          1143:              if ((ul & 0x0000ffff) == 0)
        !          1144:                return \"orh %H1,%?r0,%0\";
        !          1145:              if ((ul & 0xffff0000) == 0)
        !          1146:                return \"or %L1,%?r0,%0\";
        !          1147:            }
        !          1148:           return \"orh %H1,%?r0,%0\;or %L1,%0,%0\";
        !          1149:        }
        !          1150:       /* Now operand 0 must be memory.
        !          1151:          If operand 1 is CONST_DOUBLE, its value must be 0.  */
        !          1152:       if (CONSTANT_ADDRESS_P (XEXP (operands[0], 0)))
        !          1153:        {
        !          1154:          if (! ((cc_prev_status.flags & CC_KNOW_HI_R31)
        !          1155:                 && (cc_prev_status.flags & CC_HI_R31_ADJ)
        !          1156:                 && XEXP (operands[0], 0) == cc_prev_status.mdep))
        !          1157:            {
        !          1158:              CC_STATUS_INIT;
        !          1159:              cc_status.flags |= CC_KNOW_HI_R31 | CC_HI_R31_ADJ;
        !          1160:              cc_status.mdep = XEXP (operands[0], 0);
        !          1161:              output_asm_insn (\"orh %h0,%?r0,%?r31\", operands);
        !          1162:            }
        !          1163:          return \"fst.l %r1,%L0(%?r31)\";
        !          1164:        }
        !          1165:       return \"fst.l %r1,%0\";
        !          1166:     }
        !          1167:   if (GET_CODE (operands[0]) == MEM)
        !          1168:     return \"st.l %r1,%0\";
        !          1169:   if (GET_CODE (operands[1]) == MEM)
        !          1170:     return \"ld.l %1,%0\";
        !          1171:   if (operands[1] == CONST0_RTX (SFmode))
        !          1172:     return \"shl %?r0,%?r0,%0\";
        !          1173:   return \"mov %1,%0\";
        !          1174: }")
        !          1175: 
        !          1176: ;; Special load insns for REG+REG addresses.
        !          1177: ;; Such addresses are not "legitimate" because st rejects them.
        !          1178: 
        !          1179: (define_insn ""
        !          1180:   [(set (match_operand:DF 0 "register_operand" "=rf")
        !          1181:        (match_operand:DF 1 "indexed_operand" "m"))]
        !          1182:   ""
        !          1183:   "*
        !          1184: {
        !          1185:   if (FP_REG_P (operands[0]))
        !          1186:     return output_fp_move_double (operands);
        !          1187:   return output_move_double (operands);
        !          1188: }")
        !          1189: 
        !          1190: (define_insn ""
        !          1191:   [(set (match_operand:SF 0 "register_operand" "=rf")
        !          1192:        (match_operand:SF 1 "indexed_operand" "m"))]
        !          1193:   ""
        !          1194:   "*
        !          1195: {
        !          1196:   if (FP_REG_P (operands[0]))
        !          1197:     return \"fld.l %1,%0\";
        !          1198:   return \"ld.l %1,%0\";
        !          1199: }")
        !          1200: 
        !          1201: (define_insn ""
        !          1202:   [(set (match_operand:SI 0 "register_operand" "=rf")
        !          1203:        (match_operand:SI 1 "indexed_operand" "m"))]
        !          1204:   ""
        !          1205:   "*
        !          1206: {
        !          1207:   if (FP_REG_P (operands[0]))
        !          1208:     return \"fld.l %1,%0\";
        !          1209:   return \"ld.l %1,%0\";
        !          1210: }")
        !          1211: 
        !          1212: (define_insn ""
        !          1213:   [(set (match_operand:HI 0 "register_operand" "=r")
        !          1214:        (match_operand:HI 1 "indexed_operand" "m"))]
        !          1215:   ""
        !          1216:   "ld.s %1,%0")
        !          1217: 
        !          1218: (define_insn ""
        !          1219:   [(set (match_operand:QI 0 "register_operand" "=r")
        !          1220:        (match_operand:QI 1 "indexed_operand" "m"))]
        !          1221:   ""
        !          1222:   "ld.b %1,%0")
        !          1223: 
        !          1224: ;; Likewise for floating-point store insns.
        !          1225: 
        !          1226: (define_insn ""
        !          1227:   [(set (match_operand:DF 0 "indexed_operand" "=m")
        !          1228:        (match_operand:DF 1 "register_operand" "f"))]
        !          1229:   ""
        !          1230:   "fst.d %1,%0")
        !          1231: 
        !          1232: (define_insn ""
        !          1233:   [(set (match_operand:SF 0 "indexed_operand" "=m")
        !          1234:        (match_operand:SF 1 "register_operand" "f"))]
        !          1235:   ""
        !          1236:   "fst.l %1,%0")
        !          1237: 
        !          1238: ;;- truncation instructions
        !          1239: (define_insn "truncsiqi2"
        !          1240:   [(set (match_operand:QI 0 "general_operand" "=g")
        !          1241:        (truncate:QI
        !          1242:         (match_operand:SI 1 "register_operand" "r")))]
        !          1243:   ""
        !          1244:   "*
        !          1245: {
        !          1246:   if (GET_CODE (operands[0]) == MEM)
        !          1247:     if (CONSTANT_ADDRESS_P (XEXP (operands[0], 0)))
        !          1248:       {
        !          1249:        if (! ((cc_prev_status.flags & CC_KNOW_HI_R31)
        !          1250:               && (cc_prev_status.flags & CC_HI_R31_ADJ)
        !          1251:               && XEXP (operands[0], 0) == cc_prev_status.mdep))
        !          1252:          {
        !          1253:            CC_STATUS_INIT;
        !          1254:            cc_status.flags |= CC_KNOW_HI_R31 | CC_HI_R31_ADJ;
        !          1255:            cc_status.mdep = XEXP (operands[0], 0);
        !          1256:            output_asm_insn (\"orh %h0,%?r0,%?r31\", operands);
        !          1257:          }
        !          1258:        return \"st.b %1,%L0(%?r31)\";
        !          1259:       }
        !          1260:     else
        !          1261:       return \"st.b %1,%0\";
        !          1262:   return \"shl %?r0,%1,%0\";
        !          1263: }")
        !          1264: 
        !          1265: (define_insn "trunchiqi2"
        !          1266:   [(set (match_operand:QI 0 "general_operand" "=g")
        !          1267:        (truncate:QI
        !          1268:         (match_operand:HI 1 "register_operand" "r")))]
        !          1269:   ""
        !          1270:   "*
        !          1271: {
        !          1272:   if (GET_CODE (operands[0]) == MEM)
        !          1273:     if (CONSTANT_ADDRESS_P (XEXP (operands[0], 0)))
        !          1274:       {
        !          1275:        if (! ((cc_prev_status.flags & CC_KNOW_HI_R31)
        !          1276:               && (cc_prev_status.flags & CC_HI_R31_ADJ)
        !          1277:               && XEXP (operands[0], 0) == cc_prev_status.mdep))
        !          1278:          {
        !          1279:            CC_STATUS_INIT;
        !          1280:            cc_status.flags |= CC_KNOW_HI_R31 | CC_HI_R31_ADJ;
        !          1281:            cc_status.mdep = XEXP (operands[0], 0);
        !          1282:            output_asm_insn (\"orh %h0,%?r0,%?r31\", operands);
        !          1283:          }
        !          1284:        return \"st.b %1,%L0(%?r31)\";
        !          1285:       }
        !          1286:     else
        !          1287:       return \"st.b %1,%0\";
        !          1288:   return \"shl %?r0,%1,%0\";
        !          1289: }")
        !          1290: 
        !          1291: (define_insn "truncsihi2"
        !          1292:   [(set (match_operand:HI 0 "general_operand" "=g")
        !          1293:        (truncate:HI
        !          1294:         (match_operand:SI 1 "register_operand" "r")))]
        !          1295:   ""
        !          1296:   "*
        !          1297: {
        !          1298:   if (GET_CODE (operands[0]) == MEM)
        !          1299:     if (CONSTANT_ADDRESS_P (XEXP (operands[0], 0)))
        !          1300:       {
        !          1301:        if (! ((cc_prev_status.flags & CC_KNOW_HI_R31)
        !          1302:               && (cc_prev_status.flags & CC_HI_R31_ADJ)
        !          1303:               && XEXP (operands[0], 0) == cc_prev_status.mdep))
        !          1304:          {
        !          1305:            CC_STATUS_INIT;
        !          1306:            cc_status.flags |= CC_KNOW_HI_R31 | CC_HI_R31_ADJ;
        !          1307:            cc_status.mdep = XEXP (operands[0], 0);
        !          1308:            output_asm_insn (\"orh %h0,%?r0,%?r31\", operands);
        !          1309:          }
        !          1310:        return \"st.s %1,%L0(%?r31)\";
        !          1311:       }
        !          1312:     else
        !          1313:       return \"st.s %1,%0\";
        !          1314:   return \"shl %?r0,%1,%0\";
        !          1315: }")
        !          1316: 
        !          1317: ;;- zero extension instructions
        !          1318: 
        !          1319: (define_insn "zero_extendhisi2"
        !          1320:   [(set (match_operand:SI 0 "register_operand" "=r")
        !          1321:        (zero_extend:SI
        !          1322:         (match_operand:HI 1 "register_operand" "r")))]
        !          1323:   ""
        !          1324:   "*
        !          1325: {
        !          1326:   CC_STATUS_PARTIAL_INIT;
        !          1327:   return \"and 0xffff,%1,%0\";
        !          1328: }")
        !          1329: 
        !          1330: (define_insn "zero_extendqihi2"
        !          1331:   [(set (match_operand:HI 0 "register_operand" "=r")
        !          1332:        (zero_extend:HI
        !          1333:         (match_operand:QI 1 "register_operand" "r")))]
        !          1334:   ""
        !          1335:   "*
        !          1336: {
        !          1337:   CC_STATUS_PARTIAL_INIT;
        !          1338:   return \"and 0xff,%1,%0\";
        !          1339: }")
        !          1340: 
        !          1341: (define_insn "zero_extendqisi2"
        !          1342:   [(set (match_operand:SI 0 "register_operand" "=r")
        !          1343:        (zero_extend:SI
        !          1344:         (match_operand:QI 1 "register_operand" "r")))]
        !          1345:   ""
        !          1346:   "*
        !          1347: {
        !          1348:   CC_STATUS_PARTIAL_INIT;
        !          1349:   return \"and 0xff,%1,%0\";
        !          1350: }")
        !          1351: 
        !          1352: ;; Sign extension instructions.
        !          1353: 
        !          1354: (define_insn ""
        !          1355:   [(set (match_operand:SI 0 "register_operand" "=r")
        !          1356:        (sign_extend:SI
        !          1357:         (match_operand:HI 1 "indexed_operand" "m")))]
        !          1358:   ""
        !          1359:   "ld.s %1,%0")
        !          1360: 
        !          1361: (define_insn ""
        !          1362:   [(set (match_operand:HI 0 "register_operand" "=r")
        !          1363:        (sign_extend:HI
        !          1364:         (match_operand:QI 1 "indexed_operand" "m")))]
        !          1365:   ""
        !          1366:   "ld.b %1,%0")
        !          1367: 
        !          1368: (define_insn ""
        !          1369:   [(set (match_operand:SI 0 "register_operand" "=r")
        !          1370:        (sign_extend:SI
        !          1371:         (match_operand:QI 1 "indexed_operand" "m")))]
        !          1372:   ""
        !          1373:   "ld.b %1,%0")
        !          1374: 
        !          1375: (define_insn "extendhisi2"
        !          1376:   [(set (match_operand:SI 0 "register_operand" "=r")
        !          1377:        (sign_extend:SI
        !          1378:         (match_operand:HI 1 "nonimmediate_operand" "mr")))]
        !          1379:   ""
        !          1380:   "*
        !          1381: {
        !          1382:   if (REG_P (operands[1]))
        !          1383:     return \"shl 16,%1,%0\;shra 16,%0,%0\";
        !          1384:   if (GET_CODE (operands[1]) == CONST_INT)
        !          1385:     abort ();
        !          1386:   if (CONSTANT_ADDRESS_P (XEXP (operands[1], 0)))
        !          1387:     {
        !          1388:       CC_STATUS_INIT;
        !          1389:       cc_status.flags |= CC_KNOW_HI_R31 | CC_HI_R31_ADJ;
        !          1390:       cc_status.mdep = XEXP (operands[1], 0);
        !          1391:       return \"orh %h1,%?r0,%?r31\;ld.s %L1(%?r31),%0\";
        !          1392:     }
        !          1393:   else
        !          1394:     return \"ld.s %1,%0\";
        !          1395: }")
        !          1396: 
        !          1397: (define_insn "extendqihi2"
        !          1398:   [(set (match_operand:HI 0 "register_operand" "=r")
        !          1399:        (sign_extend:HI
        !          1400:         (match_operand:QI 1 "nonimmediate_operand" "mr")))]
        !          1401:   ""
        !          1402:   "*
        !          1403: {
        !          1404:   if (REG_P (operands[1]))
        !          1405:     return \"shl 24,%1,%0\;shra 24,%0,%0\";
        !          1406:   if (GET_CODE (operands[1]) == CONST_INT)
        !          1407:     abort ();
        !          1408:   if (CONSTANT_ADDRESS_P (XEXP (operands[1], 0)))
        !          1409:     {
        !          1410:       CC_STATUS_INIT;
        !          1411:       cc_status.flags |= CC_KNOW_HI_R31 | CC_HI_R31_ADJ;
        !          1412:       cc_status.mdep = XEXP (operands[1], 0);
        !          1413:       return \"orh %h1,%?r0,%?r31\;ld.b %L1(%?r31),%0\";
        !          1414:     }
        !          1415:   else
        !          1416:     return \"ld.b %1,%0\";
        !          1417: }")
        !          1418: 
        !          1419: (define_insn "extendqisi2"
        !          1420:   [(set (match_operand:SI 0 "register_operand" "=r")
        !          1421:        (sign_extend:SI
        !          1422:         (match_operand:QI 1 "nonimmediate_operand" "mr")))]
        !          1423:   ""
        !          1424:   "*
        !          1425: {
        !          1426:   if (REG_P (operands[1]))
        !          1427:     return \"shl 24,%1,%0\;shra 24,%0,%0\";
        !          1428:   if (GET_CODE (operands[1]) == CONST_INT)
        !          1429:     abort ();
        !          1430:   if (CONSTANT_ADDRESS_P (XEXP (operands[1], 0)))
        !          1431:     {
        !          1432:       CC_STATUS_INIT;
        !          1433:       cc_status.flags |= CC_KNOW_HI_R31 | CC_HI_R31_ADJ;
        !          1434:       cc_status.mdep = XEXP (operands[1], 0);
        !          1435:       return \"orh %h1,%?r0,%?r31\;ld.b %L1(%?r31),%0\";
        !          1436:     }
        !          1437:   else
        !          1438:     return \"ld.b %1,%0\";
        !          1439: }")
        !          1440: 
        !          1441: ;; Signed bitfield extractions come out looking like
        !          1442: ;;     (shiftrt (sign_extend (shift <Y> <C1>)) <C2>)
        !          1443: ;; which we expand poorly as four shift insns.
        !          1444: ;; These patters yeild two shifts:
        !          1445: ;;     (shiftrt (shift <Y> <C3>) <C4>)
        !          1446: (define_insn ""
        !          1447:   [(set (match_operand:SI 0 "register_operand" "=r")
        !          1448:        (ashiftrt:SI
        !          1449:         (sign_extend:SI
        !          1450:          (match_operand:QI 1 "register_operand" "r"))
        !          1451:         (match_operand:SI 2 "logic_int" "n")))]
        !          1452:   "INTVAL (operands[2]) < 8"
        !          1453:   "*
        !          1454: {
        !          1455:   return \"shl 24,%1,%0\;shra 24+%2,%0,%0\";
        !          1456: }")
        !          1457: 
        !          1458: (define_insn ""
        !          1459:   [(set (match_operand:SI 0 "register_operand" "=r")
        !          1460:        (ashiftrt:SI
        !          1461:         (sign_extend:SI
        !          1462:          (subreg:QI (ashift:SI (match_operand:SI 1 "register_operand" "r")
        !          1463:                                (match_operand:SI 2 "logic_int" "n")) 0))
        !          1464:         (match_operand:SI 3 "logic_int" "n")))]
        !          1465:   "INTVAL (operands[3]) < 8"
        !          1466:   "*
        !          1467: {
        !          1468:   return \"shl 0x18+%2,%1,%0\;shra 0x18+%3,%0,%0\";
        !          1469: }")
        !          1470: 
        !          1471: (define_insn ""
        !          1472:   [(set (match_operand:SI 0 "register_operand" "=r")
        !          1473:        (ashiftrt:SI
        !          1474:         (sign_extend:SI
        !          1475:          (ashift:QI (match_operand:QI 1 "register_operand" "r")
        !          1476:                     (match_operand:QI 2 "logic_int" "n")))
        !          1477:         (match_operand:SI 3 "logic_int" "n")))]
        !          1478:   "INTVAL (operands[3]) < 8"
        !          1479:   "*
        !          1480: {
        !          1481:   return \"shl 0x18+%2,%1,%0\;shra 0x18+%3,%0,%0\";
        !          1482: }")
        !          1483: 
        !          1484: ;; Special patterns for optimizing bit-field instructions.
        !          1485: 
        !          1486: ;; First two patterns are for bitfields that came from memory
        !          1487: ;; testing only the high bit.  They work with old combiner.
        !          1488: 
        !          1489: (define_insn ""
        !          1490:   [(set (cc0)
        !          1491:        (eq (zero_extend:SI (subreg:QI (lshiftrt:SI (match_operand:SI 0 "register_operand" "r")
        !          1492:                                                    (const_int 7)) 0))
        !          1493:            (const_int 0)))]
        !          1494:   ""
        !          1495:   "*
        !          1496: {
        !          1497:   CC_STATUS_PARTIAL_INIT;
        !          1498:   return \"and 128,%0,%?r0\";
        !          1499: }")
        !          1500: 
        !          1501: (define_insn ""
        !          1502:   [(set (cc0)
        !          1503:        (eq (sign_extend:SI (subreg:QI (ashiftrt:SI (match_operand:SI 0 "register_operand" "r")
        !          1504:                                                    (const_int 7)) 0))
        !          1505:            (const_int 0)))]
        !          1506:   ""
        !          1507:   "*
        !          1508: {
        !          1509:   CC_STATUS_PARTIAL_INIT;
        !          1510:   return \"and 128,%0,%?r0\";
        !          1511: }")
        !          1512: 
        !          1513: ;; next two patterns are good for bitfields coming from memory
        !          1514: ;; (via pseudo-register) or from a register, though this optimization
        !          1515: ;; is only good for values contained wholly within the bottom 13 bits
        !          1516: (define_insn ""
        !          1517:   [(set (cc0)
        !          1518:        (eq 
        !          1519:         (and:SI (lshiftrt:SI (match_operand:SI 0 "register_operand" "r")
        !          1520:                              (match_operand:SI 1 "logic_int" "n"))
        !          1521:                 (match_operand:SI 2 "logic_int" "n"))
        !          1522:         (const_int 0)))]
        !          1523:   "LOGIC_INTVAL (INTVAL (operands[2]) << INTVAL (operands[1]))"
        !          1524:   "*
        !          1525: {
        !          1526:   CC_STATUS_PARTIAL_INIT;
        !          1527:   operands[2] = gen_rtx (CONST_INT, VOIDmode,
        !          1528:                         (INTVAL (operands[2]) << INTVAL (operands[1])));
        !          1529:   return \"and %2,%0,%?r0\";
        !          1530: }")
        !          1531: 
        !          1532: (define_insn ""
        !          1533:   [(set (cc0)
        !          1534:        (eq 
        !          1535:         (and:SI (ashiftrt:SI (match_operand:SI 0 "register_operand" "r")
        !          1536:                              (match_operand:SI 1 "logic_int" "n"))
        !          1537:                 (match_operand:SI 2 "logic_int" "n"))
        !          1538:         (const_int 0)))]
        !          1539:   "LOGIC_INTVAL (INTVAL (operands[2]) << INTVAL (operands[1]))"
        !          1540:   "*
        !          1541: {
        !          1542:   CC_STATUS_PARTIAL_INIT;
        !          1543:   operands[2] = gen_rtx (CONST_INT, VOIDmode,
        !          1544:                         (INTVAL (operands[2]) << INTVAL (operands[1])));
        !          1545:   return \"and %2,%0,%?r0\";
        !          1546: }")
        !          1547: 
        !          1548: ;; Conversions between float and double.
        !          1549: 
        !          1550: (define_insn "extendsfdf2"
        !          1551:   [(set (match_operand:DF 0 "register_operand" "=f")
        !          1552:        (float_extend:DF
        !          1553:         (match_operand:SF 1 "register_operand" "f")))]
        !          1554:   ""
        !          1555:   "fmov.sd %1,%0")
        !          1556: 
        !          1557: (define_insn "truncdfsf2"
        !          1558:   [(set (match_operand:SF 0 "register_operand" "=f")
        !          1559:        (float_truncate:SF
        !          1560:         (match_operand:DF 1 "register_operand" "f")))]
        !          1561:   ""
        !          1562:   "fmov.ds %1,%0")
        !          1563: 
        !          1564: ;; Conversion between fixed point and floating point.
        !          1565: ;; Note that among the fix-to-float insns
        !          1566: ;; the ones that start with SImode come first.
        !          1567: ;; That is so that an operand that is a CONST_INT
        !          1568: ;; (and therefore lacks a specific machine mode).
        !          1569: ;; will be recognized as SImode (which is always valid)
        !          1570: ;; rather than as QImode or HImode.
        !          1571: 
        !          1572: ;; This pattern forces (set (reg:SF ...) (float:SF (const_int ...)))
        !          1573: ;; to be reloaded by putting the constant into memory.
        !          1574: ;; It must come before the more general floatsisf2 pattern.
        !          1575: (define_expand "floatsidf2"
        !          1576:   [(set (match_dup 2) (match_dup 3))
        !          1577:    (set (match_dup 4) (xor:SI (match_operand:SI 1 "register_operand" "")
        !          1578:                              (const_int -2147483648)))
        !          1579:    (set (match_dup 5) (match_dup 3))
        !          1580:    (set (subreg:SI (match_dup 5) 0) (match_dup 4))
        !          1581:    (set (match_operand:DF 0 "register_operand" "")
        !          1582:        (minus:DF (match_dup 5) (match_dup 2)))]
        !          1583:   ""
        !          1584:   "
        !          1585: {
        !          1586:   REAL_VALUE_TYPE d;
        !          1587:   /* 4503601774854144 is  (1 << 30) * ((1 << 22) + (1 << 1)).  */
        !          1588:   d = REAL_VALUE_ATOF (\"4503601774854144\", DFmode);
        !          1589:   operands[2] = gen_reg_rtx (DFmode);
        !          1590:   operands[3] = CONST_DOUBLE_FROM_REAL_VALUE (d, DFmode);
        !          1591:   operands[4] = gen_reg_rtx (SImode);
        !          1592:   operands[5] = gen_reg_rtx (DFmode);
        !          1593: }")
        !          1594: 
        !          1595: ;; Floating to fixed conversion.
        !          1596: 
        !          1597: (define_expand "fix_truncdfsi2"
        !          1598:   ;; This first insn produces a double-word value
        !          1599:   ;; in which only the low word is valid.
        !          1600:   [(set (match_dup 2)
        !          1601:        (fix:DI (fix:DF (match_operand:DF 1 "register_operand" "f"))))
        !          1602:    (set (match_operand:SI 0 "register_operand" "=f")
        !          1603:        (subreg:SI (match_dup 2) 0))]
        !          1604:   ""
        !          1605:   "
        !          1606: {
        !          1607:   operands[2] = gen_reg_rtx (DImode);
        !          1608: }")
        !          1609: 
        !          1610: ;; Recognize the first insn generated above.
        !          1611: ;; This RTL looks like a fix_truncdfdi2 insn,
        !          1612: ;; but we dont call it that, because only 32 bits
        !          1613: ;; of the result are valid.
        !          1614: ;; This pattern will work for the intended purposes 
        !          1615: ;; as long as we do not have any fixdfdi2 or fix_truncdfdi2.
        !          1616: (define_insn ""
        !          1617:   [(set (match_operand:DI 0 "register_operand" "=f")
        !          1618:        (fix:DI (fix:DF (match_operand:DF 1 "register_operand" "f"))))]
        !          1619:   ""
        !          1620:   "ftrunc.dd %1,%0")
        !          1621: 
        !          1622: (define_expand "fix_truncsfsi2"
        !          1623:   ;; This first insn produces a double-word value
        !          1624:   ;; in which only the low word is valid.
        !          1625:   [(set (match_dup 2)
        !          1626:        (fix:DI (fix:SF (match_operand:SF 1 "register_operand" "f"))))
        !          1627:    (set (match_operand:SI 0 "register_operand" "=f")
        !          1628:        (subreg:SI (match_dup 2) 0))]
        !          1629:   ""
        !          1630:   "
        !          1631: {
        !          1632:   operands[2] = gen_reg_rtx (DImode);
        !          1633: }")
        !          1634: 
        !          1635: ;; Recognize the first insn generated above.
        !          1636: ;; This RTL looks like a fix_truncsfdi2 insn,
        !          1637: ;; but we dont call it that, because only 32 bits
        !          1638: ;; of the result are valid.
        !          1639: ;; This pattern will work for the intended purposes 
        !          1640: ;; as long as we do not have any fixsfdi2 or fix_truncsfdi2.
        !          1641: (define_insn ""
        !          1642:   [(set (match_operand:DI 0 "register_operand" "=f")
        !          1643:        (fix:DI (fix:SF (match_operand:SF 1 "register_operand" "f"))))]
        !          1644:   ""
        !          1645:   "ftrunc.sd %1,%0")
        !          1646: 
        !          1647: ;;- arithmetic instructions
        !          1648: 
        !          1649: (define_insn "addsi3"
        !          1650:   [(set (match_operand:SI 0 "register_operand" "=r,*f")
        !          1651:        (plus:SI (match_operand:SI 1 "nonmemory_operand" "%r,*f")
        !          1652:                 (match_operand:SI 2 "arith_operand" "rI,*f")))]
        !          1653:   ""
        !          1654:   "*
        !          1655: {
        !          1656:   if (which_alternative == 1)
        !          1657:     return \"fiadd.ss %2,%1,%0\";
        !          1658:   CC_STATUS_PARTIAL_INIT;
        !          1659:   return \"addu %2,%1,%0\";
        !          1660: }")
        !          1661: 
        !          1662: (define_insn "adddi3"
        !          1663:   [(set (match_operand:DI 0 "register_operand" "=f")
        !          1664:        (plus:DI (match_operand:DI 1 "register_operand" "%f")
        !          1665:                 (match_operand:DI 2 "register_operand" "f")))]
        !          1666:   ""
        !          1667:   "fiadd.dd %1,%2,%0")
        !          1668: 
        !          1669: (define_insn "subsi3"
        !          1670:   [(set (match_operand:SI 0 "register_operand" "=r,r,*f")
        !          1671:        (minus:SI (match_operand:SI 1 "register_operand" "r,I,*f")
        !          1672:                  (match_operand:SI 2 "arith_operand" "rI,r,*f")))]
        !          1673:   ""
        !          1674:   "*
        !          1675: {
        !          1676:   if (which_alternative == 2)
        !          1677:     return \"fisub.ss %1,%2,%0\";
        !          1678:   CC_STATUS_PARTIAL_INIT;
        !          1679:   if (REG_P (operands[2]))
        !          1680:     return \"subu %1,%2,%0\";
        !          1681:   operands[2] = gen_rtx (CONST_INT, VOIDmode, - INTVAL (operands[2]));
        !          1682:   return \"addu %2,%1,%0\";
        !          1683: }")
        !          1684: 
        !          1685: (define_insn "subdi3"
        !          1686:   [(set (match_operand:DI 0 "register_operand" "=f")
        !          1687:        (minus:DI (match_operand:DI 1 "register_operand" "%f")
        !          1688:                  (match_operand:DI 2 "register_operand" "f")))]
        !          1689:   ""
        !          1690:   "fisub.dd %1,%2,%0")
        !          1691: 
        !          1692: (define_expand "mulsi3"
        !          1693:   [(set (subreg:SI (match_dup 4) 0) (match_operand:SI 1 "general_operand" ""))
        !          1694:    (set (subreg:SI (match_dup 5) 0) (match_operand:SI 2 "general_operand" ""))
        !          1695:    (clobber (match_dup 3))
        !          1696:    (set (subreg:SI (match_dup 3) 0)
        !          1697:        (mult:SI (subreg:SI (match_dup 4) 0) (subreg:SI (match_dup 5) 0)))
        !          1698:    (set (match_operand:SI 0 "register_operand" "") (subreg:SI (match_dup 3) 0))]
        !          1699:   ""
        !          1700:   "
        !          1701: {
        !          1702:   if (WORDS_BIG_ENDIAN)
        !          1703:     emit_insn (gen_mulsi3_big (operands[0], operands[1], operands[2]));
        !          1704:   else
        !          1705:     emit_insn (gen_mulsi3_little (operands[0], operands[1], operands[2]));
        !          1706:   DONE;
        !          1707: }")
        !          1708: 
        !          1709: (define_expand "mulsi3_little"
        !          1710:   [(set (subreg:SI (match_dup 4) 0) (match_operand:SI 1 "general_operand" ""))
        !          1711:    (set (subreg:SI (match_dup 5) 0) (match_operand:SI 2 "general_operand" ""))
        !          1712:    (clobber (match_dup 3))
        !          1713:    (set (subreg:SI (match_dup 3) 0)
        !          1714:        (mult:SI (subreg:SI (match_dup 4) 0) (subreg:SI (match_dup 5) 0)))
        !          1715:    (set (match_operand:SI 0 "register_operand" "") (subreg:SI (match_dup 3) 0))]
        !          1716:   "! WORDS_BIG_ENDIAN"
        !          1717:   "
        !          1718: {
        !          1719:   operands[3] = gen_reg_rtx (DImode);
        !          1720:   operands[4] = gen_reg_rtx (DImode);
        !          1721:   operands[5] = gen_reg_rtx (DImode);
        !          1722: }")
        !          1723: 
        !          1724: (define_expand "mulsi3_big"
        !          1725:   [(set (subreg:SI (match_dup 4) 1) (match_operand:SI 1 "general_operand" ""))
        !          1726:    (set (subreg:SI (match_dup 5) 1) (match_operand:SI 2 "general_operand" ""))
        !          1727:    (clobber (match_dup 3))
        !          1728:    (set (subreg:SI (match_dup 3) 1)
        !          1729:        (mult:SI (subreg:SI (match_dup 4) 1) (subreg:SI (match_dup 5) 1)))
        !          1730:    (set (match_operand:SI 0 "register_operand" "") (subreg:SI (match_dup 3) 1))]
        !          1731:   "WORDS_BIG_ENDIAN"
        !          1732:   "
        !          1733: {
        !          1734:   operands[3] = gen_reg_rtx (DImode);
        !          1735:   operands[4] = gen_reg_rtx (DImode);
        !          1736:   operands[5] = gen_reg_rtx (DImode);
        !          1737: }")
        !          1738: 
        !          1739: (define_insn ""
        !          1740:   [(set (subreg:SI (match_operand:DI 0 "register_operand" "=f") 0)
        !          1741:        (mult:SI (subreg:SI (match_operand:DI 1 "register_operand" "f") 0)
        !          1742:                 (subreg:SI (match_operand:DI 2 "register_operand" "f") 0)))]
        !          1743:   "! WORDS_BIG_ENDIAN"
        !          1744:   "fmlow.dd %2,%1,%0")
        !          1745: 
        !          1746: (define_insn ""
        !          1747:   [(set (subreg:SI (match_operand:DI 0 "register_operand" "=f") 1)
        !          1748:        (mult:SI (subreg:SI (match_operand:DI 1 "register_operand" "f") 1)
        !          1749:                 (subreg:SI (match_operand:DI 2 "register_operand" "f") 1)))]
        !          1750:   "WORDS_BIG_ENDIAN"
        !          1751:   "fmlow.dd %2,%1,%0")
        !          1752: 
        !          1753: ;;- and instructions (with compliment also)                       
        !          1754: (define_insn "andsi3"
        !          1755:   [(set (match_operand:SI 0 "register_operand" "=r")
        !          1756:        (and:SI (match_operand:SI 1 "nonmemory_operand" "%r")
        !          1757:                (match_operand:SI 2 "nonmemory_operand" "rL")))]
        !          1758:   ""
        !          1759:   "*
        !          1760: {
        !          1761:   rtx xop[3];
        !          1762: 
        !          1763:   CC_STATUS_PARTIAL_INIT;
        !          1764:   if (REG_P (operands[2]) || LOGIC_INT (operands[2]))
        !          1765:     return \"and %2,%1,%0\";
        !          1766:   if ((INTVAL (operands[2]) & 0xffff) == 0)
        !          1767:     {
        !          1768:       operands[2] = gen_rtx (CONST_INT, VOIDmode, 
        !          1769:                             (unsigned) INTVAL (operands[2]) >> 16);
        !          1770:       return \"andh %2,%1,%0\";
        !          1771:     }
        !          1772:   xop[0] = operands[0];
        !          1773:   xop[1] = operands[1];
        !          1774:   xop[2] = gen_rtx (CONST_INT, VOIDmode, ~INTVAL (operands[2]) & 0xffff);
        !          1775:   output_asm_insn (\"andnot %2,%1,%0\", xop);
        !          1776:   operands[2] = gen_rtx (CONST_INT, VOIDmode, 
        !          1777:                         ~(unsigned) INTVAL (operands[2]) >> 16);
        !          1778:   return \"andnoth %2,%0,%0\";
        !          1779: }")
        !          1780: 
        !          1781: (define_insn ""
        !          1782:   [(set (match_operand:SI 0 "register_operand" "=r")
        !          1783:        (and:SI (not:SI (match_operand:SI 1 "register_operand" "rn"))
        !          1784:                (match_operand:SI 2 "register_operand" "r")))]
        !          1785:   ""
        !          1786:   "*
        !          1787: {
        !          1788:   rtx xop[3];
        !          1789: 
        !          1790:   CC_STATUS_PARTIAL_INIT;
        !          1791:   if (REG_P (operands[1]) || LOGIC_INT (operands[1]))
        !          1792:     return \"andnot %1,%2,%0\";
        !          1793:   if ((INTVAL (operands[1]) & 0xffff) == 0)
        !          1794:     {
        !          1795:       operands[1] = gen_rtx (CONST_INT, VOIDmode, 
        !          1796:                             (unsigned) INTVAL (operands[1]) >> 16);
        !          1797:       return \"andnoth %1,%2,%0\";
        !          1798:     }
        !          1799:   xop[0] = operands[0];
        !          1800:   xop[1] = gen_rtx (CONST_INT, VOIDmode, (INTVAL (operands[1]) & 0xffff));
        !          1801:   xop[2] = operands[2];
        !          1802:   output_asm_insn (\"andnot %1,%2,%0\", xop);
        !          1803:   operands[1] = gen_rtx (CONST_INT, VOIDmode, 
        !          1804:                         (unsigned) INTVAL (operands[1]) >> 16);
        !          1805:   return \"andnoth %1,%0,%0\";
        !          1806: }")
        !          1807: 
        !          1808: (define_insn "iorsi3"
        !          1809:   [(set (match_operand:SI 0 "register_operand" "=r")
        !          1810:        (ior:SI (match_operand:SI 1 "nonmemory_operand" "%r")
        !          1811:                (match_operand:SI 2 "nonmemory_operand" "rL")))]
        !          1812:   ""
        !          1813:   "*
        !          1814: {
        !          1815:   rtx xop[3];
        !          1816: 
        !          1817:   CC_STATUS_PARTIAL_INIT;
        !          1818:   if (REG_P (operands[2]) || LOGIC_INT (operands[2]))
        !          1819:     return \"or %2,%1,%0\";
        !          1820:   if ((INTVAL (operands[2]) & 0xffff) == 0)
        !          1821:     {
        !          1822:       operands[2] = gen_rtx (CONST_INT, VOIDmode, 
        !          1823:                             (unsigned) INTVAL (operands[2]) >> 16);
        !          1824:       return \"orh %2,%1,%0\";
        !          1825:     }
        !          1826:   xop[0] = operands[0];
        !          1827:   xop[1] = operands[1];
        !          1828:   xop[2] = gen_rtx (CONST_INT, VOIDmode, (INTVAL (operands[2]) & 0xffff));
        !          1829:   output_asm_insn (\"or %2,%1,%0\", xop);
        !          1830:   operands[2] = gen_rtx (CONST_INT, VOIDmode, 
        !          1831:                         (unsigned) INTVAL (operands[2]) >> 16);
        !          1832:   return \"orh %2,%0,%0\";
        !          1833: }")
        !          1834: 
        !          1835: (define_insn "xorsi3"
        !          1836:   [(set (match_operand:SI 0 "register_operand" "=r")
        !          1837:        (xor:SI (match_operand:SI 1 "nonmemory_operand" "%r")
        !          1838:                (match_operand:SI 2 "nonmemory_operand" "rL")))]
        !          1839:   ""
        !          1840:   "*
        !          1841: {
        !          1842:   rtx xop[3];
        !          1843: 
        !          1844:   CC_STATUS_PARTIAL_INIT;
        !          1845:   if (REG_P (operands[2]) || LOGIC_INT (operands[2]))
        !          1846:     return \"xor %2,%1,%0\";
        !          1847:   if ((INTVAL (operands[2]) & 0xffff) == 0)
        !          1848:     {
        !          1849:       operands[2] = gen_rtx (CONST_INT, VOIDmode, 
        !          1850:                             (unsigned) INTVAL (operands[2]) >> 16);
        !          1851:       return \"xorh %2,%1,%0\";
        !          1852:     }
        !          1853:   xop[0] = operands[0];
        !          1854:   xop[1] = operands[1];
        !          1855:   xop[2] = gen_rtx (CONST_INT, VOIDmode, (INTVAL (operands[2]) & 0xffff));
        !          1856:   output_asm_insn (\"xor %2,%1,%0\", xop);
        !          1857:   operands[2] = gen_rtx (CONST_INT, VOIDmode, 
        !          1858:                         (unsigned) INTVAL (operands[2]) >> 16);
        !          1859:   return \"xorh %2,%0,%0\";
        !          1860: }")
        !          1861: 
        !          1862: ;(The i860 instruction set doesn't allow an immediate second operand in
        !          1863: ; a subtraction.)
        !          1864: (define_insn "negsi2"
        !          1865:   [(set (match_operand:SI 0 "general_operand" "=r")
        !          1866:        (neg:SI (match_operand:SI 1 "arith_operand" "r")))]
        !          1867:   ""
        !          1868:   "*
        !          1869: {
        !          1870:   CC_STATUS_PARTIAL_INIT;
        !          1871:   return \"subu %?r0,%1,%0\";
        !          1872: }")
        !          1873: 
        !          1874: (define_insn "one_cmplsi2"
        !          1875:   [(set (match_operand:SI 0 "general_operand" "=r")
        !          1876:        (not:SI (match_operand:SI 1 "arith_operand" "r")))]
        !          1877:   ""
        !          1878:   "*
        !          1879: {
        !          1880:   CC_STATUS_PARTIAL_INIT;
        !          1881:   return \"subu -1,%1,%0\";
        !          1882: }")
        !          1883: 
        !          1884: ;; Floating point arithmetic instructions.
        !          1885: 
        !          1886: (define_insn "adddf3"
        !          1887:   [(set (match_operand:DF 0 "register_operand" "=f")
        !          1888:        (plus:DF (match_operand:DF 1 "register_operand" "f")
        !          1889:                 (match_operand:DF 2 "register_operand" "f")))]
        !          1890:   ""
        !          1891:   "fadd.dd %1,%2,%0")
        !          1892: 
        !          1893: (define_insn "addsf3"
        !          1894:   [(set (match_operand:SF 0 "register_operand" "=f")
        !          1895:        (plus:SF (match_operand:SF 1 "register_operand" "f")
        !          1896:                 (match_operand:SF 2 "register_operand" "f")))]
        !          1897:   ""
        !          1898:   "fadd.ss %1,%2,%0")
        !          1899: 
        !          1900: (define_insn "subdf3"
        !          1901:   [(set (match_operand:DF 0 "register_operand" "=f")
        !          1902:        (minus:DF (match_operand:DF 1 "register_operand" "f")
        !          1903:                  (match_operand:DF 2 "register_operand" "f")))]
        !          1904:   ""
        !          1905:   "fsub.dd %1,%2,%0")
        !          1906: 
        !          1907: (define_insn "subsf3"
        !          1908:   [(set (match_operand:SF 0 "register_operand" "=f")
        !          1909:        (minus:SF (match_operand:SF 1 "register_operand" "f")
        !          1910:                  (match_operand:SF 2 "register_operand" "f")))]
        !          1911:   ""
        !          1912:   "fsub.ss %1,%2,%0")
        !          1913: 
        !          1914: (define_insn "muldf3"
        !          1915:   [(set (match_operand:DF 0 "register_operand" "=f")
        !          1916:        (mult:DF (match_operand:DF 1 "register_operand" "f")
        !          1917:                 (match_operand:DF 2 "register_operand" "f")))]
        !          1918:   ""
        !          1919:   "fmul.dd %1,%2,%0")
        !          1920: 
        !          1921: (define_insn "mulsf3"
        !          1922:   [(set (match_operand:SF 0 "register_operand" "=f")
        !          1923:        (mult:SF (match_operand:SF 1 "register_operand" "f")
        !          1924:                 (match_operand:SF 2 "register_operand" "f")))]
        !          1925:   ""
        !          1926:   "fmul.ss %1,%2,%0")
        !          1927: 
        !          1928: (define_insn "negdf2"
        !          1929:   [(set (match_operand:DF 0 "register_operand" "=f")
        !          1930:        (neg:DF (match_operand:DF 1 "register_operand" "f")))]
        !          1931:   ""
        !          1932:   "fsub.dd %?f0,%1,%0")
        !          1933: 
        !          1934: (define_insn "negsf2"
        !          1935:   [(set (match_operand:SF 0 "register_operand" "=f")
        !          1936:        (neg:SF (match_operand:SF 1 "register_operand" "f")))]
        !          1937:   ""
        !          1938:   "fsub.ss %?f0,%1,%0")
        !          1939: 
        !          1940: (define_insn "divdf3"
        !          1941:   [(set (match_operand:DF 0 "register_operand" "=&f")
        !          1942:        (div:DF (match_operand:DF 1 "register_operand" "f")
        !          1943:                 (match_operand:DF 2 "register_operand" "f")))
        !          1944:    (clobber (match_scratch:DF 3 "=&f"))
        !          1945:    (clobber (match_scratch:DF 4 "=&f"))]
        !          1946:   ""
        !          1947:   "*
        !          1948: {
        !          1949:   CC_STATUS_PARTIAL_INIT;
        !          1950:   if (((cc_prev_status.flags & CC_KNOW_HI_R31) == 0)
        !          1951:       || (cc_prev_status.flags & CC_HI_R31_ADJ)
        !          1952:       || (cc_prev_status.mdep != CONST2_RTX (SFmode)))
        !          1953:     {
        !          1954:       cc_status.flags |= CC_KNOW_HI_R31;
        !          1955:       cc_status.flags &= ~CC_HI_R31_ADJ;
        !          1956:       cc_status.mdep = CONST2_RTX (SFmode); 
        !          1957:       return \"frcp.dd %2,%3\;fmul.dd %2,%3,%0\;fmov.dd %?f0,%4\;\\\
        !          1958: orh 0x4000,%?r0,%?r31\;ixfr %?r31,%R4\;fsub.dd %4,%0,%0\;\\\
        !          1959: fmul.dd %3,%0,%3\;fmul.dd %2,%3,%0\;fsub.dd %4,%0,%0\;\\\
        !          1960: fmul.dd %3,%0,%3\;fmul.dd %2,%3,%0\;fsub.dd %4,%0,%0\;\\\
        !          1961: fmul.dd %3,%1,%3\;fmul.dd %0,%3,%0\";
        !          1962:     }
        !          1963:   else
        !          1964:     return \"frcp.dd %2,%3\;fmul.dd %2,%3,%0\;fmov.dd %?f0,%4\;\\\
        !          1965: ixfr %?r31,%R4\;fsub.dd %4,%0,%0\;\\\
        !          1966: fmul.dd %3,%0,%3\;fmul.dd %2,%3,%0\;fsub.dd %4,%0,%0\;\\\
        !          1967: fmul.dd %3,%0,%3\;fmul.dd %2,%3,%0\;fsub.dd %4,%0,%0\;\\\
        !          1968: fmul.dd %3,%1,%3\;fmul.dd %0,%3,%0\";
        !          1969: }")
        !          1970: 
        !          1971: (define_insn "divsf3"
        !          1972:   [(set (match_operand:SF 0 "register_operand" "=&f")
        !          1973:        (div:SF (match_operand:SF 1 "register_operand" "f")
        !          1974:                 (match_operand:SF 2 "register_operand" "f")))
        !          1975:    (clobber (match_scratch:SF 3 "=&f"))
        !          1976:    (clobber (match_scratch:SF 4 "=&f"))]
        !          1977:   ""
        !          1978:   "*
        !          1979: {
        !          1980:   CC_STATUS_PARTIAL_INIT;
        !          1981:   if (((cc_prev_status.flags & CC_KNOW_HI_R31) == 0)
        !          1982:       || (cc_prev_status.flags & CC_HI_R31_ADJ)
        !          1983:       || (cc_prev_status.mdep != CONST2_RTX (SFmode)))
        !          1984:     {
        !          1985:       cc_status.flags |= CC_KNOW_HI_R31;
        !          1986:       cc_status.flags &= ~CC_HI_R31_ADJ;
        !          1987:       cc_status.mdep = CONST2_RTX (SFmode);
        !          1988:       output_asm_insn (\"orh 0x4000,%?r0,%?r31\", operands);
        !          1989:     }
        !          1990:   return \"ixfr %?r31,%4\;frcp.ss %2,%0\;\\\
        !          1991: fmul.ss %2,%0,%3\;fsub.ss %4,%3,%3\;fmul.ss %0,%3,%0\;\\\
        !          1992: fmul.ss %2,%0,%3\;fsub.ss %4,%3,%3\;\\\
        !          1993: fmul.ss %1,%0,%4\;fmul.ss %3,%4,%0\";
        !          1994: }")
        !          1995: 
        !          1996: ;; Shift instructions
        !          1997: 
        !          1998: ;; Optimized special case of shifting.
        !          1999: ;; Must precede the general case.
        !          2000: 
        !          2001: (define_insn ""
        !          2002:   [(set (match_operand:SI 0 "register_operand" "=r")
        !          2003:        (ashiftrt:SI (match_operand:SI 1 "memory_operand" "m")
        !          2004:                     (const_int 24)))]
        !          2005:   ""
        !          2006:   "*
        !          2007: {
        !          2008:   if (CONSTANT_ADDRESS_P (XEXP (operands[1], 0)))
        !          2009:     {
        !          2010:       CC_STATUS_INIT;
        !          2011:       cc_status.flags |= CC_KNOW_HI_R31 | CC_HI_R31_ADJ;
        !          2012:       cc_status.mdep = XEXP (operands[1], 0);
        !          2013:       return \"orh %h1,%?r0,%?r31\;ld.b %L1(%?r31),%0\";
        !          2014:     }
        !          2015:   return \"ld.b %1,%0\";
        !          2016: }")
        !          2017: 
        !          2018: 
        !          2019: ;;- arithmetic shift instructions
        !          2020: (define_insn "ashlsi3"
        !          2021:   [(set (match_operand:SI 0 "register_operand" "=r")
        !          2022:        (ashift:SI (match_operand:SI 1 "register_operand" "r")
        !          2023:                   (match_operand:SI 2 "shift_operand" "rn")))]
        !          2024:   ""
        !          2025:   "*
        !          2026: {
        !          2027:   return \"shl %2,%1,%0\";
        !          2028: }")
        !          2029: 
        !          2030: (define_insn "ashlhi3"
        !          2031:   [(set (match_operand:HI 0 "register_operand" "=r")
        !          2032:        (ashift:HI (match_operand:HI 1 "register_operand" "r")
        !          2033:                   (match_operand:HI 2 "shift_operand" "rn")))]
        !          2034:   ""
        !          2035:   "*
        !          2036: {
        !          2037:   return \"shl %2,%1,%0\";
        !          2038: }")
        !          2039: 
        !          2040: (define_insn "ashlqi3"
        !          2041:   [(set (match_operand:QI 0 "register_operand" "=r")
        !          2042:        (ashift:QI (match_operand:QI 1 "register_operand" "r")
        !          2043:                   (match_operand:QI 2 "shift_operand" "rn")))]
        !          2044:   ""
        !          2045:   "*
        !          2046: {
        !          2047:   return \"shl %2,%1,%0\";
        !          2048: }")
        !          2049: 
        !          2050: (define_insn "ashrsi3"
        !          2051:   [(set (match_operand:SI 0 "register_operand" "=r")
        !          2052:        (ashiftrt:SI (match_operand:SI 1 "register_operand" "r")
        !          2053:                     (match_operand:SI 2 "shift_operand" "rn")))]
        !          2054:   ""
        !          2055:   "*
        !          2056: {
        !          2057:   return \"shra %2,%1,%0\";
        !          2058: }")
        !          2059: 
        !          2060: (define_insn "lshrsi3"
        !          2061:   [(set (match_operand:SI 0 "register_operand" "=r")
        !          2062:        (lshiftrt:SI (match_operand:SI 1 "register_operand" "r")
        !          2063:                     (match_operand:SI 2 "shift_operand" "rn")))]
        !          2064:   ""
        !          2065:   "*
        !          2066: {
        !          2067:   return \"shr %2,%1,%0\";
        !          2068: }")
        !          2069: 
        !          2070: ;; Unconditional and other jump instructions
        !          2071: 
        !          2072: (define_insn "jump"
        !          2073:   [(set (pc) (label_ref (match_operand 0 "" "")))]
        !          2074:   ""
        !          2075:   "*
        !          2076: {
        !          2077:   return \"br %l0\;nop\";
        !          2078: }")
        !          2079: 
        !          2080: ;; Here are two simple peepholes which fill the delay slot of
        !          2081: ;; an unconditional branch.
        !          2082: 
        !          2083: (define_peephole
        !          2084:   [(set (match_operand:SI 0 "register_operand" "=rf")
        !          2085:        (match_operand:SI 1 "single_insn_src_p" "gfG"))
        !          2086:    (set (pc) (label_ref (match_operand 2 "" "")))]
        !          2087:   ""
        !          2088:   "* return output_delayed_branch (\"br %l2\", operands, insn);")
        !          2089: 
        !          2090: (define_peephole
        !          2091:   [(set (match_operand:SI 0 "memory_operand" "=m")
        !          2092:        (match_operand:SI 1 "reg_or_0_operand" "rfJ"))
        !          2093:    (set (pc) (label_ref (match_operand 2 "" "")))]
        !          2094:   ""
        !          2095:   "* return output_delayed_branch (\"br %l2\", operands, insn);")
        !          2096: 
        !          2097: (define_insn "tablejump"
        !          2098:   [(set (pc) (match_operand:SI 0 "register_operand" "r"))
        !          2099:    (use (label_ref (match_operand 1 "" "")))]
        !          2100:   ""
        !          2101:   "bri %0\;nop")
        !          2102: 
        !          2103: (define_peephole
        !          2104:   [(set (match_operand:SI 0 "memory_operand" "=m")
        !          2105:        (match_operand:SI 1 "reg_or_0_operand" "rfJ"))
        !          2106:    (set (pc) (match_operand:SI 2 "register_operand" "r"))
        !          2107:    (use (label_ref (match_operand 3 "" "")))]
        !          2108:   ""
        !          2109:   "* return output_delayed_branch (\"bri %2\", operands, insn);")
        !          2110: 
        !          2111: ;;- jump to subroutine
        !          2112: (define_expand "call"
        !          2113:   [(call (match_operand:SI 0 "memory_operand" "m")
        !          2114:         (match_operand 1 "" "i"))]
        !          2115:   ;; operand[2] is next_arg_register
        !          2116:   ""
        !          2117:   "
        !          2118: {
        !          2119:   /* Make sure the address is just one reg and will stay that way.  */
        !          2120:   if (! call_insn_operand (operands[0], QImode))
        !          2121:     operands[0]
        !          2122:       = change_address (operands[0], VOIDmode,
        !          2123:                        copy_to_mode_reg (Pmode, XEXP (operands[0], 0)));
        !          2124:   if (INTVAL (operands[1]) > 0)
        !          2125:     {
        !          2126:       emit_move_insn (arg_pointer_rtx, stack_pointer_rtx);
        !          2127:       emit_insn (gen_rtx (USE, VOIDmode, arg_pointer_rtx));
        !          2128:     }
        !          2129: }")
        !          2130: 
        !          2131: ;;- jump to subroutine
        !          2132: (define_insn ""
        !          2133:   [(call (match_operand:SI 0 "call_insn_operand" "m")
        !          2134:         (match_operand 1 "" "i"))]
        !          2135:   ;; operand[2] is next_arg_register
        !          2136:   ""
        !          2137:   "*
        !          2138: {
        !          2139:   /* strip the MEM.  */
        !          2140:   operands[0] = XEXP (operands[0], 0);
        !          2141:   CC_STATUS_INIT;
        !          2142:   if (GET_CODE (operands[0]) == REG)
        !          2143:     return \"calli %0\;nop\";
        !          2144:   return \"call %0\;nop\";
        !          2145: }")
        !          2146: 
        !          2147: (define_peephole
        !          2148:   [(set (match_operand:SI 0 "register_operand" "=rf")
        !          2149:        (match_operand:SI 1 "single_insn_src_p" "gfG"))
        !          2150:    (call (match_operand:SI 2 "memory_operand" "m")
        !          2151:         (match_operand 3 "" "i"))]
        !          2152:   ;;- Don't use operand 1 for most machines.
        !          2153:   "! reg_mentioned_p (operands[0], operands[2])"
        !          2154:   "*
        !          2155: {
        !          2156:   /* strip the MEM.  */
        !          2157:   operands[2] = XEXP (operands[2], 0);
        !          2158:   if (GET_CODE (operands[2]) == REG)
        !          2159:     return output_delayed_branch (\"calli %2\", operands, insn);
        !          2160:   return output_delayed_branch (\"call %2\", operands, insn);
        !          2161: }")
        !          2162: 
        !          2163: (define_peephole
        !          2164:   [(set (match_operand:SI 0 "memory_operand" "=m")
        !          2165:        (match_operand:SI 1 "reg_or_0_operand" "rfJ"))
        !          2166:    (call (match_operand:SI 2 "call_insn_operand" "m")
        !          2167:         (match_operand 3 "" "i"))]
        !          2168:   ;;- Don't use operand 1 for most machines.
        !          2169:   ""
        !          2170:   "*
        !          2171: {
        !          2172:   /* strip the MEM.  */
        !          2173:   operands[2] = XEXP (operands[2], 0);
        !          2174:   if (GET_CODE (operands[2]) == REG)
        !          2175:     return output_delayed_branch (\"calli %2\", operands, insn);
        !          2176:   return output_delayed_branch (\"call %2\", operands, insn);
        !          2177: }")
        !          2178: 
        !          2179: (define_expand "call_value"
        !          2180:   [(set (match_operand 0 "register_operand" "=rf")
        !          2181:        (call (match_operand:SI 1 "memory_operand" "m")
        !          2182:              (match_operand 2 "" "i")))]
        !          2183:   ;; operand 3 is next_arg_register
        !          2184:   ""
        !          2185:   "
        !          2186: {
        !          2187:   /* Make sure the address is just one reg and will stay that way.  */
        !          2188:   if (! call_insn_operand (operands[1], QImode))
        !          2189:     operands[1]
        !          2190:       = change_address (operands[1], VOIDmode,
        !          2191:                        copy_to_mode_reg (Pmode, XEXP (operands[1], 0)));
        !          2192:   if (INTVAL (operands[2]) > 0)
        !          2193:     {
        !          2194:       emit_move_insn (arg_pointer_rtx, stack_pointer_rtx);
        !          2195:       emit_insn (gen_rtx (USE, VOIDmode, arg_pointer_rtx));
        !          2196:     }
        !          2197: }")
        !          2198: 
        !          2199: (define_insn ""
        !          2200:   [(set (match_operand 0 "register_operand" "=rf")
        !          2201:        (call (match_operand:SI 1 "call_insn_operand" "m")
        !          2202:              (match_operand 2 "" "i")))]
        !          2203:   ;; operand 3 is next_arg_register
        !          2204:   ""
        !          2205:   "*
        !          2206: {
        !          2207:   /* strip the MEM.  */
        !          2208:   operands[1] = XEXP (operands[1], 0);
        !          2209:   CC_STATUS_INIT;
        !          2210:   if (GET_CODE (operands[1]) == REG)
        !          2211:     return \"calli %1\;nop\";
        !          2212:   return \"call %1\;nop\";
        !          2213: }")
        !          2214: 
        !          2215: (define_peephole
        !          2216:   [(set (match_operand:SI 0 "register_operand" "=rf")
        !          2217:        (match_operand:SI 1 "single_insn_src_p" "gfG"))
        !          2218:    (set (match_operand 2 "" "=rf")
        !          2219:        (call (match_operand:SI 3 "call_insn_operand" "m")
        !          2220:              (match_operand 4 "" "i")))]
        !          2221:   ;;- Don't use operand 4 for most machines.
        !          2222:   "! reg_mentioned_p (operands[0], operands[3])"
        !          2223:   "*
        !          2224: {
        !          2225:   /* strip the MEM.  */
        !          2226:   operands[3] = XEXP (operands[3], 0);
        !          2227:   if (GET_CODE (operands[3]) == REG)
        !          2228:     return output_delayed_branch (\"calli %3\", operands, insn);
        !          2229:   return output_delayed_branch (\"call %3\", operands, insn);
        !          2230: }")
        !          2231: 
        !          2232: (define_peephole
        !          2233:   [(set (match_operand:SI 0 "memory_operand" "=m")
        !          2234:        (match_operand:SI 1 "reg_or_0_operand" "rJf"))
        !          2235:    (set (match_operand 2 "" "=rf")
        !          2236:        (call (match_operand:SI 3 "call_insn_operand" "m")
        !          2237:              (match_operand 4 "" "i")))]
        !          2238:   ;;- Don't use operand 4 for most machines.
        !          2239:   ""
        !          2240:   "*
        !          2241: {
        !          2242:   /* strip the MEM.  */
        !          2243:   operands[3] = XEXP (operands[3], 0);
        !          2244:   if (GET_CODE (operands[3]) == REG)
        !          2245:     return output_delayed_branch (\"calli %3\", operands, insn);
        !          2246:   return output_delayed_branch (\"call %3\", operands, insn);
        !          2247: }")
        !          2248: 
        !          2249: ;; Call subroutine returning any type.
        !          2250: 
        !          2251: (define_expand "untyped_call"
        !          2252:   [(parallel [(call (match_operand 0 "" "")
        !          2253:                    (const_int 0))
        !          2254:              (match_operand 1 "" "")
        !          2255:              (match_operand 2 "" "")])]
        !          2256:   ""
        !          2257:   "
        !          2258: {
        !          2259:   int i;
        !          2260: 
        !          2261:   emit_call_insn (gen_call (operands[0], const0_rtx, NULL, const0_rtx));
        !          2262: 
        !          2263:   for (i = 0; i < XVECLEN (operands[2], 0); i++)
        !          2264:     {
        !          2265:       rtx set = XVECEXP (operands[2], 0, i);
        !          2266:       emit_move_insn (SET_DEST (set), SET_SRC (set));
        !          2267:     }
        !          2268: 
        !          2269:   /* The optimizer does not know that the call sets the function value
        !          2270:      registers we stored in the result block.  We avoid problems by
        !          2271:      claiming that all hard registers are used and clobbered at this
        !          2272:      point.  */
        !          2273:   emit_insn (gen_blockage ());
        !          2274: 
        !          2275:   DONE;
        !          2276: }")
        !          2277: 
        !          2278: ;; UNSPEC_VOLATILE is considered to use and clobber all hard registers and
        !          2279: ;; all of memory.  This blocks insns from being moved across this point.
        !          2280: 
        !          2281: (define_insn "blockage"
        !          2282:   [(unspec_volatile [(const_int 0)] 0)]
        !          2283:   ""
        !          2284:   "")
        !          2285: 
        !          2286: (define_insn "nop"
        !          2287:   [(const_int 0)]
        !          2288:   ""
        !          2289:   "nop")
        !          2290: 
        !          2291: (define_insn "indirect_jump"
        !          2292:   [(set (pc) (match_operand:SI 0 "register_operand" "r"))]
        !          2293:   ""
        !          2294:   "bri %0")
        !          2295: 
        !          2296: ;;
        !          2297: ;; A special insn that does the work to get setup just
        !          2298: ;; before a table jump.
        !          2299: ;;
        !          2300: (define_insn ""
        !          2301:   [(set (match_operand:SI 0 "register_operand" "=r")
        !          2302:        (mem:SI (plus:SI (match_operand:SI 1 "register_operand" "r")
        !          2303:                         (label_ref (match_operand 2 "" "")))))]
        !          2304:   ""
        !          2305:   "*
        !          2306: {
        !          2307:   CC_STATUS_INIT;
        !          2308:   return \"orh %H2,%?r0,%?r31\;or %L2,%?r31,%?r31\;ld.l %?r31(%1),%0\";
        !          2309: }")
        !          2310:   
        !          2311: (define_peephole
        !          2312:   [(set (match_operand:SI 0 "register_operand" "=rf")
        !          2313:        (match_operand:SI 1 "single_insn_src_p" "gfG"))
        !          2314:    (set (pc) (match_operand:SI 2 "register_operand" "r"))
        !          2315:    (use (label_ref (match_operand 3 "" "")))]
        !          2316:   "REGNO (operands[0]) != REGNO (operands[2])"
        !          2317:   "* return output_delayed_branch (\"bri %2\", operands, insn);")

unix.superglobalmegacorp.com

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