Annotation of GNUtools/cc/config/a29k/a29k.md, revision 1.1.1.1

1.1       root        1: ;;- Machine description for AMD Am29000 for GNU C compiler
                      2: ;;   Copyright (C) 1991, 1992 Free Software Foundation, Inc.
                      3: ;;   Contributed by Richard Kenner ([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 2, 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: ;;- See file "rtl.def" for documentation on define_insn, match_*, et. al.
                     22: 
                     23: ;; The insns in this file are presented in the same order as the AMD 29000
                     24: ;; User's Manual (i.e., alphabetical by machine op-code).
                     25: ;;
                     26: ;; DEFINE_EXPAND's are located near the first occurrence of the major insn
                     27: ;; that they generate.
                     28: 
                     29: ;; The only attribute we have is the type.  We only care about calls, branches,
                     30: ;; loads, stores, floating-point operations, and multi-word insns.
                     31: ;; Everything else is miscellaneous.
                     32: 
                     33: (define_attr "type"
                     34:   "call,branch,load,store,fadd,fmul,fam,fdiv,fsqrt,dmul,dam,ddiv,dsqrt,multi,misc"
                     35:   (const_string "misc"))
                     36: 
                     37: ;; ASM insns cannot go into a delay slot, so call them "multi".
                     38: (define_asm_attributes [(set_attr "type" "multi")])
                     39: 
                     40: (define_attr "in_delay_slot" "yes,no"
                     41:   (if_then_else (eq_attr "type" "call,branch,multi")  (const_string "no")
                     42:                (const_string "yes")))
                     43: 
                     44: ;; Branch and call insns require a single delay slot.  Annulling is not
                     45: ;; supported.
                     46: (define_delay (eq_attr "type" "call,branch")
                     47:   [(eq_attr "in_delay_slot" "yes") (nil) (nil)])
                     48: 
                     49: ;; Define the function unit usages.  We first define memory as a unit.
                     50: (define_function_unit "memory" 1 0 (eq_attr "type" "load") 6 5
                     51:   [(eq_attr "type" "load")])
                     52: (define_function_unit "memory" 1 0 (eq_attr "type" "load") 6 6
                     53:   [(eq_attr "type" "store")])
                     54: (define_function_unit "memory" 1 0 (eq_attr "type" "store") 1 0)
                     55: 
                     56: ;; Now define the function units for the floating-point support.  Most
                     57: ;; units are pipelined and can accept an input every cycle.
                     58: ;;
                     59: ;; Note that we have an inaccuracy here.  If a fmac insn is issued, followed
                     60: ;; 2 cycles later by a fadd, there will be a conflict for the floating
                     61: ;; adder that we can't represent.  Also, all insns will conflict for the
                     62: ;; floating-point rounder.  It isn't clear how to represent this.
                     63: 
                     64: (define_function_unit "multiplier" 1 0 (eq_attr "type" "fmul") 3 0)
                     65: (define_function_unit "multiplier" 1 0 (eq_attr "type" "dmul") 6 4)
                     66: (define_function_unit "multiplier" 1 0 (eq_attr "type" "fam") 6 0)
                     67: (define_function_unit "multiplier" 1 0 (eq_attr "type" "dam") 9 4)
                     68: 
                     69: (define_function_unit "adder" 1 0 (eq_attr "type" "fadd,fam,dam") 3 0)
                     70: 
                     71: (define_function_unit "divider" 1 0 (eq_attr "type" "fdiv") 11 10)
                     72: (define_function_unit "divider" 1 0 (eq_attr "type" "fsqrt") 28 27)
                     73: (define_function_unit "divider" 1 0 (eq_attr "type" "ddiv") 18 17)
                     74: (define_function_unit "divider" 1 0 (eq_attr "type" "dsqrt") 57 56)
                     75: 
                     76: ;; ADD
                     77: (define_insn "addsi3"
                     78:   [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
                     79:        (plus:SI (match_operand:SI 1 "gpc_reg_operand" "%r,r")
                     80:                 (match_operand:SI 2 "add_operand" "rI,N")))]
                     81:   ""
                     82:   "@
                     83:    add %0,%1,%2
                     84:    sub %0,%1,%n2")
                     85: 
                     86: (define_insn "adddi3"
                     87:   [(set (match_operand:DI 0 "gpc_reg_operand" "=r")
                     88:        (plus:DI (match_operand:DI 1 "gpc_reg_operand" "%r")
                     89:                 (match_operand:DI 2 "gpc_reg_operand" "r")))]
                     90:   ""
                     91:   "add %L0,%L1,%L2\;addc %0,%1,%2"
                     92:   [(set_attr "type" "multi")])
                     93: 
                     94: ;; AND/ANDN
                     95: (define_insn "andsi3"
                     96:   [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
                     97:        (and:SI (match_operand:SI 1 "gpc_reg_operand" "%r,r")
                     98:                (match_operand:SI 2 "and_operand" "rI,K")))]
                     99:   ""
                    100:   "@
                    101:    and %0,%1,%2
                    102:    andn %0,%1,%C2")
                    103: 
                    104: (define_insn ""
                    105:   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
                    106:        (and:SI (not:SI (match_operand:SI 1 "srcb_operand" "rI"))
                    107:                (match_operand:SI 2 "gpc_reg_operand" "r")))]
                    108:   ""
                    109:   "andn %0,%2,%1")
                    110: 
                    111: 
                    112: ;; CALLI
                    113: ;;
                    114: ;; Start with a subroutine to write out CLOBBERs starting at lr2 up to,
                    115: ;; but not including, the next parameter register.  If operand[0] is null,
                    116: ;; it means that all the argument registers have been used.
                    117: (define_expand "clobbers_to"
                    118:   [(clobber (match_operand:SI 0 "" ""))]
                    119:   ""
                    120:   "
                    121: {
                    122:   int i;
                    123:   int high_regno;
                    124: 
                    125:   if (operands[0] == 0)
                    126:     high_regno = R_LR (18);
                    127:   else if (GET_CODE (operands[0]) != REG || REGNO (operands[0]) < R_LR (0)
                    128:           || REGNO (operands[0]) > R_LR (18))
                    129:     abort ();
                    130:   else
                    131:     high_regno = REGNO (operands[0]);
                    132: 
                    133:   for (i = R_LR (2); i < high_regno; i++)
                    134:     emit_insn (gen_rtx (CLOBBER, VOIDmode, gen_rtx (REG, SImode, i)));
                    135: 
                    136:   DONE;
                    137: }")
                    138: 
                    139: ;; We indicate that LR0 is clobbered in the CALL_INSN itself.  Otherwise,
                    140: ;; reorg will think it is just clobbered by the called function.
                    141: 
                    142: (define_expand "call"
                    143:   [(parallel [(call (match_operand:SI 0 "" "")
                    144:                    (match_operand 1 "" ""))
                    145:              (clobber (scratch:SI))])
                    146:    (match_operand 2 "" "")]
                    147:   ""
                    148:   "
                    149: {
                    150:   if (GET_CODE (operands[0]) != MEM)
                    151:     abort ();
                    152: 
                    153:   /* We tell here whether this is a recursive call, since this insn may
                    154:      later be inlined into another function.  */
                    155:   if (! TARGET_SMALL_MEMORY
                    156:       && GET_CODE (XEXP (operands[0], 0)) == SYMBOL_REF)
                    157:     operands[0] = gen_rtx (MEM, SImode,
                    158:                           force_reg (Pmode, XEXP (operands[0], 0)));
                    159: 
                    160:   operands[2] = gen_clobbers_to (operands[2]);
                    161: }")
                    162:  
                    163: (define_expand "call_value"
                    164:   [(parallel [(set (match_operand:SI 0 "gpc_reg_operand" "")
                    165:                   (call (match_operand:SI 1 "" "")
                    166:                         (match_operand 2 "" "")))
                    167:                   (clobber (scratch:SI))])
                    168:    (match_operand 3 "" "")]
                    169:   ""
                    170:   "
                    171: {
                    172:   if (GET_CODE (operands[1]) != MEM)
                    173:     abort ();
                    174: 
                    175:   /* We tell here whether this is a recursive call, since this insn may
                    176:      later be inlined into another function.  */
                    177:   if (! TARGET_SMALL_MEMORY
                    178:       && GET_CODE (XEXP (operands[1], 0)) == SYMBOL_REF)
                    179:     operands[1] = gen_rtx (MEM, SImode,
                    180:                           force_reg (Pmode, XEXP (operands[1], 0)));
                    181: 
                    182:   operands[3] = gen_clobbers_to (operands[3]);
                    183: }")
                    184:  
                    185: (define_insn ""
                    186:   [(call (match_operand:SI 0 "memory_operand" "m")
                    187:         (match_operand 1 "" ""))
                    188:    (clobber (match_scratch:SI 2 "=&l"))]
                    189:   "GET_CODE (XEXP (operands[0], 0)) != CONST_INT"
                    190:   "calli lr0,%0%#"
                    191:   [(set_attr "type" "call")])
                    192: 
                    193: (define_insn ""
                    194:   [(call (mem:SI (match_operand:SI 0 "call_operand" "i"))
                    195:         (match_operand:SI 1 "general_operand" "g"))
                    196:    (clobber (match_scratch:SI 2 "=&l"))]
                    197:   ""
                    198:   "call lr0,%F0"
                    199:   [(set_attr "type" "call")])
                    200: 
                    201: (define_insn ""
                    202:   [(set (match_operand 0 "gpc_reg_operand" "=r")
                    203:        (call (match_operand:SI 1 "memory_operand" "m")
                    204:              (match_operand 2 "" "")))
                    205:    (clobber (match_scratch:SI 3 "=&l"))]
                    206:   "GET_CODE (XEXP (operands[1], 0)) != CONST_INT"
                    207:   "calli lr0,%1%#"
                    208:   [(set_attr "type" "call")])
                    209: 
                    210: (define_insn ""
                    211:   [(set (match_operand 0 "gpc_reg_operand" "=r")
                    212:        (call (mem:SI (match_operand:SI 1 "call_operand" "i"))
                    213:              (match_operand:SI 2 "general_operand" "g")))
                    214:    (clobber (match_scratch:SI 3 "=&l"))]
                    215:   ""
                    216:   "call lr0,%F1"
                    217:   [(set_attr "type" "call")])
                    218: 
                    219: (define_expand "probe"
                    220:   [(call (mem:SI (symbol_ref:SI "_msp_check"))
                    221:         (const_int 1))]
                    222:   "TARGET_STACK_CHECK"
                    223:   "")
                    224: 
                    225: ;; This is used for internal routine calls via TPC.  Currently used only
                    226: ;; in probe, above.
                    227: (define_insn ""
                    228:   [(call (mem:SI (match_operand:SI 0 "immediate_operand" "s"))
                    229:         (const_int 1))]
                    230:   ""
                    231:   "call %*,%0"
                    232:   [(set_attr "type" "call")])
                    233: 
                    234: ;; CONST, CONSTH, CONSTN
                    235: ;;
                    236: ;; Many of these are generated from move insns.
                    237: (define_insn ""
                    238:   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
                    239:        (and:SI (match_operand:SI 1 "immediate_operand" "i")
                    240:                (const_int 65535)))]
                    241:   ""
                    242:   "const %0,%1")
                    243: 
                    244: (define_insn ""
                    245:   [(set (zero_extract:SI (match_operand:SI 0 "gpc_reg_operand" "+r")
                    246:                         (const_int 16)
                    247:                         (match_operand:SI 1 "const_0_operand" ""))
                    248:        (ashiftrt:SI (match_operand:SI 2 "immediate_operand" "i")
                    249:                     (const_int 16)))]
                    250:   ""
                    251:   "consth %0,%2")
                    252: 
                    253: (define_insn ""
                    254:   [(set (zero_extract:SI (match_operand:SI 0 "gpc_reg_operand" "+r")
                    255:                         (const_int 16)
                    256:                         (match_operand:SI 1 "const_0_operand" ""))
                    257:        (match_operand:SI 2 "cint_16_operand" "J"))]
                    258:   ""
                    259:   "consth %0,%m2")
                    260: 
                    261: (define_insn ""
                    262:   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
                    263:        (ior:SI (zero_extend:SI (match_operand:HI 1 "gpc_reg_operand" "0"))
                    264:                (match_operand:SI 2 "const_int_operand" "n")))]
                    265:   "(INTVAL (operands[2]) & 0xffff) == 0"
                    266:   "consth %0,%2")
                    267: 
                    268: (define_insn ""
                    269:   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
                    270:        (ior:SI (zero_extend:SI (match_operand:HI 1 "gpc_reg_operand" "0"))
                    271:                (and:SI (match_operand:SI 2 "immediate_operand" "i")
                    272:                        (const_int -65536))))]
                    273:   ""
                    274:   "consth %0,%2")
                    275: 
                    276: ;; CONVERT
                    277: (define_insn "fix_truncsfsi2"
                    278:   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
                    279:        (fix:SI (match_operand:SF 1 "register_operand" "r")))]
                    280:   ""
                    281:   "convert %0,%1,0,3,0,1")
                    282: 
                    283: (define_insn "fix_truncdfsi2"
                    284:   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
                    285:        (fix:SI (match_operand:DF 1 "register_operand" "r")))]
                    286:   ""
                    287:   "convert %0,%1,0,3,0,2")
                    288: 
                    289: (define_insn "fixuns_truncsfsi2"
                    290:   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
                    291:        (unsigned_fix:SI (match_operand:SF 1 "register_operand" "r")))]
                    292:   ""
                    293:   "convert %0,%1,1,3,0,1")
                    294: 
                    295: (define_insn "fixuns_truncdfsi2"
                    296:   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
                    297:        (unsigned_fix:SI (match_operand:DF 1 "register_operand" "r")))]
                    298:   ""
                    299:   "convert %0,%1,1,3,0,2")
                    300: 
                    301: (define_insn "truncdfsf2"
                    302:   [(set (match_operand:SF 0 "register_operand" "=r")
                    303:        (float_truncate:SF (match_operand:DF 1 "register_operand" "r")))]
                    304:   ""
                    305:   "convert %0,%1,0,4,1,2")
                    306: 
                    307: (define_insn "extendsfdf2"
                    308:   [(set (match_operand:DF 0 "register_operand" "=r")
                    309:        (float_extend:DF (match_operand:SF 1 "register_operand" "r")))]
                    310:   ""
                    311:   "convert %0,%1,0,4,2,1")
                    312: 
                    313: (define_insn "floatsisf2"
                    314:   [(set (match_operand:SF 0 "register_operand" "=r")
                    315:        (float:SF (match_operand:SI 1 "gpc_reg_operand" "r")))]
                    316:   ""
                    317:   "convert %0,%1,0,4,1,0")
                    318: 
                    319: (define_insn "floatsidf2"
                    320:   [(set (match_operand:DF 0 "register_operand" "=r")
                    321:        (float:DF (match_operand:SI 1 "gpc_reg_operand" "r")))]
                    322:   ""
                    323:   "convert %0,%1,0,4,2,0")
                    324: 
                    325: (define_insn "floatunssisf2"
                    326:   [(set (match_operand:SF 0 "register_operand" "=r")
                    327:        (unsigned_float:SF (match_operand:SI 1 "gpc_reg_operand" "r")))]
                    328:   ""
                    329:   "convert %0,%1,1,4,1,0")
                    330: 
                    331: (define_insn "floatunssidf2"
                    332:   [(set (match_operand:DF 0 "register_operand" "=r")
                    333:        (unsigned_float:DF (match_operand:SI 1 "gpc_reg_operand" "r")))]
                    334:   ""
                    335:   "convert %0,%1,1,4,2,0")
                    336: 
                    337: ;; CPxxx, DEQ, DGT, DGE, FEQ, FGT, FGE
                    338: (define_insn ""
                    339:   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
                    340:        (match_operator 3 "comparison_operator"
                    341:                        [(match_operand:SI 1 "gpc_reg_operand" "r")
                    342:                         (match_operand:SI 2 "srcb_operand" "rI")]))]
                    343:   ""
                    344:   "cp%J3 %0,%1,%2")
                    345: 
                    346: (define_insn ""
                    347:   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
                    348:        (match_operator 3 "fp_comparison_operator"
                    349:                        [(match_operand:SF 1 "register_operand" "r")
                    350:                         (match_operand:SF 2 "register_operand" "r")]))]
                    351:   ""
                    352:   "f%J3 %0,%1,%2"
                    353:   [(set_attr "type" "fadd")])
                    354: 
                    355: (define_insn ""
                    356:   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
                    357:        (match_operator 3 "fp_comparison_operator"
                    358:                        [(match_operand:DF 1 "register_operand" "r")
                    359:                         (match_operand:DF 2 "register_operand" "r")]))]
                    360:   ""
                    361:   "d%J3 %0,%1,%2"
                    362:   [(set_attr "type" "fadd")])
                    363: 
                    364: ;; DADD
                    365: (define_expand "adddf3"
                    366:   [(set (match_operand:DF 0 "register_operand" "")
                    367:        (plus:DF (match_operand:DF 1 "register_operand" "")
                    368:                 (match_operand:DF 2 "register_operand" "")))]
                    369:   ""
                    370:   "")
                    371: 
                    372: (define_insn ""
                    373:   [(set (match_operand:DF 0 "register_operand" "=r")
                    374:        (plus:DF (match_operand:DF 1 "register_operand" "%r")
                    375:                 (match_operand:DF 2 "register_operand" "r")))]
                    376:   "! TARGET_29050 "
                    377:   "dadd %0,%1,%2"
                    378:   [(set_attr "type" "fadd")])
                    379: 
                    380: (define_insn ""
                    381:   [(set (match_operand:DF 0 "register_operand" "=r,a")
                    382:        (plus:DF (match_operand:DF 1 "register_operand" "%r,r")
                    383:                 (match_operand:DF 2 "register_operand" "r,0")))]
                    384:   "TARGET_29050"
                    385:   "@
                    386:    dadd %0,%1,%2
                    387:    dmac 8,%0,%1,%1"
                    388:   [(set_attr "type" "fadd,dam")])
                    389: 
                    390: ;; DDIV
                    391: (define_insn "divdf3"
                    392:   [(set (match_operand:DF 0 "register_operand" "=r")
                    393:        (div:DF (match_operand:DF 1 "register_operand" "=r")
                    394:                (match_operand:DF 2 "register_operand" "r")))]
                    395:   ""
                    396:   "ddiv %0,%1,%2"
                    397:   [(set_attr "type" "ddiv")])
                    398: 
                    399: ;; DIVIDE
                    400: ;;
                    401: ;; We must set Q to the sign extension of the dividend first.  For MOD, we
                    402: ;; must get the remainder from Q.
                    403: ;;
                    404: ;; For divmod: operand 1 is divided by operand 2; quotient goes to operand
                    405: ;; 0 and remainder to operand 3.
                    406: (define_expand "divmodsi4"
                    407:   [(set (match_dup 4)
                    408:        (ashiftrt:SI (match_operand:SI 1 "gpc_reg_operand" "")
                    409:                     (const_int 31)))
                    410:    (parallel [(set (match_operand:SI 0 "gpc_reg_operand" "")
                    411:                   (div:SI (match_dup 1)
                    412:                           (match_operand:SI 2 "gpc_reg_operand" "")))
                    413:              (set (match_operand:SI 3 "gpc_reg_operand" "")
                    414:                   (mod:SI (match_dup 1)
                    415:                           (match_dup 2)))
                    416:              (use (match_dup 4))])]
                    417:   ""
                    418:   "
                    419: {
                    420:   operands[4] = gen_reg_rtx (SImode);
                    421: }")
                    422: 
                    423: (define_insn ""
                    424:   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
                    425:        (div:SI (match_operand:SI 1 "gpc_reg_operand" "r")
                    426:                (match_operand:SI 2 "gpc_reg_operand" "r")))
                    427:    (set (match_operand:SI 3 "register_operand" "=q")
                    428:        (mod:SI (match_dup 1)
                    429:                (match_dup 2)))
                    430:    (use (match_operand:SI 4 "register_operand" "3"))]
                    431:   ""
                    432:   "divide %0,%1,%2")
                    433: 
                    434: ;; DIVIDU
                    435: ;;
                    436: ;; Similar to DIVIDE.
                    437: (define_expand "udivmodsi4"
                    438:   [(parallel [(set (match_operand:SI 0 "gpc_reg_operand" "")
                    439:                   (udiv:SI (match_operand:SI 1 "gpc_reg_operand" "")
                    440:                            (match_operand:SI 2 "gpc_reg_operand" "")))
                    441:              (set (match_operand:SI 3 "gpc_reg_operand" "")
                    442:                   (umod:SI (match_dup 1)
                    443:                            (match_dup 2)))
                    444:              (use (const_int 0))])]
                    445:   ""
                    446:   "")
                    447: 
                    448: (define_insn ""
                    449:   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
                    450:        (udiv:SI (match_operand:SI 1 "gpc_reg_operand" "r")
                    451:                 (match_operand:SI 2 "gpc_reg_operand" "r")))
                    452:    (set (match_operand:SI 3 "register_operand" "=q")
                    453:        (umod:SI (match_dup 1)
                    454:                 (match_dup 2)))
                    455:    (use (match_operand:SI 4 "const_int_operand" "3"))]
                    456:   ""
                    457:   "dividu %0,%1,%2")
                    458: 
                    459: ;; DMAC/DMSM
                    460: (define_insn ""
                    461:   [(set (match_operand:DF 0 "register_operand" "=a,*r")
                    462:        (plus:DF (mult:DF (match_operand:DF 1 "register_operand" "%r,A")
                    463:                          (match_operand:DF 2 "register_operand" "r,r"))
                    464:                 (match_operand:DF 3 "register_operand" "0,*r")))]
                    465:   "TARGET_29050"
                    466:   "@
                    467:    dmac 0,%0,%1,%2
                    468:    dmsm %0,%2,%3"
                    469:   [(set_attr "type" "dam")])
                    470: 
                    471: (define_insn ""
                    472:   [(set (match_operand:DF 0 "register_operand" "=a")
                    473:        (plus:DF (mult:DF (neg:DF (match_operand:DF 1 "register_operand" "r"))
                    474:                          (match_operand:DF 2 "register_operand" "r"))
                    475:                 (match_operand:DF 3 "register_operand" "0")))]
                    476:   "TARGET_29050"
                    477:   "dmac 1,%0,%2,%1"
                    478:   [(set_attr "type" "dam")])
                    479: 
                    480: (define_insn ""
                    481:   [(set (match_operand:DF 0 "register_operand" "=a")
                    482:        (minus:DF (mult:DF (match_operand:DF 1 "register_operand" "%r")
                    483:                           (match_operand:DF 2 "register_operand" "r"))
                    484:                  (match_operand:DF 3 "register_operand" "0")))]
                    485:   "TARGET_29050"
                    486:   "dmac 2,%0,%1,%2"
                    487:   [(set_attr "type" "dam")])
                    488: 
                    489: (define_insn ""
                    490:   [(set (match_operand:DF 0 "register_operand" "=a")
                    491:        (minus:DF (mult:DF (match_operand:DF 1 "register_operand" "r")
                    492:                           (neg:DF (match_operand:DF 2 "register_operand" "r")))
                    493:                  (match_operand:DF 3 "register_operand" "0")))]
                    494:   "TARGET_29050"
                    495:   "dmac 3,%0,%1,%2"
                    496:   [(set_attr "type" "dam")])
                    497: 
                    498: (define_insn ""
                    499:   [(set (match_operand:DF 0 "register_operand" "=a")
                    500:        (mult:DF (neg:DF (match_operand:DF 1 "register_operand" "r"))
                    501:                 (match_operand:DF 2 "register_operand" "r")))]
                    502:   "TARGET_29050"
                    503:   "dmac 5,%0,%2,%1"
                    504:   [(set_attr "type" "dam")])
                    505: 
                    506: (define_insn ""
                    507:   [(set (match_operand:DF 0 "register_operand" "=a")
                    508:        (minus:DF (neg:DF (match_operand:DF 1 "register_operand" "r"))
                    509:                  (match_operand:DF 2 "register_operand" "0")))]
                    510:   "TARGET_29050"
                    511:   "dmac 11,%0,%1,%1"
                    512:   [(set_attr "type" "dam")])
                    513: 
                    514: (define_insn ""
                    515:   [(set (match_operand:DF 0 "register_operand" "=a")
                    516:        (neg:DF (plus:DF (match_operand:DF 1 "register_operand" "%r")
                    517:                         (match_operand:DF 2 "register_operand" "0"))))]
                    518:   "TARGET_29050"
                    519:   "dmac 11,%0,%1,%1"
                    520:   [(set_attr "type" "dam")])
                    521: 
                    522: (define_insn ""
                    523:  [(set (match_operand:DF 0 "register_operand" "=r,r,a")
                    524:        (neg:DF (match_operand:DF 1 "register_operand" "0,r,r")))
                    525:   (clobber (match_scratch:SI 2 "=&r,&r,X"))]
                    526:  "TARGET_29050"
                    527:  "@
                    528:   cpeq %2,gr1,gr1\;xor %0,%1,%2
                    529:   cpeq %2,gr1,gr1\;xor %0,%1,%2\;sll %L0,%L1,0
                    530:   dmac 13,%0,%1,%1"
                    531:  [(set_attr "type" "multi,multi,dam")])
                    532: 
                    533: ;; DMUL
                    534: (define_expand "muldf3"
                    535:   [(set (match_operand:DF 0 "register_operand" "")
                    536:        (mult:DF (match_operand:DF 1 "register_operand" "")
                    537:                 (match_operand:DF 2 "register_operand" "")))]
                    538:   ""
                    539:   "")
                    540: 
                    541: (define_insn ""
                    542:   [(set (match_operand:DF 0 "register_operand" "=r")
                    543:        (mult:DF (match_operand:DF 1 "register_operand" "%r")
                    544:                 (match_operand:DF 2 "register_operand" "r")))]
                    545:   "! TARGET_29050"
                    546:   "dmul %0,%1,%2"
                    547:   [(set_attr "type" "dmul")])
                    548: 
                    549: (define_insn ""
                    550:   [(set (match_operand:DF 0 "register_operand" "=r,a")
                    551:        (mult:DF (match_operand:DF 1 "register_operand" "%r,r")
                    552:                 (match_operand:DF 2 "register_operand" "r,r")))]
                    553:   "TARGET_29050"
                    554:   "@
                    555:    dmul %0,%1,%2
                    556:    dmac 4,%0,%1,%2"
                    557:   [(set_attr "type" "dmul,dam")])
                    558: 
                    559: ;; DSUB
                    560: (define_expand "subdf3"
                    561:   [(set (match_operand:DF 0 "register_operand" "=r")
                    562:        (minus:DF (match_operand:DF 1 "register_operand" "r")
                    563:                  (match_operand:DF 2 "register_operand" "r")))]
                    564:   ""
                    565:   "")
                    566: 
                    567: (define_insn ""
                    568:   [(set (match_operand:DF 0 "register_operand" "=r")
                    569:        (minus:DF (match_operand:DF 1 "register_operand" "r")
                    570:                  (match_operand:DF 2 "register_operand" "r")))]
                    571:   "! TARGET_29050"
                    572:   "dsub %0,%1,%2"
                    573:   [(set_attr "type" "fadd")])
                    574: 
                    575: (define_insn ""
                    576:   [(set (match_operand:DF 0 "register_operand" "=r,a,a")
                    577:        (minus:DF (match_operand:DF 1 "register_operand" "r,0,r")
                    578:                  (match_operand:DF 2 "register_operand" "r,r,0")))]
                    579:   "TARGET_29050"
                    580:   "@
                    581:    dsub %0,%1,%2
                    582:    dmac 9,%0,%2,%2
                    583:    dmac 10,%0,%1,%1"
                    584:   [(set_attr "type" "fadd,dam,dam")])
                    585: 
                    586: ;; EXBYTE
                    587: (define_insn ""
                    588:   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
                    589:        (ior:SI (and:SI (match_operand:SI 1 "srcb_operand" "rI")
                    590:                        (const_int -256))
                    591:                (zero_extract:SI (match_operand:SI 2 "gpc_reg_operand" "r")
                    592:                                 (const_int 8)
                    593:                                 (ashift:PSI
                    594:                                  (match_operand:PSI 3 "register_operand" "b")
                    595:                                  (const_int 3)))))]
                    596:   ""
                    597:   "exbyte %0,%2,%1")
                    598: 
                    599: (define_insn ""
                    600:   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
                    601:        (zero_extract:SI (match_operand:SI 1 "gpc_reg_operand" "r")
                    602:                         (const_int 8)
                    603:                         (ashift:PSI
                    604:                          (match_operand:PSI 2 "register_operand" "b")
                    605:                          (const_int 3))))]
                    606:   ""
                    607:   "exbyte %0,%1,0")
                    608: 
                    609: (define_insn ""
                    610:   [(set (zero_extract:SI (match_operand:SI 0 "gpc_reg_operand" "+r")
                    611:                         (const_int 8)
                    612:                         (match_operand:PSI 1 "const_24_operand" ""))
                    613:        (zero_extract:SI (match_operand:SI 2 "gpc_reg_operand" "r")
                    614:                         (const_int 8)
                    615:                         (ashift:PSI
                    616:                          (match_operand:PSI 3 "register_operand" "b")
                    617:                          (const_int 3))))]
                    618:   ""
                    619:   "exbyte %0,%2,%0")
                    620: 
                    621: (define_expand "extzv"
                    622:   [(set (match_operand:SI 0 "gpc_reg_operand" "")
                    623:        (zero_extract:SI (match_operand:SI 1 "gpc_reg_operand" "")
                    624:                         (match_operand:SI 2 "general_operand" "")
                    625:                         (match_operand:SI 3 "general_operand" "")))]
                    626:   ""
                    627:   "
                    628: {
                    629:   int size, pos;
                    630: 
                    631:   if (GET_CODE (operands[2]) != CONST_INT
                    632:       || GET_CODE (operands[3]) != CONST_INT)
                    633:     FAIL;
                    634: 
                    635:   size = INTVAL (operands[2]);
                    636:   pos = INTVAL (operands[3]);
                    637: 
                    638:   /* Can't do this unless a byte extraction.  If extracting the high
                    639:      or low byte, don't do this because a shift or AND is shorter.
                    640:      Don't do 16-bit extracts, since the only two are the high and low
                    641:      ends, and it is faster to do them with CONSTH and SRL.  */
                    642: 
                    643:   if (size != 8 || (pos != 8 && pos != 16))
                    644:     FAIL;
                    645: 
                    646:   operands[3] = gen_rtx (ASHIFT, PSImode,
                    647:                         force_reg (PSImode, GEN_INT (pos / 8)),
                    648:                         GEN_INT (3));
                    649: 
                    650: }")
                    651: 
                    652: ;; EXHW
                    653: (define_insn ""
                    654:   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
                    655:        (ior:SI (and:SI (match_operand:SI 1 "srcb_operand" "rI")
                    656:                (const_int -65536))
                    657:                (zero_extract:SI (match_operand:SI 2 "gpc_reg_operand" "r")
                    658:                                 (const_int 16)
                    659:                                 (ashift:PSI
                    660:                                  (match_operand:PSI 3 "register_operand" "b")
                    661:                                  (const_int 3)))))]
                    662:   ""
                    663:   "exhw %0,%2,%1")
                    664: 
                    665: (define_insn ""
                    666:   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
                    667:        (zero_extract:SI (match_operand:SI 1 "gpc_reg_operand" "r")
                    668:                         (const_int 16)
                    669:                         (ashift:PSI
                    670:                          (match_operand:PSI 2 "register_operand" "b")
                    671:                          (const_int 3))))]
                    672:   ""
                    673:   "exhw %0,%1,0")
                    674: 
                    675: (define_insn ""
                    676:   [(set (zero_extract:SI (match_operand:SI 0 "gpc_reg_operand" "+r")
                    677:                         (const_int 16)
                    678:                         (match_operand:PSI 1 "const_16_operand" ""))
                    679:        (zero_extract:SI (match_operand:SI 2 "gpc_reg_operand" "r")
                    680:                         (const_int 16)
                    681:                         (ashift:PSI
                    682:                          (match_operand:PSI 3 "register_operand" "b")
                    683:                          (const_int 3))))]
                    684:   ""
                    685:   "exhw %0,%2,%0")
                    686: 
                    687: ;; EXHWS
                    688: ;;
                    689: ;; This is probably unused.  The high-order 16-bits are obtained with an SRA
                    690: ;; insn.  The low-order 16 bits are a sign-extend, which is a pair of
                    691: ;; shifts.  Setting BP followed by the insn is equivalent, so we don't
                    692: ;; bother going to any trouble to generate this insn.
                    693: 
                    694: (define_insn ""
                    695:   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
                    696:        (sign_extract:SI (match_operand:SI 1 "gpc_reg_operand" "r")
                    697:                         (const_int 16)
                    698:                         (ashift:PSI
                    699:                          (match_operand:PSI 2 "register_operand" "b")
                    700:                          (const_int 3))))]
                    701:   ""
                    702:   "exhws %0,%1")
                    703: 
                    704: ;; EXTRACT
                    705: (define_insn ""
                    706:   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
                    707:        (rotate:SI (match_operand:SI 1 "gpc_reg_operand" "r")
                    708:                   (match_operand:PSI 2 "register_operand" "f")))]
                    709:   ""
                    710:   "extract %0,%1,%1")
                    711: 
                    712: (define_expand "rotlsi3"
                    713:   [(set (match_dup 3)
                    714:        (match_operand:SI 2 "gpc_reg_or_immediate_operand" ""))
                    715:    (set (match_operand:SI 0 "gpc_reg_operand" "")
                    716:        (rotate:SI (match_operand:SI 1 "gpc_reg_operand" "")
                    717:                   (match_dup 3)))]
                    718:   ""
                    719:   "
                    720: { operands[2] = gen_lowpart (PSImode, operands[2]);
                    721:   operands[3] = gen_reg_rtx (PSImode);
                    722: }")
                    723: 
                    724: ;; It would be nice to be able to have a define_split corresponding to the
                    725: ;; above, but there is no way to tell combine we need a PSImode temporary.
                    726: ;; If we put a (clobber (scratch:PSI)) there, combine would merge the above
                    727: ;; two insns.  This is bad because it then thinks only one insn is needed.
                    728: 
                    729: ;; FADD
                    730: (define_expand "addsf3"
                    731:   [(set (match_operand:SF 0 "register_operand" "")
                    732:        (plus:SF (match_operand:SF 1 "register_operand" "")
                    733:                 (match_operand:SF 2 "register_operand" "")))]
                    734:   ""
                    735:   "")
                    736: 
                    737: (define_insn ""
                    738:   [(set (match_operand:SF 0 "register_operand" "=r")
                    739:        (plus:SF (match_operand:SF 1 "register_operand" "%r")
                    740:                 (match_operand:SF 2 "register_operand" "r")))]
                    741:   "! TARGET_29050"
                    742:   "fadd %0,%1,%2"
                    743:   [(set_attr "type" "fadd")])
                    744: 
                    745: (define_insn ""
                    746:   [(set (match_operand:SF 0 "register_operand" "=r,a")
                    747:        (plus:SF (match_operand:SF 1 "register_operand" "%r,r")
                    748:                 (match_operand:SF 2 "register_operand" "r,0")))]
                    749:   "TARGET_29050"
                    750:   "@
                    751:    fadd %0,%1,%2
                    752:    fmac 8,%0,%1,%1"
                    753:   [(set_attr "type" "fadd,fam")])
                    754: 
                    755: ;; FDIV
                    756: (define_insn "divsf3"
                    757:   [(set (match_operand:SF 0 "register_operand" "=r")
                    758:        (div:SF (match_operand:SF 1 "register_operand" "=r")
                    759:                (match_operand:SF 2 "register_operand" "r")))]
                    760:   ""
                    761:   "fdiv %0,%1,%2"
                    762:   [(set_attr "type" "fdiv")])
                    763: 
                    764: ;; FDMUL
                    765: (define_insn ""
                    766:   [(set (match_operand:DF 0 "register_operand" "=r")
                    767:        (mult:DF (float_extend:DF (match_operand:SF 1 "register_operand" "%r"))
                    768:                 (float_extend:DF (match_operand:SF 2 "register_operand" "r"))))]
                    769:   ""
                    770:   "fdmul %0,%1,%2")
                    771: 
                    772: ;; FMAC/FMSM
                    773: (define_insn ""
                    774:   [(set (match_operand:SF 0 "register_operand" "=a,*r")
                    775:        (plus:SF (mult:SF (match_operand:SF 1 "register_operand" "%r,A")
                    776:                          (match_operand:SF 2 "register_operand" "r,r"))
                    777:                 (match_operand:SF 3 "register_operand" "0,*r")))]
                    778:   "TARGET_29050"
                    779:   "@
                    780:    fmac 0,%0,%1,%2
                    781:    fmsm %0,%2,%3"
                    782:   [(set_attr "type" "fam")])
                    783: 
                    784: (define_insn ""
                    785:   [(set (match_operand:SF 0 "register_operand" "=a")
                    786:        (plus:SF (mult:SF (neg:SF (match_operand:SF 1 "register_operand" "r"))
                    787:                          (match_operand:SF 2 "register_operand" "r"))
                    788:                 (match_operand:SF 3 "register_operand" "0")))]
                    789:   "TARGET_29050"
                    790:   "fmac 1,%0,%2,%1"
                    791:   [(set_attr "type" "fam")])
                    792: 
                    793: (define_insn ""
                    794:   [(set (match_operand:SF 0 "register_operand" "=a")
                    795:        (minus:SF (mult:SF (match_operand:SF 1 "register_operand" "%r")
                    796:                           (match_operand:SF 2 "register_operand" "r"))
                    797:                  (match_operand:SF 3 "register_operand" "0")))]
                    798:   "TARGET_29050"
                    799:   "fmac 2,%0,%1,%2"
                    800:   [(set_attr "type" "fam")])
                    801: 
                    802: (define_insn ""
                    803:   [(set (match_operand:SF 0 "register_operand" "=a")
                    804:        (minus:SF (mult:SF (neg:SF (match_operand:SF 1 "register_operand" "r"))
                    805:                           (match_operand:SF 2 "register_operand" "r"))
                    806:                  (match_operand:SF 3 "register_operand" "0")))]
                    807:   "TARGET_29050"
                    808:   "fmac 3,%0,%2,%1"
                    809:   [(set_attr "type" "fam")])
                    810: 
                    811: (define_insn ""
                    812:   [(set (match_operand:SF 0 "register_operand" "=a")
                    813:        (mult:SF (neg:SF (match_operand:SF 1 "register_operand" "r"))
                    814:                 (match_operand:SF 2 "register_operand" "r")))]
                    815:   "TARGET_29050"
                    816:   "fmac 5,%0,%2,%1"
                    817:   [(set_attr "type" "fam")])
                    818: 
                    819: (define_insn ""
                    820:   [(set (match_operand:SF 0 "register_operand" "=a")
                    821:        (minus:SF (neg:SF (match_operand:SF 1 "register_operand" "%r"))
                    822:                  (match_operand:SF 2 "register_operand" "0")))]
                    823:   "TARGET_29050"
                    824:   "fmac 11,%0,%1,%1"
                    825:   [(set_attr "type" "fam")])
                    826: 
                    827: (define_insn ""
                    828:   [(set (match_operand:SF 0 "register_operand" "=a")
                    829:        (neg:SF (plus:SF (match_operand:SF 1 "register_operand" "%r")
                    830:                         (match_operand:SF 2 "register_operand" "0"))))]
                    831:   "TARGET_29050"
                    832:   "fmac 11,%0,%1,%1"
                    833:   [(set_attr "type" "fam")])
                    834: 
                    835: (define_insn ""
                    836:   [(set (match_operand:SF 0 "register_operand" "=r,a")
                    837:        (neg:SF (match_operand:SF 1 "register_operand" "r,r")))
                    838:    (clobber (match_scratch:SI 2 "=&r,X"))]
                    839:   "TARGET_29050"
                    840:   "@
                    841:    cpeq %2,gr1,gr1\;xor %0,%1,%2
                    842:    fmac 13,%0,%1,%1"
                    843:   [(set_attr "type" "multi,fam")])
                    844: 
                    845: ;; FMUL
                    846: (define_expand "mulsf3"
                    847:   [(set (match_operand:SF 0 "register_operand" "")
                    848:        (mult:SF (match_operand:SF 1 "register_operand" "")
                    849:                 (match_operand:SF 2 "register_operand" "")))]
                    850:   ""
                    851:   "")
                    852: 
                    853: (define_insn ""
                    854:   [(set (match_operand:SF 0 "register_operand" "=r")
                    855:        (mult:SF (match_operand:SF 1 "register_operand" "%r")
                    856:                 (match_operand:SF 2 "register_operand" "r")))]
                    857:   "! TARGET_29050"
                    858:   "fmul %0,%1,%2"
                    859:   [(set_attr "type" "fmul")])
                    860: 
                    861: (define_insn ""
                    862:   [(set (match_operand:SF 0 "register_operand" "=r,a")
                    863:        (mult:SF (match_operand:SF 1 "register_operand" "%r,r")
                    864:                 (match_operand:SF 2 "register_operand" "r,r")))]
                    865:   "TARGET_29050"
                    866:   "@
                    867:    fmul %0,%1,%2
                    868:    fmac 4,%0,%1,%2"
                    869:   [(set_attr "type" "fmul,fam")])
                    870: 
                    871: ;; FSUB
                    872: (define_expand "subsf3"
                    873:   [(set (match_operand:SF 0 "register_operand" "")
                    874:        (minus:SF (match_operand:SF 1 "register_operand" "")
                    875:                  (match_operand:SF 2 "register_operand" "")))]
                    876:   ""
                    877:   "")
                    878: 
                    879: (define_insn ""
                    880:   [(set (match_operand:SF 0 "register_operand" "=r")
                    881:        (minus:SF (match_operand:SF 1 "register_operand" "r")
                    882:                  (match_operand:SF 2 "register_operand" "r")))]
                    883:   "! TARGET_29050"
                    884:   "fsub %0,%1,%2"
                    885:   [(set_attr "type" "fadd")])
                    886: 
                    887: (define_insn ""
                    888:   [(set (match_operand:SF 0 "register_operand" "=r,a,a")
                    889:        (minus:SF (match_operand:SF 1 "register_operand" "r,0,r")
                    890:                  (match_operand:SF 2 "register_operand" "r,r,0")))]
                    891:   "TARGET_29050"
                    892:   "@
                    893:    fsub %0,%1,%2
                    894:    fmac 9,%0,%2,%2
                    895:    fmac 10,%0,%1,%1"
                    896:   [(set_attr "type" "fadd,fam,fam")])
                    897: 
                    898: ;; INBYTE
                    899: (define_insn ""
                    900:   [(set (zero_extract:SI (match_operand:SI 0 "gpc_reg_operand" "+r")
                    901:                         (const_int 8)
                    902:                         (ashift:PSI
                    903:                          (match_operand:PSI 2 "register_operand" "b")
                    904:                          (const_int 3)))
                    905:        (match_operand:SI 1 "srcb_operand" "rI"))]
                    906:   ""
                    907:   "inbyte %0,%0,%1")
                    908: 
                    909: (define_insn ""
                    910:   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
                    911:        (ior:SI (and:SI
                    912:                 (not:SI
                    913:                  (ashift:SI (const_int 255)
                    914:                             (ashift:PSI
                    915:                              (match_operand:PSI 3 "register_operand" "b")
                    916:                              (const_int 3))))
                    917:                 (match_operand:SI 1 "gpc_reg_operand" "r"))
                    918:                (ashift:SI (zero_extend:SI
                    919:                            (match_operand:QI 2 "srcb_operand" "rI"))
                    920:                           (ashift:PSI (match_dup 3) (const_int 3)))))]
                    921:   ""
                    922:   "inbyte %0,%1,%2")
                    923: 
                    924: ;; INHW
                    925: (define_insn ""
                    926:   [(set (zero_extract:SI (match_operand:SI 0 "gpc_reg_operand" "+r")
                    927:                         (const_int 16)
                    928:                         (ashift:PSI
                    929:                          (match_operand:PSI 2 "register_operand" "b")
                    930:                          (const_int 3)))
                    931:        (match_operand:SI 1 "srcb_operand" "rI"))]
                    932:   ""
                    933:   "inhw %0,%0,%1")
                    934: 
                    935: (define_insn ""
                    936:   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
                    937:        (ior:SI (and:SI
                    938:                 (not:SI
                    939:                  (ashift:SI (const_int 65535)
                    940:                             (ashift:PSI
                    941:                              (match_operand:PSI 3 "register_operand" "b")
                    942:                              (const_int 3))))
                    943:                 (match_operand:SI 1 "gpc_reg_operand" "r"))
                    944:                (ashift:SI (zero_extend:SI
                    945:                            (match_operand:HI 2 "srcb_operand" "rI"))
                    946:                           (ashift:PSI (match_dup 3) (const_int 3)))))]
                    947:   ""
                    948:   "inhw %0,%1,%2")
                    949: 
                    950: (define_expand "insv"
                    951:   [(set (zero_extract:SI (match_operand:SI 0 "gpc_reg_operand" "")
                    952:                         (match_operand:SI 1 "general_operand" "")
                    953:                         (match_operand:SI 2 "general_operand" ""))
                    954:        (match_operand:SI 3 "srcb_operand" ""))]
                    955:   ""
                    956:   "
                    957: {
                    958:   int size, pos;
                    959: 
                    960:   if (GET_CODE (operands[1]) != CONST_INT
                    961:       || GET_CODE (operands[2]) != CONST_INT)
                    962:     FAIL;
                    963: 
                    964:   size = INTVAL (operands[1]);
                    965:   pos = INTVAL (operands[2]);
                    966:   if ((size != 8 && size != 16) || pos % size != 0)
                    967:     FAIL;
                    968: 
                    969:   operands[2] = gen_rtx (ASHIFT, PSImode,
                    970:                         force_reg (PSImode, GEN_INT (pos / 8)),
                    971:                         GEN_INT (3));
                    972: }")
                    973: 
                    974: ;; LOAD (also used by move insn).
                    975: (define_insn ""
                    976:   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
                    977:        (mem:SI (and:SI (match_operand:SI 1 "gpc_reg_operand" "r")
                    978:                        (const_int -4))))
                    979:    (set (match_operand:PSI 2 "register_operand" "=b")
                    980:        (truncate:PSI (match_dup 1)))]
                    981:   "! TARGET_DW_ENABLE"
                    982:   "load 0,16,%0,%1"
                    983:   [(set_attr "type" "load")])
                    984: 
                    985: (define_insn ""
                    986:   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
                    987:        (zero_extend:SI (match_operand:QI 1 "memory_operand" "m")))]
                    988:   "TARGET_DW_ENABLE"
                    989:   "load 0,1,%0,%1"
                    990:   [(set_attr "type" "load")])
                    991: 
                    992: (define_insn ""
                    993:   [(set (match_operand:HI 0 "gpc_reg_operand" "=r")
                    994:        (zero_extend:HI (match_operand:QI 1 "memory_operand" "m")))]
                    995:   "TARGET_DW_ENABLE"
                    996:   "load 0,1,%0,%1"
                    997:   [(set_attr "type" "load")])
                    998: 
                    999: (define_insn ""
                   1000:   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
                   1001:        (zero_extend:SI (match_operand:HI 1 "memory_operand" "m")))]
                   1002:   "TARGET_DW_ENABLE"
                   1003:   "load 0,2,%0,%1"
                   1004:   [(set_attr "type" "load")])
                   1005: 
                   1006: (define_insn ""
                   1007:   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
                   1008:        (sign_extend:SI (match_operand:QI 1 "memory_operand" "m")))
                   1009:    (clobber (match_scratch:PSI 2 "=&b"))]
                   1010:   "TARGET_DW_ENABLE"
                   1011:   "load 0,17,%0,%1"
                   1012:   [(set_attr "type" "load")])
                   1013: 
                   1014: (define_insn ""
                   1015:   [(set (match_operand:HI 0 "gpc_reg_operand" "=r")
                   1016:        (sign_extend:HI (match_operand:QI 1 "memory_operand" "m")))
                   1017:    (clobber (match_scratch:PSI 2 "=&b"))]
                   1018:   "TARGET_DW_ENABLE"
                   1019:   "load 0,17,%0,%1"
                   1020:   [(set_attr "type" "load")])
                   1021: 
                   1022: (define_insn ""
                   1023:   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
                   1024:        (sign_extend:SI (match_operand:HI 1 "memory_operand" "m")))
                   1025:    (clobber (match_scratch:PSI 2 "=&b"))]
                   1026:   "TARGET_DW_ENABLE"
                   1027:   "load 0,18,%0,%1"
                   1028:   [(set_attr "type" "load")])
                   1029: 
                   1030: ;; LOADM
                   1031: (define_expand "load_multiple"
                   1032:   [(set (match_dup 4)
                   1033:        (match_operand:PSI 2 "const_int_operand" ""))
                   1034:    (match_par_dup 3 [(set (match_operand:SI 0 "" "")
                   1035:                          (match_operand:SI 1 "" ""))])]
                   1036:   ""
                   1037:   "
                   1038: {
                   1039:   int regno;
                   1040:   int count;
                   1041:   rtx from;
                   1042:   int i;
                   1043: 
                   1044:   /* Support only loading a constant number of hard registers from memory.  */
                   1045:   if (GET_CODE (operands[2]) != CONST_INT
                   1046:       || operands[2] == const1_rtx
                   1047:       || GET_CODE (operands[1]) != MEM
                   1048:       || GET_CODE (operands[0]) != REG
                   1049:       || REGNO (operands[0]) >= FIRST_PSEUDO_REGISTER)
                   1050:     FAIL;
                   1051: 
                   1052:   count = INTVAL (operands[2]);
                   1053:   regno = REGNO (operands[0]);
                   1054: 
                   1055:   /* CR gets set to the number of registers minus one.  */
                   1056:   operands[2] = GEN_INT(count - 1);
                   1057: 
                   1058:   operands[3] = gen_rtx (PARALLEL, VOIDmode, rtvec_alloc (count + 2));
                   1059:   from = memory_address (SImode, XEXP (operands[1], 0));
                   1060:   XVECEXP (operands[3], 0, 0) = gen_rtx (SET, VOIDmode,
                   1061:                                         gen_rtx (REG, SImode, regno),
                   1062:                                         gen_rtx (MEM, SImode, from));
                   1063:   operands[4] = gen_reg_rtx (PSImode);
                   1064: 
                   1065:   XVECEXP (operands[3], 0, 1) = gen_rtx (USE, VOIDmode, operands[4]);
                   1066:   XVECEXP (operands[3], 0, 2) = gen_rtx (CLOBBER, VOIDmode, operands[4]);
                   1067: 
                   1068:   for (i = 1; i < count; i++)
                   1069:     XVECEXP (operands[3], 0, i + 2)
                   1070:       = gen_rtx (SET, VOIDmode, gen_rtx (REG, SImode, regno + i),
                   1071:                 gen_rtx (MEM, SImode, plus_constant (from, i * 4)));
                   1072: }")
                   1073: 
                   1074: ;; Indicate that CR is used and is then clobbered.
                   1075: (define_insn ""
                   1076:   [(set (match_operand 0 "gpc_reg_operand" "=r")
                   1077:        (match_operand 1 "memory_operand" "m"))
                   1078:    (use (match_operand:PSI 2 "register_operand" "+c"))
                   1079:    (clobber (match_dup 2))]
                   1080:   "GET_MODE (operands[0]) == GET_MODE (operands[1])
                   1081:    && GET_MODE_SIZE (GET_MODE (operands[0])) > UNITS_PER_WORD"
                   1082:   "loadm 0,0,%0,%1"
                   1083:   [(set_attr "type" "load")])
                   1084: 
                   1085: (define_insn ""
                   1086:   [(match_parallel 0 "load_multiple_operation"
                   1087:                   [(set (match_operand:SI 1 "gpc_reg_operand" "=r")
                   1088:                         (match_operand:SI 2 "memory_operand" "m"))
                   1089:                    (use (match_operand:PSI 3 "register_operand" "+c"))
                   1090:                    (clobber (match_dup 3))])]
                   1091:   ""
                   1092:   "loadm 0,0,%1,%2"
                   1093:   [(set_attr "type" "load")])
                   1094: 
                   1095: ;; MTSR (used also by move insn)
                   1096: (define_insn ""
                   1097:   [(set (match_operand:SI 0 "spec_reg_operand" "=*h,*h")
                   1098:        (and:SI (match_operand:SI 1 "gpc_reg_or_immediate_operand" "r,i")
                   1099:                (match_operand:SI 2 "const_int_operand" "n,n")))]
                   1100:   "masks_bits_for_special (operands[0], operands[2])"
                   1101:   "@
                   1102:    mtsr %0,%1
                   1103:    mtsrim %0,%1")
                   1104: 
                   1105: (define_insn ""
                   1106:   [(set (match_operand:PSI 0 "register_operand" "=h,h")
                   1107:        (truncate:PSI
                   1108:         (match_operand:SI 1 "gpc_reg_or_immediate_operand" "r,i")))]
                   1109:   ""
                   1110:   "@
                   1111:    mtsr %0,%1
                   1112:    mtsrim %0,%1")
                   1113: 
                   1114: ;; MULTIPLY, MULTM, MULTMU
                   1115: (define_insn "mulsi3"
                   1116:   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
                   1117:        (mult:SI (match_operand:SI 1 "gpc_reg_operand" "%r")
                   1118:                 (match_operand:SI 2 "gpc_reg_operand" "r")))
                   1119:    (clobber (match_scratch:SI 3 "=&q"))]
                   1120:   ""
                   1121:   "multiply %0,%1,%2")
                   1122: 
                   1123: (define_insn ""
                   1124:   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
                   1125:        (subreg:SI
                   1126:         (mult:DI
                   1127:          (sign_extend:DI (match_operand:SI 1 "gpc_reg_operand" "%r"))
                   1128:          (sign_extend:DI (match_operand:SI 2 "gpc_reg_operand" "r"))) 0))
                   1129:    (clobber (match_scratch:SI 3 "=&q"))]
                   1130:   ""
                   1131:   "multm %0,%1,%2")
                   1132: 
                   1133: (define_insn ""
                   1134:   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
                   1135:        (subreg:SI
                   1136:         (mult:DI
                   1137:          (zero_extend:DI (match_operand:SI 1 "gpc_reg_operand" "%r"))
                   1138:          (zero_extend:DI (match_operand:SI 2 "gpc_reg_operand" "r"))) 0))
                   1139:    (clobber (match_scratch:SI 3 "=&q"))]
                   1140:   ""
                   1141:   "multmu %0,%1,%2")
                   1142: 
                   1143: (define_insn "mulsidi3"
                   1144:   [(set (match_operand:DI 0 "gpc_reg_operand" "=r")
                   1145:        (mult:DI (sign_extend:DI (match_operand:SI 1 "gpc_reg_operand" "r"))
                   1146:                 (sign_extend:DI (match_operand:SI 2 "gpc_reg_operand" "r"))))
                   1147:    (clobber (match_scratch:SI 3 "=&q"))]
                   1148:   ""
                   1149:   "multiply %L0,%1,%2\;multm %0,%1,%2"
                   1150:   [(set_attr "type" "multi")])
                   1151: 
                   1152: (define_split
                   1153:   [(set (match_operand:DI 0 "gpc_reg_operand" "")
                   1154:        (mult:DI (sign_extend:DI (match_operand:SI 1 "gpc_reg_operand" ""))
                   1155:                 (sign_extend:DI (match_operand:SI 2 "gpc_reg_operand" ""))))
                   1156:    (clobber (reg:SI 180))]
                   1157:   "reload_completed"
                   1158:   [(parallel [(set (match_dup 3)
                   1159:                   (mult:SI (match_dup 1) (match_dup 2)))
                   1160:              (clobber (reg:SI 180))])
                   1161:    (parallel [(set (match_dup 4)
                   1162:                   (subreg:SI (mult:DI
                   1163:                               (sign_extend:DI (match_dup 1))
                   1164:                               (sign_extend:DI (match_dup 2))) 0))
                   1165:              (clobber (reg:SI 180))])]
                   1166:   "
                   1167: { operands[3] = operand_subword (operands[0], 1, 1, DImode);
                   1168:   operands[4] = operand_subword (operands[1], 0, 1, DImode); } ")
                   1169:                            
                   1170: (define_insn "umulsidi3"
                   1171:   [(set (match_operand:DI 0 "gpc_reg_operand" "=r")
                   1172:        (mult:DI (zero_extend:DI (match_operand:SI 1 "gpc_reg_operand" "r"))
                   1173:                 (zero_extend:DI (match_operand:SI 2 "gpc_reg_operand" "r"))))
                   1174:    (clobber (match_scratch:SI 3 "=&q"))]
                   1175:   ""
                   1176:   "multiplu %L0,%1,%2\;multmu %0,%1,%2"
                   1177:   [(set_attr "type" "multi")])
                   1178: 
                   1179: (define_split
                   1180:   [(set (match_operand:DI 0 "gpc_reg_operand" "")
                   1181:        (mult:DI (zero_extend:DI (match_operand:SI 1 "gpc_reg_operand" ""))
                   1182:                 (zero_extend:DI (match_operand:SI 2 "gpc_reg_operand" ""))))
                   1183:    (clobber (reg:SI 180))]
                   1184:   "reload_completed"
                   1185:   [(parallel [(set (match_dup 3)
                   1186:                   (mult:SI (match_dup 1) (match_dup 2)))
                   1187:              (clobber (reg:SI 180))])
                   1188:    (parallel [(set (match_dup 4)
                   1189:                   (subreg:SI (mult:DI (zero_extend:DI (match_dup 1))
                   1190:                                       (zero_extend:DI (match_dup 2))) 0))
                   1191:              (clobber (reg:SI 180))])]
                   1192:   "
                   1193: { operands[3] = operand_subword (operands[0], 1, 1, DImode);
                   1194:   operands[4] = operand_subword (operands[1], 0, 1, DImode); } ")
                   1195:                            
                   1196: ;; NAND
                   1197: (define_insn ""
                   1198:   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
                   1199:        (ior:SI (not:SI (match_operand:SI 1 "gpc_reg_operand" "%r"))
                   1200:                (not:SI (match_operand:SI 2 "srcb_operand" "rI"))))]
                   1201:   ""
                   1202:   "nand %0,%1,%2")
                   1203: 
                   1204: (define_insn ""
                   1205:   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
                   1206:        (ior:SI (not:SI (match_operand:SI 1 "gpc_reg_operand" "r"))
                   1207:                (match_operand:SI 2 "const_int_operand" "K")))]
                   1208:   "((unsigned) ~ INTVAL (operands[2])) < 256"
                   1209:   "nand %0,%1,%C2")
                   1210: 
                   1211: ;; NOR
                   1212: (define_insn ""
                   1213:   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
                   1214:        (and:SI (not:SI (match_operand:SI 1 "gpc_reg_operand" "%r"))
                   1215:                (not:SI (match_operand:SI 2 "srcb_operand" "rI"))))]
                   1216:   ""
                   1217:   "nor %0,%1,%2")
                   1218: 
                   1219: (define_insn ""
                   1220:   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
                   1221:        (and:SI (not:SI (match_operand:SI 1 "gpc_reg_operand" "r"))
                   1222:                (match_operand:SI 2 "const_int_operand" "K")))]
                   1223:   "((unsigned) ~ INTVAL (operands[2])) < 256"
                   1224:   "nor %0,%1,%C2")
                   1225: 
                   1226: (define_insn "one_cmplsi2"
                   1227:   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
                   1228:        (not:SI (match_operand:SI 1 "gpc_reg_operand" "r")))]
                   1229:   ""
                   1230:   "nor %0,%1,0")
                   1231: 
                   1232: ;; OR/ORN
                   1233: (define_expand "iorsi3"
                   1234:   [(set (match_operand:SI 0 "gpc_reg_operand" "")
                   1235:        (ior:SI (match_operand:SI 1 "gpc_reg_operand" "")
                   1236:                (match_operand:SI 2 "srcb_operand" "")))]
                   1237:   ""
                   1238:   "")
                   1239: 
                   1240: (define_insn ""
                   1241:   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
                   1242:        (ior:SI (match_operand:SI 1 "gpc_reg_operand" "%r")
                   1243:                (match_operand:SI 2 "srcb_operand" "rI")))]
                   1244:   "! TARGET_29050"
                   1245:   "or %0,%1,%2")
                   1246: 
                   1247: (define_insn ""
                   1248:   [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
                   1249:        (ior:SI (match_operand:SI 1 "gpc_reg_operand" "%r,r")
                   1250:                (match_operand:SI 2 "srcb_operand" "rI,K")))]
                   1251:   "TARGET_29050"
                   1252:   "@
                   1253:    or %0,%1,%2
                   1254:    orn %0,%1,%C2")
                   1255: 
                   1256: 
                   1257: ;; SLL (also used by move insn)
                   1258: (define_insn "nop"
                   1259:   [(const_int 0)]
                   1260:   ""
                   1261:   "aseq 0x40,gr1,gr1")
                   1262: 
                   1263: (define_insn "ashlsi3"
                   1264:   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
                   1265:        (ashift:SI (match_operand:SI 1 "gpc_reg_operand" "r")
                   1266:                   (match_operand:QI 2 "srcb_operand" "rn")))]
                   1267:   ""
                   1268:   "sll %0,%1,%Q2")
                   1269: 
                   1270: ;; SQRT
                   1271: (define_insn "sqrtsf2"
                   1272:   [(set (match_operand:SF 0 "gpc_reg_operand" "=r")
                   1273:        (sqrt:SF (match_operand:SF 1 "gpc_reg_operand" "r")))]
                   1274:   "TARGET_29050"
                   1275:   "sqrt %0,%1,1"
                   1276:   [(set_attr "type" "fsqrt")])
                   1277: 
                   1278: (define_insn "sqrtdf2"
                   1279:   [(set (match_operand:DF 0 "gpc_reg_operand" "=r")
                   1280:        (sqrt:DF (match_operand:DF 1 "gpc_reg_operand" "r")))]
                   1281:   "TARGET_29050"
                   1282:   "sqrt %0,%1,2"
                   1283:   [(set_attr "type" "dsqrt")])
                   1284: 
                   1285: ;; SRA
                   1286: (define_insn "ashrsi3"
                   1287:   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
                   1288:        (ashiftrt:SI (match_operand:SI 1 "gpc_reg_operand" "r")
                   1289:                     (match_operand:QI 2 "srcb_operand" "rn")))]
                   1290:   ""
                   1291:   "sra %0,%1,%Q2")
                   1292: 
                   1293: ;; SRL
                   1294: (define_insn "lshrsi3"
                   1295:   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
                   1296:        (lshiftrt:SI (match_operand:SI 1 "gpc_reg_operand" "r")
                   1297:                     (match_operand:QI 2 "srcb_operand" "rn")))]
                   1298:   ""
                   1299:   "srl %0,%1,%Q2")
                   1300: 
                   1301: ;; STORE
                   1302: ;;
                   1303: ;; These somewhat bogus patterns exist to set OPT = 001/010 for partial-word
                   1304: ;; stores on systems with DW not set.
                   1305: (define_insn ""
                   1306:   [(set (mem:SI (and:SI (match_operand:SI 0 "gpc_reg_operand" "r")
                   1307:                        (const_int -4)))
                   1308:        (match_operand:SI 1 "gpc_reg_operand" "r"))]
                   1309:   "! TARGET_DW_ENABLE"
                   1310:   "store 0,1,%1,%0"
                   1311:   [(set_attr "type" "store")])
                   1312: 
                   1313: (define_insn ""
                   1314:   [(set (mem:SI (and:SI (match_operand:SI 0 "gpc_reg_operand" "r")
                   1315:                        (const_int -3)))
                   1316:        (match_operand:SI 1 "gpc_reg_operand" "r"))]
                   1317:   "! TARGET_DW_ENABLE"
                   1318:   "store 0,2,%1,%0"
                   1319:   [(set_attr "type" "store")])
                   1320: 
                   1321: ;; STOREM
                   1322: (define_expand "store_multiple"
                   1323:   [(use (match_operand 0 "" ""))
                   1324:    (use (match_operand 1 "" ""))
                   1325:    (use (match_operand 2 "" ""))]
                   1326:   ""
                   1327:   "
                   1328: { rtx pat;
                   1329: 
                   1330:  if (TARGET_NO_STOREM_BUG)
                   1331:     pat = gen_store_multiple_no_bug (operands[0], operands[1], operands[2]);
                   1332:   else
                   1333:     pat = gen_store_multiple_bug (operands[0], operands[1], operands[2]);
                   1334: 
                   1335:   if (pat)
                   1336:     emit_insn (pat);
                   1337:   else
                   1338:     FAIL;
                   1339: 
                   1340:   DONE;
                   1341: }")
                   1342: 
                   1343: (define_expand "store_multiple_no_bug"
                   1344:   [(set (match_dup 4)
                   1345:        (match_operand:PSI 2 "const_int_operand" ""))
                   1346:    (match_par_dup 3 [(set (match_operand:SI 0 "" "")
                   1347:                          (match_operand:SI 1 "" ""))])]
                   1348:   ""
                   1349:   "
                   1350: {
                   1351:   int regno;
                   1352:   int count;
                   1353:   rtx from;
                   1354:   int i;
                   1355: 
                   1356:   /* Support only storing a constant number of hard registers to memory.  */
                   1357:   if (GET_CODE (operands[2]) != CONST_INT
                   1358:       || operands[2] == const1_rtx
                   1359:       || GET_CODE (operands[0]) != MEM
                   1360:       || GET_CODE (operands[1]) != REG
                   1361:       || REGNO (operands[1]) >= FIRST_PSEUDO_REGISTER)
                   1362:     FAIL;
                   1363: 
                   1364:   count = INTVAL (operands[2]);
                   1365:   regno = REGNO (operands[1]);
                   1366: 
                   1367:   /* CR gets set to the number of registers minus one.  */
                   1368:   operands[2] = GEN_INT(count - 1);
                   1369: 
                   1370:   operands[3] = gen_rtx (PARALLEL, VOIDmode, rtvec_alloc (count + 2));
                   1371:   from = memory_address (SImode, XEXP (operands[0], 0));
                   1372:   XVECEXP (operands[3], 0, 0) = gen_rtx (SET, VOIDmode,
                   1373:                                         gen_rtx (MEM, SImode, from),
                   1374:                                         gen_rtx (REG, SImode, regno));
                   1375:   operands[4] = gen_reg_rtx (PSImode);
                   1376:   XVECEXP (operands[3], 0, 1) = gen_rtx (USE, VOIDmode, operands[4]);
                   1377:   XVECEXP (operands[3], 0, 2) = gen_rtx (CLOBBER, VOIDmode, operands[4]);
                   1378: 
                   1379:   for (i = 1; i < count; i++)
                   1380:     XVECEXP (operands[3], 0, i + 2)
                   1381:       = gen_rtx (SET, VOIDmode,
                   1382:                 gen_rtx (MEM, SImode, plus_constant (from, i * 4)),
                   1383:                 gen_rtx (REG, SImode, regno + i));
                   1384: }")
                   1385: 
                   1386: (define_expand "store_multiple_bug"
                   1387:   [(match_par_dup 3 [(set (match_operand:SI 0 "" "")
                   1388:                          (match_operand:SI 1 "" ""))
                   1389:                     (use (match_operand:SI 2 "" ""))])]
                   1390:   ""
                   1391:   "
                   1392: {
                   1393:   int regno;
                   1394:   int count;
                   1395:   rtx from;
                   1396:   int i;
                   1397: 
                   1398:   /* Support only storing a constant number of hard registers to memory.  */
                   1399:   if (GET_CODE (operands[2]) != CONST_INT
                   1400:       || operands[2] == const1_rtx
                   1401:       || GET_CODE (operands[0]) != MEM
                   1402:       || GET_CODE (operands[1]) != REG
                   1403:       || REGNO (operands[1]) >= FIRST_PSEUDO_REGISTER)
                   1404:     FAIL;
                   1405: 
                   1406:   count = INTVAL (operands[2]);
                   1407:   regno = REGNO (operands[1]);
                   1408: 
                   1409:   operands[3] = gen_rtx (PARALLEL, VOIDmode, rtvec_alloc (count + 1));
                   1410:   from = memory_address (SImode, XEXP (operands[0], 0));
                   1411:   XVECEXP (operands[3], 0, 0) = gen_rtx (SET, VOIDmode,
                   1412:                                         gen_rtx (MEM, SImode, from),
                   1413:                                         gen_rtx (REG, SImode, regno));
                   1414:   XVECEXP (operands[3], 0, 1)
                   1415:     = gen_rtx (CLOBBER, VOIDmode, gen_rtx (SCRATCH, PSImode));
                   1416: 
                   1417:   for (i = 1; i < count; i++)
                   1418:     XVECEXP (operands[3], 0, i + 1)
                   1419:       = gen_rtx (SET, VOIDmode,
                   1420:                 gen_rtx (MEM, SImode, plus_constant (from, i * 4)),
                   1421:                 gen_rtx (REG, SImode, regno + i));
                   1422: }")
                   1423: 
                   1424: (define_insn ""
                   1425:   [(set (match_operand 0 "memory_operand" "=m")
                   1426:        (match_operand 1 "gpc_reg_operand" "r"))
                   1427:    (clobber (match_scratch:PSI 2 "=&c"))]
                   1428:   "!TARGET_NO_STOREM_BUG
                   1429:    && GET_MODE (operands[0]) == GET_MODE (operands[1])
                   1430:    && GET_MODE_SIZE (GET_MODE (operands[0])) > UNITS_PER_WORD"
                   1431:   "mtsrim cr,%S1\;storem 0,0,%1,%0"
                   1432:   [(set_attr "type" "multi")])
                   1433: 
                   1434: (define_insn ""
                   1435:   [(match_parallel 0 "store_multiple_operation"
                   1436:                   [(set (match_operand:SI 1 "memory_operand" "=m")
                   1437:                         (match_operand:SI 2 "gpc_reg_operand" "r"))
                   1438:                    (clobber (match_scratch:PSI 3 "=&c"))])]
                   1439:   "!TARGET_NO_STOREM_BUG"
                   1440:   "mtsrim cr,%V0\;storem 0,0,%2,%1"
                   1441:   [(set_attr "type" "multi")])
                   1442: 
                   1443: (define_insn ""
                   1444:   [(set (match_operand 0 "memory_operand" "=m")
                   1445:        (match_operand 1 "gpc_reg_operand" "r"))
                   1446:    (use (match_operand:PSI 2 "register_operand" "+c"))
                   1447:    (clobber (match_dup 2))]
                   1448:   "TARGET_NO_STOREM_BUG
                   1449:    && GET_MODE (operands[0]) == GET_MODE (operands[1])
                   1450:    && GET_MODE_SIZE (GET_MODE (operands[0])) > UNITS_PER_WORD"
                   1451:   "storem 0,0,%1,%0"
                   1452:   [(set_attr "type" "store")])
                   1453: 
                   1454: (define_insn ""
                   1455:   [(match_parallel 0 "store_multiple_operation"
                   1456:                   [(set (match_operand:SI 1 "memory_operand" "=m")
                   1457:                         (match_operand:SI 2 "gpc_reg_operand" "r"))
                   1458:                    (use (match_operand:PSI 3 "register_operand" "+c"))
                   1459:                    (clobber (match_dup 3))])]
                   1460:   "TARGET_NO_STOREM_BUG"
                   1461:   "storem 0,0,%2,%1"
                   1462:   [(set_attr "type" "store")])
                   1463: 
                   1464: ;; SUB
                   1465: ;;
                   1466: ;; Either operand can be a register or an 8-bit constant, but both cannot be
                   1467: ;; constants (can't usually occur anyway).
                   1468: (define_expand "subsi3"
                   1469:   [(set (match_operand:SI 0 "gpc_reg_operand" "")
                   1470:        (minus:SI (match_operand:SI 1 "srcb_operand" "")
                   1471:                  (match_operand:SI 2 "srcb_operand" "")))]
                   1472:   ""
                   1473:   "
                   1474: {
                   1475:   if (GET_CODE (operands[0]) == CONST_INT
                   1476:       && GET_CODE (operands[1]) == CONST_INT)
                   1477:     operands[1] = force_reg (SImode, operands[1]);
                   1478: }")
                   1479: 
                   1480: (define_insn ""
                   1481:   [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
                   1482:        (minus:SI (match_operand:SI 1 "srcb_operand" "r,I")
                   1483:                  (match_operand:SI 2 "srcb_operand" "rI,r")))]
                   1484:   "register_operand (operands[1], SImode)
                   1485:    || register_operand (operands[2], SImode)"
                   1486:   "@
                   1487:    sub %0,%1,%2
                   1488:    subr %0,%2,%1")
                   1489: 
                   1490: (define_insn "subdi3"
                   1491:   [(set (match_operand:DI 0 "gpc_reg_operand" "=r")
                   1492:        (minus:DI (match_operand:DI 1 "gpc_reg_operand" "r")
                   1493:                  (match_operand:DI 2 "gpc_reg_operand" "r")))]
                   1494:   ""
                   1495:   "sub %L0,%L1,%L2\;subc %0,%1,%2"
                   1496:   [(set_attr "type" "multi")])
                   1497: 
                   1498: ;; SUBR (also used above in SUB)
                   1499: (define_insn "negdi2"
                   1500:   [(set (match_operand:DI 0 "gpc_reg_operand" "=r")
                   1501:        (neg:DI (match_operand:DI 1 "gpc_reg_operand" "r")))]
                   1502:   ""
                   1503:   "subr %L0,%L1,0\;subrc %0,%1,0"
                   1504:   [(set_attr "type" "multi")])
                   1505: 
                   1506: (define_insn "negsi2"
                   1507:   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
                   1508:        (neg:SI (match_operand:SI 1 "gpc_reg_operand" "r")))]
                   1509:   ""
                   1510:   "subr %0,%1,0")
                   1511: 
                   1512: ;; XNOR
                   1513: (define_insn ""
                   1514:   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
                   1515:        (not:SI (xor:SI (match_operand:SI 1 "gpc_reg_operand" "%r")
                   1516:                        (match_operand:SI 2 "srcb_operand" "rI"))))]
                   1517:   ""
                   1518:   "xnor %0,%1,%2")
                   1519: 
                   1520: ;; XOR
                   1521: (define_insn "xorsi3"
                   1522:   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
                   1523:        (xor:SI (match_operand:SI 1 "gpc_reg_operand" "%r")
                   1524:                (match_operand:SI 2 "srcb_operand" "rI")))]
                   1525:   ""
                   1526:   "xor %0,%1,%2")
                   1527: 
                   1528: ;; Can use XOR to negate floating-point values, but we are better off not doing
                   1529: ;; it that way on the 29050 so it can combine with the fmac insns.
                   1530: (define_expand "negsf2"
                   1531:   [(parallel [(set (match_operand:SF 0 "register_operand" "")
                   1532:                   (neg:SF (match_operand:SF 1 "register_operand" "")))
                   1533:              (clobber (match_scratch:SI 2 ""))])]
                   1534:   ""
                   1535:   "
                   1536: {
                   1537:   rtx result;
                   1538:   rtx target;
                   1539: 
                   1540:   if (! TARGET_29050)
                   1541:     {
                   1542:       target = operand_subword_force (operands[0], 0, SFmode);
                   1543:       result = expand_binop (SImode, xor_optab,
                   1544:                             operand_subword_force (operands[1], 0, SFmode),
                   1545:                             GEN_INT(0x80000000), target, 0, OPTAB_WIDEN);
                   1546:       if (result == 0)
                   1547:        abort ();
                   1548: 
                   1549:       if (result != target)
                   1550:        emit_move_insn (result, target);
                   1551: 
                   1552:       /* Make a place for REG_EQUAL.  */
                   1553:       emit_move_insn (operands[0], operands[0]);
                   1554:       DONE;
                   1555:     }
                   1556: }")
                   1557: 
                   1558: (define_expand "negdf2"
                   1559:   [(parallel [(set (match_operand:DF 0 "register_operand" "")
                   1560:                   (neg:DF (match_operand:DF 1 "register_operand" "")))
                   1561:              (clobber (match_scratch:SI 2 ""))])]
                   1562:   ""
                   1563:   "
                   1564: {
                   1565:   rtx result;
                   1566:   rtx target;
                   1567:   rtx insns;
                   1568: 
                   1569:   if (! TARGET_29050)
                   1570:     {
                   1571:       start_sequence ();
                   1572:       target = operand_subword (operands[0], 0, 1, DFmode);
                   1573:       result = expand_binop (SImode, xor_optab,
                   1574:                             operand_subword_force (operands[1], 0, DFmode),
                   1575:                             GEN_INT(0x80000000), target, 0, OPTAB_WIDEN);
                   1576:       if (result == 0)
                   1577:        abort ();
                   1578: 
                   1579:       if (result != target)
                   1580:        emit_move_insn (result, target);
                   1581:   
                   1582:       emit_move_insn (operand_subword (operands[0], 1, 1, DFmode),
                   1583:                      operand_subword_force (operands[1], 1, DFmode));
                   1584: 
                   1585:       insns = get_insns ();
                   1586:       end_sequence ();
                   1587: 
                   1588:       emit_no_conflict_block (insns, operands[0], operands[1], 0, 0);
                   1589:       DONE;
                   1590:     }
                   1591: }")
                   1592: 
                   1593: ;; Sign extend and truncation operations.
                   1594: (define_insn "zero_extendqihi2"
                   1595:   [(set (match_operand:HI 0 "gpc_reg_operand" "=r")
                   1596:        (zero_extend:HI (match_operand:QI 1 "gpc_reg_operand" "r")))]
                   1597:   ""
                   1598:   "and %0,%1,255")
                   1599: 
                   1600: (define_insn "zero_extendqisi2"
                   1601:   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
                   1602:        (zero_extend:SI (match_operand:QI 1 "gpc_reg_operand" "r")))]
                   1603:   ""
                   1604:   "and %0,%1,255")
                   1605: 
                   1606: (define_insn "zero_extendhisi2"
                   1607:   [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
                   1608:        (zero_extend:SI (match_operand:HI 1 "gpc_reg_operand" "0")))]
                   1609:   ""
                   1610:   "consth %0,0")
                   1611: 
                   1612: (define_expand "extendqihi2"
                   1613:   [(set (match_dup 2)
                   1614:        (ashift:SI (match_operand:QI 1 "gpc_reg_operand" "")
                   1615:                   (const_int 24)))
                   1616:    (set (match_operand:HI 0 "gpc_reg_operand" "")
                   1617:        (ashiftrt:SI (match_dup 2)
                   1618:                     (const_int 24)))]
                   1619:   ""
                   1620:   "
                   1621: { operands[0] = gen_lowpart (SImode, operands[0]);
                   1622:   operands[1] = gen_lowpart (SImode, operands[1]);
                   1623:   operands[2] = gen_reg_rtx (SImode); }")
                   1624: 
                   1625: (define_expand "extendqisi2"
                   1626:   [(set (match_dup 2)
                   1627:        (ashift:SI (match_operand:QI 1 "gpc_reg_operand" "")
                   1628:                   (const_int 24)))
                   1629:    (set (match_operand:SI 0 "gpc_reg_operand" "")
                   1630:        (ashiftrt:SI (match_dup 2)
                   1631:                     (const_int 24)))]
                   1632:   ""
                   1633:   "
                   1634: { operands[1] = gen_lowpart (SImode, operands[1]);
                   1635:   operands[2] = gen_reg_rtx (SImode); }")
                   1636: 
                   1637: (define_expand "extendhisi2"
                   1638:   [(set (match_dup 2)
                   1639:        (ashift:SI (match_operand:HI 1 "gpc_reg_operand" "")
                   1640:                   (const_int 16)))
                   1641:    (set (match_operand:SI 0 "gpc_reg_operand" "")
                   1642:        (ashiftrt:SI (match_dup 2)
                   1643:                     (const_int 16)))]
                   1644:   ""
                   1645:   "
                   1646: { operands[1] = gen_lowpart (SImode, operands[1]);
                   1647:   operands[2] = gen_reg_rtx (SImode); }")
                   1648: 
                   1649: ;; Define the methods used to move data around.
                   1650: ;;
                   1651: ;; movsi:
                   1652: ;;
                   1653: ;; If storing into memory, force source into register.
                   1654: (define_expand "movsi"
                   1655:   [(set (match_operand:SI 0 "general_operand" "")
                   1656:        (match_operand:SI 1 "general_operand" ""))]
                   1657:   ""
                   1658:   "
                   1659: {
                   1660:   if (GET_CODE (operands[0]) == MEM && ! gpc_reg_operand (operands[1], SImode))
                   1661:     operands[1] = copy_to_mode_reg (SImode, operands[1]);
                   1662:   else if (spec_reg_operand (operands[0], SImode)
                   1663:           && ! (register_operand (operands[1], SImode)
                   1664:                 || cint_16_operand (operands[1], SImode)))
                   1665:     operands[1] = force_reg (SImode, operands[1]);
                   1666: }")
                   1667: 
                   1668: (define_expand "movpsi"
                   1669:   [(set (match_operand:PSI 0 "general_operand" "")
                   1670:        (match_operand:PSI 1 "general_operand" ""))]
                   1671:   ""
                   1672:   "
                   1673: {
                   1674:   if (GET_CODE (operands[0]) == MEM
                   1675:       && ! gpc_reg_operand (operands[1], PSImode))
                   1676:     operands[1] = copy_to_mode_reg (PSImode, operands[1]);
                   1677:   else if (spec_reg_operand (operands[0], PSImode)
                   1678:           && ! (register_operand (operands[1], PSImode)
                   1679:                 || cint_16_operand (operands[1], PSImode)))
                   1680:     operands[1] = force_reg (PSImode, operands[1]);
                   1681: }")
                   1682: 
                   1683: (define_split
                   1684:   [(set (match_operand:SI 0 "gpc_reg_operand" "")
                   1685:        (match_operand:SI 1 "long_const_operand" ""))]
                   1686:   ""
                   1687:   [(set (match_dup 0)
                   1688:        (and:SI (match_dup 1)
                   1689:                (const_int 65535)))
                   1690:    (set (match_dup 0)
                   1691:        (ior:SI (zero_extend:SI (match_dup 2))
                   1692:                (and:SI (match_dup 1)
                   1693:                        (const_int -65536))))]
                   1694:   " operands[2] = gen_lowpart (HImode, operands[0]); ")
                   1695: 
                   1696: ;; Subroutines to load/store halfwords.  Operands 0 and 1 are the output and
                   1697: ;; input, respectively, except that the address is passed for a MEM instead 
                   1698: ;; of the MEM itself and the short item is passed in QImode.
                   1699: ;;
                   1700: ;; Operand 2 is a scratch general register and operand 3 is a scratch register
                   1701: ;; used for BP.  When called before reload, pseudos are passed for both
                   1702: ;; operands.  During reload, R_TAV is used for the general register, and
                   1703: ;; a reload register of class BR_REGS (R_VP) for BP.
                   1704: ;;
                   1705: ;; We have two versions of the store operations, for when halfword writes are
                   1706: ;; supported and when they are not.
                   1707: (define_expand "loadhi"
                   1708:   [(parallel [(set (match_operand:SI 2 "gpc_reg_operand" "")
                   1709:                   (mem:SI (and:SI (match_operand:SI 1 "gpc_reg_operand" "")
                   1710:                                   (const_int -4))))
                   1711:              (set (match_operand:PSI 3 "register_operand" "")
                   1712:                   (truncate:PSI (match_dup 1)))])
                   1713:    (set (match_operand:SI 0 "gpc_reg_operand" "")
                   1714:        (zero_extract:SI (match_dup 2)
                   1715:                         (const_int 16)
                   1716:                         (ashift:PSI (match_dup 3) (const_int 3))))]
                   1717:   ""
                   1718:   "")
                   1719: 
                   1720: (define_expand "storehinhww"
                   1721:  [(parallel [(set (match_operand:SI 2 "gpc_reg_operand" "")
                   1722:                   (mem:SI (and:SI (match_operand:SI 0 "gpc_reg_operand" "")
                   1723:                                   (const_int -4))))
                   1724:              (set (match_operand:PSI 3 "register_operand" "")
                   1725:                   (truncate:PSI (match_dup 0)))])
                   1726:    (set (zero_extract:SI (match_dup 2)
                   1727:                         (const_int 16)
                   1728:                         (ashift:PSI (match_dup 3) (const_int 3)))
                   1729:        (match_operand:SI 1 "gpc_reg_operand" ""))
                   1730:    (set (mem:SI (match_dup 0))
                   1731:        (match_dup 2))]
                   1732:   ""
                   1733:   "")
                   1734: 
                   1735: (define_expand "storehihww"
                   1736:   [(set (match_operand:PSI 3 "register_operand" "")
                   1737:        (truncate:PSI (match_operand:SI 0 "gpc_reg_operand" "")))
                   1738:    (set (match_operand:SI 2 "gpc_reg_operand" "")
                   1739:        (ior:SI (and:SI (not:SI (ashift:SI (const_int 65535)
                   1740:                                           (ashift:PSI (match_dup 3)
                   1741:                                                       (const_int 3))))
                   1742:                        (match_operand:SI 1 "gpc_reg_operand" ""))
                   1743:                (ashift:SI (zero_extend:SI (match_dup 4))
                   1744:                           (ashift:PSI (match_dup 3) (const_int 3)))))
                   1745:    (set (mem:SI (and:SI (match_dup 0)
                   1746:                        (const_int -3)))
                   1747:        (match_dup 2))]
                   1748:   ""
                   1749:   "
                   1750: { operands[4] = gen_lowpart (HImode, operands[1]); }")
                   1751: 
                   1752: (define_expand "movhi"
                   1753:   [(set (match_operand:HI 0 "general_operand" "")
                   1754:        (match_operand:HI 1 "general_operand" ""))]
                   1755:   ""
                   1756:   "
                   1757: { if (GET_CODE (operands[0]) == MEM) 
                   1758:     {
                   1759:       if (! gpc_reg_operand (operands[1], HImode))
                   1760:        operands[1] = copy_to_mode_reg (HImode, operands[1]);
                   1761:       if (! TARGET_DW_ENABLE)
                   1762:        {
                   1763:          rtx general = gen_reg_rtx (SImode);
                   1764:          rtx bp = gen_reg_rtx (PSImode);
                   1765:          rtx (*fcn) ()
                   1766:            = TARGET_BYTE_WRITES ? gen_storehihww : gen_storehinhww;
                   1767:          rtx seq = (*fcn) (XEXP (operands[0], 0),
                   1768:                            gen_lowpart (SImode, operands[1]),
                   1769:                            general, bp);
                   1770:            
                   1771:          a29k_set_memflags (seq, operands[0]);
                   1772:          emit_insn (seq);
                   1773:          DONE;
                   1774:        }
                   1775:     }
                   1776:   else if (GET_CODE (operands[1]) == MEM)
                   1777:     {
                   1778:       if (! TARGET_DW_ENABLE)
                   1779:        {
                   1780:          rtx general = gen_reg_rtx (SImode);
                   1781:          rtx bp = gen_reg_rtx (PSImode);
                   1782:          rtx seq = gen_loadqi (gen_lowpart (SImode, operands[0]),
                   1783:                                XEXP (operands[1], 0), general, bp);
                   1784: 
                   1785:          a29k_set_memflags (seq, operands[1]);
                   1786:          emit_insn (seq);
                   1787:          DONE;
                   1788:        }
                   1789:     }
                   1790: }")
                   1791: 
                   1792: (define_expand "reload_inhi"
                   1793:   [(parallel [(match_operand:SI 0 "register_operand" "=r")
                   1794:              (match_operand:SI 1 "reload_memory_operand" "m")
                   1795:              (match_operand:PSI 2 "register_operand" "=b")])]
                   1796:   "! TARGET_DW_ENABLE"
                   1797:   "
                   1798: { rtx seq = gen_loadhi (gen_lowpart (SImode, operands[0]),
                   1799:                        a29k_get_reloaded_address (operands[1]),
                   1800:                        gen_rtx (REG, SImode, R_TAV),
                   1801:                        operands[2]);
                   1802: 
                   1803:   a29k_set_memflags (seq, operands[1]);
                   1804:   emit_insn (seq);
                   1805:   DONE;
                   1806: }")
                   1807: 
                   1808: (define_expand "reload_outhi"
                   1809:   [(parallel [(match_operand:SI 0 "reload_memory_operand" "=m")
                   1810:              (match_operand:SI 1 "register_operand" "m")
                   1811:              (match_operand:PSI 2 "register_operand" "=b")])]
                   1812:   "! TARGET_DW_ENABLE"
                   1813:   "
                   1814: { rtx (*fcn) () = TARGET_BYTE_WRITES ? gen_storehihww : gen_storehinhww;
                   1815:   rtx seq = (*fcn) (a29k_get_reloaded_address (operands[0]),
                   1816:                    gen_lowpart (SImode, operands[1]),
                   1817:                    gen_rtx (REG, SImode, R_TAV), operands[2]);
                   1818: 
                   1819:   a29k_set_memflags (seq, operands[0]);
                   1820:   emit_insn (seq);
                   1821:   DONE;
                   1822: }")
                   1823: 
                   1824: ;; Subroutines to load/store bytes.  Operands 0 and 1 are the output and
                   1825: ;; input, respectively, except that the address is passed for a MEM instead 
                   1826: ;; of the MEM itself and the short item is passed in QImode.
                   1827: ;;
                   1828: ;; Operand 2 is a scratch general register and operand 3 is a scratch register
                   1829: ;; used for BP.  When called before reload, pseudos are passed for both
                   1830: ;; operands.  During reload, R_TAV is used for the general register, and
                   1831: ;; a reload register of class BR_REGS (R_VP) for BP.
                   1832: ;;
                   1833: ;; We have two versions of the store operations, for when byte writes are
                   1834: ;; supported and when they are not.
                   1835: (define_expand "loadqi"
                   1836:   [(parallel [(set (match_operand:SI 2 "gpc_reg_operand" "")
                   1837:                   (mem:SI (and:SI (match_operand:SI 1 "gpc_reg_operand" "")
                   1838:                                   (const_int -4))))
                   1839:              (set (match_operand:PSI 3 "register_operand" "")
                   1840:                   (truncate:PSI (match_dup 1)))])
                   1841:    (set (match_operand:SI 0 "gpc_reg_operand" "")
                   1842:        (zero_extract:SI (match_dup 2)
                   1843:                         (const_int 8)
                   1844:                         (ashift:PSI (match_dup 3) (const_int 3))))]
                   1845:   ""
                   1846:   "")
                   1847: 
                   1848: (define_expand "storeqinhww"
                   1849:   [(parallel [(set (match_operand:SI 2 "gpc_reg_operand" "")
                   1850:                   (mem:SI (and:SI (match_operand:SI 0 "gpc_reg_operand" "")
                   1851:                                   (const_int -4))))
                   1852:              (set (match_operand:PSI 3 "register_operand" "")
                   1853:                   (truncate:PSI (match_dup 0)))])
                   1854:    (set (zero_extract:SI (match_dup 2)
                   1855:                         (const_int 8)
                   1856:                         (ashift:PSI (match_dup 3)
                   1857:                                     (const_int 3)))
                   1858:        (match_operand:SI 1 "gpc_reg_operand" ""))
                   1859:    (set (mem:SI (match_dup 0))
                   1860:        (match_dup 2))]
                   1861:   ""
                   1862:   "")
                   1863: 
                   1864: (define_expand "storeqihww"
                   1865:   [(set (match_operand:PSI 3 "register_operand" "")
                   1866:        (truncate:PSI (match_operand:SI 0 "gpc_reg_operand" "")))
                   1867:    (set (match_operand:SI 2 "gpc_reg_operand" "")
                   1868:        (ior:SI (and:SI (not:SI (ashift:SI (const_int 255)
                   1869:                                           (ashift:PSI (match_dup 3)
                   1870:                                                       (const_int 3))))
                   1871:                        (match_operand:SI 1 "gpc_reg_operand" ""))
                   1872:                (ashift:SI (zero_extend:SI (match_dup 4))
                   1873:                           (ashift:PSI (match_dup 3)
                   1874:                                       (const_int 3)))))
                   1875:    (set (mem:SI (and:SI (match_dup 0)
                   1876:                        (const_int -4)))
                   1877:        (match_dup 2))]
                   1878:   ""
                   1879:   "
                   1880: { operands[4] = gen_lowpart (QImode, operands[1]); }")
                   1881: 
                   1882: (define_expand "movqi"
                   1883:   [(set (match_operand:QI 0 "general_operand" "")
                   1884:        (match_operand:QI 1 "general_operand" ""))]
                   1885:   ""
                   1886:   "
                   1887: { if (GET_CODE (operands[0]) == MEM)
                   1888:     {
                   1889:       if (! gpc_reg_operand (operands[1], QImode))
                   1890:        operands[1] = copy_to_mode_reg (QImode, operands[1]);
                   1891:       if (! TARGET_DW_ENABLE)
                   1892:        {
                   1893:          rtx general = gen_reg_rtx (SImode);
                   1894:          rtx bp = gen_reg_rtx (PSImode);
                   1895:          rtx (*fcn) ()
                   1896:            = TARGET_BYTE_WRITES ? gen_storeqihww : gen_storeqinhww;
                   1897:          rtx seq = (*fcn) (XEXP (operands[0], 0),
                   1898:                            gen_lowpart (SImode, operands[1]),
                   1899:                            general, bp);
                   1900:            
                   1901:          a29k_set_memflags (seq, operands[0]);
                   1902:          emit_insn (seq);
                   1903:        }
                   1904:     }
                   1905:   else if (GET_CODE (operands[1]) == MEM)
                   1906:     {
                   1907:       if (! TARGET_DW_ENABLE)
                   1908:        {
                   1909:          rtx general = gen_reg_rtx (SImode);
                   1910:          rtx bp = gen_reg_rtx (PSImode);
                   1911:          rtx seq = gen_loadqi (gen_lowpart (SImode, operands[0]),
                   1912:                                XEXP (operands[1], 0), general, bp);
                   1913: 
                   1914:          a29k_set_memflags (seq, operands[1]);
                   1915:          emit_insn (seq);
                   1916:          DONE;
                   1917:        }
                   1918:     }
                   1919: }")
                   1920: 
                   1921: (define_expand "reload_inqi"
                   1922:   [(parallel [(match_operand:SI 0 "register_operand" "=r")
                   1923:              (match_operand:SI 1 "reload_memory_operand" "m")
                   1924:              (match_operand:PSI 2 "register_operand" "=b")])]
                   1925:   "! TARGET_DW_ENABLE"
                   1926:   "
                   1927: { rtx seq = gen_loadqi (gen_lowpart (SImode, operands[0]),
                   1928:                        a29k_get_reloaded_address (operands[1]),
                   1929:                        gen_rtx (REG, SImode, R_TAV),
                   1930:                        operands[2]);
                   1931: 
                   1932:   a29k_set_memflags (seq, operands[1]);
                   1933:   emit_insn (seq);
                   1934:   DONE;
                   1935: }")
                   1936: 
                   1937: (define_expand "reload_outqi"
                   1938:   [(parallel [(match_operand:SI 0 "reload_memory_operand" "=m")
                   1939:              (match_operand:SI 1 "register_operand" "m")
                   1940:              (match_operand:PSI 2 "register_operand" "=b")])]
                   1941:   "! TARGET_DW_ENABLE"
                   1942:   "
                   1943: { rtx (*fcn) () = TARGET_BYTE_WRITES ? gen_storeqihww : gen_storeqinhww;
                   1944:   rtx seq = (*fcn) (a29k_get_reloaded_address (operands[0]),
                   1945:                    gen_lowpart (SImode, operands[1]),
                   1946:                    gen_rtx (REG, SImode, R_TAV), operands[2]);
                   1947: 
                   1948:   a29k_set_memflags (seq, operands[0]);
                   1949:   emit_insn (seq);
                   1950:   DONE;
                   1951: }")
                   1952: 
                   1953: ;; Now the actual insns used to move data around.  We include here the
                   1954: ;; DEFINE_SPLITs that may be needed.  In some cases these will be
                   1955: ;; split again.  For floating-point, if we can look inside the constant,
                   1956: ;; always split it.  This can eliminate unnecessary insns.
                   1957: (define_insn ""
                   1958:   [(set (match_operand:SF 0 "out_operand" "=r,r,r,r,m")
                   1959:        (match_operand:SF 1 "in_operand" "r,E,F,m,r"))]
                   1960:   "(gpc_reg_operand (operands[0], SFmode)
                   1961:     || gpc_reg_operand (operands[1], SFmode))
                   1962:    && ! TARGET_29050"
                   1963:   "@
                   1964:    sll %0,%1,0
                   1965:    #
                   1966:    const %0,%1\;consth %0,%1
                   1967:    load 0,0,%0,%1
                   1968:    store 0,0,%1,%0"
                   1969:   [(set_attr "type" "misc,multi,multi,load,store")])
                   1970: 
                   1971: (define_insn ""
                   1972:   [(set (match_operand:SF 0 "out_operand" "=r,r,r,r,m,*a,r")
                   1973:        (match_operand:SF 1 "in_operand" "r,E,F,m,r,r,*a"))]
                   1974:   "(gpc_reg_operand (operands[0], SFmode)
                   1975:     || gpc_reg_operand (operands[1], SFmode))
                   1976:    && TARGET_29050"
                   1977:   "@
                   1978:    sll %0,%1,0
                   1979:    #
                   1980:    const %0,%1\;consth %0,%1
                   1981:    load 0,0,%0,%1
                   1982:    store 0,0,%1,%0
                   1983:    mtacc %1,1,%0
                   1984:    mfacc %0,1,%1"
                   1985:   [(set_attr "type" "misc,multi,multi,load,store,fadd,fadd")])
                   1986: 
                   1987: ;; Turn this into SImode.  It will then be split up that way.
                   1988: (define_split
                   1989:   [(set (match_operand:SF 0 "register_operand" "")
                   1990:        (match_operand:SF 1 "float_const_operand" ""))]
                   1991:   "HOST_FLOAT_FORMAT == TARGET_FLOAT_FORMAT"
                   1992:   [(set (match_dup 0)
                   1993:        (match_dup 1))]
                   1994:   "
                   1995: { operands[0] = operand_subword (operands[0], 0, 0, SFmode);
                   1996:   operands[1] = operand_subword (operands[1], 0, 0, SFmode);
                   1997: 
                   1998:   if (operands[0] == 0 || operands[1] == 0)
                   1999:     FAIL;
                   2000: }")
                   2001: 
                   2002: (define_insn ""
                   2003:   [(set (match_operand:DF 0 "out_operand" "=?r,?r,r,m")
                   2004:        (match_operand:DF 1 "in_operand" "rE,F,m,r"))
                   2005:    (clobber (match_scratch:PSI 2 "=X,X,&c,&c"))]
                   2006:   "(gpc_reg_operand (operands[0], DFmode)
                   2007:     || gpc_reg_operand (operands[1], DFmode))
                   2008:    && ! TARGET_29050"
                   2009:   "@
                   2010:    #
                   2011:    const %0,%1\;consth %0,%1\;const %L0,%L1\;consth %L0,%L1
                   2012:    mtsrim cr,1\;loadm 0,0,%0,%1
                   2013:    mtsrim cr,1\;storem 0,0,%1,%0"
                   2014:   [(set_attr "type" "multi")])
                   2015: 
                   2016: (define_insn ""
                   2017:   [(set (match_operand:DF 0 "out_operand" "=?r,?r,r,m,?*a,?r")
                   2018:        (match_operand:DF 1 "in_operand" "rE,F,m,r,r,*a"))
                   2019:    (clobber (match_scratch:PSI 2 "=X,X,&c,&c,X,X"))]
                   2020:   "(gpc_reg_operand (operands[0], DFmode)
                   2021:     || gpc_reg_operand (operands[1], DFmode))
                   2022:    && TARGET_29050"
                   2023:   "@
                   2024:    #
                   2025:    const %0,%1\;consth %0,%1\;const %L0,%L1\;consth %L0,%L1
                   2026:    mtsrim cr,1\;loadm 0,0,%0,%1
                   2027:    mtsrim cr,1\;storem 0,0,%1,%0
                   2028:    mtacc %1,2,%0
                   2029:    mfacc %0,2,%1"
                   2030:   [(set_attr "type" "multi,multi,multi,multi,fadd,fadd")])
                   2031: 
                   2032: ;; Split register-register copies and constant loads into two SImode loads,
                   2033: ;; one for each word.  In the constant case, they will get further split.
                   2034: ;; Don't so this until register allocation, though, since it will
                   2035: ;; interfere with register allocation.  Normally copy the lowest-addressed
                   2036: ;; word first; the exception is if we are copying register to register and
                   2037: ;; the lowest register of the first operand is the highest register of the
                   2038: ;; second operand.
                   2039: (define_split
                   2040:   [(set (match_operand:DF 0 "gpc_reg_operand" "")
                   2041:        (match_operand:DF 1 "gpc_reg_or_float_constant_operand" ""))
                   2042:    (clobber (match_scratch:PSI 2 ""))]
                   2043:   "reload_completed"
                   2044:   [(set (match_dup 3) (match_dup 4))
                   2045:    (set (match_dup 5) (match_dup 6))]
                   2046:   "
                   2047: { if (GET_CODE (operands[1]) == REG
                   2048:       && REGNO (operands[0]) == REGNO (operands[1]) + 1)
                   2049:     {
                   2050:       operands[3] = operand_subword (operands[0], 1, 1, DFmode);
                   2051:       operands[4] = operand_subword (operands[1], 1, 1, DFmode);
                   2052:       operands[5] = operand_subword (operands[0], 0, 1, DFmode);
                   2053:       operands[6] = operand_subword (operands[1], 0, 1, DFmode);
                   2054:     }
                   2055:   else
                   2056:     {
                   2057:       operands[3] = operand_subword (operands[0], 0, 1, DFmode);
                   2058:       operands[4] = operand_subword (operands[1], 0, 1, DFmode);
                   2059:       operands[5] = operand_subword (operands[0], 1, 1, DFmode);
                   2060:       operands[6] = operand_subword (operands[1], 1, 1, DFmode);
                   2061:     }
                   2062: 
                   2063:   if (operands[3] == 0 || operands[4] == 0
                   2064:       || operands[5] == 0 || operands[6] == 0)
                   2065:     FAIL;
                   2066: }")
                   2067: 
                   2068: ;; Split memory loads and stores into the MTSR and LOADM/STOREM.
                   2069: (define_split
                   2070:   [(set (match_operand:DF 0 "out_operand" "")
                   2071:        (match_operand:DF 1 "in_operand" ""))
                   2072:    (clobber (reg:PSI 179))]
                   2073:   "TARGET_NO_STOREM_BUG
                   2074:    && (memory_operand (operands[0], DFmode)
                   2075:        || memory_operand (operands[1], DFmode))"
                   2076:   [(set (reg:PSI 179) (const_int 1))
                   2077:    (parallel [(set (match_dup 0) (match_dup 1))
                   2078:              (use (reg:PSI 179))
                   2079:              (clobber (reg:PSI 179))])]
                   2080:   "")
                   2081: 
                   2082: ;; DI move is similar to DF move.
                   2083: (define_insn ""
                   2084:   [(set (match_operand:DI 0 "out_operand" "=?r,r,m")
                   2085:        (match_operand:DI 1 "in_operand" "rn,m,r"))
                   2086:    (clobber (match_scratch:PSI 2 "=X,&c,&c"))]
                   2087:   "(gpc_reg_operand (operands[0], DImode)
                   2088:      || gpc_reg_operand (operands[1], DImode))"
                   2089:   "@
                   2090:    #
                   2091:    mtsrim cr,1\;loadm 0,0,%0,%1
                   2092:    mtsrim cr,1\;storem 0,0,%1,%0"
                   2093:   [(set_attr "type" "multi")])
                   2094: 
                   2095: (define_split
                   2096:   [(set (match_operand:DI 0 "gpc_reg_operand" "")
                   2097:        (match_operand:DI 1 "gpc_reg_or_integer_constant_operand" ""))
                   2098:    (clobber (match_scratch:PSI 2 ""))]
                   2099:   "reload_completed"
                   2100:   [(set (match_dup 3) (match_dup 4))
                   2101:    (set (match_dup 5) (match_dup 6))]
                   2102:   "
                   2103: { if (GET_CODE (operands[1]) == REG
                   2104:       && REGNO (operands[0]) == REGNO (operands[1]) + 1)
                   2105:     {
                   2106:       operands[3] = operand_subword (operands[0], 1, 1, DImode);
                   2107:       operands[4] = operand_subword (operands[1], 1, 1, DImode);
                   2108:       operands[5] = operand_subword (operands[0], 0, 1, DImode);
                   2109:       operands[6] = operand_subword (operands[1], 0, 1, DImode);
                   2110:     }
                   2111:   else
                   2112:     {
                   2113:       operands[3] = operand_subword (operands[0], 0, 1, DImode);
                   2114:       operands[4] = operand_subword (operands[1], 0, 1, DImode);
                   2115:       operands[5] = operand_subword (operands[0], 1, 1, DImode);
                   2116:       operands[6] = operand_subword (operands[1], 1, 1, DImode);
                   2117:     }
                   2118: }")
                   2119: 
                   2120: (define_split
                   2121:   [(set (match_operand:DI 0 "out_operand" "")
                   2122:        (match_operand:DI 1 "in_operand" ""))
                   2123:    (clobber (reg:PSI 179))]
                   2124:   "TARGET_NO_STOREM_BUG
                   2125:    && (memory_operand (operands[0], DImode)
                   2126:        || memory_operand (operands[1], DImode))"
                   2127:   [(set (reg:PSI 179) (const_int 1))
                   2128:    (parallel [(set (match_dup 0) (match_dup 1))
                   2129:              (use (reg:PSI 179))
                   2130:              (clobber (reg:PSI 179))])]
                   2131:   "")
                   2132: 
                   2133: ;; TImode moves are very similar to DImode moves, except that we can't
                   2134: ;; have constants.
                   2135: (define_insn ""
                   2136:   [(set (match_operand:TI 0 "out_operand" "=?r,r,m")
                   2137:        (match_operand:TI 1 "in_operand" "r,m,r"))
                   2138:    (clobber (match_scratch:PSI 2 "=X,&c,&c"))]
                   2139:   "(gpc_reg_operand (operands[0], TImode)
                   2140:     || gpc_reg_operand (operands[1], TImode))"
                   2141:   "@
                   2142:    #
                   2143:    mtsrim cr,3\;loadm 0,0,%0,%1
                   2144:    mtsrim cr,3\;storem 0,0,%1,%0"
                   2145:   [(set_attr "type" "multi,multi,multi")])
                   2146: 
                   2147: (define_split
                   2148:   [(set (match_operand:TI 0 "gpc_reg_operand" "")
                   2149:        (match_operand:TI 1 "gpc_reg_operand" ""))
                   2150:    (clobber (match_scratch:PSI 2 ""))]
                   2151:   "reload_completed"
                   2152:   [(set (match_dup 3) (match_dup 4))
                   2153:    (set (match_dup 5) (match_dup 6))
                   2154:    (set (match_dup 7) (match_dup 8))
                   2155:    (set (match_dup 9) (match_dup 10))]
                   2156:   "
                   2157: {
                   2158:   if (REGNO (operands[0]) >= REGNO (operands[1]) + 1
                   2159:       && REGNO (operands[0]) <= REGNO (operands[1]) + 3)
                   2160:     {
                   2161:       operands[3] = gen_rtx (REG, SImode, REGNO (operands[0]) + 3);
                   2162:       operands[4] = gen_rtx (REG, SImode, REGNO (operands[1]) + 3);
                   2163:       operands[5] = gen_rtx (REG, SImode, REGNO (operands[0]) + 2);
                   2164:       operands[6] = gen_rtx (REG, SImode, REGNO (operands[1]) + 2);
                   2165:       operands[7] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1);
                   2166:       operands[8] = gen_rtx (REG, SImode, REGNO (operands[1]) + 1);
                   2167:       operands[9] = gen_rtx (REG, SImode, REGNO (operands[0]));
                   2168:       operands[10] = gen_rtx (REG, SImode, REGNO (operands[1]));
                   2169:     }
                   2170:   else
                   2171:     {
                   2172:       operands[3] = gen_rtx (REG, SImode, REGNO (operands[0]));
                   2173:       operands[4] = gen_rtx (REG, SImode, REGNO (operands[1]));
                   2174:       operands[5] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1);
                   2175:       operands[6] = gen_rtx (REG, SImode, REGNO (operands[1]) + 1);
                   2176:       operands[7] = gen_rtx (REG, SImode, REGNO (operands[0]) + 2);
                   2177:       operands[8] = gen_rtx (REG, SImode, REGNO (operands[1]) + 2);
                   2178:       operands[9] = gen_rtx (REG, SImode, REGNO (operands[0]) + 3);
                   2179:       operands[10] = gen_rtx (REG, SImode, REGNO (operands[1]) + 3); 
                   2180:     }
                   2181: }")
                   2182: 
                   2183: (define_split
                   2184:   [(set (match_operand:TI 0 "out_operand" "")
                   2185:        (match_operand:TI 1 "in_operand" ""))
                   2186:    (clobber (reg:PSI 179))]
                   2187:   "TARGET_NO_STOREM_BUG
                   2188:    && (memory_operand (operands[0], TImode)
                   2189:        || memory_operand (operands[1], TImode))"
                   2190:   [(set (reg:PSI 179) (const_int 3))
                   2191:    (parallel [(set (match_dup 0) (match_dup 1))
                   2192:              (use (reg:PSI 179))
                   2193:              (clobber (reg:PSI 179))])]
                   2194:   "")
                   2195: 
                   2196: (define_insn ""
                   2197:   [(set (match_operand:SI 0 "out_operand" "=r,r,r,r,r,r,r,m,*h,*h")
                   2198:         (match_operand:SI 1 "in_operand" "r,J,M,O,i,m,*h,r,r,J"))]
                   2199:   "(gpc_reg_operand (operands[0], SImode)
                   2200:     || gpc_reg_operand (operands[1], SImode)
                   2201:     || (spec_reg_operand (operands[0], SImode)
                   2202:         && cint_16_operand (operands[1], SImode)))
                   2203:    && ! TARGET_29050"
                   2204:   "@
                   2205:    sll %0,%1,0
                   2206:    const %0,%1
                   2207:    constn %0,%M1
                   2208:    cpeq %0,gr1,gr1
                   2209:    #
                   2210:    load 0,0,%0,%1
                   2211:    mfsr %0,%1
                   2212:    store 0,0,%1,%0
                   2213:    mtsr %0,%1
                   2214:    mtsrim %0,%1"
                   2215:   [(set_attr "type" "misc,misc,misc,misc,multi,load,misc,store,misc,misc")])
                   2216: 
                   2217: (define_insn ""
                   2218:   [(set (match_operand:SI 0 "out_operand" "=r,r,r,r,r,r,r,m,*h,*h")
                   2219:         (match_operand:SI 1 "in_operand" "r,J,M,O,i,m,*h,r,r,J"))]
                   2220:   "(gpc_reg_operand (operands[0], SImode)
                   2221:     || gpc_reg_operand (operands[1], SImode)
                   2222:     || (spec_reg_operand (operands[0], SImode)
                   2223:         && cint_16_operand (operands[1], SImode)))
                   2224:    && TARGET_29050"
                   2225:   "@
                   2226:    sll %0,%1,0
                   2227:    const %0,%1
                   2228:    constn %0,%M1
                   2229:    consthz %0,%1
                   2230:    #
                   2231:    load 0,0,%0,%1
                   2232:    mfsr %0,%1
                   2233:    store 0,0,%1,%0
                   2234:    mtsr %0,%1
                   2235:    mtsrim %0,%1"
                   2236:   [(set_attr "type" "misc,misc,misc,misc,multi,load,misc,store,misc,misc")])
                   2237: 
                   2238: (define_insn ""
                   2239:   [(set (match_operand:PSI 0 "out_operand" "=*r,*r,*r,*r,m,h,h")
                   2240:         (match_operand:PSI 1 "in_operand" "r,i,m,h,r,r,J"))]
                   2241:   "(gpc_reg_operand (operands[0], PSImode)
                   2242:     || gpc_reg_operand (operands[1], PSImode)
                   2243:     || (spec_reg_operand (operands[0], PSImode)
                   2244:         && cint_16_operand (operands[1], PSImode)))"
                   2245:   "@
                   2246:    sll %0,%1,0
                   2247:    const %0,%1
                   2248:    load 0,0,%0,%1
                   2249:    mfsr %0,%1
                   2250:    store 0,0,%1,%0
                   2251:    mtsr %0,%1
                   2252:    mtsrim %0,%1"
                   2253:   [(set_attr "type" "misc,multi,load,misc,store,misc,misc")])
                   2254: 
                   2255: (define_insn ""
                   2256:   [(set (match_operand:HI 0 "out_operand" "=r,r,r,m,r,*h,*h")
                   2257:         (match_operand:HI 1 "in_operand" "r,i,m,r,*h,r,i"))]
                   2258:   "gpc_reg_operand (operands[0], HImode)
                   2259:    || gpc_reg_operand (operands[1], HImode)
                   2260:    || (spec_reg_operand (operands[0], HImode)
                   2261:        && cint_16_operand (operands[1], HImode))"
                   2262:   "@
                   2263:    sll %0,%1,0
                   2264:    const %0,%1
                   2265:    load 0,2,%0,%1
                   2266:    store 0,2,%1,%0
                   2267:    mfsr %0,%1
                   2268:    mtsr %0,%1
                   2269:    mtsrim %0,%1"
                   2270:   [(set_attr "type" "misc,misc,load,store,misc,misc,misc")])
                   2271: 
                   2272: (define_insn ""
                   2273:   [(set (match_operand:QI 0 "out_operand" "=r,r,r,m,r,*h,*h")
                   2274:         (match_operand:QI 1 "in_operand" "r,i,m,r,*h,r,i"))]
                   2275:   "gpc_reg_operand (operands[0], QImode)
                   2276:    || gpc_reg_operand (operands[1], QImode)
                   2277:    || (spec_reg_operand (operands[0], HImode)
                   2278:        && cint_16_operand (operands[1], HImode))"
                   2279:   "@
                   2280:    sll %0,%1,0
                   2281:    const %0,%1
                   2282:    load 0,1,%0,%1
                   2283:    store 0,1,%1,%0
                   2284:    mfsr %0,%1
                   2285:    mtsr %0,%1
                   2286:    mtsrim %0,%1"
                   2287:   [(set_attr "type" "misc,misc,load,store,misc,misc,misc")])
                   2288: 
                   2289: ;; Define move insns for DI, TI, SF, and DF.
                   2290: ;;
                   2291: ;; In no case do we support mem->mem directly.
                   2292: ;;
                   2293: ;; For DI move of constant to register, split apart at this time since these
                   2294: ;; can require anywhere from 2 to 4 insns and determining which is complex.
                   2295: ;;
                   2296: ;; In other cases, handle similarly to SImode moves.
                   2297: ;;
                   2298: ;; However, indicate that DI, TI, and DF moves may clobber CR (reg 179).
                   2299: (define_expand "movdi"
                   2300:   [(parallel [(set (match_operand:DI 0 "general_operand" "")
                   2301:                   (match_operand:DI 1 "general_operand" ""))
                   2302:              (clobber (scratch:PSI))])]
                   2303:   ""
                   2304:   "
                   2305: {
                   2306:   if (GET_CODE (operands[0]) == MEM)
                   2307:     operands[1] = force_reg (DImode, operands[1]);
                   2308: }")
                   2309: 
                   2310: (define_expand "movsf"
                   2311:   [(set (match_operand:SF 0 "general_operand" "")
                   2312:        (match_operand:SF 1 "general_operand" ""))]
                   2313:   ""
                   2314:   "
                   2315: { if (GET_CODE (operands[0]) == MEM)
                   2316:     operands[1] = force_reg (SFmode, operands[1]);
                   2317: }")
                   2318: 
                   2319: (define_expand "movdf"
                   2320:   [(parallel [(set (match_operand:DF 0 "general_operand" "")
                   2321:                   (match_operand:DF 1 "general_operand" ""))
                   2322:              (clobber (scratch:PSI))])]
                   2323:   ""
                   2324:   "
                   2325: { if (GET_CODE (operands[0]) == MEM)
                   2326:     operands[1] = force_reg (DFmode, operands[1]);
                   2327: }")
                   2328: 
                   2329: (define_expand "movti"
                   2330:   [(parallel [(set (match_operand:TI 0 "general_operand" "")
                   2331:                   (match_operand:TI 1 "general_operand" ""))
                   2332:              (clobber (scratch:PSI))])]
                   2333:   ""
                   2334:   "
                   2335: {
                   2336:   if (GET_CODE (operands[0]) == MEM)
                   2337:     operands[1] = force_reg (TImode, operands[1]);
                   2338: 
                   2339:   /* We can't handle constants in general because there is no rtl to represent
                   2340:      128 bit constants.  Splitting happens to work for CONST_INTs so we split
                   2341:      them for good code.  Other constants will get forced to memory.  */
                   2342: 
                   2343:   if (GET_CODE (operands[1]) == CONST_INT)
                   2344:     {
                   2345:      rtx part0, part1, part2, part3;
                   2346: 
                   2347:      part0 = operand_subword (operands[0], 0, 1, TImode);
                   2348:      part1 = operand_subword (operands[0], 1, 1, TImode);
                   2349:      part2 = operand_subword (operands[0], 2, 1, TImode);
                   2350:      part3 = operand_subword (operands[0], 3, 1, TImode);
                   2351: 
                   2352:      emit_move_insn (part0, const0_rtx);
                   2353:      emit_move_insn (part1, const0_rtx);
                   2354:      emit_move_insn (part2, const0_rtx);
                   2355:      emit_move_insn (part3, const0_rtx);
                   2356: 
                   2357:      DONE;
                   2358:     }
                   2359:   else if (CONSTANT_P (operands[1]))
                   2360:     {
                   2361:       operands[1] = force_const_mem (TImode, operands[1]);
                   2362:       if (! memory_address_p (TImode, XEXP (operands[1], 0))
                   2363:          && ! reload_in_progress)
                   2364:         operands[1] = change_address (operands[1], TImode,
                   2365:                                      XEXP (operands[1], 0));
                   2366:     }
                   2367: }")
                   2368: 
                   2369: ;; Here are the variants of the above for use during reload.
                   2370: 
                   2371: (define_expand "reload_indf"
                   2372:   [(parallel [(set (match_operand:DF 0 "register_operand" "=r")
                   2373:                   (match_operand:DF 1 "reload_memory_operand" "m"))
                   2374:              (clobber (match_operand:PSI 2 "register_operand" "=&c"))])]
                   2375:   ""
                   2376:   "")
                   2377: 
                   2378: (define_expand "reload_outdf"
                   2379:   [(parallel [(set (match_operand:DF 0 "reload_memory_operand" "=m")
                   2380:                   (match_operand:DF 1 "register_operand" "r"))
                   2381:              (clobber (match_operand:PSI 2 "register_operand" "=&c"))])]
                   2382:   ""
                   2383:   "")
                   2384: 
                   2385: (define_expand "reload_indi"
                   2386:   [(parallel [(set (match_operand:DI 0 "register_operand" "=r")
                   2387:                   (match_operand:DI 1 "reload_memory_operand" "m"))
                   2388:              (clobber (match_operand:PSI 2 "register_operand" "=&c"))])]
                   2389:   ""
                   2390:   "")
                   2391: 
                   2392: (define_expand "reload_outdi"
                   2393:   [(parallel [(set (match_operand:DI 0 "reload_memory_operand" "=m")
                   2394:                   (match_operand:DI 1 "register_operand" "r"))
                   2395:              (clobber (match_operand:PSI 2 "register_operand" "=&c"))])]
                   2396:   ""
                   2397:   "")
                   2398: 
                   2399: (define_expand "reload_inti"
                   2400:   [(parallel [(set (match_operand:TI 0 "register_operand" "=r")
                   2401:                   (match_operand:TI 1 "reload_memory_operand" "m"))
                   2402:              (clobber (match_operand:PSI 2 "register_operand" "=&c"))])]
                   2403:   ""
                   2404:   "")
                   2405: 
                   2406: (define_expand "reload_outti"
                   2407:   [(parallel [(set (match_operand:TI 0 "reload_memory_operand" "=m")
                   2408:                   (match_operand:TI 1 "register_operand" "r"))
                   2409:              (clobber (match_operand:PSI 2 "register_operand" "=&c"))])]
                   2410:   ""
                   2411:   "")
                   2412: 
                   2413: ;; For compare operations, we simply store the comparison operands and
                   2414: ;; do nothing else.  The following branch or scc insn will output whatever
                   2415: ;; is needed.
                   2416: (define_expand "cmpsi"
                   2417:   [(set (cc0)
                   2418:        (compare (match_operand:SI 0 "gpc_reg_operand" "")
                   2419:                 (match_operand:SI 1 "srcb_operand" "")))]
                   2420:   ""
                   2421:   "
                   2422: {
                   2423:   a29k_compare_op0 = operands[0];
                   2424:   a29k_compare_op1 = operands[1];
                   2425:   a29k_compare_fp_p = 0;
                   2426:   DONE;
                   2427: }")
                   2428: 
                   2429: (define_expand "cmpsf"
                   2430:   [(set (cc0)
                   2431:        (compare (match_operand:SF 0 "gpc_reg_operand" "")
                   2432:                 (match_operand:SF 1 "gpc_reg_operand" "")))]
                   2433:   ""
                   2434:   "
                   2435: {
                   2436:   a29k_compare_op0 = operands[0];
                   2437:   a29k_compare_op1 = operands[1];
                   2438:   a29k_compare_fp_p = 1;
                   2439:   DONE;
                   2440: }")
                   2441: 
                   2442: (define_expand "cmpdf"
                   2443:   [(set (cc0)
                   2444:        (compare (match_operand:DF 0 "gpc_reg_operand" "")
                   2445:                 (match_operand:DF 1 "gpc_reg_operand" "")))]
                   2446:   ""
                   2447:   "
                   2448: {
                   2449:   a29k_compare_op0 = operands[0];
                   2450:   a29k_compare_op1 = operands[1];
                   2451:   a29k_compare_fp_p = 1;
                   2452:   DONE;
                   2453: }")
                   2454: 
                   2455: ;; We can generate bit-tests better if we use NE instead of EQ, but we
                   2456: ;; don't have an NE for floating-point.  So we have to have two patterns
                   2457: ;; for EQ and two for NE.
                   2458: 
                   2459: (define_expand "beq"
                   2460:   [(set (match_dup 1) (ne:SI (match_dup 2) (match_dup 3)))
                   2461:    (set (pc)
                   2462:        (if_then_else (ge (match_dup 1) (const_int 0))
                   2463:                      (label_ref (match_operand 0 "" ""))
                   2464:                      (pc)))]
                   2465:   ""
                   2466:   "
                   2467: {
                   2468:   if (GET_MODE_CLASS (GET_MODE (a29k_compare_op0)) == MODE_FLOAT)
                   2469:     {
                   2470:       emit_insn (gen_beq_fp (operands[0]));
                   2471:       DONE;
                   2472:     }
                   2473: 
                   2474:   operands[1] = gen_reg_rtx (SImode);
                   2475:   operands[2] = a29k_compare_op0;
                   2476:   operands[3] = a29k_compare_op1;
                   2477: }")
                   2478: 
                   2479: (define_expand "beq_fp"
                   2480:   [(set (match_dup 1) (eq:SI (match_dup 2) (match_dup 3)))
                   2481:    (set (pc)
                   2482:        (if_then_else (lt (match_dup 1) (const_int 0))
                   2483:                      (label_ref (match_operand 0 "" ""))
                   2484:                      (pc)))]
                   2485:   ""
                   2486:   "
                   2487: {
                   2488:   operands[1] = gen_reg_rtx (SImode);
                   2489:   operands[2] = a29k_compare_op0;
                   2490:   operands[3] = a29k_compare_op1;
                   2491: }")
                   2492: 
                   2493: (define_expand "bne"
                   2494:   [(set (match_dup 1) (ne:SI (match_dup 2) (match_dup 3)))
                   2495:    (set (pc)
                   2496:        (if_then_else (lt (match_dup 1) (const_int 0))
                   2497:                      (label_ref (match_operand 0 "" ""))
                   2498:                      (pc)))]
                   2499:   ""
                   2500:   "
                   2501: {
                   2502:   if (GET_MODE_CLASS (GET_MODE (a29k_compare_op0)) == MODE_FLOAT)
                   2503:     {
                   2504:       emit_insn (gen_bne_fp (operands[0]));
                   2505:       DONE;
                   2506:     }
                   2507: 
                   2508:   operands[1] = gen_reg_rtx (SImode);
                   2509:   operands[2] = a29k_compare_op0;
                   2510:   operands[3] = a29k_compare_op1;
                   2511: }")
                   2512: 
                   2513: (define_expand "bne_fp"
                   2514:   [(set (match_dup 1) (eq:SI (match_dup 2) (match_dup 3)))
                   2515:    (set (pc)
                   2516:        (if_then_else (ge (match_dup 1) (const_int 0))
                   2517:                      (label_ref (match_operand 0 "" ""))
                   2518:                      (pc)))]
                   2519:   ""
                   2520:   "
                   2521: {
                   2522:   operands[1] = gen_reg_rtx (SImode);
                   2523:   operands[2] = a29k_compare_op0;
                   2524:   operands[3] = a29k_compare_op1;
                   2525: }")
                   2526: 
                   2527: ;; We don't have a floating-point "lt" insn, so we have to use "gt" in that
                   2528: ;; case with the operands swapped.  The operands must both be registers in
                   2529: ;; the floating-point case, so we know that swapping them is OK.
                   2530: (define_expand "blt"
                   2531:   [(set (match_dup 1) (match_dup 2))
                   2532:    (set (pc)
                   2533:        (if_then_else (lt (match_dup 1) (const_int 0))
                   2534:                      (label_ref (match_operand 0 "" ""))
                   2535:                      (pc)))]
                   2536:   ""
                   2537:   "
                   2538: {
                   2539:   operands[1] = gen_reg_rtx (SImode);
                   2540:   if (a29k_compare_fp_p)
                   2541:     operands[2] = gen_rtx (GT, SImode, a29k_compare_op1, a29k_compare_op0);
                   2542:   else
                   2543:     operands[2] = gen_rtx (LT, SImode, a29k_compare_op0, a29k_compare_op1);
                   2544: }")
                   2545: 
                   2546: ;; Similarly for "le".
                   2547: (define_expand "ble"
                   2548:   [(set (match_dup 1) (match_dup 2))
                   2549:    (set (pc)
                   2550:        (if_then_else (lt (match_dup 1) (const_int 0))
                   2551:                      (label_ref (match_operand 0 "" ""))
                   2552:                      (pc)))]
                   2553:   ""
                   2554:   "
                   2555: {
                   2556:   operands[1] = gen_reg_rtx (SImode);
                   2557:   if (a29k_compare_fp_p)
                   2558:     operands[2] = gen_rtx (GE, SImode, a29k_compare_op1, a29k_compare_op0);
                   2559:   else
                   2560:     operands[2] = gen_rtx (LE, SImode, a29k_compare_op0, a29k_compare_op1);
                   2561: }")
                   2562: 
                   2563: (define_expand "bltu"
                   2564:   [(set (match_dup 1) (ltu:SI (match_dup 2) (match_dup 3)))
                   2565:    (set (pc)
                   2566:        (if_then_else (lt (match_dup 1) (const_int 0))
                   2567:                      (label_ref (match_operand 0 "" ""))
                   2568:                      (pc)))]
                   2569:   ""
                   2570:   "
                   2571: {
                   2572:   operands[1] = gen_reg_rtx (SImode);
                   2573:   operands[2] = a29k_compare_op0;
                   2574:   operands[3] = a29k_compare_op1;
                   2575: }")
                   2576: 
                   2577: (define_expand "bleu"
                   2578:   [(set (match_dup 1) (leu:SI (match_dup 2) (match_dup 3)))
                   2579:    (set (pc)
                   2580:        (if_then_else (lt (match_dup 1) (const_int 0))
                   2581:                      (label_ref (match_operand 0 "" ""))
                   2582:                      (pc)))]
                   2583:   ""
                   2584:   "
                   2585: {
                   2586:   operands[1] = gen_reg_rtx (SImode);
                   2587:   operands[2] = a29k_compare_op0;
                   2588:   operands[3] = a29k_compare_op1;
                   2589: }")
                   2590: 
                   2591: (define_expand "bgt"
                   2592:   [(set (match_dup 1) (gt:SI (match_dup 2) (match_dup 3)))
                   2593:    (set (pc)
                   2594:        (if_then_else (lt (match_dup 1) (const_int 0))
                   2595:                      (label_ref (match_operand 0 "" ""))
                   2596:                      (pc)))]
                   2597:   ""
                   2598:   "
                   2599: {
                   2600:   operands[1] = gen_reg_rtx (SImode);
                   2601:   operands[2] = a29k_compare_op0;
                   2602:   operands[3] = a29k_compare_op1;
                   2603: }")
                   2604: 
                   2605: (define_expand "bge"
                   2606:   [(set (match_dup 1) (ge:SI (match_dup 2) (match_dup 3)))
                   2607:    (set (pc)
                   2608:        (if_then_else (lt (match_dup 1) (const_int 0))
                   2609:                      (label_ref (match_operand 0 "" ""))
                   2610:                      (pc)))]
                   2611:   ""
                   2612:   "
                   2613: {
                   2614:   operands[1] = gen_reg_rtx (SImode);
                   2615:   operands[2] = a29k_compare_op0;
                   2616:   operands[3] = a29k_compare_op1;
                   2617: }")
                   2618: 
                   2619: (define_expand "bgtu"
                   2620:   [(set (match_dup 1) (gtu:SI (match_dup 2) (match_dup 3)))
                   2621:    (set (pc)
                   2622:        (if_then_else (lt (match_dup 1) (const_int 0))
                   2623:                      (label_ref (match_operand 0 "" ""))
                   2624:                      (pc)))]
                   2625:   ""
                   2626:   "
                   2627: {
                   2628:   operands[1] = gen_reg_rtx (SImode);
                   2629:   operands[2] = a29k_compare_op0;
                   2630:   operands[3] = a29k_compare_op1;
                   2631: }")
                   2632: 
                   2633: (define_expand "bgeu"
                   2634:   [(set (match_dup 1) (geu:SI (match_dup 2) (match_dup 3)))
                   2635:    (set (pc)
                   2636:        (if_then_else (lt (match_dup 1) (const_int 0))
                   2637:                      (label_ref (match_operand 0 "" ""))
                   2638:                      (pc)))]
                   2639:   ""
                   2640:   "
                   2641: {
                   2642:   operands[1] = gen_reg_rtx (SImode);
                   2643:   operands[2] = a29k_compare_op0;
                   2644:   operands[3] = a29k_compare_op1;
                   2645: }")
                   2646: 
                   2647: (define_expand "seq"
                   2648:   [(set (match_operand:SI 0 "gpc_reg_operand" "")
                   2649:        (eq:SI (match_dup 1) (match_dup 2)))]
                   2650:   ""
                   2651:   "
                   2652: {
                   2653:   operands[1] = a29k_compare_op0;
                   2654:   operands[2] = a29k_compare_op1;
                   2655: }")
                   2656:                 
                   2657: ;; This is the most complicated case, because we don't have a floating-point
                   2658: ;; "ne" insn.  If integer, handle normally.  If floating-point, write the
                   2659: ;; compare and then write an insn to reverse the test.
                   2660: (define_expand "sne_fp"
                   2661:   [(set (match_dup 3)
                   2662:        (eq:SI (match_operand 1 "gpc_reg_operand" "")
                   2663:               (match_operand 2 "gpc_reg_operand" "")))
                   2664:    (set (match_operand:SI 0 "gpc_reg_operand" "")
                   2665:        (ge:SI (match_dup 3) (const_int 0)))]
                   2666:   ""
                   2667:   "
                   2668: { operands[3] = gen_reg_rtx (SImode);
                   2669: }");
                   2670: 
                   2671: (define_expand "sne"
                   2672:   [(set (match_operand:SI 0 "gpc_reg_operand" "")
                   2673:        (ne:SI (match_dup 1) (match_dup 2)))]
                   2674:   ""
                   2675:   "
                   2676: {
                   2677:   operands[1] = a29k_compare_op0;
                   2678:   operands[2] = a29k_compare_op1;
                   2679: 
                   2680:   if (a29k_compare_fp_p)
                   2681:     {
                   2682:       emit_insn (gen_sne_fp (operands[0], operands[1], operands[2]));
                   2683:       DONE;
                   2684:     }
                   2685: }")
                   2686:                 
                   2687: ;; We don't have a floating-point "lt" insn, so use "gt" and swap the
                   2688: ;; operands, the same as we do "blt".
                   2689: (define_expand "slt"
                   2690:   [(set (match_operand:SI 0 "gpc_reg_operand" "")
                   2691:        (match_dup 1))]
                   2692:   ""
                   2693:   "
                   2694: {
                   2695:   if (a29k_compare_fp_p)
                   2696:     operands[1] = gen_rtx (GT, SImode, a29k_compare_op1, a29k_compare_op0);
                   2697:   else
                   2698:     operands[1] = gen_rtx (LT, SImode, a29k_compare_op0, a29k_compare_op1);
                   2699: }")
                   2700: 
                   2701: ;; Similarly for "le"
                   2702: (define_expand "sle"
                   2703:   [(set (match_operand:SI 0 "gpc_reg_operand" "")
                   2704:        (match_dup 1))]
                   2705:   ""
                   2706:   "
                   2707: {
                   2708:   if (a29k_compare_fp_p)
                   2709:     operands[1] = gen_rtx (GE, SImode, a29k_compare_op1, a29k_compare_op0);
                   2710:   else
                   2711:     operands[1] = gen_rtx (LE, SImode, a29k_compare_op0, a29k_compare_op1);
                   2712: }")
                   2713: 
                   2714: (define_expand "sltu"
                   2715:   [(set (match_operand:SI 0 "gpc_reg_operand" "")
                   2716:        (ltu:SI (match_dup 1) (match_dup 2)))]
                   2717:   ""
                   2718:   "
                   2719: {
                   2720:   operands[1] = a29k_compare_op0;
                   2721:   operands[2] = a29k_compare_op1;
                   2722: }")
                   2723: 
                   2724: (define_expand "sleu"
                   2725:   [(set (match_operand:SI 0 "gpc_reg_operand" "")
                   2726:        (leu:SI (match_dup 1) (match_dup 2)))]
                   2727:   ""
                   2728:   "
                   2729: {
                   2730:   operands[1] = a29k_compare_op0;
                   2731:   operands[2] = a29k_compare_op1;
                   2732: }")
                   2733: 
                   2734: (define_expand "sgt"
                   2735:   [(set (match_operand:SI 0 "gpc_reg_operand" "")
                   2736:        (gt:SI (match_dup 1) (match_dup 2)))]
                   2737:   ""
                   2738:   "
                   2739: {
                   2740:   operands[1] = a29k_compare_op0;
                   2741:   operands[2] = a29k_compare_op1;
                   2742: }")
                   2743: 
                   2744: (define_expand "sge"
                   2745:   [(set (match_operand:SI 0 "gpc_reg_operand" "")
                   2746:        (ge:SI (match_dup 1) (match_dup 2)))]
                   2747:   ""
                   2748:   "
                   2749: {
                   2750:   operands[1] = a29k_compare_op0;
                   2751:   operands[2] = a29k_compare_op1;
                   2752: }")
                   2753:                 
                   2754: (define_expand "sgtu"
                   2755:   [(set (match_operand:SI 0 "gpc_reg_operand" "")
                   2756:        (gtu:SI (match_dup 1) (match_dup 2)))]
                   2757:   ""
                   2758:   "
                   2759: {
                   2760:   operands[1] = a29k_compare_op0;
                   2761:   operands[2] = a29k_compare_op1;
                   2762: }")
                   2763: 
                   2764: (define_expand "sgeu"
                   2765:   [(set (match_operand:SI 0 "gpc_reg_operand" "")
                   2766:        (geu:SI (match_dup 1) (match_dup 2)))]
                   2767:   ""
                   2768:   "
                   2769: {
                   2770:   operands[1] = a29k_compare_op0;
                   2771:   operands[2] = a29k_compare_op1;
                   2772: }")
                   2773: 
                   2774: ;; Now define the actual jump insns.
                   2775: (define_insn ""
                   2776:   [(set (pc)
                   2777:        (if_then_else (match_operator 0 "branch_operator"
                   2778:                                      [(match_operand:SI 1 "gpc_reg_operand" "r")
                   2779:                                       (const_int 0)])
                   2780:                      (label_ref (match_operand 2 "" ""))
                   2781:                      (pc)))]
                   2782:   ""
                   2783:   "jmp%b0 %1,%l2%#"
                   2784:   [(set_attr "type" "branch")])
                   2785: 
                   2786: (define_insn ""
                   2787:   [(set (pc)
                   2788:        (if_then_else (match_operator 0 "branch_operator"
                   2789:                                      [(match_operand:SI 1 "gpc_reg_operand" "r")
                   2790:                                       (const_int 0)])
                   2791:                      (return)
                   2792:                      (pc)))]
                   2793:   "null_epilogue ()"
                   2794:   "jmp%b0i %1,lr0%#"
                   2795:   [(set_attr "type" "branch")])
                   2796: 
                   2797: (define_insn ""
                   2798:   [(set (pc)
                   2799:        (if_then_else (match_operator 0 "branch_operator"
                   2800:                                      [(match_operand:SI 1 "gpc_reg_operand" "r")
                   2801:                                       (const_int 0)])
                   2802:                      (pc)
                   2803:                      (label_ref (match_operand 2 "" ""))))]
                   2804:   ""
                   2805:   "jmp%B0 %1,%l2%#"
                   2806:   [(set_attr "type" "branch")])
                   2807: 
                   2808: (define_insn ""
                   2809:   [(set (pc)
                   2810:        (if_then_else (match_operator 0 "branch_operator"
                   2811:                                      [(match_operand:SI 1 "gpc_reg_operand" "r")
                   2812:                                       (const_int 0)])
                   2813:                      (pc)
                   2814:                      (return)))]
                   2815:   "null_epilogue ()"
                   2816:   "jmp%B0i %1,lr0%#"
                   2817:   [(set_attr "type" "branch")])
                   2818: 
                   2819: (define_insn "jump"
                   2820:   [(set (pc)
                   2821:        (label_ref (match_operand 0 "" "")))]
                   2822:   ""
                   2823:   "jmp %e0%E0"
                   2824:   [(set_attr "type" "branch")])
                   2825: 
                   2826: (define_insn "return"
                   2827:   [(return)]
                   2828:   "null_epilogue ()"
                   2829:   "jmpi lr0%#"
                   2830:   [(set_attr "type" "branch")])
                   2831: 
                   2832: (define_insn "indirect_jump"
                   2833:   [(set (pc)
                   2834:        (match_operand:SI 0 "gpc_reg_operand" "r"))]
                   2835:   ""
                   2836:   "jmpi %0%#"
                   2837:   [(set_attr "type" "branch")])
                   2838: 
                   2839: (define_insn "tablejump"
                   2840:   [(set (pc)
                   2841:        (match_operand:SI 0 "gpc_reg_operand" "r"))
                   2842:    (use (label_ref (match_operand 1 "" "")))]
                   2843:   ""
                   2844:   "jmpi %0%#"
                   2845:   [(set_attr "type" "branch")])
                   2846: 
                   2847: ;; JMPFDEC
                   2848: (define_insn ""
                   2849:   [(set (pc)
                   2850:        (if_then_else (ge (match_operand:SI 0 "gpc_reg_operand" "r")
                   2851:                          (const_int 0))
                   2852:                      (label_ref (match_operand 1 "" ""))
                   2853:                      (pc)))
                   2854:    (set (match_dup 0)
                   2855:        (plus:SI (match_dup 0)
                   2856:                 (const_int -1)))]
                   2857:   ""
                   2858:   "jmpfdec %0,%l1%#"
                   2859:   [(set_attr "type" "branch")])

unix.superglobalmegacorp.com

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