Annotation of GNUtools/cc/config/pa/fsf-pa.md, revision 1.1.1.1

1.1       root        1: ;;- Machine description for HP PA-RISC architecture for GNU C compiler
                      2: ;;   Copyright (C) 1992 Free Software Foundation, Inc.
                      3: ;;   Contributed by the Center for Software Science at the University
                      4: ;;   of Utah.
                      5: 
                      6: ;; This file is part of GNU CC.
                      7: 
                      8: ;; GNU CC is free software; you can redistribute it and/or modify
                      9: ;; it under the terms of the GNU General Public License as published by
                     10: ;; the Free Software Foundation; either version 2, or (at your option)
                     11: ;; any later version.
                     12: 
                     13: ;; GNU CC is distributed in the hope that it will be useful,
                     14: ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
                     15: ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     16: ;; GNU General Public License for more details.
                     17: 
                     18: ;; You should have received a copy of the GNU General Public License
                     19: ;; along with GNU CC; see the file COPYING.  If not, write to
                     20: ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
                     21: 
                     22: ;; This gcc Version 2 machine description is inspired by sparc.md and
                     23: ;; mips.md.
                     24: 
                     25: ;;- See file "rtl.def" for documentation on define_insn, match_*, et. al.
                     26: 
                     27: ;; Insn type.  Used to default other attribute values.
                     28: 
                     29: ;; type "unary" insns have one input operand (1) and one output operand (0)
                     30: ;; type "binary" insns have two input operands (1,2) and one output (0)
                     31: 
                     32: (define_attr "type"
                     33:   "move,unary,binary,compare,load,store,uncond_branch,branch,cbranch,fbranch,call,dyncall,fpload,fpstore,fpalu,fpcc,fpmul,fpdivsgl,fpdivdbl,fpsqrtsgl,fpsqrtdbl,multi,misc,milli"
                     34:   (const_string "binary"))
                     35: 
                     36: ;; Length (in # of insns).
                     37: (define_attr "length" ""
                     38:   (cond [(eq_attr "type" "load,fpload")
                     39:         (if_then_else (match_operand 1 "symbolic_memory_operand" "")
                     40:                       (const_int 8) (const_int 4))
                     41: 
                     42:         (eq_attr "type" "store,fpstore")
                     43:         (if_then_else (match_operand 0 "symbolic_memory_operand" "")
                     44:                       (const_int 8) (const_int 4))
                     45: 
                     46:         (eq_attr "type" "binary")
                     47:         (if_then_else (match_operand 2 "arith_operand" "")
                     48:                       (const_int 4) (const_int 12))
                     49: 
                     50:         (eq_attr "type" "move,unary")
                     51:         (if_then_else (match_operand 1 "arith_operand" "")
                     52:                       (const_int 4) (const_int 8))]
                     53: 
                     54:        (const_int 4)))
                     55: 
                     56: (define_asm_attributes
                     57:   [(set_attr "length" "4")
                     58:    (set_attr "type" "multi")])
                     59: 
                     60: ;; Attributes for instruction and branch scheduling
                     61: 
                     62: ;; For conditional branches.
                     63: (define_attr "in_branch_delay" "false,true"
                     64:   (if_then_else (and (eq_attr "type" "!uncond_branch,branch,cbranch,fbranch,call,dyncall,multi,milli")
                     65:                     (eq_attr "length" "4"))
                     66:                (const_string "true")
                     67:                (const_string "false")))
                     68: 
                     69: ;; Disallow instructions which use the FPU since they will tie up the FPU
                     70: ;; even if the instruction is nullified.
                     71: (define_attr "in_nullified_branch_delay" "false,true"
                     72:   (if_then_else (and (eq_attr "type" "!uncond_branch,branch,cbranch,fbranch,call,dyncall,multi,milli,fpcc,fpalu,fpmul,fpdivsgl,fpdivdbl,fpsqrtsgl,fpsqrtdbl")
                     73:                     (eq_attr "length" "4"))
                     74:                (const_string "true")
                     75:                (const_string "false")))
                     76: 
                     77: ;; For calls and millicode calls.  Allow unconditional branches in the
                     78: ;; delay slot.
                     79: (define_attr "in_call_delay" "false,true"
                     80:   (cond [(and (eq_attr "type" "!uncond_branch,branch,cbranch,fbranch,call,dyncall,multi,milli")
                     81:              (eq_attr "length" "4"))
                     82:           (const_string "true")
                     83:         (eq_attr "type" "uncond_branch")
                     84:           (if_then_else (ne (symbol_ref "TARGET_JUMP_IN_DELAY")
                     85:                             (const_int 0))
                     86:                         (const_string "true")
                     87:                         (const_string "false"))]
                     88:        (const_string "false")))
                     89: 
                     90: 
                     91: ;; Unconditional branch, call, and millicode call delay slot description.
                     92: (define_delay (eq_attr "type" "uncond_branch,branch,call,milli")
                     93:   [(eq_attr "in_call_delay" "true") (nil) (nil)])
                     94: 
                     95: ;; Unconditional branch, return and other similar instructions.
                     96: (define_delay (eq_attr "type" "uncond_branch,branch")
                     97:   [(eq_attr "in_branch_delay" "true") (nil) (nil)])
                     98: 
                     99: ;; Floating point conditional branch delay slot description and
                    100: (define_delay (eq_attr "type" "fbranch")
                    101:   [(eq_attr "in_branch_delay" "true")
                    102:    (eq_attr "in_nullified_branch_delay" "true")
                    103:    (nil)])
                    104: 
                    105: ;; Integer conditional branch delay slot description.
                    106: ;; Nullification of conditional branches on the PA is dependent on the
                    107: ;; direction of the branch.  Forward branches nullify true and
                    108: ;; backward branches nullify false.  If the direction is unknown
                    109: ;; then nullification is not allowed.
                    110: (define_delay (eq_attr "type" "cbranch")
                    111:   [(eq_attr "in_branch_delay" "true")
                    112:    (and (eq_attr "in_nullified_branch_delay" "true")
                    113:        (attr_flag "forward"))
                    114:    (and (eq_attr "in_nullified_branch_delay" "true")
                    115:        (attr_flag "backward"))])
                    116: 
                    117: ;; Function units of the HPPA. The following data is for the "Snake"
                    118: ;; (Mustang CPU + Timex FPU) because that's what I have the docs for.
                    119: ;; Scheduling instructions for PA-83 machines according to the Snake
                    120: ;; constraints shouldn't hurt.
                    121: 
                    122: ;; (define_function_unit {name} {num-units} {n-users} {test}
                    123: ;;                       {ready-delay} {issue-delay} [{conflict-list}])
                    124: 
                    125: ;; The integer ALU.
                    126: ;; (Noted only for documentation; units that take one cycle do not need to
                    127: ;; be specified.)
                    128: 
                    129: ;; (define_function_unit "alu" 1 0
                    130: ;;  (eq_attr "type" "unary,binary,move,address") 1 0)
                    131: 
                    132: 
                    133: ;; Memory. Disregarding Cache misses, the Mustang memory times are:
                    134: ;; load: 2
                    135: ;; store, fpstore: 3, no D-cache operations should be scheduled.
                    136: ;; fpload: 3 (really 2 for flops, but I don't think we can specify that).
                    137: 
                    138: (define_function_unit "memory" 1 0 (eq_attr "type" "load") 2 0)
                    139: (define_function_unit "memory" 1 0 (eq_attr "type" "store,fpstore") 3 3)
                    140: (define_function_unit "memory" 1 0 (eq_attr "type" "fpload") 2 0)
                    141: 
                    142: ;; The Timex has two floating-point units: ALU, and MUL/DIV/SQRT unit.
                    143: ;; Timings:
                    144: ;; Instruction Time    Unit    Minimum Distance (unit contention)
                    145: ;; fcpy                3       ALU     2
                    146: ;; fabs                3       ALU     2
                    147: ;; fadd                3       ALU     2
                    148: ;; fsub                3       ALU     2
                    149: ;; fcmp                3       ALU     2
                    150: ;; fcnv                3       ALU     2
                    151: ;; fmpyadd     3       ALU,MPY 2
                    152: ;; fmpysub     3       ALU,MPY 2
                    153: ;; fmpycfxt    3       ALU,MPY 2
                    154: ;; fmpy                3       MPY     2
                    155: ;; fmpyi       3       MPY     2
                    156: ;; fdiv,sgl    10      MPY     10
                    157: ;; fdiv,dbl    12      MPY     12
                    158: ;; fsqrt,sgl   14      MPY     14
                    159: ;; fsqrt,dbl   18      MPY     18
                    160: 
                    161: (define_function_unit "fp_alu" 1 0 (eq_attr "type" "fpcc") 4 2)
                    162: (define_function_unit "fp_alu" 1 0 (eq_attr "type" "fpalu") 3 2)
                    163: (define_function_unit "fp_mpy" 1 0 (eq_attr "type" "fpmul") 3 2)
                    164: (define_function_unit "fp_mpy" 1 0 (eq_attr "type" "fpdivsgl") 10 10)
                    165: (define_function_unit "fp_mpy" 1 0 (eq_attr "type" "fpdivdbl") 12 12)
                    166: (define_function_unit "fp_mpy" 1 0 (eq_attr "type" "fpsqrtsgl") 14 14)
                    167: (define_function_unit "fp_mpy" 1 0 (eq_attr "type" "fpsqrtdbl") 18 18)
                    168: 
                    169: ;; Compare instructions.
                    170: ;; This controls RTL generation and register allocation.
                    171: 
                    172: ;; We generate RTL for comparisons and branches by having the cmpxx
                    173: ;; patterns store away the operands.  Then, the scc and bcc patterns
                    174: ;; emit RTL for both the compare and the branch.
                    175: ;;
                    176: 
                    177: (define_expand "cmpsi"
                    178:   [(set (reg:CC 0)
                    179:        (compare:CC (match_operand:SI 0 "reg_or_0_operand" "")
                    180:                    (match_operand:SI 1 "arith5_operand" "")))]
                    181:   ""
                    182:   "
                    183: {
                    184:  hppa_compare_op0 = operands[0];
                    185:  hppa_compare_op1 = operands[1];
                    186:  hppa_branch_type = CMP_SI;
                    187:  DONE;
                    188: }")
                    189: 
                    190: (define_expand "cmpsf"
                    191:   [(set (reg:CCFP 0)
                    192:        (compare:CCFP (match_operand:SF 0 "reg_or_0_operand" "")
                    193:                      (match_operand:SF 1 "reg_or_0_operand" "")))]
                    194:   ""
                    195:   "
                    196: {
                    197:   hppa_compare_op0 = operands[0];
                    198:   hppa_compare_op1 = operands[1];
                    199:   hppa_branch_type = CMP_SF;
                    200:   DONE;
                    201: }")
                    202: 
                    203: (define_expand "cmpdf"
                    204:   [(set (reg:CCFP 0)
                    205:       (compare:CCFP (match_operand:DF 0 "reg_or_0_operand" "")
                    206:                     (match_operand:DF 1 "reg_or_0_operand" "")))]
                    207:   ""
                    208:   "
                    209: {
                    210:   hppa_compare_op0 = operands[0];
                    211:   hppa_compare_op1 = operands[1];
                    212:   hppa_branch_type = CMP_DF;
                    213:   DONE;
                    214: }")
                    215: 
                    216: (define_insn ""
                    217:   [(set (reg:CCFP 0)
                    218:        (match_operator:CCFP 2 "comparison_operator"
                    219:                             [(match_operand:SF 0 "reg_or_0_operand" "fxG")
                    220:                              (match_operand:SF 1 "reg_or_0_operand" "fxG")]))]
                    221:   ""
                    222:   "fcmp,sgl,%Y2 %r0,%r1"
                    223:   [(set_attr "type" "fpcc")])
                    224: 
                    225: (define_insn ""
                    226:   [(set (reg:CCFP 0)
                    227:        (match_operator:CCFP 2 "comparison_operator"
                    228:                             [(match_operand:DF 0 "reg_or_0_operand" "fxG")
                    229:                              (match_operand:DF 1 "reg_or_0_operand" "fxG")]))]
                    230:   ""
                    231:   "fcmp,dbl,%Y2 %r0,%r1"
                    232:   [(set_attr "type" "fpcc")])
                    233: 
                    234: ;; scc insns.
                    235: 
                    236: (define_expand "seq"
                    237:   [(set (match_operand:SI 0 "register_operand" "")
                    238:        (eq:SI (match_dup 1)
                    239:               (match_dup 2)))]
                    240:   ""
                    241:   "
                    242: {
                    243:   /* fp scc patterns rarely match, and are not a win on the PA.  */
                    244:   if (hppa_branch_type != CMP_SI)
                    245:     FAIL;
                    246:   /* set up operands from compare.  */
                    247:   operands[1] = hppa_compare_op0;
                    248:   operands[2] = hppa_compare_op1;
                    249:   /* fall through and generate default code */
                    250: }")
                    251: 
                    252: (define_expand "sne"
                    253:   [(set (match_operand:SI 0 "register_operand" "")
                    254:        (ne:SI (match_dup 1)
                    255:               (match_dup 2)))]
                    256:   ""
                    257:   "
                    258: {
                    259:   /* fp scc patterns rarely match, and are not a win on the PA.  */
                    260:   if (hppa_branch_type != CMP_SI)
                    261:     FAIL;
                    262:   operands[1] = hppa_compare_op0;
                    263:   operands[2] = hppa_compare_op1;
                    264: }")
                    265: 
                    266: (define_expand "slt"
                    267:   [(set (match_operand:SI 0 "register_operand" "")
                    268:        (lt:SI (match_dup 1)
                    269:               (match_dup 2)))]
                    270:   ""
                    271:   "
                    272: {
                    273:   /* fp scc patterns rarely match, and are not a win on the PA.  */
                    274:   if (hppa_branch_type != CMP_SI)
                    275:     FAIL;
                    276:   operands[1] = hppa_compare_op0;
                    277:   operands[2] = hppa_compare_op1;
                    278: }")
                    279: 
                    280: (define_expand "sgt"
                    281:   [(set (match_operand:SI 0 "register_operand" "")
                    282:        (gt:SI (match_dup 1)
                    283:               (match_dup 2)))]
                    284:   ""
                    285:   "
                    286: {
                    287:   /* fp scc patterns rarely match, and are not a win on the PA.  */
                    288:   if (hppa_branch_type != CMP_SI)
                    289:     FAIL;
                    290:   operands[1] = hppa_compare_op0;
                    291:   operands[2] = hppa_compare_op1;
                    292: }")
                    293: 
                    294: (define_expand "sle"
                    295:   [(set (match_operand:SI 0 "register_operand" "")
                    296:        (le:SI (match_dup 1)
                    297:               (match_dup 2)))]
                    298:   ""
                    299:   "
                    300: {
                    301:   /* fp scc patterns rarely match, and are not a win on the PA.  */
                    302:   if (hppa_branch_type != CMP_SI)
                    303:     FAIL;
                    304:   operands[1] = hppa_compare_op0;
                    305:   operands[2] = hppa_compare_op1;
                    306: }")
                    307: 
                    308: (define_expand "sge"
                    309:   [(set (match_operand:SI 0 "register_operand" "")
                    310:        (ge:SI (match_dup 1)
                    311:               (match_dup 2)))]
                    312:   ""
                    313:   "
                    314: {
                    315:   /* fp scc patterns rarely match, and are not a win on the PA.  */
                    316:   if (hppa_branch_type != CMP_SI)
                    317:     FAIL;
                    318:   operands[1] = hppa_compare_op0;
                    319:   operands[2] = hppa_compare_op1;
                    320: }")
                    321: 
                    322: (define_expand "sltu"
                    323:   [(set (match_operand:SI 0 "register_operand" "")
                    324:        (ltu:SI (match_dup 1)
                    325:                (match_dup 2)))]
                    326:   ""
                    327:   "
                    328: {
                    329:   if (hppa_branch_type != CMP_SI)
                    330:     FAIL;
                    331:   operands[1] = hppa_compare_op0;
                    332:   operands[2] = hppa_compare_op1;
                    333: }")
                    334: 
                    335: (define_expand "sgtu"
                    336:   [(set (match_operand:SI 0 "register_operand" "")
                    337:        (gtu:SI (match_dup 1)
                    338:                (match_dup 2)))]
                    339:   ""
                    340:   "
                    341: {
                    342:   if (hppa_branch_type != CMP_SI)
                    343:     FAIL;
                    344:   operands[1] = hppa_compare_op0;
                    345:   operands[2] = hppa_compare_op1;
                    346: }")
                    347: 
                    348: (define_expand "sleu"
                    349:   [(set (match_operand:SI 0 "register_operand" "")
                    350:        (leu:SI (match_dup 1)
                    351:                (match_dup 2)))]
                    352:   ""
                    353:   "
                    354: {
                    355:   if (hppa_branch_type != CMP_SI)
                    356:     FAIL;
                    357:   operands[1] = hppa_compare_op0;
                    358:   operands[2] = hppa_compare_op1;
                    359: }")
                    360: 
                    361: (define_expand "sgeu"
                    362:   [(set (match_operand:SI 0 "register_operand" "")
                    363:        (geu:SI (match_dup 1)
                    364:                (match_dup 2)))]
                    365:   ""
                    366:   "
                    367: {
                    368:   if (hppa_branch_type != CMP_SI)
                    369:     FAIL;
                    370:   operands[1] = hppa_compare_op0;
                    371:   operands[2] = hppa_compare_op1;
                    372: }")
                    373: 
                    374: ;; Instruction canonicalization puts immediate operands second, which
                    375: ;; is the reverse of what we want.
                    376: 
                    377: (define_insn "scc"
                    378:   [(set (match_operand:SI 0 "register_operand" "=r")
                    379:        (match_operator:SI 3 "comparison_operator"
                    380:                           [(match_operand:SI 1 "register_operand" "r")
                    381:                            (match_operand:SI 2 "arith11_operand" "rI")]))]
                    382:   ""
                    383:   "com%I2clr,%B3 %2,%1,%0\;ldi 1,%0"
                    384:   [(set_attr "type" "binary")
                    385:    (set_attr "length" "8")])
                    386: 
                    387: (define_insn "iorscc"
                    388:   [(set (match_operand:SI 0 "register_operand" "=r")
                    389:        (ior:SI (match_operator:SI 3 "comparison_operator"
                    390:                                   [(match_operand:SI 1 "register_operand" "r")
                    391:                                    (match_operand:SI 2 "arith11_operand" "rI")])
                    392:                (match_operator:SI 6 "comparison_operator"
                    393:                                   [(match_operand:SI 4 "register_operand" "r")
                    394:                                    (match_operand:SI 5 "arith11_operand" "rI")])))]
                    395:   ""
                    396:   "com%I2clr,%S3 %2,%1,0\;com%I5clr,%B6 %5,%4,%0\;ldi 1,%0"
                    397:   [(set_attr "type" "binary")
                    398:    (set_attr "length" "8")])
                    399: 
                    400: ;; Combiner patterns for common operations performed with the output
                    401: ;; from an scc insn (negscc and incscc).
                    402: (define_insn "negscc"
                    403:   [(set (match_operand:SI 0 "register_operand" "=r")
                    404:        (neg:SI (match_operator:SI 3 "comparison_operator"
                    405:               [(match_operand:SI 1 "register_operand" "r")
                    406:                (match_operand:SI 2 "arith11_operand" "rI")])))]
                    407:   ""
                    408:   "com%I2clr,%B3 %2,%1,%0\;ldi -1,%0"
                    409:   [(set_attr "type" "binary")
                    410:    (set_attr "length" "8")])
                    411: 
                    412: ;; Patterns for adding/subtracting the result of a boolean expression from
                    413: ;; a register.  First we have special patterns that make use of the carry
                    414: ;; bit, and output only two instructions.  For the cases we can't in
                    415: ;; general do in two instructions, the incscc pattern at the end outputs
                    416: ;; two or three instructions.
                    417: 
                    418: (define_insn ""
                    419:   [(set (match_operand:SI 0 "register_operand" "=r")
                    420:        (plus:SI (leu:SI (match_operand:SI 2 "register_operand" "r")
                    421:                         (match_operand:SI 3 "arith11_operand" "rI"))
                    422:                 (match_operand:SI 1 "register_operand" "r")))]
                    423:   ""
                    424:   "sub%I3 %3,%2,0\;addc 0,%1,%0"
                    425:   [(set_attr "type" "binary")
                    426:    (set_attr "length" "8")])
                    427: 
                    428: ; This need only accept registers for op3, since canonicalization
                    429: ; replaces geu with gtu when op3 is an integer.
                    430: (define_insn ""
                    431:   [(set (match_operand:SI 0 "register_operand" "=r")
                    432:        (plus:SI (geu:SI (match_operand:SI 2 "register_operand" "r")
                    433:                         (match_operand:SI 3 "register_operand" "r"))
                    434:                 (match_operand:SI 1 "register_operand" "r")))]
                    435:   ""
                    436:   "sub %2,%3,0\;addc 0,%1,%0"
                    437:   [(set_attr "type" "binary")
                    438:    (set_attr "length" "8")])
                    439: 
                    440: ; Match only integers for op3 here.  This is used as canonical form of the
                    441: ; geu pattern when op3 is an integer.  Don't match registers since we can't
                    442: ; make better code than the general incscc pattern.
                    443: (define_insn ""
                    444:   [(set (match_operand:SI 0 "register_operand" "=r")
                    445:        (plus:SI (gtu:SI (match_operand:SI 2 "register_operand" "r")
                    446:                         (match_operand:SI 3 "int11_operand" "I"))
                    447:                 (match_operand:SI 1 "register_operand" "r")))]
                    448:   ""
                    449:   "addi %k3,%2,0\;addc 0,%1,%0"
                    450:   [(set_attr "type" "binary")
                    451:    (set_attr "length" "8")])
                    452: 
                    453: (define_insn "incscc"
                    454:   [(set (match_operand:SI 0 "register_operand" "=r,r")
                    455:        (plus:SI (match_operator:SI 4 "comparison_operator"
                    456:                    [(match_operand:SI 2 "register_operand" "r,r")
                    457:                     (match_operand:SI 3 "arith11_operand" "rI,rI")])
                    458:                 (match_operand:SI 1 "register_operand" "0,?r")))]
                    459:   ""
                    460:   "@
                    461:    com%I3clr,%B4 %3,%2,0\;addi 1,%0,%0
                    462:    com%I3clr,%B4 %3,%2,0\;addi,tr 1,%1,%0\;copy %1,%0"
                    463:   [(set_attr "type" "binary,binary")
                    464:    (set_attr "length" "8,12")])
                    465: 
                    466: (define_insn ""
                    467:   [(set (match_operand:SI 0 "register_operand" "=r")
                    468:        (minus:SI (match_operand:SI 1 "register_operand" "r")
                    469:                  (gtu:SI (match_operand:SI 2 "register_operand" "r")
                    470:                          (match_operand:SI 3 "arith11_operand" "rI"))))]
                    471:   ""
                    472:   "sub%I3 %3,%2,0\;subb %1,0,%0"
                    473:   [(set_attr "type" "binary")
                    474:    (set_attr "length" "8")])
                    475: 
                    476: (define_insn ""
                    477:   [(set (match_operand:SI 0 "register_operand" "=r")
                    478:        (minus:SI (minus:SI (match_operand:SI 1 "register_operand" "r")
                    479:                            (gtu:SI (match_operand:SI 2 "register_operand" "r")
                    480:                                    (match_operand:SI 3 "arith11_operand" "rI")))
                    481:                  (match_operand:SI 4 "register_operand" "r")))]
                    482:   ""
                    483:   "sub%I3 %3,%2,0\;subb %1,%4,%0"
                    484:   [(set_attr "type" "binary")
                    485:    (set_attr "length" "8")])
                    486: 
                    487: ; This need only accept registers for op3, since canonicalization
                    488: ; replaces ltu with leu when op3 is an integer.
                    489: (define_insn ""
                    490:   [(set (match_operand:SI 0 "register_operand" "=r")
                    491:        (minus:SI (match_operand:SI 1 "register_operand" "r")
                    492:                  (ltu:SI (match_operand:SI 2 "register_operand" "r")
                    493:                          (match_operand:SI 3 "register_operand" "r"))))]
                    494:   ""
                    495:   "sub %2,%3,0\;subb %1,0,%0"
                    496:   [(set_attr "type" "binary")
                    497:    (set_attr "length" "8")])
                    498: 
                    499: (define_insn ""
                    500:   [(set (match_operand:SI 0 "register_operand" "=r")
                    501:        (minus:SI (minus:SI (match_operand:SI 1 "register_operand" "r")
                    502:                            (ltu:SI (match_operand:SI 2 "register_operand" "r")
                    503:                                    (match_operand:SI 3 "register_operand" "r")))
                    504:                  (match_operand:SI 4 "register_operand" "r")))]
                    505:   ""
                    506:   "sub %2,%3,0\;subb %1,%4,%0"
                    507:   [(set_attr "type" "binary")
                    508:    (set_attr "length" "8")])
                    509: 
                    510: ; Match only integers for op3 here.  This is used as canonical form of the
                    511: ; ltu pattern when op3 is an integer.  Don't match registers since we can't
                    512: ; make better code than the general incscc pattern.
                    513: (define_insn ""
                    514:   [(set (match_operand:SI 0 "register_operand" "=r")
                    515:        (minus:SI (match_operand:SI 1 "register_operand" "r")
                    516:                  (leu:SI (match_operand:SI 2 "register_operand" "r")
                    517:                          (match_operand:SI 3 "int11_operand" "I"))))]
                    518:   ""
                    519:   "addi %k3,%2,0\;subb %1,0,%0"
                    520:   [(set_attr "type" "binary")
                    521:    (set_attr "length" "8")])
                    522: 
                    523: (define_insn ""
                    524:   [(set (match_operand:SI 0 "register_operand" "=r")
                    525:        (minus:SI (minus:SI (match_operand:SI 1 "register_operand" "r")
                    526:                            (leu:SI (match_operand:SI 2 "register_operand" "r")
                    527:                                    (match_operand:SI 3 "int11_operand" "I")))
                    528:                  (match_operand:SI 4 "register_operand" "r")))]
                    529:   ""
                    530:   "addi %k3,%2,0\;subb %1,%4,%0"
                    531:   [(set_attr "type" "binary")
                    532:    (set_attr "length" "8")])
                    533: 
                    534: (define_insn "decscc"
                    535:   [(set (match_operand:SI 0 "register_operand" "=r,r")
                    536:        (minus:SI (match_operand:SI 1 "register_operand" "0,?r")
                    537:                  (match_operator:SI 4 "comparison_operator"
                    538:                     [(match_operand:SI 2 "register_operand" "r,r")
                    539:                      (match_operand:SI 3 "arith11_operand" "rI,rI")])))]
                    540:   ""
                    541:   "@
                    542:    com%I3clr,%B4 %3,%2,0\;addi -1,%0,%0
                    543:    com%I3clr,%B4 %3,%2,0\;addi,tr -1,%1,%0\;copy %1,%0"
                    544:   [(set_attr "type" "binary,binary")
                    545:    (set_attr "length" "8,12")])
                    546: 
                    547: ; Patterns for max and min.  (There is no need for an earlyclobber in the
                    548: ; last alternative since the middle alternative will match if op0 == op1.)
                    549: 
                    550: (define_insn "sminsi3"
                    551:   [(set (match_operand:SI 0 "register_operand" "=r,r,r")
                    552:        (smin:SI (match_operand:SI 1 "register_operand" "%0,0,r")
                    553:                 (match_operand:SI 2 "arith11_operand" "r,I,M")))]
                    554:   ""
                    555:   "@
                    556:   comclr,> %2,%0,0\;copy %2,%0
                    557:   comiclr,> %2,%0,0\;ldi %2,%0
                    558:   comclr,> %1,%2,%0\;copy %1,%0"
                    559: [(set_attr "type" "multi,multi,multi")
                    560:  (set_attr "length" "8,8,8")])
                    561: 
                    562: (define_insn "uminsi3"
                    563:   [(set (match_operand:SI 0 "register_operand" "=r,r")
                    564:        (umin:SI (match_operand:SI 1 "register_operand" "%0,0")
                    565:                 (match_operand:SI 2 "arith11_operand" "r,I")))]
                    566:   ""
                    567:   "@
                    568:   comclr,>> %2,%0,0\;copy %2,%0
                    569:   comiclr,>> %2,%0,0\;ldi %2,%0"
                    570: [(set_attr "type" "multi,multi")
                    571:  (set_attr "length" "8,8")])
                    572: 
                    573: (define_insn "smaxsi3"
                    574:   [(set (match_operand:SI 0 "register_operand" "=r,r,r")
                    575:        (smax:SI (match_operand:SI 1 "register_operand" "%0,0,r")
                    576:                 (match_operand:SI 2 "arith11_operand" "r,I,M")))]
                    577:   ""
                    578:   "@
                    579:   comclr,< %2,%0,0\;copy %2,%0
                    580:   comiclr,< %2,%0,0\;ldi %2,%0
                    581:   comclr,< %1,%2,%0\;copy %1,%0"
                    582: [(set_attr "type" "multi,multi,multi")
                    583:  (set_attr "length" "8,8,8")])
                    584: 
                    585: (define_insn "umaxsi3"
                    586:   [(set (match_operand:SI 0 "register_operand" "=r,r")
                    587:        (umax:SI (match_operand:SI 1 "register_operand" "%0,0")
                    588:                 (match_operand:SI 2 "arith11_operand" "r,I")))]
                    589:   ""
                    590:   "@
                    591:   comclr,<< %2,%0,0\;copy %2,%0
                    592:   comiclr,<< %2,%0,0\;ldi %2,%0"
                    593: [(set_attr "type" "multi,multi")
                    594:  (set_attr "length" "8,8")])
                    595: ;;; Experimental conditional move patterns
                    596: 
                    597: ; We need the first constraint alternative in order to avoid
                    598: ; earlyclobbers on all other alternatives.
                    599: (define_insn ""
                    600:   [(set (match_operand:SI 0 "register_operand" "=r,r,r,r,r")
                    601:        (if_then_else:SI
                    602:         (match_operator 5 "comparison_operator"
                    603:            [(match_operand:SI 3 "register_operand" "r,r,r,r,r")
                    604:             (match_operand:SI 4 "arith11_operand" "rI,rI,rI,rI,rI")])
                    605:         (match_operand:SI 1 "reg_or_cint_move_operand" "0,r,J,N,K")
                    606:         (const_int 0)))]
                    607:   ""
                    608:   "@
                    609:    com%I4clr,%S5 %4,%3,0\;ldi 0,%0
                    610:    com%I4clr,%B5 %4,%3,%0\;copy %1,%0
                    611:    com%I4clr,%B5 %4,%3,%0\;ldi %1,%0
                    612:    com%I4clr,%B5 %4,%3,%0\;ldil L'%1,%0
                    613:    com%I4clr,%B5 %4,%3,%0\;zdepi %Z1,%0"
                    614:   [(set_attr "type" "multi,multi,multi,multi,multi")
                    615:    (set_attr "length" "8,8,8,8,8")])
                    616: 
                    617: (define_insn ""
                    618:   [(set (match_operand:SI 0 "register_operand" "=r,r,r,r,r,r,r,r")
                    619:        (if_then_else:SI
                    620:         (match_operator 5 "comparison_operator"
                    621:            [(match_operand:SI 3 "register_operand" "r,r,r,r,r,r,r,r")
                    622:             (match_operand:SI 4 "arith11_operand" "rI,rI,rI,rI,rI,rI,rI,rI")])
                    623:         (match_operand:SI 1 "reg_or_cint_move_operand" "0,0,0,0,r,J,N,K")
                    624:         (match_operand:SI 2 "reg_or_cint_move_operand" "r,J,N,K,0,0,0,0")))]
                    625:   ""
                    626:   "@
                    627:    com%I4clr,%S5 %4,%3,0\;copy %2,%0
                    628:    com%I4clr,%S5 %4,%3,0\;ldi %2,%0
                    629:    com%I4clr,%S5 %4,%3,0\;ldil L'%2,%0
                    630:    com%I4clr,%S5 %4,%3,0\;zdepi %Z2,%0
                    631:    com%I4clr,%B5 %4,%3,0\;copy %1,%0
                    632:    com%I4clr,%B5 %4,%3,0\;ldi %1,%0
                    633:    com%I4clr,%B5 %4,%3,0\;ldil L'%1,%0
                    634:    com%I4clr,%B5 %4,%3,0\;zdepi %Z1,%0"
                    635:   [(set_attr "type" "multi,multi,multi,multi,multi,multi,multi,multi")
                    636:    (set_attr "length" "8,8,8,8,8,8,8,8")])
                    637: 
                    638: ;; Conditional Branches
                    639: 
                    640: (define_expand "beq"
                    641:   [(set (pc)
                    642:        (if_then_else (eq (match_dup 1) (match_dup 2))
                    643:                      (label_ref (match_operand 0 "" ""))
                    644:                      (pc)))]
                    645:   ""
                    646:   "
                    647: {
                    648:   if (hppa_branch_type != CMP_SI)
                    649:     {
                    650:       emit_insn (gen_cmp_fp (EQ, hppa_compare_op0, hppa_compare_op1));
                    651:       emit_bcond_fp (NE, operands[0]);
                    652:       DONE;
                    653:     }
                    654:   /* set up operands from compare.  */
                    655:   operands[1] = hppa_compare_op0;
                    656:   operands[2] = hppa_compare_op1;
                    657:   /* fall through and generate default code */
                    658: }")
                    659: 
                    660: (define_expand "bne"
                    661:   [(set (pc)
                    662:        (if_then_else (ne (match_dup 1) (match_dup 2))
                    663:                      (label_ref (match_operand 0 "" ""))
                    664:                      (pc)))]
                    665:   ""
                    666:   "
                    667: {
                    668:   if (hppa_branch_type != CMP_SI)
                    669:     {
                    670:       emit_insn (gen_cmp_fp (NE, hppa_compare_op0, hppa_compare_op1));
                    671:       emit_bcond_fp (NE, operands[0]);
                    672:       DONE;
                    673:     }
                    674:   operands[1] = hppa_compare_op0;
                    675:   operands[2] = hppa_compare_op1;
                    676: }")
                    677: 
                    678: (define_expand "bgt"
                    679:   [(set (pc)
                    680:        (if_then_else (gt (match_dup 1) (match_dup 2))
                    681:                      (label_ref (match_operand 0 "" ""))
                    682:                      (pc)))]
                    683:   ""
                    684:   "
                    685: {
                    686:   if (hppa_branch_type != CMP_SI)
                    687:     {
                    688:       emit_insn (gen_cmp_fp (GT, hppa_compare_op0, hppa_compare_op1));
                    689:       emit_bcond_fp (NE, operands[0]);
                    690:       DONE;
                    691:     }
                    692:   operands[1] = hppa_compare_op0;
                    693:   operands[2] = hppa_compare_op1;
                    694: }")
                    695: 
                    696: (define_expand "blt"
                    697:   [(set (pc)
                    698:        (if_then_else (lt (match_dup 1) (match_dup 2))
                    699:                      (label_ref (match_operand 0 "" ""))
                    700:                      (pc)))]
                    701:   ""
                    702:   "
                    703: {
                    704:   if (hppa_branch_type != CMP_SI)
                    705:     {
                    706:       emit_insn (gen_cmp_fp (LT, hppa_compare_op0, hppa_compare_op1));
                    707:       emit_bcond_fp (NE, operands[0]);
                    708:       DONE;
                    709:     }
                    710:   operands[1] = hppa_compare_op0;
                    711:   operands[2] = hppa_compare_op1;
                    712: }")
                    713: 
                    714: (define_expand "bge"
                    715:   [(set (pc)
                    716:        (if_then_else (ge (match_dup 1) (match_dup 2))
                    717:                      (label_ref (match_operand 0 "" ""))
                    718:                      (pc)))]
                    719:   ""
                    720:   "
                    721: {
                    722:   if (hppa_branch_type != CMP_SI)
                    723:     {
                    724:       emit_insn (gen_cmp_fp (GE, hppa_compare_op0, hppa_compare_op1));
                    725:       emit_bcond_fp (NE, operands[0]);
                    726:       DONE;
                    727:     }
                    728:   operands[1] = hppa_compare_op0;
                    729:   operands[2] = hppa_compare_op1;
                    730: }")
                    731: 
                    732: (define_expand "ble"
                    733:   [(set (pc)
                    734:        (if_then_else (le (match_dup 1) (match_dup 2))
                    735:                      (label_ref (match_operand 0 "" ""))
                    736:                      (pc)))]
                    737:   ""
                    738:   "
                    739: {
                    740:   if (hppa_branch_type != CMP_SI)
                    741:     {
                    742:       emit_insn (gen_cmp_fp (LE, hppa_compare_op0, hppa_compare_op1));
                    743:       emit_bcond_fp (NE, operands[0]);
                    744:       DONE;
                    745:     }
                    746:   operands[1] = hppa_compare_op0;
                    747:   operands[2] = hppa_compare_op1;
                    748: }")
                    749: 
                    750: (define_expand "bgtu"
                    751:   [(set (pc)
                    752:        (if_then_else (gtu (match_dup 1) (match_dup 2))
                    753:                      (label_ref (match_operand 0 "" ""))
                    754:                      (pc)))]
                    755:   ""
                    756:   "
                    757: {
                    758:   if (hppa_branch_type != CMP_SI)
                    759:     FAIL;
                    760:   operands[1] = hppa_compare_op0;
                    761:   operands[2] = hppa_compare_op1;
                    762: }")
                    763: 
                    764: (define_expand "bltu"
                    765:   [(set (pc)
                    766:        (if_then_else (ltu (match_dup 1) (match_dup 2))
                    767:                      (label_ref (match_operand 0 "" ""))
                    768:                      (pc)))]
                    769:   ""
                    770:   "
                    771: {
                    772:   if (hppa_branch_type != CMP_SI)
                    773:     FAIL;
                    774:   operands[1] = hppa_compare_op0;
                    775:   operands[2] = hppa_compare_op1;
                    776: }")
                    777: 
                    778: (define_expand "bgeu"
                    779:   [(set (pc)
                    780:        (if_then_else (geu (match_dup 1) (match_dup 2))
                    781:                      (label_ref (match_operand 0 "" ""))
                    782:                      (pc)))]
                    783:   ""
                    784:   "
                    785: {
                    786:   if (hppa_branch_type != CMP_SI)
                    787:     FAIL;
                    788:   operands[1] = hppa_compare_op0;
                    789:   operands[2] = hppa_compare_op1;
                    790: }")
                    791: 
                    792: (define_expand "bleu"
                    793:   [(set (pc)
                    794:        (if_then_else (leu (match_dup 1) (match_dup 2))
                    795:                      (label_ref (match_operand 0 "" ""))
                    796:                      (pc)))]
                    797:   ""
                    798:   "
                    799: {
                    800:   if (hppa_branch_type != CMP_SI)
                    801:     FAIL;
                    802:   operands[1] = hppa_compare_op0;
                    803:   operands[2] = hppa_compare_op1;
                    804: }")
                    805: 
                    806: ;; Match the branch patterns.
                    807: 
                    808: 
                    809: ;; Note a long backward conditional branch with an annulled delay slot
                    810: ;; has a length of 12.
                    811: (define_insn ""
                    812:   [(set (pc)
                    813:        (if_then_else
                    814:         (match_operator 3 "comparison_operator"
                    815:                         [(match_operand:SI 1 "register_operand" "r")
                    816:                          (match_operand:SI 2 "arith5_operand" "rL")])
                    817:         (label_ref (match_operand 0 "" ""))
                    818:         (pc)))]
                    819:   ""
                    820:   "*
                    821: {
                    822:   return output_cbranch (operands, INSN_ANNULLED_BRANCH_P (insn),
                    823:                         get_attr_length (insn), 0, insn);
                    824: }"
                    825: [(set_attr "type" "cbranch")
                    826:  (set (attr "length")
                    827:     (if_then_else (lt (abs (minus (match_dup 0) (plus (pc) (const_int 8))))
                    828:                      (const_int 8188))
                    829:            (const_int 4)
                    830:           (const_int 8)))])
                    831: 
                    832: ;; Match the negated branch.
                    833: 
                    834: (define_insn ""
                    835:   [(set (pc)
                    836:        (if_then_else
                    837:         (match_operator 3 "comparison_operator"
                    838:                         [(match_operand:SI 1 "register_operand" "r")
                    839:                          (match_operand:SI 2 "arith5_operand" "rL")])
                    840:         (pc)
                    841:         (label_ref (match_operand 0 "" ""))))]
                    842:   ""
                    843:   "*
                    844: {
                    845:   return output_cbranch (operands, INSN_ANNULLED_BRANCH_P (insn),
                    846:                         get_attr_length (insn), 1, insn);
                    847: }"
                    848: [(set_attr "type" "cbranch")
                    849:  (set (attr "length")
                    850:     (if_then_else (lt (abs (minus (match_dup 0) (plus (pc) (const_int 8))))
                    851:                      (const_int 8188))
                    852:            (const_int 4)
                    853:           (const_int 8)))])
                    854: 
                    855: ;; Branch on Bit patterns.
                    856: (define_insn ""
                    857:   [(set (pc)
                    858:        (if_then_else
                    859:         (ne (zero_extract:SI (match_operand:SI 0 "register_operand" "r")
                    860:                              (const_int 1)
                    861:                              (match_operand:SI 1 "uint5_operand" ""))
                    862:             (const_int 0))
                    863:         (match_operand 2 "pc_or_label_operand" "")
                    864:         (match_operand 3 "pc_or_label_operand" "")))]
                    865:   ""
                    866:   "*
                    867: {
                    868:   return output_bb (operands, INSN_ANNULLED_BRANCH_P (insn),
                    869:                         get_attr_length (insn),
                    870:                         (operands[3] != pc_rtx),
                    871:                         insn, 0);
                    872: }"
                    873: [(set_attr "type" "cbranch")
                    874:  (set (attr "length")
                    875:     (if_then_else (lt (abs (minus (match_dup 0) (plus (pc) (const_int 8))))
                    876:                      (const_int 8188))
                    877:            (const_int 4)
                    878:           (const_int 8)))])
                    879: 
                    880: (define_insn ""
                    881:   [(set (pc)
                    882:        (if_then_else
                    883:         (eq (zero_extract:SI (match_operand:SI 0 "register_operand" "r")
                    884:                              (const_int 1)
                    885:                              (match_operand:SI 1 "uint5_operand" ""))
                    886:             (const_int 0))
                    887:         (match_operand 2 "pc_or_label_operand" "")
                    888:         (match_operand 3 "pc_or_label_operand" "")))]
                    889:   ""
                    890:   "*
                    891: {
                    892:   return output_bb (operands, INSN_ANNULLED_BRANCH_P (insn),
                    893:                         get_attr_length (insn),
                    894:                         (operands[3] != pc_rtx),
                    895:                         insn, 1);
                    896: }"
                    897: [(set_attr "type" "cbranch")
                    898:  (set (attr "length")
                    899:     (if_then_else (lt (abs (minus (match_dup 0) (plus (pc) (const_int 8))))
                    900:                      (const_int 8188))
                    901:            (const_int 4)
                    902:           (const_int 8)))])
                    903: 
                    904: ;; Floating point branches
                    905: (define_insn ""
                    906:   [(set (pc) (if_then_else (ne (reg:CCFP 0) (const_int 0))
                    907:                           (label_ref (match_operand 0 "" ""))
                    908:                           (pc)))]
                    909:   ""
                    910:   "*
                    911: {
                    912:   if (INSN_ANNULLED_BRANCH_P (insn))
                    913:     return \"ftest\;bl,n %0,0\";
                    914:   else
                    915:     return \"ftest\;bl%* %0,0\";
                    916: }"
                    917:   [(set_attr "type" "fbranch")
                    918:    (set_attr "length" "8")])
                    919: 
                    920: (define_insn ""
                    921:   [(set (pc) (if_then_else (ne (reg:CCFP 0) (const_int 0))
                    922:                           (pc)
                    923:                           (label_ref (match_operand 0 "" ""))))]
                    924:   ""
                    925:   "*
                    926: {
                    927:   if (INSN_ANNULLED_BRANCH_P (insn))
                    928:     return \"ftest\;add,tr 0,0,0\;bl,n %0,0\";
                    929:   else
                    930:     return \"ftest\;add,tr 0,0,0\;bl%* %0,0\";
                    931: }"
                    932:   [(set_attr "type" "fbranch")
                    933:    (set_attr "length" "12")])
                    934: 
                    935: ;; Move instructions
                    936: 
                    937: (define_expand "movsi"
                    938:   [(set (match_operand:SI 0 "general_operand" "")
                    939:        (match_operand:SI 1 "general_operand" ""))]
                    940:   ""
                    941:   "
                    942: {
                    943:   if (emit_move_sequence (operands, SImode, 0))
                    944:     DONE;
                    945: }")
                    946: 
                    947: ;; Reloading an SImode or DImode value requires a scratch register if
                    948: ;; going in to or out of float point registers.
                    949: 
                    950: (define_expand "reload_insi"
                    951:   [(set (match_operand:SI 0 "register_operand" "=Z")
                    952:        (match_operand:SI 1 "general_operand" ""))
                    953:    (clobber (match_operand:SI 2 "register_operand" "=&r"))]
                    954:   ""
                    955:   "
                    956: {
                    957:   if (emit_move_sequence (operands, SImode, operands[2]))
                    958:     DONE;
                    959: 
                    960:   /* We don't want the clobber emitted, so handle this ourselves.  */
                    961:   emit_insn (gen_rtx (SET, VOIDmode, operands[0], operands[1]));
                    962:   DONE;
                    963: }")
                    964: 
                    965: (define_expand "reload_outsi"
                    966:   [(set (match_operand:SI 0 "general_operand" "")
                    967:        (match_operand:SI 1  "register_operand" "Z"))
                    968:    (clobber (match_operand:SI 2 "register_operand" "=&r"))]
                    969:   ""
                    970:   "
                    971: {
                    972:   if (emit_move_sequence (operands, SImode, operands[2]))
                    973:     DONE;
                    974: 
                    975:   /* We don't want the clobber emitted, so handle this ourselves.  */
                    976:   emit_insn (gen_rtx (SET, VOIDmode, operands[0], operands[1]));
                    977:   DONE;
                    978: }")
                    979: 
                    980: ;;; pic symbol references
                    981: 
                    982: (define_insn ""
                    983:   [(set (match_operand:SI 0 "register_operand" "=r")
                    984:        (mem:SI (plus:SI (match_operand:SI 1 "register_operand" "r")
                    985:                         (match_operand:SI 2 "symbolic_operand" ""))))]
                    986:   "flag_pic && operands[1] == pic_offset_table_rtx"
                    987:   "ldw T'%2(%1),%0"
                    988:   [(set_attr "type" "load")
                    989:    (set_attr "length" "4")])
                    990: 
                    991: (define_insn ""
                    992:   [(set (match_operand:SI 0 "reg_or_nonsymb_mem_operand"
                    993:                                "=r,r,r,r,r,Q,*q,!fx,fx,*T")
                    994:        (match_operand:SI 1 "move_operand"
                    995:                                "rM,J,N,K,Q,rM,rM,!fxM,*T,fx"))]
                    996:   "register_operand (operands[0], SImode)
                    997:    || reg_or_0_operand (operands[1], SImode)"
                    998:   "@
                    999:    copy %r1,%0
                   1000:    ldi %1,%0
                   1001:    ldil L'%1,%0
                   1002:    zdepi %Z1,%0
                   1003:    ldw%M1 %1,%0
                   1004:    stw%M0 %r1,%0
                   1005:    mtsar %r1
                   1006:    fcpy,sgl %r1,%0
                   1007:    fldws%F1 %1,%0
                   1008:    fstws%F0 %1,%0"
                   1009:   [(set_attr "type" "move,move,move,move,load,store,move,fpalu,fpload,fpstore")
                   1010:    (set_attr "length" "4,4,4,4,4,4,4,4,4,4")])
                   1011: 
                   1012: ;; Load indexed.  We don't use unscaled modes since they can't be used
                   1013: ;; unless we can tell which of the registers is the base and which is
                   1014: ;; the index, due to PA's idea of segment selection using the top bits
                   1015: ;; of the base register.
                   1016: 
                   1017: (define_insn ""
                   1018:   [(set (match_operand:SI 0 "register_operand" "=r")
                   1019:        (mem:SI (plus:SI (mult:SI (match_operand:SI 1 "register_operand" "r")
                   1020:                                  (const_int 4))
                   1021:                         (match_operand:SI 2 "register_operand" "r"))))]
                   1022:   "! TARGET_DISABLE_INDEXING"
                   1023:   "ldwx,s %1(0,%2),%0"
                   1024:   [(set_attr "type" "load")
                   1025:    (set_attr "length" "4")])
                   1026: 
                   1027: ;; This variant of the above insn can occur if the second operand
                   1028: ;; is the frame pointer.  This is a kludge, but there doesn't
                   1029: ;; seem to be a way around it.  Only recognize it while reloading.
                   1030: ;; Note how operand 3 uses a predicate of "const_int_operand", but 
                   1031: ;; has constraints allowing a register.  I don't know how this works,
                   1032: ;; but it somehow makes sure that out-of-range constants are placed
                   1033: ;; in a register which somehow magically is a "const_int_operand".
                   1034: ;; (this was stolen from alpha.md, I'm not going to try and change it.
                   1035: (define_insn ""
                   1036:   [(set (match_operand:SI 0 "register_operand" "&=r")
                   1037:        (mem:SI (plus:SI (plus:SI
                   1038:                            (mult:SI (match_operand:SI 1 "register_operand" "r")
                   1039:                                     (const_int 4))
                   1040:                            (match_operand:SI 2 "register_operand" "r"))
                   1041:                         (match_operand:SI 3 "const_int_operand" "rI"))))]
                   1042:   "! TARGET_DISABLE_INDEXING && reload_in_progress"
                   1043:   "*
                   1044: {
                   1045:   if (GET_CODE (operands[3]) == CONST_INT)
                   1046:     return \"sh2add %1,%2,%0\;ldw %3(0,%0),%0\";
                   1047:   else
                   1048:     return \"sh2add %1,%2,%0\;ldwx %3(0,%0),%0\";
                   1049: }"
                   1050:   [(set_attr "type" "load")
                   1051:    (set_attr "length" "8")])
                   1052: 
                   1053: ;; Load or store with base-register modification.
                   1054: 
                   1055: (define_insn "pre_ldwm"
                   1056:   [(set (match_operand:SI 3 "register_operand" "=r")
                   1057:        (mem:SI (plus:SI (match_operand:SI 1 "register_operand" "0")
                   1058:                         (match_operand:SI 2 "pre_cint_operand" ""))))
                   1059:    (set (match_operand:SI 0 "register_operand" "=r")
                   1060:        (plus:SI (match_dup 1) (match_dup 2)))]
                   1061:   ""
                   1062:   "*
                   1063: {
                   1064:   if (INTVAL (operands[2]) < 0)
                   1065:     return \"ldwm %2(0,%0),%3\";
                   1066:   return \"ldws,mb %2(0,%0),%3\";
                   1067: }"
                   1068:   [(set_attr "type" "load")
                   1069:    (set_attr "length" "4")])
                   1070: 
                   1071: (define_insn "pre_stwm"
                   1072:   [(set (mem:SI (plus:SI (match_operand:SI 1 "register_operand" "0")
                   1073:                         (match_operand:SI 2 "pre_cint_operand" "")))
                   1074:        (match_operand:SI 3 "reg_or_0_operand" "rM"))
                   1075:    (set (match_operand:SI 0 "register_operand" "=r")
                   1076:        (plus:SI (match_dup 1) (match_dup 2)))]
                   1077:   ""
                   1078:   "*
                   1079: {
                   1080:   if (INTVAL (operands[2]) < 0)
                   1081:     return \"stwm %r3,%2(0,%0)\";
                   1082:   return \"stws,mb %r3,%2(0,%0)\";
                   1083: }"
                   1084:   [(set_attr "type" "store")
                   1085:    (set_attr "length" "4")])
                   1086: 
                   1087: (define_insn "post_ldwm"
                   1088:   [(set (match_operand:SI 3 "register_operand" "r")
                   1089:        (mem:SI (match_operand:SI 1 "register_operand" "0")))
                   1090:    (set (match_operand:SI 0 "register_operand" "=r")
                   1091:        (plus:SI (match_dup 1)
                   1092:                 (match_operand:SI 2 "post_cint_operand" "")))]
                   1093:   ""
                   1094:   "*
                   1095: {
                   1096:   if (INTVAL (operands[2]) > 0)
                   1097:     return \"ldwm %2(0,%0),%3\";
                   1098:   return \"ldws,ma %2(0,%0),%3\";
                   1099: }"
                   1100:   [(set_attr "type" "load")
                   1101:    (set_attr "length" "4")])
                   1102: 
                   1103: (define_insn "post_stwm"
                   1104:   [(set (mem:SI (match_operand:SI 1 "register_operand" "0"))
                   1105:        (match_operand:SI 3 "reg_or_0_operand" "rM"))
                   1106:    (set (match_operand:SI 0 "register_operand" "=r")
                   1107:        (plus:SI (match_dup 1)
                   1108:                 (match_operand:SI 2 "post_cint_operand" "")))]
                   1109:   ""
                   1110:   "*
                   1111: {
                   1112:   if (INTVAL (operands[2]) > 0)
                   1113:     return \"stwm %r3,%2(0,%0)\";
                   1114:   return \"stws,ma %r3,%2(0,%0)\";
                   1115: }"
                   1116:   [(set_attr "type" "store")
                   1117:    (set_attr "length" "4")])
                   1118: 
                   1119: ;; For pic
                   1120: (define_insn ""
                   1121:   [(set (match_operand:SI 0 "register_operand" "=r")
                   1122:        (match_operand:SI 1 "pic_operand" "i"))
                   1123:    (clobber (match_scratch:SI 2 "=a"))]
                   1124:   ""
                   1125:   "*
                   1126: {
                   1127:   rtx label_rtx = gen_label_rtx ();
                   1128:   rtx xoperands[3];
                   1129:   extern FILE *asm_out_file;
                   1130: 
                   1131:   xoperands[0] = operands[0];
                   1132:   xoperands[1] = operands[1];
                   1133:   xoperands[2] = label_rtx;
                   1134:   output_asm_insn (\"bl .+8,%0\;addil L'%1-%2,%0\", xoperands);
                   1135:   ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, \"L\", CODE_LABEL_NUMBER (label_rtx));
                   1136:   output_asm_insn (\"ldo R'%1-%2(1),%0\", xoperands);
                   1137:   return \"\";
                   1138:   }
                   1139: "
                   1140:   [(set_attr "type" "multi")
                   1141:    (set_attr "length" "12")])
                   1142: 
                   1143: ;; Always use addil rather than ldil;add sequences.  This allows the
                   1144: ;; HP linker to eliminate the dp relocation if the symbolic operand
                   1145: ;; lives in the TEXT space.
                   1146: (define_insn ""
                   1147:   [(set (match_operand:SI 0 "register_operand" "=a")
                   1148:        (high:SI (match_operand 1 "" "")))]
                   1149:   "symbolic_operand (operands[1], Pmode)
                   1150:    && ! function_label_operand (operands[1])
                   1151:    && ! read_only_operand (operands[1])"
                   1152:   "@
                   1153:    addil L'%G1,%%r27"
                   1154:   [(set_attr "type" "binary")
                   1155:    (set_attr "length" "4")])
                   1156: 
                   1157: ;; This is for use in the prologue/epilogue code.  We need it
                   1158: ;; to add large constants to a stack pointer or frame pointer.
                   1159: ;; Because of the additional %r1 pressure, we probably do not
                   1160: ;; want to use this in general code, so make it available
                   1161: ;; only after reload.
                   1162: (define_insn "add_high_const"
                   1163:   [(set (match_operand:SI 0 "register_operand" "=!a,*r")
                   1164:        (plus (match_operand:SI 1 "register_operand" "r,r")
                   1165:              (high:SI (match_operand 2 "const_int_operand" ""))))]
                   1166:   "reload_completed"
                   1167:   "@
                   1168:    addil L'%G2,%1
                   1169:    ldil L'%G2,%0\;add %0,%1,%0"
                   1170:   [(set_attr "type" "binary,binary")
                   1171:    (set_attr "length" "4,8")])
                   1172: 
                   1173: ;; For function addresses.
                   1174: (define_insn ""
                   1175:   [(set (match_operand:SI 0 "register_operand" "=r")
                   1176:        (high:SI (match_operand:SI 1 "function_label_operand" "")))]
                   1177:   "!TARGET_PORTABLE_RUNTIME"
                   1178:   "ldil LP'%G1,%0"
                   1179:   [(set_attr "type" "move")
                   1180:    (set_attr "length" "4")])
                   1181: 
                   1182: ;; This version is used only for the portable runtime conventions model
                   1183: ;; (it does not use/support plabels)
                   1184: (define_insn ""
                   1185:   [(set (match_operand:SI 0 "register_operand" "=r")
                   1186:        (high:SI (match_operand:SI 1 "function_label_operand" "")))]
                   1187:   "TARGET_PORTABLE_RUNTIME"
                   1188:   "ldil L'%G1,%0"
                   1189:   [(set_attr "type" "move")
                   1190:    (set_attr "length" "4")])
                   1191: 
                   1192: (define_insn ""
                   1193:   [(set (match_operand:SI 0 "register_operand" "=r")
                   1194:        (high:SI (match_operand 1 "" "")))]
                   1195:   "check_pic (1)"
                   1196:   "ldil L'%G1,%0"
                   1197:   [(set_attr "type" "move")
                   1198:    (set_attr "length" "4")])
                   1199: 
                   1200: ;; lo_sum of a function address.
                   1201: ;;
                   1202: ;; Note since we are not supporting MPE style external calls we can
                   1203: ;; use the short ldil;ldo sequence.  If one wanted to support
                   1204: ;; MPE external calls you would want to generate something like
                   1205: ;; ldil;ldo;extru;ldw;add.  See the HP compiler's output for details.
                   1206: (define_insn ""
                   1207:   [(set (match_operand:SI 0 "register_operand" "=r")
                   1208:        (lo_sum:SI (match_operand:SI 1 "register_operand" "r")
                   1209:                   (match_operand:SI 2 "function_label_operand" "")))]
                   1210:   "!TARGET_PORTABLE_RUNTIME"
                   1211:   "ldo RP'%G2(%1),%0"
                   1212:   [(set_attr "length" "4")])
                   1213: 
                   1214: ;; This version is used only for the portable runtime conventions model
                   1215: ;; (it does not use/support plabels)
                   1216: (define_insn ""
                   1217:   [(set (match_operand:SI 0 "register_operand" "=r")
                   1218:        (lo_sum:SI (match_operand:SI 1 "register_operand" "r")
                   1219:                   (match_operand:SI 2 "function_label_operand" "")))]
                   1220:   "TARGET_PORTABLE_RUNTIME"
                   1221:   "ldo R'%G2(%1),%0"
                   1222:   [(set_attr "length" "4")])
                   1223: 
                   1224: (define_insn ""
                   1225:   [(set (match_operand:SI 0 "register_operand" "=r")
                   1226:        (lo_sum:SI (match_operand:SI 1 "register_operand" "r")
                   1227:                   (match_operand:SI 2 "immediate_operand" "i")))]
                   1228:   ""
                   1229:   "ldo R'%G2(%1),%0"
                   1230:   [(set_attr "length" "4")])
                   1231: 
                   1232: ;; Now that a symbolic_address plus a constant is broken up early
                   1233: ;; in the compilation phase (for better CSE) we need a special
                   1234: ;; combiner pattern to load the symbolic address plus the constant
                   1235: ;; in only 2 instructions. (For cases where the symbolic address
                   1236: ;; was not a common subexpression.)
                   1237: (define_split
                   1238:   [(set (match_operand:SI 0 "register_operand" "")
                   1239:        (match_operand 1 "symbolic_operand" ""))
                   1240:    (clobber (match_operand:SI 2 "register_operand" ""))]
                   1241:   ""
                   1242:   [(set (match_dup 2) (high:SI (match_dup 1)))
                   1243:    (set (match_dup 0) (lo_sum:SI (match_dup 2) (match_dup 1)))]
                   1244:   "")
                   1245: 
                   1246: (define_expand "movhi"
                   1247:   [(set (match_operand:HI 0 "general_operand" "")
                   1248:        (match_operand:HI 1 "general_operand" ""))]
                   1249:   ""
                   1250:   "
                   1251: {
                   1252:   if (emit_move_sequence (operands, HImode, 0))
                   1253:     DONE;
                   1254: }")
                   1255: 
                   1256: (define_insn ""
                   1257:   [(set (match_operand:HI 0 "reg_or_nonsymb_mem_operand" "=r,r,r,r,r,Q,*q,!fx")
                   1258:        (match_operand:HI 1 "move_operand" "rM,J,N,K,Q,rM,rM,!fxM"))]
                   1259:   "register_operand (operands[0], HImode)
                   1260:    || reg_or_0_operand (operands[1], HImode)"
                   1261:   "@
                   1262:    copy %r1,%0
                   1263:    ldi %1,%0
                   1264:    ldil L'%1,%0
                   1265:    zdepi %Z1,%0
                   1266:    ldh%M1 %1,%0
                   1267:    sth%M0 %r1,%0
                   1268:    mtsar %r1
                   1269:    fcpy,sgl %r1,%0"
                   1270:   [(set_attr "type" "move,move,move,move,load,store,move,fpalu")
                   1271:    (set_attr "length" "4,4,4,4,4,4,4,4")])
                   1272: 
                   1273: (define_insn ""
                   1274:   [(set (match_operand:HI 0 "register_operand" "=r")
                   1275:        (mem:HI (plus:SI (mult:SI (match_operand:SI 2 "register_operand" "r")
                   1276:                                  (const_int 2))
                   1277:                         (match_operand:SI 1 "register_operand" "r"))))]
                   1278:   "! TARGET_DISABLE_INDEXING"
                   1279:   "ldhx,s %2(0,%1),%0"
                   1280:   [(set_attr "type" "load")
                   1281:    (set_attr "length" "4")])
                   1282: 
                   1283: ;; This variant of the above insn can occur if the second operand
                   1284: ;; is the frame pointer.  This is a kludge, but there doesn't
                   1285: ;; seem to be a way around it.  Only recognize it while reloading.
                   1286: ;; Note how operand 3 uses a predicate of "const_int_operand", but 
                   1287: ;; has constraints allowing a register.  I don't know how this works,
                   1288: ;; but it somehow makes sure that out-of-range constants are placed
                   1289: ;; in a register which somehow magically is a "const_int_operand".
                   1290: ;; (this was stolen from alpha.md, I'm not going to try and change it.
                   1291: (define_insn ""
                   1292:   [(set (match_operand:HI 0 "register_operand" "=&r")
                   1293:        (mem:HI (plus:SI (plus:SI
                   1294:                            (mult:SI (match_operand:SI 2 "register_operand" "r")
                   1295:                                     (const_int 2))
                   1296:                            (match_operand:SI 1 "register_operand" "r"))
                   1297:                         (match_operand:SI 3 "const_int_operand" "rI"))))]
                   1298:   "! TARGET_DISABLE_INDEXING && reload_in_progress"
                   1299:   "*
                   1300: {
                   1301:   if (GET_CODE (operands[3]) == CONST_INT)
                   1302:     return \"sh1add %2,%1,%0\;ldh %3(0,%0),%0\";
                   1303:   else
                   1304:     return \"sh1add %2,%1,%0\;ldhx %3(0,%0),%0\";
                   1305: }"
                   1306:   [(set_attr "type" "load")
                   1307:    (set_attr "length" "8")])
                   1308: 
                   1309: (define_insn ""
                   1310:   [(set (match_operand:HI 3 "register_operand" "=r")
                   1311:        (mem:HI (plus:SI (match_operand:SI 1 "register_operand" "0")
                   1312:                         (match_operand:SI 2 "int5_operand" "L"))))
                   1313:    (set (match_operand:SI 0 "register_operand" "=r")
                   1314:        (plus:SI (match_dup 1) (match_dup 2)))]
                   1315:   ""
                   1316:   "ldhs,mb %2(0,%0),%3"
                   1317:   [(set_attr "type" "load")
                   1318:    (set_attr "length" "4")])
                   1319: 
                   1320: (define_insn ""
                   1321:   [(set (mem:HI (plus:SI (match_operand:SI 1 "register_operand" "0")
                   1322:                         (match_operand:SI 2 "int5_operand" "L")))
                   1323:        (match_operand:HI 3 "reg_or_0_operand" "rM"))
                   1324:    (set (match_operand:SI 0 "register_operand" "=r")
                   1325:        (plus:SI (match_dup 1) (match_dup 2)))]
                   1326:   ""
                   1327:   "sths,mb %r3,%2(0,%0)"
                   1328:   [(set_attr "type" "store")
                   1329:    (set_attr "length" "4")])
                   1330: 
                   1331: (define_insn ""
                   1332:   [(set (match_operand:HI 0 "register_operand" "=r")
                   1333:        (high:HI (match_operand 1 "" "")))]
                   1334:   "check_pic (1)"
                   1335:   "ldil L'%G1,%0"
                   1336:   [(set_attr "type" "move")
                   1337:    (set_attr "length" "4")])
                   1338: 
                   1339: (define_insn ""
                   1340:   [(set (match_operand:HI 0 "register_operand" "=r")
                   1341:        (lo_sum:HI (match_operand:HI 1 "register_operand" "r")
                   1342:                   (match_operand 2 "immediate_operand" "i")))]
                   1343:   ""
                   1344:   "ldo R'%G2(%1),%0"
                   1345:   [(set_attr "length" "4")])
                   1346: 
                   1347: (define_expand "movqi"
                   1348:   [(set (match_operand:QI 0 "general_operand" "")
                   1349:        (match_operand:QI 1 "general_operand" ""))]
                   1350:   ""
                   1351:   "
                   1352: {
                   1353:   if (emit_move_sequence (operands, QImode, 0))
                   1354:     DONE;
                   1355: }")
                   1356: 
                   1357: (define_insn ""
                   1358:   [(set (match_operand:QI 0 "reg_or_nonsymb_mem_operand" "=r,r,r,r,r,Q,*q,!fx")
                   1359:        (match_operand:QI 1 "move_operand" "rM,J,N,K,Q,rM,rM,!fxM"))]
                   1360:   "register_operand (operands[0], QImode)
                   1361:    || reg_or_0_operand (operands[1], QImode)"
                   1362:   "@
                   1363:    copy %r1,%0
                   1364:    ldi %1,%0
                   1365:    ldil L'%1,%0
                   1366:    zdepi %Z1,%0
                   1367:    ldb%M1 %1,%0
                   1368:    stb%M0 %r1,%0
                   1369:    mtsar %r1
                   1370:    fcpy,sgl %r1,%0"
                   1371:   [(set_attr "type" "move,move,move,move,load,store,move,fpalu")
                   1372:    (set_attr "length" "4,4,4,4,4,4,4,4")])
                   1373: 
                   1374: (define_insn ""
                   1375:   [(set (match_operand:QI 3 "register_operand" "=r")
                   1376:        (mem:QI (plus:SI (match_operand:SI 1 "register_operand" "0")
                   1377:                         (match_operand:SI 2 "int5_operand" "L"))))
                   1378:    (set (match_operand:SI 0 "register_operand" "=r")
                   1379:        (plus:SI (match_dup 1) (match_dup 2)))]
                   1380:   ""
                   1381:   "ldbs,mb %2(0,%0),%3"
                   1382:   [(set_attr "type" "load")
                   1383:    (set_attr "length" "4")])
                   1384: 
                   1385: (define_insn ""
                   1386:   [(set (mem:QI (plus:SI (match_operand:SI 1 "register_operand" "0")
                   1387:                         (match_operand:SI 2 "int5_operand" "L")))
                   1388:        (match_operand:QI 3 "reg_or_0_operand" "rM"))
                   1389:    (set (match_operand:SI 0 "register_operand" "=r")
                   1390:        (plus:SI (match_dup 1) (match_dup 2)))]
                   1391:   ""
                   1392:   "stbs,mb %r3,%2(0,%0)"
                   1393:   [(set_attr "type" "store")
                   1394:    (set_attr "length" "4")])
                   1395: 
                   1396: ;; The definition of this insn does not really explain what it does,
                   1397: ;; but it should suffice
                   1398: ;; that anything generated as this insn will be recognized as one
                   1399: ;; and that it will not successfully combine with anything.
                   1400: (define_expand "movstrsi"
                   1401:   [(parallel [(set (mem:BLK (match_operand:BLK 0 "" ""))
                   1402:                   (mem:BLK (match_operand:BLK 1 "" "")))
                   1403:              (clobber (match_dup 0))
                   1404:              (clobber (match_dup 1))
                   1405:              (clobber (match_dup 4))
                   1406:              (clobber (match_dup 5))
                   1407:              (use (match_operand:SI 2 "arith_operand" ""))
                   1408:              (use (match_operand:SI 3 "const_int_operand" ""))])]
                   1409:   ""
                   1410:   "
                   1411: {
                   1412:   /* If the blocks are not at least word-aligned and rather big (>16 items),
                   1413:      or the size is indeterminate, don't inline the copy code.  A
                   1414:      procedure call is better since it can check the alignment at
                   1415:      runtime and make the optimal decisions.  */
                   1416:      if (INTVAL (operands[3]) < 4
                   1417:         && (GET_CODE (operands[2]) != CONST_INT
                   1418:             || (INTVAL (operands[2]) / INTVAL (operands[3]) > 8)))
                   1419:        FAIL;
                   1420: 
                   1421:   operands[0] = copy_to_mode_reg (SImode, XEXP (operands[0], 0));
                   1422:   operands[1] = copy_to_mode_reg (SImode, XEXP (operands[1], 0));
                   1423:   operands[4] = gen_reg_rtx (SImode);
                   1424:   operands[5] = gen_reg_rtx (SImode);
                   1425: }")
                   1426: 
                   1427: ;; The operand constraints are written like this to support both compile-time
                   1428: ;; and run-time determined byte count.  If the count is run-time determined,
                   1429: ;; the register with the byte count is clobbered by the copying code, and
                   1430: ;; therefore it is forced to operand 2.  If the count is compile-time
                   1431: ;; determined, we need two scratch registers for the unrolled code.
                   1432: (define_insn ""
                   1433:   [(set (mem:BLK (match_operand:SI 0 "register_operand" "+r,r"))
                   1434:        (mem:BLK (match_operand:SI 1 "register_operand" "+r,r")))
                   1435:    (clobber (match_dup 0))
                   1436:    (clobber (match_dup 1))
                   1437:    (clobber (match_operand:SI 2 "register_operand" "=r,r"))    ;loop cnt/tmp
                   1438:    (clobber (match_operand:SI 3 "register_operand" "=&r,&r"))  ;item tmp
                   1439:    (use (match_operand:SI 4 "arith_operand" "J,2"))     ;byte count
                   1440:    (use (match_operand:SI 5 "const_int_operand" "n,n"))] ;alignment
                   1441:   ""
                   1442:   "* return output_block_move (operands, !which_alternative);"
                   1443:   [(set_attr "type" "multi,multi")])
                   1444: 
                   1445: ;; Floating point move insns
                   1446: 
                   1447: ;; This pattern forces (set (reg:DF ...) (const_double ...))
                   1448: ;; to be reloaded by putting the constant into memory when
                   1449: ;; reg is a floating point register.
                   1450: ;;
                   1451: ;; For integer registers we use ldil;ldo to set the appropriate
                   1452: ;; value.
                   1453: ;;
                   1454: ;; This must come before the movdf pattern, and it must be present
                   1455: ;; to handle obscure reloading cases.
                   1456: (define_insn ""
                   1457:   [(set (match_operand:DF 0 "general_operand" "=?r,fx")
                   1458:        (match_operand:DF 1 "" "?E,m"))]
                   1459:   "GET_CODE (operands[1]) == CONST_DOUBLE
                   1460:    && operands[1] != CONST0_RTX (DFmode)"
                   1461:   "* return (which_alternative == 0 ? output_move_double (operands)
                   1462:                                    : \" fldds%F1 %1,%0\");"
                   1463:   [(set_attr "type" "move,fpload")
                   1464:    (set_attr "length" "16,4")])
                   1465: 
                   1466: (define_expand "movdf"
                   1467:   [(set (match_operand:DF 0 "general_operand" "")
                   1468:        (match_operand:DF 1 "general_operand" ""))]
                   1469:   ""
                   1470:   "
                   1471: {
                   1472:   if (emit_move_sequence (operands, DFmode, 0))
                   1473:     DONE;
                   1474: }")
                   1475: 
                   1476: (define_insn ""
                   1477:   [(set (match_operand:DF 0 "reg_or_nonsymb_mem_operand"
                   1478:                          "=fx,*r,Q,?o,?Q,fx,*&r,*&r")
                   1479:        (match_operand:DF 1 "reg_or_0_or_nonsymb_mem_operand"
                   1480:                          "fxG,*rG,fx,*r,*r,Q,o,Q"))]
                   1481:   "register_operand (operands[0], DFmode)
                   1482:    || reg_or_0_operand (operands[1], DFmode)"
                   1483:   "*
                   1484: {
                   1485:   if (FP_REG_P (operands[0]) || FP_REG_P (operands[1])
                   1486:       || operands[1] == CONST0_RTX (DFmode))
                   1487:     return output_fp_move_double (operands);
                   1488:   return output_move_double (operands);
                   1489: }"
                   1490:   [(set_attr "type" "fpalu,move,fpstore,store,store,fpload,load,load")
                   1491:    (set_attr "length" "4,8,4,8,16,4,8,16")])
                   1492: 
                   1493: (define_insn ""
                   1494:   [(set (match_operand:DF 0 "register_operand" "=fx")
                   1495:        (mem:DF (plus:SI (mult:SI (match_operand:SI 1 "register_operand" "r")
                   1496:                                  (const_int 8))
                   1497:                         (match_operand:SI 2 "register_operand" "r"))))]
                   1498:   "! TARGET_DISABLE_INDEXING"
                   1499:   "flddx,s %1(0,%2),%0"
                   1500:   [(set_attr "type" "fpload")
                   1501:    (set_attr "length" "4")])
                   1502: 
                   1503: ;; This variant of the above insn can occur if the second operand
                   1504: ;; is the frame pointer.  This is a kludge, but there doesn't
                   1505: ;; seem to be a way around it.  Only recognize it while reloading.
                   1506: ;; Note how operand 3 uses a predicate of "const_int_operand", but 
                   1507: ;; has constraints allowing a register.  I don't know how this works,
                   1508: ;; but it somehow makes sure that out-of-range constants are placed
                   1509: ;; in a register which somehow magically is a "const_int_operand".
                   1510: ;; (this was stolen from alpha.md, I'm not going to try and change it.
                   1511: ;; Ugh. Output is a FP register; so we need to earlyclobber something
                   1512: ;; else as a temporary.
                   1513: (define_insn ""
                   1514:   [(set (match_operand:DF 0 "register_operand" "=fx")
                   1515:        (mem:DF (plus:SI
                   1516:                  (plus:SI
                   1517:                    (mult:SI (match_operand:SI 1 "register_operand" "+&r")
                   1518:                             (const_int 8))
                   1519:                    (match_operand:SI 2 "register_operand" "r"))
                   1520:                  (match_operand:SI 3 "const_int_operand" "rL"))))]
                   1521:   "! TARGET_DISABLE_INDEXING && reload_in_progress"
                   1522:   "*
                   1523: {
                   1524:   if (GET_CODE (operands[3]) == CONST_INT)
                   1525:     return \"sh3add %1,%2,%1\;fldds %3(0,%1),%0\";
                   1526:   else
                   1527:     return \"sh3add %1,%2,%1\;flddx %3(0,%1),%0\";
                   1528: }"
                   1529:   [(set_attr "type" "fpload")
                   1530:    (set_attr "length" "8")])
                   1531: 
                   1532: (define_insn ""
                   1533:   [(set (mem:DF (plus:SI (mult:SI (match_operand:SI 1 "register_operand" "r")
                   1534:                                  (const_int 8))
                   1535:                         (match_operand:SI 2 "register_operand" "r")))
                   1536:        (match_operand:DF 0 "register_operand" "fx"))]
                   1537:   "! TARGET_DISABLE_INDEXING"
                   1538:   "fstdx,s %0,%1(0,%2)"
                   1539:   [(set_attr "type" "fpstore")
                   1540:    (set_attr "length" "4")])
                   1541: 
                   1542: ;; This variant of the above insn can occur if the second operand
                   1543: ;; is the frame pointer.  This is a kludge, but there doesn't
                   1544: ;; seem to be a way around it.  Only recognize it while reloading.
                   1545: ;; Note how operand 3 uses a predicate of "const_int_operand", but 
                   1546: ;; has constraints allowing a register.  I don't know how this works,
                   1547: ;; but it somehow makes sure that out-of-range constants are placed
                   1548: ;; in a register which somehow magically is a "const_int_operand".
                   1549: ;; (this was stolen from alpha.md, I'm not going to try and change it.
                   1550: ;; Ugh. Output is a FP register; so we need to earlyclobber something
                   1551: ;; else as a temporary.
                   1552: (define_insn ""
                   1553:   [(set (mem:DF (plus:SI
                   1554:                  (plus:SI
                   1555:                     (mult:SI (match_operand:SI 1 "register_operand" "+&r")
                   1556:                              (const_int 8))
                   1557:                     (match_operand:SI 2 "register_operand" "r"))
                   1558:                  (match_operand:SI 3 "const_int_operand" "rL")))
                   1559:        (match_operand:DF 0 "register_operand" "fx"))]
                   1560:   "! TARGET_DISABLE_INDEXING && reload_in_progress"
                   1561:   "*
                   1562: {
                   1563:   if (GET_CODE (operands[3]) == CONST_INT)
                   1564:     return \"sh3add %1,%2,%1\;fstds %0,%3(0,%1)\";
                   1565:   else
                   1566:     return \"sh3add %1,%2,%1\;fstdx %0,%3(0,%1)\";
                   1567: }"
                   1568:   [(set_attr "type" "fpstore")
                   1569:    (set_attr "length" "8")])
                   1570: 
                   1571: (define_expand "movdi"
                   1572:   [(set (match_operand:DI 0 "reg_or_nonsymb_mem_operand" "")
                   1573:        (match_operand:DI 1 "general_operand" ""))]
                   1574:   ""
                   1575:   "
                   1576: {
                   1577:   if (emit_move_sequence (operands, DImode, 0))
                   1578:     DONE;
                   1579: }")
                   1580: 
                   1581: (define_expand "reload_indi"
                   1582:   [(set (match_operand:DI 0 "register_operand" "=z")
                   1583:        (match_operand:DI 1 "general_operand" ""))
                   1584:    (clobber (match_operand:SI 2 "register_operand" "=&r"))]
                   1585:   ""
                   1586:   "
                   1587: {
                   1588:   if (emit_move_sequence (operands, DImode, operands[2]))
                   1589:     DONE;
                   1590: 
                   1591:   /* We don't want the clobber emitted, so handle this ourselves.  */
                   1592:   emit_insn (gen_rtx (SET, VOIDmode, operands[0], operands[1]));
                   1593:   DONE;
                   1594: }")
                   1595: 
                   1596: (define_expand "reload_outdi"
                   1597:   [(set (match_operand:DI 0 "general_operand" "")
                   1598:        (match_operand:DI 1 "register_operand" "z"))
                   1599:    (clobber (match_operand:SI 2 "register_operand" "=&r"))]
                   1600:   ""
                   1601:   "
                   1602: {
                   1603:   if (emit_move_sequence (operands, DImode, operands[2]))
                   1604:     DONE;
                   1605: 
                   1606:   /* We don't want the clobber emitted, so handle this ourselves.  */
                   1607:   emit_insn (gen_rtx (SET, VOIDmode, operands[0], operands[1]));
                   1608:   DONE;
                   1609: }")
                   1610: 
                   1611: (define_insn ""
                   1612:   [(set (match_operand:DI 0 "register_operand" "=r")
                   1613:        (high:DI (match_operand 1 "" "")))]
                   1614:   "check_pic (1)"
                   1615:   "*
                   1616: {
                   1617:   rtx op0 = operands[0];
                   1618:   rtx op1 = operands[1];
                   1619: 
                   1620:   if (GET_CODE (op1) == CONST_INT)
                   1621:     {
                   1622:       operands[0] = operand_subword (op0, 1, 0, DImode);
                   1623:       output_asm_insn (\"ldil L'%1,%0\", operands);
                   1624: 
                   1625:       operands[0] = operand_subword (op0, 0, 0, DImode);
                   1626:       if (INTVAL (op1) < 0)
                   1627:        output_asm_insn (\"ldi -1,%0\", operands);
                   1628:       else
                   1629:        output_asm_insn (\"ldi 0,%0\", operands);
                   1630:       return \"\";
                   1631:     }
                   1632:   else if (GET_CODE (op1) == CONST_DOUBLE)
                   1633:     {
                   1634:       operands[0] = operand_subword (op0, 1, 0, DImode);
                   1635:       operands[1] = gen_rtx (CONST_INT, VOIDmode, CONST_DOUBLE_LOW (op1));
                   1636:       output_asm_insn (\"ldil L'%1,%0\", operands);
                   1637: 
                   1638:       operands[0] = operand_subword (op0, 0, 0, DImode);
                   1639:       operands[1] = gen_rtx (CONST_INT, VOIDmode, CONST_DOUBLE_HIGH (op1));
                   1640:       output_asm_insn (singlemove_string (operands), operands);
                   1641:       return \"\";
                   1642:     }
                   1643:   else
                   1644:     abort ();
                   1645: }"
                   1646:   [(set_attr "type" "move")
                   1647:    (set_attr "length" "8")])
                   1648: 
                   1649: ;;; Experimental
                   1650: 
                   1651: (define_insn ""
                   1652:   [(set (match_operand:DI 0 "reg_or_nonsymb_mem_operand"
                   1653:                          "=r,o,Q,&r,&r,&r,x,x,*T")
                   1654:        (match_operand:DI 1 "general_operand"
                   1655:                          "rM,r,r,o,Q,i,xM,*T,x"))]
                   1656:   "register_operand (operands[0], DImode)
                   1657:    || reg_or_0_operand (operands[1], DImode)"
                   1658:   "*
                   1659: {
                   1660:   if (FP_REG_P (operands[0]) || FP_REG_P (operands[1])
                   1661:       || (operands[1] == CONST0_RTX (DImode)))
                   1662:     return output_fp_move_double (operands);
                   1663:   return output_move_double (operands);
                   1664: }"
                   1665:   [(set_attr "type" "move,store,store,load,load,misc,fpalu,fpload,fpstore")
                   1666:    (set_attr "length" "8,8,16,8,16,16,4,4,4")])
                   1667: 
                   1668: (define_insn ""
                   1669:   [(set (match_operand:DI 0 "register_operand" "=r,&r")
                   1670:        (lo_sum:DI (match_operand:DI 1 "register_operand" "0,r")
                   1671:                   (match_operand:DI 2 "immediate_operand" "i,i")))]
                   1672:   ""
                   1673:   "*
                   1674: {
                   1675:   /* Don't output a 64 bit constant, since we can't trust the assembler to
                   1676:      handle it correctly.  */
                   1677:   if (GET_CODE (operands[2]) == CONST_DOUBLE)
                   1678:     operands[2] = gen_rtx (CONST_INT, VOIDmode, CONST_DOUBLE_LOW (operands[2]));
                   1679:   if (which_alternative == 1)
                   1680:     output_asm_insn (\"copy %1,%0\", operands);
                   1681:   return \"ldo R'%G2(%R1),%R0\";
                   1682: }"
                   1683:   ;; Need to set length for this arith insn because operand2
                   1684:   ;; is not an "arith_operand".
                   1685:   [(set_attr "length" "4,8")])
                   1686: 
                   1687: ;; This pattern forces (set (reg:SF ...) (const_double ...))
                   1688: ;; to be reloaded by putting the constant into memory when
                   1689: ;; reg is a floating point register.
                   1690: ;;
                   1691: ;; For integer registers we use ldil;ldo to set the appropriate
                   1692: ;; value.
                   1693: ;;
                   1694: ;; This must come before the movsf pattern, and it must be present
                   1695: ;; to handle obscure reloading cases.
                   1696: (define_insn ""
                   1697:   [(set (match_operand:SF 0 "general_operand" "=?r,fx")
                   1698:        (match_operand:SF 1 "" "?E,m"))]
                   1699:   "GET_CODE (operands[1]) == CONST_DOUBLE
                   1700:    && operands[1] != CONST0_RTX (SFmode)"
                   1701:   "* return (which_alternative == 0 ? singlemove_string (operands)
                   1702:                                    : \" fldws%F1 %1,%0\");"
                   1703:   [(set_attr "type" "move,fpload")
                   1704:    (set_attr "length" "8,4")])
                   1705: 
                   1706: (define_expand "movsf"
                   1707:   [(set (match_operand:SF 0 "general_operand" "")
                   1708:        (match_operand:SF 1 "general_operand" ""))]
                   1709:   ""
                   1710:   "
                   1711: {
                   1712:   if (emit_move_sequence (operands, SFmode, 0))
                   1713:     DONE;
                   1714: }")
                   1715: 
                   1716: (define_insn ""
                   1717:   [(set (match_operand:SF 0 "reg_or_nonsymb_mem_operand"
                   1718:                          "=fx,r,fx,r,Q,Q")
                   1719:        (match_operand:SF 1 "reg_or_0_or_nonsymb_mem_operand"
                   1720:                          "fxG,rG,Q,Q,fx,rG"))]
                   1721:   "register_operand (operands[0], SFmode)
                   1722:    || reg_or_0_operand (operands[1], SFmode)"
                   1723:   "@
                   1724:    fcpy,sgl %r1,%0
                   1725:    copy %r1,%0
                   1726:    fldws%F1 %1,%0
                   1727:    ldw%M1 %1,%0
                   1728:    fstws%F0 %r1,%0
                   1729:    stw%M0 %r1,%0"
                   1730:   [(set_attr "type" "fpalu,move,fpload,load,fpstore,store")
                   1731:    (set_attr "length" "4,4,4,4,4,4")])
                   1732: 
                   1733: (define_insn ""
                   1734:   [(set (match_operand:SF 0 "register_operand" "=fx")
                   1735:        (mem:SF (plus:SI (mult:SI (match_operand:SI 1 "register_operand" "r")
                   1736:                                  (const_int 4))
                   1737:                         (match_operand:SI 2 "register_operand" "r"))))]
                   1738:   "! TARGET_DISABLE_INDEXING"
                   1739:   "fldwx,s %1(0,%2),%0"
                   1740:   [(set_attr "type" "fpload")
                   1741:    (set_attr "length" "4")])
                   1742: 
                   1743: ;; This variant of the above insn can occur if the second operand
                   1744: ;; is the frame pointer.  This is a kludge, but there doesn't
                   1745: ;; seem to be a way around it.  Only recognize it while reloading.
                   1746: ;; Note how operand 3 uses a predicate of "const_int_operand", but 
                   1747: ;; has constraints allowing a register.  I don't know how this works,
                   1748: ;; but it somehow makes sure that out-of-range constants are placed
                   1749: ;; in a register which somehow magically is a "const_int_operand".
                   1750: ;; (this was stolen from alpha.md, I'm not going to try and change it.
                   1751: ;; Ugh. Output is a FP register; so we need to earlyclobber something
                   1752: ;; else as a temporary.
                   1753: (define_insn ""
                   1754:   [(set (match_operand:SF 0 "register_operand" "=fx")
                   1755:        (mem:SF (plus:SI
                   1756:                  (plus:SI
                   1757:                    (mult:SI (match_operand:SI 1 "register_operand" "+&r")
                   1758:                             (const_int 4))
                   1759:                    (match_operand:SI 2 "register_operand" "r"))
                   1760:                  (match_operand:SI 3 "const_int_operand" "rL"))))]
                   1761:   "! TARGET_DISABLE_INDEXING && reload_in_progress"
                   1762:   "*
                   1763: {
                   1764:   if (GET_CODE (operands[3]) == CONST_INT)
                   1765:     return \"sh2add %1,%2,%1\;fldws %3(0,%1),%0\";
                   1766:   else
                   1767:     return \"sh2add %1,%2,%1\;fldwx %3(0,%1),%0\";
                   1768: }"
                   1769:   [(set_attr "type" "fpload")
                   1770:    (set_attr "length" "8")])
                   1771: 
                   1772: (define_insn ""
                   1773:   [(set (mem:SF (plus:SI (mult:SI (match_operand:SI 1 "register_operand" "r")
                   1774:                                  (const_int 4))
                   1775:                         (match_operand:SI 2 "register_operand" "r")))
                   1776:        (match_operand:SF 0 "register_operand" "fx"))]
                   1777:   "! TARGET_DISABLE_INDEXING"
                   1778:   "fstwx,s %0,%1(0,%2)"
                   1779:   [(set_attr "type" "fpstore")
                   1780:    (set_attr "length" "4")])
                   1781: 
                   1782: ;; This variant of the above insn can occur if the second operand
                   1783: ;; is the frame pointer.  This is a kludge, but there doesn't
                   1784: ;; seem to be a way around it.  Only recognize it while reloading.
                   1785: ;; Note how operand 3 uses a predicate of "const_int_operand", but 
                   1786: ;; has constraints allowing a register.  I don't know how this works,
                   1787: ;; but it somehow makes sure that out-of-range constants are placed
                   1788: ;; in a register which somehow magically is a "const_int_operand".
                   1789: ;; (this was stolen from alpha.md, I'm not going to try and change it.
                   1790: ;; Ugh. Output is a FP register; so we need to earlyclobber something
                   1791: ;; else as a temporary.
                   1792: (define_insn ""
                   1793:   [(set (mem:SF (plus:SI
                   1794:                  (plus:SI
                   1795:                     (mult:SI (match_operand:SI 1 "register_operand" "+&r")
                   1796:                              (const_int 4))
                   1797:                     (match_operand:SI 2 "register_operand" "r"))
                   1798:                  (match_operand:SI 3 "const_int_operand" "rL")))
                   1799:        (match_operand:SF 0 "register_operand" "fx"))]
                   1800:   "! TARGET_DISABLE_INDEXING && reload_in_progress"
                   1801:   "*
                   1802: {
                   1803:   if (GET_CODE (operands[3]) == CONST_INT)
                   1804:     return \"sh2add %1,%2,%1\;fstws %0,%3(0,%1)\";
                   1805:   else
                   1806:     return \"sh2add %1,%2,%1\;fstwx %0,%3(0,%1)\";
                   1807: }"
                   1808:   [(set_attr "type" "fpstore")
                   1809:    (set_attr "length" "8")])
                   1810: 
                   1811: ;;- zero extension instructions
                   1812: 
                   1813: (define_insn "zero_extendhisi2"
                   1814:   [(set (match_operand:SI 0 "register_operand" "=r,r")
                   1815:        (zero_extend:SI
                   1816:         (match_operand:HI 1 "reg_or_nonsymb_mem_operand" "r,Q")))]
                   1817:   ""
                   1818:   "@
                   1819:    extru %1,31,16,%0
                   1820:    ldh%M1 %1,%0"
                   1821:   [(set_attr "type" "unary,load")])
                   1822: 
                   1823: (define_insn "zero_extendqihi2"
                   1824:   [(set (match_operand:HI 0 "register_operand" "=r,r")
                   1825:        (zero_extend:HI
                   1826:         (match_operand:QI 1 "reg_or_nonsymb_mem_operand" "r,Q")))]
                   1827:   ""
                   1828:   "@
                   1829:    extru %1,31,8,%0
                   1830:    ldb%M1 %1,%0"
                   1831:   [(set_attr "type" "unary,load")])
                   1832: 
                   1833: (define_insn "zero_extendqisi2"
                   1834:   [(set (match_operand:SI 0 "register_operand" "=r,r")
                   1835:        (zero_extend:SI
                   1836:         (match_operand:QI 1 "reg_or_nonsymb_mem_operand" "r,Q")))]
                   1837:   ""
                   1838:   "@
                   1839:    extru %1,31,8,%0
                   1840:    ldb%M1 %1,%0"
                   1841:   [(set_attr "type" "unary,load")])
                   1842: 
                   1843: ;;- sign extension instructions
                   1844: 
                   1845: (define_insn "extendhisi2"
                   1846:   [(set (match_operand:SI 0 "register_operand" "=r")
                   1847:        (sign_extend:SI (match_operand:HI 1 "register_operand" "r")))]
                   1848:   ""
                   1849:   "extrs %1,31,16,%0"
                   1850:   [(set_attr "type" "unary")])
                   1851: 
                   1852: (define_insn "extendqihi2"
                   1853:   [(set (match_operand:HI 0 "register_operand" "=r")
                   1854:        (sign_extend:HI (match_operand:QI 1 "register_operand" "r")))]
                   1855:   ""
                   1856:   "extrs %1,31,8,%0"
                   1857:   [(set_attr "type" "unary")])
                   1858: 
                   1859: (define_insn "extendqisi2"
                   1860:   [(set (match_operand:SI 0 "register_operand" "=r")
                   1861:        (sign_extend:SI (match_operand:QI 1 "register_operand" "r")))]
                   1862:   ""
                   1863:   "extrs %1,31,8,%0"
                   1864:   [(set_attr "type" "unary")])
                   1865: 
                   1866: ;; Conversions between float and double.
                   1867: 
                   1868: (define_insn "extendsfdf2"
                   1869:   [(set (match_operand:DF 0 "register_operand" "=fx")
                   1870:        (float_extend:DF
                   1871:         (match_operand:SF 1 "register_operand" "fx")))]
                   1872:   ""
                   1873:   "fcnvff,sgl,dbl %1,%0"
                   1874:   [(set_attr "type" "fpalu")])
                   1875: 
                   1876: (define_insn "truncdfsf2"
                   1877:   [(set (match_operand:SF 0 "register_operand" "=fx")
                   1878:        (float_truncate:SF
                   1879:         (match_operand:DF 1 "register_operand" "fx")))]
                   1880:   ""
                   1881:   "fcnvff,dbl,sgl %1,%0"
                   1882:   [(set_attr "type" "fpalu")])
                   1883: 
                   1884: ;; Conversion between fixed point and floating point.
                   1885: ;; Note that among the fix-to-float insns
                   1886: ;; the ones that start with SImode come first.
                   1887: ;; That is so that an operand that is a CONST_INT
                   1888: ;; (and therefore lacks a specific machine mode).
                   1889: ;; will be recognized as SImode (which is always valid)
                   1890: ;; rather than as QImode or HImode.
                   1891: 
                   1892: ;; This pattern forces (set (reg:SF ...) (float:SF (const_int ...)))
                   1893: ;; to be reloaded by putting the constant into memory.
                   1894: ;; It must come before the more general floatsisf2 pattern.
                   1895: (define_insn ""
                   1896:   [(set (match_operand:SF 0 "general_operand" "=fx")
                   1897:        (float:SF (match_operand:SI 1 "const_int_operand" "m")))]
                   1898:   ""
                   1899:   "fldws %1,%0\;fcnvxf,sgl,sgl %0,%0"
                   1900:   [(set_attr "type" "fpalu")
                   1901:    (set_attr "length" "8")])
                   1902: 
                   1903: (define_insn "floatsisf2"
                   1904:   [(set (match_operand:SF 0 "general_operand" "=fx")
                   1905:        (float:SF (match_operand:SI 1 "register_operand" "fx")))]
                   1906:   ""
                   1907:   "fcnvxf,sgl,sgl %1,%0"
                   1908:   [(set_attr "type" "fpalu")])
                   1909: 
                   1910: ;; This pattern forces (set (reg:DF ...) (float:DF (const_int ...)))
                   1911: ;; to be reloaded by putting the constant into memory.
                   1912: ;; It must come before the more general floatsidf2 pattern.
                   1913: (define_insn ""
                   1914:   [(set (match_operand:DF 0 "general_operand" "=fx")
                   1915:        (float:DF (match_operand:SI 1 "const_int_operand" "m")))]
                   1916:   ""
                   1917:   "fldws %1,%0\;fcnvxf,sgl,dbl %0,%0"
                   1918:   [(set_attr "type" "fpalu")
                   1919:    (set_attr "length" "8")])
                   1920: 
                   1921: (define_insn "floatsidf2"
                   1922:   [(set (match_operand:DF 0 "general_operand" "=fx")
                   1923:        (float:DF (match_operand:SI 1 "register_operand" "fx")))]
                   1924:   ""
                   1925:   "fcnvxf,sgl,dbl %1,%0"
                   1926:   [(set_attr "type" "fpalu")])
                   1927: 
                   1928: (define_expand "floatunssisf2"
                   1929:   [(set (subreg:SI (match_dup 2) 1)
                   1930:        (match_operand:SI 1 "register_operand" ""))
                   1931:    (set (subreg:SI (match_dup 2) 0)
                   1932:        (const_int 0))
                   1933:    (set (match_operand:SF 0 "general_operand" "")
                   1934:        (float:SF (match_dup 2)))]
                   1935:   "TARGET_SNAKE"
                   1936:   "operands[2] = gen_reg_rtx (DImode);")
                   1937: 
                   1938: (define_expand "floatunssidf2"
                   1939:   [(set (subreg:SI (match_dup 2) 1)
                   1940:        (match_operand:SI 1 "register_operand" ""))
                   1941:    (set (subreg:SI (match_dup 2) 0)
                   1942:        (const_int 0))
                   1943:    (set (match_operand:DF 0 "general_operand" "")
                   1944:        (float:DF (match_dup 2)))]
                   1945:   "TARGET_SNAKE"
                   1946:   "operands[2] = gen_reg_rtx (DImode);")
                   1947: 
                   1948: (define_insn "floatdisf2"
                   1949:   [(set (match_operand:SF 0 "general_operand" "=x")
                   1950:        (float:SF (match_operand:DI 1 "register_operand" "x")))]
                   1951:   "TARGET_SNAKE"
                   1952:   "fcnvxf,dbl,sgl %1,%0"
                   1953:   [(set_attr "type" "fpalu")])
                   1954: 
                   1955: (define_insn "floatdidf2"
                   1956:   [(set (match_operand:DF 0 "general_operand" "=x")
                   1957:        (float:DF (match_operand:DI 1 "register_operand" "x")))]
                   1958:   "TARGET_SNAKE"
                   1959:   "fcnvxf,dbl,dbl %1,%0"
                   1960:   [(set_attr "type" "fpalu")])
                   1961: 
                   1962: ;; Convert a float to an actual integer.
                   1963: ;; Truncation is performed as part of the conversion.
                   1964: 
                   1965: (define_insn "fix_truncsfsi2"
                   1966:   [(set (match_operand:SI 0 "register_operand" "=fx")
                   1967:        (fix:SI (fix:SF (match_operand:SF 1 "register_operand" "fx"))))]
                   1968:   ""
                   1969:   "fcnvfxt,sgl,sgl %1,%0"
                   1970:   [(set_attr "type" "fpalu")])
                   1971: 
                   1972: (define_insn "fix_truncdfsi2"
                   1973:   [(set (match_operand:SI 0 "register_operand" "=fx")
                   1974:        (fix:SI (fix:DF (match_operand:DF 1 "register_operand" "fx"))))]
                   1975:   ""
                   1976:   "fcnvfxt,dbl,sgl %1,%0"
                   1977:   [(set_attr "type" "fpalu")])
                   1978: 
                   1979: (define_insn "fix_truncsfdi2"
                   1980:   [(set (match_operand:DI 0 "register_operand" "=x")
                   1981:        (fix:DI (fix:SF (match_operand:SF 1 "register_operand" "x"))))]
                   1982:   "TARGET_SNAKE"
                   1983:   "fcnvfxt,sgl,dbl %1,%0"
                   1984:   [(set_attr "type" "fpalu")])
                   1985: 
                   1986: (define_insn "fix_truncdfdi2"
                   1987:   [(set (match_operand:DI 0 "register_operand" "=x")
                   1988:        (fix:DI (fix:DF (match_operand:DF 1 "register_operand" "x"))))]
                   1989:   "TARGET_SNAKE"
                   1990:   "fcnvfxt,dbl,dbl %1,%0"
                   1991:   [(set_attr "type" "fpalu")])
                   1992: 
                   1993: ;;- arithmetic instructions
                   1994: 
                   1995: (define_insn "adddi3"
                   1996:   [(set (match_operand:DI 0 "register_operand" "=r")
                   1997:        (plus:DI (match_operand:DI 1 "register_operand" "%r")
                   1998:                 (match_operand:DI 2 "arith11_operand" "rI")))]
                   1999:   ""
                   2000:   "*
                   2001: {
                   2002:   if (GET_CODE (operands[2]) == CONST_INT)
                   2003:     {
                   2004:       if (INTVAL (operands[2]) >= 0)
                   2005:        return \"addi %2,%R1,%R0\;addc %1,0,%0\";
                   2006:       else
                   2007:        return \"addi %2,%R1,%R0\;subb %1,0,%0\";
                   2008:     }
                   2009:   else
                   2010:     return \"add %R2,%R1,%R0\;addc %2,%1,%0\";
                   2011: }"
                   2012:   [(set_attr "length" "8")])
                   2013: 
                   2014: (define_insn ""
                   2015:   [(set (match_operand:SI 0 "register_operand" "=r")
                   2016:        (plus:SI (not:SI (match_operand:SI 1 "register_operand" "r"))
                   2017:                 (match_operand:SI 2 "register_operand" "r")))]
                   2018:   ""
                   2019:   "uaddcm %2,%1,%0")
                   2020: 
                   2021: ;; define_splits to optimize cases of adding a constant integer
                   2022: ;; to a register when the constant does not fit in 14 bits.  */
                   2023: (define_split
                   2024:   [(set (match_operand:SI 0 "register_operand" "")
                   2025:        (plus:SI (match_operand:SI 1 "register_operand" "")
                   2026:                 (match_operand:SI 2 "const_int_operand" "")))
                   2027:    (clobber (match_operand:SI 4 "register_operand" ""))]
                   2028:   "! cint_ok_for_move (INTVAL (operands[2]))
                   2029:    && VAL_14_BITS_P (INTVAL (operands[2]) >> 1)"
                   2030:   [(set (match_dup 4) (plus:SI (match_dup 1) (match_dup 2)))
                   2031:    (set (match_dup 0) (plus:SI (match_dup 4) (match_dup 3)))]
                   2032:   "
                   2033: {
                   2034:   int val = INTVAL (operands[2]);
                   2035:   int low = (val < 0) ? -0x2000 : 0x1fff;
                   2036:   int rest = val - low;
                   2037: 
                   2038:   operands[2] = GEN_INT (rest);
                   2039:   operands[3] = GEN_INT (low);
                   2040: }")
                   2041: 
                   2042: (define_split
                   2043:   [(set (match_operand:SI 0 "register_operand" "")
                   2044:        (plus:SI (match_operand:SI 1 "register_operand" "")
                   2045:                 (match_operand:SI 2 "const_int_operand" "")))
                   2046:    (clobber (match_operand:SI 4 "register_operand" ""))]
                   2047:   "! cint_ok_for_move (INTVAL (operands[2]))"
                   2048:   [(set (match_dup 4) (match_dup 2))
                   2049:    (set (match_dup 0) (plus:SI (mult:SI (match_dup 4) (match_dup 3))
                   2050:                               (match_dup 1)))]
                   2051:   "
                   2052: {
                   2053:   int intval = INTVAL (operands[2]);
                   2054: 
                   2055:   /* Try diving the constant by 2, then 4, and finally 8 to see
                   2056:      if we can get a constant which can be loaded into a register
                   2057:      in a single instruction (cint_ok_for_move).  */
                   2058:   if (intval % 2 == 0 && cint_ok_for_move (intval / 2))
                   2059:     {
                   2060:       operands[2] = GEN_INT (INTVAL (operands[2]) / 2);
                   2061:       operands[3] = GEN_INT (2);
                   2062:     }
                   2063:   else if (intval % 4 == 0 && cint_ok_for_move (intval / 4))
                   2064:     {
                   2065:       operands[2] = GEN_INT (INTVAL (operands[2]) / 4);
                   2066:       operands[3] = GEN_INT (4);
                   2067:     }
                   2068:   else if (intval % 8 == 0 && cint_ok_for_move (intval / 8))
                   2069:     {
                   2070:       operands[2] = GEN_INT (INTVAL (operands[2]) / 8);
                   2071:       operands[3] = GEN_INT (8);
                   2072:     }
                   2073:   else
                   2074:     FAIL;
                   2075: }")
                   2076: 
                   2077: (define_insn "addsi3"
                   2078:   [(set (match_operand:SI 0 "register_operand" "=r,r")
                   2079:        (plus:SI (match_operand:SI 1 "register_operand" "%r,r")
                   2080:                 (match_operand:SI 2 "arith_operand" "r,J")))]
                   2081:   ""
                   2082:   "@
                   2083:    add %1,%2,%0
                   2084:    ldo %2(%1),%0")
                   2085: 
                   2086: (define_insn "subdi3"
                   2087:   [(set (match_operand:DI 0 "register_operand" "=r")
                   2088:        (minus:DI (match_operand:DI 1 "register_operand" "r")
                   2089:                  (match_operand:DI 2 "register_operand" "r")))]
                   2090:   ""
                   2091:   "sub %R1,%R2,%R0\;subb %1,%2,%0"
                   2092:   [(set_attr "length" "8")])
                   2093: 
                   2094: (define_insn "subsi3"
                   2095:   [(set (match_operand:SI 0 "register_operand" "=r,r")
                   2096:        (minus:SI (match_operand:SI 1 "arith11_operand" "r,I")
                   2097:                  (match_operand:SI 2 "register_operand" "r,r")))]
                   2098:   ""
                   2099:   "@
                   2100:    sub %1,%2,%0
                   2101:    subi %1,%2,%0")
                   2102: 
                   2103: ;; Clobbering a "register_operand" instead of a match_scratch
                   2104: ;; in operand3 of millicode calls avoids spilling %r1 and
                   2105: ;; produces better code.
                   2106: 
                   2107: ;; The mulsi3 insns set up registers for the millicode call.
                   2108: (define_expand "mulsi3"
                   2109:   [(set (reg:SI 26) (match_operand:SI 1 "move_operand" ""))
                   2110:    (set (reg:SI 25) (match_operand:SI 2 "move_operand" ""))
                   2111:    (parallel [(set (reg:SI 29) (mult:SI (reg:SI 26) (reg:SI 25)))
                   2112:              (clobber (match_operand:SI 3 "register_operand" ""))
                   2113:              (clobber (reg:SI 26))
                   2114:              (clobber (reg:SI 25))
                   2115:              (clobber (reg:SI 31))])
                   2116:    (set (match_operand:SI 0 "general_operand" "") (reg:SI 29))]
                   2117:   ""
                   2118:   "
                   2119: {
                   2120:   if (TARGET_SNAKE && ! TARGET_DISABLE_FPREGS)
                   2121:     {
                   2122:       rtx scratch = gen_reg_rtx (DImode);
                   2123:       operands[1] = force_reg (SImode, operands[1]);
                   2124:       operands[2] = force_reg (SImode, operands[2]);
                   2125:       emit_insn (gen_umulsidi3 (scratch, operands[1], operands[2]));
                   2126:       emit_insn (gen_rtx (SET, VOIDmode,
                   2127:                          operands[0],
                   2128:                          gen_rtx (SUBREG, SImode, scratch, 1)));
                   2129:       DONE;
                   2130:     }
                   2131:   operands[3] = gen_reg_rtx(SImode);
                   2132: }")
                   2133: 
                   2134: (define_insn "umulsidi3"
                   2135:   [(set (match_operand:DI 0 "nonimmediate_operand" "=x")
                   2136:        (mult:DI (zero_extend:DI (match_operand:SI 1 "nonimmediate_operand" "x"))
                   2137:                 (zero_extend:DI (match_operand:SI 2 "nonimmediate_operand" "x"))))]
                   2138:   "TARGET_SNAKE && ! TARGET_DISABLE_FPREGS"
                   2139:   "xmpyu %1,%2,%0"
                   2140:   [(set_attr "type" "fpmul")])
                   2141: 
                   2142: (define_insn ""
                   2143:   [(set (match_operand:DI 0 "nonimmediate_operand" "=x")
                   2144:        (mult:DI (zero_extend:DI (match_operand:SI 1 "nonimmediate_operand" "x"))
                   2145:                 (match_operand:DI 2 "uint32_operand" "x")))]
                   2146:   "TARGET_SNAKE && ! TARGET_DISABLE_FPREGS"
                   2147:   "xmpyu %1,%R2,%0"
                   2148:   [(set_attr "type" "fpmul")])
                   2149: 
                   2150: (define_insn ""
                   2151:   [(set (reg:SI 29) (mult:SI (reg:SI 26) (reg:SI 25)))
                   2152:    (clobber (match_operand:SI 0 "register_operand" "=a"))
                   2153:    (clobber (reg:SI 26))
                   2154:    (clobber (reg:SI 25))
                   2155:    (clobber (reg:SI 31))]
                   2156:   ""
                   2157:   "* return output_mul_insn (0, insn);"
                   2158:   [(set_attr "type" "milli")])
                   2159: 
                   2160: ;;; Division and mod.
                   2161: (define_expand "divsi3"
                   2162:   [(set (reg:SI 26) (match_operand:SI 1 "move_operand" ""))
                   2163:    (set (reg:SI 25) (match_operand:SI 2 "move_operand" ""))
                   2164:    (parallel [(set (reg:SI 29) (div:SI (reg:SI 26) (reg:SI 25)))
                   2165:              (clobber (match_operand:SI 3 "register_operand" ""))
                   2166:              (clobber (reg:SI 26))
                   2167:              (clobber (reg:SI 25))
                   2168:              (clobber (reg:SI 31))])
                   2169:    (set (match_operand:SI 0 "general_operand" "") (reg:SI 29))]
                   2170:   ""
                   2171:   "
                   2172: {
                   2173:   operands[3] = gen_reg_rtx(SImode);
                   2174:   if (!(GET_CODE (operands[2]) == CONST_INT && emit_hpdiv_const(operands, 0)))
                   2175:     {
                   2176:       emit_move_insn (gen_rtx (REG, SImode, 26), operands[1]);
                   2177:       emit_move_insn (gen_rtx (REG, SImode, 25), operands[2]);
                   2178:       emit
                   2179:        (gen_rtx
                   2180:         (PARALLEL, VOIDmode,
                   2181:          gen_rtvec (5, gen_rtx (SET, VOIDmode, gen_rtx (REG, SImode, 29),
                   2182:                                 gen_rtx (DIV, SImode,
                   2183:                                          gen_rtx (REG, SImode, 26),
                   2184:                                          gen_rtx (REG, SImode, 25))),
                   2185:                     gen_rtx (CLOBBER, VOIDmode, operands[3]),
                   2186:                     gen_rtx (CLOBBER, VOIDmode, gen_rtx (REG, SImode, 26)),
                   2187:                     gen_rtx (CLOBBER, VOIDmode, gen_rtx (REG, SImode, 25)),
                   2188:                     gen_rtx (CLOBBER, VOIDmode, gen_rtx (REG, SImode, 31)))));
                   2189:       emit_move_insn (operands[0], gen_rtx (REG, SImode, 29));
                   2190:     }
                   2191:   DONE;
                   2192: }")
                   2193: 
                   2194: (define_insn ""
                   2195:   [(set (reg:SI 29)
                   2196:     (div:SI (reg:SI 26) (match_operand:SI 0 "div_operand" "")))
                   2197:    (clobber (match_operand:SI 1 "register_operand" "=a"))
                   2198:    (clobber (reg:SI 26))
                   2199:    (clobber (reg:SI 25))
                   2200:    (clobber (reg:SI 31))]
                   2201:   ""
                   2202:   "*
                   2203:    return output_div_insn (operands, 0, insn);"
                   2204:   [(set_attr "type" "milli")])
                   2205: 
                   2206: (define_expand "udivsi3"
                   2207:   [(set (reg:SI 26) (match_operand:SI 1 "move_operand" ""))
                   2208:    (set (reg:SI 25) (match_operand:SI 2 "move_operand" ""))
                   2209:    (parallel [(set (reg:SI 29) (udiv:SI (reg:SI 26) (reg:SI 25)))
                   2210:              (clobber (match_operand:SI 3 "register_operand" ""))
                   2211:              (clobber (reg:SI 26))
                   2212:              (clobber (reg:SI 25))
                   2213:              (clobber (reg:SI 31))])
                   2214:    (set (match_operand:SI 0 "general_operand" "") (reg:SI 29))]
                   2215:   ""
                   2216:   "
                   2217: {
                   2218:   operands[3] = gen_reg_rtx(SImode);
                   2219:   if (!(GET_CODE (operands[2]) == CONST_INT && emit_hpdiv_const(operands, 1)))
                   2220:     {
                   2221:       emit_move_insn (gen_rtx (REG, SImode, 26), operands[1]);
                   2222:       emit_move_insn (gen_rtx (REG, SImode, 25), operands[2]);
                   2223:       emit
                   2224:        (gen_rtx
                   2225:         (PARALLEL, VOIDmode,
                   2226:          gen_rtvec (5, gen_rtx (SET, VOIDmode, gen_rtx (REG, SImode, 29),
                   2227:                                 gen_rtx (UDIV, SImode,
                   2228:                                          gen_rtx (REG, SImode, 26),
                   2229:                                          gen_rtx (REG, SImode, 25))),
                   2230:                     gen_rtx (CLOBBER, VOIDmode, operands[3]),
                   2231:                     gen_rtx (CLOBBER, VOIDmode, gen_rtx (REG, SImode, 26)),
                   2232:                     gen_rtx (CLOBBER, VOIDmode, gen_rtx (REG, SImode, 25)),
                   2233:                     gen_rtx (CLOBBER, VOIDmode, gen_rtx (REG, SImode, 31)))));
                   2234:       emit_move_insn (operands[0], gen_rtx (REG, SImode, 29));
                   2235:     }
                   2236:   DONE;
                   2237: }")
                   2238: 
                   2239: (define_insn ""
                   2240:   [(set (reg:SI 29)
                   2241:     (udiv:SI (reg:SI 26) (match_operand:SI 0 "div_operand" "")))
                   2242:    (clobber (match_operand:SI 1 "register_operand" "=a"))
                   2243:    (clobber (reg:SI 26))
                   2244:    (clobber (reg:SI 25))
                   2245:    (clobber (reg:SI 31))]
                   2246:   ""
                   2247:   "*
                   2248:    return output_div_insn (operands, 1, insn);"
                   2249:   [(set_attr "type" "milli")])
                   2250: 
                   2251: (define_expand "modsi3"
                   2252:   [(set (reg:SI 26) (match_operand:SI 1 "move_operand" ""))
                   2253:    (set (reg:SI 25) (match_operand:SI 2 "move_operand" ""))
                   2254:    (parallel [(set (reg:SI 29) (mod:SI (reg:SI 26) (reg:SI 25)))
                   2255:              (clobber (match_operand:SI 3 "register_operand" ""))
                   2256:              (clobber (reg:SI 26))
                   2257:              (clobber (reg:SI 25))
                   2258:              (clobber (reg:SI 31))])
                   2259:    (set (match_operand:SI 0 "general_operand" "") (reg:SI 29))]
                   2260:   ""
                   2261:   "
                   2262: {
                   2263:   operands[3] = gen_reg_rtx(SImode);
                   2264:   emit_move_insn (gen_rtx (REG, SImode, 26), operands[1]);
                   2265:   emit_move_insn (gen_rtx (REG, SImode, 25), operands[2]);
                   2266:   emit
                   2267:     (gen_rtx
                   2268:      (PARALLEL, VOIDmode,
                   2269:       gen_rtvec (5, gen_rtx (SET, VOIDmode, gen_rtx (REG, SImode, 29),
                   2270:                             gen_rtx (MOD, SImode,
                   2271:                                      gen_rtx (REG, SImode, 26),
                   2272:                                      gen_rtx (REG, SImode, 25))),
                   2273:                 gen_rtx (CLOBBER, VOIDmode, operands[3]),
                   2274:                 gen_rtx (CLOBBER, VOIDmode, gen_rtx (REG, SImode, 26)),
                   2275:                 gen_rtx (CLOBBER, VOIDmode, gen_rtx (REG, SImode, 25)),
                   2276:                 gen_rtx (CLOBBER, VOIDmode, gen_rtx (REG, SImode, 31)))));
                   2277:   emit_move_insn (operands[0], gen_rtx (REG, SImode, 29));
                   2278:   DONE;
                   2279: }")
                   2280: 
                   2281: (define_insn ""
                   2282:   [(set (reg:SI 29) (mod:SI (reg:SI 26) (reg:SI 25)))
                   2283:    (clobber (match_operand:SI 0 "register_operand" "=a"))
                   2284:    (clobber (reg:SI 26))
                   2285:    (clobber (reg:SI 25))
                   2286:    (clobber (reg:SI 31))]
                   2287:   ""
                   2288:   "*
                   2289:   return output_mod_insn (0, insn);"
                   2290:   [(set_attr "type" "milli")])
                   2291: 
                   2292: (define_expand "umodsi3"
                   2293:   [(set (reg:SI 26) (match_operand:SI 1 "move_operand" ""))
                   2294:    (set (reg:SI 25) (match_operand:SI 2 "move_operand" ""))
                   2295:    (parallel [(set (reg:SI 29) (umod:SI (reg:SI 26) (reg:SI 25)))
                   2296:              (clobber (match_operand:SI 3 "register_operand" ""))
                   2297:              (clobber (reg:SI 26))
                   2298:              (clobber (reg:SI 25))
                   2299:              (clobber (reg:SI 31))])
                   2300:    (set (match_operand:SI 0 "general_operand" "") (reg:SI 29))]
                   2301:   ""
                   2302:   "
                   2303: {
                   2304:   operands[3] = gen_reg_rtx(SImode);
                   2305:   emit_move_insn (gen_rtx (REG, SImode, 26), operands[1]);
                   2306:   emit_move_insn (gen_rtx (REG, SImode, 25), operands[2]);
                   2307:   emit
                   2308:     (gen_rtx
                   2309:      (PARALLEL, VOIDmode,
                   2310:       gen_rtvec (5, gen_rtx (SET, VOIDmode, gen_rtx (REG, SImode, 29),
                   2311:                             gen_rtx (UMOD, SImode,
                   2312:                                      gen_rtx (REG, SImode, 26),
                   2313:                                      gen_rtx (REG, SImode, 25))),
                   2314:                 gen_rtx (CLOBBER, VOIDmode, operands[3]),
                   2315:                 gen_rtx (CLOBBER, VOIDmode, gen_rtx (REG, SImode, 26)),
                   2316:                 gen_rtx (CLOBBER, VOIDmode, gen_rtx (REG, SImode, 25)),
                   2317:                 gen_rtx (CLOBBER, VOIDmode, gen_rtx (REG, SImode, 31)))));
                   2318:   emit_move_insn (operands[0], gen_rtx (REG, SImode, 29));
                   2319:   DONE;
                   2320: }")
                   2321: 
                   2322: (define_insn ""
                   2323:   [(set (reg:SI 29) (umod:SI (reg:SI 26) (reg:SI 25)))
                   2324:    (clobber (match_operand:SI 0 "register_operand" "=a"))
                   2325:    (clobber (reg:SI 26))
                   2326:    (clobber (reg:SI 25))
                   2327:    (clobber (reg:SI 31))]
                   2328:   ""
                   2329:   "*
                   2330:   return output_mod_insn (1, insn);"
                   2331:   [(set_attr "type" "milli")])
                   2332: 
                   2333: ;;- and instructions
                   2334: ;; We define DImode `and` so with DImode `not` we can get
                   2335: ;; DImode `andn`.  Other combinations are possible.
                   2336: 
                   2337: (define_expand "anddi3"
                   2338:   [(set (match_operand:DI 0 "register_operand" "")
                   2339:        (and:DI (match_operand:DI 1 "arith_double_operand" "")
                   2340:                (match_operand:DI 2 "arith_double_operand" "")))]
                   2341:   ""
                   2342:   "
                   2343: {
                   2344:   if (! register_operand (operands[1], DImode)
                   2345:       || ! register_operand (operands[2], DImode))
                   2346:     /* Let GCC break this into word-at-a-time operations.  */
                   2347:     FAIL;
                   2348: }")
                   2349: 
                   2350: (define_insn ""
                   2351:   [(set (match_operand:DI 0 "register_operand" "=r")
                   2352:        (and:DI (match_operand:DI 1 "register_operand" "%r")
                   2353:                (match_operand:DI 2 "register_operand" "r")))]
                   2354:   ""
                   2355:   "and %1,%2,%0\;and %R1,%R2,%R0"
                   2356:   [(set_attr "length" "8")])
                   2357: 
                   2358: ; The ? for op1 makes reload prefer zdepi instead of loading a huge
                   2359: ; constant with ldil;ldo.
                   2360: (define_insn "andsi3"
                   2361:   [(set (match_operand:SI 0 "register_operand" "=r,r")
                   2362:        (and:SI (match_operand:SI 1 "register_operand" "%?r,0")
                   2363:                (match_operand:SI 2 "and_operand" "rO,P")))]
                   2364:   ""
                   2365:   "* return output_and (operands); "
                   2366:   [(set_attr "type" "binary")
                   2367:    (set_attr "length" "4")])
                   2368: 
                   2369: (define_insn ""
                   2370:   [(set (match_operand:DI 0 "register_operand" "=r")
                   2371:        (and:DI (not:DI (match_operand:DI 1 "register_operand" "r"))
                   2372:                (match_operand:DI 2 "register_operand" "r")))]
                   2373:   ""
                   2374:   "andcm %2,%1,%0\;andcm %R2,%R1,%R0"
                   2375:   [(set_attr "length" "8")])
                   2376: 
                   2377: (define_insn ""
                   2378:   [(set (match_operand:SI 0 "register_operand" "=r")
                   2379:        (and:SI (not:SI (match_operand:SI 1 "register_operand" "r"))
                   2380:                (match_operand:SI 2 "register_operand" "r")))]
                   2381:   ""
                   2382:   "andcm %2,%1,%0")
                   2383: 
                   2384: (define_expand "iordi3"
                   2385:   [(set (match_operand:DI 0 "register_operand" "")
                   2386:        (ior:DI (match_operand:DI 1 "arith_double_operand" "")
                   2387:                (match_operand:DI 2 "arith_double_operand" "")))]
                   2388:   ""
                   2389:   "
                   2390: {
                   2391:   if (! register_operand (operands[1], DImode)
                   2392:       || ! register_operand (operands[2], DImode))
                   2393:     /* Let GCC break this into word-at-a-time operations.  */
                   2394:     FAIL;
                   2395: }")
                   2396: 
                   2397: (define_insn ""
                   2398:   [(set (match_operand:DI 0 "register_operand" "=r")
                   2399:        (ior:DI (match_operand:DI 1 "register_operand" "%r")
                   2400:                (match_operand:DI 2 "register_operand" "r")))]
                   2401:   ""
                   2402:   "or %1,%2,%0\;or %R1,%R2,%R0"
                   2403:   [(set_attr "length" "8")])
                   2404: 
                   2405: ;; Need a define_expand because we've run out of CONST_OK... characters.
                   2406: (define_expand "iorsi3"
                   2407:   [(set (match_operand:SI 0 "register_operand" "")
                   2408:        (ior:SI (match_operand:SI 1 "register_operand" "")
                   2409:                (match_operand:SI 2 "arith32_operand" "")))]
                   2410:   ""
                   2411:   "
                   2412: {
                   2413:   if (! (ior_operand (operands[2]) || register_operand (operands[2])))
                   2414:     operands[2] = force_reg (SImode, operands[2]);
                   2415: }")
                   2416: 
                   2417: (define_insn ""
                   2418:   [(set (match_operand:SI 0 "register_operand" "=r")
                   2419:        (ior:SI (match_operand:SI 1 "register_operand" "0")
                   2420:                (match_operand:SI 2 "ior_operand" "")))]
                   2421:   ""
                   2422:   "* return output_ior (operands); "
                   2423:   [(set_attr "type" "binary")
                   2424:    (set_attr "length" "4")])
                   2425: 
                   2426: (define_insn ""
                   2427:   [(set (match_operand:SI 0 "register_operand" "=r")
                   2428:        (ior:SI (match_operand:SI 1 "register_operand" "%r")
                   2429:                (match_operand:SI 2 "register_operand" "r")))]
                   2430:   ""
                   2431:   "or %1,%2,%0")
                   2432: 
                   2433: (define_expand "xordi3"
                   2434:   [(set (match_operand:DI 0 "register_operand" "")
                   2435:        (xor:DI (match_operand:DI 1 "arith_double_operand" "")
                   2436:                (match_operand:DI 2 "arith_double_operand" "")))]
                   2437:   ""
                   2438:   "
                   2439: {
                   2440:   if (! register_operand (operands[1], DImode)
                   2441:       || ! register_operand (operands[2], DImode))
                   2442:     /* Let GCC break this into word-at-a-time operations.  */
                   2443:     FAIL;
                   2444: }")
                   2445: 
                   2446: (define_insn ""
                   2447:   [(set (match_operand:DI 0 "register_operand" "=r")
                   2448:        (xor:DI (match_operand:DI 1 "register_operand" "%r")
                   2449:                (match_operand:DI 2 "register_operand" "r")))]
                   2450:   ""
                   2451:   "xor %1,%2,%0\;xor %R1,%R2,%R0"
                   2452:   [(set_attr "length" "8")])
                   2453: 
                   2454: (define_insn "xorsi3"
                   2455:   [(set (match_operand:SI 0 "register_operand" "=r")
                   2456:        (xor:SI (match_operand:SI 1 "register_operand" "%r")
                   2457:                (match_operand:SI 2 "register_operand" "r")))]
                   2458:   ""
                   2459:   "xor %1,%2,%0")
                   2460: 
                   2461: (define_insn "negdi2"
                   2462:   [(set (match_operand:DI 0 "register_operand" "=r")
                   2463:        (neg:DI (match_operand:DI 1 "register_operand" "r")))]
                   2464:   ""
                   2465:   "sub 0,%R1,%R0\;subb 0,%1,%0"
                   2466:   [(set_attr "type" "unary")
                   2467:    (set_attr "length" "8")])
                   2468: 
                   2469: (define_insn "negsi2"
                   2470:   [(set (match_operand:SI 0 "register_operand" "=r")
                   2471:        (neg:SI (match_operand:SI 1 "register_operand" "r")))]
                   2472:   ""
                   2473:   "sub 0,%1,%0"
                   2474:   [(set_attr "type" "unary")])
                   2475: 
                   2476: (define_expand "one_cmpldi2"
                   2477:   [(set (match_operand:DI 0 "register_operand" "")
                   2478:        (not:DI (match_operand:DI 1 "arith_double_operand" "")))]
                   2479:   ""
                   2480:   "
                   2481: {
                   2482:   if (! register_operand (operands[1], DImode))
                   2483:     FAIL;
                   2484: }")
                   2485: 
                   2486: (define_insn ""
                   2487:   [(set (match_operand:DI 0 "register_operand" "=r")
                   2488:        (not:DI (match_operand:DI 1 "register_operand" "r")))]
                   2489:   ""
                   2490:   "uaddcm 0,%1,%0\;uaddcm 0,%R1,%R0"
                   2491:   [(set_attr "type" "unary")
                   2492:    (set_attr "length" "8")])
                   2493: 
                   2494: (define_insn "one_cmplsi2"
                   2495:   [(set (match_operand:SI 0 "register_operand" "=r")
                   2496:        (not:SI (match_operand:SI 1 "register_operand" "r")))]
                   2497:   ""
                   2498:   "uaddcm 0,%1,%0"
                   2499:   [(set_attr "type" "unary")])
                   2500: 
                   2501: ;; Floating point arithmetic instructions.
                   2502: 
                   2503: (define_insn "adddf3"
                   2504:   [(set (match_operand:DF 0 "register_operand" "=fx")
                   2505:        (plus:DF (match_operand:DF 1 "register_operand" "fx")
                   2506:                 (match_operand:DF 2 "register_operand" "fx")))]
                   2507:   ""
                   2508:   "fadd,dbl %1,%2,%0"
                   2509:   [(set_attr "type" "fpalu")])
                   2510: 
                   2511: (define_insn "addsf3"
                   2512:   [(set (match_operand:SF 0 "register_operand" "=fx")
                   2513:        (plus:SF (match_operand:SF 1 "register_operand" "fx")
                   2514:                 (match_operand:SF 2 "register_operand" "fx")))]
                   2515:   ""
                   2516:   "fadd,sgl %1,%2,%0"
                   2517:   [(set_attr "type" "fpalu")])
                   2518: 
                   2519: (define_insn "subdf3"
                   2520:   [(set (match_operand:DF 0 "register_operand" "=fx")
                   2521:        (minus:DF (match_operand:DF 1 "register_operand" "fx")
                   2522:                  (match_operand:DF 2 "register_operand" "fx")))]
                   2523:   ""
                   2524:   "fsub,dbl %1,%2,%0"
                   2525:   [(set_attr "type" "fpalu")])
                   2526: 
                   2527: (define_insn "subsf3"
                   2528:   [(set (match_operand:SF 0 "register_operand" "=fx")
                   2529:        (minus:SF (match_operand:SF 1 "register_operand" "fx")
                   2530:                  (match_operand:SF 2 "register_operand" "fx")))]
                   2531:   ""
                   2532:   "fsub,sgl %1,%2,%0"
                   2533:   [(set_attr "type" "fpalu")])
                   2534: 
                   2535: (define_insn "muldf3"
                   2536:   [(set (match_operand:DF 0 "register_operand" "=fx")
                   2537:        (mult:DF (match_operand:DF 1 "register_operand" "fx")
                   2538:                 (match_operand:DF 2 "register_operand" "fx")))]
                   2539:   ""
                   2540:   "fmpy,dbl %1,%2,%0"
                   2541:   [(set_attr "type" "fpmul")])
                   2542: 
                   2543: (define_insn "mulsf3"
                   2544:   [(set (match_operand:SF 0 "register_operand" "=fx")
                   2545:        (mult:SF (match_operand:SF 1 "register_operand" "fx")
                   2546:                 (match_operand:SF 2 "register_operand" "fx")))]
                   2547:   ""
                   2548:   "fmpy,sgl %1,%2,%0"
                   2549:   [(set_attr "type" "fpmul")])
                   2550: 
                   2551: (define_insn "divdf3"
                   2552:   [(set (match_operand:DF 0 "register_operand" "=fx")
                   2553:        (div:DF (match_operand:DF 1 "register_operand" "fx")
                   2554:                (match_operand:DF 2 "register_operand" "fx")))]
                   2555:   ""
                   2556:   "fdiv,dbl %1,%2,%0"
                   2557:   [(set_attr "type" "fpdivdbl")])
                   2558: 
                   2559: (define_insn "divsf3"
                   2560:   [(set (match_operand:SF 0 "register_operand" "=fx")
                   2561:        (div:SF (match_operand:SF 1 "register_operand" "fx")
                   2562:                (match_operand:SF 2 "register_operand" "fx")))]
                   2563:   ""
                   2564:   "fdiv,sgl %1,%2,%0"
                   2565:   [(set_attr "type" "fpdivsgl")])
                   2566: 
                   2567: (define_insn "negdf2"
                   2568:   [(set (match_operand:DF 0 "register_operand" "=fx")
                   2569:        (neg:DF (match_operand:DF 1 "register_operand" "fx")))]
                   2570:   ""
                   2571:   "fsub,dbl 0,%1,%0"
                   2572:   [(set_attr "type" "fpalu")])
                   2573: 
                   2574: (define_insn "negsf2"
                   2575:   [(set (match_operand:SF 0 "register_operand" "=fx")
                   2576:        (neg:SF (match_operand:SF 1 "register_operand" "fx")))]
                   2577:   ""
                   2578:   "fsub,sgl 0,%1,%0"
                   2579:   [(set_attr "type" "fpalu")])
                   2580: 
                   2581: (define_insn "absdf2"
                   2582:   [(set (match_operand:DF 0 "register_operand" "=fx")
                   2583:        (abs:DF (match_operand:DF 1 "register_operand" "fx")))]
                   2584:   ""
                   2585:   "fabs,dbl %1,%0"
                   2586:   [(set_attr "type" "fpalu")])
                   2587: 
                   2588: (define_insn "abssf2"
                   2589:   [(set (match_operand:SF 0 "register_operand" "=fx")
                   2590:        (abs:SF (match_operand:SF 1 "register_operand" "fx")))]
                   2591:   ""
                   2592:   "fabs,sgl %1,%0"
                   2593:   [(set_attr "type" "fpalu")])
                   2594: 
                   2595: (define_insn "sqrtdf2"
                   2596:   [(set (match_operand:DF 0 "register_operand" "=fx")
                   2597:        (sqrt:DF (match_operand:DF 1 "register_operand" "fx")))]
                   2598:   ""
                   2599:   "fsqrt,dbl %1,%0"
                   2600:   [(set_attr "type" "fpsqrtdbl")])
                   2601: 
                   2602: (define_insn "sqrtsf2"
                   2603:   [(set (match_operand:SF 0 "register_operand" "=fx")
                   2604:        (sqrt:SF (match_operand:SF 1 "register_operand" "fx")))]
                   2605:   ""
                   2606:   "fsqrt,sgl %1,%0"
                   2607:   [(set_attr "type" "fpsqrtsgl")])
                   2608: 
                   2609: ;;- Shift instructions
                   2610: 
                   2611: ;; Optimized special case of shifting.
                   2612: 
                   2613: (define_insn ""
                   2614:   [(set (match_operand:SI 0 "register_operand" "=r")
                   2615:        (lshiftrt:SI (match_operand:SI 1 "memory_operand" "m")
                   2616:                     (const_int 24)))]
                   2617:   ""
                   2618:   "ldb%M1 %1,%0"
                   2619:   [(set_attr "type" "load")
                   2620:    (set_attr "length" "4")])
                   2621: 
                   2622: (define_insn ""
                   2623:   [(set (match_operand:SI 0 "register_operand" "=r")
                   2624:        (lshiftrt:SI (match_operand:SI 1 "memory_operand" "m")
                   2625:                     (const_int 16)))]
                   2626:   ""
                   2627:   "ldh%M1 %1,%0"
                   2628:   [(set_attr "type" "load")
                   2629:    (set_attr "length" "4")])
                   2630: 
                   2631: (define_insn ""
                   2632:   [(set (match_operand:SI 0 "register_operand" "=r")
                   2633:        (plus:SI (mult:SI (match_operand:SI 2 "register_operand" "r")
                   2634:                          (match_operand:SI 3 "shadd_operand" ""))
                   2635:                 (match_operand:SI 1 "register_operand" "r")))]
                   2636:   ""
                   2637:   "sh%O3add %2,%1,%0")
                   2638: 
                   2639: ;; This variant of the above insn can occur if the first operand
                   2640: ;; is the frame pointer.  This is a kludge, but there doesn't
                   2641: ;; seem to be a way around it.  Only recognize it while reloading.
                   2642: ;; Note how operand 3 uses a predicate of "const_int_operand", but 
                   2643: ;; has constraints allowing a register.  I don't know how this works,
                   2644: ;; but it somehow makes sure that out-of-range constants are placed
                   2645: ;; in a register which somehow magically is a "const_int_operand".
                   2646: ;; (this was stolen from alpha.md, I'm not going to try and change it.
                   2647: 
                   2648: (define_insn ""
                   2649:   [(set (match_operand:SI 0 "register_operand" "=&r")
                   2650:        (plus:SI (plus:SI (mult:SI (match_operand:SI 2 "register_operand" "r")
                   2651:                                   (match_operand:SI 4 "shadd_operand" ""))
                   2652:                          (match_operand:SI 1 "register_operand" "r"))
                   2653:                 (match_operand:SI 3 "const_int_operand" "rI")))]
                   2654:   "reload_in_progress"
                   2655:   "sh%O4add %2,%1,%0\;add%I3 %3,%0,%0"
                   2656:   [(set_attr "type" "multi")
                   2657:    (set_attr "length" "8")])
                   2658: 
                   2659: (define_expand "ashlsi3"
                   2660:   [(set (match_operand:SI 0 "register_operand" "")
                   2661:        (ashift:SI (match_operand:SI 1 "lhs_lshift_operand" "")
                   2662:                   (match_operand:SI 2 "arith32_operand" "")))]
                   2663:   ""
                   2664:   "
                   2665: {
                   2666:   if (GET_CODE (operands[2]) != CONST_INT)
                   2667:     {
                   2668:       rtx temp = gen_reg_rtx (SImode);
                   2669:       emit_insn (gen_subsi3 (temp, GEN_INT (31), operands[2]));
                   2670:        if (GET_CODE (operands[1]) == CONST_INT)
                   2671:          emit_insn (gen_zvdep_imm (operands[0], operands[1], temp));
                   2672:        else
                   2673:          emit_insn (gen_zvdep32 (operands[0], operands[1], temp));
                   2674:       DONE;
                   2675:     }
                   2676:   /* Make sure both inputs are not constants,
                   2677:      the recognizer can't handle that.  */
                   2678:   operands[1] = force_reg (SImode, operands[1]);
                   2679: }")
                   2680: 
                   2681: (define_insn ""
                   2682:   [(set (match_operand:SI 0 "register_operand" "=r")
                   2683:        (ashift:SI (match_operand:SI 1 "register_operand" "r")
                   2684:                   (match_operand:SI 2 "const_int_operand" "n")))]
                   2685:   ""
                   2686:   "zdep %1,%P2,%L2,%0"
                   2687:   [(set_attr "type" "binary")
                   2688:    (set_attr "length" "4")])
                   2689: 
                   2690: ; Match cases of op1 a CONST_INT here that zvdep_imm doesn't handle.
                   2691: ; Doing it like this makes slightly better code since reload can
                   2692: ; replace a register with a known value in range -16..15 with a
                   2693: ; constant.  Ideally, we would like to merge zvdep32 and zvdep_imm,
                   2694: ; but since we have no more CONST_OK... characters, that is not
                   2695: ; possible.
                   2696: (define_insn "zvdep32"
                   2697:   [(set (match_operand:SI 0 "register_operand" "=r,r")
                   2698:        (ashift:SI (match_operand:SI 1 "arith5_operand" "r,L")
                   2699:                   (minus:SI (const_int 31)
                   2700:                             (match_operand:SI 2 "register_operand" "q,q"))))]
                   2701:   ""
                   2702:   "@
                   2703:    zvdep %1,32,%0
                   2704:    zvdepi %1,32,%0")
                   2705: 
                   2706: (define_insn "zvdep_imm"
                   2707:   [(set (match_operand:SI 0 "register_operand" "=r")
                   2708:        (ashift:SI (match_operand:SI 1 "lhs_lshift_cint_operand" "")
                   2709:                   (minus:SI (const_int 31)
                   2710:                             (match_operand:SI 2 "register_operand" "q"))))]
                   2711:   ""
                   2712:   "*
                   2713: {
                   2714:   int x = INTVAL (operands[1]);
                   2715:   operands[2] = GEN_INT (4 + exact_log2 ((x >> 4) + 1));
                   2716:   operands[1] = GEN_INT ((x & 0xf) - 0x10);
                   2717:   return \"zvdepi %1,%2,%0\";
                   2718: }")
                   2719: 
                   2720: (define_insn "vdepi_ior"
                   2721:   [(set (match_operand:SI 0 "register_operand" "=r")
                   2722:        (ior:SI (ashift:SI (match_operand:SI 1 "const_int_operand" "")
                   2723:                           (minus:SI (const_int 31)
                   2724:                                     (match_operand:SI 2 "register_operand" "q")))
                   2725:                (match_operand:SI 3 "register_operand" "0")))]
                   2726:   ; accept ...0001...1, can this be generalized?
                   2727:   "exact_log2 (INTVAL (operands[1]) + 1) >= 0"
                   2728:   "*
                   2729: {
                   2730:   int x = INTVAL (operands[1]);
                   2731:   operands[2] = GEN_INT (exact_log2 (x + 1));
                   2732:   return \"vdepi -1,%2,%0\";
                   2733: }")
                   2734: 
                   2735: (define_insn "vdepi_and"
                   2736:   [(set (match_operand:SI 0 "register_operand" "=r")
                   2737:        (and:SI (rotate:SI (match_operand:SI 1 "const_int_operand" "")
                   2738:                           (minus:SI (const_int 31)
                   2739:                                     (match_operand:SI 2 "register_operand" "q")))
                   2740:                (match_operand:SI 3 "register_operand" "0")))]
                   2741:   ; this can be generalized...!
                   2742:   "INTVAL (operands[1]) == -2"
                   2743:   "*
                   2744: {
                   2745:   int x = INTVAL (operands[1]);
                   2746:   operands[2] = GEN_INT (exact_log2 ((~x) + 1));
                   2747:   return \"vdepi 0,%2,%0\";
                   2748: }")
                   2749: 
                   2750: (define_expand "ashrsi3"
                   2751:   [(set (match_operand:SI 0 "register_operand" "")
                   2752:        (ashiftrt:SI (match_operand:SI 1 "register_operand" "")
                   2753:                     (match_operand:SI 2 "arith32_operand" "")))]
                   2754:   ""
                   2755:   "
                   2756: {
                   2757:   if (GET_CODE (operands[2]) != CONST_INT)
                   2758:     {
                   2759:       rtx temp = gen_reg_rtx (SImode);
                   2760:       emit_insn (gen_subsi3 (temp, GEN_INT (31), operands[2]));
                   2761:       emit_insn (gen_vextrs32 (operands[0], operands[1], temp));
                   2762:       DONE;
                   2763:     }
                   2764: }")
                   2765: 
                   2766: (define_insn ""
                   2767:   [(set (match_operand:SI 0 "register_operand" "=r")
                   2768:        (ashiftrt:SI (match_operand:SI 1 "register_operand" "r")
                   2769:                     (match_operand:SI 2 "const_int_operand" "n")))]
                   2770:   ""
                   2771:   "extrs %1,%P2,%L2,%0"
                   2772:   [(set_attr "type" "binary")
                   2773:    (set_attr "length" "4")])
                   2774: 
                   2775: (define_insn "vextrs32"
                   2776:   [(set (match_operand:SI 0 "register_operand" "=r")
                   2777:        (ashiftrt:SI (match_operand:SI 1 "register_operand" "r")
                   2778:                     (minus:SI (const_int 31)
                   2779:                               (match_operand:SI 2 "register_operand" "q"))))]
                   2780:   ""
                   2781:   "vextrs %1,32,%0")
                   2782: 
                   2783: (define_insn "lshrsi3"
                   2784:   [(set (match_operand:SI 0 "register_operand" "=r,r")
                   2785:        (lshiftrt:SI (match_operand:SI 1 "register_operand" "r,r")
                   2786:                     (match_operand:SI 2 "arith32_operand" "q,n")))]
                   2787:   ""
                   2788:   "@
                   2789:    vshd 0,%1,%0
                   2790:    extru %1,%P2,%L2,%0"
                   2791:   [(set_attr "type" "binary")
                   2792:    (set_attr "length" "4")])
                   2793: 
                   2794: (define_insn "rotrsi3"
                   2795:   [(set (match_operand:SI 0 "register_operand" "=r,r")
                   2796:        (rotatert:SI (match_operand:SI 1 "register_operand" "r,r")
                   2797:                     (match_operand:SI 2 "arith32_operand" "q,n")))]
                   2798:   ""
                   2799:   "*
                   2800: {
                   2801:   if (GET_CODE (operands[2]) == CONST_INT)
                   2802:     {
                   2803:       operands[2] = GEN_INT (INTVAL (operands[2]) & 31);
                   2804:       return \"shd %1,%1,%2,%0\";
                   2805:     }
                   2806:   else
                   2807:     return \"vshd %1,%1,%0\";
                   2808: }"
                   2809:   [(set_attr "type" "binary")
                   2810:    (set_attr "length" "4")])
                   2811: 
                   2812: (define_insn "rotlsi3"
                   2813:   [(set (match_operand:SI 0 "register_operand" "=r")
                   2814:        (rotate:SI (match_operand:SI 1 "register_operand" "r")
                   2815:                   (match_operand:SI 2 "const_int_operand" "n")))]
                   2816:   ""
                   2817:   "*
                   2818: {
                   2819:   operands[2] = GEN_INT ((32 - INTVAL (operands[2])) & 31);
                   2820:   return \"shd %1,%1,%2,%0\";
                   2821: }"
                   2822:   [(set_attr "type" "binary")
                   2823:    (set_attr "length" "4")])
                   2824: 
                   2825: (define_insn ""
                   2826:   [(set (match_operand:SI 0 "register_operand" "=r")
                   2827:        (match_operator:SI 5 "plus_xor_ior_operator"
                   2828:          [(ashift:SI (match_operand:SI 1 "register_operand" "r")
                   2829:                      (match_operand:SI 3 "const_int_operand" "n"))
                   2830:           (lshiftrt:SI (match_operand:SI 2 "register_operand" "r")
                   2831:                        (match_operand:SI 4 "const_int_operand" "n"))]))]
                   2832:   "INTVAL (operands[3]) + INTVAL (operands[4]) == 32"
                   2833:   "shd %1,%2,%4,%0"
                   2834:   [(set_attr "type" "binary")
                   2835:    (set_attr "length" "4")])
                   2836: 
                   2837: (define_insn ""
                   2838:   [(set (match_operand:SI 0 "register_operand" "=r")
                   2839:        (match_operator:SI 5 "plus_xor_ior_operator"
                   2840:          [(lshiftrt:SI (match_operand:SI 2 "register_operand" "r")
                   2841:                        (match_operand:SI 4 "const_int_operand" "n"))
                   2842:           (ashift:SI (match_operand:SI 1 "register_operand" "r")
                   2843:                      (match_operand:SI 3 "const_int_operand" "n"))]))]
                   2844:   "INTVAL (operands[3]) + INTVAL (operands[4]) == 32"
                   2845:   "shd %1,%2,%4,%0"
                   2846:   [(set_attr "type" "binary")
                   2847:    (set_attr "length" "4")])
                   2848: 
                   2849: (define_insn ""
                   2850:   [(set (match_operand:SI 0 "register_operand" "=r")
                   2851:        (and:SI (ashift:SI (match_operand:SI 1 "register_operand" "r")
                   2852:                           (match_operand:SI 2 "const_int_operand" ""))
                   2853:                (match_operand:SI 3 "const_int_operand" "")))]
                   2854:   "exact_log2 (1 + (INTVAL (operands[3]) >> (INTVAL (operands[2]) & 31))) >= 0"
                   2855:   "*
                   2856: {
                   2857:   int cnt = INTVAL (operands[2]) & 31;
                   2858:   operands[3] = GEN_INT (exact_log2 (1 + (INTVAL (operands[3]) >> cnt)));
                   2859:   operands[2] = GEN_INT (31 - cnt);
                   2860:   return \"zdep %1,%2,%3,%0\";
                   2861: }"
                   2862:   [(set_attr "type" "binary")
                   2863:    (set_attr "length" "4")])
                   2864: 
                   2865: ;; Unconditional and other jump instructions.
                   2866: 
                   2867: (define_insn "return"
                   2868:   [(return)]
                   2869:   "hppa_can_use_return_insn_p ()"
                   2870:   "bv%* 0(%%r2)"
                   2871:   [(set_attr "type" "branch")])
                   2872: 
                   2873: ;; Use a different pattern for functions which have non-trivial
                   2874: ;; epilogues so as not to confuse jump and reorg.
                   2875: (define_insn "return_internal"
                   2876:   [(use (reg:SI 2))
                   2877:    (return)]
                   2878:   ""
                   2879:   "bv%* 0(%%r2)"
                   2880:   [(set_attr "type" "branch")])
                   2881: 
                   2882: (define_expand "prologue"
                   2883:   [(const_int 0)]
                   2884:   ""
                   2885:   "hppa_expand_prologue ();DONE;")
                   2886: 
                   2887: (define_expand "epilogue"
                   2888:   [(return)]
                   2889:   ""
                   2890:   "
                   2891: {
                   2892:   /* Try to use the trivial return first.  Else use the full
                   2893:      epilogue.  */
                   2894:   if (hppa_can_use_return_insn_p ())
                   2895:    emit_jump_insn (gen_return ());
                   2896:   else
                   2897:     {
                   2898:       hppa_expand_epilogue ();
                   2899:       emit_jump_insn (gen_return_internal ());
                   2900:     }
                   2901:   DONE;
                   2902: }")
                   2903: 
                   2904: ;; Special because we use the value placed in %r2 by the bl instruction
                   2905: ;; from within its delay slot to set the value for the 2nd parameter to
                   2906: ;; the call.
                   2907: (define_insn "call_profiler"
                   2908:   [(unspec_volatile [(const_int 0)] 0)
                   2909:    (use (match_operand:SI 0 "const_int_operand" ""))]
                   2910:   ""
                   2911:   "bl _mcount,%%r2\;ldo %0(%%r2),%%r25"
                   2912:   [(set_attr "length" "8")])
                   2913: 
                   2914: (define_insn "blockage"
                   2915:   [(unspec_volatile [(const_int 2)] 0)]
                   2916:   ""
                   2917:   ""
                   2918:   [(set_attr "length" "0")])
                   2919: 
                   2920: (define_insn "jump"
                   2921:   [(set (pc) (label_ref (match_operand 0 "" "")))]
                   2922:   ""
                   2923:   "bl%* %l0,0"
                   2924:   [(set_attr "type" "uncond_branch")
                   2925:    (set (attr "length")
                   2926:     (cond [(eq (symbol_ref "jump_in_call_delay (insn)") (const_int 0))
                   2927:           (const_int 4)
                   2928: ;; If the jump is in the delay slot of a call, then its length depends
                   2929: ;; on whether or not we can add the proper offset to %r2 with an ldo
                   2930: ;; instruction.
                   2931:           (lt (abs (minus (match_dup 0) (plus (pc) (const_int 8))))
                   2932:                    (const_int 8188))
                   2933:            (const_int 4)]
                   2934:          (const_int 8)))])
                   2935: 
                   2936: ;; Subroutines of "casesi".
                   2937: ;; operand 0 is index
                   2938: ;; operand 1 is the minimum bound
                   2939: ;; operand 2 is the maximum bound - minimum bound + 1
                   2940: ;; operand 3 is CODE_LABEL for the table;
                   2941: ;; operand 4 is the CODE_LABEL to go to if index out of range.
                   2942: 
                   2943: (define_expand "casesi"
                   2944:   [(match_operand:SI 0 "general_operand" "")
                   2945:    (match_operand:SI 1 "const_int_operand" "")
                   2946:    (match_operand:SI 2 "const_int_operand" "")
                   2947:    (match_operand 3 "" "")
                   2948:    (match_operand 4 "" "")]
                   2949:   ""
                   2950:   "
                   2951: {
                   2952:   if (GET_CODE (operands[0]) != REG)
                   2953:     operands[0] = force_reg (SImode, operands[0]);
                   2954: 
                   2955:   if (operands[1] != const0_rtx)
                   2956:     {
                   2957:       rtx reg = gen_reg_rtx (SImode);
                   2958: 
                   2959:       operands[1] = GEN_INT (-INTVAL (operands[1]));
                   2960:       if (!INT_14_BITS (operands[1]))
                   2961:        operands[1] = force_reg (SImode, operands[1]);
                   2962:       emit_insn (gen_addsi3 (reg, operands[0], operands[1]));
                   2963: 
                   2964:       operands[0] = reg;
                   2965:     }
                   2966: 
                   2967:   if (!INT_11_BITS (operands[2]))
                   2968:     operands[2] = force_reg (SImode, operands[2]);
                   2969: 
                   2970:   emit_jump_insn (gen_casesi0 (operands[0], operands[2],
                   2971:                               operands[3], operands[4]));
                   2972:   DONE;
                   2973: }")
                   2974: 
                   2975: (define_insn "casesi0"
                   2976:   [(set (pc)
                   2977:        (if_then_else (leu (match_operand:SI 0 "register_operand" "r")
                   2978:                           (match_operand:SI 1 "arith11_operand" "rI"))
                   2979:                      (plus:SI (mem:SI (plus:SI (pc) (match_dup 0)))
                   2980:                               (label_ref (match_operand 2 "" "")))
                   2981:                      (pc)))
                   2982:    (use (label_ref (match_operand 3 "" "")))]
                   2983:   ""
                   2984:   "*
                   2985: {
                   2986:   if (GET_CODE (operands[1]) == CONST_INT)
                   2987:     {
                   2988:       operands[1] = GEN_INT (~INTVAL (operands[1]));
                   2989:       return \"addi,uv %1,%0,0\;blr,n %0,0\;b,n %l3\";
                   2990:     }
                   2991:   else
                   2992:     {
                   2993:       return \"sub,>> %0,%1,0\;blr,n %0,0\;b,n %l3\";
                   2994:     }
                   2995: }"
                   2996:   [(set_attr "length" "12")])
                   2997: 
                   2998: ;; Need nops for the calls because execution is supposed to continue
                   2999: ;; past; we don't want to nullify an instruction that we need.
                   3000: ;;- jump to subroutine
                   3001: 
                   3002: (define_expand "call"
                   3003:   [(parallel [(call (match_operand:SI 0 "" "")
                   3004:                    (match_operand 1 "" ""))
                   3005:              (clobber (reg:SI 2))])]
                   3006:   ""
                   3007:   "
                   3008: {
                   3009:   rtx op;
                   3010: 
                   3011:   if (flag_pic)
                   3012:     emit_insn (gen_rtx (USE, VOIDmode,
                   3013:                        gen_rtx (REG, Pmode, PIC_OFFSET_TABLE_REGNUM)));
                   3014: 
                   3015:   if (TARGET_LONG_CALLS)
                   3016:     op = force_reg (SImode, XEXP (operands[0], 0));
                   3017:   else
                   3018:     op = XEXP (operands[0], 0);
                   3019: 
                   3020:   /* Use two different patterns for calls to explicitly named functions
                   3021:      and calls through function pointers.  This is necessary as these two
                   3022:      types of calls use different calling conventions, and CSE might try
                   3023:      to change the named call into an indirect call in some cases (using
                   3024:      two patterns keeps CSE from performing this optimization).  */
                   3025:   if (GET_CODE (op) == SYMBOL_REF)
                   3026:     emit_call_insn (gen_call_internal_symref (op, operands[1]));
                   3027:   else
                   3028:     emit_call_insn (gen_call_internal_reg (op, operands[1]));
                   3029: 
                   3030:   if (flag_pic)
                   3031:     {
                   3032:       if (!hppa_save_pic_table_rtx)
                   3033:        hppa_save_pic_table_rtx = gen_reg_rtx (Pmode);
                   3034:       emit_insn (gen_rtx (SET, VOIDmode,
                   3035:                          gen_rtx (REG, Pmode, PIC_OFFSET_TABLE_REGNUM),
                   3036:                          hppa_save_pic_table_rtx));
                   3037:     }
                   3038:   DONE;
                   3039: }")
                   3040: 
                   3041: (define_insn "call_internal_symref"
                   3042:   [(call (mem:SI (match_operand:SI 0 "call_operand_address" ""))
                   3043:         (match_operand 1 "" "i"))
                   3044:    (clobber (reg:SI 2))
                   3045:    (use (const_int 0))]
                   3046:   "! TARGET_LONG_CALLS"
                   3047:   "*
                   3048: {
                   3049:   output_arg_descriptor (insn);
                   3050:   return output_call (insn, operands[0], gen_rtx (REG, SImode, 2));
                   3051: }"
                   3052:   [(set_attr "type" "call")
                   3053:    (set_attr "length" "4")])
                   3054: 
                   3055: (define_insn "call_internal_reg"
                   3056:   [(call (mem:SI (match_operand:SI 0 "register_operand" "r"))
                   3057:         (match_operand 1 "" "i"))
                   3058:    (clobber (reg:SI 2))
                   3059:    (use (const_int 1))]
                   3060:   ""
                   3061:   "copy %r0,%%r22\;.CALL\\tARGW0=GR\;bl $$dyncall,%%r31\;copy %%r31,%%r2"
                   3062:   [(set_attr "type" "dyncall")
                   3063:    (set_attr "length" "12")])
                   3064: 
                   3065: (define_expand "call_value"
                   3066:   [(parallel [(set (match_operand 0 "" "")
                   3067:                   (call (match_operand:SI 1 "" "")
                   3068:                         (match_operand 2 "" "")))
                   3069:              (clobber (reg:SI 2))])]
                   3070:   ;;- Don't use operand 1 for most machines.
                   3071:   ""
                   3072:   "
                   3073: {
                   3074:   rtx op;
                   3075: 
                   3076:   if (flag_pic)
                   3077:     emit_insn (gen_rtx (USE, VOIDmode,
                   3078:                        gen_rtx (REG, Pmode, PIC_OFFSET_TABLE_REGNUM)));
                   3079: 
                   3080:   if (TARGET_LONG_CALLS)
                   3081:     op = force_reg (SImode, XEXP (operands[1], 0));
                   3082:   else
                   3083:     op = XEXP (operands[1], 0);
                   3084: 
                   3085:   /* Use two different patterns for calls to explicitly named functions
                   3086:      and calls through function pointers.  This is necessary as these two
                   3087:      types of calls use different calling conventions, and CSE might try
                   3088:      to change the named call into an indirect call in some cases (using
                   3089:      two patterns keeps CSE from performing this optimization).  */
                   3090:   if (GET_CODE (op) == SYMBOL_REF)
                   3091:     emit_call_insn (gen_call_value_internal_symref (operands[0], op,
                   3092:                                                    operands[2]));
                   3093:   else
                   3094:     emit_call_insn (gen_call_value_internal_reg (operands[0], op, operands[2]));
                   3095: 
                   3096:   if (flag_pic)
                   3097:     {
                   3098:       if (!hppa_save_pic_table_rtx)
                   3099:        hppa_save_pic_table_rtx = gen_reg_rtx (Pmode);
                   3100:       emit_insn (gen_rtx (SET, VOIDmode,
                   3101:                          gen_rtx (REG, Pmode, PIC_OFFSET_TABLE_REGNUM),
                   3102:                          hppa_save_pic_table_rtx));
                   3103:     }
                   3104:   DONE;
                   3105: }")
                   3106: 
                   3107: (define_insn "call_value_internal_symref"
                   3108:   [(set (match_operand 0 "" "=rfx")
                   3109:        (call (mem:SI (match_operand:SI 1 "call_operand_address" ""))
                   3110:              (match_operand 2 "" "i")))
                   3111:    (clobber (reg:SI 2))
                   3112:    (use (const_int 0))]
                   3113:   ;;- Don't use operand 1 for most machines.
                   3114:   "! TARGET_LONG_CALLS"
                   3115:   "*
                   3116: {
                   3117:   output_arg_descriptor (insn);
                   3118:   return output_call (insn, operands[1], gen_rtx (REG, SImode, 2));
                   3119: }"
                   3120:   [(set_attr "type" "call")
                   3121:    (set_attr "length" "4")])
                   3122: 
                   3123: (define_insn "call_value_internal_reg"
                   3124:   [(set (match_operand 0 "" "=rfx")
                   3125:        (call (mem:SI (match_operand:SI 1 "register_operand" "r"))
                   3126:              (match_operand 2 "" "i")))
                   3127:    (clobber (reg:SI 2))
                   3128:    (use (const_int 1))]
                   3129:   ;;- Don't use operand 1 for most machines.
                   3130:   ""
                   3131:   "copy %r1,%%r22\;.CALL\\tARGW0=GR\;bl $$dyncall,%%r31\;copy %%r31,%%r2"
                   3132:   [(set_attr "type" "dyncall")
                   3133:    (set_attr "length" "12")])
                   3134: 
                   3135: ;; Call subroutine returning any type.
                   3136: 
                   3137: (define_expand "untyped_call"
                   3138:   [(parallel [(call (match_operand 0 "" "")
                   3139:                    (const_int 0))
                   3140:              (match_operand 1 "" "")
                   3141:              (match_operand 2 "" "")])]
                   3142:   ""
                   3143:   "
                   3144: {
                   3145:   int i;
                   3146: 
                   3147:   emit_call_insn (gen_call (operands[0], const0_rtx));
                   3148: 
                   3149:   for (i = 0; i < XVECLEN (operands[2], 0); i++)
                   3150:     {
                   3151:       rtx set = XVECEXP (operands[2], 0, i);
                   3152:       emit_move_insn (SET_DEST (set), SET_SRC (set));
                   3153:     }
                   3154: 
                   3155:   /* The optimizer does not know that the call sets the function value
                   3156:      registers we stored in the result block.  We avoid problems by
                   3157:      claiming that all hard registers are used and clobbered at this
                   3158:      point.  */
                   3159:   emit_insn (gen_blockage ());
                   3160: 
                   3161:   DONE;
                   3162: }")
                   3163: (define_insn "nop"
                   3164:   [(const_int 0)]
                   3165:   ""
                   3166:   "nop")
                   3167: 
                   3168: ;;; Hope this is only within a function...
                   3169: (define_insn "indirect_jump"
                   3170:   [(set (pc) (match_operand:SI 0 "register_operand" "r"))]
                   3171:   ""
                   3172:   "bv%* 0(%0)"
                   3173:   [(set_attr "type" "branch")])
                   3174: 
                   3175: (define_insn "extzv"
                   3176:   [(set (match_operand:SI 0 "register_operand" "=r")
                   3177:        (zero_extract:SI (match_operand:SI 1 "register_operand" "r")
                   3178:                         (match_operand:SI 2 "uint5_operand" "")
                   3179:                         (match_operand:SI 3 "uint5_operand" "")))]
                   3180:   ""
                   3181:   "extru %1,%3+%2-1,%2,%0")
                   3182: 
                   3183: (define_insn ""
                   3184:   [(set (match_operand:SI 0 "register_operand" "=r")
                   3185:        (zero_extract:SI (match_operand:SI 1 "register_operand" "r")
                   3186:                         (const_int 1)
                   3187:                         (match_operand:SI 3 "register_operand" "q")))]
                   3188:   ""
                   3189:   "vextru %1,1,%0")
                   3190: 
                   3191: (define_insn "extv"
                   3192:   [(set (match_operand:SI 0 "register_operand" "=r")
                   3193:        (sign_extract:SI (match_operand:SI 1 "register_operand" "r")
                   3194:                         (match_operand:SI 2 "uint5_operand" "")
                   3195:                         (match_operand:SI 3 "uint5_operand" "")))]
                   3196:   ""
                   3197:   "extrs %1,%3+%2-1,%2,%0")
                   3198: 
                   3199: (define_insn ""
                   3200:   [(set (match_operand:SI 0 "register_operand" "=r")
                   3201:        (sign_extract:SI (match_operand:SI 1 "register_operand" "r")
                   3202:                         (const_int 1)
                   3203:                         (match_operand:SI 3 "register_operand" "q")))]
                   3204:   ""
                   3205:   "vextrs %1,1,%0")
                   3206: 
                   3207: (define_insn "insv"
                   3208:   [(set (zero_extract:SI (match_operand:SI 0 "register_operand" "+r,r")
                   3209:                         (match_operand:SI 1 "uint5_operand" "")
                   3210:                         (match_operand:SI 2 "uint5_operand" ""))
                   3211:        (match_operand:SI 3 "arith5_operand" "r,L"))]
                   3212:   ""
                   3213:   "@
                   3214:    dep %3,%2+%1-1,%1,%0
                   3215:    depi %3,%2+%1-1,%1,%0")
                   3216: 
                   3217: ;; Optimize insertion of const_int values of type 1...1xxxx.
                   3218: (define_insn ""
                   3219:   [(set (zero_extract:SI (match_operand:SI 0 "register_operand" "+r")
                   3220:                         (match_operand:SI 1 "uint5_operand" "")
                   3221:                         (match_operand:SI 2 "uint5_operand" ""))
                   3222:        (match_operand:SI 3 "const_int_operand" ""))]
                   3223:   "(INTVAL (operands[3]) & 0x10) != 0 &&
                   3224:    (~INTVAL (operands[3]) & (1L << INTVAL (operands[1])) - 1 & ~0xf) == 0"
                   3225:   "*
                   3226: {
                   3227:   operands[3] = GEN_INT ((INTVAL (operands[3]) & 0xf) - 0x10);
                   3228:   return \"depi %3,%2+%1-1,%1,%0\";
                   3229: }")
                   3230: 
                   3231: ;; This insn is used for some loop tests, typically loops reversed when
                   3232: ;; strength reduction is used.  It is actually created when the instruction
                   3233: ;; combination phase combines the special loop test.  Since this insn
                   3234: ;; is both a jump insn and has an output, it must deal with it's own
                   3235: ;; reloads, hence the `m' constraints.  The `!' constraints direct reload
                   3236: ;; to not choose the register alternatives in the event a reload is needed.
                   3237: (define_insn "decrement_and_branch_until_zero"
                   3238:   [(set (pc)
                   3239:        (if_then_else
                   3240:          (match_operator 2 "comparison_operator"
                   3241:           [(plus:SI (match_operand:SI 0 "register_operand" "+!r,!*f*x,!*m")
                   3242:                     (match_operand:SI 1 "int5_operand" "L,L,L"))
                   3243:            (const_int 0)])
                   3244:          (label_ref (match_operand 3 "" ""))
                   3245:          (pc)))
                   3246:    (set (match_dup 0)
                   3247:        (plus:SI (match_dup 0) (match_dup 1)))
                   3248:    (clobber (match_scratch:SI 4 "=X,r,r"))]
                   3249:   ""
                   3250:   "* return output_dbra (operands, insn, which_alternative); "
                   3251: ;; Do not expect to understand this the first time through.
                   3252: [(set_attr "type" "cbranch,multi,multi")
                   3253:  (set (attr "length")
                   3254:       (if_then_else (eq_attr "alternative" "0")
                   3255: ;; Loop counter in register case
                   3256: ;; Short branch has length of 4
                   3257: ;; Long branch has length of 8
                   3258:        (if_then_else (lt (abs (minus (match_dup 3) (plus (pc) (const_int 8))))
                   3259:                      (const_int 8188))
                   3260:            (const_int 4)
                   3261:           (const_int 8))
                   3262: 
                   3263: ;; Loop counter in FP reg case.
                   3264: ;; Extra goo to deal with additional reload insns.
                   3265:        (if_then_else (eq_attr "alternative" "1")
                   3266:          (if_then_else (lt (match_dup 3) (pc))
                   3267:            (if_then_else
                   3268:              (lt (abs (minus (match_dup 3) (plus (pc) (const_int 24))))
                   3269:                  (const_int 8188))
                   3270:              (const_int 24)
                   3271:              (const_int 28))
                   3272:            (if_then_else
                   3273:              (lt (abs (minus (match_dup 3) (plus (pc) (const_int 8))))
                   3274:                  (const_int 8188))
                   3275:              (const_int 24)
                   3276:              (const_int 28)))
                   3277: ;; Loop counter in memory case.
                   3278: ;; Extra goo to deal with additional reload insns.
                   3279:        (if_then_else (lt (match_dup 3) (pc))
                   3280:          (if_then_else
                   3281:            (lt (abs (minus (match_dup 3) (plus (pc) (const_int 12))))
                   3282:                (const_int 8188))
                   3283:            (const_int 12)
                   3284:            (const_int 16))
                   3285:          (if_then_else
                   3286:            (lt (abs (minus (match_dup 3) (plus (pc) (const_int 8))))
                   3287:                (const_int 8188))
                   3288:            (const_int 12)
                   3289:            (const_int 16))))))])
                   3290: 
                   3291: ;; Simply another variant of the dbra pattern.  More restrictive
                   3292: ;; in testing the comparison operator as it must worry about overflow
                   3293: ;; problems.
                   3294: (define_insn ""
                   3295:   [(set (pc)
                   3296:        (if_then_else
                   3297:          (match_operator 2 "eq_neq_comparison_operator"
                   3298:           [(match_operand:SI 0 "register_operand" "+!r,!*f*x,!*m")
                   3299:            (match_operand:SI 5 "const_int_operand" "")])
                   3300:          (label_ref (match_operand 3 "" ""))
                   3301:          (pc)))
                   3302:    (set (match_dup 0)
                   3303:        (plus:SI (match_dup 0) (match_operand:SI 1 "int5_operand" "L,L,L")))
                   3304:    (clobber (match_scratch:SI 4 "=X,r,r"))]
                   3305:   "INTVAL (operands[5]) == - INTVAL (operands[1])"
                   3306: "* return output_dbra (operands, insn, which_alternative);"
                   3307: ;; Do not expect to understand this the first time through.
                   3308: [(set_attr "type" "cbranch,multi,multi")
                   3309:  (set (attr "length")
                   3310:       (if_then_else (eq_attr "alternative" "0")
                   3311: ;; Loop counter in register case
                   3312: ;; Short branch has length of 4
                   3313: ;; Long branch has length of 8
                   3314:        (if_then_else (lt (abs (minus (match_dup 3) (plus (pc) (const_int 8))))
                   3315:                      (const_int 8188))
                   3316:            (const_int 4)
                   3317:           (const_int 8))
                   3318: 
                   3319: ;; Loop counter in FP reg case.
                   3320: ;; Extra goo to deal with additional reload insns.
                   3321:        (if_then_else (eq_attr "alternative" "1")
                   3322:          (if_then_else (lt (match_dup 3) (pc))
                   3323:            (if_then_else
                   3324:              (lt (abs (minus (match_dup 3) (plus (pc) (const_int 24))))
                   3325:                  (const_int 8188))
                   3326:              (const_int 24)
                   3327:              (const_int 28))
                   3328:            (if_then_else
                   3329:              (lt (abs (minus (match_dup 3) (plus (pc) (const_int 8))))
                   3330:                  (const_int 8188))
                   3331:              (const_int 24)
                   3332:              (const_int 28)))
                   3333: ;; Loop counter in memory case.
                   3334: ;; Extra goo to deal with additional reload insns.
                   3335:        (if_then_else (lt (match_dup 3) (pc))
                   3336:          (if_then_else
                   3337:            (lt (abs (minus (match_dup 3) (plus (pc) (const_int 12))))
                   3338:                (const_int 8188))
                   3339:            (const_int 12)
                   3340:            (const_int 16))
                   3341:          (if_then_else
                   3342:            (lt (abs (minus (match_dup 3) (plus (pc) (const_int 8))))
                   3343:                (const_int 8188))
                   3344:            (const_int 12)
                   3345:            (const_int 16))))))])
                   3346: 
                   3347: (define_insn ""
                   3348:   [(set (pc)
                   3349:        (if_then_else
                   3350:          (match_operator 2 "movb_comparison_operator"
                   3351:           [(match_operand:SI 1 "register_operand" "r,r,r") (const_int 0)])
                   3352:          (label_ref (match_operand 3 "" ""))
                   3353:          (pc)))
                   3354:    (set (match_operand:SI 0 "register_operand" "=!r,!*f*x,!*m")
                   3355:        (match_dup 1))]
                   3356:   ""
                   3357: "* return output_movb (operands, insn, which_alternative, 0); "
                   3358: ;; Do not expect to understand this the first time through.
                   3359: [(set_attr "type" "cbranch,multi,multi")
                   3360:  (set (attr "length")
                   3361:       (if_then_else (eq_attr "alternative" "0")
                   3362: ;; Loop counter in register case
                   3363: ;; Short branch has length of 4
                   3364: ;; Long branch has length of 8
                   3365:        (if_then_else (lt (abs (minus (match_dup 3) (plus (pc) (const_int 8))))
                   3366:                      (const_int 8188))
                   3367:            (const_int 4)
                   3368:           (const_int 8))
                   3369: 
                   3370: ;; Loop counter in FP reg case.
                   3371: ;; Extra goo to deal with additional reload insns.
                   3372:        (if_then_else (eq_attr "alternative" "1")
                   3373:          (if_then_else (lt (match_dup 3) (pc))
                   3374:            (if_then_else
                   3375:              (lt (abs (minus (match_dup 3) (plus (pc) (const_int 12))))
                   3376:                  (const_int 8188))
                   3377:              (const_int 12)
                   3378:              (const_int 16))
                   3379:            (if_then_else
                   3380:              (lt (abs (minus (match_dup 3) (plus (pc) (const_int 8))))
                   3381:                  (const_int 8188))
                   3382:              (const_int 12)
                   3383:              (const_int 16)))
                   3384: ;; Loop counter in memory case.
                   3385: ;; Extra goo to deal with additional reload insns.
                   3386:        (if_then_else
                   3387:          (lt (abs (minus (match_dup 3) (plus (pc) (const_int 8))))
                   3388:              (const_int 8188))
                   3389:          (const_int 8)
                   3390:          (const_int 12)))))])
                   3391: 
                   3392: ;; Handle negated branch.
                   3393: (define_insn ""
                   3394:   [(set (pc)
                   3395:        (if_then_else
                   3396:          (match_operator 2 "movb_comparison_operator"
                   3397:           [(match_operand:SI 1 "register_operand" "r,r,r") (const_int 0)])
                   3398:          (pc)
                   3399:          (label_ref (match_operand 3 "" ""))))
                   3400:    (set (match_operand:SI 0 "register_operand" "=!r,!*f*x,!*m")
                   3401:        (match_dup 1))]
                   3402:   ""
                   3403: "* return output_movb (operands, insn, which_alternative, 1); "
                   3404: ;; Do not expect to understand this the first time through.
                   3405: [(set_attr "type" "cbranch,multi,multi")
                   3406:  (set (attr "length")
                   3407:       (if_then_else (eq_attr "alternative" "0")
                   3408: ;; Loop counter in register case
                   3409: ;; Short branch has length of 4
                   3410: ;; Long branch has length of 8
                   3411:        (if_then_else (lt (abs (minus (match_dup 3) (plus (pc) (const_int 8))))
                   3412:                      (const_int 8188))
                   3413:            (const_int 4)
                   3414:           (const_int 8))
                   3415: 
                   3416: ;; Loop counter in FP reg case.
                   3417: ;; Extra goo to deal with additional reload insns.
                   3418:        (if_then_else (eq_attr "alternative" "1")
                   3419:          (if_then_else (lt (match_dup 3) (pc))
                   3420:            (if_then_else
                   3421:              (lt (abs (minus (match_dup 3) (plus (pc) (const_int 12))))
                   3422:                  (const_int 8188))
                   3423:              (const_int 12)
                   3424:              (const_int 16))
                   3425:            (if_then_else
                   3426:              (lt (abs (minus (match_dup 3) (plus (pc) (const_int 8))))
                   3427:                  (const_int 8188))
                   3428:              (const_int 12)
                   3429:              (const_int 16)))
                   3430: ;; Loop counter in memory case.
                   3431: ;; Extra goo to deal with additional reload insns.
                   3432:        (if_then_else
                   3433:          (lt (abs (minus (match_dup 3) (plus (pc) (const_int 8))))
                   3434:              (const_int 8188))
                   3435:          (const_int 8)
                   3436:          (const_int 12)))))])
                   3437: 
                   3438: ;; The next four peepholes take advantage of the new 5 operand
                   3439: ;; fmpy{add,sub} instructions available on 1.1 CPUS.  Basically
                   3440: ;; fmpyadd performs a multiply and add/sub of independent operands
                   3441: ;; at the same time.  Because the operands must be independent
                   3442: ;; combine will not try to combine such insns...  Thus we have
                   3443: ;; to use a peephole.
                   3444: (define_peephole
                   3445:   [(set (match_operand 0 "register_operand" "=fx")
                   3446:        (mult (match_operand 1 "register_operand" "fx")
                   3447:              (match_operand 2 "register_operand" "fx")))
                   3448:    (set (match_operand 3 "register_operand" "+fx")
                   3449:        (plus (match_operand 4 "register_operand" "fx")
                   3450:              (match_operand 5 "register_operand" "fx")))]
                   3451:   "TARGET_SNAKE && fmpyaddoperands (operands)"
                   3452:   "*
                   3453: {
                   3454:   if (GET_MODE (operands[0]) == DFmode)
                   3455:     {
                   3456:       if (rtx_equal_p (operands[5], operands[3]))
                   3457:        return \"fmpyadd,dbl %1,%2,%0,%4,%3\";
                   3458:       else
                   3459:        return \"fmpyadd,dbl %1,%2,%0,%5,%3\";
                   3460:     }
                   3461:   else
                   3462:     {
                   3463:       if (rtx_equal_p (operands[5], operands[3]))
                   3464:        return \"fmpyadd,sgl %1,%2,%0,%4,%3\";
                   3465:       else
                   3466:        return \"fmpyadd,sgl %1,%2,%0,%5,%3\";
                   3467:     }
                   3468: }")
                   3469: 
                   3470: (define_peephole
                   3471:   [(set (match_operand 3 "register_operand" "+fx")
                   3472:        (plus (match_operand 4 "register_operand" "fx")
                   3473:              (match_operand 5 "register_operand" "fx")))
                   3474:    (set (match_operand 0 "register_operand" "=fx")
                   3475:        (mult (match_operand 1 "register_operand" "fx")
                   3476:              (match_operand 2 "register_operand" "fx")))]
                   3477:   "TARGET_SNAKE && fmpyaddoperands (operands)"
                   3478:   "*
                   3479: {
                   3480:   if (GET_MODE (operands[0]) == DFmode)
                   3481:     {
                   3482:       if (rtx_equal_p (operands[3], operands[5]))
                   3483:        return \"fmpyadd,dbl %1,%2,%0,%4,%3\";
                   3484:       else
                   3485:        return \"fmpyadd,dbl %1,%2,%0,%5,%3\";
                   3486:     }
                   3487:   else
                   3488:     {
                   3489:       if (rtx_equal_p (operands[3], operands[5]))
                   3490:        return \"fmpyadd,sgl %1,%2,%0,%4,%3\";
                   3491:       else
                   3492:        return \"fmpyadd,sgl %1,%2,%0,%5,%3\";
                   3493:     }
                   3494: }")
                   3495: 
                   3496: ;; Note fsub subtracts the second operand from the first while fmpysub
                   3497: ;; does the opposite for the subtraction operands!
                   3498: (define_peephole
                   3499:   [(set (match_operand 0 "register_operand" "=fx")
                   3500:        (mult (match_operand 1 "register_operand" "fx")
                   3501:              (match_operand 2 "register_operand" "fx")))
                   3502:    (set (match_operand 3 "register_operand" "+fx")
                   3503:        (minus (match_operand 4 "register_operand" "fx")
                   3504:               (match_operand 5 "register_operand" "fx")))]
                   3505:   "TARGET_SNAKE && fmpysuboperands (operands)"
                   3506:   "*
                   3507: {
                   3508:   if (GET_MODE (operands[0]) == DFmode)
                   3509:     return \"fmpysub,dbl %1,%2,%0,%5,%3\";
                   3510:   else
                   3511:     return \"fmpysub,sgl %1,%2,%0,%5,%3\";
                   3512: }")
                   3513: 
                   3514: (define_peephole
                   3515:   [(set (match_operand 3 "register_operand" "+fx")
                   3516:        (minus (match_operand 4 "register_operand" "fx")
                   3517:               (match_operand 5 "register_operand" "fx")))
                   3518:    (set (match_operand 0 "register_operand" "=fx")
                   3519:        (mult (match_operand 1 "register_operand" "fx")
                   3520:              (match_operand 2 "register_operand" "fx")))]
                   3521:   "TARGET_SNAKE && fmpysuboperands (operands)"
                   3522:   "*
                   3523: {
                   3524:   if (GET_MODE (operands[0]) == DFmode)
                   3525:     return \"fmpysub,dbl %1,%2,%0,%5,%3\";
                   3526:   else
                   3527:     return \"fmpysub,sgl %1,%2,%0,%5,%3\";
                   3528: }")
                   3529: 
                   3530: ;; Flush the I and D cache line found at the address in operand 0.
                   3531: ;; This is used by the trampoline code for nested functions.
                   3532: ;; So long as the trampoline itself is less than 32 bytes this
                   3533: ;; is sufficient.
                   3534: 
                   3535: (define_insn "dcacheflush"
                   3536:   [(unspec_volatile [(const_int 1)] 0)
                   3537:    (use (mem:SI (match_operand:SI 0 "register_operand" "r")))
                   3538:    (use (mem:SI (match_operand:SI 1 "register_operand" "r")))]
                   3539:   ""
                   3540:   "fdc 0(0,%0)\;fdc 0(0,%1)\;sync"
                   3541:   [(set_attr "length" "12")])
                   3542: 
                   3543: (define_insn "icacheflush"
                   3544:   [(unspec_volatile [(const_int 2)] 0)
                   3545:    (use (mem:SI (match_operand:SI 0 "register_operand" "r")))
                   3546:    (use (mem:SI (match_operand:SI 1 "register_operand" "r")))
                   3547:    (use (match_operand:SI 2 "register_operand" "r"))
                   3548:    (clobber (match_operand:SI 3 "register_operand" "=&r"))
                   3549:    (clobber (match_operand:SI 4 "register_operand" "=&r"))]
                   3550:   ""
                   3551:   "mfsp %%sr0,%4\;ldsid (0,%2),%3\;mtsp %3,%%sr0\;fic 0(%%sr0,%0)\;fic 0(%%sr0,%1)\;sync\;mtsp %4,%%sr0\;nop\;nop\;nop\;nop\;nop\;nop"
                   3552:   [(set_attr "length" "52")])

unix.superglobalmegacorp.com

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