Annotation of gcc/config/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,branch,cbranch,call,dyncall,address,fpload,fpstore,fpalu,fpcc,fpmul,fpdivsgl,fpdivdbl,fpsqrtsgl,fpsqrtdbl,multi,misc,milli"
                     34:   (const_string "binary"))
                     35: 
                     36: ;; Set true if insn uses call-clobbered intermediate register.
                     37: (define_attr "use_clobbered" "false,true"
                     38:   (if_then_else (and (eq_attr "type" "address")
                     39:                     (match_operand 0 "clobbered_register" ""))
                     40:                (const_string "true")
                     41:                (const_string "false")))
                     42: 
                     43: ;; Length (in # of insns).
                     44: (define_attr "length" ""
                     45:   (cond [(eq_attr "type" "load,fpload")
                     46:         (if_then_else (match_operand 1 "symbolic_memory_operand" "")
                     47:                       (const_int 2) (const_int 1))
                     48: 
                     49:         (eq_attr "type" "store,fpstore")
                     50:         (if_then_else (match_operand 0 "symbolic_memory_operand" "")
                     51:                       (const_int 2) (const_int 1))
                     52: 
                     53:         (eq_attr "type" "address") (const_int 2)
                     54: 
                     55:         (eq_attr "type" "binary")
                     56:         (if_then_else (match_operand 2 "arith_operand" "")
                     57:                       (const_int 1) (const_int 3))
                     58: 
                     59:         (eq_attr "type" "move,unary")
                     60:         (if_then_else (match_operand 1 "arith_operand" "")
                     61:                       (const_int 1) (const_int 2))]
                     62: 
                     63:        (const_int 1)))
                     64: 
                     65: (define_asm_attributes
                     66:   [(set_attr "length" "1")
                     67:    (set_attr "type" "multi")])
                     68: 
                     69: ;; Attributes for instruction and branch scheduling
                     70: 
                     71: (define_attr "in_call_delay" "false,true"
                     72:   (cond [(eq_attr "type" "branch,cbranch,call,dyncall,multi,milli")
                     73:         (const_string "false")
                     74:         
                     75:         (eq_attr "type" "load,fpload,store,fpstore")
                     76:         (if_then_else (eq_attr "length" "1")
                     77:                       (const_string "true")
                     78:                       (const_string "false"))
                     79:         
                     80:         (eq_attr "type" "address")
                     81:         (if_then_else (eq_attr "use_clobbered" "false")
                     82:                       (const_string "true")
                     83:                       (const_string "false"))]
                     84:        
                     85:        (if_then_else (eq_attr "length" "1")
                     86:                      (const_string "true")
                     87:                      (const_string "false"))))
                     88: 
                     89: (define_attr "in_milli_delay" "false,true"
                     90:   (cond [(eq_attr "length" "!1")
                     91:         (const_string "false")
                     92: 
                     93:         (eq_attr "type" "branch,cbranch,call,dyncall,milli")
                     94:         (const_string "false")
                     95: 
                     96:         (ne (symbol_ref "use_milli_regs (insn)") (const_int 0))
                     97:         (const_string "false")]
                     98:        (const_string "true")))
                     99: 
                    100: (define_delay (eq_attr "type" "call")
                    101:   [(eq_attr "in_call_delay" "true") (nil) (nil)])
                    102: 
                    103: (define_attr "in_branch_delay" "false,true"
                    104:   (if_then_else (and (eq_attr "type" "!branch,cbranch,call,multi,milli")
                    105:                     (eq_attr "length" "1"))
                    106:                (const_string "true")
                    107:                (const_string "false")))
                    108: 
                    109: (define_delay (eq_attr "type" "branch")
                    110:   [(eq_attr "in_branch_delay" "true")
                    111:    (eq_attr "in_branch_delay" "true") (nil)])
                    112: 
                    113: (define_delay (eq_attr "type" "cbranch")
                    114:   [(eq_attr "in_branch_delay" "true") (nil) (nil)])
                    115: 
                    116: (define_delay (eq_attr "type" "milli")
                    117:   [(eq_attr "in_milli_delay" "true") (nil) (nil)])
                    118: 
                    119: ;; Function units of the HPPA. The following data is for the "Snake"
                    120: ;; (Mustang CPU + Timex FPU) because that's what I have the docs for.
                    121: ;; Scheduling instructions for PA-83 machines according to the Snake
                    122: ;; constraints shouldn't hurt.
                    123: 
                    124: ;; (define_function_unit {name} {num-units} {n-users} {test}
                    125: ;;                       {ready-delay} {busy-delay} [{conflict-list}])
                    126: 
                    127: ;; The integer ALU.
                    128: ;; (Noted only for documentation; units that take one cycle do not need to
                    129: ;; be specified.)
                    130: 
                    131: ;; (define_function_unit "alu" 1 0
                    132: ;;  (eq_attr "type" "unary,binary,move,address") 1 0)
                    133: 
                    134: 
                    135: ;; Memory. Disregarding Cache misses, the Mustang memory times are:
                    136: ;; load: 1
                    137: ;; store, fpstore: 3, no D-cache operations should be scheduled.
                    138: ;; fpload: 3 (really 2 for flops, but I don't think we can specify that).
                    139: 
                    140: (define_function_unit "memory" 1 1 (eq_attr "type" "load") 1 0)
                    141: (define_function_unit "memory" 1 1 (eq_attr "type" "store,fpstore") 3 0)
                    142: (define_function_unit "memory" 1 1 (eq_attr "type" "fpload") 3 0)
                    143: 
                    144: ;; The Timex has two floating-point units: ALU, and MUL/DIV/SQRT unit.
                    145: ;; Timings:
                    146: ;; Instruction Time    Unit    Minimum Distance (unit contention)
                    147: ;; fcpy                3       ALU     2
                    148: ;; fabs                3       ALU     2
                    149: ;; fadd                3       ALU     2
                    150: ;; fsub                3       ALU     2
                    151: ;; fcmp                3       ALU     2
                    152: ;; fcnv                3       ALU     2
                    153: ;; fmpyadd     3       ALU,MPY 2
                    154: ;; fmpysub     3       ALU,MPY 2
                    155: ;; fmpycfxt    3       ALU,MPY 2
                    156: ;; fmpy                3       MPY     2
                    157: ;; fmpyi       3       MPY     2
                    158: ;; fdiv,sgl    10      MPY     10
                    159: ;; fdiv,dbl    12      MPY     12
                    160: ;; fsqrt,sgl   14      MPY     14
                    161: ;; fsqrt,dbl   18      MPY     18
                    162: 
                    163: (define_function_unit "fp_alu" 1 0 (eq_attr "type" "fpalu") 3 2)
                    164: (define_function_unit "fp_mpy" 1 0 (eq_attr "type" "fpmul") 3 2)
                    165: (define_function_unit "fp_mpy" 1 0 (eq_attr "type" "fpdivsgl") 10 10)
                    166: (define_function_unit "fp_mpy" 1 0 (eq_attr "type" "fpdivdbl") 12 12)
                    167: (define_function_unit "fp_mpy" 1 0 (eq_attr "type" "fpsqrtsgl") 14 14)
                    168: (define_function_unit "fp_mpy" 1 0 (eq_attr "type" "fpsqrtdbl") 18 18)
                    169: 
                    170: ;; Compare instructions.
                    171: ;; This controls RTL generation and register allocation.
                    172: 
                    173: ;; We generate RTL for comparisons and branches by having the cmpxx 
                    174: ;; patterns store away the operands.  Then, the scc and bcc patterns
                    175: ;; emit RTL for both the compare and the branch.
                    176: ;;
                    177: 
                    178: (define_expand "cmpsi"
                    179:   [(set (reg:CC 0)
                    180:        (compare:CC (match_operand:SI 0 "reg_or_0_operand" "")
                    181:                    (match_operand:SI 1 "arith5_operand" "")))]
                    182:   ""
                    183:   "
                    184: {
                    185:  hppa_compare_op0 = operands[0];
                    186:  hppa_compare_op1 = operands[1];
                    187:  hppa_branch_type = CMP_SI;
                    188:  DONE;
                    189: }")
                    190: 
                    191: (define_expand "cmpsf"
                    192:   [(set (reg:CCFP 0)
                    193:        (compare:CCFP (match_operand:SF 0 "register_operand" "")
                    194:                      (match_operand:SF 1 "register_operand" "")))]
                    195:   ""
                    196:   "
                    197: {
                    198:   hppa_compare_op0 = operands[0];
                    199:   hppa_compare_op1 = operands[1];
                    200:   hppa_branch_type = CMP_SF;
                    201:   DONE;
                    202: }")
                    203: 
                    204: (define_expand "cmpdf"
                    205:   [(set (reg:CCFP 0)
                    206:       (compare:CCFP (match_operand:DF 0 "register_operand" "")
                    207:                     (match_operand:DF 1 "register_operand" "")))]
                    208:   ""
                    209:   "
                    210: {
                    211:   hppa_compare_op0 = operands[0];
                    212:   hppa_compare_op1 = operands[1];
                    213:   hppa_branch_type = CMP_DF;
                    214:   DONE;
                    215: }")
                    216: 
                    217: (define_insn ""
                    218:  [(set (reg:CCFP 0)
                    219:        (match_operator:CCFP 2 "comparison_operator"
                    220:                            [(match_operand:SF 0 "register_operand" "fx")
                    221:                             (match_operand:SF 1 "register_operand" "fx")]))]
                    222:  ""
                    223:  "fcmp,sgl,%Y2 %0,%1"
                    224:  [(set_attr "type" "fpcc")])
                    225: 
                    226: (define_insn ""
                    227:  [(set (reg:CCFP 0)
                    228:        (match_operator:CCFP 2 "comparison_operator"
                    229:                            [(match_operand:DF 0 "register_operand" "fx")
                    230:                             (match_operand:DF 1 "register_operand" "fx")]))]
                    231:  ""
                    232:  "fcmp,dbl,%Y2 %0,%1"
                    233:  [(set_attr "type" "fpcc")])
                    234: 
                    235: ;; scc insns.
                    236: 
                    237: (define_insn ""
                    238:   [(set (match_operand:SI 0 "register_operand" "=r")
                    239:        (match_operator:CCFP 1 "comparison_operator" [(reg:CCFP 0)
                    240:                                                      (const_int 0)]))]
                    241:   ""
                    242:   "copy 0,%0\;ftest\;ldi 1,%0"
                    243:   [(set_attr "type" "unary")
                    244:    (set_attr "length" "3")])
                    245: 
                    246: (define_expand "seq"
                    247:   [(set (match_operand:SI 0 "register_operand" "")
                    248:        (eq:CC (match_dup 1)
                    249:               (match_dup 2)))]
                    250:   ""
                    251:   "
                    252: {
                    253:   if (hppa_branch_type != CMP_SI)
                    254:     {
                    255:       emit_insn (gen_cmp_fp (EQ, hppa_compare_op0, hppa_compare_op1));
                    256:       emit_insn (gen_scond_fp (EQ, operands[0]));
                    257:       DONE;
                    258:     }
                    259:   /* set up operands from compare.  */
                    260:   operands[1] = hppa_compare_op0;
                    261:   operands[2] = hppa_compare_op1;
                    262:   /* fall through and generate default code */
                    263: }")
                    264: 
                    265: (define_expand "sne"
                    266:   [(set (match_operand:SI 0 "register_operand" "=r")
                    267:        (ne:CC (match_dup 1)
                    268:               (match_dup 2)))]
                    269:   ""
                    270:   "
                    271: {
                    272:   if (hppa_branch_type != CMP_SI)
                    273:     {
                    274:       emit_insn (gen_cmp_fp (NE, hppa_compare_op0, hppa_compare_op1));
                    275:       emit_insn (gen_scond_fp (NE, operands[0]));
                    276:       DONE;
                    277:     }
                    278:   operands[1] = hppa_compare_op0;
                    279:   operands[2] = hppa_compare_op1;
                    280: }")
                    281: 
                    282: (define_expand "slt"
                    283:   [(set (match_operand:SI 0 "register_operand" "=r")
                    284:        (lt:CC (match_dup 1)
                    285:               (match_dup 2)))]
                    286:   ""
                    287:   "
                    288: {
                    289:   if (hppa_branch_type != CMP_SI)
                    290:     {
                    291:       emit_insn (gen_cmp_fp (LT, hppa_compare_op0, hppa_compare_op1));
                    292:       emit_insn (gen_scond_fp (LT, operands[0]));
                    293:       DONE;
                    294:     }
                    295:   operands[1] = hppa_compare_op0;
                    296:   operands[2] = hppa_compare_op1;
                    297: }")
                    298: 
                    299: (define_expand "sgt"
                    300:   [(set (match_operand:SI 0 "register_operand" "=r")
                    301:        (gt:CC (match_dup 1)
                    302:               (match_dup 2)))]
                    303:   ""
                    304:   "
                    305: {
                    306:   if (hppa_branch_type != CMP_SI)
                    307:     {
                    308:       emit_insn (gen_cmp_fp (GT, hppa_compare_op0, hppa_compare_op1));
                    309:       emit_insn (gen_scond_fp (GT, operands[0]));
                    310:       DONE;
                    311:     }
                    312:   operands[1] = hppa_compare_op0;
                    313:   operands[2] = hppa_compare_op1;
                    314: }")
                    315: 
                    316: (define_expand "sle"
                    317:   [(set (match_operand:SI 0 "register_operand" "=r")
                    318:        (le:CC (match_dup 1)
                    319:               (match_dup 2)))]
                    320:   ""
                    321:   "
                    322: {
                    323:   if (hppa_branch_type != CMP_SI)
                    324:     {
                    325:       emit_insn (gen_cmp_fp (LE, hppa_compare_op0, hppa_compare_op1));
                    326:       emit_insn (gen_scond_fp (LE, operands[0]));
                    327:       DONE;
                    328:     }
                    329:   operands[1] = hppa_compare_op0;
                    330:   operands[2] = hppa_compare_op1;
                    331: }")
                    332: 
                    333: (define_expand "sge"
                    334:   [(set (match_operand:SI 0 "register_operand" "=r")
                    335:        (ge:CC (match_dup 1)
                    336:               (match_dup 2)))]
                    337:   ""
                    338:   "
                    339: {
                    340:   if (hppa_branch_type != CMP_SI)
                    341:     {
                    342:       emit_insn (gen_cmp_fp (GE, hppa_compare_op0, hppa_compare_op1));
                    343:       emit_insn (gen_scond_fp (GE, operands[0]));
                    344:       DONE;
                    345:     }
                    346:   operands[1] = hppa_compare_op0;
                    347:   operands[2] = hppa_compare_op1;
                    348: }")
                    349: 
                    350: (define_expand "sltu"
                    351:   [(set (match_operand:SI 0 "register_operand" "=r")
                    352:        (ltu:CC (match_dup 1)
                    353:                (match_dup 2)))]
                    354:   ""
                    355:   "
                    356: {
                    357:   if (hppa_branch_type != CMP_SI)
                    358:     FAIL;
                    359:   operands[1] = hppa_compare_op0;
                    360:   operands[2] = hppa_compare_op1;
                    361: }")
                    362: 
                    363: (define_expand "sgtu"
                    364:   [(set (match_operand:SI 0 "register_operand" "=r")
                    365:        (gtu:CC (match_dup 1)
                    366:                (match_dup 2)))]
                    367:   ""
                    368:   "
                    369: {
                    370:   if (hppa_branch_type != CMP_SI)
                    371:     FAIL;
                    372:   operands[1] = hppa_compare_op0;
                    373:   operands[2] = hppa_compare_op1;
                    374: }")
                    375: 
                    376: (define_expand "sleu"
                    377:   [(set (match_operand:SI 0 "register_operand" "=r")
                    378:        (leu:CC (match_dup 1)
                    379:                (match_dup 2)))]
                    380:   ""
                    381:   "
                    382: {
                    383:   if (hppa_branch_type != CMP_SI)
                    384:     FAIL;
                    385:   operands[1] = hppa_compare_op0;
                    386:   operands[2] = hppa_compare_op1;
                    387: }")
                    388: 
                    389: (define_expand "sgeu"
                    390:   [(set (match_operand:SI 0 "register_operand" "=r")
                    391:        (geu:CC (match_dup 1)
                    392:                (match_dup 2)))]
                    393:   ""
                    394:   "
                    395: {
                    396:   if (hppa_branch_type != CMP_SI)
                    397:     FAIL;
                    398:   operands[1] = hppa_compare_op0;
                    399:   operands[2] = hppa_compare_op1;
                    400: }")
                    401: 
                    402: ;; Instruction canonicalization puts immediate operands second, which
                    403: ;; is the reverse of what we want.
                    404: 
                    405: (define_insn ""
                    406:   [(set (match_operand:SI 0 "register_operand" "=r,r")
                    407:        (match_operator:CC 3 "comparison_operator"
                    408:                           [(match_operand:SI 1 "register_operand" "r,r")
                    409:                            (match_operand:SI 2  "arith11_operand" "r,I")]))]
                    410:   ""
                    411:   "*
                    412: {
                    413:   if (which_alternative == 0)
                    414:     return \"comclr,%N3 %1,%2,%0\;ldi 1,%0\";
                    415:   else
                    416:     {
                    417:       if (!(GET_CODE (operands[3]) == EQ || GET_CODE (operands[3]) == NE))
                    418:        PUT_CODE (operands[3], reverse_relop (GET_CODE (operands[3])));
                    419:       output_asm_insn (\"comiclr,%N3 %2,%1,%0\;ldi 1,%0\", operands);
                    420:       return \"\";
                    421:     }
                    422: }"
                    423:   [(set_attr "type" "binary")
                    424:    (set_attr "length" "2")])
                    425: 
                    426: ;; Conditionals
                    427: 
                    428: (define_expand "beq"
                    429:   [(set (pc)
                    430:        (if_then_else (eq (match_dup 1) (match_dup 2))
                    431:                      (label_ref (match_operand 0 "" ""))
                    432:                      (pc)))]
                    433:   ""
                    434:   "
                    435: {
                    436:   if (hppa_branch_type != CMP_SI)
                    437:     {
                    438:       emit_insn (gen_cmp_fp (EQ, hppa_compare_op0, hppa_compare_op1));
                    439:       emit_bcond_fp (NE, operands[0]);
                    440:       DONE;
                    441:     }
                    442:   /* set up operands from compare.  */
                    443:   operands[1] = hppa_compare_op0;
                    444:   operands[2] = hppa_compare_op1;
                    445:   /* fall through and generate default code */
                    446: }")
                    447: 
                    448: (define_expand "bne"
                    449:   [(set (pc)
                    450:        (if_then_else (ne (match_dup 1) (match_dup 2))
                    451:                      (label_ref (match_operand 0 "" ""))
                    452:                      (pc)))]
                    453:   ""
                    454:   "
                    455: {
                    456:   if (hppa_branch_type != CMP_SI)
                    457:     {
                    458:       emit_insn (gen_cmp_fp (NE, hppa_compare_op0, hppa_compare_op1));
                    459:       emit_bcond_fp (NE, operands[0]);
                    460:       DONE;
                    461:     }
                    462:   operands[1] = hppa_compare_op0;
                    463:   operands[2] = hppa_compare_op1;
                    464: }")
                    465: 
                    466: (define_expand "bgt"
                    467:   [(set (pc)
                    468:        (if_then_else (gt (match_dup 1) (match_dup 2))
                    469:                      (label_ref (match_operand 0 "" ""))
                    470:                      (pc)))]
                    471:   ""
                    472:   "
                    473: {
                    474:   if (hppa_branch_type != CMP_SI)
                    475:     {
                    476:       emit_insn (gen_cmp_fp (GT, hppa_compare_op0, hppa_compare_op1));
                    477:       emit_bcond_fp (NE, operands[0]);
                    478:       DONE;
                    479:     }
                    480:   operands[1] = hppa_compare_op0;
                    481:   operands[2] = hppa_compare_op1;
                    482: }")
                    483: 
                    484: (define_expand "blt"
                    485:   [(set (pc)
                    486:        (if_then_else (lt (match_dup 1) (match_dup 2))
                    487:                      (label_ref (match_operand 0 "" ""))
                    488:                      (pc)))]
                    489:   ""
                    490:   "
                    491: {
                    492:   if (hppa_branch_type != CMP_SI)
                    493:     {
                    494:       emit_insn (gen_cmp_fp (LT, hppa_compare_op0, hppa_compare_op1));
                    495:       emit_bcond_fp (NE, operands[0]);
                    496:       DONE;
                    497:     }
                    498:   operands[1] = hppa_compare_op0;
                    499:   operands[2] = hppa_compare_op1;
                    500: }")
                    501: 
                    502: (define_expand "bge"
                    503:   [(set (pc)
                    504:        (if_then_else (ge (match_dup 1) (match_dup 2))
                    505:                      (label_ref (match_operand 0 "" ""))
                    506:                      (pc)))]
                    507:   ""
                    508:   "
                    509: {
                    510:   if (hppa_branch_type != CMP_SI)
                    511:     {
                    512:       emit_insn (gen_cmp_fp (GE, hppa_compare_op0, hppa_compare_op1));
                    513:       emit_bcond_fp (NE, operands[0]);
                    514:       DONE;
                    515:     }
                    516:   operands[1] = hppa_compare_op0;
                    517:   operands[2] = hppa_compare_op1;
                    518: }")
                    519: 
                    520: (define_expand "ble"
                    521:   [(set (pc)
                    522:        (if_then_else (le (match_dup 1) (match_dup 2))
                    523:                      (label_ref (match_operand 0 "" ""))
                    524:                      (pc)))]
                    525:   ""
                    526:   "
                    527: {
                    528:   if (hppa_branch_type != CMP_SI)
                    529:     {
                    530:       emit_insn (gen_cmp_fp (LE, hppa_compare_op0, hppa_compare_op1));
                    531:       emit_bcond_fp (NE, operands[0]);
                    532:       DONE;
                    533:     }
                    534:   operands[1] = hppa_compare_op0;
                    535:   operands[2] = hppa_compare_op1;
                    536: }")
                    537: 
                    538: (define_expand "bgtu"
                    539:   [(set (pc)
                    540:        (if_then_else (gtu (match_dup 1) (match_dup 2))
                    541:                      (label_ref (match_operand 0 "" ""))
                    542:                      (pc)))]
                    543:   ""
                    544:   "
                    545: {
                    546:   if (hppa_branch_type != CMP_SI)
                    547:     FAIL;
                    548:   operands[1] = hppa_compare_op0;
                    549:   operands[2] = hppa_compare_op1;
                    550: }")
                    551: 
                    552: (define_expand "bltu"
                    553:   [(set (pc)
                    554:        (if_then_else (ltu (match_dup 1) (match_dup 2))
                    555:                      (label_ref (match_operand 0 "" ""))
                    556:                      (pc)))]
                    557:   ""
                    558:   "
                    559: {
                    560:   if (hppa_branch_type != CMP_SI)
                    561:     FAIL;
                    562:   operands[1] = hppa_compare_op0;
                    563:   operands[2] = hppa_compare_op1;
                    564: }")
                    565: 
                    566: (define_expand "bgeu"
                    567:   [(set (pc)
                    568:        (if_then_else (geu (match_dup 1) (match_dup 2))
                    569:                      (label_ref (match_operand 0 "" ""))
                    570:                      (pc)))]
                    571:   ""
                    572:   "
                    573: {
                    574:   if (hppa_branch_type != CMP_SI)
                    575:     FAIL;
                    576:   operands[1] = hppa_compare_op0;
                    577:   operands[2] = hppa_compare_op1;
                    578: }")
                    579: 
                    580: (define_expand "bleu"
                    581:   [(set (pc)
                    582:        (if_then_else (leu (match_dup 1) (match_dup 2))
                    583:                      (label_ref (match_operand 0 "" ""))
                    584:                      (pc)))]
                    585:   ""
                    586:   "
                    587: {
                    588:   if (hppa_branch_type != CMP_SI)
                    589:     FAIL;
                    590:   operands[1] = hppa_compare_op0;
                    591:   operands[2] = hppa_compare_op1;
                    592: }")
                    593: 
                    594: ;; Match the branch patterns.
                    595: 
                    596: (define_insn ""
                    597:   [(set (pc)
                    598:        (if_then_else
                    599:         (match_operator 3 "comparison_operator"
                    600:                         [(match_operand:SI 1 "register_operand" "r,r")
                    601:                          (match_operand:SI 2 "arith5_operand" "r,L")])
                    602:         (label_ref (match_operand 0 "" ""))
                    603:         (pc)))]
                    604:   ""
                    605:   "*
                    606: {
                    607:   if (which_alternative == 0)
                    608:     return (get_attr_length (insn) == 1
                    609:            ? \"comb,%C3 %1,%2,%0%#\" : \"comclr,%N3 %1,%2,0\;bl %0,0%#\");
                    610:     {
                    611:       enum rtx_code comp_code = GET_CODE (operands[3]);
                    612:       if (!(comp_code == EQ || comp_code == NE))
                    613:        PUT_CODE (operands[3], reverse_relop (comp_code));
                    614:       if (get_attr_length (insn) == 1)
                    615:        output_asm_insn (\"comib,%C3 %2,%1,%0%#\", operands);
                    616:       else
                    617:        output_asm_insn (\"comiclr,%N3 %2,%1,0\;bl %0,0%#\", operands);
                    618:       return \"\";
                    619:     }
                    620: }"
                    621: [(set_attr "type" "cbranch")
                    622:  (set (attr "length") (if_then_else (lt (abs (minus (match_dup 0)
                    623:                                                    (plus (pc) (const_int 2))))
                    624:                                        (const_int 1023))
                    625:                                    (const_int 1)
                    626:                                    (const_int 2)))])
                    627: 
                    628: ;; Match the negated branch.
                    629: 
                    630: (define_insn ""
                    631:   [(set (pc)
                    632:        (if_then_else
                    633:         (match_operator 3 "comparison_operator"
                    634:                         [(match_operand:SI 1 "register_operand" "r,r")
                    635:                          (match_operand:SI 2 "arith5_operand" "r,L")])
                    636:         (pc)
                    637:         (label_ref (match_operand 0 "" ""))))]
                    638:   ""
                    639:   "*
                    640: {
                    641:   if (which_alternative == 0)
                    642:     return (get_attr_length (insn) == 1
                    643:            ? \"comb,%N3 %1,%2,%0%#\" : \"comclr,%C3 %1,%2,0\;bl %0,0%#\");
                    644:     {
                    645:       enum rtx_code comp_code = GET_CODE (operands[3]);
                    646:       if (!(comp_code == EQ || comp_code == NE))
                    647:        PUT_CODE (operands[3], reverse_relop (comp_code));
                    648:       if (get_attr_length (insn) == 1)
                    649:        output_asm_insn (\"comib,%N3 %2,%1,%0%#\", operands);
                    650:       else
                    651:        output_asm_insn (\"comiclr,%C3 %2,%1,0%#\;bl %0,0%#\", operands);
                    652:       return \"\";
                    653:     }
                    654: }"
                    655: [(set_attr "type" "cbranch")
                    656:  (set (attr "length") (if_then_else (lt (abs (minus (match_dup 0)
                    657:                                                    (plus (pc) (const_int 2))))
                    658:                                        (const_int 1023))
                    659:                                    (const_int 1)
                    660:                                    (const_int 2)))])
                    661: 
                    662: ;; Floating point branches
                    663: 
                    664: (define_insn ""
                    665:   [(set (pc) (if_then_else (ne (reg:CCFP 0) (const_int 0))
                    666:                           (label_ref (match_operand 0 "" ""))
                    667:                           (pc)))]
                    668:   ""
                    669:   "ftest\;bl%* %0,0"
                    670:   [(set_attr "type" "cbranch")
                    671:    (set_attr "length" "2")])
                    672: 
                    673: (define_insn ""
                    674:   [(set (pc) (if_then_else (ne (reg:CCFP 0) (const_int 0))
                    675:                           (pc)
                    676:                           (label_ref (match_operand 0 "" ""))))]
                    677:   ""
                    678:   "ftest\;add,tr 0,0,0\;bl%* %0,0"
                    679:   [(set_attr "type" "cbranch")
                    680:    (set_attr "length" "3")])
                    681: 
                    682: ;; Move instructions
                    683: 
                    684: (define_expand "movsi"
                    685:   [(set (match_operand:SI 0 "general_operand" "")
                    686:        (match_operand:SI 1 "general_operand" ""))]
                    687:   ""
                    688:   "
                    689: {
                    690:   if (emit_move_sequence (operands, SImode))
                    691:     DONE;
                    692: }")
                    693: 
                    694: ;; Moves to and from the shift register.
                    695: 
                    696: (define_insn ""
                    697:   [(set (reg:SI 112)
                    698:        (match_operand:SI 0 "register_operand" "r"))]
                    699:   ""
                    700:   "mtsar %0"
                    701:   [(set_attr "type" "move")])
                    702: 
                    703: (define_insn ""
                    704:   [(set (match_operand:SI 0 "register_operand" "=r")
                    705:        (reg:SI 112))]
                    706:   ""
                    707:   "mfctl 11,%0"
                    708:   [(set_attr "type" "move")])
                    709: 
                    710: (define_insn ""
                    711:   [(set (match_operand:SI 0 "reg_or_nonsymb_mem_operand"
                    712:                          "=r,r,Q,!r,!*f*x,!*f*x")
                    713:        (match_operand:SI 1 "move_operand" "rM,Q,rM,!*f*x*y,!r,!*f*x"))]
                    714:   ""
                    715:   "@
                    716:    copy %r1,%0
                    717:    ldw%M1 %1,%0
                    718:    stw%M0 %r1,%0
                    719:    fstws %1,-16(30)\;ldw -16(30),%0
                    720:    stw %1,-16(30)\;fldws -16(30),%0
                    721:    fcpy,sgl %1,%0"
                    722:   [(set_attr "type" "move,load,store,move,move,fpalu")
                    723:    (set_attr "length" "1,1,1,2,2,1")])
                    724: 
                    725: ;; For pic
                    726: (define_insn ""
                    727:   [(set (match_operand:SI 0 "register_operand" "=r")
                    728:        (match_operand:SI 1 "pic_operand" "i"))
                    729:    (clobber (match_scratch:SI 2 "=a"))]
                    730:   ""
                    731:   "*
                    732: {
                    733:   rtx label_rtx = gen_label_rtx ();
                    734:   rtx xoperands[3];
                    735:   extern FILE *asm_out_file;
                    736: 
                    737:   xoperands[0] = operands[0];
                    738:   xoperands[1] = operands[1];
                    739:   xoperands[2] = label_rtx;
                    740:   output_asm_insn (\"bl .+8,%0\;addil L'%1-%2,%0\", xoperands);
                    741:   ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, \"L\", CODE_LABEL_NUMBER (label_rtx));
                    742:   output_asm_insn (\"ldo R'%1(1),%0\", xoperands);
                    743:   return \"\";
                    744:   }
                    745: "
                    746:   [(set_attr "type" "multi")
                    747:    (set_attr "length" "3")])
                    748: 
                    749: (define_insn ""
                    750:   [(set (match_operand:SI 0 "register_operand" "=r")
                    751:        (match_operand:SI 1 "immediate_operand" "n"))]
                    752:   "(GET_CODE (operands[1]) == CONST_INT) &&
                    753:    (INT_14_BITS (operands[1]) || !(INTVAL (operands[1]) & 0x7ff))"
                    754:   "*
                    755: {
                    756:   if (INT_14_BITS (operands[1]))
                    757:     return \"ldo %1(0),%0\";
                    758:   else
                    759:     return \"ldil L'%1,%0\";
                    760: }"
                    761:   [(set_attr "type" "move")
                    762:    (set_attr "length" "1")])
                    763: 
                    764: (define_insn ""
                    765:   [(set (match_operand:SI 0 "register_operand" "=a,?*r")
                    766:        (plus:SI (match_operand:SI 1 "register_operand" "r,r")
                    767:                 (high:SI (match_operand 2 "" ""))))]
                    768:   ""
                    769:   "@
                    770:    addil L'%G2,%1
                    771:    ldil L'%G2,%0\;add %0,%1,%0"
                    772:   [(set_attr "type" "binary")
                    773:    (set_attr "length" "1,2")])
                    774: 
                    775: (define_split
                    776:   [(set (match_operand:SI 0 "register_operand" "")
                    777:        (plus:SI (match_operand:SI 1 "register_operand" "")
                    778:                 (high:SI (match_operand 2 "" ""))))]
                    779:   "reload_completed && REGNO (operands[0]) != 1"
                    780:   [(set (match_dup 0) (high:SI (match_dup 2)))
                    781:    (set (match_dup 0) (plus:SI (match_dup 0) (match_dup 1)))]
                    782:   "")
                    783: 
                    784: (define_insn ""
                    785:   [(set (match_operand:SI 0 "register_operand" "=r")
                    786:        (high:SI (match_operand 1 "" "")))]
                    787:   "check_pic (1)"
                    788:   "ldil L'%G1,%0"
                    789:   [(set_attr "type" "move")
                    790:    (set_attr "length" "1")])
                    791: 
                    792: (define_insn ""
                    793:   [(set (match_operand:HI 0 "register_operand" "=r")
                    794:        (high:HI (match_operand 1 "" "")))]
                    795:   "check_pic (1)"
                    796:   "ldil L'%G1,%0"
                    797:   [(set_attr "type" "move")
                    798:    (set_attr "length" "1")])
                    799: 
                    800: (define_insn ""
                    801:   [(set (match_operand:SI 0 "register_operand" "=r")
                    802:        (lo_sum:SI (match_operand:SI 1 "register_operand" "r")
                    803:                   (match_operand:SI 2 "immediate_operand" "in")))]
                    804:   ""
                    805:   "ldo R'%G2(%1),%0"
                    806:   ;; Need to set length for this arith insn because operand2
                    807:   ;; is not an "arith_operand".
                    808:   [(set_attr "length" "1")])
                    809: 
                    810: ;;; Experimental
                    811: 
                    812: (define_insn ""
                    813:   [(set (match_operand:SI 0 "fp_reg_operand" "*f*x")
                    814:        (match_operand:SI 1 "short_memory_operand" "T"))]
                    815:   ""
                    816:   "fldws%F1 %1,%0"
                    817:   [(set_attr "type" "fpload")
                    818:    (set_attr "length" "1")])
                    819: 
                    820: (define_insn ""
                    821:   [(set (match_operand:SI 0 "short_memory_operand" "T")
                    822:        (match_operand:SI 1 "fp_reg_operand" "*f*x"))]
                    823:   ""
                    824:   "fstws%F0 %1,%0"
                    825:   [(set_attr "type" "fpstore")
                    826:    (set_attr "length" "1")])
                    827: 
                    828: (define_expand "movhi"
                    829:   [(set (match_operand:HI 0 "general_operand" "")
                    830:        (match_operand:HI 1 "general_operand" ""))]
                    831:   ""
                    832:   "
                    833: {
                    834:   if (emit_move_sequence (operands, HImode))
                    835:     DONE;
                    836: }")
                    837: 
                    838: (define_insn ""
                    839:   [(set (match_operand:HI 0 "reg_or_nonsymb_mem_operand" "=r,r,Q")
                    840:        (match_operand:HI 1 "move_operand" "rM,Q,rM"))]
                    841:   ""
                    842:   "@
                    843:    copy %r1,%0
                    844:    ldh%M1 %1,%0
                    845:    sth%M0 %r1,%0"
                    846:   [(set_attr "type" "move,load,store")
                    847:    (set_attr "length" "1,1,1")])
                    848: 
                    849: (define_insn ""
                    850:   [(set (match_operand:HI 0 "register_operand" "=r")
                    851:        (match_operand:HI 1 "immediate_operand" "n"))]
                    852:   "(GET_CODE (operands[1]) == CONST_INT) &&
                    853:    (INT_14_BITS (operands[1]) || !(INTVAL (operands[1]) & 0x7ff))"
                    854:   "*
                    855: {
                    856:   if (INT_14_BITS (operands[1]))
                    857:     return \"ldo %1(0),%0\";
                    858:   else
                    859:     return \"ldil L'%1,%0\";
                    860: }"
                    861:   [(set_attr "type" "move")
                    862:    (set_attr "length" "1")])
                    863: 
                    864: (define_insn ""
                    865:   [(set (match_operand:HI 0 "register_operand" "=r")
                    866:        (lo_sum:HI (match_operand:HI 1 "register_operand" "r")
                    867:                   (match_operand 2 "immediate_operand" "in")))]
                    868:   ""
                    869:   "ldo R'%G2(%1),%0"
                    870:   [(set_attr "length" "1")])
                    871: 
                    872: (define_expand "movqi"
                    873:   [(set (match_operand:QI 0 "general_operand" "")
                    874:        (match_operand:QI 1 "general_operand" ""))]
                    875:   ""
                    876:   "
                    877: {
                    878:   if (emit_move_sequence (operands, QImode))
                    879:     DONE;
                    880: }")
                    881: 
                    882: (define_insn ""
                    883:   [(set (match_operand:QI 0 "reg_or_nonsymb_mem_operand" "=r,r,Q")
                    884:        (match_operand:QI 1 "move_operand" "rM,Q,rM"))]
                    885:   ""
                    886:   "@
                    887:    copy %r1,%0
                    888:    ldb%M1 %1,%0
                    889:    stb%M0 %r1,%0"
                    890:   [(set_attr "type" "move,load,store")
                    891:    (set_attr "length" "1,1,1")])
                    892: 
                    893: (define_insn ""
                    894:   [(set (match_operand:QI 0 "register_operand" "=r")
                    895:        (match_operand:QI 1 "immediate_operand" "J"))]
                    896:   ""
                    897:   "ldo %1(0),%0"
                    898:   [(set_attr "type" "move")
                    899:    (set_attr "length" "1")])
                    900: 
                    901: (define_insn ""
                    902:   [(set (match_operand:QI 0 "register_operand" "=r")
                    903:        (subreg:QI (lo_sum:SI (match_operand:QI 1 "register_operand" "r")
                    904:                              (match_operand 2 "immediate_operand" "in")) 0))]
                    905:   ""
                    906:   "ldo R'%G2(%1),%0"
                    907:   [(set_attr "length" "1")])
                    908: 
                    909: ;; The definition of this insn does not really explain what it does,
                    910: ;; but it should suffice
                    911: ;; that anything generated as this insn will be recognized as one
                    912: ;; and that it will not successfully combine with anything.
                    913: (define_expand "movstrsi"
                    914:   [(parallel [(set (mem:BLK (match_operand:BLK 0 "general_operand" ""))
                    915:                   (mem:BLK (match_operand:BLK 1 "general_operand" "")))
                    916:              (clobber (match_dup 0))
                    917:              (clobber (match_dup 1))
                    918:              (clobber (match_scratch:SI 4 ""))
                    919:              (clobber (match_scratch:SI 5 ""))
                    920:              (use (match_operand:SI 2 "arith_operand" ""))
                    921:              (use (match_operand:SI 3 "const_int_operand" ""))])]
                    922:   ""
                    923:   "
                    924: {
                    925:   /* If the blocks are not word-aligned and rather big (>16 items),
                    926:      or the size is indeterminate, don't inline the copy code.  A
                    927:      procedure call is better since it can check the alignment at
                    928:      runtime and make the optimal decisions.  */
                    929:      if (INTVAL (operands[3]) != 4
                    930:         && (GET_CODE (operands[2]) != CONST_INT
                    931:             || (INTVAL (operands[2]) / INTVAL (operands[3]) > 16)))
                    932:        FAIL;
                    933: 
                    934:   operands[0] = copy_to_mode_reg (SImode, XEXP (operands[0], 0));
                    935:   operands[1] = copy_to_mode_reg (SImode, XEXP (operands[1], 0));
                    936:   operands[2] = force_not_mem (operands[2]);
                    937: }")
                    938: 
                    939: ;; The operand constraints are written like this to support both compile-time
                    940: ;; and run-time determined byte count.  If the count is run-time determined,
                    941: ;; the register with the byte count is clobbered by the copying code, and
                    942: ;; therefore it is forced to operand 2.  If the count is compile-time
                    943: ;; determined, we need two scratch registers for the unrolled code.
                    944: (define_insn ""
                    945:   [(set (mem:BLK (match_operand:SI 0 "register_operand" "r,r"))
                    946:        (mem:BLK (match_operand:SI 1 "register_operand" "r,r")))
                    947:    (clobber (match_dup 0))
                    948:    (clobber (match_dup 1))
                    949:    (clobber (match_scratch:SI 2 "=r,r"))                ;loop cnt/item tmp
                    950:    (clobber (match_scratch:SI 3 "=r,r"))                ;item tmp
                    951:    (use (match_operand:SI 4 "arith_operand" "J,2"))     ;byte count
                    952:    (use (match_operand:SI 5 "const_int_operand" "n,n"))] ;alignment
                    953:   ""
                    954:   "* return output_block_move (operands, !which_alternative);"
                    955:   [(set_attr "type" "multi")])
                    956: 
                    957: ;; Floating point move insns
                    958: 
                    959: ;; This pattern forces (set (reg:DF ...) (const_double ...))
                    960: ;; to be reloaded by putting the constant into memory.
                    961: ;; It must come before the more general movdf pattern.
                    962: (define_insn ""
                    963:   [(set (match_operand:DF 0 "general_operand" "=?r,r,fx")
                    964:        (match_operand:DF 1 "" "?E,G,m"))]
                    965:   "GET_CODE (operands[1]) == CONST_DOUBLE"
                    966:   "*
                    967: {
                    968:   switch (which_alternative)
                    969:     {
                    970:     case 0:
                    971:       return output_move_double (operands);
                    972:     case 1:
                    973:       return \"copy 0,%0\;copy 0,%R0\";
                    974:     case 2:
                    975:       return output_fp_move_double (operands);
                    976:     }
                    977: }"
                    978:   [(set_attr "type" "load,move,fpload")
                    979:    (set_attr "length" "3,2,3")])
                    980: 
                    981: (define_expand "movdf"
                    982:   [(set (match_operand:DF 0 "general_operand" "")
                    983:        (match_operand:DF 1 "general_operand" ""))]
                    984:   ""
                    985:   "
                    986: {
                    987:   if (emit_move_sequence (operands, DFmode))
                    988:     DONE;
                    989: }")
                    990: 
                    991: (define_insn ""
                    992:   [(set (match_operand:DF 0 "reg_or_nonsymb_mem_operand"
                    993:                          "=fx,r,Q,Q,fx,&r,?fx,?r")
                    994:        (match_operand:DF 1 "reg_or_nonsymb_mem_operand"
                    995:                          "fx,r,fx,r,Q,Q,r,fx"))]
                    996:   ""
                    997:   "*
                    998: {
                    999:   if (FP_REG_P (operands[0]) || FP_REG_P (operands[1]))
                   1000:     return output_fp_move_double (operands);
                   1001:   return output_move_double (operands);
                   1002: }"
                   1003:   [(set_attr "type" "fpalu,move,fpstore,store,fpload,load,multi,multi")
                   1004:    (set_attr "length" "1,2,1,2,1,2,3,3")])
                   1005: 
                   1006: (define_expand "movdi"
                   1007:   [(set (match_operand:DI 0 "reg_or_nonsymb_mem_operand" "")
                   1008:        (match_operand:DI 1 "general_operand" ""))]
                   1009:   ""
                   1010:   "
                   1011: {
                   1012:   if (emit_move_sequence (operands, DImode))
                   1013:     DONE;
                   1014: }")
                   1015: 
                   1016: (define_insn ""
                   1017:   [(set (match_operand:DI 0 "register_operand" "=r")
                   1018:        (high:DI (match_operand 1 "" "")))]
                   1019:   "check_pic (1)"
                   1020:   "*
                   1021: {
                   1022:   rtx op0 = operands[0];
                   1023:   rtx op1 = operands[1];
                   1024: 
                   1025:   if (GET_CODE (op1) == CONST_INT)
                   1026:     {
                   1027:       operands[0] = operand_subword (op0, 1, 0, DImode);
                   1028:       output_asm_insn (\"ldil L'%1,%0\", operands);
                   1029: 
                   1030:       operands[0] = operand_subword (op0, 0, 0, DImode);
                   1031:       if (INTVAL (op1) < 0)
                   1032:        output_asm_insn (\"ldo -1(0),%0\", operands);
                   1033:       else
                   1034:        output_asm_insn (\"ldo 0(0),%0\", operands);
                   1035:     }
                   1036:   else if (GET_CODE (op1) == CONST_DOUBLE)
                   1037:     {
                   1038:       operands[0] = operand_subword (op0, 1, 0, DImode);
                   1039:       operands[1] = gen_rtx (CONST_INT, VOIDmode, CONST_DOUBLE_LOW (op1));
                   1040:       output_asm_insn (\"ldil L'%1,%0\", operands);
                   1041: 
                   1042:       operands[0] = operand_subword (op0, 0, 0, DImode);
                   1043:       operands[1] = gen_rtx (CONST_INT, VOIDmode, CONST_DOUBLE_HIGH (op1));
                   1044:       output_asm_insn (singlemove_string (operands), operands);
                   1045:     }
                   1046:   else
                   1047:     abort ();
                   1048: }"
                   1049:   [(set_attr "type" "move")
                   1050:    (set_attr "length" "2")])
                   1051: 
                   1052: (define_insn ""
                   1053:   [(set (match_operand:DI 0 "reg_or_nonsymb_mem_operand"
                   1054:                          "=r,Q,&r,&r,*f*x,*f*x,*f*x,r,Q")
                   1055:        (match_operand:DI 1 "general_operand"
                   1056:                          "r,r,Q,i,r,*f*x,Q,*f*x,*f*x"))]
                   1057:   ""
                   1058:   "*
                   1059: {
                   1060:   if (FP_REG_P (operands[0]) || FP_REG_P (operands[1]))
                   1061:     return output_fp_move_double (operands);
                   1062:   return output_move_double (operands);
                   1063: }"
                   1064:   [(set_attr "type" "move,store,load,misc,multi,fpalu,fpload,multi,fpstore")
                   1065:    (set_attr "length" "2,3,3,3,3,2,3,3,3")])
                   1066: 
                   1067: (define_insn ""
                   1068:   [(set (match_operand:DI 0 "register_operand" "=r,r")
                   1069:        (lo_sum:DI (match_operand:DI 1 "register_operand" "0,r")
                   1070:                   (match_operand:DI 2 "immediate_operand" "in,in")))]
                   1071:   ""
                   1072:   "*
                   1073: {
                   1074:   /* Don't output a 64 bit constant, since we can't trust the assembler to
                   1075:      handle it correctly.  */
                   1076:   if (GET_CODE (operands[2]) == CONST_DOUBLE)
                   1077:     operands[2] = gen_rtx (CONST_INT, VOIDmode, CONST_DOUBLE_LOW (operands[2]));
                   1078:   if (which_alternative == 1)
                   1079:     output_asm_insn (\"copy %1,%0\", operands);
                   1080:   return \"ldo R'%G2(%R1),%R0\";
                   1081: }"
                   1082:   ;; Need to set length for this arith insn because operand2
                   1083:   ;; is not an "arith_operand".
                   1084:   [(set_attr "length" "1,2")])
                   1085: 
                   1086: (define_expand "movsf"
                   1087:   [(set (match_operand:SF 0 "general_operand" "")
                   1088:        (match_operand:SF 1 "general_operand" ""))]
                   1089:   ""
                   1090:   "
                   1091: {
                   1092:   if (emit_move_sequence (operands, SFmode))
                   1093:     DONE;
                   1094: }")
                   1095: 
                   1096: (define_insn ""
                   1097:   [(set (match_operand:SF 0 "reg_or_nonsymb_mem_operand"
                   1098:                          "=fx,r,r,fx,fx,r,Q,Q")
                   1099:        (match_operand:SF 1 "reg_or_nonsymb_mem_operand"
                   1100:                          "fx,r,!fx,!r,Q,Q,fx,r"))]
                   1101:   ""
                   1102:   "@
                   1103:    fcpy %1,%0
                   1104:    copy %1,%0
                   1105:    fstws %1,-16(0,30)\;ldw -16(0,30),%0
                   1106:    stw %r1,-16(0,30)\;fldws -16(0,30),%0
                   1107:    fldws%F1 %1,%0
                   1108:    ldw%M1 %1,%0
                   1109:    fstws%F0 %r1,%0
                   1110:    stw%M0 %r1,%0"
                   1111:   [(set_attr "type" "fpalu,move,multi,multi,fpload,load,fpstore,store")
                   1112:    (set_attr "length" "1,1,2,2,1,1,1,1")])
                   1113: 
                   1114: 
                   1115: ;;- zero extension instructions
                   1116: 
                   1117: ;; Note that the one starting from HImode comes before those for QImode
                   1118: ;; so that a constant operand will match HImode, not QImode.
                   1119: 
                   1120: (define_expand "zero_extendhisi2"
                   1121:   [(set (match_operand:SI 0 "register_operand" "")
                   1122:        (zero_extend:SI
                   1123:         (match_operand:HI 1 "general_operand" "")))]
                   1124:   ""
                   1125:   "
                   1126: {
                   1127:   if (GET_CODE (operand1) == MEM
                   1128:       && symbolic_operand (XEXP (operand1, 0), Pmode))
                   1129:     {
                   1130:       rtx temp = copy_to_mode_reg (Pmode, gen_rtx (HIGH, Pmode,
                   1131:                                                   XEXP (operand1, 0)));
                   1132:       operands[1] = gen_rtx (MEM, HImode,
                   1133:                             gen_rtx (LO_SUM, Pmode,
                   1134:                                      temp, XEXP (operand1, 0)));
                   1135:     }
                   1136: }")
                   1137: 
                   1138: (define_insn ""
                   1139:   [(set (match_operand:SI 0 "register_operand" "=r,r")
                   1140:        (zero_extend:SI
                   1141:         (match_operand:HI 1 "reg_or_nonsymb_mem_operand" "r,Q")))]
                   1142:   ""
                   1143:   "@
                   1144:    extru %1,31,16,%0
                   1145:    ldh%M1 %1,%0"
                   1146:   [(set_attr "type" "unary,load")])
                   1147: 
                   1148: (define_expand "zero_extendqihi2"
                   1149:   [(set (match_operand:HI 0 "register_operand" "")
                   1150:        (zero_extend:HI
                   1151:         (match_operand:QI 1 "general_operand" "")))]
                   1152:   ""
                   1153:   "
                   1154: {
                   1155:   if (GET_CODE (operand1) == MEM
                   1156:       && symbolic_operand (XEXP (operand1, 0), Pmode))
                   1157:     {
                   1158:       rtx temp = copy_to_mode_reg (Pmode, gen_rtx (HIGH, Pmode,
                   1159:                                                   XEXP (operand1, 0)));
                   1160:       operands[1] = gen_rtx (MEM, QImode,
                   1161:                             gen_rtx (LO_SUM, Pmode,
                   1162:                                      temp, XEXP (operand1, 0)));
                   1163:     }
                   1164: }")
                   1165: 
                   1166: (define_insn ""
                   1167:   [(set (match_operand:HI 0 "register_operand" "=r,r")
                   1168:        (zero_extend:HI
                   1169:         (match_operand:QI 1 "reg_or_nonsymb_mem_operand" "r,Q")))]
                   1170:   ""
                   1171:   "@
                   1172:    extru %1,31,8,%0
                   1173:    ldb%M1 %1,%0"
                   1174:   [(set_attr "type" "unary,load")
                   1175:    (set_attr "length" "1")])
                   1176: 
                   1177: (define_expand "zero_extendqisi2"
                   1178:   [(set (match_operand:SI 0 "register_operand" "")
                   1179:        (zero_extend:SI
                   1180:         (match_operand:QI 1 "general_operand" "")))]
                   1181:   ""
                   1182:   "
                   1183: {
                   1184:   if (GET_CODE (operand1) == MEM
                   1185:       && symbolic_operand (XEXP (operand1, 0), Pmode))
                   1186:     {
                   1187:       rtx temp = copy_to_mode_reg (Pmode, gen_rtx (HIGH, Pmode,
                   1188:                                                   XEXP (operand1, 0)));
                   1189:       operand1 = gen_rtx (MEM, QImode,
                   1190:                          gen_rtx (LO_SUM, Pmode,
                   1191:                                   temp, XEXP (operand1, 0)));
                   1192:       emit_insn (gen_rtx (SET, VOIDmode, operand0,
                   1193:                          gen_rtx (ZERO_EXTEND, SImode, operand1)));
                   1194:       DONE;
                   1195:     }
                   1196: }")
                   1197: 
                   1198: (define_insn ""
                   1199:   [(set (match_operand:SI 0 "register_operand" "=r,r")
                   1200:        (zero_extend:SI
                   1201:         (match_operand:QI 1 "reg_or_nonsymb_mem_operand" "r,Q")))]
                   1202:   ""
                   1203:   "@
                   1204:    extru %1,31,8,%0
                   1205:    ldb%M1 %1,%0"
                   1206:   [(set_attr "type" "unary,load")
                   1207:    (set_attr "length" "1")])
                   1208: 
                   1209: ;;- sign extension instructions
                   1210: ;; Note that the one starting from HImode comes before those for QImode
                   1211: ;; so that a constant operand will match HImode, not QImode.
                   1212: 
                   1213: (define_insn "extendhisi2"
                   1214:   [(set (match_operand:SI 0 "register_operand" "=r")
                   1215:        (sign_extend:SI (match_operand:HI 1 "register_operand" "r")))]
                   1216:   ""
                   1217:   "extrs %1,31,16,%0"
                   1218:   [(set_attr "type" "unary")])
                   1219: 
                   1220: (define_insn "extendqihi2"
                   1221:   [(set (match_operand:HI 0 "register_operand" "=r")
                   1222:        (sign_extend:HI (match_operand:QI 1 "register_operand" "r")))]
                   1223:   ""
                   1224:   "extrs %1,31,8,%0"
                   1225:   [(set_attr "type" "unary")])
                   1226: 
                   1227: (define_insn "extendqisi2"
                   1228:   [(set (match_operand:SI 0 "register_operand" "=r")
                   1229:        (sign_extend:SI (match_operand:QI 1 "register_operand" "r")))]
                   1230:   ""
                   1231:   "extrs %1,31,8,%0"
                   1232:   [(set_attr "type" "unary")])
                   1233: 
                   1234: ;; Conversions between float and double.
                   1235: 
                   1236: (define_insn "extendsfdf2"
                   1237:   [(set (match_operand:DF 0 "register_operand" "=fx")
                   1238:        (float_extend:DF
                   1239:         (match_operand:SF 1 "register_operand" "fx")))]
                   1240:   ""
                   1241:   "fcnvff,sgl,dbl %1,%0"
                   1242:   [(set_attr "type" "fpalu")])
                   1243: 
                   1244: (define_insn "truncdfsf2"
                   1245:   [(set (match_operand:SF 0 "register_operand" "=fx")
                   1246:        (float_truncate:SF
                   1247:         (match_operand:DF 1 "register_operand" "fx")))]
                   1248:   ""
                   1249:   "fcnvff,dbl,sgl %1,%0"
                   1250:   [(set_attr "type" "fpalu")])
                   1251: 
                   1252: ;; Conversion between fixed point and floating point.
                   1253: ;; Note that among the fix-to-float insns
                   1254: ;; the ones that start with SImode come first.
                   1255: ;; That is so that an operand that is a CONST_INT
                   1256: ;; (and therefore lacks a specific machine mode).
                   1257: ;; will be recognized as SImode (which is always valid)
                   1258: ;; rather than as QImode or HImode.
                   1259: 
                   1260: ;; This pattern forces (set (reg:SF ...) (float:SF (const_int ...)))
                   1261: ;; to be reloaded by putting the constant into memory.
                   1262: ;; It must come before the more general floatsisf2 pattern.
                   1263: (define_insn ""
                   1264:   [(set (match_operand:SF 0 "general_operand" "=fx")
                   1265:        (float:SF (match_operand:SI 1 "const_int_operand" "m")))]
                   1266:   ""
                   1267:   "* return output_floatsisf2 (operands);"
                   1268:   [(set_attr "type" "fpalu")
                   1269:    (set_attr "length" "3")])
                   1270: 
                   1271: (define_insn "floatsisf2"
                   1272:   [(set (match_operand:SF 0 "general_operand" "=fx")
                   1273:        (float:SF (match_operand:SI 1 "register_operand" "fxr")))]
                   1274:   ""
                   1275:   "* return output_floatsisf2 (operands);"
                   1276:   [(set_attr "type" "fpalu")
                   1277:    (set_attr "length" "3")])
                   1278: 
                   1279: ;; This pattern forces (set (reg:DF ...) (float:DF (const_int ...)))
                   1280: ;; to be reloaded by putting the constant into memory.
                   1281: ;; It must come before the more general floatsidf2 pattern.
                   1282: (define_insn ""
                   1283:   [(set (match_operand:DF 0 "general_operand" "=fx")
                   1284:        (float:DF (match_operand:SI 1 "const_int_operand" "m")))]
                   1285:   ""
                   1286:   "* return output_floatsidf2 (operands);"
                   1287:   [(set_attr "type" "fpalu")
                   1288:    (set_attr "length" "3")])
                   1289: 
                   1290: (define_insn "floatsidf2"
                   1291:   [(set (match_operand:DF 0 "general_operand" "=fx")
                   1292:        (float:DF (match_operand:SI 1 "register_operand" "fxr")))]
                   1293:   ""
                   1294:   "* return output_floatsidf2 (operands);"
                   1295:   [(set_attr "type" "fpalu")
                   1296:    (set_attr "length" "3")])
                   1297: 
                   1298: ;; Convert a float to an actual integer.
                   1299: ;; Truncation is performed as part of the conversion.
                   1300: 
                   1301: (define_insn "fix_truncsfsi2"
                   1302:   [(set (match_operand:SI 0 "register_operand" "=r,fx")
                   1303:        (fix:SI (fix:SF (match_operand:SF 1 "register_operand" "fx,fx"))))
                   1304:    (clobber (match_scratch:SI 2 "=&fx,X"))]
                   1305:   ""
                   1306:   "@
                   1307:    fcnvfxt,sgl,sgl %1,%2\;fstws %2,-16(30)\;ldw -16(30),%0
                   1308:    fcnvfxt,sgl,sgl %1,%0"
                   1309:   [(set_attr "type" "fpalu,fpalu")
                   1310:    (set_attr "length" "3,1")])
                   1311: 
                   1312: (define_insn "fix_truncdfsi2"
                   1313:   [(set (match_operand:SI 0 "register_operand" "=r,fx")
                   1314:        (fix:SI (fix:DF (match_operand:DF 1 "register_operand" "fx,fx"))))
                   1315:    (clobber (match_scratch:SI 2 "=&fx,X"))]
                   1316:   ""
                   1317:   "@
                   1318:    fcnvfxt,dbl,sgl %1,%2\;fstws %2,-16(30)\;ldw -16(30),%0
                   1319:    fcnvfxt,dbl,sgl %1,%0"
                   1320:   [(set_attr "type" "fpalu,fpalu")
                   1321:    (set_attr "length" "3,1")])
                   1322: 
                   1323: 
                   1324: ;;- arithmetic instructions
                   1325: 
                   1326: (define_insn "adddi3"
                   1327:   [(set (match_operand:DI 0 "register_operand" "=r")
                   1328:        (plus:DI (match_operand:DI 1 "register_operand" "%r")
                   1329:                 (match_operand:DI 2 "register_operand" "r")))]
                   1330:   ""
                   1331:   "add %R1,%R2,%R0\;addc %1,%2,%0"
                   1332:   [(set_attr "type" "binary")
                   1333:    (set_attr "length" "2")])
                   1334: 
                   1335: (define_insn "addsi3"
                   1336:   [(set (match_operand:SI 0 "register_operand" "=r,r")
                   1337:        (plus:SI (match_operand:SI 1 "register_operand" "%r,r")
                   1338:                 (match_operand:SI 2 "arith_operand" "r,J")))]
                   1339:   ""
                   1340:   "@
                   1341:    add %1,%2,%0
                   1342:    ldo %2(%1),%0")
                   1343: 
                   1344: (define_insn "subdi3"
                   1345:   [(set (match_operand:DI 0 "register_operand" "=r")
                   1346:        (minus:DI (match_operand:DI 1 "register_operand" "r")
                   1347:                  (match_operand:DI 2 "register_operand" "r")))]
                   1348:   ""
                   1349:   "sub %R1,%R2,%R0\;subb %1,%2,%0"
                   1350:   [(set_attr "length" "2")])
                   1351: 
                   1352: (define_insn "subsi3"
                   1353:   [(set (match_operand:SI 0 "register_operand" "=r,r")
                   1354:        (minus:SI (match_operand:SI 1 "arith11_operand" "r,I")
                   1355:                  (match_operand:SI 2 "register_operand" "r,r")))]
                   1356:   ""
                   1357:   "@
                   1358:    sub %1,%2,%0
                   1359:    subi %1,%2,%0")
                   1360: 
                   1361: ;; The mulsi3 insns set up registers for the millicode call.
                   1362: 
                   1363: (define_expand "mulsi3"
                   1364:   [(set (reg:SI 26) (match_operand:SI 1 "srcsi_operand" ""))
                   1365:    (set (reg:SI 25) (match_operand:SI 2 "srcsi_operand" ""))
                   1366:    (parallel [(set (reg:SI 29) (mult:SI (reg:SI 26) (reg:SI 25)))
                   1367:              (clobber (match_scratch:SI 3 ""))
                   1368:              (clobber (reg:SI 26))
                   1369:              (clobber (reg:SI 25))
                   1370:              (clobber (reg:SI 31))])
                   1371:    (set (match_operand:SI 0 "general_operand" "") (reg:SI 29))]
                   1372:   ""
                   1373:   "")
                   1374: 
                   1375: (define_insn ""
                   1376:   [(set (reg:SI 29) (mult:SI (reg:SI 26) (reg:SI 25)))
                   1377:    (clobber (match_scratch:SI 0 "=a"))
                   1378:    (clobber (reg:SI 26))
                   1379:    (clobber (reg:SI 25))
                   1380:    (clobber (reg:SI 31))]
                   1381:   ""
                   1382:   "* return output_mul_insn (0);"
                   1383:   [(set_attr "type" "milli")])
                   1384: 
                   1385: ;;; Division and mod.
                   1386: 
                   1387: (define_expand "divsi3"
                   1388:   [(set (reg:SI 26) (match_operand:SI 1 "srcsi_operand" ""))
                   1389:    (set (reg:SI 25) (match_operand:SI 2 "srcsi_operand" ""))
                   1390:    (parallel [(set (reg:SI 29) (div:SI (reg:SI 26) (reg:SI 25)))
                   1391:              (clobber (match_scratch:SI 3 ""))
                   1392:              (clobber (reg:SI 26))
                   1393:              (clobber (reg:SI 25))
                   1394:              (clobber (reg:SI 31))])
                   1395:    (set (match_operand:SI 0 "general_operand" "") (reg:SI 29))]
                   1396:   ""
                   1397:   "
                   1398: {
                   1399:   if (!(GET_CODE (operands[2]) == CONST_INT && emit_hpdiv_const(operands, 0)))
                   1400:     {
                   1401:       emit_move_insn (gen_rtx (REG, SImode, 26), operands[1]);
                   1402:       emit_move_insn (gen_rtx (REG, SImode, 25), operands[2]);
                   1403:       emit
                   1404:        (gen_rtx
                   1405:         (PARALLEL, VOIDmode,
                   1406:          gen_rtvec (5, gen_rtx (SET, VOIDmode, gen_rtx (REG, SImode, 29),
                   1407:                                 gen_rtx (DIV, SImode,
                   1408:                                          gen_rtx (REG, SImode, 26),
                   1409:                                          gen_rtx (REG, SImode, 25))),
                   1410:                     gen_rtx (CLOBBER, VOIDmode, gen_rtx (SCRATCH, SImode, 0)),
                   1411:                     gen_rtx (CLOBBER, VOIDmode, gen_rtx (REG, SImode, 26)),
                   1412:                     gen_rtx (CLOBBER, VOIDmode, gen_rtx (REG, SImode, 25)),
                   1413:                     gen_rtx (CLOBBER, VOIDmode, gen_rtx (REG, SImode, 31)))));
                   1414:       emit_move_insn (operands[0], gen_rtx (REG, SImode, 29));
                   1415:     }
                   1416:   DONE;
                   1417: }")
                   1418: 
                   1419: (define_insn ""
                   1420:   [(set (reg:SI 29)
                   1421:     (div:SI (reg:SI 26) (match_operand:SI 0 "div_operand" "")))
                   1422:    (clobber (match_scratch:SI 1 "=a"))
                   1423:    (clobber (reg:SI 26))
                   1424:    (clobber (reg:SI 25))
                   1425:    (clobber (reg:SI 31))]
                   1426:  ""
                   1427:  "*
                   1428:  return output_div_insn (operands, 0);"
                   1429:  [(set_attr "type" "milli")])
                   1430: 
                   1431: (define_expand "udivsi3"
                   1432:   [(set (reg:SI 26) (match_operand:SI 1 "srcsi_operand" ""))
                   1433:    (set (reg:SI 25) (match_operand:SI 2 "srcsi_operand" ""))
                   1434:    (parallel [(set (reg:SI 29) (udiv:SI (reg:SI 26) (reg:SI 25)))
                   1435:              (clobber (match_scratch:SI 3 ""))
                   1436:              (clobber (reg:SI 26))
                   1437:              (clobber (reg:SI 25))
                   1438:              (clobber (reg:SI 31))])
                   1439:    (set (match_operand:SI 0 "general_operand" "") (reg:SI 29))]
                   1440:   ""
                   1441:   "
                   1442: {
                   1443:   if (!(GET_CODE (operands[2]) == CONST_INT && emit_hpdiv_const(operands, 1)))
                   1444:     {
                   1445:       emit_move_insn (gen_rtx (REG, SImode, 26), operands[1]);
                   1446:       emit_move_insn (gen_rtx (REG, SImode, 25), operands[2]);
                   1447:       emit
                   1448:        (gen_rtx
                   1449:         (PARALLEL, VOIDmode,
                   1450:          gen_rtvec (5, gen_rtx (SET, VOIDmode, gen_rtx (REG, SImode, 29),
                   1451:                                 gen_rtx (UDIV, SImode,
                   1452:                                          gen_rtx (REG, SImode, 26),
                   1453:                                          gen_rtx (REG, SImode, 25))),
                   1454:                     gen_rtx (CLOBBER, VOIDmode, gen_rtx (SCRATCH, SImode, 0)),
                   1455:                     gen_rtx (CLOBBER, VOIDmode, gen_rtx (REG, SImode, 26)),
                   1456:                     gen_rtx (CLOBBER, VOIDmode, gen_rtx (REG, SImode, 25)),
                   1457:                     gen_rtx (CLOBBER, VOIDmode, gen_rtx (REG, SImode, 31)))));
                   1458:       emit_move_insn (operands[0], gen_rtx (REG, SImode, 29));
                   1459:     }
                   1460:   DONE;
                   1461: }")
                   1462: 
                   1463: (define_insn ""
                   1464:   [(set (reg:SI 29)
                   1465:     (udiv:SI (reg:SI 26) (match_operand:SI 0 "div_operand" "")))
                   1466:    (clobber (match_scratch:SI 1 "=a"))
                   1467:    (clobber (reg:SI 26))
                   1468:    (clobber (reg:SI 25))
                   1469:    (clobber (reg:SI 31))]
                   1470:  ""
                   1471:  "*
                   1472:  return output_div_insn (operands, 1);"
                   1473:  [(set_attr "type" "milli")])
                   1474: 
                   1475: (define_expand "modsi3"
                   1476:   [(set (reg:SI 26) (match_operand:SI 1 "srcsi_operand" ""))
                   1477:    (set (reg:SI 25) (match_operand:SI 2 "srcsi_operand" ""))
                   1478:    (parallel [(set (reg:SI 29) (mod:SI (reg:SI 26) (reg:SI 25)))
                   1479:              (clobber (match_scratch:SI 3 ""))
                   1480:              (clobber (reg:SI 26))
                   1481:              (clobber (reg:SI 25))
                   1482:              (clobber (reg:SI 31))])
                   1483:    (set (match_operand:SI 0 "general_operand" "") (reg:SI 29))]
                   1484:   ""
                   1485:   "
                   1486: {
                   1487:   emit_move_insn (gen_rtx (REG, SImode, 26), operands[1]);
                   1488:   emit_move_insn (gen_rtx (REG, SImode, 25), operands[2]);
                   1489:   emit
                   1490:     (gen_rtx
                   1491:      (PARALLEL, VOIDmode,
                   1492:       gen_rtvec (5, gen_rtx (SET, VOIDmode, gen_rtx (REG, SImode, 29),
                   1493:                             gen_rtx (MOD, SImode,
                   1494:                                      gen_rtx (REG, SImode, 26),
                   1495:                                      gen_rtx (REG, SImode, 25))),
                   1496:                 gen_rtx (CLOBBER, VOIDmode, gen_rtx (SCRATCH, SImode, 0)),
                   1497:                 gen_rtx (CLOBBER, VOIDmode, gen_rtx (REG, SImode, 26)),
                   1498:                 gen_rtx (CLOBBER, VOIDmode, gen_rtx (REG, SImode, 25)),
                   1499:                 gen_rtx (CLOBBER, VOIDmode, gen_rtx (REG, SImode, 31)))));
                   1500:   emit_move_insn (operands[0], gen_rtx (REG, SImode, 29));
                   1501:   DONE;
                   1502: }")
                   1503:  
                   1504: (define_insn ""
                   1505:   [(set (reg:SI 29) (mod:SI (reg:SI 26) (reg:SI 25)))
                   1506:    (clobber (match_scratch:SI 0 "=a"))
                   1507:    (clobber (reg:SI 26))
                   1508:    (clobber (reg:SI 25))
                   1509:    (clobber (reg:SI 31))]
                   1510:   ""
                   1511:   "*
                   1512:   return output_mod_insn (0);"
                   1513:   [(set_attr "type" "milli")])
                   1514: 
                   1515: (define_expand "umodsi3"
                   1516:   [(set (reg:SI 26) (match_operand:SI 1 "srcsi_operand" ""))
                   1517:    (set (reg:SI 25) (match_operand:SI 2 "srcsi_operand" ""))
                   1518:    (parallel [(set (reg:SI 29) (umod:SI (reg:SI 26) (reg:SI 25)))
                   1519:              (clobber (match_scratch:SI 3 ""))
                   1520:              (clobber (reg:SI 26))
                   1521:              (clobber (reg:SI 25))
                   1522:              (clobber (reg:SI 31))])
                   1523:    (set (match_operand:SI 0 "general_operand" "") (reg:SI 29))]
                   1524:   ""
                   1525:   "
                   1526: {
                   1527:   emit_move_insn (gen_rtx (REG, SImode, 26), operands[1]);
                   1528:   emit_move_insn (gen_rtx (REG, SImode, 25), operands[2]);
                   1529:   emit
                   1530:     (gen_rtx
                   1531:      (PARALLEL, VOIDmode,
                   1532:       gen_rtvec (5, gen_rtx (SET, VOIDmode, gen_rtx (REG, SImode, 29),
                   1533:                             gen_rtx (UMOD, SImode,
                   1534:                                      gen_rtx (REG, SImode, 26),
                   1535:                                      gen_rtx (REG, SImode, 25))),
                   1536:                 gen_rtx (CLOBBER, VOIDmode, gen_rtx (SCRATCH, SImode, 0)),
                   1537:                 gen_rtx (CLOBBER, VOIDmode, gen_rtx (REG, SImode, 26)),
                   1538:                 gen_rtx (CLOBBER, VOIDmode, gen_rtx (REG, SImode, 25)),
                   1539:                 gen_rtx (CLOBBER, VOIDmode, gen_rtx (REG, SImode, 31)))));
                   1540:   emit_move_insn (operands[0], gen_rtx (REG, SImode, 29));
                   1541:   DONE;
                   1542: }")
                   1543: 
                   1544: (define_insn ""
                   1545:   [(set (reg:SI 29) (umod:SI (reg:SI 26) (reg:SI 25)))
                   1546:    (clobber (match_scratch:SI 0 "=a"))
                   1547:    (clobber (reg:SI 26))
                   1548:    (clobber (reg:SI 25))
                   1549:    (clobber (reg:SI 31))]
                   1550:   ""
                   1551:   "*
                   1552:   return output_mod_insn (1);"
                   1553:   [(set_attr "type" "milli")])
                   1554: 
                   1555: ;;- and instructions
                   1556: ;; We define DImode `and` so with DImode `not` we can get
                   1557: ;; DImode `andn`.  Other combinations are possible.
                   1558: 
                   1559: (define_expand "anddi3"
                   1560:   [(set (match_operand:DI 0 "register_operand" "")
                   1561:        (and:DI (match_operand:DI 1 "arith_double_operand" "")
                   1562:                (match_operand:DI 2 "arith_double_operand" "")))]
                   1563:   ""
                   1564:   "
                   1565: {
                   1566:   if (! register_operand (operands[1], DImode)
                   1567:       || ! register_operand (operands[2], DImode))
                   1568:     /* Let GCC break this into word-at-a-time operations.  */
                   1569:     FAIL;
                   1570: }")
                   1571: 
                   1572: (define_insn ""
                   1573:   [(set (match_operand:DI 0 "register_operand" "=r")
                   1574:        (and:DI (match_operand:DI 1 "register_operand" "%r")
                   1575:                (match_operand:DI 2 "register_operand" "r")))]
                   1576:   ""
                   1577:   "and %1,%2,%0\;and %R1,%R2,%R0"
                   1578:   [(set_attr "length" "2")])
                   1579: 
                   1580: (define_insn "andsi3"
                   1581:   [(set (match_operand:SI 0 "register_operand" "=r")
                   1582:        (and:SI (match_operand:SI 1 "register_operand" "%r")
                   1583:                (match_operand:SI 2 "register_operand" "r")))]
                   1584:   ""
                   1585:   "and %1,%2,%0")
                   1586: 
                   1587: (define_insn ""
                   1588:   [(set (match_operand:DI 0 "register_operand" "=r")
                   1589:        (and:DI (match_operand:DI 1 "register_operand" "r")
                   1590:                (not:DI (match_operand:DI 2 "register_operand" "r"))))]
                   1591:   ""
                   1592:   "andcm %2,%1,%0\;andcm %R2,%R1,%R0"
                   1593:   [(set_attr "length" "2")])
                   1594: 
                   1595: (define_insn ""
                   1596:   [(set (match_operand:SI 0 "register_operand" "=r")
                   1597:        (and:SI (match_operand:SI 1 "register_operand" "%r")
                   1598:                (not:SI (match_operand:SI 2 "register_operand" "r"))))]
                   1599:   ""
                   1600:   "andcm %1,%2,%0")
                   1601: 
                   1602: 
                   1603: (define_expand "iordi3"
                   1604:   [(set (match_operand:DI 0 "register_operand" "")
                   1605:        (ior:DI (match_operand:DI 1 "arith_double_operand" "")
                   1606:                (match_operand:DI 2 "arith_double_operand" "")))]
                   1607:   ""
                   1608:   "
                   1609: {
                   1610:   if (! register_operand (operands[1], DImode)
                   1611:       || ! register_operand (operands[2], DImode))
                   1612:     /* Let GCC break this into word-at-a-time operations.  */
                   1613:     FAIL;
                   1614: }")
                   1615: 
                   1616: (define_insn ""
                   1617:   [(set (match_operand:DI 0 "register_operand" "=r")
                   1618:        (ior:DI (match_operand:DI 1 "register_operand" "%r")
                   1619:                (match_operand:DI 2 "register_operand" "r")))]
                   1620:   ""
                   1621:   "or %1,%2,%0\;or %R1,%R2,%R0"
                   1622:   [(set_attr "length" "2")])
                   1623: 
                   1624: (define_insn "iorsi3"
                   1625:   [(set (match_operand:SI 0 "register_operand" "=r")
                   1626:        (ior:SI (match_operand:SI 1 "register_operand" "%r")
                   1627:                (match_operand:SI 2 "register_operand" "r")))]
                   1628:   ""
                   1629:   "or %1,%2,%0")
                   1630: 
                   1631: (define_expand "xordi3"
                   1632:   [(set (match_operand:DI 0 "register_operand" "")
                   1633:        (xor:DI (match_operand:DI 1 "arith_double_operand" "")
                   1634:                (match_operand:DI 2 "arith_double_operand" "")))]
                   1635:   ""
                   1636:   "
                   1637: {
                   1638:   if (! register_operand (operands[1], DImode)
                   1639:       || ! register_operand (operands[2], DImode))
                   1640:     /* Let GCC break this into word-at-a-time operations.  */
                   1641:     FAIL;
                   1642: }")
                   1643: 
                   1644: (define_insn ""
                   1645:   [(set (match_operand:DI 0 "register_operand" "=r")
                   1646:        (xor:DI (match_operand:DI 1 "register_operand" "%r")
                   1647:                (match_operand:DI 2 "register_operand" "r")))]
                   1648:   ""
                   1649:   "xor %1,%2,%0\;xor %R1,%R2,%R0"
                   1650:   [(set_attr "length" "2")])
                   1651: 
                   1652: (define_insn "xorsi3"
                   1653:   [(set (match_operand:SI 0 "register_operand" "=r")
                   1654:        (xor:SI (match_operand:SI 1 "register_operand" "%r")
                   1655:                (match_operand:SI 2 "register_operand" "r")))]
                   1656:   ""
                   1657:   "xor %r1,%2,%0")
                   1658: 
                   1659: (define_insn "negdi2"
                   1660:   [(set (match_operand:DI 0 "register_operand" "=r")
                   1661:        (neg:DI (match_operand:DI 1 "register_operand" "r")))]
                   1662:   ""
                   1663:   "sub 0,%R1,%R0\;subb 0,%1,%0"
                   1664:   [(set_attr "type" "unary")
                   1665:    (set_attr "length" "2")])
                   1666: 
                   1667: (define_insn "negsi2"
                   1668:   [(set (match_operand:SI 0 "register_operand" "=r")
                   1669:        (neg:SI (match_operand:SI 1 "register_operand" "r")))]
                   1670:   ""
                   1671:   "@
                   1672:    sub 0,%1,%0"
                   1673:   [(set_attr "type" "unary")])
                   1674: 
                   1675: (define_expand "one_cmpldi2"
                   1676:   [(set (match_operand:DI 0 "register_operand" "")
                   1677:        (not:DI (match_operand:DI 1 "arith_double_operand" "")))]
                   1678:   ""
                   1679:   "
                   1680: {
                   1681:   if (! register_operand (operands[1], DImode))
                   1682:     FAIL;
                   1683: }")
                   1684: 
                   1685: (define_insn ""
                   1686:   [(set (match_operand:DI 0 "register_operand" "=r")
                   1687:        (not:DI (match_operand:DI 1 "arith_double_operand" "r")))]
                   1688:   ""
                   1689:   "uaddcm 0,%1,%0\;uaddcm 0,%R1,%R0"
                   1690:   [(set_attr "type" "unary")
                   1691:    (set_attr "length" "2")])
                   1692: 
                   1693: (define_insn "one_cmplsi2"
                   1694:   [(set (match_operand:SI 0 "register_operand" "=r")
                   1695:        (not:SI (match_operand:SI 1 "register_operand" "r")))]
                   1696:   ""
                   1697:   "uaddcm 0,%1,%0"
                   1698:   [(set_attr "type" "unary")])
                   1699: 
                   1700: ;; Floating point arithmetic instructions.
                   1701: 
                   1702: (define_insn "adddf3"
                   1703:   [(set (match_operand:DF 0 "register_operand" "=fx")
                   1704:        (plus:DF (match_operand:DF 1 "register_operand" "fx")
                   1705:                 (match_operand:DF 2 "register_operand" "fx")))]
                   1706:   ""
                   1707:   "fadd,dbl %1,%2,%0"
                   1708:   [(set_attr "type" "fpalu")])
                   1709: 
                   1710: (define_insn "addsf3"
                   1711:   [(set (match_operand:SF 0 "register_operand" "=fx")
                   1712:        (plus:SF (match_operand:SF 1 "register_operand" "fx")
                   1713:                 (match_operand:SF 2 "register_operand" "fx")))]
                   1714:   ""
                   1715:   "fadd,sgl %1,%2,%0"
                   1716:   [(set_attr "type" "fpalu")])
                   1717: 
                   1718: (define_insn "subdf3"
                   1719:   [(set (match_operand:DF 0 "register_operand" "=fx")
                   1720:        (minus:DF (match_operand:DF 1 "register_operand" "fx")
                   1721:                  (match_operand:DF 2 "register_operand" "fx")))]
                   1722:   ""
                   1723:   "fsub,dbl %1,%2,%0"
                   1724:   [(set_attr "type" "fpalu")])
                   1725: 
                   1726: (define_insn "subsf3"
                   1727:   [(set (match_operand:SF 0 "register_operand" "=fx")
                   1728:        (minus:SF (match_operand:SF 1 "register_operand" "fx")
                   1729:                  (match_operand:SF 2 "register_operand" "fx")))]
                   1730:   ""
                   1731:   "fsub,sgl %1,%2,%0"
                   1732:   [(set_attr "type" "fpalu")])
                   1733: 
                   1734: (define_insn "muldf3"
                   1735:   [(set (match_operand:DF 0 "register_operand" "=fx")
                   1736:        (mult:DF (match_operand:DF 1 "register_operand" "fx")
                   1737:                 (match_operand:DF 2 "register_operand" "fx")))]
                   1738:   ""
                   1739:   "fmpy,dbl %1,%2,%0"
                   1740:   [(set_attr "type" "fpmul")])
                   1741: 
                   1742: (define_insn "mulsf3"
                   1743:   [(set (match_operand:SF 0 "register_operand" "=fx")
                   1744:        (mult:SF (match_operand:SF 1 "register_operand" "fx")
                   1745:                 (match_operand:SF 2 "register_operand" "fx")))]
                   1746:   ""
                   1747:   "fmpy,sgl %1,%2,%0"
                   1748:   [(set_attr "type" "fpmul")])
                   1749: 
                   1750: (define_insn "divdf3"
                   1751:   [(set (match_operand:DF 0 "register_operand" "=fx")
                   1752:        (div:DF (match_operand:DF 1 "register_operand" "fx")
                   1753:                (match_operand:DF 2 "register_operand" "fx")))]
                   1754:   ""
                   1755:   "fdiv,dbl %1,%2,%0"
                   1756:   [(set_attr "type" "fpdivdbl")])
                   1757: 
                   1758: (define_insn "divsf3"
                   1759:   [(set (match_operand:SF 0 "register_operand" "=fx")
                   1760:        (div:SF (match_operand:SF 1 "register_operand" "fx")
                   1761:                (match_operand:SF 2 "register_operand" "fx")))]
                   1762:   ""
                   1763:   "fdiv,sgl %1,%2,%0"
                   1764:   [(set_attr "type" "fpdivsgl")])
                   1765: 
                   1766: (define_insn "negdf2"
                   1767:   [(set (match_operand:DF 0 "register_operand" "=fx")
                   1768:        (neg:DF (match_operand:DF 1 "register_operand" "fx")))]
                   1769:   ""
                   1770:   "fsub,dbl 0,%1,%0"
                   1771:   [(set_attr "type" "fpalu")])
                   1772: 
                   1773: (define_insn "negsf2"
                   1774:   [(set (match_operand:SF 0 "register_operand" "=fx")
                   1775:        (neg:SF (match_operand:SF 1 "register_operand" "fx")))]
                   1776:   ""
                   1777:   "fsub,sgl 0, %1,%0"
                   1778:   [(set_attr "type" "fpalu")])
                   1779: 
                   1780: (define_insn "absdf2"
                   1781:   [(set (match_operand:DF 0 "register_operand" "=fx")
                   1782:        (abs:DF (match_operand:DF 1 "register_operand" "fx")))]
                   1783:   ""
                   1784:   "fabs,dbl %1,%0"
                   1785:   [(set_attr "type" "fpalu")])
                   1786: 
                   1787: (define_insn "abssf2"
                   1788:   [(set (match_operand:SF 0 "register_operand" "=fx")
                   1789:        (abs:SF (match_operand:SF 1 "register_operand" "fx")))]
                   1790:   ""
                   1791:   "fabs,sgl %1,%0"
                   1792:   [(set_attr "type" "fpalu")])
                   1793: 
                   1794: (define_insn "sqrtdf2"
                   1795:   [(set (match_operand:DF 0 "register_operand" "=fx")
                   1796:        (sqrt:DF (match_operand:DF 1 "register_operand" "fx")))]
                   1797:   ""
                   1798:   "fsqrt,dbl %1,%0"
                   1799:   [(set_attr "type" "fpsqrtdbl")])
                   1800: 
                   1801: (define_insn "sqrtsf2"
                   1802:   [(set (match_operand:SF 0 "register_operand" "=fx")
                   1803:        (sqrt:SF (match_operand:SF 1 "register_operand" "fx")))]
                   1804:   ""
                   1805:   "fsqrt,sgl %1,%0"
                   1806:   [(set_attr "type" "fpsqrtsgl")])
                   1807: 
                   1808: ;;- Shift instructions
                   1809: 
                   1810: ;; Optimized special case of shifting.
                   1811: 
                   1812: (define_insn ""
                   1813:   [(set (match_operand:SI 0 "register_operand" "=r")
                   1814:        (lshiftrt:SI (match_operand:SI 1 "memory_operand" "m")
                   1815:                     (const_int 24)))]
                   1816:   ""
                   1817:   "ldb%M1 %1,%0")
                   1818: 
                   1819: (define_insn ""
                   1820:   [(set (match_operand:SI 0 "register_operand" "=r")
                   1821:        (plus:SI (mult:SI (match_operand:SI 2 "register_operand" "r")
                   1822:                          (const_int 2))
                   1823:                 (match_operand:SI 1 "register_operand" "r")))]
                   1824:   ""
                   1825:   "sh1add %2,%1,%0")
                   1826: 
                   1827: (define_insn ""
                   1828:   [(set (match_operand:SI 0 "register_operand" "=r")
                   1829:        (plus:SI (mult:SI (match_operand:SI 2 "register_operand" "r")
                   1830:                          (const_int 4))
                   1831:                 (match_operand:SI 1 "register_operand" "r")))]
                   1832:   ""
                   1833:   "sh2add %2,%1,%0")
                   1834: 
                   1835: (define_insn ""
                   1836:   [(set (match_operand:SI 0 "register_operand" "=r")
                   1837:        (plus:SI (mult:SI (match_operand:SI 2 "register_operand" "r")
                   1838:                          (const_int 8))
                   1839:                 (match_operand:SI 1 "register_operand" "r")))]
                   1840:   ""
                   1841:   "sh3add %2,%1,%0")
                   1842: 
                   1843: (define_insn "sar_sub"
                   1844:   [(set (match_operand:SI 0 "register_operand" "=r")
                   1845:        (if_then_else (gtu:SI (match_operand:SI 2 "register_operand" "r")
                   1846:                              (match_operand:SI 1 "int11_operand" "I"))
                   1847:                      (const_int 0)
                   1848:                      (minus:SI (match_dup 1) (match_dup 2))))]
                   1849:   ""
                   1850:   "subi,>>= %1,%2,%0\;copy 0,%0"
                   1851:   [(set_attr "length" "2" )])
                   1852: 
                   1853: (define_expand "ashlsi3"
                   1854:   [(set (match_operand:SI 0 "register_operand" "")
                   1855:        (ashift:SI (match_operand:SI 1 "register_operand" "")
                   1856:                   (match_operand:SI 2 "arith5_operand" "")))]
                   1857:   ""
                   1858:   "
                   1859: {
                   1860:   if (GET_CODE (operands[2]) != CONST_INT)
                   1861:     {
                   1862:       rtx temp = gen_reg_rtx (SImode);
                   1863:       emit_insn (gen_sar_sub (temp,
                   1864:                              gen_rtx (CONST_INT, VOIDmode, 31),
                   1865:                              operands[2]));
                   1866:       emit_insn (gen_rtx (SET, VOIDmode, gen_rtx (REG, SImode, 112), temp));
                   1867:       emit_insn (gen_rtx (SET, VOIDmode,
                   1868:                          operands[0],
                   1869:                          gen_rtx (ASHIFT, SImode,
                   1870:                                   operands[1],
                   1871:                                   gen_rtx (MINUS, SImode,
                   1872:                                            gen_rtx (CONST_INT, VOIDmode, 31),
                   1873:                                            gen_rtx (REG, SImode, 112)))));
                   1874:       DONE;
                   1875:     }
                   1876: }")
                   1877: 
                   1878: (define_insn ""
                   1879:  [(set (match_operand:SI 0 "register_operand" "=r")
                   1880:        (ashift:SI (match_operand:SI 1 "register_operand" "r")
                   1881:                  (match_operand:SI 2 "int5_operand" "L")))]
                   1882:  ""
                   1883:  "*
                   1884: {
                   1885:   rtx xoperands[4];
                   1886:   xoperands[0] = operands[0];  xoperands[1] = operands[1];
                   1887:   xoperands[2] = gen_rtx (CONST_INT, VOIDmode,
                   1888:                          31 - INTVAL (operands[2]));
                   1889:   xoperands[3] = gen_rtx (CONST_INT, VOIDmode,
                   1890:                          32 - INTVAL (operands[2]));
                   1891:   output_asm_insn (\"zdep %1,%2,%3,%0\", xoperands);
                   1892:   return \"\";
                   1893: }")
                   1894: 
                   1895: (define_insn ""
                   1896:  [(set (match_operand:SI 0 "register_operand" "=r")
                   1897:        (ashift:SI (match_operand:SI 1 "register_operand" "r")
                   1898:                  (minus:SI (const_int 31)
                   1899:                            (reg:SI 112))))]
                   1900:  ""
                   1901:  "zvdep %1,32,%0")
                   1902: 
                   1903: (define_expand "ashrsi3"
                   1904:   [(set (match_operand:SI 0 "register_operand" "")
                   1905:        (ashiftrt:SI (match_operand:SI 1 "register_operand" "")
                   1906:                     (match_operand:SI 2 "arith5_operand" "")))]
                   1907:   ""
                   1908:   "
                   1909: {
                   1910:   if (GET_CODE (operands[2]) != CONST_INT)
                   1911:     {
                   1912:       rtx temp = gen_reg_rtx (SImode);
                   1913:       emit_insn (gen_sar_sub (temp,
                   1914:                              gen_rtx (CONST_INT, VOIDmode, 31),
                   1915:                              operands[2]));
                   1916:       emit_insn (gen_rtx (SET, VOIDmode, gen_rtx (REG, SImode, 112), temp));
                   1917:       emit_insn (gen_rtx (SET, VOIDmode,
                   1918:                          operands[0],
                   1919:                          gen_rtx (ASHIFTRT, SImode,
                   1920:                                   operands[1],
                   1921:                                   gen_rtx (MINUS, SImode,
                   1922:                                            gen_rtx (CONST_INT, VOIDmode, 31),
                   1923:                                            gen_rtx (REG, SImode, 112)))));
                   1924:       DONE;
                   1925:     }
                   1926: }")
                   1927: 
                   1928: (define_insn ""
                   1929:  [(set (match_operand:SI 0 "register_operand" "=r")
                   1930:        (ashiftrt:SI (match_operand:SI 1 "register_operand" "r")
                   1931:                    (match_operand:SI 2 "int5_operand" "L")))]
                   1932:  ""
                   1933:  "*
                   1934: {
                   1935:   rtx xoperands[4];
                   1936:   xoperands[0] = operands[0];  xoperands[1] = operands[1];
                   1937:   xoperands[2] = gen_rtx (CONST_INT, VOIDmode,
                   1938:                          31 - INTVAL (operands[2]));
                   1939:   xoperands[3] = gen_rtx (CONST_INT, VOIDmode,
                   1940:                          32 - INTVAL (operands[2]));
                   1941:   output_asm_insn (\"extrs %1,%2,%3,%0\", xoperands);
                   1942:   return \"\";
                   1943: }")
                   1944: 
                   1945: 
                   1946: (define_insn ""
                   1947:  [(set (match_operand:SI 0 "register_operand" "=r")
                   1948:        (ashiftrt:SI (match_operand:SI 1 "register_operand" "r")
                   1949:                  (minus:SI (const_int 31)
                   1950:                            (reg:SI 112))))]
                   1951:  ""
                   1952:  "vextrs %1,32,%0")
                   1953: 
                   1954: (define_expand "lshrsi3"
                   1955:   [(set (match_operand:SI 0 "register_operand" "")
                   1956:        (lshiftrt:SI (match_operand:SI 1 "register_operand" "")
                   1957:                     (match_operand:SI 2 "arith5_operand" "")))]
                   1958:   ""
                   1959:   "
                   1960: {
                   1961:   if (GET_CODE (operands[2]) != CONST_INT)
                   1962:     {
                   1963:       rtx temp = gen_reg_rtx (SImode);
                   1964:       emit_insn (gen_sar_sub (temp,
                   1965:                              gen_rtx (CONST_INT, VOIDmode, 31),
                   1966:                              operands[2]));
                   1967:       emit_insn (gen_rtx (SET, VOIDmode, gen_rtx (REG, SImode, 112), temp));
                   1968:       emit_insn (gen_rtx (SET, VOIDmode,
                   1969:                          operands[0],
                   1970:                          gen_rtx (LSHIFTRT, SImode,
                   1971:                                   operands[1],
                   1972:                                   gen_rtx (MINUS, SImode,
                   1973:                                            gen_rtx (CONST_INT, VOIDmode, 31),
                   1974:                                            gen_rtx (REG, SImode, 112)))));
                   1975:       DONE;
                   1976:     }
                   1977: }")
                   1978: 
                   1979: (define_insn ""
                   1980:  [(set (match_operand:SI 0 "register_operand" "=r")
                   1981:        (lshiftrt:SI (match_operand:SI 1 "register_operand" "r")
                   1982:                    (match_operand:SI 2 "uint5_operand" "K")))]
                   1983:  ""
                   1984:  "*
                   1985: {
                   1986:   rtx xoperands[4];
                   1987:   xoperands[0] = operands[0];  xoperands[1] = operands[1];
                   1988:   xoperands[2] = gen_rtx (CONST_INT, VOIDmode,
                   1989:                          31 - INTVAL (operands[2]));
                   1990:   xoperands[3] = gen_rtx (CONST_INT, VOIDmode,
                   1991:                          32 - INTVAL (operands[2]));
                   1992:   output_asm_insn (\"extru %1,%2,%3,%0\", xoperands);
                   1993:   return \"\";
                   1994: }")
                   1995: 
                   1996: (define_insn ""
                   1997:  [(set (match_operand:SI 0 "register_operand" "=r")
                   1998:        (lshiftrt:SI (match_operand:SI 1 "register_operand" "r")
                   1999:                  (minus:SI (const_int 31)
                   2000:                            (reg:SI 112))))]
                   2001:  ""
                   2002:  "vextru %1,32,%0")
                   2003: 
                   2004: ;; Unconditional and other jump instructions.
                   2005: 
                   2006: (define_insn "jump"
                   2007:   [(set (pc) (label_ref (match_operand 0 "" "")))]
                   2008:   ""
                   2009:   "bl%* %l0,0"
                   2010:   [(set_attr "type" "branch")])
                   2011: 
                   2012: (define_insn "casesi"
                   2013:   [(set (pc)
                   2014:        (if_then_else (leu (minus:SI
                   2015:                            (match_operand:SI 0 "general_operand" "r")
                   2016:                            (match_operand:SI 1 "general_operand" "rI"))
                   2017:                           (match_operand:SI 2 "general_operand" "rI"))
                   2018:                      (plus:SI (mem:SI (plus:SI (pc)
                   2019:                                                (minus:SI (match_dup 0)
                   2020:                                                          (match_dup 1))))
                   2021:                               (label_ref (match_operand 3 "" "")))
                   2022:                      (pc)))
                   2023:    (use (label_ref (match_operand 4 "" "")))
                   2024:    (clobber (match_scratch:SI 5 "=r"))]
                   2025:   ""
                   2026:   "*
                   2027: {
                   2028:   if (GET_CODE (operands[1]) == CONST_INT)
                   2029:     {
                   2030:       if (GET_CODE (operands[2]) == CONST_INT)
                   2031:        {
                   2032:          operands[2] = gen_rtx (CONST_INT, VOIDmode,
                   2033:                                 INTVAL (operands[1]) + INTVAL (operands[2]));
                   2034:          if (!INT_11_BITS (operands[2]))
                   2035:            {
                   2036:              output_asm_insn (\"ldo %2(0),%5\", operands);
                   2037:              operands[2] = operands[5];
                   2038:            }
                   2039:        }
                   2040:       else
                   2041:        output_asm_insn (\"ldo %1(%2),%2\", operands);
                   2042:       output_asm_insn (\"addi,< %n1,%0,0\", operands);
                   2043:     }
                   2044:   else
                   2045:     {
                   2046:       if (GET_CODE (operands[2]) == CONST_INT)
                   2047:        {
                   2048:          output_asm_insn (\"ldo %2(%1),%5\", operands);
                   2049:          operands[2] = operands[5];
                   2050:        }
                   2051:       output_asm_insn (\"sub,< %0,%1,0\", operands);
                   2052:     }
                   2053:   if (GET_CODE (operands[2]) == CONST_INT)
                   2054:     output_asm_insn (\"addi,<= %n2,%0,0\", operands);
                   2055:   else
                   2056:     output_asm_insn (\"sub,<= %0,%2,0\", operands);
                   2057:   output_asm_insn (\"b,n %l4\", operands);
                   2058:   if (GET_CODE (operands[1]) == CONST_INT)
                   2059:     output_asm_insn (\"ldo %n1(%0),%5\", operands);
                   2060:   else output_asm_insn (\"sub %0,%1,%5\", operands);
                   2061:   return \"blr %5,0\;nop\";
                   2062: }"
                   2063: [(set_attr "length" "7")])
                   2064:   
                   2065: ;; Need nops for the calls because execution is supposed to continue
                   2066: ;; past; we don't want to nullify an instruction that we need.
                   2067: ;;- jump to subroutine
                   2068: 
                   2069: (define_expand "call"
                   2070:  [(parallel [(call (match_operand:SI 0 "" "")
                   2071:                   (match_operand 1 "" ""))
                   2072:             (clobber (reg:SI 31))
                   2073:             (clobber (reg:SI 2))])]
                   2074:  ""
                   2075:  "
                   2076: {
                   2077:   operands[0] = gen_rtx (MEM, SImode, XEXP (operands[0], 0));
                   2078: }")
                   2079: 
                   2080: (define_insn ""
                   2081:  [(call (mem:SI (match_operand:SI 0 "call_operand_address" "r,S"))
                   2082:        (match_operand 1 "" "i,i"))
                   2083:   (clobber (reg:SI 31))
                   2084:   (clobber (reg:SI 2))]
                   2085:  ""
                   2086:  "*
                   2087: {
                   2088:   if (which_alternative == 0)
                   2089:     return \"copy %0,22\;.CALL\\tARGW0=GR\;bl $$dyncall,31\;copy 31,2\";
                   2090:   else
                   2091:     {
                   2092:       output_arg_descriptor (insn);
                   2093:       return \"bl %0,2%#\";
                   2094:     }
                   2095: }"
                   2096:  [(set_attr "type" "dyncall,call")
                   2097:   (set_attr "length" "3,1")])
                   2098: 
                   2099: (define_expand "call_value"
                   2100:   [(parallel [(set (match_operand 0 "" "")
                   2101:                   (call (match_operand:SI 1 "" "")
                   2102:                         (match_operand 2 "" "")))
                   2103:              (clobber (reg:SI 31))
                   2104:              (clobber (reg:SI 2))])]
                   2105:   ;;- Don't use operand 1 for most machines.
                   2106:   ""
                   2107:   "
                   2108: {
                   2109:   operands[1] = gen_rtx (MEM, SImode, XEXP (operands[1], 0));
                   2110: }")
                   2111: 
                   2112: (define_insn ""
                   2113:   [(set (match_operand 0 "" "=rfx,rfx")
                   2114:        (call (mem:SI (match_operand:SI 1 "call_operand_address" "r,S"))
                   2115:              (match_operand 2 "" "i,i")))
                   2116:    (clobber (reg:SI 31))
                   2117:    (clobber (reg:SI 2))]
                   2118:   ;;- Don't use operand 1 for most machines.
                   2119:   ""
                   2120:   "*
                   2121: {
                   2122:   if (which_alternative == 0)
                   2123:     return \"copy %1,22\;.CALL\\tARGW0=GR\;bl $$dyncall,31\;copy 31,2\";
                   2124:   else
                   2125:     {
                   2126:       output_arg_descriptor (insn);
                   2127:       return \"bl %1,2\;nop\";
                   2128:     }
                   2129: }"
                   2130:  [(set_attr "type" "dyncall")
                   2131:   (set_attr "length" "3,2")])
                   2132: 
                   2133: (define_insn "nop"
                   2134:   [(const_int 0)]
                   2135:   ""
                   2136:   "nop")
                   2137: 
                   2138: ;;; Hope this is only within a function...
                   2139: (define_insn "indirect_jump"
                   2140:   [(set (pc) (match_operand:SI 0 "register_operand" "r"))]
                   2141:   ""
                   2142:  "bv 0(%0)%#"
                   2143:  [(set_attr "type" "branch")])
                   2144: 
                   2145: (define_insn "extzv"
                   2146:   [(set (match_operand:SI 0 "register_operand" "=r")
                   2147:        (zero_extract:SI (match_operand:SI 1 "register_operand" "r")
                   2148:                         (match_operand:SI 2 "uint5_operand" "")
                   2149:                         (match_operand:SI 3 "uint5_operand" "")))]
                   2150:   ""
                   2151:   "extru %1,%3+%2-1,%2,%0")
                   2152: 
                   2153: (define_insn "extv"
                   2154:   [(set (match_operand:SI 0 "register_operand" "=r")
                   2155:        (sign_extract:SI (match_operand:SI 1 "register_operand" "r")
                   2156:                         (match_operand:SI 2 "uint5_operand" "")
                   2157:                         (match_operand:SI 3 "uint5_operand" "")))]
                   2158:   ""
                   2159:   "extrs %1,%3+%2-1,%2,%0")
                   2160: 
                   2161: (define_insn "insv"
                   2162:   [(set (zero_extract:SI (match_operand:SI 0 "register_operand" "=r")
                   2163:                         (match_operand:SI 1 "uint5_operand" "")
                   2164:                         (match_operand:SI 2 "uint5_operand" ""))
                   2165:        (match_operand:SI 3 "register_operand" "r"))]
                   2166:   ""
                   2167:   "dep %3,%2+%1-1,%1,%0")
                   2168: 
                   2169: ;; This insn is used for some loop tests, typically loops reversed when
                   2170: ;; strength reduction is used.  It is actually created when the instruction
                   2171: ;; combination phase combines the special loop test.  Since this insn
                   2172: ;; is both a jump insn and has an output, it must deal with it's own
                   2173: ;; reloads, hence the `m' constraints.  The `!' constraints direct reload
                   2174: ;; to not choose the register alternatives in the event a reload is needed.
                   2175: 
                   2176: (define_insn "decrement_and_branch_until_zero"
                   2177:   [(set (pc)
                   2178:        (if_then_else
                   2179:          (ge (plus:SI (match_operand:SI 0 "register_operand" "+!r,m")
                   2180:                       (const_int -1))
                   2181:              (const_int 0))
                   2182:          (label_ref (match_operand 1 "" ""))
                   2183:          (pc)))
                   2184:    (set (match_dup 0)
                   2185:        (plus:SI (match_dup 0)
                   2186:                 (const_int -1)))
                   2187:    (clobber (match_scratch:SI 2 "=X,r"))]
                   2188:   "find_reg_note (insn, REG_NONNEG, 0)"
                   2189: "*
                   2190: {
                   2191:   if (which_alternative == 0)
                   2192:     if (get_attr_length (insn) == 1)
                   2193:       return \"addib,>= -1,%0,%1%#\";
                   2194:     else
                   2195:       return \"addi,< -1,%0,%0\;bl %1,0%#\";
                   2196:   else
                   2197:     {
                   2198:       output_asm_insn (\"ldw %0,%2\;ldo -1(%2),%2\;stw %2,%0\", operands);
                   2199:       if (get_attr_length (insn) == 4)
                   2200:        return \"comb,> 0,%2,%1%#\";
                   2201:       else
                   2202:        return \"comclr,<= 0,%2,0\;bl %1,0%#\";
                   2203:     }
                   2204: }"
                   2205: [(set_attr "type" "cbranch")
                   2206:  (set (attr "length")
                   2207:       (if_then_else (eq (symbol_ref "which_alternative") (const_int 0))
                   2208:                    (if_then_else (lt (abs (minus (match_dup 1)
                   2209:                                                  (plus (pc) (const_int 2))))
                   2210:                                      (const_int 1023))
                   2211:                                  (const_int 1)
                   2212:                                  (const_int 2))
                   2213:                    (if_then_else (lt (match_dup 1)
                   2214:                                      (pc))
                   2215:                                  (if_then_else
                   2216:                                   (lt (abs (minus (match_dup 1)
                   2217:                                                   (plus (pc)
                   2218:                                                         (const_int 5))))
                   2219:                                       (const_int 1023))
                   2220:                                   (const_int 4)
                   2221:                                   (const_int 5))
                   2222:                                  (if_then_else
                   2223:                                   (lt (abs (minus (match_dup 1)
                   2224:                                                   (plus (pc)
                   2225:                                                         (const_int 2))))
                   2226:                                       (const_int 1023))
                   2227:                                   (const_int 4)
                   2228:                                   (const_int 5)))))])
                   2229: 
                   2230: 
                   2231: 
                   2232: ;;- Local variables:
                   2233: ;;- mode:emacs-lisp
                   2234: ;;- comment-start: ";;- "
                   2235: ;;- eval: (set-syntax-table (copy-sequence (syntax-table)))
                   2236: ;;- eval: (modify-syntax-entry ?[ "(]")
                   2237: ;;- eval: (modify-syntax-entry ?] ")[")
                   2238: ;;- eval: (modify-syntax-entry ?{ "(}")
                   2239: ;;- eval: (modify-syntax-entry ?} "){")
                   2240: ;;- End:

unix.superglobalmegacorp.com

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