Annotation of gcc/config/sparc.md, revision 1.1

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

unix.superglobalmegacorp.com

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