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

1.1       root        1: ;;- Machine description for SPARC chip for GNU C compiler
                      2: ;;   Copyright (C) 1987, 1988, 1989, 1992 Free Software Foundation, Inc.
                      3: ;;   Contributed by Michael Tiemann ([email protected])
                      4: 
                      5: ;; This file is part of GNU CC.
                      6: 
                      7: ;; GNU CC is free software; you can redistribute it and/or modify
                      8: ;; it under the terms of the GNU General Public License as published by
                      9: ;; the Free Software Foundation; either version 2, or (at your option)
                     10: ;; any later version.
                     11: 
                     12: ;; GNU CC is distributed in the hope that it will be useful,
                     13: ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
                     14: ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     15: ;; GNU General Public License for more details.
                     16: 
                     17: ;; You should have received a copy of the GNU General Public License
                     18: ;; along with GNU CC; see the file COPYING.  If not, write to
                     19: ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
                     20: 
                     21: 
                     22: ;;- See file "rtl.def" for documentation on define_insn, match_*, et. al.
                     23: 
                     24: ;; Insn type.  Used to default other attribute values.
                     25: 
                     26: ;; type "unary" insns have one input operand (1) and one output operand (0)
                     27: ;; type "binary" insns have two input operands (1,2) and one output (0)
                     28: ;; type "compare" insns have one or two input operands (0,1) and no output
                     29: ;; type "call_no_delay_slot" is a call followed by an unimp instruction.
                     30: 
                     31: (define_attr "type"
                     32:   "move,unary,binary,compare,load,store,branch,call,call_no_delay_slot,address,fpload,fpstore,fp,fpcmp,fpmul,fpdiv,fpsqrt,multi,misc"
                     33:   (const_string "binary"))
                     34: 
                     35: ;; Set true if insn uses call-clobbered intermediate register.
                     36: (define_attr "use_clobbered" "false,true"
                     37:   (if_then_else (and (eq_attr "type" "address")
                     38:                     (match_operand 0 "clobbered_register" ""))
                     39:                (const_string "true")
                     40:                (const_string "false")))
                     41: 
                     42: ;; Length (in # of insns).
                     43: (define_attr "length" ""
                     44:   (cond [(eq_attr "type" "load,fpload")
                     45:         (if_then_else (match_operand 1 "symbolic_memory_operand" "")
                     46:                       (const_int 2) (const_int 1))
                     47: 
                     48:         (eq_attr "type" "store,fpstore")
                     49:         (if_then_else (match_operand 0 "symbolic_memory_operand" "")
                     50:                       (const_int 2) (const_int 1))
                     51: 
                     52:         (eq_attr "type" "address") (const_int 2)
                     53: 
                     54:         (eq_attr "type" "binary")
                     55:         (if_then_else (ior (match_operand 2 "arith_operand" "")
                     56:                            (match_operand 2 "arith_double_operand" ""))
                     57:                       (const_int 1) (const_int 3))
                     58: 
                     59:         (eq_attr "type" "move,unary")
                     60:         (if_then_else (ior (match_operand 1 "arith_operand" "")
                     61:                            (match_operand 1 "arith_double_operand" ""))
                     62:                       (const_int 1) (const_int 2))]
                     63: 
                     64:        (const_int 1)))
                     65: 
                     66: (define_asm_attributes
                     67:   [(set_attr "length" "1")
                     68:    (set_attr "type" "multi")])
                     69: 
                     70: ;; Attributes for instruction and branch scheduling
                     71: 
                     72: (define_attr "in_call_delay" "false,true"
                     73:   (cond [(eq_attr "type" "branch,call,call_no_delay_slot,multi")
                     74:                (const_string "false")
                     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:         (eq_attr "type" "address")
                     80:                (if_then_else (eq_attr "use_clobbered" "false")
                     81:                              (const_string "true")
                     82:                              (const_string "false"))]
                     83:        (if_then_else (eq_attr "length" "1")
                     84:                      (const_string "true")
                     85:                      (const_string "false"))))
                     86: 
                     87: (define_delay (eq_attr "type" "call")
                     88:   [(eq_attr "in_call_delay" "true") (nil) (nil)])
                     89: 
                     90: ;; ??? Should implement the notion of predelay slots for floating point
                     91: ;; branches.  This would allow us to remove the nop always inserted before
                     92: ;; a floating point branch.
                     93: 
                     94: (define_attr "in_branch_delay" "false,true"
                     95:   (if_then_else (and (eq_attr "type" "!branch,call,call_no_delay_slot,multi")
                     96:                     (eq_attr "length" "1"))
                     97:                (const_string "true")
                     98:                (const_string "false")))
                     99: 
                    100: (define_delay (eq_attr "type" "branch")
                    101:   [(eq_attr "in_branch_delay" "true")
                    102:    (nil) (eq_attr "in_branch_delay" "true")])
                    103: 
                    104: ;; Function units of the SPARC
                    105: 
                    106: ;; (define_function_unit {name} {num-units} {n-users} {test}
                    107: ;;                       {ready-delay} {busy-delay} [{conflict-list}])
                    108: 
                    109: ;; The integer ALU.
                    110: ;; (Noted only for documentation; units that take one cycle do not need to
                    111: ;; be specified.)
                    112: 
                    113: ;; (define_function_unit "alu" 1 0
                    114: ;;  (eq_attr "type" "unary,binary,move,address") 1 0)
                    115: 
                    116: ;; Memory with load-delay of 1 (i.e., 2 cycle load).
                    117: (define_function_unit "memory" 1 0 (eq_attr "type" "load,fpload") 2 0)
                    118: 
                    119: ;; SPARC has two floating-point units: the FP ALU,
                    120: ;; and the FP MUL/DIV/SQRT unit.
                    121: ;; Instruction timings on the CY7C602 are as follows
                    122: ;; FABSs       4
                    123: ;; FADDs/d     5/5
                    124: ;; FCMPs/d     4/4
                    125: ;; FDIVs/d     23/37
                    126: ;; FMOVs       4
                    127: ;; FMULs/d     5/7
                    128: ;; FNEGs       4
                    129: ;; FSQRTs/d    34/63
                    130: ;; FSUBs/d     5/5
                    131: ;; FdTOi/s     5/5
                    132: ;; FsTOi/d     5/5
                    133: ;; FiTOs/d     9/5
                    134: 
                    135: ;; The CY7C602 can only support 2 fp isnsn simultaneously.
                    136: ;; More insns cause the chip to stall.  Until we handle this
                    137: ;; better in the scheduler, we use excess cycle times to
                    138: ;; more evenly spread out fp insns.
                    139: 
                    140: (define_function_unit "fp_alu" 1 2 (eq_attr "type" "fp") 8 0)
                    141: (define_function_unit "fp_mul" 1 2 (eq_attr "type" "fpmul") 10 0)
                    142: (define_function_unit "fp_div" 1 2 (eq_attr "type" "fpdiv") 23 0)
                    143: (define_function_unit "fp_sqrt" 1 2 (eq_attr "type" "fpsqrt") 34 0)
                    144: 
                    145: ;; Compare instructions.
                    146: ;; This controls RTL generation and register allocation.
                    147: 
                    148: ;; We generate RTL for comparisons and branches by having the cmpxx 
                    149: ;; patterns store away the operands.  Then, the scc and bcc patterns
                    150: ;; emit RTL for both the compare and the branch.
                    151: ;;
                    152: ;; We do this because we want to generate different code for an sne and
                    153: ;; seq insn.  In those cases, if the second operand of the compare is not
                    154: ;; const0_rtx, we want to compute the xor of the two operands and test
                    155: ;; it against zero.
                    156: ;;
                    157: ;; We start with the DEFINE_EXPANDs, then then DEFINE_INSNs to match
                    158: ;; the patterns.  Finally, we have the DEFINE_SPLITs for some of the scc
                    159: ;; insns that actually require more than one machine instruction.
                    160: 
                    161: ;; Put cmpsi first among compare insns so it matches two CONST_INT operands.
                    162: 
                    163: (define_expand "cmpsi"
                    164:   [(set (reg:CC 0)
                    165:        (compare:CC (match_operand:SI 0 "register_operand" "")
                    166:                    (match_operand:SI 1 "arith_operand" "")))]
                    167:   ""
                    168:   "
                    169: {
                    170:   sparc_compare_op0 = operands[0];
                    171:   sparc_compare_op1 = operands[1];
                    172:   DONE;
                    173: }")
                    174: 
                    175: (define_expand "cmpsf"
                    176:   [(set (reg:CCFP 0)
                    177:        (compare:CCFP (match_operand:SF 0 "register_operand" "")
                    178:                      (match_operand:SF 1 "register_operand" "")))]
                    179:   ""
                    180:   "
                    181: {
                    182:   sparc_compare_op0 = operands[0];
                    183:   sparc_compare_op1 = operands[1];
                    184:   DONE;
                    185: }")
                    186: 
                    187: (define_expand "cmpdf"
                    188:   [(set (reg:CCFP 0)
                    189:        (compare:CCFP (match_operand:DF 0 "register_operand" "")
                    190:                      (match_operand:DF 1 "register_operand" "")))]
                    191:   ""
                    192:   "
                    193: {
                    194:   sparc_compare_op0 = operands[0];
                    195:   sparc_compare_op1 = operands[1];
                    196:   DONE;
                    197: }")
                    198: 
                    199: ;; Next come the scc insns.  For seq, sne, sgeu, and sltu, we can do this
                    200: ;; without jumps using the addx/subx instructions.  For the rest, we do
                    201: ;; branches.  Seq_special and sne_special clobber the CC reg, because they
                    202: ;; generate addcc/subcc instructions.
                    203: 
                    204: (define_expand "seq_special"
                    205:   [(set (match_dup 3) (xor:SI (match_operand:SI 1 "register_operand" "")
                    206:                              (match_operand:SI 2 "register_operand" "")))
                    207:    (parallel [(set (match_operand:SI 0 "register_operand" "")
                    208:                   (eq:SI (match_dup 3) (const_int 0)))
                    209:              (clobber (reg:CC 0))])]
                    210:             
                    211:   ""
                    212:   "{ operands[3] = gen_reg_rtx (SImode); }")
                    213: 
                    214: (define_expand "sne_special"
                    215:   [(set (match_dup 3) (xor:SI (match_operand:SI 1 "register_operand" "")
                    216:                              (match_operand:SI 2 "register_operand" "")))
                    217:    (parallel [(set (match_operand:SI 0 "register_operand" "")
                    218:                   (ne:SI (match_dup 3) (const_int 0)))
                    219:              (clobber (reg:CC 0))])]
                    220:   ""
                    221:   "{ operands[3] = gen_reg_rtx (SImode); }")
                    222: 
                    223: (define_expand "seq"
                    224:   [(set (match_operand:SI 0 "register_operand" "")
                    225:        (eq:SI (match_dup 1) (const_int 0)))]
                    226:   ""
                    227:   "
                    228: { if (GET_MODE (sparc_compare_op0) == SImode)
                    229:     {
                    230:       emit_insn (gen_seq_special (operands[0], sparc_compare_op0,
                    231:                                  sparc_compare_op1));
                    232:       DONE;
                    233:     }
                    234:   else
                    235:     operands[1] = gen_compare_reg (EQ, sparc_compare_op0, sparc_compare_op1);
                    236: }")
                    237: 
                    238: (define_expand "sne"
                    239:   [(set (match_operand:SI 0 "register_operand" "")
                    240:        (ne:SI (match_dup 1) (const_int 0)))]
                    241:   ""
                    242:   "
                    243: { if (GET_MODE (sparc_compare_op0) == SImode)
                    244:     {
                    245:       emit_insn (gen_sne_special (operands[0], sparc_compare_op0,
                    246:                                  sparc_compare_op1));
                    247:       DONE;
                    248:     }
                    249:   else
                    250:     operands[1] = gen_compare_reg (NE, sparc_compare_op0, sparc_compare_op1);
                    251: }")
                    252: 
                    253: (define_expand "sgt"
                    254:   [(set (match_operand:SI 0 "register_operand" "")
                    255:        (gt:SI (match_dup 1) (const_int 0)))]
                    256:   ""
                    257:   "
                    258: { operands[1] = gen_compare_reg (GT, sparc_compare_op0, sparc_compare_op1); }")
                    259: 
                    260: (define_expand "slt"
                    261:   [(set (match_operand:SI 0 "register_operand" "")
                    262:        (lt:SI (match_dup 1) (const_int 0)))]
                    263:   ""
                    264:   "
                    265: { operands[1] = gen_compare_reg (LT, sparc_compare_op0, sparc_compare_op1); }")
                    266: 
                    267: (define_expand "sge"
                    268:   [(set (match_operand:SI 0 "register_operand" "")
                    269:        (ge:SI (match_dup 1) (const_int 0)))]
                    270:   ""
                    271:   "
                    272: { operands[1] = gen_compare_reg (GE, sparc_compare_op0, sparc_compare_op1); }")
                    273: 
                    274: (define_expand "sle"
                    275:   [(set (match_operand:SI 0 "register_operand" "")
                    276:        (le:SI (match_dup 1) (const_int 0)))]
                    277:   ""
                    278:   "
                    279: { operands[1] = gen_compare_reg (LE, sparc_compare_op0, sparc_compare_op1); }")
                    280: 
                    281: (define_expand "sgtu"
                    282:   [(set (match_operand:SI 0 "register_operand" "")
                    283:        (gtu:SI (match_dup 1) (const_int 0)))]
                    284:   ""
                    285:   "
                    286: {
                    287:   rtx tem;
                    288: 
                    289:   /* We can do ltu easily, so if both operands are registers, swap them and
                    290:      do a LTU.  */
                    291:   if ((GET_CODE (sparc_compare_op0) == REG
                    292:        || GET_CODE (sparc_compare_op0) == SUBREG)
                    293:       && (GET_CODE (sparc_compare_op1) == REG
                    294:          || GET_CODE (sparc_compare_op1) == SUBREG))
                    295:     {
                    296:       tem = sparc_compare_op0;
                    297:       sparc_compare_op0 = sparc_compare_op1;
                    298:       sparc_compare_op1 = tem;
                    299:       emit_insn (gen_sltu (operands[0]));
                    300:       DONE;
                    301:     }
                    302: 
                    303:   operands[1] = gen_compare_reg (LEU, sparc_compare_op0, sparc_compare_op1);
                    304: }")
                    305: 
                    306: (define_expand "sltu"
                    307:   [(set (match_operand:SI 0 "register_operand" "")
                    308:        (ltu:SI (match_dup 1) (const_int 0)))]
                    309:   ""
                    310:   "
                    311: { operands[1] = gen_compare_reg (LTU, sparc_compare_op0, sparc_compare_op1);
                    312: }")
                    313: 
                    314: (define_expand "sgeu"
                    315:   [(set (match_operand:SI 0 "register_operand" "")
                    316:        (geu:SI (match_dup 1) (const_int 0)))]
                    317:   ""
                    318:   "
                    319: { operands[1] = gen_compare_reg (GEU, sparc_compare_op0, sparc_compare_op1);
                    320: }")
                    321: 
                    322: (define_expand "sleu"
                    323:   [(set (match_operand:SI 0 "register_operand" "")
                    324:        (leu:SI (match_dup 1) (const_int 0)))]
                    325:   ""
                    326:   "
                    327: {
                    328:   rtx tem;
                    329: 
                    330:   /* We can do geu easily, so if both operands are registers, swap them and
                    331:      do a GEU.  */
                    332:   if ((GET_CODE (sparc_compare_op0) == REG
                    333:        || GET_CODE (sparc_compare_op0) == SUBREG)
                    334:       && (GET_CODE (sparc_compare_op1) == REG
                    335:          || GET_CODE (sparc_compare_op1) == SUBREG))
                    336:     {
                    337:       tem = sparc_compare_op0;
                    338:       sparc_compare_op0 = sparc_compare_op1;
                    339:       sparc_compare_op1 = tem;
                    340:       emit_insn (gen_sgeu (operands[0]));
                    341:       DONE;
                    342:     }
                    343: 
                    344:   operands[1] = gen_compare_reg (LEU, sparc_compare_op0, sparc_compare_op1);
                    345: }")
                    346: 
                    347: ;; Now the DEFINE_INSNs for the compare and scc cases.  First the compares.
                    348: 
                    349: (define_insn ""
                    350:   [(set (reg:CC 0)
                    351:        (compare:CC (match_operand:SI 0 "register_operand" "rJ")
                    352:                    (match_operand:SI 1 "arith_operand" "rI")))]
                    353:   ""
                    354:   "cmp %r0,%1"
                    355:   [(set_attr "type" "compare")])
                    356: 
                    357: (define_insn ""
                    358:   [(set (reg:CCFP 0)
                    359:        (compare:CCFP (match_operand:DF 0 "register_operand" "f")
                    360:                      (match_operand:DF 1 "register_operand" "f")))]
                    361:   ""
                    362:   "fcmped %0,%1"
                    363:   [(set_attr "type" "fpcmp")])
                    364: 
                    365: (define_insn ""
                    366:   [(set (reg:CCFP 0)
                    367:        (compare:CCFP (match_operand:SF 0 "register_operand" "f")
                    368:                      (match_operand:SF 1 "register_operand" "f")))]
                    369:   ""
                    370:   "fcmpes %0,%1"
                    371:   [(set_attr "type" "fpcmp")])
                    372: 
                    373: ;; The SEQ and SNE patterns are special because they can be done
                    374: ;; without any branching and do not involve a COMPARE.
                    375: 
                    376: (define_insn ""
                    377:   [(set (match_operand:SI 0 "register_operand" "=r")
                    378:        (ne:SI (match_operand:SI 1 "register_operand" "r") (const_int 0)))
                    379:    (clobber (reg:CC 0))]
                    380:   ""
                    381:   "subcc %%g0,%1,%%g0\;addx %%g0,0,%0"
                    382:   [(set_attr "type" "unary")
                    383:    (set_attr "length" "2")])
                    384: 
                    385: (define_insn ""
                    386:   [(set (match_operand:SI 0 "register_operand" "=r")
                    387:        (neg:SI (ne:SI (match_operand:SI 1 "register_operand" "r")
                    388:                       (const_int 0))))
                    389:    (clobber (reg:CC 0))]
                    390:   ""
                    391:   "subcc %%g0,%1,%%g0\;subx %%g0,0,%0"
                    392:   [(set_attr "type" "unary")
                    393:    (set_attr "length" "2")])
                    394: 
                    395: (define_insn ""
                    396:   [(set (match_operand:SI 0 "register_operand" "=r")
                    397:        (eq:SI (match_operand:SI 1 "register_operand" "r") (const_int 0)))
                    398:    (clobber (reg:CC 0))]
                    399:   ""
                    400:   "subcc %%g0,%1,%%g0\;subx %%g0,-1,%0"
                    401:   [(set_attr "type" "unary")
                    402:    (set_attr "length" "2")])
                    403: 
                    404: (define_insn ""
                    405:   [(set (match_operand:SI 0 "register_operand" "=r")
                    406:        (neg:SI (eq:SI (match_operand:SI 1 "register_operand" "r")
                    407:                       (const_int 0))))
                    408:    (clobber (reg:CC 0))]
                    409:   ""
                    410:   "subcc %%g0,%1,%%g0\;addx %%g0,-1,%0"
                    411:   [(set_attr "type" "unary")
                    412:    (set_attr "length" "2")])
                    413: 
                    414: ;; We can also do (x + (i == 0)) and related, so put them in.
                    415: 
                    416: (define_insn ""
                    417:   [(set (match_operand:SI 0 "register_operand" "=r")
                    418:        (plus:SI (ne:SI (match_operand:SI 1 "register_operand" "r")
                    419:                        (const_int 0))
                    420:                 (match_operand:SI 2 "register_operand" "r")))
                    421:    (clobber (reg:CC 0))]
                    422:   ""
                    423:   "subcc %%g0,%1,%%g0\;addx %2,0,%0"
                    424:   [(set_attr "length" "2")])
                    425: 
                    426: (define_insn ""
                    427:   [(set (match_operand:SI 0 "register_operand" "=r")
                    428:        (minus:SI (match_operand:SI 2 "register_operand" "r")
                    429:                  (ne:SI (match_operand:SI 1 "register_operand" "r")
                    430:                         (const_int 0))))
                    431:    (clobber (reg:CC 0))]
                    432:   ""
                    433:   "subcc %%g0,%1,%%g0\;subx %2,0,%0"
                    434:   [(set_attr "length" "2")])
                    435: 
                    436: (define_insn ""
                    437:   [(set (match_operand:SI 0 "register_operand" "=r")
                    438:        (plus:SI (eq:SI (match_operand:SI 1 "register_operand" "r")
                    439:                        (const_int 0))
                    440:                 (match_operand:SI 2 "register_operand" "r")))
                    441:    (clobber (reg:CC 0))]
                    442:   ""
                    443:   "subcc %%g0,%1,%%g0\;subx %2,-1,%0"
                    444:   [(set_attr "length" "2")])
                    445: 
                    446: (define_insn ""
                    447:   [(set (match_operand:SI 0 "register_operand" "=r")
                    448:        (minus:SI (match_operand:SI 2 "register_operand" "r")
                    449:                  (eq:SI (match_operand:SI 1 "register_operand" "r")
                    450:                         (const_int 0))))
                    451:    (clobber (reg:CC 0))]
                    452:   ""
                    453:   "subcc %%g0,%1,%%g0\;addx %2,-1,%0"
                    454:   [(set_attr "type" "unary")
                    455:    (set_attr "length" "2")])
                    456: 
                    457: ;; We can also do GEU and LTU directly, but these operate after a
                    458: ;; compare.
                    459: 
                    460: (define_insn ""
                    461:   [(set (match_operand:SI 0 "register_operand" "=r")
                    462:        (ltu:SI (reg:CC 0) (const_int 0)))]
                    463:   ""
                    464:   "addx %%g0,0,%0"
                    465:   [(set_attr "type" "misc")])
                    466: 
                    467: (define_insn ""
                    468:   [(set (match_operand:SI 0 "register_operand" "=r")
                    469:        (neg:SI (ltu:SI (reg:CC 0) (const_int 0))))]
                    470:   ""
                    471:   "subx %%g0,0,%0"
                    472:   [(set_attr "type" "misc")])
                    473: 
                    474: ;; ??? Combine should canonicalize these next two to the same pattern.
                    475: (define_insn ""
                    476:   [(set (match_operand:SI 0 "register_operand" "=r")
                    477:        (minus:SI (neg:SI (ltu:SI (reg:CC 0) (const_int 0)))
                    478:                  (match_operand:SI 1 "arith_operand" "rI")))]
                    479:   ""
                    480:   "subx %%g0,%1,%0"
                    481:   [(set_attr "type" "unary")])
                    482: 
                    483: (define_insn ""
                    484:   [(set (match_operand:SI 0 "register_operand" "=r")
                    485:        (neg:SI (plus:SI (ltu:SI (reg:CC 0) (const_int 0))
                    486:                         (match_operand:SI 1 "arith_operand" "rI"))))]
                    487:   ""
                    488:   "subx %%g0,%1,%0"
                    489:   [(set_attr "type" "unary")])
                    490: 
                    491: (define_insn ""
                    492:   [(set (match_operand:SI 0 "register_operand" "=r")
                    493:        (geu:SI (reg:CC 0) (const_int 0)))]
                    494:   ""
                    495:   "subx %%g0,-1,%0"
                    496:   [(set_attr "type" "misc")])
                    497: 
                    498: (define_insn ""
                    499:   [(set (match_operand:SI 0 "register_operand" "=r")
                    500:        (neg:SI (geu:SI (reg:CC 0) (const_int 0))))]
                    501:   ""
                    502:   "addx %%g0,-1,%0"
                    503:   [(set_attr "type" "misc")])
                    504: 
                    505: ;; We can also do (x + ((unsigned) i >= 0)) and related, so put them in.
                    506: 
                    507: (define_insn ""
                    508:   [(set (match_operand:SI 0 "register_operand" "=r")
                    509:        (plus:SI (ltu:SI (reg:CC 0) (const_int 0))
                    510:                 (match_operand:SI 1 "arith_operand" "rI")))]
                    511:   ""
                    512:   "addx %%g0,%1,%0"
                    513:   [(set_attr "type" "unary")])
                    514: 
                    515: (define_insn ""
                    516:   [(set (match_operand:SI 0 "register_operand" "=r")
                    517:        (plus:SI (ltu:SI (reg:CC 0) (const_int 0))
                    518:                 (plus:SI (match_operand:SI 1 "arith_operand" "%r")
                    519:                          (match_operand:SI 2 "arith_operand" "rI"))))]
                    520:   ""
                    521:   "addx %1,%2,%0"
                    522:   [(set_attr "type" "binary")])
                    523: 
                    524: (define_insn ""
                    525:   [(set (match_operand:SI 0 "register_operand" "=r")
                    526:        (minus:SI (match_operand:SI 1 "register_operand" "r")
                    527:                  (ltu:SI (reg:CC 0) (const_int 0))))]
                    528:   ""
                    529:   "subx %1,0,%0"
                    530:   [(set_attr "type" "unary")])
                    531: 
                    532: ;; ??? Combine should canonicalize these next two to the same pattern.
                    533: (define_insn ""
                    534:   [(set (match_operand:SI 0 "register_operand" "=r")
                    535:        (minus:SI (minus:SI (match_operand:SI 1 "register_operand" "r")
                    536:                            (match_operand:SI 2 "arith_operand" "rI"))
                    537:                  (ltu:SI (reg:CC 0) (const_int 0))))]
                    538:   ""
                    539:   "subx %1,%2,%0"
                    540:   [(set_attr "type" "binary")])
                    541: 
                    542: (define_insn ""
                    543:   [(set (match_operand:SI 0 "register_operand" "=r")
                    544:        (minus:SI (match_operand:SI 1 "register_operand" "r")
                    545:                  (plus:SI (ltu:SI (reg:CC 0) (const_int 0))
                    546:                           (match_operand:SI 2 "arith_operand" "rI"))))]
                    547:   ""
                    548:   "subx %1,%2,%0"
                    549:   [(set_attr "type" "binary")])
                    550: 
                    551: (define_insn ""
                    552:   [(set (match_operand:SI 0 "register_operand" "=r")
                    553:        (plus:SI (geu:SI (reg:CC 0) (const_int 0))
                    554:                 (match_operand:SI 1 "register_operand" "r")))]
                    555:   ""
                    556:   "subx %1,-1,%0"
                    557:   [(set_attr "type" "unary")])
                    558: 
                    559: (define_insn ""
                    560:   [(set (match_operand:SI 0 "register_operand" "=r")
                    561:        (minus:SI (match_operand:SI 1 "register_operand" "r")
                    562:                  (geu:SI (reg:CC 0) (const_int 0))))]
                    563:   ""
                    564:   "addx %1,-1,%0"
                    565:   [(set_attr "type" "unary")])
                    566: 
                    567: ;; Now we have the generic scc insns.  These will be done using a jump.
                    568: ;; We have to exclude the cases above, since we will not want combine to
                    569: ;; turn something that does not require a jump into something that does.
                    570: (define_insn ""
                    571:   [(set (match_operand:SI 0 "register_operand" "=r")
                    572:        (match_operator:SI 1 "normal_comp_operator" [(reg 0) (const_int 0)]))]
                    573:   ""
                    574:   "* return output_scc_insn (operands, insn); "
                    575:   [(set_attr "type" "multi")])
                    576: 
                    577: ;; These control RTL generation for conditional jump insns
                    578: 
                    579: (define_expand "beq"
                    580:   [(set (pc)
                    581:        (if_then_else (eq (match_dup 1) (const_int 0))
                    582:                      (label_ref (match_operand 0 "" ""))
                    583:                      (pc)))]
                    584:   ""
                    585:   "
                    586: { operands[1] = gen_compare_reg (EQ, sparc_compare_op0, sparc_compare_op1); }")
                    587: 
                    588: (define_expand "bne"
                    589:   [(set (pc)
                    590:        (if_then_else (ne (match_dup 1) (const_int 0))
                    591:                      (label_ref (match_operand 0 "" ""))
                    592:                      (pc)))]
                    593:   ""
                    594:   "
                    595: { operands[1] = gen_compare_reg (NE, sparc_compare_op0, sparc_compare_op1); }")
                    596: 
                    597: (define_expand "bgt"
                    598:   [(set (pc)
                    599:        (if_then_else (gt (match_dup 1) (const_int 0))
                    600:                      (label_ref (match_operand 0 "" ""))
                    601:                      (pc)))]
                    602:   ""
                    603:   "
                    604: { operands[1] = gen_compare_reg (GT, sparc_compare_op0, sparc_compare_op1); }")
                    605: 
                    606: (define_expand "bgtu"
                    607:   [(set (pc)
                    608:        (if_then_else (gtu (match_dup 1) (const_int 0))
                    609:                      (label_ref (match_operand 0 "" ""))
                    610:                      (pc)))]
                    611:   ""
                    612:   "
                    613: { operands[1] = gen_compare_reg (GTU, sparc_compare_op0, sparc_compare_op1);
                    614: }")
                    615: 
                    616: (define_expand "blt"
                    617:   [(set (pc)
                    618:        (if_then_else (lt (match_dup 1) (const_int 0))
                    619:                      (label_ref (match_operand 0 "" ""))
                    620:                      (pc)))]
                    621:   ""
                    622:   "
                    623: { operands[1] = gen_compare_reg (LT, sparc_compare_op0, sparc_compare_op1); }")
                    624: 
                    625: (define_expand "bltu"
                    626:   [(set (pc)
                    627:        (if_then_else (ltu (match_dup 1) (const_int 0))
                    628:                      (label_ref (match_operand 0 "" ""))
                    629:                      (pc)))]
                    630:   ""
                    631:   "
                    632: { operands[1] = gen_compare_reg (LTU, sparc_compare_op0, sparc_compare_op1);
                    633: }")
                    634: 
                    635: (define_expand "bge"
                    636:   [(set (pc)
                    637:        (if_then_else (ge (match_dup 1) (const_int 0))
                    638:                      (label_ref (match_operand 0 "" ""))
                    639:                      (pc)))]
                    640:   ""
                    641:   "
                    642: { operands[1] = gen_compare_reg (GE, sparc_compare_op0, sparc_compare_op1); }")
                    643: 
                    644: (define_expand "bgeu"
                    645:   [(set (pc)
                    646:        (if_then_else (geu (match_dup 1) (const_int 0))
                    647:                      (label_ref (match_operand 0 "" ""))
                    648:                      (pc)))]
                    649:   ""
                    650:   "
                    651: { operands[1] = gen_compare_reg (GEU, sparc_compare_op0, sparc_compare_op1);
                    652: }")
                    653: 
                    654: (define_expand "ble"
                    655:   [(set (pc)
                    656:        (if_then_else (le (match_dup 1) (const_int 0))
                    657:                      (label_ref (match_operand 0 "" ""))
                    658:                      (pc)))]
                    659:   ""
                    660:   "
                    661: { operands[1] = gen_compare_reg (LE, sparc_compare_op0, sparc_compare_op1); }")
                    662: 
                    663: (define_expand "bleu"
                    664:   [(set (pc)
                    665:        (if_then_else (leu (match_dup 1) (const_int 0))
                    666:                      (label_ref (match_operand 0 "" ""))
                    667:                      (pc)))]
                    668:   ""
                    669:   "
                    670: { operands[1] = gen_compare_reg (LEU, sparc_compare_op0, sparc_compare_op1);
                    671: }")
                    672: 
                    673: ;; Now match both normal and inverted jump.
                    674: 
                    675: (define_insn ""
                    676:   [(set (pc)
                    677:        (if_then_else (match_operator 0 "noov_compare_op"
                    678:                                      [(reg 0) (const_int 0)])
                    679:                      (label_ref (match_operand 1 "" ""))
                    680:                      (pc)))]
                    681:   ""
                    682:   "*
                    683: {
                    684:   return output_cbranch (operands[0], 1, 0,
                    685:                         final_sequence && INSN_ANNULLED_BRANCH_P (insn),
                    686:                         ! final_sequence);
                    687: }"
                    688:   [(set_attr "type" "branch")])
                    689: 
                    690: (define_insn ""
                    691:   [(set (pc)
                    692:        (if_then_else (match_operator 0 "noov_compare_op"
                    693:                                      [(reg 0) (const_int 0)])
                    694:                      (pc)
                    695:                      (label_ref (match_operand 1 "" ""))))]
                    696:   ""
                    697:   "*
                    698: {
                    699:   return output_cbranch (operands[0], 1, 1,
                    700:                         final_sequence && INSN_ANNULLED_BRANCH_P (insn),
                    701:                         ! final_sequence);
                    702: }"
                    703:   [(set_attr "type" "branch")])
                    704: 
                    705: ;; Move instructions
                    706: 
                    707: (define_expand "movsi"
                    708:   [(set (match_operand:SI 0 "general_operand" "")
                    709:        (match_operand:SI 1 "general_operand" ""))]
                    710:   ""
                    711:   "
                    712: {
                    713:   if (emit_move_sequence (operands, SImode, 0))
                    714:     DONE;
                    715: }")
                    716: 
                    717: (define_expand "reload_insi"
                    718:   [(set (match_operand:SI 0 "register_operand" "=r")
                    719:        (match_operand:SI 1 "general_operand" ""))
                    720:    (clobber (match_operand:SI 2 "register_operand" "=&r"))]
                    721:   ""
                    722:   "
                    723: {
                    724:   if (emit_move_sequence (operands, SImode, operands[2]))
                    725:     DONE;
                    726: 
                    727:   /* We don't want the clobber emitted, so handle this ourselves.  */
                    728:   emit_insn (gen_rtx (SET, VOIDmode, operands[0], operands[1]));
                    729:   DONE;
                    730: }")
                    731: 
                    732: ;; We must support both 'r' and 'f' registers here, because combine may
                    733: ;; convert SFmode hard registers to SImode hard registers when simplifying
                    734: ;; subreg sets.
                    735: 
                    736: ;; We cannot combine the similar 'r' and 'f' constraints, because it causes
                    737: ;; problems with register allocation.  Reload might try to put an interger
                    738: ;; in an fp register, or an fp number is an integer register.
                    739: 
                    740: (define_insn ""
                    741:   [(set (match_operand:SI 0 "reg_or_nonsymb_mem_operand" "=r,r,r,f,Q,Q,rf")
                    742:        (match_operand:SI 1 "move_operand" "rI,K,Q,!Q,rJ,!f,!fr"))]
                    743:   "register_operand (operands[0], SImode)
                    744:    || register_operand (operands[1], SImode)
                    745:    || operands[1] == const0_rtx"
                    746:   "@
                    747:    mov %1,%0
                    748:    sethi %%hi(%a1),%0
                    749:    ld %1,%0
                    750:    ld %1,%0
                    751:    st %r1,%0
                    752:    st %r1,%0
                    753:    st %r1,[%%fp-4]\;ld [%%fp-4],%0"
                    754:   [(set_attr "type" "move,move,load,load,store,store,misc")
                    755:    (set_attr "length" "*,1,*,*,*,*,2")])
                    756: 
                    757: ;; Special pic pattern, for loading the address of a label into a register.
                    758: ;; It clobbers o7 because the call puts the return address (i.e. pc value)
                    759: ;; there.
                    760: 
                    761: (define_insn ""
                    762:   [(set (match_operand:SI 0 "register_operand" "=r")
                    763:        (match_operand:SI 1 "move_pic_label" "i"))
                    764:    (set (reg:SI 15) (pc))]
                    765:   ""
                    766:   "\\n1:\;call 2f\;sethi %%hi(%l1-1b),%0\\n2:\\tor %0,%%lo(%l1-1b),%0\;add %0,%%o7,%0"
                    767:   [(set_attr "type" "multi")
                    768:    (set_attr "length" "4")])
                    769: 
                    770: (define_insn ""
                    771:   [(set (match_operand:DI 0 "register_operand" "=r")
                    772:        (high:DI (match_operand 1 "" "")))]
                    773:   "check_pic (1)"
                    774:   "*
                    775: {
                    776:   rtx op0 = operands[0];
                    777:   rtx op1 = operands[1];
                    778: 
                    779:   if (GET_CODE (op1) == CONST_INT)
                    780:     {
                    781:       operands[0] = operand_subword (op0, 1, 0, DImode);
                    782:       output_asm_insn (\"sethi %%hi(%a1),%0\", operands);
                    783: 
                    784:       operands[0] = operand_subword (op0, 0, 0, DImode);
                    785:       if (INTVAL (op1) < 0)
                    786:        output_asm_insn (\"mov -1,%0\", operands);
                    787:       else
                    788:        output_asm_insn (\"mov 0,%0\", operands);
                    789:     }
                    790:   else if (GET_CODE (op1) == CONST_DOUBLE)
                    791:     {
                    792:       operands[0] = operand_subword (op0, 1, 0, DImode);
                    793:       operands[1] = gen_rtx (CONST_INT, VOIDmode, CONST_DOUBLE_HIGH (op1));
                    794:       output_asm_insn (\"sethi %%hi(%a1),%0\", operands);
                    795: 
                    796:       operands[0] = operand_subword (op0, 0, 0, DImode);
                    797:       operands[1] = gen_rtx (CONST_INT, VOIDmode, CONST_DOUBLE_LOW (op1));
                    798:       output_asm_insn (singlemove_string (operands), operands);
                    799:     }
                    800:   else
                    801:     abort ();
                    802: }"
                    803:   [(set_attr "type" "move")
                    804:    (set_attr "length" "2")])
                    805: 
                    806: (define_insn ""
                    807:   [(set (match_operand:SI 0 "register_operand" "=r")
                    808:        (high:SI (match_operand 1 "" "")))]
                    809:   "check_pic (1)"
                    810:   "sethi %%hi(%a1),%0"
                    811:   [(set_attr "type" "move")
                    812:    (set_attr "length" "1")])
                    813: 
                    814: (define_insn ""
                    815:   [(set (match_operand:HI 0 "register_operand" "=r")
                    816:        (high:HI (match_operand 1 "" "")))]
                    817:   "check_pic (1)"
                    818:   "sethi %%hi(%a1),%0"
                    819:   [(set_attr "type" "move")
                    820:    (set_attr "length" "1")])
                    821: 
                    822: (define_insn ""
                    823:   [(set (match_operand:DI 0 "register_operand" "=r")
                    824:        (lo_sum:DI (match_operand:DI 1 "register_operand" "r")
                    825:                   (match_operand:DI 2 "immediate_operand" "in")))]
                    826:   ""
                    827:   "or %R1,%%lo(%a2),%R0"
                    828:   ;; Need to set length for this arith insn because operand2
                    829:   ;; is not an "arith_operand".
                    830:   [(set_attr "length" "1")])
                    831: 
                    832: (define_insn ""
                    833:   [(set (match_operand:SI 0 "register_operand" "=r")
                    834:        (lo_sum:SI (match_operand:SI 1 "register_operand" "r")
                    835:                   (match_operand:SI 2 "immediate_operand" "in")))]
                    836:   ""
                    837:   "or %1,%%lo(%a2),%0"
                    838:   ;; Need to set length for this arith insn because operand2
                    839:   ;; is not an "arith_operand".
                    840:   [(set_attr "length" "1")])
                    841: 
                    842: (define_insn ""
                    843:   [(set (mem:SI (match_operand:SI 0 "symbolic_operand" ""))
                    844:        (match_operand:SI 1 "reg_or_0_operand" "rJ"))
                    845:    (clobber (match_scratch:SI 2 "=&r"))]
                    846:   ""
                    847:   "sethi %%hi(%a0),%2\;st %r1,[%2+%%lo(%a0)]"
                    848:   [(set_attr "type" "store")
                    849:    (set_attr "length" "2")])
                    850: 
                    851: (define_expand "movhi"
                    852:   [(set (match_operand:HI 0 "general_operand" "")
                    853:        (match_operand:HI 1 "general_operand" ""))]
                    854:   ""
                    855:   "
                    856: {
                    857:   if (emit_move_sequence (operands, HImode, 0))
                    858:     DONE;
                    859: }")
                    860: 
                    861: (define_insn ""
                    862:   [(set (match_operand:HI 0 "reg_or_nonsymb_mem_operand" "=r,r,r,Q")
                    863:        (match_operand:HI 1 "move_operand" "rI,K,Q,rJ"))]
                    864:   "register_operand (operands[0], HImode)
                    865:    || register_operand (operands[1], HImode)
                    866:    || operands[1] == const0_rtx"
                    867:   "@
                    868:    mov %1,%0
                    869:    sethi %%hi(%a1),%0
                    870:    lduh %1,%0
                    871:    sth %r1,%0"
                    872:   [(set_attr "type" "move,move,load,store")
                    873:    (set_attr "length" "*,1,*,1")])
                    874: 
                    875: (define_insn ""
                    876:   [(set (match_operand:HI 0 "register_operand" "=r")
                    877:        (lo_sum:HI (match_operand:HI 1 "register_operand" "r")
                    878:                   (match_operand 2 "immediate_operand" "in")))]
                    879:   ""
                    880:   "or %1,%%lo(%a2),%0"
                    881:   [(set_attr "length" "1")])
                    882: 
                    883: (define_insn ""
                    884:   [(set (mem:HI (match_operand:SI 0 "symbolic_operand" ""))
                    885:        (match_operand:HI 1 "reg_or_0_operand" "rJ"))
                    886:    (clobber (match_scratch:SI 2 "=&r"))]
                    887:   ""
                    888:   "sethi %%hi(%a0),%2\;sth %r1,[%2+%%lo(%a0)]"
                    889:   [(set_attr "type" "store")
                    890:    (set_attr "length" "2")])
                    891: 
                    892: (define_expand "movqi"
                    893:   [(set (match_operand:QI 0 "general_operand" "")
                    894:        (match_operand:QI 1 "general_operand" ""))]
                    895:   ""
                    896:   "
                    897: {
                    898:   if (emit_move_sequence (operands, QImode, 0))
                    899:     DONE;
                    900: }")
                    901: 
                    902: (define_insn ""
                    903:   [(set (match_operand:QI 0 "reg_or_nonsymb_mem_operand" "=r,r,r,Q")
                    904:        (match_operand:QI 1 "move_operand" "rI,K,Q,rJ"))]
                    905:   "register_operand (operands[0], QImode)
                    906:    || register_operand (operands[1], QImode)
                    907:    || operands[1] == const0_rtx"
                    908:   "@
                    909:    mov %1,%0
                    910:    sethi %%hi(%a1),%0
                    911:    ldub %1,%0
                    912:    stb %r1,%0"
                    913:   [(set_attr "type" "move,move,load,store")
                    914:    (set_attr "length" "*,1,*,1")])
                    915: 
                    916: (define_insn ""
                    917:   [(set (match_operand:QI 0 "register_operand" "=r")
                    918:        (subreg:QI (lo_sum:SI (match_operand:QI 1 "register_operand" "r")
                    919:                              (match_operand 2 "immediate_operand" "in")) 0))]
                    920:   ""
                    921:   "or %1,%%lo(%a2),%0"
                    922:   [(set_attr "length" "1")])
                    923: 
                    924: (define_insn ""
                    925:   [(set (mem:QI (match_operand:SI 0 "symbolic_operand" ""))
                    926:        (match_operand:QI 1 "reg_or_0_operand" "rJ"))
                    927:    (clobber (match_scratch:SI 2 "=&r"))]
                    928:   ""
                    929:   "sethi %%hi(%a0),%2\;stb %r1,[%2+%%lo(%a0)]"
                    930:   [(set_attr "type" "store")
                    931:    (set_attr "length" "2")])
                    932: 
                    933: ;; The definition of this insn does not really explain what it does,
                    934: ;; but it should suffice
                    935: ;; that anything generated as this insn will be recognized as one
                    936: ;; and that it will not successfully combine with anything.
                    937: (define_expand "movstrsi"
                    938:   [(parallel [(set (mem:BLK (match_operand:BLK 0 "general_operand" ""))
                    939:                   (mem:BLK (match_operand:BLK 1 "general_operand" "")))
                    940:              (use (match_operand:SI 2 "arith32_operand" ""))
                    941:              (use (match_operand:SI 3 "immediate_operand" ""))
                    942:              (clobber (match_dup 0))
                    943:              (clobber (match_dup 1))
                    944:              (clobber (match_scratch:SI 4 ""))
                    945:              (clobber (reg:SI 0))
                    946:              (clobber (reg:SI 1))])]
                    947:   ""
                    948:   "
                    949: {
                    950:   if (GET_CODE (operands[2]) == CONST_INT
                    951:       && GET_CODE (operands[3]) == CONST_INT
                    952:       && INTVAL (operands[2]) / INTVAL (operands[3]) > 32)
                    953:     FAIL;
                    954: 
                    955:   operands[0] = copy_to_mode_reg (Pmode, XEXP (operands[0], 0));
                    956:   operands[1] = copy_to_mode_reg (Pmode, XEXP (operands[1], 0));
                    957:   operands[2] = force_not_mem (operands[2]);
                    958: }")
                    959: 
                    960: (define_insn ""
                    961:   [(set (mem:BLK (match_operand:SI 0 "register_operand" "r"))
                    962:        (mem:BLK (match_operand:SI 1 "register_operand" "r")))
                    963:    (use (match_operand:SI 2 "arith32_operand" "rn"))
                    964:    (use (match_operand:SI 3 "immediate_operand" "i"))
                    965:    (clobber (match_dup 0))
                    966:    (clobber (match_dup 1))
                    967:    (clobber (match_scratch:SI 4 "=&r"))
                    968:    (clobber (reg:SI 0))
                    969:    (clobber (reg:SI 1))]
                    970:   ""
                    971:   "* return output_block_move (operands);"
                    972:   [(set_attr "type" "multi")])
                    973: 
                    974: ;; Floating point move insns
                    975: 
                    976: ;; This pattern forces (set (reg:DF ...) (const_double ...))
                    977: ;; to be reloaded by putting the constant into memory.
                    978: ;; It must come before the more general movdf pattern.
                    979: ;; ??? A similar pattern for SF mode values would also be useful, but it
                    980: ;; is not as easy to write.
                    981: (define_insn ""
                    982:   [(set (match_operand:DF 0 "general_operand" "=?r,r,f,o")
                    983:        (match_operand:DF 1 "" "?E,G,m,G"))]
                    984:   "GET_CODE (operands[1]) == CONST_DOUBLE"
                    985:   "*
                    986: {
                    987:   switch (which_alternative)
                    988:     {
                    989:     case 0:
                    990:       return output_move_double (operands);
                    991:     case 1:
                    992:       return \"mov %%g0,%0\;mov %%g0,%R0\";
                    993:     case 2:
                    994:       return output_fp_move_double (operands);
                    995:     case 3:
                    996:       operands[1] = adj_offsettable_operand (operands[0], 4);
                    997:       return \"st %%g0,%0\;st %%g0,%1\";
                    998:     }
                    999: }"
                   1000:   [(set_attr "type" "load,move,fpload,store")
                   1001:    (set_attr "length" "3,2,3,3")])
                   1002: 
                   1003: (define_expand "movdf"
                   1004:   [(set (match_operand:DF 0 "general_operand" "")
                   1005:        (match_operand:DF 1 "general_operand" ""))]
                   1006:   ""
                   1007:   "
                   1008: {
                   1009:   if (emit_move_sequence (operands, DFmode, 0))
                   1010:     DONE;
                   1011: }")
                   1012: 
                   1013: (define_insn ""
                   1014:   [(set (match_operand:DF 0 "reg_or_nonsymb_mem_operand" "=f,r,Q,Q,f,&r,?f,?r")
                   1015:        (match_operand:DF 1 "reg_or_nonsymb_mem_operand" "f,r,f,r,Q,Q,r,f"))]
                   1016:   "register_operand (operands[0], DFmode)
                   1017:    || register_operand (operands[1], DFmode)"
                   1018:   "*
                   1019: {
                   1020:   if (FP_REG_P (operands[0]) || FP_REG_P (operands[1]))
                   1021:     return output_fp_move_double (operands);
                   1022:   return output_move_double (operands);
                   1023: }"
                   1024:   [(set_attr "type" "fp,move,fpstore,store,fpload,load,multi,multi")
                   1025:    (set_attr "length" "2,2,3,3,3,3,3,3")])
                   1026: 
                   1027: (define_insn ""
                   1028:   [(set (mem:DF (match_operand:SI 0 "symbolic_operand" "i,i"))
                   1029:        (match_operand:DF 1 "reg_or_0_operand" "rf,G"))
                   1030:    (clobber (match_scratch:SI 2 "=&r,&r"))]
                   1031:   ""
                   1032:   "*
                   1033: {
                   1034:   output_asm_insn (\"sethi %%hi(%a0),%2\", operands);
                   1035:   if (which_alternative == 0)
                   1036:     return \"std %1,[%2+%%lo(%a0)]\";
                   1037:   else
                   1038:     return \"st %%g0,[%2+%%lo(%a0)]\;st %%g0,[%2+%%lo(%a0+4)]\";
                   1039: }"
                   1040:   [(set_attr "type" "store")
                   1041:    (set_attr "length" "3")])
                   1042: 
                   1043: ;; Double-word move insns.
                   1044: 
                   1045: (define_expand "movdi"
                   1046:   [(set (match_operand:DI 0 "reg_or_nonsymb_mem_operand" "")
                   1047:        (match_operand:DI 1 "general_operand" ""))]
                   1048:   ""
                   1049:   "
                   1050: {
                   1051:   if (emit_move_sequence (operands, DImode, 0))
                   1052:     DONE;
                   1053: }")
                   1054: 
                   1055: (define_insn ""
                   1056:   [(set (match_operand:DI 0 "reg_or_nonsymb_mem_operand" "=r,Q,&r,&r,?f,?f,?f,?r,?Q")
                   1057:        (match_operand:DI 1 "general_operand" "r,r,Q,i,r,f,Q,f,f"))]
                   1058:   "register_operand (operands[0], DImode)
                   1059:    || register_operand (operands[1], DImode)
                   1060:    || operands[1] == const0_rtx"
                   1061:   "*
                   1062: {
                   1063:   if (FP_REG_P (operands[0]) || FP_REG_P (operands[1]))
                   1064:     return output_fp_move_double (operands);
                   1065:   return output_move_double (operands);
                   1066: }"
                   1067:   [(set_attr "type" "move,store,load,misc,multi,fp,fpload,multi,fpstore")
                   1068:    (set_attr "length" "2,3,3,3,3,2,3,3,3")])
                   1069: 
                   1070: ;; Floating-point move insns.
                   1071: 
                   1072: (define_expand "movsf"
                   1073:   [(set (match_operand:SF 0 "general_operand" "")
                   1074:        (match_operand:SF 1 "general_operand" ""))]
                   1075:   ""
                   1076:   "
                   1077: {
                   1078:   if (emit_move_sequence (operands, SFmode, 0))
                   1079:     DONE;
                   1080: }")
                   1081: 
                   1082: (define_insn ""
                   1083:   [(set (match_operand:SF 0 "reg_or_nonsymb_mem_operand" "=f,r,rf,f,r,Q,Q")
                   1084:        (match_operand:SF 1 "reg_or_nonsymb_mem_operand" "f,r,!rf,Q,Q,f,r"))]
                   1085:   "register_operand (operands[0], SFmode)
                   1086:    || register_operand (operands[1], SFmode)"
                   1087:   "@
                   1088:    fmovs %1,%0
                   1089:    mov %1,%0
                   1090:    st %r1,[%%fp-4]\;ld [%%fp-4],%0
                   1091:    ld %1,%0
                   1092:    ld %1,%0
                   1093:    st %r1,%0
                   1094:    st %r1,%0"
                   1095:   [(set_attr "type" "fp,move,multi,fpload,load,fpstore,store")
                   1096:    (set_attr "length" "*,*,2,*,*,*,*")])
                   1097: 
                   1098: (define_insn ""
                   1099:   [(set (mem:SF (match_operand:SI 0 "symbolic_operand" "i"))
                   1100:        (match_operand:SF 1 "reg_or_0_operand" "rfG"))
                   1101:    (clobber (match_scratch:SI 2 "=&r"))]
                   1102:   ""
                   1103:   "sethi %%hi(%a0),%2\;st %r1,[%2+%%lo(%a0)]"
                   1104:   [(set_attr "type" "store")
                   1105:    (set_attr "length" "2")])
                   1106: 
                   1107: ;;- zero extension instructions
                   1108: 
                   1109: ;; These patterns originally accepted general_operands, however, slightly
                   1110: ;; better code is generated by only accepting register_operands, and then
                   1111: ;; letting combine generate the ldu[hb] insns.
                   1112: 
                   1113: (define_expand "zero_extendhisi2"
                   1114:   [(set (match_operand:SI 0 "register_operand" "")
                   1115:        (zero_extend:SI (match_operand:HI 1 "register_operand" "")))]
                   1116:   ""
                   1117:   "
                   1118: {
                   1119:   rtx temp = gen_reg_rtx (SImode);
                   1120:   rtx shift_16 = gen_rtx (CONST_INT, VOIDmode, 16);
                   1121: 
                   1122:   if (GET_CODE (operand1) == SUBREG)
                   1123:     operand1 = XEXP (operand1, 0);
                   1124: 
                   1125:   emit_insn (gen_ashlsi3 (temp, gen_rtx (SUBREG, SImode, operand1, 0),
                   1126:                          shift_16));
                   1127:   emit_insn (gen_lshrsi3 (operand0, temp, shift_16));
                   1128:   DONE;
                   1129: }")
                   1130: 
                   1131: (define_insn ""
                   1132:   [(set (match_operand:SI 0 "register_operand" "=r")
                   1133:        (zero_extend:SI (match_operand:HI 1 "memory_operand" "m")))]
                   1134:   ""
                   1135:   "lduh %1,%0"
                   1136:   [(set_attr "type" "load")])
                   1137: 
                   1138: (define_expand "zero_extendqihi2"
                   1139:   [(set (match_operand:HI 0 "register_operand" "")
                   1140:        (zero_extend:HI (match_operand:QI 1 "register_operand" "")))]
                   1141:   ""
                   1142:   "")
                   1143: 
                   1144: (define_insn ""
                   1145:   [(set (match_operand:HI 0 "register_operand" "=r,r,r")
                   1146:        (zero_extend:HI (match_operand:QI 1 "sparc_operand" "r,I,Q")))]
                   1147:   "GET_CODE (operands[1]) != CONST_INT"
                   1148:   "@
                   1149:    and %1,0xff,%0;
                   1150:    mov (%1 & 0xff),%0
                   1151:    ldub %1,%0"
                   1152:   [(set_attr "type" "unary,move,load")
                   1153:    (set_attr "length" "1")])
                   1154: 
                   1155: (define_expand "zero_extendqisi2"
                   1156:   [(set (match_operand:SI 0 "register_operand" "")
                   1157:        (zero_extend:SI (match_operand:QI 1 "register_operand" "")))]
                   1158:   ""
                   1159:   "")
                   1160: 
                   1161: (define_insn ""
                   1162:   [(set (match_operand:SI 0 "register_operand" "=r,r,r")
                   1163:        (zero_extend:SI (match_operand:QI 1 "sparc_operand" "r,I,Q")))]
                   1164:   "GET_CODE (operands[1]) != CONST_INT"
                   1165:   "@
                   1166:    and %1,0xff,%0
                   1167:    mov (%1 & 0xff),%0
                   1168:    ldub %1,%0"
                   1169:   [(set_attr "type" "unary,move,load")
                   1170:    (set_attr "length" "1")])
                   1171: 
                   1172: (define_insn ""
                   1173:   [(set (reg:CC 0)
                   1174:        (compare:CC (zero_extend:SI (match_operand:QI 0 "register_operand" "r"))
                   1175:                    (const_int 0)))]
                   1176:   ""
                   1177:   "andcc %0,0xff,%%g0"
                   1178:   [(set_attr "type" "compare")])
                   1179: 
                   1180: (define_insn ""
                   1181:   [(set (reg:CC 0)
                   1182:        (compare:CC (zero_extend:SI (match_operand:QI 1 "register_operand" "r"))
                   1183:                    (const_int 0)))
                   1184:    (set (match_operand:SI 0 "register_operand" "=r")
                   1185:        (zero_extend:SI (match_dup 1)))]
                   1186:   ""
                   1187:   "andcc %1,0xff,%0"
                   1188:   [(set_attr "type" "unary")])
                   1189: 
                   1190: ;;- sign extension instructions
                   1191: 
                   1192: ;; These patterns originally accepted general_operands, however, slightly
                   1193: ;; better code is generated by only accepting register_operands, and then
                   1194: ;; letting combine generate the lds[hb] insns.
                   1195: 
                   1196: (define_expand "extendhisi2"
                   1197:   [(set (match_operand:SI 0 "register_operand" "")
                   1198:        (sign_extend:SI (match_operand:HI 1 "register_operand" "")))]
                   1199:   ""
                   1200:   "
                   1201: {
                   1202:   rtx temp = gen_reg_rtx (SImode);
                   1203:   rtx shift_16 = gen_rtx (CONST_INT, VOIDmode, 16);
                   1204: 
                   1205:   if (GET_CODE (operand1) == SUBREG)
                   1206:     operand1 = XEXP (operand1, 0);
                   1207: 
                   1208:   emit_insn (gen_ashlsi3 (temp, gen_rtx (SUBREG, SImode, operand1, 0),
                   1209:                          shift_16));
                   1210:   emit_insn (gen_ashrsi3 (operand0, temp, shift_16));
                   1211:   DONE;
                   1212: }")
                   1213: 
                   1214: (define_insn ""
                   1215:   [(set (match_operand:SI 0 "register_operand" "=r")
                   1216:        (sign_extend:SI (match_operand:HI 1 "memory_operand" "m")))]
                   1217:   ""
                   1218:   "ldsh %1,%0"
                   1219:   [(set_attr "type" "load")])
                   1220: 
                   1221: (define_expand "extendqihi2"
                   1222:   [(set (match_operand:HI 0 "register_operand" "")
                   1223:        (sign_extend:HI (match_operand:QI 1 "register_operand" "")))]
                   1224:   ""
                   1225:   "
                   1226: {
                   1227:   rtx temp = gen_reg_rtx (SImode);
                   1228:   rtx shift_24 = gen_rtx (CONST_INT, VOIDmode, 24);
                   1229: 
                   1230:   if (GET_CODE (operand1) == SUBREG)
                   1231:     operand1 = XEXP (operand1, 0);
                   1232:   if (GET_CODE (operand0) == SUBREG)
                   1233:     operand0 = XEXP (operand0, 0);
                   1234:   emit_insn (gen_ashlsi3 (temp, gen_rtx (SUBREG, SImode, operand1, 0),
                   1235:                          shift_24));
                   1236:   if (GET_MODE (operand0) != SImode)
                   1237:     operand0 = gen_rtx (SUBREG, SImode, operand0, 0);
                   1238:   emit_insn (gen_ashrsi3 (operand0, temp, shift_24));
                   1239:   DONE;
                   1240: }")
                   1241: 
                   1242: (define_insn ""
                   1243:   [(set (match_operand:HI 0 "register_operand" "=r")
                   1244:        (sign_extend:HI (match_operand:QI 1 "memory_operand" "m")))]
                   1245:   ""
                   1246:   "ldsb %1,%0"
                   1247:   [(set_attr "type" "load")])
                   1248: 
                   1249: (define_expand "extendqisi2"
                   1250:   [(set (match_operand:SI 0 "register_operand" "")
                   1251:        (sign_extend:SI (match_operand:QI 1 "register_operand" "")))]
                   1252:   ""
                   1253:   "
                   1254: {
                   1255:   rtx temp = gen_reg_rtx (SImode);
                   1256:   rtx shift_24 = gen_rtx (CONST_INT, VOIDmode, 24);
                   1257: 
                   1258:   if (GET_CODE (operand1) == SUBREG)
                   1259:     operand1 = XEXP (operand1, 0);
                   1260:   emit_insn (gen_ashlsi3 (temp, gen_rtx (SUBREG, SImode, operand1, 0),
                   1261:                          shift_24));
                   1262:   emit_insn (gen_ashrsi3 (operand0, temp, shift_24));
                   1263:   DONE;
                   1264: }")
                   1265: 
                   1266: (define_insn ""
                   1267:   [(set (match_operand:SI 0 "register_operand" "=r")
                   1268:        (sign_extend:SI (match_operand:QI 1 "memory_operand" "m")))]
                   1269:   ""
                   1270:   "ldsb %1,%0"
                   1271:   [(set_attr "type" "load")])
                   1272: 
                   1273: ;; Conversions between float and double.
                   1274: 
                   1275: (define_insn "extendsfdf2"
                   1276:   [(set (match_operand:DF 0 "register_operand" "=f")
                   1277:        (float_extend:DF
                   1278:         (match_operand:SF 1 "register_operand" "f")))]
                   1279:   ""
                   1280:   "fstod %1,%0"
                   1281:   [(set_attr "type" "fp")])
                   1282: 
                   1283: (define_insn "truncdfsf2"
                   1284:   [(set (match_operand:SF 0 "register_operand" "=f")
                   1285:        (float_truncate:SF
                   1286:         (match_operand:DF 1 "register_operand" "f")))]
                   1287:   ""
                   1288:   "fdtos %1,%0"
                   1289:   [(set_attr "type" "fp")])
                   1290: 
                   1291: ;; Conversion between fixed point and floating point.
                   1292: 
                   1293: (define_insn "floatsisf2"
                   1294:   [(set (match_operand:SF 0 "general_operand" "=f")
                   1295:        (float:SF (match_operand:SI 1 "nonimmediate_operand" "rfm")))]
                   1296:   ""
                   1297:   "* return output_floatsisf2 (operands);"
                   1298:   [(set_attr "type" "fp")
                   1299:    (set_attr "length" "3")])
                   1300: 
                   1301: (define_insn "floatsidf2"
                   1302:   [(set (match_operand:DF 0 "general_operand" "=f")
                   1303:        (float:DF (match_operand:SI 1 "nonimmediate_operand" "rfm")))]
                   1304:   ""
                   1305:   "* return output_floatsidf2 (operands);"
                   1306:   [(set_attr "type" "fp")
                   1307:    (set_attr "length" "3")])
                   1308: 
                   1309: ;; Convert a float to an actual integer.
                   1310: ;; Truncation is performed as part of the conversion.
                   1311: 
                   1312: (define_insn "fix_truncsfsi2"
                   1313:   [(set (match_operand:SI 0 "general_operand" "=rm")
                   1314:        (fix:SI (fix:SF (match_operand:SF 1 "general_operand" "fm"))))
                   1315:    (clobber (match_scratch:SF 2 "=&f"))]
                   1316:   ""
                   1317:   "*
                   1318: {
                   1319:   if (FP_REG_P (operands[1]))
                   1320:     output_asm_insn (\"fstoi %1,%2\", operands);
                   1321:   else
                   1322:     output_asm_insn (\"ld %1,%2\;fstoi %2,%2\", operands);
                   1323:   if (GET_CODE (operands[0]) == MEM)
                   1324:     return \"st %2,%0\";
                   1325:   else
                   1326:     return \"st %2,[%%fp-4]\;ld [%%fp-4],%0\";
                   1327: }"
                   1328:   [(set_attr "type" "fp")
                   1329:    (set_attr "length" "3")])
                   1330: 
                   1331: (define_insn "fix_truncdfsi2"
                   1332:   [(set (match_operand:SI 0 "general_operand" "=rm")
                   1333:        (fix:SI (fix:DF (match_operand:DF 1 "general_operand" "fm"))))
                   1334:    (clobber (match_scratch:DF 2 "=&f"))]
                   1335:   ""
                   1336:   "*
                   1337: {
                   1338:   if (FP_REG_P (operands[1]))
                   1339:     output_asm_insn (\"fdtoi %1,%2\", operands);
                   1340:   else
                   1341:     {
                   1342:       rtx xoperands[3];
                   1343:       xoperands[0] = operands[2];
                   1344:       xoperands[1] = operands[1];
                   1345:       output_asm_insn (output_fp_move_double (xoperands), xoperands);
                   1346:       output_asm_insn (\"fdtoi %2,%2\", operands);
                   1347:     }
                   1348:   if (GET_CODE (operands[0]) == MEM)
                   1349:     return \"st %2,%0\";
                   1350:   else
                   1351:     return \"st %2,[%%fp-4]\;ld [%%fp-4],%0\";
                   1352: }"
                   1353:   [(set_attr "type" "fp")
                   1354:    (set_attr "length" "3")])
                   1355: 
                   1356: ;;- arithmetic instructions
                   1357: 
                   1358: (define_insn "adddi3"
                   1359:   [(set (match_operand:DI 0 "register_operand" "=r")
                   1360:        (plus:DI (match_operand:DI 1 "arith_double_operand" "%r")
                   1361:                 (match_operand:DI 2 "arith_double_operand" "rHI")))
                   1362:    (clobber (reg:SI 0))]
                   1363:   ""
                   1364:   "*
                   1365: {
                   1366:   rtx op2 = operands[2];
                   1367: 
                   1368:   /* If constant is postive, upper bits zeroed, otherwise unchanged
                   1369:    * give the assembler a chance to pick the move instruction. */
                   1370:   if (GET_CODE (op2) == CONST_INT)
                   1371:     {
                   1372:       int sign = INTVAL (op2);
                   1373:       if (sign < 0)
                   1374:        return \"addcc %R1,%2,%R0\;addx %1,-1,%0\";
                   1375:       return \"addcc %R1,%2,%R0\;addx %1,0,%0\";
                   1376:     }
                   1377:   else if (GET_CODE (op2) == CONST_DOUBLE)
                   1378:     {
                   1379:       int sign = CONST_DOUBLE_HIGH (op2);
                   1380:       operands[2] = gen_rtx (CONST_INT, VOIDmode,
                   1381:                             CONST_DOUBLE_LOW (operands[1]));
                   1382:       if (sign < 0)
                   1383:         return \"addcc %R1,%2,%R0\;addx %1,-1,%0\";
                   1384:       return \"addcc %R1,%2,%R0\;addx %1,0,%0\";
                   1385:     }
                   1386:   return \"addcc %R1,%R2,%R0\;addx %1,%2,%0\";
                   1387: }"
                   1388:   [(set_attr "length" "2")])
                   1389: 
                   1390: (define_insn "addsi3"
                   1391:   [(set (match_operand:SI 0 "register_operand" "=r")
                   1392:        (plus:SI (match_operand:SI 1 "arith_operand" "%r")
                   1393:                 (match_operand:SI 2 "arith_operand" "rI")))]
                   1394:   ""
                   1395:   "add %1,%2,%0")
                   1396: 
                   1397: (define_insn ""
                   1398:   [(set (reg:CC_NOOV 0)
                   1399:        (compare:CC_NOOV (plus:SI (match_operand:SI 0 "arith_operand" "%r")
                   1400:                                  (match_operand:SI 1 "arith_operand" "rI"))
                   1401:                         (const_int 0)))]
                   1402:   ""
                   1403:   "addcc %0,%1,%%g0"
                   1404:   [(set_attr "type" "compare")])
                   1405: 
                   1406: (define_insn ""
                   1407:   [(set (reg:CC_NOOV 0)
                   1408:        (compare:CC_NOOV (plus:SI (match_operand:SI 1 "arith_operand" "%r")
                   1409:                                  (match_operand:SI 2 "arith_operand" "rI"))
                   1410:                         (const_int 0)))
                   1411:    (set (match_operand:SI 0 "register_operand" "=r")
                   1412:        (plus:SI (match_dup 1) (match_dup 2)))]
                   1413:   ""
                   1414:   "addcc %1,%2,%0")
                   1415: 
                   1416: (define_insn "subdi3"
                   1417:   [(set (match_operand:DI 0 "register_operand" "=r")
                   1418:        (minus:DI (match_operand:DI 1 "register_operand" "r")
                   1419:                  (match_operand:DI 2 "arith_double_operand" "rHI")))
                   1420:    (clobber (reg:SI 0))]
                   1421:   ""
                   1422:   "*
                   1423: {
                   1424:   rtx op2 = operands[2];
                   1425: 
                   1426:   /* If constant is postive, upper bits zeroed, otherwise unchanged
                   1427:    * give the assembler a chance to pick the move instruction. */
                   1428:   if (GET_CODE (op2) == CONST_INT)
                   1429:     {
                   1430:       int sign = INTVAL (op2);
                   1431:       if (sign < 0)
                   1432:        return \"subcc %R1,%2,%R0\;subx %1,-1,%0\";
                   1433:       return \"subcc %R1,%2,%R0\;subx %1,0,%0\";
                   1434:     }
                   1435:   else if (GET_CODE (op2) == CONST_DOUBLE)
                   1436:     {
                   1437:       int sign = CONST_DOUBLE_HIGH (op2);
                   1438:       operands[2] = gen_rtx (CONST_INT, VOIDmode,
                   1439:                             CONST_DOUBLE_LOW (operands[1]));
                   1440:       if (sign < 0)
                   1441:         return \"subcc %R1,%2,%R0\;subx %1,-1,%0\";
                   1442:       return \"subcc %R1,%2,%R0\;subx %1,0,%0\";
                   1443:     }
                   1444:   return \"subcc %R1,%R2,%R0\;subx %1,%2,%0\";
                   1445: }"
                   1446:   [(set_attr "length" "2")])
                   1447: 
                   1448: (define_insn "subsi3"
                   1449:   [(set (match_operand:SI 0 "register_operand" "=r")
                   1450:        (minus:SI (match_operand:SI 1 "register_operand" "r")
                   1451:                  (match_operand:SI 2 "arith_operand" "rI")))]
                   1452:   ""
                   1453:   "sub %1,%2,%0")
                   1454: 
                   1455: (define_insn ""
                   1456:   [(set (reg:CC_NOOV 0)
                   1457:        (compare:CC_NOOV (minus:SI (match_operand:SI 0 "register_operand" "r")
                   1458:                                   (match_operand:SI 1 "arith_operand" "rI"))
                   1459:                         (const_int 0)))]
                   1460:   ""
                   1461:   "subcc %0,%1,%%g0"
                   1462:   [(set_attr "type" "compare")])
                   1463: 
                   1464: (define_insn ""
                   1465:   [(set (reg:CC_NOOV 0)
                   1466:        (compare:CC_NOOV (minus:SI (match_operand:SI 1 "register_operand" "r")
                   1467:                                   (match_operand:SI 2 "arith_operand" "rI"))
                   1468:                         (const_int 0)))
                   1469:    (set (match_operand:SI 0 "register_operand" "=r")
                   1470:        (minus:SI (match_dup 1) (match_dup 2)))]
                   1471:   ""
                   1472:   "subcc %1,%2,%0")
                   1473: 
                   1474: ;;- and instructions
                   1475: ;; We define DImode `and` so with DImode `not` we can get
                   1476: ;; DImode `andn`.  Other combinations are possible.
                   1477: 
                   1478: (define_expand "anddi3"
                   1479:   [(set (match_operand:DI 0 "register_operand" "")
                   1480:        (and:DI (match_operand:DI 1 "arith_double_operand" "")
                   1481:                (match_operand:DI 2 "arith_double_operand" "")))]
                   1482:   ""
                   1483:   "")
                   1484: 
                   1485: (define_insn ""
                   1486:   [(set (match_operand:DI 0 "register_operand" "=r")
                   1487:        (and:DI (match_operand:DI 1 "arith_double_operand" "%r")
                   1488:                (match_operand:DI 2 "arith_double_operand" "rHI")))]
                   1489:   ""
                   1490:   "*
                   1491: {
                   1492:   rtx op2 = operands[2];
                   1493: 
                   1494:   /* If constant is postive, upper bits zeroed, otherwise unchanged
                   1495:    * give the assembler a chance to pick the move instruction. */
                   1496:   if (GET_CODE (op2) == CONST_INT)
                   1497:     {
                   1498:       int sign = INTVAL (op2);
                   1499:       if (sign < 0)
                   1500:        return \"mov %1,%0\;and %R1,%2,%R0\";
                   1501:       return \"mov 0,%0\;and %R1,%2,%R0\";
                   1502:     }
                   1503:   else if (GET_CODE (op2) == CONST_DOUBLE)
                   1504:     {
                   1505:       int sign = CONST_DOUBLE_HIGH (op2);
                   1506:       operands[2] = gen_rtx (CONST_INT, VOIDmode,
                   1507:                             CONST_DOUBLE_LOW (operands[1]));
                   1508:       if (sign < 0)
                   1509:        return \"mov %1,%0\;and %R1,%2,%R0\";
                   1510:       return \"mov 0,%0\;and %R1,%2,%R0\";
                   1511:     }
                   1512:   return \"and %1,%2,%0\;and %R1,%R2,%R0\";
                   1513: }"
                   1514:   [(set_attr "length" "2")])
                   1515: 
                   1516: (define_insn "andsi3"
                   1517:   [(set (match_operand:SI 0 "register_operand" "=r")
                   1518:        (and:SI (match_operand:SI 1 "arith_operand" "%r")
                   1519:                (match_operand:SI 2 "arith_operand" "rI")))]
                   1520:   ""
                   1521:   "and %1,%2,%0")
                   1522: 
                   1523: (define_insn ""
                   1524:   [(set (match_operand:DI 0 "register_operand" "=r")
                   1525:        (and:DI (not:DI (match_operand:DI 1 "register_operand" "r"))
                   1526:                (match_operand:DI 2 "register_operand" "r")))]
                   1527:   ""
                   1528:   "andn %2,%1,%0\;andn %R2,%R1,%R0"
                   1529:   [(set_attr "length" "2")])
                   1530: 
                   1531: (define_insn ""
                   1532:   [(set (match_operand:SI 0 "register_operand" "=r")
                   1533:        (and:SI (not:SI (match_operand:SI 1 "register_operand" "r"))
                   1534:                (match_operand:SI 2 "register_operand" "r")))]
                   1535:   ""
                   1536:   "andn %2,%1,%0")
                   1537: 
                   1538: (define_expand "iordi3"
                   1539:   [(set (match_operand:DI 0 "register_operand" "")
                   1540:        (ior:DI (match_operand:DI 1 "arith_double_operand" "")
                   1541:                (match_operand:DI 2 "arith_double_operand" "")))]
                   1542:   ""
                   1543:   "")
                   1544: 
                   1545: (define_insn ""
                   1546:   [(set (match_operand:DI 0 "register_operand" "=r")
                   1547:        (ior:DI (match_operand:DI 1 "arith_double_operand" "%r")
                   1548:                (match_operand:DI 2 "arith_double_operand" "rHI")))]
                   1549:   ""
                   1550:   "*
                   1551: {
                   1552:   rtx op2 = operands[2];
                   1553: 
                   1554:   /* If constant is postive, upper bits zeroed, otherwise unchanged
                   1555:    * give the assembler a chance to pick the move instruction. */
                   1556:   if (GET_CODE (op2) == CONST_INT)
                   1557:     {
                   1558:       int sign = INTVAL (op2);
                   1559:       if (sign < 0)
                   1560:        return \"mov -1,%0\;or %R1,%2,%R0\";
                   1561:       return \"mov %1,%0\;or %R1,%2,%R0\";
                   1562:     }
                   1563:   else if (GET_CODE (op2) == CONST_DOUBLE)
                   1564:     {
                   1565:       int sign = CONST_DOUBLE_HIGH (op2);
                   1566:       operands[2] = gen_rtx (CONST_INT, VOIDmode,
                   1567:                             CONST_DOUBLE_LOW (operands[1]));
                   1568:       if (sign < 0)
                   1569:        return \"mov -1,%0\;or %R1,%2,%R0\";
                   1570:       return \"mov %1,%0\;or %R1,%2,%R0\";
                   1571:     }
                   1572:   return \"or %1,%2,%0\;or %R1,%R2,%R0\";
                   1573: }"
                   1574:   [(set_attr "length" "2")])
                   1575: 
                   1576: (define_insn "iorsi3"
                   1577:   [(set (match_operand:SI 0 "register_operand" "=r")
                   1578:        (ior:SI (match_operand:SI 1 "arith_operand" "%r")
                   1579:                (match_operand:SI 2 "arith_operand" "rI")))]
                   1580:   ""
                   1581:   "or %1,%2,%0")
                   1582: 
                   1583: (define_insn ""
                   1584:   [(set (match_operand:DI 0 "register_operand" "=r")
                   1585:        (ior:DI (not:DI (match_operand:DI 1 "register_operand" "r"))
                   1586:                (match_operand:DI 2 "register_operand" "r")))]
                   1587:   ""
                   1588:   "orn %2,%1,%0\;orn %R2,%R1,%R0"
                   1589:   [(set_attr "length" "2")])
                   1590: 
                   1591: (define_insn ""
                   1592:   [(set (match_operand:SI 0 "register_operand" "=r")
                   1593:        (ior:SI (not:SI (match_operand:SI 1 "register_operand" "r"))
                   1594:                (match_operand:SI 2 "register_operand" "r")))]
                   1595:   ""
                   1596:   "orn %2,%1,%0")
                   1597: 
                   1598: (define_expand "xordi3"
                   1599:   [(set (match_operand:DI 0 "register_operand" "")
                   1600:        (xor:DI (match_operand:DI 1 "arith_double_operand" "")
                   1601:                (match_operand:DI 2 "arith_double_operand" "")))]
                   1602:   ""
                   1603:   "")
                   1604: 
                   1605: (define_insn ""
                   1606:   [(set (match_operand:DI 0 "register_operand" "=r")
                   1607:        (xor:DI (match_operand:DI 1 "arith_double_operand" "%r")
                   1608:                (match_operand:DI 2 "arith_double_operand" "rHI")))]
                   1609:   ""
                   1610:   "*
                   1611: {
                   1612:   rtx op2 = operands[2];
                   1613: 
                   1614:   /* If constant is postive, upper bits zeroed, otherwise unchanged
                   1615:    * give the assembler a chance to pick the move instruction. */
                   1616:   if (GET_CODE (op2) == CONST_INT)
                   1617:     {
                   1618:       int sign = INTVAL (op2);
                   1619:       if (sign < 0)
                   1620:        return \"xor %1,-1,%0\;xor %R1,%2,%R0\";
                   1621:       return \"mov %1,%0\;xor %R1,%2,%R0\";
                   1622:     }
                   1623:   else if (GET_CODE (op2) == CONST_DOUBLE)
                   1624:     {
                   1625:       int sign = CONST_DOUBLE_HIGH (op2);
                   1626:       operands[2] = gen_rtx (CONST_INT, VOIDmode,
                   1627:                             CONST_DOUBLE_LOW (operands[1]));
                   1628:       if (sign < 0)
                   1629:        return \"xor %1,-1,%0\;xor %R1,%2,%R0\";
                   1630:       return \"mov %1,%0\;xor %R1,%2,%R0\";
                   1631:     }
                   1632:   return \"xor %1,%2,%0\;xor %R1,%R2,%R0\";
                   1633: }"
                   1634:   [(set_attr "length" "2")])
                   1635: 
                   1636: (define_insn "xorsi3"
                   1637:   [(set (match_operand:SI 0 "register_operand" "=r")
                   1638:        (xor:SI (match_operand:SI 1 "arith_operand" "%rJ")
                   1639:                (match_operand:SI 2 "arith_operand" "rI")))]
                   1640:   ""
                   1641:   "xor %r1,%2,%0")
                   1642: 
                   1643: ;; xnor patterns.  Note that (a ^ ~b) == (~a ^ b) == ~(a ^ b).
                   1644: ;; Combine now canonicalizes to the rightmost expression.
                   1645: (define_insn ""
                   1646:   [(set (match_operand:DI 0 "register_operand" "=r")
                   1647:        (not:DI (xor:DI (match_operand:DI 1 "register_operand" "r")
                   1648:                        (match_operand:DI 2 "register_operand" "r"))))]
                   1649:   ""
                   1650:   "xnor %1,%2,%0\;xnor %R1,%R2,%R0"
                   1651:   [(set_attr "length" "2")])
                   1652: 
                   1653: (define_insn ""
                   1654:   [(set (match_operand:SI 0 "register_operand" "=r")
                   1655:        (not:SI (xor:SI (match_operand:SI 1 "reg_or_0_operand" "rJ")
                   1656:                        (match_operand:SI 2 "arith_operand" "rI"))))]
                   1657:   ""
                   1658:   "xnor %r1,%2,%0")
                   1659: 
                   1660: ;; These correspond to the above in the case where we also (or only)
                   1661: ;; want to set the condition code.  
                   1662: 
                   1663: (define_insn ""
                   1664:   [(set (reg:CC 0)
                   1665:        (compare:CC
                   1666:         (match_operator:SI 2 "cc_arithop"
                   1667:                            [(match_operand:SI 0 "arith_operand" "%r")
                   1668:                             (match_operand:SI 1 "arith_operand" "rI")])
                   1669:         (const_int 0)))]
                   1670:   ""
                   1671:   "%A2cc %0,%1,%%g0"
                   1672:   [(set_attr "type" "compare")])
                   1673: 
                   1674: (define_insn ""
                   1675:   [(set (reg:CC 0)
                   1676:        (compare:CC
                   1677:         (match_operator:SI 3 "cc_arithop"
                   1678:                            [(match_operand:SI 1 "arith_operand" "%r")
                   1679:                             (match_operand:SI 2 "arith_operand" "rI")])
                   1680:         (const_int 0)))
                   1681:    (set (match_operand:SI 0 "register_operand" "=r")
                   1682:        (match_dup 3))]
                   1683:   ""
                   1684:   "%A3cc %1,%2,%0")
                   1685: 
                   1686: (define_insn ""
                   1687:   [(set (reg:CC 0)
                   1688:        (compare:CC
                   1689:         (not:SI (xor:SI (match_operand:SI 0 "reg_or_0_operand" "%rJ")
                   1690:                         (match_operand:SI 1 "arith_operand" "rI")))
                   1691:         (const_int 0)))]
                   1692:   ""
                   1693:   "xnorcc %r0,%1,%%g0"
                   1694:   [(set_attr "type" "compare")])
                   1695: 
                   1696: (define_insn ""
                   1697:   [(set (reg:CC 0)
                   1698:        (compare:CC
                   1699:         (not:SI (xor:SI (match_operand:SI 1 "reg_or_0_operand" "%rJ")
                   1700:                         (match_operand:SI 2 "arith_operand" "rI")))
                   1701:         (const_int 0)))
                   1702:    (set (match_operand:SI 0 "register_operand" "=r")
                   1703:        (not:SI (xor:SI (match_dup 1) (match_dup 2))))]
                   1704:   ""
                   1705:   "xnorcc %r1,%2,%0")
                   1706: 
                   1707: (define_insn ""
                   1708:   [(set (reg:CC 0)
                   1709:        (compare:CC
                   1710:         (match_operator:SI 2 "cc_arithopn"
                   1711:                            [(not:SI (match_operand:SI 0 "arith_operand" "rI"))
                   1712:                             (match_operand:SI 1 "reg_or_0_operand" "rJ")])
                   1713:         (const_int 0)))]
                   1714:   ""
                   1715:   "%B2cc %r1,%0,%%g0"
                   1716:   [(set_attr "type" "compare")])
                   1717: 
                   1718: (define_insn ""
                   1719:   [(set (reg:CC 0)
                   1720:        (compare:CC
                   1721:         (match_operator:SI 3 "cc_arithopn"
                   1722:                            [(not:SI (match_operand:SI 1 "arith_operand" "rI"))
                   1723:                             (match_operand:SI 2 "reg_or_0_operand" "rJ")])
                   1724:         (const_int 0)))
                   1725:    (set (match_operand:SI 0 "register_operand" "=r")
                   1726:        (match_dup 3))]
                   1727:   ""
                   1728:   "%B3cc %r2,%1,%0")
                   1729: 
                   1730: ;; We cannot use the "neg" pseudo insn because the Sun assembler
                   1731: ;; does not know how to make it work for constants.
                   1732: 
                   1733: (define_insn "negdi2"
                   1734:   [(set (match_operand:DI 0 "register_operand" "=r")
                   1735:        (neg:DI (match_operand:DI 1 "register_operand" "r")))
                   1736:    (clobber (reg:SI 0))]
                   1737:   ""
                   1738:   "subcc %%g0,%R1,%R0\;subx %%g0,%1,%0"
                   1739:   [(set_attr "type" "unary")
                   1740:    (set_attr "length" "2")])
                   1741: 
                   1742: (define_insn "negsi2"
                   1743:   [(set (match_operand:SI 0 "general_operand" "=r")
                   1744:        (neg:SI (match_operand:SI 1 "arith_operand" "rI")))]
                   1745:   ""
                   1746:   "sub %%g0,%1,%0"
                   1747:   [(set_attr "type" "unary")])
                   1748: 
                   1749: (define_insn ""
                   1750:   [(set (reg:CC_NOOV 0)
                   1751:        (compare:CC_NOOV (neg:SI (match_operand:SI 0 "arith_operand" "rI"))
                   1752:                         (const_int 0)))]
                   1753:   ""
                   1754:   "subcc %%g0,%0,%%g0"
                   1755:   [(set_attr "type" "compare")])
                   1756: 
                   1757: (define_insn ""
                   1758:   [(set (reg:CC_NOOV 0)
                   1759:        (compare:CC_NOOV (neg:SI (match_operand:SI 1 "arith_operand" "rI"))
                   1760:                         (const_int 0)))
                   1761:    (set (match_operand:SI 0 "register_operand" "=r")
                   1762:        (neg:SI (match_dup 1)))]
                   1763:   ""
                   1764:   "subcc %%g0,%1,%0"
                   1765:   [(set_attr "type" "unary")])
                   1766: 
                   1767: ;; We cannot use the "not" pseudo insn because the Sun assembler
                   1768: ;; does not know how to make it work for constants.
                   1769: (define_expand "one_cmpldi2"
                   1770:   [(set (match_operand:DI 0 "register_operand" "=r")
                   1771:        (not:DI (match_operand:DI 1 "arith_double_operand" "rHI")))]
                   1772:   ""
                   1773:   "")
                   1774: 
                   1775: (define_insn ""
                   1776:   [(set (match_operand:DI 0 "register_operand" "=r")
                   1777:        (not:DI (match_operand:DI 1 "arith_double_operand" "rHI")))]
                   1778:   ""
                   1779:   "*
                   1780: {
                   1781:   rtx op1 = operands[1];
                   1782: 
                   1783:   if (GET_CODE (op1) == CONST_INT)
                   1784:     {
                   1785:       int sign = INTVAL (op1);
                   1786:       if (sign < 0)
                   1787:        return \"xnor %%g0,%1,%R0\;xnor %%g0,-1,%0\";
                   1788:       return \"xnor %%g0,%1,%R0\;xnor %%g0,0,%0\";
                   1789:     }
                   1790:   else if (GET_CODE (op1) == CONST_DOUBLE)
                   1791:     {
                   1792:       int sign = CONST_DOUBLE_HIGH (op1);
                   1793:       operands[1] = gen_rtx (CONST_INT, VOIDmode,
                   1794:                             CONST_DOUBLE_LOW (operands[1]));
                   1795:       if (sign < 0)
                   1796:        return \"xnor %%g0,%1,%R0\;xnor %%g0,-1,%0\";
                   1797:       return \"xnor %%g0,%1,%R0\;xnor %%g0,0,%0\";
                   1798:     }
                   1799:   return \"xnor %%g0,%1,%0\;xnor %%g0,%R1,%R0\";
                   1800: }"
                   1801:   [(set_attr "type" "unary")
                   1802:    (set_attr "length" "2")])
                   1803: 
                   1804: (define_insn "one_cmplsi2"
                   1805:   [(set (match_operand:SI 0 "register_operand" "=r")
                   1806:        (not:SI (match_operand:SI 1 "arith_operand" "rI")))]
                   1807:   ""
                   1808:   "xnor %%g0,%1,%0"
                   1809:   [(set_attr "type" "unary")])
                   1810: 
                   1811: (define_insn ""
                   1812:   [(set (reg:CC 0)
                   1813:        (compare:CC (not:SI (match_operand:SI 0 "arith_operand" "rI"))
                   1814:                    (const_int 0)))]
                   1815:   ""
                   1816:   "xnorcc %%g0,%0,%%g0"
                   1817:   [(set_attr "type" "compare")])
                   1818: 
                   1819: (define_insn ""
                   1820:   [(set (reg:CC 0)
                   1821:        (compare:CC (not:SI (match_operand:SI 1 "arith_operand" "rI"))
                   1822:                    (const_int 0)))
                   1823:    (set (match_operand:SI 0 "register_operand" "=r")
                   1824:        (not:SI (match_dup 1)))]
                   1825:   ""
                   1826:   "xnorcc %%g0,%1,%0"
                   1827:   [(set_attr "type" "unary")])
                   1828: 
                   1829: ;; Floating point arithmetic instructions.
                   1830: 
                   1831: (define_insn "adddf3"
                   1832:   [(set (match_operand:DF 0 "register_operand" "=f")
                   1833:        (plus:DF (match_operand:DF 1 "register_operand" "f")
                   1834:                 (match_operand:DF 2 "register_operand" "f")))]
                   1835:   ""
                   1836:   "faddd %1,%2,%0"
                   1837:   [(set_attr "type" "fp")])
                   1838: 
                   1839: (define_insn "addsf3"
                   1840:   [(set (match_operand:SF 0 "register_operand" "=f")
                   1841:        (plus:SF (match_operand:SF 1 "register_operand" "f")
                   1842:                 (match_operand:SF 2 "register_operand" "f")))]
                   1843:   ""
                   1844:   "fadds %1,%2,%0"
                   1845:   [(set_attr "type" "fp")])
                   1846: 
                   1847: (define_insn "subdf3"
                   1848:   [(set (match_operand:DF 0 "register_operand" "=f")
                   1849:        (minus:DF (match_operand:DF 1 "register_operand" "f")
                   1850:                  (match_operand:DF 2 "register_operand" "f")))]
                   1851:   ""
                   1852:   "fsubd %1,%2,%0"
                   1853:   [(set_attr "type" "fp")])
                   1854: 
                   1855: (define_insn "subsf3"
                   1856:   [(set (match_operand:SF 0 "register_operand" "=f")
                   1857:        (minus:SF (match_operand:SF 1 "register_operand" "f")
                   1858:                  (match_operand:SF 2 "register_operand" "f")))]
                   1859:   ""
                   1860:   "fsubs %1,%2,%0"
                   1861:   [(set_attr "type" "fp")])
                   1862: 
                   1863: (define_insn "muldf3"
                   1864:   [(set (match_operand:DF 0 "register_operand" "=f")
                   1865:        (mult:DF (match_operand:DF 1 "register_operand" "f")
                   1866:                 (match_operand:DF 2 "register_operand" "f")))]
                   1867:   ""
                   1868:   "fmuld %1,%2,%0"
                   1869:   [(set_attr "type" "fpmul")])
                   1870: 
                   1871: (define_insn "mulsf3"
                   1872:   [(set (match_operand:SF 0 "register_operand" "=f")
                   1873:        (mult:SF (match_operand:SF 1 "register_operand" "f")
                   1874:                 (match_operand:SF 2 "register_operand" "f")))]
                   1875:   ""
                   1876:   "fmuls %1,%2,%0"
                   1877:   [(set_attr "type" "fpmul")])
                   1878: 
                   1879: (define_insn "divdf3"
                   1880:   [(set (match_operand:DF 0 "register_operand" "=f")
                   1881:        (div:DF (match_operand:DF 1 "register_operand" "f")
                   1882:                (match_operand:DF 2 "register_operand" "f")))]
                   1883:   ""
                   1884:   "fdivd %1,%2,%0"
                   1885:   [(set_attr "type" "fpdiv")])
                   1886: 
                   1887: (define_insn "divsf3"
                   1888:   [(set (match_operand:SF 0 "register_operand" "=f")
                   1889:        (div:SF (match_operand:SF 1 "register_operand" "f")
                   1890:                (match_operand:SF 2 "register_operand" "f")))]
                   1891:   ""
                   1892:   "fdivs %1,%2,%0"
                   1893:   [(set_attr "type" "fpdiv")])
                   1894: 
                   1895: (define_insn "negdf2"
                   1896:   [(set (match_operand:DF 0 "register_operand" "=f,f")
                   1897:        (neg:DF (match_operand:DF 1 "register_operand" "0,f")))]
                   1898:   ""
                   1899:   "@
                   1900:    fnegs %0,%0
                   1901:    fnegs %1,%0\;fmovs %R1,%R0"
                   1902:   [(set_attr "type" "fp")
                   1903:    (set_attr "length" "1,2")])
                   1904: 
                   1905: 
                   1906: (define_insn "negsf2"
                   1907:   [(set (match_operand:SF 0 "register_operand" "=f")
                   1908:        (neg:SF (match_operand:SF 1 "register_operand" "f")))]
                   1909:   ""
                   1910:   "fnegs %1,%0"
                   1911:   [(set_attr "type" "fp")])
                   1912: 
                   1913: (define_insn "absdf2"
                   1914:   [(set (match_operand:DF 0 "register_operand" "=f,f")
                   1915:        (abs:DF (match_operand:DF 1 "register_operand" "0,f")))]
                   1916:   ""
                   1917:   "@
                   1918:    fabss %0,%0
                   1919:    fabss %1,%0\;fmovs %R1,%R0"
                   1920:   [(set_attr "type" "fp")
                   1921:    (set_attr "length" "1,2")])
                   1922: 
                   1923: (define_insn "abssf2"
                   1924:   [(set (match_operand:SF 0 "register_operand" "=f")
                   1925:        (abs:SF (match_operand:SF 1 "register_operand" "f")))]
                   1926:   ""
                   1927:   "fabss %1,%0"
                   1928:   [(set_attr "type" "fp")])
                   1929: 
                   1930: (define_insn "sqrtdf2"
                   1931:   [(set (match_operand:DF 0 "register_operand" "=f")
                   1932:        (sqrt:DF (match_operand:DF 1 "register_operand" "f")))]
                   1933:   ""
                   1934:   "fsqrtd %1,%0"
                   1935:   [(set_attr "type" "fpsqrt")])
                   1936: 
                   1937: (define_insn "sqrtsf2"
                   1938:   [(set (match_operand:SF 0 "register_operand" "=f")
                   1939:        (sqrt:SF (match_operand:SF 1 "register_operand" "f")))]
                   1940:   ""
                   1941:   "fsqrts %1,%0"
                   1942:   [(set_attr "type" "fpsqrt")])
                   1943: 
                   1944: ;;- arithmetic shift instructions
                   1945: 
                   1946: ;; We can trivially handle shifting the constant 1 by 64 bits.
                   1947: ;; For other shifts we use the library routine.
                   1948: ;; ??? Questionable, we can do better than this can't we?
                   1949: (define_expand "ashldi3"
                   1950:   [(parallel [(set (match_operand:DI 0 "register_operand" "")
                   1951:                   (ashift:DI (match_operand:DI 1 "const_double_operand" "")
                   1952:                              (match_operand:SI 2 "register_operand" "")))
                   1953:              (clobber (reg:SI 0))])]
                   1954:   ""
                   1955:   "
                   1956: {
                   1957:   if (GET_CODE (operands[1]) == CONST_DOUBLE
                   1958:       && CONST_DOUBLE_HIGH (operands[1]) == 0
                   1959:       && CONST_DOUBLE_LOW (operands[1]) == 1)
                   1960:     operands[1] = const1_rtx;
                   1961:   else if (operands[1] != const1_rtx)
                   1962:     FAIL;
                   1963: }")
                   1964: 
                   1965: ;; ??? Questionable, we can do better than this can't we?
                   1966: (define_insn ""
                   1967:   [(set (match_operand:DI 0 "register_operand" "=&r")
                   1968:        (ashift:DI (const_int 1)
                   1969:                   (match_operand:SI 2 "register_operand" "r")))
                   1970:    (clobber (reg:SI 0))]
                   1971:   ""
                   1972:   "subcc %2,32,%%g0\;addx %%g0,0,%R0\;xor %R0,1,%0\;sll %R0,%2,%R0\;sll %0,%2,%0"
                   1973:   [(set_attr "type" "multi")
                   1974:    (set_attr "length" "5")])
                   1975: 
                   1976: (define_insn "ashlsi3"
                   1977:   [(set (match_operand:SI 0 "register_operand" "=r")
                   1978:        (ashift:SI (match_operand:SI 1 "register_operand" "r")
                   1979:                   (match_operand:SI 2 "arith_operand" "rI")))]
                   1980:   ""
                   1981:   "sll %1,%2,%0")
                   1982: 
                   1983: (define_insn "ashrsi3"
                   1984:   [(set (match_operand:SI 0 "register_operand" "=r")
                   1985:        (ashiftrt:SI (match_operand:SI 1 "register_operand" "r")
                   1986:                     (match_operand:SI 2 "arith_operand" "rI")))]
                   1987:   ""
                   1988:   "sra %1,%2,%0")
                   1989: 
                   1990: (define_insn "lshrsi3"
                   1991:   [(set (match_operand:SI 0 "register_operand" "=r")
                   1992:        (lshiftrt:SI (match_operand:SI 1 "register_operand" "r")
                   1993:                     (match_operand:SI 2 "arith_operand" "rI")))]
                   1994:   ""
                   1995:   "srl %1,%2,%0")
                   1996: 
                   1997: ;; Unconditional and other jump instructions
                   1998: ;; Note that for the Sparc, by setting the annul bit on an unconditional
                   1999: ;; branch, the following insn is never executed.  This saves us a nop,
                   2000: ;; but requires a debugger which can handle annuled branches.
                   2001: (define_insn "jump"
                   2002:   [(set (pc) (label_ref (match_operand 0 "" "")))]
                   2003:   ""
                   2004:   "b%* %l0"
                   2005:   [(set_attr "type" "branch")])
                   2006: 
                   2007: (define_expand "tablejump"
                   2008:   [(parallel [(set (pc) (match_operand:SI 0 "register_operand" "r"))
                   2009:              (use (label_ref (match_operand 1 "" "")))])]
                   2010:   ""
                   2011:   "
                   2012: {
                   2013:   /* We need to use the PC value in %o7 that was set up when the address
                   2014:      of the label was loaded into a register, so we need different RTL.  */
                   2015:   if (flag_pic)
                   2016:     {
                   2017:       emit_insn (gen_pic_tablejump (operands[0], operands[1]));
                   2018:       DONE;
                   2019:     }
                   2020: }")
                   2021: 
                   2022: (define_insn "pic_tablejump"
                   2023:   [(set (pc) (match_operand:SI 0 "register_operand" "r"))
                   2024:    (use (label_ref (match_operand 1 "" "")))
                   2025:    (use (reg:SI 15))]
                   2026:   ""
                   2027:   "jmp %%o7+%0%#"
                   2028:   [(set_attr "type" "branch")])
                   2029: 
                   2030: (define_insn ""
                   2031:   [(set (pc) (match_operand:SI 0 "address_operand" "p"))
                   2032:    (use (label_ref (match_operand 1 "" "")))]
                   2033:   ""
                   2034:   "jmp %a0%#"
                   2035:   [(set_attr "type" "branch")])
                   2036: 
                   2037: (define_insn ""
                   2038:   [(set (pc) (label_ref (match_operand 0 "" "")))
                   2039:    (set (reg:SI 15) (label_ref (match_dup 0)))]
                   2040:   ""
                   2041:   "call %l0%#"
                   2042:   [(set_attr "type" "branch")])
                   2043: 
                   2044: ;; This pattern recognizes the "instruction" that appears in 
                   2045: ;; a function call that wants a structure value, 
                   2046: ;; to inform the called function if compiled with Sun CC.
                   2047: ;(define_insn ""
                   2048: ;  [(match_operand:SI 0 "immediate_operand" "")]
                   2049: ;  "GET_CODE (operands[0]) == CONST_INT && INTVAL (operands[0]) > 0"
                   2050: ;  "unimp %0"
                   2051: ;  [(set_attr "type" "marker")])
                   2052: 
                   2053: ;;- jump to subroutine
                   2054: (define_expand "call"
                   2055:   ;; Note that this expression is not used for generating RTL.
                   2056:   ;; All the RTL is generated explicitly below.
                   2057:   [(call (match_operand:SI 0 "call_operand" "")
                   2058:         (match_operand 3 "" "i"))]
                   2059:   ;; operands[2] is next_arg_register
                   2060:   ;; operands[3] is struct_value_size_rtx.
                   2061:   ""
                   2062:   "
                   2063: {
                   2064:   rtx fn_rtx, nregs_rtx;
                   2065: 
                   2066:   if (GET_CODE (XEXP (operands[0], 0)) == LABEL_REF)
                   2067:     {
                   2068:       /* This is really a PIC sequence.  We want to represent
                   2069:         it as a funny jump so it's delay slots can be filled. 
                   2070: 
                   2071:         ??? But if this really *is* a CALL, will not it clobber the
                   2072:         call-clobbered registers?  We lose this if it is a JUMP_INSN.
                   2073:         Why cannot we have delay slots filled if it were a CALL?  */
                   2074: 
                   2075:       if (INTVAL (operands[3]) > 0)
                   2076:        emit_jump_insn (gen_rtx (PARALLEL, VOIDmode, gen_rtvec (3,
                   2077:                                 gen_rtx (SET, VOIDmode, pc_rtx,
                   2078:                                          XEXP (operands[0], 0)),
                   2079:                                 operands[3],
                   2080:                                 gen_rtx (CLOBBER, VOIDmode,
                   2081:                                          gen_rtx (REG, SImode, 15)))));
                   2082:       else
                   2083:        emit_jump_insn (gen_rtx (PARALLEL, VOIDmode, gen_rtvec (2,
                   2084:                                 gen_rtx (SET, VOIDmode, pc_rtx,
                   2085:                                          XEXP (operands[0], 0)),
                   2086:                                 gen_rtx (CLOBBER, VOIDmode,
                   2087:                                          gen_rtx (REG, SImode, 15)))));
                   2088:       goto finish_call;
                   2089:     }
                   2090: 
                   2091:   fn_rtx = operands[0];
                   2092: 
                   2093:   /* Count the number of parameter registers being used by this call.
                   2094:      if that argument is NULL, it means we are using them all, which
                   2095:      means 6 on the sparc.  */
                   2096: #if 0
                   2097:   if (operands[2])
                   2098:     nregs_rtx = gen_rtx (CONST_INT, VOIDmode, REGNO (operands[2]) - 8);
                   2099:   else
                   2100:     nregs_rtx = gen_rtx (CONST_INT, VOIDmode, 6);
                   2101: #else
                   2102:   nregs_rtx = const0_rtx;
                   2103: #endif
                   2104: 
                   2105:   if (INTVAL (operands[3]) > 0)
                   2106:     emit_call_insn (gen_rtx (PARALLEL, VOIDmode, gen_rtvec (3,
                   2107:                             gen_rtx (CALL, VOIDmode, fn_rtx, nregs_rtx),
                   2108:                             operands[3],
                   2109:                             gen_rtx (CLOBBER, VOIDmode,
                   2110:                                               gen_rtx (REG, SImode, 15)))));
                   2111:   else
                   2112:     emit_call_insn (gen_rtx (PARALLEL, VOIDmode, gen_rtvec (2,
                   2113:                             gen_rtx (CALL, VOIDmode, fn_rtx, nregs_rtx),
                   2114:                             gen_rtx (CLOBBER, VOIDmode,
                   2115:                                               gen_rtx (REG, SImode, 15)))));
                   2116: 
                   2117:  finish_call:
                   2118: #if 0
                   2119:   /* If this call wants a structure value,
                   2120:      emit an unimp insn to let the called function know about this.  */
                   2121:   if (INTVAL (operands[3]) > 0)
                   2122:     {
                   2123:       rtx insn = emit_insn (operands[3]);
                   2124:       SCHED_GROUP_P (insn) = 1;
                   2125:     }
                   2126: #endif
                   2127: 
                   2128:   DONE;
                   2129: }")
                   2130: 
                   2131: (define_insn ""
                   2132:   [(call (mem:SI (match_operand:SI 0 "call_operand_address" "S,r"))
                   2133:         (match_operand 1 "" ""))
                   2134:    (clobber (reg:SI 15))]
                   2135:   ;;- Do not use operand 1 for most machines.
                   2136:   ""
                   2137:   "*
                   2138: {
                   2139:   return \"call %a0,%1%#\";
                   2140: }"
                   2141:   [(set_attr "type" "call")])
                   2142: 
                   2143: ;; This is a call that wants a structure value.
                   2144: (define_insn ""
                   2145:   [(call (mem:SI (match_operand:SI 0 "call_operand_address" "S,r"))
                   2146:         (match_operand 1 "" ""))
                   2147:    (match_operand 2 "immediate_operand" "")
                   2148:    (clobber (reg:SI 15))]
                   2149:   ;;- Do not use operand 1 for most machines.
                   2150:   "GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) > 0"
                   2151:   "*
                   2152: {
                   2153:   return \"call %a0,%1\;nop\;unimp %2\";
                   2154: }"
                   2155:   [(set_attr "type" "call_no_delay_slot")])
                   2156: 
                   2157: (define_expand "call_value"
                   2158:   [(set (match_operand 0 "register_operand" "=rf")
                   2159:        (call (match_operand:SI 1 "" "")
                   2160:              (match_operand 4 "" "")))]
                   2161:   ;; operand 3 is next_arg_register
                   2162:   ""
                   2163:   "
                   2164: {
                   2165:   rtx fn_rtx, nregs_rtx;
                   2166:   rtvec vec;
                   2167: 
                   2168:   fn_rtx = operands[1];
                   2169: 
                   2170: #if 0
                   2171:   if (operands[3])
                   2172:     nregs_rtx = gen_rtx (CONST_INT, VOIDmode, REGNO (operands[3]) - 8);
                   2173:   else
                   2174:     nregs_rtx = gen_rtx (CONST_INT, VOIDmode, 6);
                   2175: #else
                   2176:   nregs_rtx = const0_rtx;
                   2177: #endif
                   2178: 
                   2179:   vec = gen_rtvec (2,
                   2180:                   gen_rtx (SET, VOIDmode, operands[0],
                   2181:                            gen_rtx (CALL, VOIDmode, fn_rtx, nregs_rtx)),
                   2182:                   gen_rtx (CLOBBER, VOIDmode, gen_rtx (REG, SImode, 15)));
                   2183: 
                   2184:   emit_call_insn (gen_rtx (PARALLEL, VOIDmode, vec));
                   2185: 
                   2186:   DONE;
                   2187: }")
                   2188: 
                   2189: (define_insn ""
                   2190:   [(set (match_operand 0 "" "=rf")
                   2191:        (call (mem:SI (match_operand:SI 1 "call_operand_address" "rS"))
                   2192:              (match_operand 2 "" "")))
                   2193:    (clobber (reg:SI 15))]
                   2194:   ;;- Do not use operand 2 for most machines.
                   2195:   ""
                   2196:   "*
                   2197: {
                   2198:   return \"call %a1,%2%#\";
                   2199: }"
                   2200:   [(set_attr "type" "call")])
                   2201: 
                   2202: (define_insn "return"
                   2203:   [(return)]
                   2204:   "! TARGET_EPILOGUE"
                   2205:   "* return output_return (operands);"
                   2206:   [(set_attr "type" "multi")])
                   2207: 
                   2208: (define_insn "nop"
                   2209:   [(const_int 0)]
                   2210:   ""
                   2211:   "nop")
                   2212: 
                   2213: (define_insn "indirect_jump"
                   2214:   [(set (pc) (match_operand:SI 0 "address_operand" "p"))]
                   2215:   ""
                   2216:  "jmp %a0%#"
                   2217:  [(set_attr "type" "branch")])
                   2218:  
                   2219: (define_expand "nonlocal_goto"
                   2220:   [(match_operand:SI 0 "general_operand" "")
                   2221:    (match_operand:SI 1 "general_operand" "")
                   2222:    (match_operand:SI 2 "general_operand" "")
                   2223:    (match_operand:SI 3 "" "")]
                   2224:   ""
                   2225:   "
                   2226: {
                   2227:   rtx temp;
                   2228:   /* Trap instruction to flush all the registers window.  */
                   2229:   emit_insn (gen_rtx (UNSPEC_VOLATILE, VOIDmode,
                   2230:                      gen_rtvec (1, const0_rtx), 0));
                   2231:   /* Load the fp value for the containing fn into %fp.
                   2232:      This is needed because operands[2] refers to %fp.  */
                   2233:   emit_move_insn (virtual_stack_vars_rtx, operands[0]);
                   2234:   /* Find the containing function's current nonlocal goto handler,
                   2235:      which will do any cleanups and then jump to the label.  */
                   2236:   emit_move_insn (gen_rtx (REG, SImode, 8), operands[1]);
                   2237:   /* Restore %fp from stack pointer value for containing function.
                   2238:      The restore insn that follows will move this to %sp,
                   2239:      and reload the appropriate value into %fp.  */
                   2240:   emit_move_insn (frame_pointer_rtx, operands[2]);
                   2241:   /* Put in the static chain register the nonlocal label address.  */
                   2242:   emit_move_insn (static_chain_rtx, operands[3]);
                   2243:   /* USE of frame_pointer_rtx added for consistency; not clear if
                   2244:      really needed.  */
                   2245:   emit_insn (gen_rtx (USE, VOIDmode, frame_pointer_rtx));
                   2246:   emit_insn (gen_rtx (USE, VOIDmode, stack_pointer_rtx));
                   2247:   emit_insn (gen_rtx (USE, VOIDmode, static_chain_rtx));
                   2248:   emit_insn (gen_rtx (USE, VOIDmode, gen_rtx (REG, SImode, 8)));
                   2249:   /* Return, restoring reg window and jumping to goto handler.  */
                   2250:   emit_insn (gen_rtx (UNSPEC_VOLATILE, VOIDmode,
                   2251:                      gen_rtvec (1, const0_rtx), 1));
                   2252:   DONE;
                   2253: }")
                   2254: 
                   2255: ;; Special trap insn to flush register windows.
                   2256: (define_insn ""
                   2257:   [(unspec_volatile [(const_int 0)] 0)]
                   2258:   ""
                   2259:   "ta 3")
                   2260: 
                   2261: (define_insn ""
                   2262:   [(unspec_volatile [(const_int 0)] 1)]
                   2263:   ""
                   2264:   "jmp %%o0+0\;restore")
                   2265: 
                   2266: ;(define_insn "tail_call" ;; tail call
                   2267: ;  [(set (pc) (match_operand 0 "memory_operand" "m"))]
                   2268: ;  "tail_call_valid_p ()"
                   2269: ;  "* return output_tail_call (operands, insn);"
                   2270: ;  [(set_attr "type" "branch")])
                   2271: 
                   2272: ;; Split up troublesome insns for better scheduling.  */
                   2273: 
                   2274: ;; The following patterns are straightforward.  They can be applied
                   2275: ;; either before or after register allocation.
                   2276: 
                   2277: (define_split
                   2278:   [(set (match_operator 0 "memop" [(match_operand:SI 1 "symbolic_operand" "")])
                   2279:        (match_operand 2 "reg_or_0_operand" ""))
                   2280:    (clobber (match_operand:SI 3 "register_operand" ""))]
                   2281:   "! flag_pic"
                   2282:   [(set (match_dup 3) (high:SI (match_dup 1)))
                   2283:    (set (match_op_dup 0 [(lo_sum:SI (match_dup 3) (match_dup 1))])
                   2284:        (match_dup 2))]
                   2285:   "")
                   2286: 
                   2287: (define_split
                   2288:   [(set (match_operator 0 "memop"
                   2289:                        [(match_operand:SI 1 "immediate_operand" "")])
                   2290:        (match_operand 2 "general_operand" ""))
                   2291:    (clobber (match_operand:SI 3 "register_operand" ""))]
                   2292:   "flag_pic"
                   2293:   [(set (match_op_dup 0 [(match_dup 1)])
                   2294:        (match_dup 2))]
                   2295:   "
                   2296: {
                   2297:   operands[1] = legitimize_pic_address (operands[1], GET_MODE (operands[0]),
                   2298:                                        operands[3], 0);
                   2299: }")
                   2300: 
                   2301: (define_split
                   2302:   [(set (match_operand 0 "register_operand" "")
                   2303:        (match_operator 1 "memop"
                   2304:                        [(match_operand:SI 2 "immediate_operand" "")]))]
                   2305:   "flag_pic"
                   2306:   [(set (match_dup 0)
                   2307:        (match_op_dup 1 [(match_dup 2)]))]
                   2308:   "
                   2309: {
                   2310:   operands[2] = legitimize_pic_address (operands[2], GET_MODE (operands[1]),
                   2311:                                        operands[0], 0);
                   2312: }")
                   2313: 
                   2314: ;; Sign- and Zero-extend operations can have symbolic memory operands.
                   2315: 
                   2316: (define_split
                   2317:   [(set (match_operand 0 "register_operand" "")
                   2318:        (match_operator 1 "extend_op"
                   2319:                        [(match_operator 2 "memop"
                   2320:                                         [(match_operand:SI 3 "immediate_operand" "")])]))]
                   2321:   "flag_pic"
                   2322:   [(set (match_dup 0)
                   2323:        (match_op_dup 1 [(match_op_dup 2 [(match_dup 3)])]))]
                   2324:   "
                   2325: {
                   2326:   operands[3] = legitimize_pic_address (operands[3], GET_MODE (operands[2]),
                   2327:                                        operands[0], 0);
                   2328: }")
                   2329: 
                   2330: (define_split
                   2331:   [(set (match_operand:SI 0 "register_operand" "")
                   2332:        (match_operand:SI 1 "immediate_operand" ""))]
                   2333:   "! flag_pic && (GET_CODE (operands[1]) == SYMBOL_REF
                   2334:                  || GET_CODE (operands[1]) == CONST
                   2335:                  || GET_CODE (operands[1]) == LABEL_REF)"
                   2336:   [(set (match_dup 0) (high:SI (match_dup 1)))
                   2337:    (set (match_dup 0)
                   2338:        (lo_sum:SI (match_dup 0) (match_dup 1)))]
                   2339:   "")
                   2340: 
                   2341: ;; LABEL_REFs are not modified by `legitimize_pic_address`
                   2342: ;; so do not recurse infinitely in the PIC case.
                   2343: (define_split
                   2344:   [(set (match_operand:SI 0 "register_operand" "")
                   2345:        (match_operand:SI 1 "immediate_operand" ""))]
                   2346:   "flag_pic && (GET_CODE (operands[1]) == SYMBOL_REF
                   2347:                || GET_CODE (operands[1]) == CONST)"
                   2348:   [(set (match_dup 0) (match_dup 1))]
                   2349:   "
                   2350: {
                   2351:   operands[1] = legitimize_pic_address (operands[1], Pmode, operands[0], 0);
                   2352: }")
                   2353: 
                   2354: ;; These split sne/seq insns.  The forms of the resulting insns are 
                   2355: ;; somewhat bogus, but they avoid extra patterns and show data dependency.
                   2356: ;; Nothing will look at these in detail after splitting has occurred.
                   2357: 
                   2358: (define_split
                   2359:   [(set (match_operand:SI 0 "register_operand" "")
                   2360:        (ne:SI (match_operand:SI 1 "register_operand" "") (const_int 0)))
                   2361:    (clobber (reg:CC 0))]
                   2362:   ""
                   2363:   [(set (reg:CC_NOOV 0) (compare:CC_NOOV (neg:SI (match_dup 1))
                   2364:                                         (const_int 0)))
                   2365:    (set (match_dup 0) (ltu:SI (reg:CC 0) (const_int 0)))]
                   2366:   "")
                   2367: 
                   2368: (define_split
                   2369:   [(set (match_operand:SI 0 "register_operand" "")
                   2370:        (neg:SI (ne:SI (match_operand:SI 1 "register_operand" "")
                   2371:                       (const_int 0))))
                   2372:    (clobber (reg:CC 0))]
                   2373:   ""
                   2374:   [(set (reg:CC_NOOV 0) (compare:CC_NOOV (neg:SI (match_dup 1))
                   2375:                                         (const_int 0)))
                   2376:    (set (match_dup 0) (neg:SI (ltu:SI (reg:CC 0) (const_int 0))))]
                   2377:   "")
                   2378: 
                   2379: (define_split
                   2380:   [(set (match_operand:SI 0 "register_operand" "")
                   2381:        (eq:SI (match_operand:SI 1 "register_operand" "") (const_int 0)))
                   2382:    (clobber (reg:CC 0))]
                   2383:   ""
                   2384:   [(set (reg:CC_NOOV 0) (compare:CC_NOOV (neg:SI (match_dup 1))
                   2385:                                         (const_int 0)))
                   2386:    (set (match_dup 0) (geu:SI (reg:CC 0) (const_int 0)))]
                   2387:   "")
                   2388: 
                   2389: (define_split
                   2390:   [(set (match_operand:SI 0 "register_operand" "")
                   2391:        (neg:SI (eq:SI (match_operand:SI 1 "register_operand" "")
                   2392:                       (const_int 0))))
                   2393:    (clobber (reg:CC 0))]
                   2394:   ""
                   2395:   [(set (reg:CC_NOOV 0) (compare:CC_NOOV (neg:SI (match_dup 1))
                   2396:                                         (const_int 0)))
                   2397:    (set (match_dup 0) (neg:SI (geu:SI (reg:CC 0) (const_int 0))))]
                   2398:   "")
                   2399: 
                   2400: (define_split
                   2401:   [(set (match_operand:SI 0 "register_operand" "")
                   2402:        (plus:SI (ne:SI (match_operand:SI 1 "register_operand" "")
                   2403:                        (const_int 0))
                   2404:                 (match_operand:SI 2 "register_operand" "")))
                   2405:    (clobber (reg:CC 0))]
                   2406:   ""
                   2407:   [(set (reg:CC_NOOV 0) (compare:CC_NOOV (neg:SI (match_dup 1))
                   2408:                                         (const_int 0)))
                   2409:    (set (match_dup 0) (plus:SI (ltu:SI (reg:CC 0) (const_int 0))
                   2410:                               (match_dup 2)))]
                   2411:   "")
                   2412: 
                   2413: (define_split
                   2414:   [(set (match_operand:SI 0 "register_operand" "")
                   2415:        (minus:SI (match_operand:SI 2 "register_operand" "")
                   2416:                  (ne:SI (match_operand:SI 1 "register_operand" "")
                   2417:                         (const_int 0))))
                   2418:    (clobber (reg:CC 0))]
                   2419:   ""
                   2420:   [(set (reg:CC_NOOV 0) (compare:CC_NOOV (neg:SI (match_dup 1))
                   2421:                                         (const_int 0)))
                   2422:    (set (match_dup 0) (minus:SI (match_dup 2)
                   2423:                                (ltu:SI (reg:CC 0) (const_int 0))))]
                   2424:   "")
                   2425: 
                   2426: (define_split
                   2427:   [(set (match_operand:SI 0 "register_operand" "")
                   2428:        (plus:SI (eq:SI (match_operand:SI 1 "register_operand" "")
                   2429:                        (const_int 0))
                   2430:                 (match_operand:SI 2 "register_operand" "")))
                   2431:    (clobber (reg:CC 0))]
                   2432:   ""
                   2433:   [(set (reg:CC_NOOV 0) (compare:CC_NOOV (neg:SI (match_dup 1))
                   2434:                                         (const_int 0)))
                   2435:    (set (match_dup 0) (plus:SI (geu:SI (reg:CC 0) (const_int 0))
                   2436:                               (match_dup 2)))]
                   2437:   "")
                   2438: 
                   2439: (define_split
                   2440:   [(set (match_operand:SI 0 "register_operand" "")
                   2441:        (minus:SI (match_operand:SI 2 "register_operand" "")
                   2442:                  (eq:SI (match_operand:SI 1 "register_operand" "")
                   2443:                         (const_int 0))))
                   2444:    (clobber (reg:CC 0))]
                   2445:   ""
                   2446:   [(set (reg:CC_NOOV 0) (compare:CC_NOOV (neg:SI (match_dup 1))
                   2447:                                         (const_int 0)))
                   2448:    (set (match_dup 0) (minus:SI (match_dup 2)
                   2449:                                (geu:SI (reg:CC 0) (const_int 0))))]
                   2450:   "")
                   2451: 
                   2452: ;; Peepholes go at the end.
                   2453: 
                   2454: ;; Optimize the case of following a reg-reg move with a test
                   2455: ;; of reg just moved.
                   2456: 
                   2457: (define_peephole
                   2458:   [(set (match_operand:SI 0 "register_operand" "=r")
                   2459:        (match_operand:SI 1 "register_operand" "r"))
                   2460:    (set (reg:CC 0)
                   2461:        (compare:CC (match_operand:SI 2 "register_operand" "r")
                   2462:                    (const_int 0)))]
                   2463:   "rtx_equal_p (operands[2], operands[0])
                   2464:    || rtx_equal_p (operands[2], operands[1])"
                   2465:   "orcc %1,%%g0,%0"
                   2466:   [(set_attr "type" "move")])
                   2467: 
                   2468: ;; Do {sign,zero}-extended compares somewhat more efficiently.
                   2469: ;; ??? Is this now the Right Way to do this?  Or will SCRATCH
                   2470: ;;     eventually have some impact here?
                   2471: 
                   2472: (define_peephole
                   2473:   [(set (match_operand:HI 0 "register_operand" "")
                   2474:        (match_operand:HI 1 "memory_operand" ""))
                   2475:    (set (match_operand:SI 2 "register_operand" "")
                   2476:        (sign_extend:SI (match_dup 0)))
                   2477:    (set (reg:CC 0)
                   2478:        (compare:CC (match_dup 2)
                   2479:                    (const_int 0)))]
                   2480:   ""
                   2481:   "ldsh %1,%0\;orcc %0,%%g0,%2")
                   2482: 
                   2483: (define_peephole
                   2484:   [(set (match_operand:QI 0 "register_operand" "")
                   2485:        (match_operand:QI 1 "memory_operand" ""))
                   2486:    (set (match_operand:SI 2 "register_operand" "")
                   2487:        (sign_extend:SI (match_dup 0)))
                   2488:    (set (reg:CC 0)
                   2489:        (compare:CC (match_dup 2)
                   2490:                    (const_int 0)))]
                   2491:   ""
                   2492:   "ldsb %1,%0\;orcc %0,%%g0,%2")
                   2493: 
                   2494: (define_peephole
                   2495:   [(set (match_operand:HI 0 "register_operand" "")
                   2496:        (match_operand:HI 1 "memory_operand" ""))
                   2497:    (set (match_operand:SI 2 "register_operand" "")
                   2498:        (sign_extend:SI (match_dup 0)))]
                   2499:   "dead_or_set_p (insn, operands[0])"
                   2500:   "*
                   2501: {
                   2502:   warning (\"bad peephole\");
                   2503:   if (! MEM_VOLATILE_P (operands[1]))
                   2504:     abort ();
                   2505:   return \"ldsh %1,%2\";
                   2506: }")
                   2507: 
                   2508: (define_peephole
                   2509:   [(set (match_operand:QI 0 "register_operand" "")
                   2510:        (match_operand:QI 1 "memory_operand" ""))
                   2511:    (set (match_operand:SI 2 "register_operand" "")
                   2512:        (sign_extend:SI (match_dup 0)))]
                   2513:   "dead_or_set_p (insn, operands[0])"
                   2514:   "*
                   2515: {
                   2516:   warning (\"bad peephole\");
                   2517:   if (! MEM_VOLATILE_P (operands[1]))
                   2518:     abort ();
                   2519:   return \"ldsb %1,%2\";
                   2520: }")
                   2521: 
                   2522: ;; Floating-point move peepholes
                   2523: 
                   2524: (define_peephole
                   2525:   [(set (match_operand:SI 0 "register_operand" "=r")
                   2526:        (lo_sum:SI (match_dup 0)
                   2527:                   (match_operand:SI 1 "immediate_operand" "i")))
                   2528:    (set (match_operand:DF 2 "register_operand" "=fr")
                   2529:        (mem:DF (match_dup 0)))]
                   2530:   "RTX_UNCHANGING_P (operands[1]) && reg_unused_after (operands[0], insn)"
                   2531:   "*
                   2532: {
                   2533:   /* Go by way of output_move_double in case the register in operand 2
                   2534:      is not properly aligned for ldd.  */
                   2535:   operands[1] = gen_rtx (MEM, DFmode,
                   2536:                         gen_rtx (LO_SUM, SImode, operands[0], operands[1]));
                   2537:   operands[0] = operands[2];
                   2538:   return output_move_double (operands);
                   2539: }")
                   2540: 
                   2541: (define_peephole
                   2542:   [(set (match_operand:SI 0 "register_operand" "=r")
                   2543:        (lo_sum:SI (match_dup 0)
                   2544:                   (match_operand:SI 1 "immediate_operand" "i")))
                   2545:    (set (match_operand:SF 2 "register_operand" "=fr")
                   2546:        (mem:SF (match_dup 0)))]
                   2547:   "RTX_UNCHANGING_P (operands[1]) && reg_unused_after (operands[0], insn)"
                   2548:   "ld [%0+%%lo(%a1)],%2")
                   2549: 
                   2550: ;; Return peepholes.  First the "normal" ones
                   2551: 
                   2552: (define_insn ""
                   2553:   [(set (match_operand:SI 0 "restore_operand" "")
                   2554:        (match_operand:SI 1 "arith_operand" "rI"))
                   2555:    (return)]
                   2556:   "! TARGET_EPILOGUE"
                   2557:   "*
                   2558: {
                   2559:   if (current_function_returns_struct)
                   2560:     return \"jmp %%i7+12\;restore %%g0,%1,%Y0\";
                   2561:   else
                   2562:     return \"ret\;restore %%g0,%1,%Y0\";
                   2563: }"
                   2564:   [(set_attr "type" "multi")])
                   2565: 
                   2566: (define_insn ""
                   2567:   [(set (match_operand:SI 0 "restore_operand" "")
                   2568:        (plus:SI (match_operand:SI 1 "arith_operand" "%r")
                   2569:                 (match_operand:SI 2 "arith_operand" "rI")))
                   2570:    (return)]
                   2571:   "! TARGET_EPILOGUE"
                   2572:   "*
                   2573: {
                   2574:   if (current_function_returns_struct)
                   2575:     return \"jmp %%i7+12\;restore %r1,%2,%Y0\";
                   2576:   else
                   2577:     return \"ret\;restore %r1,%2,%Y0\";
                   2578: }"
                   2579:   [(set_attr "type" "multi")])
                   2580: 
                   2581: ;; Turned off because it should never match (subtracting a constant
                   2582: ;; is turned into addition) and because it would do the wrong thing
                   2583: ;; when operand 2 is -4096 (--4096 == 4096 is not a valid immediate).
                   2584: ;;(define_insn ""
                   2585: ;;  [(set (match_operand:SI 0 "restore_operand" "")
                   2586: ;;     (minus:SI (match_operand:SI 1 "register_operand" "r")
                   2587: ;;               (match_operand:SI 2 "small_int" "I")))
                   2588: ;;   (return)]
                   2589: ;;  "! TARGET_EPILOGUE"
                   2590: ;;  "ret\;restore %1,-(%2),%Y0"
                   2591: ;;  [(set_attr "type" "multi")])
                   2592: 
                   2593: ;; The following pattern is only generated by delayed-branch scheduling,
                   2594: ;; when the insn winds up in the epilogue.
                   2595: (define_insn ""
                   2596:   [(set (reg:SF 32)
                   2597:        (match_operand:SF 0 "register_operand" "f"))
                   2598:    (return)]
                   2599:   "! TARGET_EPILOGUE"
                   2600:   "ret\;fmovs %0,%%f0")
                   2601: 
                   2602: ;; Now peepholes to go a call followed by a jump.
                   2603: 
                   2604: (define_peephole
                   2605:   [(parallel [(set (match_operand 0 "" "")
                   2606:                   (call (mem:SI (match_operand:SI 1 "call_operand_address" "S,r"))
                   2607:                         (match_operand 2 "" "")))
                   2608:              (clobber (reg:SI 15))])
                   2609:    (set (pc) (label_ref (match_operand 3 "" "")))]
                   2610:   "short_branch (INSN_UID (insn), INSN_UID (operands[3]))"
                   2611:   "*
                   2612: {
                   2613:   return \"call %a1,%2\;add %%o7,(%l3-.-4),%%o7\";
                   2614: }")
                   2615: 
                   2616: (define_peephole
                   2617:   [(parallel [(call (mem:SI (match_operand:SI 0 "call_operand_address" "S,r"))
                   2618:                    (match_operand 1 "" ""))
                   2619:              (clobber (reg:SI 15))])
                   2620:    (set (pc) (label_ref (match_operand 2 "" "")))]
                   2621:   "short_branch (INSN_UID (insn), INSN_UID (operands[2]))"
                   2622:   "*
                   2623: {
                   2624:   return \"call %a0,%1\;add %%o7,(%l2-.-4),%%o7\";
                   2625: }")
                   2626: 
                   2627: (define_peephole
                   2628:   [(parallel [(set (match_operand:SI 0 "register_operand" "=r")
                   2629:                   (minus:SI (match_operand:SI 1 "reg_or_0_operand" "rJ")
                   2630:                             (reg:SI 0)))
                   2631:              (clobber (reg:CC 0))])
                   2632:    (set (reg:CC 0) (compare (match_dup 0) (const_int 0)))]
                   2633:   ""
                   2634:   "subxcc %r1,0,%0"
                   2635:   [(set_attr "type" "compare")])
                   2636: 
                   2637: ;;- Local variables:
                   2638: ;;- mode:emacs-lisp
                   2639: ;;- comment-start: ";;- "
                   2640: ;;- eval: (set-syntax-table (copy-sequence (syntax-table)))
                   2641: ;;- eval: (modify-syntax-entry ?[ "(]")
                   2642: ;;- eval: (modify-syntax-entry ?] ")[")
                   2643: ;;- eval: (modify-syntax-entry ?{ "(}")
                   2644: ;;- eval: (modify-syntax-entry ?} "){")
                   2645: ;;- End:

unix.superglobalmegacorp.com

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