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

1.1       root        1: ;;- Machine description for Intel 80960 chip for GNU C compiler
                      2: ;;   Copyright (C) 1992 Free Software Foundation, Inc.
                      3: ;;   Contributed by Steven McGeady, Intel Corp.
                      4: ;;   Additional work by Glenn Colon-Bonet, Jonathan Shapiro, Andy Wilson
                      5: ;;   Converted to GCC 2.0 by Jim Wilson and Michael Tiemann, Cygnus Support.
                      6: 
                      7: ;; This file is part of GNU CC.
                      8: 
                      9: ;; GNU CC is free software; you can redistribute it and/or modify
                     10: ;; it under the terms of the GNU General Public License as published by
                     11: ;; the Free Software Foundation; either version 2, or (at your option)
                     12: ;; any later version.
                     13: 
                     14: ;; GNU CC is distributed in the hope that it will be useful,
                     15: ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
                     16: ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     17: ;; GNU General Public License for more details.
                     18: 
                     19: ;; You should have received a copy of the GNU General Public License
                     20: ;; along with GNU CC; see the file COPYING.  If not, write to
                     21: ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
                     22: 
                     23: ;;- See file "rtl.def" for documentation on define_insn, match_*, et. al.
                     24: 
                     25: ;; There are very few (4) 'f' registers, they can't be loaded/stored from/to
                     26: ;; memory, and some instructions explicitly require them, so we get better
                     27: ;; code by discouraging psuedo-registers from being allocated to them.
                     28: ;; However, we do want to allow all patterns which can store to them to
                     29: ;; include them in their constraints, so we always use '*f' in a destination
                     30: ;; constraint except when 'f' is the only alternative.
                     31: 
                     32: ;; Insn attributes which describe the i960.
                     33: 
                     34: ;; Modscan is not used, since the compiler never emits any of these insns.
                     35: (define_attr "type"
                     36:   "move,arith,alu2,mult,div,modscan,load,store,branch,call,address,compare,fpload,fpstore,fpmove,fpcvt,fpcc,fpadd,fpmul,fpdiv,multi,misc"
                     37:   (const_string "arith"))
                     38: 
                     39: ;; Length (in # of insns).
                     40: (define_attr "length" ""
                     41:   (cond [(eq_attr "type" "load,fpload")
                     42:              (if_then_else (match_operand 1 "symbolic_memory_operand" "")
                     43:                            (const_int 2)
                     44:                            (const_int 1))
                     45:         (eq_attr "type" "store,fpstore")
                     46:              (if_then_else (match_operand 0 "symbolic_memory_operand" "")
                     47:                            (const_int 2)
                     48:                            (const_int 1))
                     49:         (eq_attr "type" "address")
                     50:              (const_int 2)]
                     51:        (const_int 1)))
                     52: 
                     53: (define_asm_attributes
                     54:   [(set_attr "length" "1")
                     55:    (set_attr "type" "multi")])
                     56: 
                     57: ;; (define_function_unit {name} {num-units} {n-users} {test}
                     58: ;;                       {ready-delay} {issue-delay} [{conflict-list}])
                     59: 
                     60: ;; The integer ALU
                     61: (define_function_unit "alu" 2 0 (eq_attr "type" "arith,compare,move,address") 1 0)
                     62: (define_function_unit "alu" 2 0 (eq_attr "type" "alu2") 2 0)
                     63: (define_function_unit "alu" 2 0 (eq_attr "type" "mult") 5 0)
                     64: (define_function_unit "alu" 2 0 (eq_attr "type" "div") 35 0)
                     65: (define_function_unit "alu" 2 0 (eq_attr "type" "modscan") 3 0)
                     66: 
                     67: ;; Memory with load-delay of 1 (i.e., 2 cycle load).
                     68: (define_function_unit "memory" 1 0 (eq_attr "type" "load,fpload") 2 0)
                     69: 
                     70: ;; Floating point operations.
                     71: (define_function_unit "fp" 1 2 (eq_attr "type" "fpmove") 5 0)
                     72: (define_function_unit "fp" 1 2 (eq_attr "type" "fpcvt") 35 0)
                     73: (define_function_unit "fp" 1 2 (eq_attr "type" "fpcc") 10 0)
                     74: (define_function_unit "fp" 1 2 (eq_attr "type" "fpadd") 10 0)
                     75: (define_function_unit "fp" 1 2 (eq_attr "type" "fpmul") 20 0)
                     76: (define_function_unit "fp" 1 2 (eq_attr "type" "fpdiv") 35 0)
                     77: 
                     78: ;; Compare instructions.
                     79: ;; This controls RTL generation and register allocation.
                     80: 
                     81: ;; We generate RTL for comparisons and branches by having the cmpxx 
                     82: ;; patterns store away the operands.  Then, the scc and bcc patterns
                     83: ;; emit RTL for both the compare and the branch.
                     84: ;;
                     85: ;; We start with the DEFINE_EXPANDs, then then DEFINE_INSNs to match
                     86: ;; the patterns.  Finally, we have the DEFINE_SPLITs for some of the scc
                     87: ;; insns that actually require more than one machine instruction.
                     88: 
                     89: ;; Put cmpsi first because it is expected to be the most common.
                     90: 
                     91: (define_expand "cmpsi"
                     92:   [(set (reg:CC 36)
                     93:        (compare:CC (match_operand:SI 0 "nonimmediate_operand" "")
                     94:                    (match_operand:SI 1 "general_operand" "")))]
                     95:   ""
                     96:   "
                     97: {
                     98:   i960_compare_op0 = operands[0];
                     99:   i960_compare_op1 = operands[1];
                    100:   DONE;
                    101: }")
                    102: 
                    103: (define_expand "cmpdf"
                    104:   [(set (reg:CC 36)
                    105:        (compare:CC (match_operand:DF 0 "register_operand" "r")
                    106:                    (match_operand:DF 1 "nonmemory_operand" "rGH")))]
                    107:   "TARGET_NUMERICS"
                    108:   "
                    109: {
                    110:   i960_compare_op0 = operands[0];
                    111:   i960_compare_op1 = operands[1];
                    112:   DONE;
                    113: }")
                    114: 
                    115: (define_expand "cmpsf"
                    116:   [(set (reg:CC 36)
                    117:        (compare:CC (match_operand:SF 0 "register_operand" "r")
                    118:                    (match_operand:SF 1 "nonmemory_operand" "rGH")))]
                    119:   "TARGET_NUMERICS"
                    120:   "
                    121: {
                    122:   i960_compare_op0 = operands[0];
                    123:   i960_compare_op1 = operands[1];
                    124:   DONE;
                    125: }")
                    126: 
                    127: ;; Now the DEFINE_INSNs for the compare and scc cases.  First the compares.
                    128: 
                    129: (define_insn ""
                    130:   [(set (reg:CC 36)
                    131:        (compare:CC (match_operand:SI 0 "register_operand" "d")
                    132:                    (match_operand:SI 1 "arith_operand" "dI")))]
                    133:   ""
                    134:   "cmpi        %0,%1"
                    135:   [(set_attr "type" "compare")])
                    136: 
                    137: (define_insn ""
                    138:   [(set (reg:CC_UNS 36)
                    139:        (compare:CC_UNS (match_operand:SI 0 "register_operand" "d")
                    140:                        (match_operand:SI 1 "arith_operand" "dI")))]
                    141:   ""
                    142:   "cmpo        %0,%1"
                    143:   [(set_attr "type" "compare")])
                    144: 
                    145: (define_insn ""
                    146:   [(set (reg:CC 36)
                    147:        (compare:CC (match_operand:DF 0 "register_operand" "r")
                    148:                    (match_operand:DF 1 "nonmemory_operand" "rGH")))]
                    149:   "TARGET_NUMERICS"
                    150:   "cmprl %0,%1"
                    151:   [(set_attr "type" "fpcc")])
                    152: 
                    153: (define_insn ""
                    154:   [(set (reg:CC 36)
                    155:        (compare:CC (match_operand:SF 0 "register_operand" "r")
                    156:                    (match_operand:SF 1 "nonmemory_operand" "rGH")))]
                    157:   "TARGET_NUMERICS"
                    158:   "cmpr %0,%1"
                    159:   [(set_attr "type" "fpcc")])
                    160: 
                    161: ;; Instruction definitions for branch-on-bit-set and clear insns.
                    162: 
                    163: (define_insn ""
                    164:   [(set (pc)
                    165:        (if_then_else
                    166:         (ne (sign_extract:SI (match_operand:SI 1 "register_operand" "d")
                    167:                              (const_int 1)
                    168:                              (match_operand:SI 2 "arith_operand" "dI"))
                    169:             (const_int 0))
                    170:         (label_ref (match_operand 3 "" ""))
                    171:         (pc)))]
                    172:   ""
                    173:   "bbs %2,%1,%l3"
                    174:   [(set_attr "type" "branch")])
                    175: 
                    176: (define_insn ""
                    177:   [(set (pc)
                    178:        (if_then_else
                    179:         (eq (sign_extract:SI (match_operand:SI 1 "register_operand" "d")
                    180:                              (const_int 1)
                    181:                              (match_operand:SI 2 "arith_operand" "dI"))
                    182:             (const_int 0))
                    183:         (label_ref (match_operand 3 "" ""))
                    184:         (pc)))]
                    185:   ""
                    186:   "bbc %2,%1,%l3"
                    187:   [(set_attr "type" "branch")])
                    188: 
                    189: (define_insn ""
                    190:   [(set (pc)
                    191:        (if_then_else
                    192:         (ne (zero_extract:SI (match_operand:SI 1 "register_operand" "d")
                    193:                              (const_int 1)
                    194:                              (match_operand:SI 2 "arith_operand" "dI"))
                    195:             (const_int 0))
                    196:         (label_ref (match_operand 3 "" ""))
                    197:         (pc)))]
                    198:   ""
                    199:   "bbs %2,%1,%l3"
                    200:   [(set_attr "type" "branch")])
                    201: 
                    202: (define_insn ""
                    203:   [(set (pc)
                    204:        (if_then_else
                    205:         (eq (zero_extract:SI (match_operand:SI 1 "register_operand" "d")
                    206:                              (const_int 1)
                    207:                              (match_operand:SI 2 "arith_operand" "dI"))
                    208:             (const_int 0))
                    209:         (label_ref (match_operand 3 "" ""))
                    210:         (pc)))]
                    211:   ""
                    212:   "bbc %2,%1,%l3"
                    213:   [(set_attr "type" "branch")])
                    214: 
                    215: ;; ??? These will never match.  The LOG_LINKs necessary to make these match
                    216: ;; are not created by flow.  These remain as a reminder to make this work
                    217: ;; some day.
                    218: 
                    219: (define_insn ""
                    220:   [(set (reg:CC 36)
                    221:        (compare (match_operand:SI 0 "arith_operand" "d")
                    222:                 (match_operand:SI 1 "arith_operand" "d")))
                    223:    (set (match_dup 1) (plus:SI (match_dup 1) (const_int 1)))]
                    224:   "0"
                    225:   "cmpinci     %0,%1"
                    226:   [(set_attr "type" "compare")])
                    227: 
                    228: (define_insn ""
                    229:   [(set (reg:CC_UNS 36)
                    230:        (compare (match_operand:SI 0 "arith_operand" "d")
                    231:                 (match_operand:SI 1 "arith_operand" "d")))
                    232:    (set (match_dup 1) (plus:SI (match_dup 1) (const_int 1)))]
                    233:   "0"
                    234:   "cmpinco     %0,%1"
                    235:   [(set_attr "type" "compare")])
                    236: 
                    237: (define_insn ""
                    238:   [(set (reg:CC 36)
                    239:        (compare (match_operand:SI 0 "arith_operand" "d")
                    240:                 (match_operand:SI 1 "arith_operand" "d")))
                    241:    (set (match_dup 1) (minus:SI (match_dup 1) (const_int 1)))]
                    242:   "0"
                    243:   "cmpdeci     %0,%1"
                    244:   [(set_attr "type" "compare")])
                    245: 
                    246: (define_insn ""
                    247:   [(set (reg:CC_UNS 36)
                    248:        (compare (match_operand:SI 0 "arith_operand" "d")
                    249:                 (match_operand:SI 1 "arith_operand" "d")))
                    250:    (set (match_dup 1) (minus:SI (match_dup 1) (const_int 1)))]
                    251:   "0"
                    252:   "cmpdeco     %0,%1"
                    253:   [(set_attr "type" "compare")])
                    254: 
                    255: ;; Templates to store result of condition.
                    256: ;; '1' is stored if condition is true.
                    257: ;; '0' is stored if condition is false.
                    258: ;; These should use predicate "general_operand", since
                    259: ;; gcc seems to be creating mem references which use these
                    260: ;; templates.
                    261: 
                    262: (define_expand "seq"
                    263:   [(set (match_operand:SI 0 "general_operand" "=d")
                    264:        (eq:SI (match_dup 1) (const_int 0)))]
                    265:   ""
                    266:   "
                    267: {
                    268:   operands[1] = gen_compare_reg (EQ, i960_compare_op0, i960_compare_op1);
                    269: }")
                    270: 
                    271: (define_expand "sne"
                    272:   [(set (match_operand:SI 0 "general_operand" "=d")
                    273:        (ne:SI (match_dup 1) (const_int 0)))]
                    274:   ""
                    275:   "
                    276: {
                    277:   operands[1] = gen_compare_reg (NE, i960_compare_op0, i960_compare_op1);
                    278: }")
                    279: 
                    280: (define_expand "sgt"
                    281:   [(set (match_operand:SI 0 "general_operand" "=d")
                    282:        (gt:SI (match_dup 1) (const_int 0)))]
                    283:   ""
                    284:   "
                    285: {
                    286:   operands[1] = gen_compare_reg (GT, i960_compare_op0, i960_compare_op1);
                    287: }")
                    288: 
                    289: (define_expand "sgtu"
                    290:   [(set (match_operand:SI 0 "general_operand" "=d")
                    291:        (gtu:SI (match_dup 1) (const_int 0)))]
                    292:   ""
                    293:   "
                    294: {
                    295:   operands[1] = gen_compare_reg (GTU, i960_compare_op0, i960_compare_op1);
                    296: }")
                    297: 
                    298: (define_expand "slt"
                    299:   [(set (match_operand:SI 0 "general_operand" "=d")
                    300:        (lt:SI (match_dup 1) (const_int 0)))]
                    301:   ""
                    302:   "
                    303: {
                    304:   operands[1] = gen_compare_reg (LT, i960_compare_op0, i960_compare_op1);
                    305: }")
                    306: 
                    307: (define_expand "sltu"
                    308:   [(set (match_operand:SI 0 "general_operand" "=d")
                    309:        (ltu:SI (match_dup 1) (const_int 0)))]
                    310:   ""
                    311:   "
                    312: {
                    313:   operands[1] = gen_compare_reg (LTU, i960_compare_op0, i960_compare_op1);
                    314: }")
                    315: 
                    316: (define_expand "sge"
                    317:   [(set (match_operand:SI 0 "general_operand" "=d")
                    318:        (ge:SI (match_dup 1) (const_int 0)))]
                    319:   ""
                    320:   "
                    321: {
                    322:   operands[1] = gen_compare_reg (GE, i960_compare_op0, i960_compare_op1);
                    323: }")
                    324: 
                    325: (define_expand "sgeu"
                    326:   [(set (match_operand:SI 0 "general_operand" "=d")
                    327:        (geu:SI (match_dup 1) (const_int 0)))]
                    328:   ""
                    329:   "
                    330: {
                    331:   operands[1] = gen_compare_reg (GEU, i960_compare_op0, i960_compare_op1);
                    332: }")
                    333: 
                    334: (define_expand "sle"
                    335:   [(set (match_operand:SI 0 "general_operand" "=d")
                    336:        (le:SI (match_dup 1) (const_int 0)))]
                    337:   ""
                    338:   "
                    339: {
                    340:   operands[1] = gen_compare_reg (LE, i960_compare_op0, i960_compare_op1);
                    341: }")
                    342: 
                    343: (define_expand "sleu"
                    344:   [(set (match_operand:SI 0 "general_operand" "=d")
                    345:        (leu:SI (match_dup 1) (const_int 0)))]
                    346:   ""
                    347:   "
                    348: {
                    349:   operands[1] = gen_compare_reg (LEU, i960_compare_op0, i960_compare_op1);
                    350: }")
                    351: 
                    352: (define_insn ""
                    353:   [(set (match_operand:SI 0 "general_operand" "=d")
                    354:        (match_operator:SI 1 "comparison_operator" [(reg:CC 36) (const_int 0)]))]
                    355:   ""
                    356:   "test%C1     %0"
                    357:   [(set_attr "type" "compare")])
                    358: 
                    359: (define_insn ""
                    360:   [(set (match_operand:SI 0 "general_operand" "=d")
                    361:        (match_operator:SI 1 "comparison_operator" [(reg:CC_UNS 36) (const_int 0)]))]
                    362:   ""
                    363:   "test%C1     %0"
                    364:   [(set_attr "type" "compare")])
                    365: 
                    366: ;; These control RTL generation for conditional jump insns
                    367: ;; and match them for register allocation.
                    368: 
                    369: (define_expand "beq"
                    370:   [(set (pc)
                    371:        (if_then_else (eq (match_dup 1)
                    372:                          (const_int 0))
                    373:                      (label_ref (match_operand 0 "" ""))
                    374:                      (pc)))]
                    375:   ""
                    376:   "
                    377: { operands[1] = gen_compare_reg (EQ, i960_compare_op0, i960_compare_op1); }")
                    378: 
                    379: (define_expand "bne"
                    380:   [(set (pc)
                    381:        (if_then_else (ne (match_dup 1)
                    382:                          (const_int 0))
                    383:                      (label_ref (match_operand 0 "" ""))
                    384:                      (pc)))]
                    385:   ""
                    386:   "
                    387: { operands[1] = gen_compare_reg (NE, i960_compare_op0, i960_compare_op1); }")
                    388: 
                    389: (define_expand "bgt"
                    390:   [(set (pc)
                    391:        (if_then_else (gt (match_dup 1)
                    392:                          (const_int 0))
                    393:                      (label_ref (match_operand 0 "" ""))
                    394:                      (pc)))]
                    395:   ""
                    396:   "
                    397: { operands[1] = gen_compare_reg (GT, i960_compare_op0, i960_compare_op1); }")
                    398: 
                    399: (define_expand "bgtu"
                    400:   [(set (pc)
                    401:        (if_then_else (gtu (match_dup 1)
                    402:                           (const_int 0))
                    403:                      (label_ref (match_operand 0 "" ""))
                    404:                      (pc)))]
                    405:   ""
                    406:   "
                    407: { operands[1] = gen_compare_reg (GTU, i960_compare_op0, i960_compare_op1); }")
                    408: 
                    409: (define_expand "blt"
                    410:   [(set (pc)
                    411:        (if_then_else (lt (match_dup 1)
                    412:                          (const_int 0))
                    413:                      (label_ref (match_operand 0 "" ""))
                    414:                      (pc)))]
                    415:   ""
                    416:   "
                    417: { operands[1] = gen_compare_reg (LT, i960_compare_op0, i960_compare_op1); }")
                    418: 
                    419: (define_expand "bltu"
                    420:   [(set (pc)
                    421:        (if_then_else (ltu (match_dup 1)
                    422:                           (const_int 0))
                    423:                      (label_ref (match_operand 0 "" ""))
                    424:                      (pc)))]
                    425:   ""
                    426:   "
                    427: { operands[1] = gen_compare_reg (LTU, i960_compare_op0, i960_compare_op1); }")
                    428: 
                    429: (define_expand "bge"
                    430:   [(set (pc)
                    431:        (if_then_else (ge (match_dup 1)
                    432:                          (const_int 0))
                    433:                      (label_ref (match_operand 0 "" ""))
                    434:                      (pc)))]
                    435:   ""
                    436:   "
                    437: { operands[1] = gen_compare_reg (GE, i960_compare_op0, i960_compare_op1); }")
                    438: 
                    439: (define_expand "bgeu"
                    440:   [(set (pc)
                    441:        (if_then_else (geu (match_dup 1)
                    442:                           (const_int 0))
                    443:                      (label_ref (match_operand 0 "" ""))
                    444:                      (pc)))]
                    445:   ""
                    446:   "
                    447: { operands[1] = gen_compare_reg (GEU, i960_compare_op0, i960_compare_op1); }")
                    448: 
                    449: (define_expand "ble"
                    450:   [(set (pc)
                    451:        (if_then_else (le (match_dup 1)
                    452:                          (const_int 0))
                    453:                      (label_ref (match_operand 0 "" ""))
                    454:                      (pc)))]
                    455:   ""
                    456:   "
                    457: { operands[1] = gen_compare_reg (LE, i960_compare_op0, i960_compare_op1); }")
                    458: 
                    459: (define_expand "bleu"
                    460:   [(set (pc)
                    461:        (if_then_else (leu (match_dup 1)
                    462:                           (const_int 0))
                    463:                      (label_ref (match_operand 0 "" ""))
                    464:                      (pc)))]
                    465:   ""
                    466:   "
                    467: { operands[1] = gen_compare_reg (LEU, i960_compare_op0, i960_compare_op1); }")
                    468: 
                    469: ;; Now the normal branch insns (forward and reverse).
                    470: 
                    471: (define_insn ""
                    472:   [(set (pc)
                    473:        (if_then_else (match_operator 0 "comparison_operator"
                    474:                                      [(reg:CC 36) (const_int 0)])
                    475:                      (label_ref (match_operand 1 "" ""))
                    476:                      (pc)))]
                    477:   ""
                    478:   "b%C0 %l1"
                    479:   [(set_attr "type" "branch")])
                    480: 
                    481: (define_insn ""
                    482:   [(set (pc)
                    483:        (if_then_else (match_operator 0 "comparison_operator"
                    484:                                      [(reg:CC 36) (const_int 0)])
                    485:                      (pc)
                    486:                      (label_ref (match_operand 1 "" ""))))]
                    487:   ""
                    488:   "b%I0 %l1"
                    489:   [(set_attr "type" "branch")])
                    490: 
                    491: (define_insn ""
                    492:   [(set (pc)
                    493:        (if_then_else (match_operator 0 "comparison_operator"
                    494:                                      [(reg:CC_UNS 36) (const_int 0)])
                    495:                      (label_ref (match_operand 1 "" ""))
                    496:                      (pc)))]
                    497:   ""
                    498:   "b%C0 %l1"
                    499:   [(set_attr "type" "branch")])
                    500: 
                    501: (define_insn ""
                    502:   [(set (pc)
                    503:        (if_then_else (match_operator 0 "comparison_operator"
                    504:                                      [(reg:CC_UNS 36) (const_int 0)])
                    505:                      (pc)
                    506:                      (label_ref (match_operand 1 "" ""))))]
                    507:   ""
                    508:   "b%I0 %l1"
                    509:   [(set_attr "type" "branch")])
                    510: 
                    511: (define_insn ""
                    512:   [(set (pc)
                    513:        (if_then_else
                    514:         (match_operator 0 "comparison_operator"
                    515:                         [(match_operand:SI 1 "arith_operand" "d")
                    516:                          (match_operand:SI 2 "arith_operand" "dI")])
                    517:         (label_ref (match_operand 3 "" ""))
                    518:         (pc)))]
                    519:   ""
                    520:   "cmp%S0%B0%R0        %2,%1,%l3"
                    521:   [(set_attr "type" "branch")])
                    522: 
                    523: (define_insn ""
                    524:   [(set (pc)
                    525:        (if_then_else
                    526:         (match_operator 0 "comparison_operator"
                    527:                         [(match_operand:SI 1 "arith_operand" "d")
                    528:                          (match_operand:SI 2 "arith_operand" "dI")])
                    529:         (pc)
                    530:         (label_ref (match_operand 3 "" ""))))]
                    531:   ""
                    532:   "cmp%S0%B0%X0        %2,%1,%l3"
                    533:   [(set_attr "type" "branch")])
                    534: 
                    535: ;; Normal move instructions.
                    536: ;; This code is based on the sparc machine description.
                    537: 
                    538: (define_expand "movsi"
                    539:   [(set (match_operand:SI 0 "general_operand" "")
                    540:        (match_operand:SI 1 "general_operand" ""))]
                    541:   ""
                    542:   "
                    543: {
                    544:   if (emit_move_sequence (operands, SImode))
                    545:     DONE;
                    546: }")
                    547: 
                    548: ;; The store case can not be separate, because reload may convert a register
                    549: ;; to register move insn to a store (or load) insn without rerecognizing
                    550: ;; the insn.
                    551: 
                    552: ;; The i960 does not have any store constant to memory instruction.  However,
                    553: ;; the calling convention is defined so that the arg pointer when it is not
                    554: ;; overwise being used is zero.  Thus, we can handle store zero to memory
                    555: ;; by storing an unused arg pointer.  The arg pointer will be unused if
                    556: ;; current_function_args_size is zero.  This value of this variable is not
                    557: ;; valid until after all rtl generation is complete, including function
                    558: ;; inlining (because a function that doesn't need an arg pointer may be
                    559: ;; inlined into a function that does need an arg pointer), so we must also
                    560: ;; check that rtx_equal_function_value_matters is zero.
                    561: 
                    562: (define_insn ""
                    563:   [(set (match_operand:SI 0 "general_operand" "=d,d,d,m")
                    564:        (match_operand:SI 1 "general_operand" "dI,i,m,dJ"))]
                    565:   "(current_function_args_size == 0
                    566:     && rtx_equal_function_value_matters == 0)
                    567:    && (register_operand (operands[0], SImode)
                    568:        || register_operand (operands[1], SImode)
                    569:        || operands[1] == const0_rtx)"
                    570:   "*
                    571: {
                    572:   switch (which_alternative)
                    573:     {
                    574:     case 0:
                    575:       if (i960_last_insn_type == I_TYPE_REG && TARGET_C_SERIES)
                    576:        {
                    577:          if (GET_CODE (operands[1]) == REG)
                    578:            return \"lda        (%1),%0\";
                    579:          else
                    580:            return \"lda        %1,%0\";
                    581:        }
                    582:       return \"mov     %1,%0\";
                    583:     case 1:
                    584:       return i960_output_ldconst (operands[0], operands[1]);
                    585:     case 2:
                    586:       return \"ld      %1,%0\";
                    587:     case 3:
                    588:       if (operands[1] == const0_rtx)
                    589:        return \"st     g14,%0\";
                    590:       return \"st      %1,%0\";      
                    591:     }
                    592: }"
                    593:   [(set_attr "type" "move,address,load,store")
                    594:    (set_attr "length" "*,3,*,*")])
                    595: 
                    596: (define_insn ""
                    597:   [(set (match_operand:SI 0 "general_operand" "=d,d,d,m")
                    598:        (match_operand:SI 1 "general_operand" "dI,i,m,d"))]
                    599:   "(current_function_args_size != 0
                    600:     || rtx_equal_function_value_matters != 0)
                    601:    && (register_operand (operands[0], SImode)
                    602:        || register_operand (operands[1], SImode))"
                    603:   "*
                    604: {
                    605:   switch (which_alternative)
                    606:     {
                    607:     case 0:
                    608:       if (i960_last_insn_type == I_TYPE_REG && TARGET_C_SERIES)
                    609:        {
                    610:          if (GET_CODE (operands[1]) == REG)
                    611:            return \"lda        (%1),%0\";
                    612:          else
                    613:            return \"lda        %1,%0\";
                    614:        }
                    615:       return \"mov     %1,%0\";
                    616:     case 1:
                    617:       return i960_output_ldconst (operands[0], operands[1]);
                    618:     case 2:
                    619:       return \"ld      %1,%0\";
                    620:     case 3:
                    621:       return \"st      %1,%0\";      
                    622:     }
                    623: }"
                    624:   [(set_attr "type" "move,address,load,store")
                    625:    (set_attr "length" "*,3,*,*")])
                    626: 
                    627: (define_expand "movhi"
                    628:   [(set (match_operand:HI 0 "general_operand" "")
                    629:        (match_operand:HI 1 "general_operand" ""))]
                    630:   ""
                    631:   "
                    632: {
                    633:   if (emit_move_sequence (operands, HImode))
                    634:     DONE;
                    635: }")
                    636: 
                    637: ;; Special pattern for zero stores to memory for functions which don't use
                    638: ;; the arg pointer.
                    639: 
                    640: ;; The store case can not be separate.  See above.
                    641: (define_insn ""
                    642:   [(set (match_operand:HI 0 "general_operand" "=d,d,d,m")
                    643:        (match_operand:HI 1 "general_operand" "dI,i,m,dJ"))]
                    644:   "(current_function_args_size == 0
                    645:     && rtx_equal_function_value_matters == 0)
                    646:    && (register_operand (operands[0], HImode)
                    647:        || register_operand (operands[1], HImode)
                    648:        || operands[1] == const0_rtx)"
                    649:   "*
                    650: {
                    651:   switch (which_alternative)
                    652:     {
                    653:     case 0:
                    654:       if (i960_last_insn_type == I_TYPE_REG && TARGET_C_SERIES)
                    655:        {
                    656:          if (GET_CODE (operands[1]) == REG)
                    657:            return \"lda        (%1),%0\";
                    658:          else
                    659:            return \"lda        %1,%0\";
                    660:        }
                    661:       return \"mov     %1,%0\";
                    662:     case 1:
                    663:       return i960_output_ldconst (operands[0], operands[1]);
                    664:     case 2:
                    665:       return \"ldos    %1,%0\";
                    666:     case 3:
                    667:       if (operands[1] == const0_rtx)
                    668:        return \"stos   g14,%0\";
                    669:       return \"stos    %1,%0\";
                    670:     }
                    671: }"
                    672:   [(set_attr "type" "move,misc,load,store")
                    673:    (set_attr "length" "*,3,*,*")])
                    674: 
                    675: ;; The store case can not be separate.  See above.
                    676: (define_insn ""
                    677:   [(set (match_operand:HI 0 "general_operand" "=d,d,d,m")
                    678:        (match_operand:HI 1 "general_operand" "dI,i,m,d"))]
                    679:   "(current_function_args_size != 0
                    680:     || rtx_equal_function_value_matters != 0)
                    681:    && (register_operand (operands[0], HImode)
                    682:        || register_operand (operands[1], HImode))"
                    683:   "*
                    684: {
                    685:   switch (which_alternative)
                    686:     {
                    687:     case 0:
                    688:       if (i960_last_insn_type == I_TYPE_REG && TARGET_C_SERIES)
                    689:        {
                    690:          if (GET_CODE (operands[1]) == REG)
                    691:            return \"lda        (%1),%0\";
                    692:          else
                    693:            return \"lda        %1,%0\";
                    694:        }
                    695:       return \"mov     %1,%0\";
                    696:     case 1:
                    697:       return i960_output_ldconst (operands[0], operands[1]);
                    698:     case 2:
                    699:       return \"ldos    %1,%0\";
                    700:     case 3:
                    701:       return \"stos    %1,%0\";
                    702:     }
                    703: }"
                    704:   [(set_attr "type" "move,misc,load,store")
                    705:    (set_attr "length" "*,3,*,*")])
                    706: 
                    707: (define_expand "movqi"
                    708:   [(set (match_operand:QI 0 "general_operand" "")
                    709:        (match_operand:QI 1 "general_operand" ""))]
                    710:   ""
                    711:   "
                    712: {
                    713:   if (emit_move_sequence (operands, QImode))
                    714:     DONE;
                    715: }")
                    716: 
                    717: ;; The store case can not be separate.  See comment above.
                    718: (define_insn ""
                    719:   [(set (match_operand:QI 0 "general_operand" "=d,d,d,m")
                    720:        (match_operand:QI 1 "general_operand" "dI,i,m,dJ"))]
                    721:   "(current_function_args_size == 0
                    722:     && rtx_equal_function_value_matters == 0)
                    723:    && (register_operand (operands[0], QImode)
                    724:        || register_operand (operands[1], QImode)
                    725:        || operands[1] == const0_rtx)"
                    726:   "*
                    727: {
                    728:   switch (which_alternative)
                    729:     {
                    730:     case 0:
                    731:       if (i960_last_insn_type == I_TYPE_REG && TARGET_C_SERIES)
                    732:        {
                    733:          if (GET_CODE (operands[1]) == REG)
                    734:            return \"lda        (%1),%0\";
                    735:          else
                    736:            return \"lda        %1,%0\";
                    737:        }
                    738:       return \"mov     %1,%0\";
                    739:     case 1:
                    740:       return i960_output_ldconst (operands[0], operands[1]);
                    741:     case 2:
                    742:       return \"ldob    %1,%0\";
                    743:     case 3:
                    744:       if (operands[1] == const0_rtx)
                    745:        return \"stob   g14,%0\";
                    746:       return \"stob    %1,%0\";
                    747:     }
                    748: }"
                    749:   [(set_attr "type" "move,misc,load,store")
                    750:    (set_attr "length" "*,3,*,*")])
                    751: 
                    752: ;; The store case can not be separate.  See comment above.
                    753: (define_insn ""
                    754:   [(set (match_operand:QI 0 "general_operand" "=d,d,d,m")
                    755:        (match_operand:QI 1 "general_operand" "dI,i,m,d"))]
                    756:   "(current_function_args_size != 0
                    757:     || rtx_equal_function_value_matters != 0)
                    758:    && (register_operand (operands[0], QImode)
                    759:        || register_operand (operands[1], QImode))"
                    760:   "*
                    761: {
                    762:   switch (which_alternative)
                    763:     {
                    764:     case 0:
                    765:       if (i960_last_insn_type == I_TYPE_REG && TARGET_C_SERIES)
                    766:        {
                    767:          if (GET_CODE (operands[1]) == REG)
                    768:            return \"lda        (%1),%0\";
                    769:          else
                    770:            return \"lda        %1,%0\";
                    771:        }
                    772:       return \"mov     %1,%0\";
                    773:     case 1:
                    774:       return i960_output_ldconst (operands[0], operands[1]);
                    775:     case 2:
                    776:       return \"ldob    %1,%0\";
                    777:     case 3:
                    778:       return \"stob    %1,%0\";
                    779:     }
                    780: }"
                    781:   [(set_attr "type" "move,misc,load,store")
                    782:    (set_attr "length" "*,3,*,*")])
                    783: 
                    784: (define_expand "movdi"
                    785:   [(set (match_operand:DI 0 "general_operand" "")
                    786:        (match_operand:DI 1 "general_operand" ""))]
                    787:   ""
                    788:   "
                    789: {
                    790:   if (emit_move_sequence (operands, DImode))
                    791:     DONE;
                    792: }")
                    793: 
                    794: ;; The store case can not be separate.  See comment above.
                    795: (define_insn ""
                    796:   [(set (match_operand:DI 0 "general_operand" "=d,d,d,m,o")
                    797:        (match_operand:DI 1 "general_operand" "dI,i,m,d,J"))]
                    798:   "(current_function_args_size == 0
                    799:     && rtx_equal_function_value_matters == 0)
                    800:    && (register_operand (operands[0], DImode)
                    801:        || register_operand (operands[1], DImode)
                    802:        || operands[1] == const0_rtx)"
                    803:   "*
                    804: {
                    805:   switch (which_alternative)
                    806:     {
                    807:     case 0:
                    808:       return \"movl    %1,%0\";
                    809:     case 1:
                    810:       return i960_output_ldconst (operands[0], operands[1]);
                    811:     case 2:
                    812:       return \"ldl     %1,%0\";
                    813:     case 3:
                    814:       return \"stl     %1,%0\";
                    815:     case 4:
                    816:       operands[1] = adj_offsettable_operand (operands[0], 4);
                    817:       return \"st      g14,%0\;st      g14,%1\";
                    818:     }
                    819: }"
                    820:   [(set_attr "type" "move,load,load,store,store")])
                    821: 
                    822: ;; The store case can not be separate.  See comment above.
                    823: (define_insn ""
                    824:   [(set (match_operand:DI 0 "general_operand" "=d,d,d,m")
                    825:        (match_operand:DI 1 "general_operand" "dI,i,m,d"))]
                    826:   "(current_function_args_size != 0
                    827:     || rtx_equal_function_value_matters != 0)
                    828:    && (register_operand (operands[0], DImode)
                    829:        || register_operand (operands[1], DImode))"
                    830:   "*
                    831: {
                    832:   switch (which_alternative)
                    833:     {
                    834:     case 0:
                    835:       return \"movl    %1,%0\";
                    836:     case 1:
                    837:       return i960_output_ldconst (operands[0], operands[1]);
                    838:     case 2:
                    839:       return \"ldl     %1,%0\";
                    840:     case 3:
                    841:       return \"stl     %1,%0\";
                    842:     }
                    843: }"
                    844:   [(set_attr "type" "move,load,load,store")])
                    845: 
                    846: (define_expand "movti"
                    847:   [(set (match_operand:TI 0 "general_operand" "")
                    848:        (match_operand:TI 1 "general_operand" ""))]
                    849:   ""
                    850:   "
                    851: {
                    852:   if (emit_move_sequence (operands, TImode))
                    853:     DONE;
                    854: }")
                    855: 
                    856: ;; The store case can not be separate.  See comment above.
                    857: (define_insn ""
                    858:   [(set (match_operand:TI 0 "general_operand" "=d,d,d,m,o")
                    859:        (match_operand:TI 1 "general_operand" "dI,i,m,d,J"))]
                    860:   "(current_function_args_size == 0
                    861:     && rtx_equal_function_value_matters == 0)
                    862:    && (register_operand (operands[0], TImode)
                    863:        || register_operand (operands[1], TImode)
                    864:        || operands[1] == const0_rtx)"
                    865:   "*
                    866: {
                    867:   switch (which_alternative)
                    868:     {
                    869:     case 0:
                    870:       return \"movq    %1,%0\";
                    871:     case 1:
                    872:       return i960_output_ldconst (operands[0], operands[1]);
                    873:     case 2:
                    874:       return \"ldq     %1,%0\";
                    875:     case 3:
                    876:       return \"stq     %1,%0\";
                    877:     case 4:
                    878:       operands[1] = adj_offsettable_operand (operands[0], 4);
                    879:       operands[2] = adj_offsettable_operand (operands[0], 8);
                    880:       operands[3] = adj_offsettable_operand (operands[0], 12);
                    881:       return \"st      g14,%0\;st      g14,%1\;st      g14,%2\;st      g14,%3\";
                    882:     }
                    883: }"
                    884:   [(set_attr "type" "move,load,load,store,store")])
                    885: 
                    886: ;; The store case can not be separate.  See comment above.
                    887: (define_insn ""
                    888:   [(set (match_operand:TI 0 "general_operand" "=d,d,d,m")
                    889:        (match_operand:TI 1 "general_operand" "dI,i,m,d"))]
                    890:   "(current_function_args_size != 0
                    891:     || rtx_equal_function_value_matters != 0)
                    892:    && (register_operand (operands[0], TImode)
                    893:        || register_operand (operands[1], TImode))"
                    894:   "*
                    895: {
                    896:   switch (which_alternative)
                    897:     {
                    898:     case 0:
                    899:       return \"movq    %1,%0\";
                    900:     case 1:
                    901:       return i960_output_ldconst (operands[0], operands[1]);
                    902:     case 2:
                    903:       return \"ldq     %1,%0\";
                    904:     case 3:
                    905:       return \"stq     %1,%0\";
                    906:     }
                    907: }"
                    908:   [(set_attr "type" "move,load,load,store")])
                    909: 
                    910: (define_expand "store_multiple"
                    911:   [(set (match_operand:SI 0 "" "")     ;;- dest
                    912:        (match_operand:SI 1 "" ""))     ;;- src
                    913:    (use (match_operand:SI 2 "" ""))]   ;;- nregs
                    914:   ""
                    915:   "
                    916: {
                    917:   int regno;
                    918:   int count;
                    919:   rtx from;
                    920:   int i;
                    921: 
                    922:   if (GET_CODE (operands[0]) != MEM
                    923:       || GET_CODE (operands[1]) != REG
                    924:       || GET_CODE (operands[2]) != CONST_INT)
                    925:     FAIL;
                    926: 
                    927:   count = INTVAL (operands[2]);
                    928:   if (count > 12)
                    929:     FAIL;
                    930: 
                    931:   regno = REGNO (operands[1]);
                    932:   from = memory_address (SImode, XEXP (operands[0], 0));
                    933:   while (count >= 4 && ((regno & 3) == 0))
                    934:     {
                    935:       emit_insn (gen_rtx (SET, VOIDmode,
                    936:                          gen_rtx (MEM, TImode, from),
                    937:                          gen_rtx (REG, TImode, regno)));
                    938:       count -= 4;
                    939:       regno += 4;
                    940:       from = memory_address (TImode, plus_constant (from, 16));
                    941:     }
                    942:   while (count >= 2 && ((regno & 1) == 0))
                    943:     {
                    944:       emit_insn (gen_rtx (SET, VOIDmode,
                    945:                          gen_rtx (MEM, DImode, from),
                    946:                          gen_rtx (REG, DImode, regno)));
                    947:       count -= 2;
                    948:       regno += 2;
                    949:       from = memory_address (DImode, plus_constant (from, 8));
                    950:     }
                    951:   while (count > 0)
                    952:     {
                    953:       emit_insn (gen_rtx (SET, VOIDmode,
                    954:                          gen_rtx (MEM, SImode, from),
                    955:                          gen_rtx (REG, SImode, regno)));
                    956:       count -= 1;
                    957:       regno += 1;
                    958:       from = memory_address (SImode, plus_constant (from, 4));
                    959:     }
                    960:   DONE;
                    961: }")
                    962: 
                    963: ;; Floating point move insns
                    964: 
                    965: (define_expand "movdf"
                    966:   [(set (match_operand:DF 0 "general_operand" "")
                    967:        (match_operand:DF 1 "fpmove_src_operand" ""))]
                    968:   ""
                    969:   "
                    970: {
                    971:   if (emit_move_sequence (operands, DFmode))
                    972:     DONE;
                    973: }")
                    974: 
                    975: (define_insn ""
                    976:   [(set (match_operand:DF 0 "general_operand" "=r,*f,d,d,m,o")
                    977:        (match_operand:DF 1 "fpmove_src_operand" "r,GH,F,m,d,G"))]
                    978:   "(current_function_args_size == 0
                    979:     && rtx_equal_function_value_matters == 0)
                    980:    && (register_operand (operands[0], DFmode)
                    981:        || register_operand (operands[1], DFmode)
                    982:        || operands[1] == CONST0_RTX (DFmode))"
                    983:   "*
                    984: {
                    985:   switch (which_alternative)
                    986:     {
                    987:     case 0:
                    988:       if (FP_REG_P (operands[0]) || FP_REG_P (operands[1]))
                    989:        return \"movrl  %1,%0\";
                    990:       else
                    991:        return \"movl   %1,%0\";
                    992:     case 1:
                    993:       return \"movrl   %1,%0\";
                    994:     case 2:
                    995:       return i960_output_ldconst (operands[0], operands[1]);
                    996:     case 3:
                    997:       return \"ldl     %1,%0\";
                    998:     case 4:
                    999:       return \"stl     %1,%0\";
                   1000:     case 5:
                   1001:       operands[1] = adj_offsettable_operand (operands[0], 4);
                   1002:       return \"st      g14,%0\;st      g14,%1\";
                   1003:     }
                   1004: }"
                   1005:   [(set_attr "type" "move,move,load,fpload,fpstore,fpstore")])
                   1006: 
                   1007: (define_insn ""
                   1008:   [(set (match_operand:DF 0 "general_operand" "=r,*f,d,d,m")
                   1009:        (match_operand:DF 1 "fpmove_src_operand" "r,GH,F,m,d"))]
                   1010:   "(current_function_args_size != 0
                   1011:     || rtx_equal_function_value_matters != 0)
                   1012:    && (register_operand (operands[0], DFmode)
                   1013:        || register_operand (operands[1], DFmode))"
                   1014:   "*
                   1015: {
                   1016:   switch (which_alternative)
                   1017:     {
                   1018:     case 0:
                   1019:       if (FP_REG_P (operands[0]) || FP_REG_P (operands[1]))
                   1020:        return \"movrl  %1,%0\";
                   1021:       else
                   1022:        return \"movl   %1,%0\";
                   1023:     case 1:
                   1024:       return \"movrl   %1,%0\";
                   1025:     case 2:
                   1026:       return i960_output_ldconst (operands[0], operands[1]);
                   1027:     case 3:
                   1028:       return \"ldl     %1,%0\";
                   1029:     case 4:
                   1030:       return \"stl     %1,%0\";
                   1031:     }
                   1032: }"
                   1033:   [(set_attr "type" "move,move,load,fpload,fpstore")])
                   1034: 
                   1035: (define_expand "movsf"
                   1036:   [(set (match_operand:SF 0 "general_operand" "")
                   1037:        (match_operand:SF 1 "fpmove_src_operand" ""))]
                   1038:   ""
                   1039:   "
                   1040: {
                   1041:   if (emit_move_sequence (operands, SFmode))
                   1042:     DONE;
                   1043: }")
                   1044: 
                   1045: (define_insn ""
                   1046:   [(set (match_operand:SF 0 "general_operand" "=r,*f,d,d,m")
                   1047:        (match_operand:SF 1 "fpmove_src_operand" "r,GH,F,m,dG"))]
                   1048:   "(current_function_args_size == 0
                   1049:     && rtx_equal_function_value_matters == 0)
                   1050:    && (register_operand (operands[0], SFmode)
                   1051:        || register_operand (operands[1], SFmode)
                   1052:        || operands[1] == CONST0_RTX (SFmode))"
                   1053:   "*
                   1054: {
                   1055:   switch (which_alternative)
                   1056:     {
                   1057:     case 0:
                   1058:       if (FP_REG_P (operands[0]) || FP_REG_P (operands[1]))
                   1059:        return \"movr   %1,%0\";
                   1060:       else
                   1061:        return \"mov    %1,%0\";
                   1062:     case 1:
                   1063:       return \"movr    %1,%0\";
                   1064:     case 2:
                   1065:       return i960_output_ldconst (operands[0], operands[1]);
                   1066:     case 3:
                   1067:       return \"ld      %1,%0\";
                   1068:     case 4:
                   1069:       if (operands[1] == CONST0_RTX (SFmode))
                   1070:        return \"st     g14,%0\";
                   1071:       return \"st      %1,%0\";
                   1072:     }
                   1073: }"
                   1074:   [(set_attr "type" "move,move,load,fpload,fpstore")])
                   1075: 
                   1076: (define_insn ""
                   1077:   [(set (match_operand:SF 0 "general_operand" "=r,*f,d,d,m")
                   1078:        (match_operand:SF 1 "fpmove_src_operand" "r,GH,F,m,d"))]
                   1079:   "(current_function_args_size != 0
                   1080:     || rtx_equal_function_value_matters != 0)
                   1081:    && (register_operand (operands[0], SFmode)
                   1082:        || register_operand (operands[1], SFmode))"
                   1083:   "*
                   1084: {
                   1085:   switch (which_alternative)
                   1086:     {
                   1087:     case 0:
                   1088:       if (FP_REG_P (operands[0]) || FP_REG_P (operands[1]))
                   1089:        return \"movr   %1,%0\";
                   1090:       else
                   1091:        return \"mov    %1,%0\";
                   1092:     case 1:
                   1093:       return \"movr    %1,%0\";
                   1094:     case 2:
                   1095:       return i960_output_ldconst (operands[0], operands[1]);
                   1096:     case 3:
                   1097:       return \"ld      %1,%0\";
                   1098:     case 4:
                   1099:       return \"st      %1,%0\";
                   1100:     }
                   1101: }"
                   1102:   [(set_attr "type" "move,move,load,fpload,fpstore")])
                   1103: 
                   1104: ;; Mixed-mode moves with sign and zero-extension.
                   1105: 
                   1106: ;; Note that the one starting from HImode comes before those for QImode
                   1107: ;; so that a constant operand will match HImode, not QImode.
                   1108: 
                   1109: (define_expand "extendhisi2"
                   1110:   [(set (match_operand:SI 0 "register_operand" "")
                   1111:        (sign_extend:SI
                   1112:         (match_operand:HI 1 "nonimmediate_operand" "")))]
                   1113:  ""
                   1114:  "
                   1115: {
                   1116:   if (GET_CODE (operand1) == REG
                   1117:       || (GET_CODE (operand1) == SUBREG
                   1118:          && GET_CODE (XEXP (operand1, 0)) == REG))
                   1119:     {
                   1120:       rtx temp = gen_reg_rtx (SImode);
                   1121:       rtx shift_16 = gen_rtx (CONST_INT, VOIDmode, 16);
                   1122:       int op1_subreg_word = 0;
                   1123: 
                   1124:       if (GET_CODE (operand1) == SUBREG)
                   1125:        {
                   1126:          op1_subreg_word = SUBREG_WORD (operand1);
                   1127:          operand1 = SUBREG_REG (operand1);
                   1128:        }
                   1129:       operand1 = gen_rtx (SUBREG, SImode, operand1, op1_subreg_word);
                   1130: 
                   1131:       emit_insn (gen_ashlsi3 (temp, operand1, shift_16));
                   1132:       emit_insn (gen_ashrsi3 (operand0, temp, shift_16));
                   1133:       DONE;
                   1134:     }
                   1135: }")
                   1136: 
                   1137: (define_insn ""
                   1138:   [(set (match_operand:SI 0 "register_operand" "=d")
                   1139:        (sign_extend:SI (match_operand:HI 1 "memory_operand" "m")))]
                   1140:   ""
                   1141:   "ldis        %1,%0"
                   1142:   [(set_attr "type" "load")])
                   1143: 
                   1144: (define_expand "extendqisi2"
                   1145:   [(set (match_operand:SI 0 "register_operand" "")
                   1146:        (sign_extend:SI (match_operand:QI 1 "nonimmediate_operand" "")))]
                   1147:   ""
                   1148:   "
                   1149: {
                   1150:   if (GET_CODE (operand1) == REG
                   1151:       || (GET_CODE (operand1) == SUBREG
                   1152:          && GET_CODE (XEXP (operand1, 0)) == REG))
                   1153:     {
                   1154:       rtx temp = gen_reg_rtx (SImode);
                   1155:       rtx shift_24 = gen_rtx (CONST_INT, VOIDmode, 24);
                   1156:       int op1_subreg_word = 0;
                   1157: 
                   1158:       if (GET_CODE (operand1) == SUBREG)
                   1159:        {
                   1160:          op1_subreg_word = SUBREG_WORD (operand1);
                   1161:          operand1 = SUBREG_REG (operand1);
                   1162:        }
                   1163:       operand1 = gen_rtx (SUBREG, SImode, operand1, op1_subreg_word),
                   1164: 
                   1165:       emit_insn (gen_ashlsi3 (temp, operand1, shift_24));
                   1166:       emit_insn (gen_ashrsi3 (operand0, temp, shift_24));
                   1167:       DONE;
                   1168:     }
                   1169: }")
                   1170: 
                   1171: (define_insn ""
                   1172:   [(set (match_operand:SI 0 "register_operand" "=d")
                   1173:        (sign_extend:SI (match_operand:QI 1 "memory_operand" "m")))]
                   1174:   ""
                   1175:   "ldib        %1,%0"
                   1176:   [(set_attr "type" "load")])
                   1177: 
                   1178: (define_expand "extendqihi2"
                   1179:   [(set (match_operand:HI 0 "register_operand" "")
                   1180:        (sign_extend:HI
                   1181:         (match_operand:QI 1 "nonimmediate_operand" "")))]
                   1182:   ""
                   1183:   "
                   1184: {
                   1185:   if (GET_CODE (operand1) == REG
                   1186:       || (GET_CODE (operand1) == SUBREG
                   1187:          && GET_CODE (XEXP (operand1, 0)) == REG))
                   1188:     {
                   1189:       rtx temp = gen_reg_rtx (SImode);
                   1190:       rtx shift_24 = gen_rtx (CONST_INT, VOIDmode, 24);
                   1191:       int op0_subreg_word = 0;
                   1192:       int op1_subreg_word = 0;
                   1193: 
                   1194:       if (GET_CODE (operand1) == SUBREG)
                   1195:        {
                   1196:          op1_subreg_word = SUBREG_WORD (operand1);
                   1197:          operand1 = SUBREG_REG (operand1);
                   1198:        }
                   1199:       operand1 = gen_rtx (SUBREG, SImode, operand1, op1_subreg_word);
                   1200: 
                   1201:       if (GET_CODE (operand0) == SUBREG)
                   1202:        {
                   1203:          op0_subreg_word = SUBREG_WORD (operand0);
                   1204:          operand0 = SUBREG_REG (operand0);
                   1205:        }
                   1206:       if (GET_MODE (operand0) != SImode)
                   1207:        operand0 = gen_rtx (SUBREG, SImode, operand0, op0_subreg_word);
                   1208: 
                   1209:       emit_insn (gen_ashlsi3 (temp, operand1, shift_24));
                   1210:       emit_insn (gen_ashrsi3 (operand0, temp, shift_24));
                   1211:       DONE;
                   1212:     }
                   1213: }")
                   1214: 
                   1215: (define_insn ""
                   1216:   [(set (match_operand:HI 0 "register_operand" "=d")
                   1217:        (sign_extend:HI (match_operand:QI 1 "memory_operand" "m")))]
                   1218:   ""
                   1219:   "ldib        %1,%0"
                   1220:   [(set_attr "type" "load")])
                   1221: 
                   1222: (define_expand "zero_extendhisi2"
                   1223:   [(set (match_operand:SI 0 "register_operand" "")
                   1224:        (zero_extend:SI
                   1225:         (match_operand:HI 1 "nonimmediate_operand" "")))]
                   1226:  ""
                   1227:  "
                   1228: {
                   1229:   if (GET_CODE (operand1) == REG
                   1230:       || (GET_CODE (operand1) == SUBREG
                   1231:          && GET_CODE (XEXP (operand1, 0)) == REG))
                   1232:     {
                   1233:       rtx temp = gen_reg_rtx (SImode);
                   1234:       rtx shift_16 = gen_rtx (CONST_INT, VOIDmode, 16);
                   1235:       int op1_subreg_word = 0;
                   1236: 
                   1237:       if (GET_CODE (operand1) == SUBREG)
                   1238:        {
                   1239:          op1_subreg_word = SUBREG_WORD (operand1);
                   1240:          operand1 = SUBREG_REG (operand1);
                   1241:        }
                   1242:       operand1 = gen_rtx (SUBREG, SImode, operand1, op1_subreg_word);
                   1243: 
                   1244:       emit_insn (gen_ashlsi3 (temp, operand1, shift_16));
                   1245:       emit_insn (gen_lshrsi3 (operand0, temp, shift_16));
                   1246:       DONE;
                   1247:     }
                   1248: }")
                   1249: 
                   1250: (define_insn ""
                   1251:   [(set (match_operand:SI 0 "register_operand" "=d")
                   1252:        (zero_extend:SI (match_operand:HI 1 "memory_operand" "m")))]
                   1253:   ""
                   1254:   "ldos        %1,%0"
                   1255:   [(set_attr "type" "load")])
                   1256: 
                   1257: ;; Using shifts here generates much better code than doing an `and 255'.
                   1258: ;; This is mainly because the `and' requires loading the constant separately,
                   1259: ;; the constant is likely to get optimized, and then the compiler can't
                   1260: ;; optimize the `and' because it doesn't know that one operand is a constant.
                   1261: 
                   1262: (define_expand "zero_extendqisi2"
                   1263:   [(set (match_operand:SI 0 "register_operand" "")
                   1264:        (zero_extend:SI (match_operand:QI 1 "nonimmediate_operand" "")))]
                   1265:   ""
                   1266:   "
                   1267: {
                   1268:   if (GET_CODE (operand1) == REG
                   1269:       || (GET_CODE (operand1) == SUBREG
                   1270:          && GET_CODE (XEXP (operand1, 0)) == REG))
                   1271:     {
                   1272:       rtx temp = gen_reg_rtx (SImode);
                   1273:       rtx shift_24 = gen_rtx (CONST_INT, VOIDmode, 24);
                   1274:       int op1_subreg_word = 0;
                   1275: 
                   1276:       if (GET_CODE (operand1) == SUBREG)
                   1277:        {
                   1278:          op1_subreg_word = SUBREG_WORD (operand1);
                   1279:          operand1 = SUBREG_REG (operand1);
                   1280:        }
                   1281:       operand1 = gen_rtx (SUBREG, SImode, operand1, op1_subreg_word);
                   1282: 
                   1283:       emit_insn (gen_ashlsi3 (temp, operand1, shift_24));
                   1284:       emit_insn (gen_lshrsi3 (operand0, temp, shift_24));
                   1285:       DONE;
                   1286:     }
                   1287: }")
                   1288: 
                   1289: (define_insn ""
                   1290:   [(set (match_operand:SI 0 "register_operand" "=d")
                   1291:        (zero_extend:SI (match_operand:QI 1 "memory_operand" "m")))]
                   1292:   ""
                   1293:   "ldob        %1,%0"
                   1294:   [(set_attr "type" "load")])
                   1295: 
                   1296: (define_expand "zero_extendqihi2"
                   1297:   [(set (match_operand:HI 0 "register_operand" "")
                   1298:        (zero_extend:HI
                   1299:         (match_operand:QI 1 "nonimmediate_operand" "")))]
                   1300:   ""
                   1301:   "
                   1302: {
                   1303:   if (GET_CODE (operand1) == REG
                   1304:       || (GET_CODE (operand1) == SUBREG
                   1305:          && GET_CODE (XEXP (operand1, 0)) == REG))
                   1306:     {
                   1307:       rtx temp = gen_reg_rtx (SImode);
                   1308:       rtx shift_24 = gen_rtx (CONST_INT, VOIDmode, 24);
                   1309:       int op0_subreg_word = 0;
                   1310:       int op1_subreg_word = 0;
                   1311: 
                   1312:       if (GET_CODE (operand1) == SUBREG)
                   1313:        {
                   1314:          op1_subreg_word = SUBREG_WORD (operand1);
                   1315:          operand1 = SUBREG_REG (operand1);
                   1316:        }
                   1317:       operand1 = gen_rtx (SUBREG, SImode, operand1, op1_subreg_word);
                   1318: 
                   1319:       if (GET_CODE (operand0) == SUBREG)
                   1320:        {
                   1321:          op0_subreg_word = SUBREG_WORD (operand0);
                   1322:          operand0 = SUBREG_REG (operand0);
                   1323:        }
                   1324:       if (GET_MODE (operand0) != SImode)
                   1325:        operand0 = gen_rtx (SUBREG, SImode, operand0, op0_subreg_word);
                   1326: 
                   1327:       emit_insn (gen_ashlsi3 (temp, operand1, shift_24));
                   1328:       emit_insn (gen_lshrsi3 (operand0, temp, shift_24));
                   1329:       DONE;
                   1330:     }
                   1331: }")
                   1332: 
                   1333: (define_insn ""
                   1334:   [(set (match_operand:HI 0 "register_operand" "=d")
                   1335:        (zero_extend:HI (match_operand:QI 1 "memory_operand" "m")))]
                   1336:   ""
                   1337:   "ldob        %1,%0"
                   1338:   [(set_attr "type" "load")])
                   1339: 
                   1340: ;; Conversions between float and double.
                   1341: 
                   1342: (define_insn "extendsfdf2"
                   1343:   [(set (match_operand:DF 0 "register_operand" "=*f,d")
                   1344:        (float_extend:DF (match_operand:SF 1 "fp_arith_operand" "dGH,fGH")))]
                   1345:   "TARGET_NUMERICS"
                   1346:   "@
                   1347:   movr %1,%0
                   1348:   movrl        %1,%0"
                   1349:   [(set_attr "type" "fpmove")])
                   1350: 
                   1351: (define_insn "truncdfsf2"
                   1352:   [(set (match_operand:SF 0 "register_operand" "=d")
                   1353:        (float_truncate:SF
                   1354:         (match_operand:DF 1 "fp_arith_operand" "fGH")))]
                   1355:   "TARGET_NUMERICS"
                   1356:   "movr        %1,%0"
                   1357:   [(set_attr "type" "fpmove")])
                   1358: 
                   1359: ;; Conversion between fixed point and floating point.
                   1360: 
                   1361: (define_insn "floatsidf2"
                   1362:   [(set (match_operand:DF 0 "register_operand" "=f")
                   1363:        (float:DF (match_operand:SI 1 "register_operand" "d")))]
                   1364:   "TARGET_NUMERICS"
                   1365:   "cvtir       %1,%0"
                   1366:   [(set_attr "type" "fpcvt")])
                   1367: 
                   1368: (define_insn "floatsisf2"
                   1369:   [(set (match_operand:SF 0 "register_operand" "=d*f")
                   1370:        (float:SF (match_operand:SI 1 "register_operand" "d")))]
                   1371:   "TARGET_NUMERICS"
                   1372:   "cvtir       %1,%0"
                   1373:   [(set_attr "type" "fpcvt")])
                   1374: 
                   1375: ;; Convert a float to an actual integer.
                   1376: ;; Truncation is performed as part of the conversion.
                   1377: ;; The i960 requires conversion from DFmode to DImode to make
                   1378: ;; unsigned conversions work properly.
                   1379: 
                   1380: (define_insn "fixuns_truncdfdi2"
                   1381:   [(set (match_operand:DI 0 "register_operand" "=d")
                   1382:        (unsigned_fix:DI (fix:DF (match_operand:DF 1 "fp_arith_operand" "fGH"))))]
                   1383:   "TARGET_NUMERICS"
                   1384:   "cvtzril     %1,%0"
                   1385:   [(set_attr "type" "fpcvt")])
                   1386: 
                   1387: (define_insn "fixuns_truncsfdi2"
                   1388:   [(set (match_operand:DI 0 "register_operand" "=d")
                   1389:        (unsigned_fix:DI (fix:SF (match_operand:SF 1 "fp_arith_operand" "fGH"))))]
                   1390:   "TARGET_NUMERICS"
                   1391:   "cvtzril     %1,%0"
                   1392:   [(set_attr "type" "fpcvt")])
                   1393: 
                   1394: (define_insn "fix_truncdfsi2"
                   1395:   [(set (match_operand:SI 0 "register_operand" "=d")
                   1396:        (fix:SI (fix:DF (match_operand:DF 1 "fp_arith_operand" "fGH"))))]
                   1397:   "TARGET_NUMERICS"
                   1398:   "cvtzri      %1,%0"
                   1399:   [(set_attr "type" "fpcvt")])
                   1400: 
                   1401: (define_expand "fixuns_truncdfsi2"
                   1402:   [(set (match_operand:SI 0 "register_operand" "")
                   1403:        (unsigned_fix:SI (fix:DF (match_operand:DF 1 "fp_arith_operand" ""))))]
                   1404:   "TARGET_NUMERICS"
                   1405:   "
                   1406: {
                   1407:   rtx temp = gen_reg_rtx (DImode);
                   1408:   emit_insn (gen_rtx (SET, VOIDmode, temp,
                   1409:                      gen_rtx (UNSIGNED_FIX, DImode,
                   1410:                               gen_rtx (FIX, DFmode, operands[1]))));
                   1411:   emit_insn (gen_rtx (SET, VOIDmode, operands[0],
                   1412:                      gen_rtx (SUBREG, SImode, temp, 0)));
                   1413:   DONE;
                   1414: }")
                   1415: 
                   1416: (define_insn "fix_truncsfsi2"
                   1417:   [(set (match_operand:SI 0 "register_operand" "=d")
                   1418:        (fix:SI (fix:SF (match_operand:SF 1 "fp_arith_operand" "dfGH"))))]
                   1419:   "TARGET_NUMERICS"
                   1420:   "cvtzri      %1,%0"
                   1421:   [(set_attr "type" "fpcvt")])
                   1422: 
                   1423: (define_expand "fixuns_truncsfsi2"
                   1424:   [(set (match_operand:SI 0 "register_operand" "")
                   1425:        (unsigned_fix:SI (fix:SF (match_operand:SF 1 "fp_arith_operand" ""))))]
                   1426:   "TARGET_NUMERICS"
                   1427:   "
                   1428: {
                   1429:   rtx temp = gen_reg_rtx (DImode);
                   1430:   emit_insn (gen_rtx (SET, VOIDmode, temp,
                   1431:                      gen_rtx (UNSIGNED_FIX, DImode,
                   1432:                               gen_rtx (FIX, SFmode, operands[1]))));
                   1433:   emit_insn (gen_rtx (SET, VOIDmode, operands[0],
                   1434:                      gen_rtx (SUBREG, SImode, temp, 0)));
                   1435:   DONE;
                   1436: }")
                   1437: 
                   1438: ;; Arithmetic instructions.
                   1439: 
                   1440: (define_insn "subsi3"
                   1441:   [(set (match_operand:SI 0 "register_operand" "=d")
                   1442:        (minus:SI (match_operand:SI 1 "arith_operand" "dI")
                   1443:                  (match_operand:SI 2 "arith_operand" "dI")))]
                   1444:   ""
                   1445:   "subo        %2,%1,%0")
                   1446: 
                   1447: ;; Try to generate an lda instruction when it would be faster than an
                   1448: ;; add instruction.
                   1449: ;; Some assemblers apparently won't accept two addresses added together.
                   1450: 
                   1451: (define_insn ""
                   1452:   [(set (match_operand:SI 0 "register_operand" "=d,d,d")
                   1453:        (plus:SI (match_operand:SI 1 "arith32_operand" "%dn,i,dn")
                   1454:                 (match_operand:SI 2 "arith32_operand" "dn,dn,i")))]
                   1455:   "(TARGET_C_SERIES) && (CONSTANT_P (operands[1]) || CONSTANT_P (operands[2]))"
                   1456:   "*
                   1457: {
                   1458:   if (GET_CODE (operands[1]) == CONST_INT)
                   1459:     {
                   1460:       rtx tmp = operands[1];
                   1461:       operands[1] = operands[2];
                   1462:       operands[2] = tmp;
                   1463:     }
                   1464:   if (GET_CODE (operands[2]) == CONST_INT
                   1465:       && GET_CODE (operands[1]) == REG
                   1466:       && i960_last_insn_type != I_TYPE_REG)
                   1467:     {
                   1468:       if (INTVAL (operands[2]) < 0 && INTVAL (operands[2]) > -32)
                   1469:        return \"subo   %n2,%1,%0\";
                   1470:       else if (INTVAL (operands[2]) >= 0 && INTVAL (operands[2]) < 32)
                   1471:        return \"addo   %1,%2,%0\";
                   1472:     }
                   1473:   if (CONSTANT_P (operands[1]))
                   1474:     return \"lda       %1+%2,%0\";
                   1475:   return \"lda %2(%1),%0\";
                   1476: }")
                   1477: 
                   1478: (define_insn "addsi3"
                   1479:   [(set (match_operand:SI 0 "register_operand" "=d")
                   1480:        (plus:SI (match_operand:SI 1 "signed_arith_operand" "%dI")
                   1481:                 (match_operand:SI 2 "signed_arith_operand" "dIK")))]
                   1482:   ""
                   1483:   "*
                   1484: {
                   1485:   if (GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) < 0)
                   1486:     return \"subo      %n2,%1,%0\";
                   1487:   if (i960_bypass (insn, operands[1], operands[2], 0))
                   1488:     return \"addo      %2,%1,%0\";
                   1489:   return \"addo        %1,%2,%0\";
                   1490: }")
                   1491: 
                   1492: (define_insn "mulsi3"
                   1493:   [(set (match_operand:SI 0 "register_operand" "=d")
                   1494:        (mult:SI (match_operand:SI 1 "arith_operand" "%dI")
                   1495:                 (match_operand:SI 2 "arith_operand" "dI")))]
                   1496:   ""
                   1497:   "*
                   1498: {
                   1499:   if (i960_bypass (insn, operands[1], operands[2], 0))
                   1500:     return \"mulo      %2,%1,%0\";
                   1501:   return \"mulo        %1,%2,%0\";
                   1502: }"
                   1503:   [(set_attr "type" "mult")])
                   1504: 
                   1505: (define_insn "umulsidi3"
                   1506:   [(set (match_operand:DI 0 "register_operand" "=d")
                   1507:        (mult:DI (zero_extend:DI (match_operand:SI 1 "register_operand" "d"))
                   1508:                 (zero_extend:DI (match_operand:SI 2 "register_operand" "d"))))]
                   1509:   ""
                   1510:   "*
                   1511: {
                   1512:   if (i960_bypass (insn, operands[1], operands[2], 0))
                   1513:     return \"emul      %2,%1,%0\";
                   1514:   return \"emul        %1,%2,%0\";
                   1515: }"
                   1516:   [(set_attr "type" "mult")])
                   1517: 
                   1518: (define_insn ""
                   1519:   [(set (match_operand:DI 0 "register_operand" "=d")
                   1520:        (mult:DI (zero_extend:DI (match_operand:SI 1 "register_operand" "%d"))
                   1521:                 (match_operand:SI 2 "literal" "I")))]
                   1522:   ""
                   1523:   "*
                   1524: {
                   1525:   if (i960_bypass (insn, operands[1], operands[2], 0))
                   1526:     return \"emul      %2,%1,%0\";
                   1527:   return \"emul        %1,%2,%0\";
                   1528: }"
                   1529:   [(set_attr "type" "mult")])
                   1530: 
                   1531: ;; This goes after the move/add/sub/mul instructions  
                   1532: ;; because those instructions are better when they apply.
                   1533: 
                   1534: (define_insn ""
                   1535:   [(set (match_operand:SI 0 "register_operand" "=d")
                   1536:        (match_operand:SI 1 "address_operand" "p"))]
                   1537:   ""
                   1538:   "lda %a1,%0"
                   1539:   [(set_attr "type" "load")])
                   1540: 
                   1541: ;; This will never be selected because of an "optimization" that GCC does.
                   1542: ;; It always converts divides by a power of 2 into a sequence of instructions
                   1543: ;; that does a right shift, and then corrects the result if it was negative.
                   1544: 
                   1545: ;; (define_insn ""
                   1546: ;;   [(set (match_operand:SI 0 "register_operand" "=d")
                   1547: ;;         (div:SI (match_operand:SI 1 "arith_operand" "dI")
                   1548: ;;                 (match_operand:SI 2 "power2_operand" "nI")))]
                   1549: ;;   ""
                   1550: ;;   "*{
                   1551: ;;     operands[2] = gen_rtx(CONST_INT, VOIDmode,bitpos (INTVAL (operands[2])));
                   1552: ;;     return \"shrdi  %2,%1,%0\";
                   1553: ;;   }"
                   1554: 
                   1555: (define_insn "divsi3"
                   1556:   [(set (match_operand:SI 0 "register_operand" "=d")
                   1557:         (div:SI (match_operand:SI 1 "arith_operand" "dI")
                   1558:                 (match_operand:SI 2 "arith_operand" "dI")))]
                   1559:   ""
                   1560:   "divi        %2,%1,%0"
                   1561:   [(set_attr "type" "div")])
                   1562: 
                   1563: (define_insn "udivsi3"
                   1564:   [(set (match_operand:SI 0 "register_operand" "=d")
                   1565:         (udiv:SI (match_operand:SI 1 "arith_operand" "dI")
                   1566:                 (match_operand:SI 2 "arith_operand" "dI")))]
                   1567:   ""
                   1568:   "divo        %2,%1,%0"
                   1569:   [(set_attr "type" "div")])
                   1570: 
                   1571: ;; We must use `remi' not `modi' here, to ensure that `%' has the effects
                   1572: ;; specified by the ANSI C standard.
                   1573: 
                   1574: (define_insn "modsi3"
                   1575:   [(set (match_operand:SI 0 "register_operand" "=d")
                   1576:         (mod:SI (match_operand:SI 1 "arith_operand" "dI")
                   1577:                 (match_operand:SI 2 "arith_operand" "dI")))]
                   1578:   ""
                   1579:   "remi        %2,%1,%0"
                   1580:   [(set_attr "type" "div")])
                   1581: 
                   1582: (define_insn "umodsi3"
                   1583:   [(set (match_operand:SI 0 "register_operand" "=d")
                   1584:         (umod:SI (match_operand:SI 1 "arith_operand" "dI")
                   1585:                 (match_operand:SI 2 "arith_operand" "dI")))]
                   1586:   ""
                   1587:   "remo        %2,%1,%0"
                   1588:   [(set_attr "type" "div")])
                   1589: 
                   1590: ;; And instructions (with complement also).
                   1591: 
                   1592: (define_insn "andsi3"
                   1593:   [(set (match_operand:SI 0 "register_operand" "=d")
                   1594:        (and:SI (match_operand:SI 1 "arith_operand" "%dI")
                   1595:                (match_operand:SI 2 "arith_operand" "dI")))]
                   1596:   ""
                   1597:   "*
                   1598: {
                   1599:   if (i960_bypass (insn, operands[1], operands[2], 0))
                   1600:     return \"and       %2,%1,%0\";
                   1601:   return \"and %1,%2,%0\";
                   1602: }")
                   1603: 
                   1604: (define_insn ""
                   1605:   [(set (match_operand:SI 0 "register_operand" "=d")
                   1606:        (and:SI (not:SI (match_operand:SI 1 "arith_operand" "dI"))
                   1607:                (match_operand:SI 2 "arith_operand" "dI")))]
                   1608:   ""
                   1609:   "*
                   1610: {
                   1611:   if (i960_bypass (insn, operands[1], operands[2], 0))
                   1612:     return \"notand    %2,%1,%0\";
                   1613:   return \"andnot      %1,%2,%0\";
                   1614: }")
                   1615: 
                   1616: (define_insn ""
                   1617:   [(set (match_operand:SI 0 "register_operand" "=d")
                   1618:        (ior:SI (not:SI (match_operand:SI 1 "arith_operand" "%dI"))
                   1619:                (not:SI (match_operand:SI 2 "arith_operand" "dI"))))]
                   1620:   ""
                   1621:   "*
                   1622: {
                   1623:   if (i960_bypass (insn, operands[1], operands[2], 0))
                   1624:     return \"nand      %2,%1,%0\";
                   1625:   return \"nand        %1,%2,%0\";
                   1626: }")
                   1627: 
                   1628: (define_insn ""
                   1629:   [(set (match_operand:SI 0 "register_operand" "=d")
                   1630:        (ior:SI (match_operand:SI 1 "arith_operand" "dI")
                   1631:                (match_operand:SI 2 "power2_operand" "n")))]
                   1632:   ""
                   1633:   "*
                   1634: {
                   1635:   operands[2] = gen_rtx (CONST_INT, VOIDmode,
                   1636:                         bitpos (INTVAL (operands[2])));
                   1637:   return \"setbit      %2,%1,%0\";
                   1638: }")
                   1639: 
                   1640: (define_insn ""
                   1641:   [(set (match_operand:SI 0 "register_operand" "=d")
                   1642:        (ior:SI (ashift:SI (const_int 1)
                   1643:                           (match_operand:SI 1 "register_operand" "d"))
                   1644:                (match_operand:SI 2 "arith_operand" "dI")))]
                   1645:   ""
                   1646:   "setbit      %1,%2,%0")
                   1647: 
                   1648: (define_insn ""
                   1649:   [(set (match_operand:SI 0 "register_operand" "=d")
                   1650:        (and:SI (match_operand:SI 1 "arith_operand" "dI")
                   1651:                (match_operand:SI 2 "cmplpower2_operand" "n")))]
                   1652:   ""
                   1653:   "*
                   1654: {
                   1655:   operands[2] = gen_rtx (CONST_INT, VOIDmode,
                   1656:                         bitpos (~INTVAL (operands[2])));
                   1657:   return \"clrbit      %2,%1,%0\";
                   1658: }")
                   1659: 
                   1660: (define_insn ""
                   1661:   [(set (match_operand:SI 0 "register_operand" "=d")
                   1662:        (and:SI (ashift:SI (const_int 1)
                   1663:                           (match_operand:SI 1 "register_operand" "d"))
                   1664:                (match_operand:SI 2 "arith_operand" "dI")))]
                   1665:   ""
                   1666:   "clrbit      %1,%2,%0")
                   1667: 
                   1668: (define_insn ""
                   1669:   [(set (match_operand:SI 0 "register_operand" "=d")
                   1670:        (xor:SI (match_operand:SI 1 "arith_operand" "dI")
                   1671:                (match_operand:SI 2 "power2_operand" "n")))]
                   1672:   ""
                   1673:   "*
                   1674: {
                   1675:   operands[2] = gen_rtx (CONST_INT, VOIDmode,
                   1676:                         bitpos (INTVAL (operands[2])));
                   1677:   return \"notbit      %2,%1,%0\";
                   1678: }")
                   1679: 
                   1680: (define_insn ""
                   1681:   [(set (match_operand:SI 0 "register_operand" "=d")
                   1682:        (xor:SI (ashift:SI (const_int 1)
                   1683:                           (match_operand:SI 1 "register_operand" "d"))
                   1684:                (match_operand:SI 2 "arith_operand" "dI")))]
                   1685:   ""
                   1686:   "notbit      %1,%2,%0")
                   1687: 
                   1688: (define_insn "iorsi3"
                   1689:   [(set (match_operand:SI 0 "register_operand" "=d")
                   1690:        (ior:SI (match_operand:SI 1 "arith_operand" "%dI")
                   1691:                (match_operand:SI 2 "arith_operand" "dI")))]
                   1692:   ""
                   1693:   "*
                   1694: {
                   1695:   if (i960_bypass (insn, operands[1], operands[2], 0))
                   1696:     return \"or        %2,%1,%0\";
                   1697:   return \"or  %1,%2,%0\";
                   1698: }")
                   1699: 
                   1700: (define_insn ""
                   1701:   [(set (match_operand:SI 0 "register_operand" "=d")
                   1702:        (ior:SI (not:SI (match_operand:SI 1 "arith_operand" "dI"))
                   1703:                (match_operand:SI 2 "arith_operand" "dI")))]
                   1704:   ""
                   1705:   "*
                   1706: {
                   1707:   if (i960_bypass (insn, operands[1], operands[2], 0))
                   1708:     return \"notor     %2,%1,%0\";
                   1709:   return \"ornot       %1,%2,%0\";
                   1710: }")
                   1711: 
                   1712: (define_insn ""
                   1713:   [(set (match_operand:SI 0 "register_operand" "=d")
                   1714:        (and:SI (not:SI (match_operand:SI 1 "arith_operand" "%dI"))
                   1715:                (not:SI (match_operand:SI 2 "arith_operand" "dI"))))]
                   1716:   ""
                   1717:   "*
                   1718: {
                   1719:   if (i960_bypass (insn, operands[1], operands[2], 0))
                   1720:     return \"nor       %2,%1,%0\";
                   1721:   return \"nor %1,%2,%0\";
                   1722: }")
                   1723: 
                   1724: (define_insn "xorsi3"
                   1725:   [(set (match_operand:SI 0 "register_operand" "=d")
                   1726:        (xor:SI (match_operand:SI 1 "arith_operand" "%dI")
                   1727:                (match_operand:SI 2 "arith_operand" "dI")))]
                   1728:   ""
                   1729:   "*
                   1730: {
                   1731:   if (i960_bypass (insn, operands[1], operands[2], 0))
                   1732:     return \"xor       %2,%1,%0\";
                   1733:   return \"xor %1,%2,%0\";
                   1734: }")
                   1735: 
                   1736: (define_insn ""
                   1737:   [(set (match_operand:SI 0 "register_operand" "=d")
                   1738:        (not:SI (xor:SI (match_operand:SI 1 "arith_operand" "%dI")
                   1739:                        (match_operand:SI 2 "arith_operand" "dI"))))]
                   1740:   ""
                   1741:   "*
                   1742: {
                   1743:   if (i960_bypass (insn, operands[1], operands[2], 0))
                   1744:     return \"xnor      %2,%1,%0\";
                   1745:   return \"xnor        %2,%1,%0\";
                   1746: }")
                   1747: 
                   1748: (define_insn "negsi2"
                   1749:   [(set (match_operand:SI 0 "register_operand" "=d")
                   1750:        (neg:SI (match_operand:SI 1 "arith_operand" "dI")))]
                   1751:   ""
                   1752:   "subo        %1,0,%0"
                   1753:   [(set_attr "length" "1")])
                   1754: 
                   1755: (define_insn "one_cmplsi2"
                   1756:   [(set (match_operand:SI 0 "register_operand" "=d")
                   1757:        (not:SI (match_operand:SI 1 "arith_operand" "dI")))]
                   1758:   ""
                   1759:   "not %1,%0"
                   1760:   [(set_attr "length" "1")])
                   1761: 
                   1762: ;; Floating point arithmetic instructions.
                   1763: 
                   1764: (define_insn "adddf3"
                   1765:   [(set (match_operand:DF 0 "register_operand" "=d*f")
                   1766:        (plus:DF (match_operand:DF 1 "fp_arith_operand" "%rGH")
                   1767:                 (match_operand:DF 2 "fp_arith_operand" "rGH")))]
                   1768:   "TARGET_NUMERICS"
                   1769:   "addrl       %1,%2,%0"
                   1770:   [(set_attr "type" "fpadd")])
                   1771: 
                   1772: (define_insn "addsf3"
                   1773:   [(set (match_operand:SF 0 "register_operand" "=d*f")
                   1774:        (plus:SF (match_operand:SF 1 "fp_arith_operand" "%rGH")
                   1775:                 (match_operand:SF 2 "fp_arith_operand" "rGH")))]
                   1776:   "TARGET_NUMERICS"
                   1777:   "addr        %1,%2,%0"
                   1778:   [(set_attr "type" "fpadd")])
                   1779: 
                   1780: 
                   1781: (define_insn "subdf3"
                   1782:   [(set (match_operand:DF 0 "register_operand" "=d*f")
                   1783:        (minus:DF (match_operand:DF 1 "fp_arith_operand" "rGH")
                   1784:                  (match_operand:DF 2 "fp_arith_operand" "rGH")))]
                   1785:   "TARGET_NUMERICS"
                   1786:   "subrl       %2,%1,%0"
                   1787:   [(set_attr "type" "fpadd")])
                   1788: 
                   1789: (define_insn "subsf3"
                   1790:   [(set (match_operand:SF 0 "register_operand" "=d*f")
                   1791:        (minus:SF (match_operand:SF 1 "fp_arith_operand" "rGH")
                   1792:                  (match_operand:SF 2 "fp_arith_operand" "rGH")))]
                   1793:   "TARGET_NUMERICS"
                   1794:   "subr        %2,%1,%0"
                   1795:   [(set_attr "type" "fpadd")])
                   1796: 
                   1797: 
                   1798: (define_insn "muldf3"
                   1799:   [(set (match_operand:DF 0 "register_operand" "=d*f")
                   1800:        (mult:DF (match_operand:DF 1 "fp_arith_operand" "%rGH")
                   1801:                 (match_operand:DF 2 "fp_arith_operand" "rGH")))]
                   1802:   "TARGET_NUMERICS"
                   1803:   "mulrl       %1,%2,%0"
                   1804:   [(set_attr "type" "fpmul")])
                   1805: 
                   1806: (define_insn "mulsf3"
                   1807:   [(set (match_operand:SF 0 "register_operand" "=d*f")
                   1808:        (mult:SF (match_operand:SF 1 "fp_arith_operand" "%rGH")
                   1809:                 (match_operand:SF 2 "fp_arith_operand" "rGH")))]
                   1810:   "TARGET_NUMERICS"
                   1811:   "mulr        %1,%2,%0"
                   1812:   [(set_attr "type" "fpmul")])
                   1813: 
                   1814: 
                   1815: (define_insn "divdf3"
                   1816:   [(set (match_operand:DF 0 "register_operand" "=d*f")
                   1817:        (div:DF (match_operand:DF 1 "fp_arith_operand" "rGH")
                   1818:                (match_operand:DF 2 "fp_arith_operand" "rGH")))]
                   1819:   "TARGET_NUMERICS"
                   1820:   "divrl       %2,%1,%0"
                   1821:   [(set_attr "type" "fpdiv")])
                   1822: 
                   1823: (define_insn "divsf3"
                   1824:   [(set (match_operand:SF 0 "register_operand" "=d*f")
                   1825:        (div:SF (match_operand:SF 1 "fp_arith_operand" "rGH")
                   1826:                (match_operand:SF 2 "fp_arith_operand" "rGH")))]
                   1827:   "TARGET_NUMERICS"
                   1828:   "divr        %2,%1,%0"
                   1829:   [(set_attr "type" "fpdiv")])
                   1830: 
                   1831: (define_insn "negdf2"
                   1832:   [(set (match_operand:DF 0 "register_operand" "=d,d*f")
                   1833:        (neg:DF (match_operand:DF 1 "register_operand" "d,r")))]
                   1834:   ""
                   1835:   "*
                   1836: {
                   1837:   if (which_alternative == 0)
                   1838:     {
                   1839:       if (REGNO (operands[0]) == REGNO (operands[1]))
                   1840:        return \"notbit 31,%D1,%D0\";
                   1841:       return \"mov     %1,%0\;notbit   31,%D1,%D0\";
                   1842:     }
                   1843:   return \"subrl       %1,0f0.0,%0\";
                   1844: }"
                   1845:   [(set_attr "type" "fpadd")])
                   1846: 
                   1847: (define_insn "negsf2"
                   1848:   [(set (match_operand:SF 0 "register_operand" "=d,d*f")
                   1849:        (neg:SF (match_operand:SF 1 "register_operand" "d,r")))]
                   1850:   ""
                   1851:   "@
                   1852:   notbit       31,%1,%0
                   1853:   subr %1,0f0.0,%0"
                   1854:   [(set_attr "type" "fpadd")])
                   1855: 
                   1856: ;;; The abs patterns also work even if the target machine doesn't have
                   1857: ;;; floating point, because in that case dstreg and srcreg will always be
                   1858: ;;; less than 32.
                   1859: 
                   1860: (define_insn "absdf2"
                   1861:   [(set (match_operand:DF 0 "register_operand" "=d*f")
                   1862:        (abs:DF (match_operand:DF 1 "register_operand" "df")))]
                   1863:   ""
                   1864:   "*
                   1865: {
                   1866:   int dstreg = REGNO (operands[0]);
                   1867:   int srcreg = REGNO (operands[1]);
                   1868: 
                   1869:   if (dstreg < 32)
                   1870:     {
                   1871:       if (srcreg < 32)
                   1872:        {
                   1873:          if (dstreg != srcreg)
                   1874:            output_asm_insn (\"mov      %1,%0\", operands);
                   1875:          return \"clrbit       31,%D1,%D0\";
                   1876:        }
                   1877:       /* Src is an fp reg.  */
                   1878:       return \"movrl   %1,%0\;clrbit   31,%D1,%D0\";
                   1879:     }
                   1880:   if (srcreg >= 32)
                   1881:     return \"cpysre    %1,0f0.0,%0\";
                   1882:   return \"movrl       %1,%0\;cpysre   %0,0f0.0,%0\";
                   1883: }"
                   1884:   [(set_attr "type" "multi")])
                   1885: 
                   1886: (define_insn "abssf2"
                   1887:   [(set (match_operand:SF 0 "register_operand" "=d*f")
                   1888:        (abs:SF (match_operand:SF 1 "register_operand" "df")))]
                   1889:   ""
                   1890:   "*
                   1891: {
                   1892:   int dstreg = REGNO (operands[0]);
                   1893:   int srcreg = REGNO (operands[1]);
                   1894: 
                   1895:   if (dstreg < 32 && srcreg < 32)
                   1896:     return \"clrbit    31,%1,%0\";
                   1897: 
                   1898:   if (dstreg >= 32 && srcreg >= 32)
                   1899:     return \"cpysre    %1,0f0.0,%0\";
                   1900: 
                   1901:   if (dstreg < 32)
                   1902:     return \"movr      %1,%0\;clrbit   31,%0,%0\";
                   1903: 
                   1904:   return \"movr        %1,%0\;cpysre   %0,0f0.0,%0\";
                   1905: }"
                   1906:   [(set_attr "type" "multi")])
                   1907: 
                   1908: ;; Tetra (16 byte) float support.
                   1909: 
                   1910: (define_insn "cmptf"
                   1911:   [(set (reg:CC 36)
                   1912:        (compare:CC (match_operand:TF 0 "register_operand" "f")
                   1913:                    (match_operand:TF 1 "nonmemory_operand" "fG")))]
                   1914:   "TARGET_NUMERICS"
                   1915:   "cmpr        %0,%1"
                   1916:   [(set_attr "type" "fpcc")])
                   1917: 
                   1918: (define_expand "movtf"
                   1919:   [(set (match_operand:TF 0 "general_operand" "")
                   1920:        (match_operand:TF 1 "fpmove_src_operand" ""))]
                   1921:   ""
                   1922:   "
                   1923: {
                   1924:   if (emit_move_sequence (operands, TFmode))
                   1925:     DONE;
                   1926: }")
                   1927: 
                   1928: (define_insn ""
                   1929:   [(set (match_operand:TF 0 "general_operand" "=r,*f,d,d,m,o")
                   1930:        (match_operand:TF 1 "fpmove_src_operand" "r,GH,F,m,d,G"))]
                   1931:   "(current_function_args_size == 0
                   1932:     && rtx_equal_function_value_matters == 0)
                   1933:    && (register_operand (operands[0], TFmode)
                   1934:        || register_operand (operands[1], TFmode)
                   1935:        || operands[1] == CONST0_RTX (TFmode))"
                   1936:   "*
                   1937: {
                   1938:   switch (which_alternative)
                   1939:     {
                   1940:     case 0:
                   1941:       if (FP_REG_P (operands[0]) || FP_REG_P (operands[1]))
                   1942:        return \"movre  %1,%0\";
                   1943:       else
                   1944:        return \"movq   %1,%0\";
                   1945:     case 1:
                   1946:       return \"movre   %1,%0\";
                   1947:     case 2:
                   1948:       return i960_output_ldconst (operands[0], operands[1]);
                   1949:     case 3:
                   1950:       return \"ldq     %1,%0\";
                   1951:     case 4:
                   1952:       return \"stq     %1,%0\";
                   1953:     case 5:
                   1954:       operands[1] = adj_offsettable_operand (operands[0], 4);
                   1955:       operands[2] = adj_offsettable_operand (operands[0], 8);
                   1956:       operands[3] = adj_offsettable_operand (operands[0], 12);
                   1957:       return \"st      g14,%0\;st      g14,%1\;st      g14,%2\;st      g14,%3\";
                   1958:     }
                   1959: }"
                   1960:   [(set_attr "type" "move,move,load,fpload,fpstore,fpstore")])
                   1961: 
                   1962: (define_insn ""
                   1963:   [(set (match_operand:TF 0 "general_operand" "=r,*f,d,d,m")
                   1964:        (match_operand:TF 1 "fpmove_src_operand" "r,GH,F,m,d"))]
                   1965:   "(current_function_args_size != 0
                   1966:     || rtx_equal_function_value_matters != 0)
                   1967:    && (register_operand (operands[0], TFmode)
                   1968:        || register_operand (operands[1], TFmode))"
                   1969:   "*
                   1970: {
                   1971:   switch (which_alternative)
                   1972:     {
                   1973:     case 0:
                   1974:       if (FP_REG_P (operands[0]) || FP_REG_P (operands[1]))
                   1975:        return \"movre  %1,%0\";
                   1976:       else
                   1977:        return \"movq   %1,%0\";
                   1978:     case 1:
                   1979:       return \"movre   %1,%0\";
                   1980:     case 2:
                   1981:       return i960_output_ldconst (operands[0], operands[1]);
                   1982:     case 3:
                   1983:       return \"ldq     %1,%0\";
                   1984:     case 4:
                   1985:       return \"stq     %1,%0\";
                   1986:     }
                   1987: }"
                   1988:   [(set_attr "type" "move,move,load,fpload,fpstore")])
                   1989: 
                   1990: (define_insn "extendsftf2"
                   1991:   [(set (match_operand:TF 0 "register_operand" "=*f,d")
                   1992:        (float_extend:TF
                   1993:         (match_operand:SF 1 "register_operand" "d,f")))]
                   1994:   "TARGET_NUMERICS"
                   1995:   "@
                   1996:   movr %1,%0
                   1997:   movre        %1,%0"
                   1998:   [(set_attr "type" "fpmove")])
                   1999: 
                   2000: (define_insn "extenddftf2"
                   2001:   [(set (match_operand:TF 0 "register_operand" "=*f,d")
                   2002:        (float_extend:TF
                   2003:         (match_operand:DF 1 "register_operand" "d,f")))]
                   2004:   "TARGET_NUMERICS"
                   2005:   "@
                   2006:   movrl        %1,%0
                   2007:   movre        %1,%0"
                   2008:   [(set_attr "type" "fpmove")])
                   2009: 
                   2010: (define_insn "trunctfdf2"
                   2011:   [(set (match_operand:DF 0 "register_operand" "=d")
                   2012:        (float_truncate:DF
                   2013:         (match_operand:TF 1 "register_operand" "f")))]
                   2014:   "TARGET_NUMERICS"
                   2015:   "movrl       %1,%0"
                   2016:   [(set_attr "type" "fpmove")])
                   2017: 
                   2018: (define_insn "trunctfsf2"
                   2019:   [(set (match_operand:SF 0 "register_operand" "=d")
                   2020:        (float_truncate:SF
                   2021:         (match_operand:TF 1 "register_operand" "f")))]
                   2022:   "TARGET_NUMERICS"
                   2023:   "movr        %1,%0"
                   2024:   [(set_attr "type" "fpmove")])
                   2025: 
                   2026: (define_insn "floatsitf2"
                   2027:   [(set (match_operand:TF 0 "register_operand" "=f")
                   2028:        (float:TF (match_operand:SI 1 "register_operand" "d")))]
                   2029:   "TARGET_NUMERICS"
                   2030:   "cvtir       %1,%0"
                   2031:   [(set_attr "type" "fpcvt")])
                   2032: 
                   2033: (define_insn "fix_trunctfsi2"
                   2034:   [(set (match_operand:SI 0 "register_operand" "=d")
                   2035:        (fix:SI (fix:TF (match_operand:TF 1 "register_operand" "f"))))]
                   2036:   "TARGET_NUMERICS"
                   2037:   "cvtzri      %1,%0"
                   2038:   [(set_attr "type" "fpcvt")])
                   2039: 
                   2040: (define_insn "fixuns_trunctfsi2"
                   2041:   [(set (match_operand:SI 0 "register_operand" "=d")
                   2042:        (unsigned_fix:SI (fix:TF (match_operand:TF 1 "register_operand" "f"))))]
                   2043:   "TARGET_NUMERICS"
                   2044:   "cvtzri      %1,%0"
                   2045:   [(set_attr "type" "fpcvt")])
                   2046: 
                   2047: (define_insn "addtf3"
                   2048:   [(set (match_operand:TF 0 "register_operand" "=f")
                   2049:        (plus:TF (match_operand:TF 1 "nonmemory_operand" "%fG")
                   2050:                 (match_operand:TF 2 "nonmemory_operand" "fG")))]
                   2051:   "TARGET_NUMERICS"
                   2052:   "addr        %1,%2,%0"
                   2053:   [(set_attr "type" "fpadd")])
                   2054: 
                   2055: (define_insn "subtf3"
                   2056:   [(set (match_operand:TF 0 "register_operand" "=f")
                   2057:        (minus:TF (match_operand:TF 1 "nonmemory_operand" "fG")
                   2058:                  (match_operand:TF 2 "nonmemory_operand" "fG")))]
                   2059:   "TARGET_NUMERICS"
                   2060:   "subr        %2,%1,%0"
                   2061:   [(set_attr "type" "fpadd")])
                   2062: 
                   2063: (define_insn "multf3"
                   2064:   [(set (match_operand:TF 0 "register_operand" "=f")
                   2065:        (mult:TF (match_operand:TF 1 "nonmemory_operand" "%fG")
                   2066:                 (match_operand:TF 2 "nonmemory_operand" "fG")))]
                   2067:   "TARGET_NUMERICS"
                   2068:   "mulr        %1,%2,%0"
                   2069:   [(set_attr "type" "fpmul")])
                   2070: 
                   2071: (define_insn "divtf3"
                   2072:   [(set (match_operand:TF 0 "register_operand" "=f")
                   2073:        (div:TF (match_operand:TF 1 "nonmemory_operand" "fG")
                   2074:                (match_operand:TF 2 "nonmemory_operand" "fG")))]
                   2075:   "TARGET_NUMERICS"
                   2076:   "divr        %2,%1,%0"
                   2077:   [(set_attr "type" "fpdiv")])
                   2078: 
                   2079: (define_insn "negtf2"
                   2080:   [(set (match_operand:TF 0 "register_operand" "=f")
                   2081:        (neg:TF (match_operand:TF 1 "register_operand" "f")))]
                   2082:   "TARGET_NUMERICS"
                   2083:   "subr        %1,0f0.0,%0"
                   2084:   [(set_attr "type" "fpadd")])
                   2085: 
                   2086: (define_insn "abstf2"
                   2087:   [(set (match_operand:TF 0 "register_operand" "=f")
                   2088:        (abs:TF (match_operand:TF 1 "register_operand" "f")))]
                   2089:   "(TARGET_NUMERICS)"
                   2090:   "cpysre      %1,0f0.0,%0"
                   2091:   [(set_attr "type" "fpmove")])
                   2092: 
                   2093: ;; Arithmetic shift instructions.
                   2094: 
                   2095: ;; The shli instruction generates an overflow fault if the sign changes.
                   2096: ;; In the case of overflow, it does not give the natural result, it instead
                   2097: ;; gives the last shift value before the overflow.  We can not use this
                   2098: ;; instruction because gcc thinks that arithmetic left shift and logical
                   2099: ;; left shift are identical, and sometimes canonicalizes the logical left
                   2100: ;; shift to an arithmetic left shift.  Therefore we must always use the
                   2101: ;; logical left shift instruction.
                   2102: 
                   2103: (define_insn "ashlsi3"
                   2104:   [(set (match_operand:SI 0 "register_operand" "=d")
                   2105:        (ashift:SI (match_operand:SI 1 "arith_operand" "dI")
                   2106:                   (match_operand:SI 2 "arith_operand" "dI")))]
                   2107:   ""
                   2108:   "shlo        %2,%1,%0"
                   2109:   [(set_attr "type" "alu2")])
                   2110: 
                   2111: (define_insn "ashrsi3"
                   2112:   [(set (match_operand:SI 0 "register_operand" "=d")
                   2113:        (ashiftrt:SI (match_operand:SI 1 "arith_operand" "dI")
                   2114:                     (match_operand:SI 2 "arith_operand" "dI")))]
                   2115:   ""
                   2116:   "shri        %2,%1,%0"
                   2117:   [(set_attr "type" "alu2")])
                   2118: 
                   2119: (define_insn "lshrsi3"
                   2120:   [(set (match_operand:SI 0 "register_operand" "=d")
                   2121:        (lshiftrt:SI (match_operand:SI 1 "arith_operand" "dI")
                   2122:                   (match_operand:SI 2 "arith_operand" "dI")))]
                   2123:   ""
                   2124:   "shro        %2,%1,%0"
                   2125:   [(set_attr "type" "alu2")])
                   2126: 
                   2127: ;; Unconditional and other jump instructions.
                   2128: 
                   2129: (define_insn "jump"
                   2130:   [(set (pc)
                   2131:        (label_ref (match_operand 0 "" "")))]
                   2132:   ""
                   2133:   "b   %l0"
                   2134:   [(set_attr "type" "branch")])
                   2135: 
                   2136: (define_insn "indirect_jump"
                   2137:   [(set (pc) (match_operand:SI 0 "address_operand" "p"))]
                   2138:   ""
                   2139:   "bx  %a0"
                   2140:   [(set_attr "type" "branch")])
                   2141: 
                   2142: (define_insn "tablejump"
                   2143:   [(set (pc) (match_operand:SI 0 "register_operand" "d"))
                   2144:    (use (label_ref (match_operand 1 "" "")))]
                   2145:   ""
                   2146:   "bx  (%0)"
                   2147:   [(set_attr "type" "branch")])
                   2148: 
                   2149: ;;- jump to subroutine
                   2150: 
                   2151: (define_expand "call"
                   2152:   [(call (match_operand:SI 0 "general_operand" "g")
                   2153:         (match_operand:SI 1 "immediate_operand" "i"))]
                   2154:   ""
                   2155:   "
                   2156: {
                   2157:   emit_insn (gen_call_internal (operands[0], operands[1],
                   2158:                                virtual_outgoing_args_rtx));
                   2159:   DONE;
                   2160: }")
                   2161: 
                   2162: ;; We need a call saved register allocated for the match_scratch, so we use
                   2163: ;; 'l' because all local registers are call saved.
                   2164: 
                   2165: ;; ??? I would prefer to use a match_scratch here, but match_scratch allocated
                   2166: ;; registers can't be used for spills.  In a function with lots of calls,
                   2167: ;; local-alloc may allocate all local registers to a match_scratch, leaving
                   2168: ;; no local registers available for spills.
                   2169: 
                   2170: (define_insn "call_internal"
                   2171:   [(call (match_operand:SI 0 "general_operand" "g")
                   2172:         (match_operand:SI 1 "immediate_operand" "i"))
                   2173:    (use (match_operand:SI 2 "address_operand" "p"))
                   2174:    (clobber (reg:SI 19))]
                   2175:   ""
                   2176:   "* return i960_output_call_insn (operands[0], operands[1], operands[2],
                   2177:                                   insn);"
                   2178:   [(set_attr "type" "call")])
                   2179: 
                   2180: (define_expand "call_value"
                   2181:   [(set (match_operand 0 "register_operand" "=d")
                   2182:        (call (match_operand:SI 1 "general_operand" "g")
                   2183:              (match_operand:SI 2 "immediate_operand" "i")))]
                   2184:   ""
                   2185:   "
                   2186: {
                   2187:   emit_insn (gen_call_value_internal (operands[0], operands[1], operands[2],
                   2188:                                      virtual_outgoing_args_rtx));
                   2189:   DONE;
                   2190: }")
                   2191: 
                   2192: ;; We need a call saved register allocated for the match_scratch, so we use
                   2193: ;; 'l' because all local registers are call saved.
                   2194: 
                   2195: (define_insn "call_value_internal"
                   2196:   [(set (match_operand 0 "register_operand" "=d")
                   2197:        (call (match_operand:SI 1 "general_operand" "g")
                   2198:              (match_operand:SI 2 "immediate_operand" "i")))
                   2199:    (use (match_operand:SI 3 "address_operand" "p"))
                   2200:    (clobber (reg:SI 19))]
                   2201:   ""
                   2202:   "* return i960_output_call_insn (operands[1], operands[2], operands[3],
                   2203:                                   insn);"
                   2204:   [(set_attr "type" "call")])
                   2205: 
                   2206: (define_insn "return"
                   2207:   [(return)]
                   2208:   ""
                   2209:   "* return i960_output_ret_insn (insn);"
                   2210:   [(set_attr "type" "branch")])
                   2211: 
                   2212: (define_insn "nop"
                   2213:   [(const_int 0)]
                   2214:   ""
                   2215:   "")
                   2216: 
                   2217: ;; Various peephole optimizations for multiple-word moves, loads, and stores.
                   2218: ;; Multiple register moves.
                   2219: 
                   2220: ;; Matched 5/28/91
                   2221: (define_peephole
                   2222:   [(set (match_operand:SI 0 "register_operand" "=r")
                   2223:        (match_operand:SI 1 "register_operand" "r"))
                   2224:    (set (match_operand:SI 2 "register_operand" "=r")
                   2225:        (match_operand:SI 3 "register_operand" "r"))
                   2226:    (set (match_operand:SI 4 "register_operand" "=r")
                   2227:        (match_operand:SI 5 "register_operand" "r"))
                   2228:    (set (match_operand:SI 6 "register_operand" "=r")
                   2229:        (match_operand:SI 7 "register_operand" "r"))]
                   2230:   "((REGNO (operands[0]) & 3) == 0)
                   2231:    && ((REGNO (operands[1]) & 3) == 0)
                   2232:    && (REGNO (operands[0]) + 1 == REGNO (operands[2]))
                   2233:    && (REGNO (operands[1]) + 1 == REGNO (operands[3]))
                   2234:    && (REGNO (operands[0]) + 2 == REGNO (operands[4]))
                   2235:    && (REGNO (operands[1]) + 2 == REGNO (operands[5]))
                   2236:    && (REGNO (operands[0]) + 3 == REGNO (operands[6]))
                   2237:    && (REGNO (operands[1]) + 3 == REGNO (operands[7]))"
                   2238:   "movq        %1,%0")
                   2239: 
                   2240: ;; Matched 4/17/92
                   2241: (define_peephole
                   2242:   [(set (match_operand:DI 0 "register_operand" "=r")
                   2243:        (match_operand:DI 1 "register_operand" "r"))
                   2244:    (set (match_operand:DI 2 "register_operand" "=r")
                   2245:        (match_operand:DI 3 "register_operand" "r"))]
                   2246:   "((REGNO (operands[0]) & 3) == 0)
                   2247:    && ((REGNO (operands[1]) & 3) == 0)
                   2248:    && (REGNO (operands[0]) + 2 == REGNO (operands[2]))
                   2249:    && (REGNO (operands[1]) + 2 == REGNO (operands[3]))"
                   2250:   "movq        %1,%0")
                   2251: 
                   2252: ;; Matched 4/17/92
                   2253: (define_peephole
                   2254:   [(set (match_operand:DI 0 "register_operand" "=r")
                   2255:        (match_operand:DI 1 "register_operand" "r"))
                   2256:    (set (match_operand:SI 2 "register_operand" "=r")
                   2257:        (match_operand:SI 3 "register_operand" "r"))
                   2258:    (set (match_operand:SI 4 "register_operand" "=r")
                   2259:        (match_operand:SI 5 "register_operand" "r"))]
                   2260:   "((REGNO (operands[0]) & 3) == 0)
                   2261:    && ((REGNO (operands[1]) & 3) == 0)
                   2262:    && (REGNO (operands[0]) + 2 == REGNO (operands[2]))
                   2263:    && (REGNO (operands[1]) + 2 == REGNO (operands[3]))
                   2264:    && (REGNO (operands[0]) + 3 == REGNO (operands[4]))
                   2265:    && (REGNO (operands[1]) + 3 == REGNO (operands[5]))"
                   2266:   "movq        %1,%0")
                   2267: 
                   2268: ;; Matched 4/17/92
                   2269: (define_peephole
                   2270:   [(set (match_operand:SI 0 "register_operand" "=r")
                   2271:        (match_operand:SI 1 "register_operand" "r"))
                   2272:    (set (match_operand:SI 2 "register_operand" "=r")
                   2273:        (match_operand:SI 3 "register_operand" "r"))
                   2274:    (set (match_operand:DI 4 "register_operand" "=r")
                   2275:        (match_operand:DI 5 "register_operand" "r"))]
                   2276:   "((REGNO (operands[0]) & 3) == 0)
                   2277:    && ((REGNO (operands[1]) & 3) == 0)
                   2278:    && (REGNO (operands[0]) + 1 == REGNO (operands[2]))
                   2279:    && (REGNO (operands[1]) + 1 == REGNO (operands[3]))
                   2280:    && (REGNO (operands[0]) + 2 == REGNO (operands[4]))
                   2281:    && (REGNO (operands[1]) + 2 == REGNO (operands[5]))"
                   2282:   "movq        %1,%0")
                   2283: 
                   2284: ;; Matched 4/17/92
                   2285: (define_peephole
                   2286:   [(set (match_operand:DI 0 "register_operand" "=r")
                   2287:        (match_operand:DI 1 "register_operand" "r"))
                   2288:    (set (match_operand:SI 2 "register_operand" "=r")
                   2289:        (match_operand:SI 3 "register_operand" "r"))]
                   2290:   "((REGNO (operands[0]) & 3) == 0)
                   2291:    && ((REGNO (operands[1]) & 3) == 0)
                   2292:    && (REGNO (operands[0]) + 2 == REGNO (operands[2]))
                   2293:    && (REGNO (operands[1]) + 2 == REGNO (operands[3]))"
                   2294:   "movt        %1,%0")
                   2295: 
                   2296: ;; Matched 5/28/91
                   2297: (define_peephole
                   2298:   [(set (match_operand:SI 0 "register_operand" "=r")
                   2299:        (match_operand:SI 1 "register_operand" "r"))
                   2300:    (set (match_operand:SI 2 "register_operand" "=r")
                   2301:        (match_operand:SI 3 "register_operand" "r"))
                   2302:    (set (match_operand:SI 4 "register_operand" "=r")
                   2303:        (match_operand:SI 5 "register_operand" "r"))]
                   2304:   "((REGNO (operands[0]) & 3) == 0)
                   2305:    && ((REGNO (operands[1]) & 3) == 0)
                   2306:    && (REGNO (operands[0]) + 1 == REGNO (operands[2]))
                   2307:    && (REGNO (operands[1]) + 1 == REGNO (operands[3]))
                   2308:    && (REGNO (operands[0]) + 2 == REGNO (operands[4]))
                   2309:    && (REGNO (operands[1]) + 2 == REGNO (operands[5]))"
                   2310:   "movt        %1,%0")
                   2311: 
                   2312: ;; Matched 5/28/91
                   2313: (define_peephole
                   2314:   [(set (match_operand:SI 0 "register_operand" "=r")
                   2315:        (match_operand:SI 1 "register_operand" "r"))
                   2316:    (set (match_operand:SI 2 "register_operand" "=r")
                   2317:        (match_operand:SI 3 "register_operand" "r"))]
                   2318:   "((REGNO (operands[0]) & 1) == 0)
                   2319:    && ((REGNO (operands[1]) & 1) == 0)
                   2320:    && (REGNO (operands[0]) + 1 == REGNO (operands[2]))
                   2321:    && (REGNO (operands[1]) + 1 == REGNO (operands[3]))"
                   2322:   "movl        %1,%0")
                   2323: 
                   2324: ; Multiple register loads.
                   2325: 
                   2326: ;; Matched 6/15/91
                   2327: (define_peephole
                   2328:   [(set (match_operand:SI 0 "register_operand" "=r")
                   2329:        (mem:SI (plus:SI (match_operand:SI 1 "register_operand" "r")
                   2330:                         (match_operand:SI 2 "immediate_operand" "n"))))
                   2331:    (set (match_operand:SI 3 "register_operand" "=r")
                   2332:        (mem:SI (plus:SI (match_dup 1)
                   2333:                         (match_operand:SI 4 "immediate_operand" "n"))))
                   2334:    (set (match_operand:SI 5 "register_operand" "=r")
                   2335:        (mem:SI (plus:SI (match_dup 1)
                   2336:                         (match_operand:SI 6 "immediate_operand" "n"))))
                   2337:    (set (match_operand:SI 7 "register_operand" "=r")
                   2338:        (mem:SI (plus:SI (match_dup 1)
                   2339:                         (match_operand:SI 8 "immediate_operand" "n"))))]
                   2340:   "(i960_si_ti (operands[1], operands[2]) && ((REGNO (operands[0]) & 3) == 0)
                   2341:    && (REGNO (operands[1]) != REGNO (operands[0]))
                   2342:    && (REGNO (operands[0]) + 1 == REGNO (operands[3]))
                   2343:    && (REGNO (operands[1]) != REGNO (operands[3]))
                   2344:    && (REGNO (operands[0]) + 2 == REGNO (operands[5]))
                   2345:    && (REGNO (operands[1]) != REGNO (operands[5]))
                   2346:    && (REGNO (operands[0]) + 3 == REGNO (operands[7]))
                   2347:    && (INTVAL (operands[2]) + 4 == INTVAL (operands[4]))
                   2348:    && (INTVAL (operands[2]) + 8 == INTVAL (operands[6]))
                   2349:    && (INTVAL (operands[2]) + 12 == INTVAL (operands[8])))"
                   2350:   "ldq %2(%1),%0")
                   2351: 
                   2352: ;; Matched 5/28/91
                   2353: (define_peephole
                   2354:   [(set (match_operand:DF 0 "register_operand" "=d")
                   2355:        (mem:DF (plus:SI (match_operand:SI 1 "register_operand" "d")
                   2356:                         (match_operand:SI 2 "immediate_operand" "n"))))
                   2357:    (set (match_operand:DF 3 "register_operand" "=d")
                   2358:        (mem:DF (plus:SI (match_dup 1)
                   2359:                         (match_operand:SI 4 "immediate_operand" "n"))))]
                   2360:   "(i960_si_ti (operands[1], operands[2]) && ((REGNO (operands[0]) & 3) == 0)
                   2361:    && (REGNO (operands[1]) != REGNO (operands[0]))
                   2362:    && (REGNO (operands[0]) + 2 == REGNO (operands[3]))
                   2363:    && (REGNO (operands[1]) != REGNO (operands[3]))
                   2364:    && (INTVAL (operands[2]) + 8 == INTVAL (operands[4])))"
                   2365:   "ldq %2(%1),%0")
                   2366: 
                   2367: ;; Matched 1/24/92
                   2368: (define_peephole
                   2369:   [(set (match_operand:DI 0 "register_operand" "=d")
                   2370:        (mem:DI (plus:SI (match_operand:SI 1 "register_operand" "d")
                   2371:                         (match_operand:SI 2 "immediate_operand" "n"))))
                   2372:    (set (match_operand:DI 3 "register_operand" "=d")
                   2373:        (mem:DI (plus:SI (match_dup 1)
                   2374:                         (match_operand:SI 4 "immediate_operand" "n"))))]
                   2375:   "(i960_si_ti (operands[1], operands[2]) && ((REGNO (operands[0]) & 3) == 0)
                   2376:    && (REGNO (operands[1]) != REGNO (operands[0]))
                   2377:    && (REGNO (operands[0]) + 2 == REGNO (operands[3]))
                   2378:    && (REGNO (operands[1]) != REGNO (operands[3]))
                   2379:    && (INTVAL (operands[2]) + 8 == INTVAL (operands[4])))"
                   2380:   "ldq %2(%1),%0")
                   2381: 
                   2382: ;; Matched 4/17/92
                   2383: (define_peephole
                   2384:   [(set (match_operand:SI 0 "register_operand" "=d")
                   2385:        (mem:SI (match_operand:SI 1 "register_operand" "d")))
                   2386:    (set (match_operand:SI 2 "register_operand" "=d")
                   2387:        (mem:SI (plus:SI (match_dup 1)
                   2388:                         (match_operand:SI 3 "immediate_operand" "n"))))
                   2389:    (set (match_operand:SI 4 "register_operand" "=d")
                   2390:        (mem:SI (plus:SI (match_dup 1)
                   2391:                         (match_operand:SI 5 "immediate_operand" "n"))))
                   2392:    (set (match_operand:SI 6 "register_operand" "=d")
                   2393:        (mem:SI (plus:SI (match_dup 1)
                   2394:                         (match_operand:SI 7 "immediate_operand" "n"))))]
                   2395:   "(i960_si_ti (operands[1], 0) && ((REGNO (operands[0]) & 3) == 0)
                   2396:    && (REGNO (operands[1]) != REGNO (operands[0]))
                   2397:    && (REGNO (operands[0]) + 1 == REGNO (operands[2]))
                   2398:    && (REGNO (operands[1]) != REGNO (operands[2]))
                   2399:    && (REGNO (operands[0]) + 2 == REGNO (operands[4]))
                   2400:    && (REGNO (operands[1]) != REGNO (operands[4]))
                   2401:    && (REGNO (operands[0]) + 3 == REGNO (operands[6]))
                   2402:    && (INTVAL (operands[3]) == 4)
                   2403:    && (INTVAL (operands[5]) == 8)
                   2404:    && (INTVAL (operands[7]) == 12))"
                   2405:   "ldq (%1),%0")
                   2406: 
                   2407: ;; Matched 5/28/91
                   2408: (define_peephole
                   2409:   [(set (match_operand:SI 0 "register_operand" "=d")
                   2410:        (mem:SI (plus:SI (match_operand:SI 1 "register_operand" "d")
                   2411:                         (match_operand:SI 2 "immediate_operand" "n"))))
                   2412:    (set (match_operand:SI 3 "register_operand" "=d")
                   2413:        (mem:SI (plus:SI (match_dup 1)
                   2414:                         (match_operand:SI 4 "immediate_operand" "n"))))
                   2415:    (set (match_operand:SI 5 "register_operand" "=d")
                   2416:        (mem:SI (plus:SI (match_dup 1)
                   2417:                         (match_operand:SI 6 "immediate_operand" "n"))))]
                   2418:   "(i960_si_ti (operands[1], operands[2]) && ((REGNO (operands[0]) & 3) == 0)
                   2419:    && (REGNO (operands[1]) != REGNO (operands[0]))
                   2420:    && (REGNO (operands[0]) + 1 == REGNO (operands[3]))
                   2421:    && (REGNO (operands[1]) != REGNO (operands[3]))
                   2422:    && (REGNO (operands[0]) + 2 == REGNO (operands[5]))
                   2423:    && (INTVAL (operands[2]) + 4 == INTVAL (operands[4]))
                   2424:    && (INTVAL (operands[2]) + 8 == INTVAL (operands[6])))"
                   2425:   "ldt %2(%1),%0")
                   2426: 
                   2427: ;; Matched 6/15/91
                   2428: (define_peephole
                   2429:   [(set (match_operand:SI 0 "register_operand" "=d")
                   2430:        (mem:SI (match_operand:SI 1 "register_operand" "d")))
                   2431:    (set (match_operand:SI 2 "register_operand" "=d")
                   2432:        (mem:SI (plus:SI (match_dup 1)
                   2433:                         (match_operand:SI 3 "immediate_operand" "n"))))
                   2434:    (set (match_operand:SI 4 "register_operand" "=d")
                   2435:        (mem:SI (plus:SI (match_dup 1)
                   2436:                         (match_operand:SI 5 "immediate_operand" "n"))))]
                   2437:   "(i960_si_ti (operands[1], 0) && ((REGNO (operands[0]) & 3) == 0)
                   2438:    && (REGNO (operands[1]) != REGNO (operands[0]))
                   2439:    && (REGNO (operands[0]) + 1 == REGNO (operands[2]))
                   2440:    && (REGNO (operands[1]) != REGNO (operands[2]))
                   2441:    && (REGNO (operands[0]) + 2 == REGNO (operands[4]))
                   2442:    && (INTVAL (operands[3]) == 4)
                   2443:    && (INTVAL (operands[5]) == 8))"
                   2444:   "ldt (%1),%0")
                   2445: 
                   2446: ;; Matched 5/28/91
                   2447: (define_peephole
                   2448:   [(set (match_operand:SI 0 "register_operand" "=d")
                   2449:        (mem:SI (plus:SI (match_operand:SI 1 "register_operand" "d")
                   2450:                         (match_operand:SI 2 "immediate_operand" "n"))))
                   2451:    (set (match_operand:SI 3 "register_operand" "=d")
                   2452:        (mem:SI (plus:SI (match_dup 1)
                   2453:                         (match_operand:SI 4 "immediate_operand" "n"))))]
                   2454:   "(i960_si_di (operands[1], operands[2]) && ((REGNO (operands[0]) & 1) == 0)
                   2455:    && (REGNO (operands[1]) != REGNO (operands[0]))
                   2456:    && (REGNO (operands[0]) + 1 == REGNO (operands[3]))
                   2457:    && (INTVAL (operands[2]) + 4 == INTVAL (operands[4])))"
                   2458:   "ldl %2(%1),%0")
                   2459: 
                   2460: ;; Matched 5/28/91
                   2461: (define_peephole
                   2462:   [(set (match_operand:SI 0 "register_operand" "=d")
                   2463:        (mem:SI (match_operand:SI 1 "register_operand" "d")))
                   2464:    (set (match_operand:SI 2 "register_operand" "=d")
                   2465:        (mem:SI (plus:SI (match_dup 1)
                   2466:                         (match_operand:SI 3 "immediate_operand" "n"))))]
                   2467:   "(i960_si_di (operands[1], 0) && ((REGNO (operands[0]) & 1) == 0)
                   2468:    && (REGNO (operands[1]) != REGNO (operands[0]))
                   2469:    && (REGNO (operands[0]) + 1 == REGNO (operands[2]))
                   2470:    && (INTVAL (operands[3]) == 4))"
                   2471:   "ldl (%1),%0")
                   2472: 
                   2473: ; Multiple register stores.
                   2474: 
                   2475: ;; Matched 5/28/91
                   2476: (define_peephole
                   2477:   [(set (mem:SI (plus:SI (match_operand:SI 0 "register_operand" "d")
                   2478:                         (match_operand:SI 1 "immediate_operand" "n")))
                   2479:        (match_operand:SI 2 "register_operand" "d"))
                   2480:    (set (mem:SI (plus:SI (match_dup 0)
                   2481:                         (match_operand:SI 3 "immediate_operand" "n")))
                   2482:        (match_operand:SI 4 "register_operand" "d"))
                   2483:    (set (mem:SI (plus:SI (match_dup 0)
                   2484:                         (match_operand:SI 5 "immediate_operand" "n")))
                   2485:        (match_operand:SI 6 "register_operand" "d"))
                   2486:    (set (mem:SI (plus:SI (match_dup 0)
                   2487:                         (match_operand:SI 7 "immediate_operand" "n")))
                   2488:        (match_operand:SI 8 "register_operand" "d"))]
                   2489:   "(i960_si_ti (operands[0], operands[1]) && ((REGNO (operands[2]) & 3) == 0)
                   2490:    && (REGNO (operands[2]) + 1 == REGNO (operands[4]))
                   2491:    && (REGNO (operands[2]) + 2 == REGNO (operands[6]))
                   2492:    && (REGNO (operands[2]) + 3 == REGNO (operands[8]))
                   2493:    && (INTVAL (operands[1]) + 4 == INTVAL (operands[3]))
                   2494:    && (INTVAL (operands[1]) + 8 == INTVAL (operands[5]))
                   2495:    && (INTVAL (operands[1]) + 12 == INTVAL (operands[7])))"
                   2496:   "stq %2,%1(%0)")
                   2497: 
                   2498: ;; Matched 6/16/91
                   2499: (define_peephole
                   2500:   [(set (mem:DF (plus:SI (match_operand:SI 0 "register_operand" "d")
                   2501:                         (match_operand:SI 1 "immediate_operand" "n")))
                   2502:        (match_operand:DF 2 "register_operand" "d"))
                   2503:    (set (mem:DF (plus:SI (match_dup 0)
                   2504:                         (match_operand:SI 3 "immediate_operand" "n")))
                   2505:        (match_operand:DF 4 "register_operand" "d"))]
                   2506:   "(i960_si_ti (operands[0], operands[1]) && ((REGNO (operands[2]) & 3) == 0)
                   2507:    && (REGNO (operands[2]) + 2 == REGNO (operands[4]))
                   2508:    && (INTVAL (operands[1]) + 8 == INTVAL (operands[3])))"
                   2509:   "stq %2,%1(%0)")
                   2510: 
                   2511: ;; Matched 4/17/92
                   2512: (define_peephole
                   2513:   [(set (mem:DI (plus:SI (match_operand:SI 0 "register_operand" "d")
                   2514:                         (match_operand:SI 1 "immediate_operand" "n")))
                   2515:        (match_operand:DI 2 "register_operand" "d"))
                   2516:    (set (mem:DI (plus:SI (match_dup 0)
                   2517:                         (match_operand:SI 3 "immediate_operand" "n")))
                   2518:        (match_operand:DI 4 "register_operand" "d"))]
                   2519:   "(i960_si_ti (operands[0], operands[1]) && ((REGNO (operands[2]) & 3) == 0)
                   2520:    && (REGNO (operands[2]) + 2 == REGNO (operands[4]))
                   2521:    && (INTVAL (operands[1]) + 8 == INTVAL (operands[3])))"
                   2522:   "stq %2,%1(%0)")
                   2523: 
                   2524: ;; Matched 1/23/92
                   2525: (define_peephole
                   2526:   [(set (mem:SI (match_operand:SI 0 "register_operand" "d"))
                   2527:        (match_operand:SI 1 "register_operand" "d"))
                   2528:    (set (mem:SI (plus:SI (match_dup 0)
                   2529:                         (match_operand:SI 2 "immediate_operand" "n")))
                   2530:        (match_operand:SI 3 "register_operand" "d"))
                   2531:    (set (mem:SI (plus:SI (match_dup 0)
                   2532:                         (match_operand:SI 4 "immediate_operand" "n")))
                   2533:        (match_operand:SI 5 "register_operand" "d"))
                   2534:    (set (mem:SI (plus:SI (match_dup 0)
                   2535:                         (match_operand:SI 6 "immediate_operand" "n")))
                   2536:        (match_operand:SI 7 "register_operand" "d"))]
                   2537:   "(i960_si_ti (operands[0], 0) && ((REGNO (operands[1]) & 3) == 0)
                   2538:    && (REGNO (operands[1]) + 1 == REGNO (operands[3]))
                   2539:    && (REGNO (operands[1]) + 2 == REGNO (operands[5]))
                   2540:    && (REGNO (operands[1]) + 3 == REGNO (operands[7]))
                   2541:    && (INTVAL (operands[2]) == 4)
                   2542:    && (INTVAL (operands[4]) == 8)
                   2543:    && (INTVAL (operands[6]) == 12))"
                   2544:   "stq %1,(%0)")
                   2545: 
                   2546: ;; Matched 5/29/91
                   2547: (define_peephole
                   2548:   [(set (mem:SI (plus:SI (match_operand:SI 0 "register_operand" "d")
                   2549:                         (match_operand:SI 1 "immediate_operand" "n")))
                   2550:        (match_operand:SI 2 "register_operand" "d"))
                   2551:    (set (mem:SI (plus:SI (match_dup 0)
                   2552:                         (match_operand:SI 3 "immediate_operand" "n")))
                   2553:        (match_operand:SI 4 "register_operand" "d"))
                   2554:    (set (mem:SI (plus:SI (match_dup 0)
                   2555:                         (match_operand:SI 5 "immediate_operand" "n")))
                   2556:        (match_operand:SI 6 "register_operand" "d"))]
                   2557:   "(i960_si_ti (operands[0], operands[1]) && ((REGNO (operands[2]) & 3) == 0)
                   2558:    && (REGNO (operands[2]) + 1 == REGNO (operands[4]))
                   2559:    && (REGNO (operands[2]) + 2 == REGNO (operands[6]))
                   2560:    && (INTVAL (operands[1]) + 4 == INTVAL (operands[3]))
                   2561:    && (INTVAL (operands[1]) + 8 == INTVAL (operands[5])))"
                   2562:   "stt %2,%1(%0)")
                   2563: 
                   2564: ;; Matched 5/29/91
                   2565: (define_peephole
                   2566:   [(set (mem:SI (match_operand:SI 0 "register_operand" "d"))
                   2567:        (match_operand:SI 1 "register_operand" "d"))
                   2568:    (set (mem:SI (plus:SI (match_dup 0)
                   2569:                         (match_operand:SI 2 "immediate_operand" "n")))
                   2570:        (match_operand:SI 3 "register_operand" "d"))
                   2571:    (set (mem:SI (plus:SI (match_dup 0)
                   2572:                         (match_operand:SI 4 "immediate_operand" "n")))
                   2573:        (match_operand:SI 5 "register_operand" "d"))]
                   2574:   "(i960_si_ti (operands[0], 0) && ((REGNO (operands[1]) & 3) == 0)
                   2575:    && (REGNO (operands[1]) + 1 == REGNO (operands[3]))
                   2576:    && (REGNO (operands[1]) + 2 == REGNO (operands[5]))
                   2577:    && (INTVAL (operands[2]) == 4)
                   2578:    && (INTVAL (operands[4]) == 8))"
                   2579:   "stt %1,(%0)")
                   2580: 
                   2581: ;; Matched 5/28/91
                   2582: (define_peephole
                   2583:   [(set (mem:SI (plus:SI (match_operand:SI 0 "register_operand" "d")
                   2584:                         (match_operand:SI 1 "immediate_operand" "n")))
                   2585:        (match_operand:SI 2 "register_operand" "d"))
                   2586:    (set (mem:SI (plus:SI (match_dup 0)
                   2587:                         (match_operand:SI 3 "immediate_operand" "n")))
                   2588:        (match_operand:SI 4 "register_operand" "d"))]
                   2589:   "(i960_si_di (operands[0], operands[1]) && ((REGNO (operands[2]) & 1) == 0)
                   2590:    && (REGNO (operands[2]) + 1 == REGNO (operands[4]))
                   2591:    && (INTVAL (operands[1]) + 4 == INTVAL (operands[3])))"
                   2592:   "stl %2,%1(%0)")
                   2593: 
                   2594: ;; Matched 5/28/91
                   2595: (define_peephole
                   2596:   [(set (mem:SI (match_operand:SI 0 "register_operand" "d"))
                   2597:        (match_operand:SI 1 "register_operand" "d"))
                   2598:    (set (mem:SI (plus:SI (match_dup 0)
                   2599:                         (match_operand:SI 2 "immediate_operand" "n")))
                   2600:        (match_operand:SI 3 "register_operand" "d"))]
                   2601:   "(i960_si_di (operands[0], 0) && ((REGNO (operands[1]) & 1) == 0)
                   2602:    && (REGNO (operands[1]) + 1 == REGNO (operands[3]))
                   2603:    && (INTVAL (operands[2]) == 4))"
                   2604:   "stl %1,(%0)")

unix.superglobalmegacorp.com

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