Annotation of gcc/config/alpha/alpha.md, revision 1.1.1.4

1.1.1.3   root        1: ;; Machine description for DEC Alpha for GNU C compiler
1.1.1.4 ! root        2: ;; Copyright (C) 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
1.1.1.3   root        3: ;; Contributed by Richard Kenner ([email protected])
1.1       root        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
1.1.1.4 ! root       19: ;; the Free Software Foundation, 59 Temple Place - Suite 330,
        !            20: ;; Boston, MA 02111-1307, USA.
1.1       root       21: 
                     22: ;;- See file "rtl.def" for documentation on define_insn, match_*, et. al.
                     23: 
                     24: ;; Define an insn type attribute.  This is used in function unit delay
                     25: ;; computations, among other purposes.  For the most part, we use the names
                     26: ;; defined in the EV4 documentation, but add a few that we have to know about
                     27: ;; separately.
                     28: 
                     29: (define_attr "type"
1.1.1.2   root       30:   "ld,st,ibr,fbr,jsr,iaddlog,shiftcm,icmp,imull,imulq,fpop,fdivs,fdivt,ldsym,isubr"
1.1       root       31:   (const_string "shiftcm"))
                     32: 
                     33: ;; We include four function units: ABOX, which computes the address,
                     34: ;; BBOX, used for branches, EBOX, used for integer operations, and FBOX,
                     35: ;; used for FP operations.
                     36: ;;
                     37: ;; We assume that we have been successful in getting double issues and
                     38: ;; hence multiply all costs by two insns per cycle.  The minimum time in
                     39: ;; a function unit is 2 cycle, which will tend to produce the double
                     40: ;; issues.
                     41: 
                     42: ;; Memory delivers its result in three cycles.
                     43: (define_function_unit "abox" 1 0 (eq_attr "type" "ld,ldsym,st") 6 2)
                     44: 
                     45: ;; Branches have no delay cost, but do tie up the unit for two cycles.
                     46: (define_function_unit "bbox" 1 1 (eq_attr "type" "ibr,fbr,jsr") 4 4)
                     47: 
                     48: ;; Arithmetic insns are normally have their results available after two
                     49: ;; cycles.  There are a number of exceptions.  They are encoded in
                     50: ;; ADJUST_COST.  Some of the other insns have similar exceptions.
                     51: 
                     52: (define_function_unit "ebox" 1 0 (eq_attr "type" "iaddlog,shiftcm,icmp") 4 2)
                     53: 
                     54: ;; These really don't take up the integer pipeline, but they do occupy
                     55: ;; IBOX1; we approximate here.
                     56: 
                     57: (define_function_unit "ebox" 1 0 (eq_attr "type" "imull") 42 2)
                     58: (define_function_unit "ebox" 1 0 (eq_attr "type" "imulq") 46 2)
                     59: 
                     60: (define_function_unit "imult" 1 0 (eq_attr "type" "imull") 42 38)
                     61: (define_function_unit "imult" 1 0 (eq_attr "type" "imulq") 46 42)
                     62: 
                     63: (define_function_unit "fbox" 1 0 (eq_attr "type" "fpop") 12 2)
                     64: 
                     65: (define_function_unit "fbox" 1 0 (eq_attr "type" "fdivs") 68 0)
                     66: (define_function_unit "fbox" 1 0 (eq_attr "type" "fdivt") 126 0)
                     67: 
                     68: (define_function_unit "divider" 1 0 (eq_attr "type" "fdivs") 68 60)
                     69: (define_function_unit "divider" 1 0 (eq_attr "type" "fdivt") 126 118)
                     70: 
                     71: ;; First define the arithmetic insns.  Note that the 32-bit forms also
                     72: ;; sign-extend.
                     73: 
                     74: ;; Note that we can do sign extensions in both FP and integer registers.
                     75: ;; However, the result must be in the same type of register as the input.
                     76: ;; The register preferencing code can't handle this case very well, so, for
                     77: ;; now, don't let the FP case show up here for preferencing.  Also,
                     78: ;; sign-extends in FP registers take two instructions.
                     79: (define_insn "extendsidi2"
                     80:   [(set (match_operand:DI 0 "register_operand" "=r,r,*f")
                     81:        (sign_extend:DI (match_operand:SI 1 "nonimmediate_operand" "r,m,*f")))]
                     82:   ""
                     83:   "@
                     84:    addl %1,$31,%0
                     85:    ldl %0,%1
                     86:    cvtql %1,%0\;cvtlq %0,%0"
                     87:   [(set_attr "type" "iaddlog,ld,fpop")])
                     88: 
1.1.1.3   root       89: ;; Do addsi3 the way expand_binop would do if we didn't have one.  This
                     90: ;; generates better code.  We have the anonymous addsi3 pattern below in
                     91: ;; case combine wants to make it.
                     92: (define_expand "addsi3"
                     93:   [(set (match_operand:SI 0 "register_operand" "")
                     94:        (plus:SI (match_operand:SI 1 "reg_or_0_operand" "")
                     95:                 (match_operand:SI 2 "add_operand" "")))]
                     96:   ""
                     97:   "
                     98: { emit_insn (gen_rtx (SET, VOIDmode, gen_lowpart (DImode, operands[0]),
                     99:                      gen_rtx (PLUS, DImode,
                    100:                               gen_lowpart (DImode, operands[1]),
                    101:                               gen_lowpart (DImode, operands[2]))));
                    102:   DONE;
                    103: } ")
                    104: 
                    105: (define_insn ""
1.1       root      106:   [(set (match_operand:SI 0 "register_operand" "=r,r,r,r")
1.1.1.2   root      107:        (plus:SI (match_operand:SI 1 "reg_or_0_operand" "%rJ,rJ,rJ,rJ")
1.1       root      108:                 (match_operand:SI 2 "add_operand" "rI,O,K,L")))]
                    109:   ""
                    110:   "@
                    111:    addl %r1,%2,%0
                    112:    subl %r1,%n2,%0
                    113:    lda %0,%2(%r1)
                    114:    ldah %0,%h2(%r1)"
                    115:   [(set_attr "type" "iaddlog")])
                    116: 
                    117: (define_split
                    118:   [(set (match_operand:SI 0 "register_operand" "")
                    119:        (plus:SI (match_operand:SI 1 "register_operand" "")
                    120:                 (match_operand:SI 2 "const_int_operand" "")))]
                    121:   "! add_operand (operands[2], SImode)"
                    122:   [(set (match_dup 0) (plus:SI (match_dup 1) (match_dup 3)))
                    123:    (set (match_dup 0) (plus:SI (match_dup 0) (match_dup 4)))]
                    124:   "
                    125: {
                    126:   HOST_WIDE_INT val = INTVAL (operands[2]);
                    127:   HOST_WIDE_INT low = (val & 0xffff) - 2 * (val & 0x8000);
                    128:   HOST_WIDE_INT rest = val - low;
                    129: 
                    130:   operands[3] = GEN_INT (rest);
                    131:   operands[4] = GEN_INT (low);
                    132: }")
                    133: 
                    134: (define_insn ""
                    135:   [(set (match_operand:DI 0 "register_operand" "=r,r")
                    136:        (sign_extend:DI
                    137:         (plus:SI (match_operand:SI 1 "reg_or_0_operand" "%rJ,rJ")
                    138:                  (match_operand:SI 2 "sext_add_operand" "rI,O"))))]
                    139:   ""
                    140:   "@
                    141:    addl %r1,%2,%0
                    142:    subl %r1,%n2,%0"
                    143:   [(set_attr "type" "iaddlog")])
                    144: 
                    145: (define_split
                    146:   [(set (match_operand:DI 0 "register_operand" "")
                    147:        (sign_extend:DI
                    148:         (plus:SI (match_operand:SI 1 "register_operand" "")
                    149:                  (match_operand:SI 2 "const_int_operand" ""))))
                    150:    (clobber (match_operand:SI 3 "register_operand" ""))]
                    151:   "! sext_add_operand (operands[2], SImode) && INTVAL (operands[2]) > 0
                    152:    && INTVAL (operands[2]) % 4 == 0"
                    153:   [(set (match_dup 3) (match_dup 4))
                    154:    (set (match_dup 0) (sign_extend:DI (plus:SI (mult:SI (match_dup 3)
                    155:                                                        (match_dup 5))
                    156:                                               (match_dup 1))))]
                    157:   "
                    158: {
                    159:   HOST_WIDE_INT val = INTVAL (operands[2]) / 4;
                    160:   int mult = 4;
                    161: 
                    162:   if (val % 2 == 0)
                    163:     val /= 2, mult = 8;
                    164: 
                    165:   operands[4] = GEN_INT (val);
                    166:   operands[5] = GEN_INT (mult);
                    167: }")
                    168: 
1.1.1.3   root      169: (define_split
                    170:   [(set (match_operand:DI 0 "register_operand" "")
                    171:        (sign_extend:DI
                    172:         (plus:SI (match_operator:SI 1 "comparison_operator"
                    173:                                     [(match_operand 2 "" "")
                    174:                                      (match_operand 3 "" "")])
                    175:                  (match_operand:SI 4 "add_operand" ""))))
                    176:    (clobber (match_operand:DI 5 "register_operand" ""))]
                    177:   ""
                    178:   [(set (match_dup 5) (match_dup 6))
                    179:    (set (match_dup 0) (sign_extend:DI (plus:SI (match_dup 7) (match_dup 4))))]
                    180:   "
                    181: {
                    182:   operands[6] = gen_rtx (GET_CODE (operands[1]), DImode,
                    183:                         operands[2], operands[3]);
                    184:   operands[7] = gen_lowpart (SImode, operands[5]);
                    185: }")
                    186: 
1.1       root      187: (define_insn "adddi3"
                    188:   [(set (match_operand:DI 0 "register_operand" "=r,r,r,r")
1.1.1.2   root      189:        (plus:DI (match_operand:DI 1 "reg_or_0_operand" "%rJ,rJ,rJ,rJ")
1.1       root      190:                 (match_operand:DI 2 "add_operand" "rI,O,K,L")))]
                    191:   ""
                    192:   "@
                    193:    addq %r1,%2,%0
                    194:    subq %r1,%n2,%0
                    195:    lda %0,%2(%r1)
                    196:    ldah %0,%h2(%r1)"
                    197:   [(set_attr "type" "iaddlog")])
                    198: 
                    199: ;; Don't do this if we are adjusting SP since we don't want to do
                    200: ;; it in two steps. 
                    201: (define_split
                    202:   [(set (match_operand:DI 0 "register_operand" "")
                    203:        (plus:DI (match_operand:DI 1 "register_operand" "")
                    204:                 (match_operand:DI 2 "const_int_operand" "")))]
                    205:   "! add_operand (operands[2], DImode)
                    206:    && REGNO (operands[0]) != STACK_POINTER_REGNUM"
                    207:   [(set (match_dup 0) (plus:DI (match_dup 1) (match_dup 3)))
                    208:    (set (match_dup 0) (plus:DI (match_dup 0) (match_dup 4)))]
                    209:   "
                    210: {
                    211:   HOST_WIDE_INT val = INTVAL (operands[2]);
                    212:   HOST_WIDE_INT low = (val & 0xffff) - 2 * (val & 0x8000);
                    213:   HOST_WIDE_INT rest = val - low;
                    214: 
                    215:   operands[3] = GEN_INT (rest);
                    216:   operands[4] = GEN_INT (low);
                    217: }")
                    218: 
                    219: (define_insn ""
                    220:   [(set (match_operand:SI 0 "register_operand" "=r,r")
                    221:        (plus:SI (mult:SI (match_operand:SI 1 "reg_or_0_operand" "rJ,rJ")
                    222:                          (match_operand:SI 2 "const48_operand" "I,I"))
                    223:                 (match_operand:SI 3 "sext_add_operand" "rI,O")))]
                    224:   ""
                    225:   "@
                    226:    s%2addl %r1,%3,%0
                    227:    s%2subl %r1,%n3,%0"
                    228:   [(set_attr "type" "iaddlog")])
                    229: 
                    230: (define_insn ""
                    231:   [(set (match_operand:DI 0 "register_operand" "=r,r")
                    232:        (sign_extend:DI
                    233:         (plus:SI (mult:SI (match_operand:SI 1 "reg_or_0_operand" "rJ,rJ")
                    234:                           (match_operand:SI 2 "const48_operand" "I,I"))
                    235:                  (match_operand:SI 3 "sext_add_operand" "rI,O"))))]
                    236:   ""
                    237:   "@
                    238:    s%2addl %r1,%3,%0
                    239:    s%2subl %r1,%n3,%0"
                    240:   [(set_attr "type" "iaddlog")])
                    241: 
1.1.1.3   root      242: (define_split
                    243:   [(set (match_operand:DI 0 "register_operand" "")
                    244:        (sign_extend:DI
                    245:         (plus:SI (mult:SI (match_operator:SI 1 "comparison_operator"
                    246:                                              [(match_operand 2 "" "")
                    247:                                               (match_operand 3 "" "")])
                    248:                           (match_operand:SI 4 "const48_operand" ""))
                    249:                  (match_operand:SI 5 "add_operand" ""))))
                    250:    (clobber (match_operand:DI 6 "register_operand" ""))]
                    251:   ""
                    252:   [(set (match_dup 6) (match_dup 7))
                    253:    (set (match_dup 0)
                    254:        (sign_extend:DI (plus:SI (mult:SI (match_dup 8) (match_dup 4))
                    255:                                 (match_dup 5))))]
                    256:   "
                    257: {
                    258:   operands[7] = gen_rtx (GET_CODE (operands[1]), DImode,
                    259:                         operands[2], operands[3]);
                    260:   operands[8] = gen_lowpart (SImode, operands[6]);
                    261: }")
                    262: 
1.1       root      263: (define_insn ""
                    264:   [(set (match_operand:DI 0 "register_operand" "=r,r")
                    265:        (plus:DI (mult:DI (match_operand:DI 1 "reg_or_0_operand" "rJ,rJ")
                    266:                          (match_operand:DI 2 "const48_operand" "I,I"))
                    267:                 (match_operand:DI 3 "reg_or_8bit_operand" "rI,O")))]
                    268:   ""
                    269:   "@
                    270:    s%2addq %r1,%3,%0
                    271:    s%2subq %1,%n3,%0"
                    272:   [(set_attr "type" "iaddlog")])
                    273: 
                    274: ;; These variants of the above insns can occur if the third operand
                    275: ;; is the frame pointer.  This is a kludge, but there doesn't
                    276: ;; seem to be a way around it.  Only recognize them while reloading.
                    277: 
                    278: (define_insn ""
1.1.1.4 ! root      279:   [(set (match_operand:DI 0 "some_operand" "=&r")
        !           280:        (plus:DI (plus:DI (match_operand:DI 1 "some_operand" "r")
        !           281:                          (match_operand:DI 2 "some_operand" "r"))
        !           282:                 (match_operand:DI 3 "some_operand" "rIOKL")))]
1.1.1.3   root      283:   "reload_in_progress"
                    284:   "#"
                    285:   [(set_attr "type" "iaddlog")])
                    286: 
                    287: (define_split
                    288:   [(set (match_operand:DI 0 "register_operand" "")
                    289:        (plus:DI (plus:DI (match_operand:DI 1 "register_operand" "")
                    290:                          (match_operand:DI 2 "register_operand" ""))
                    291:                 (match_operand:DI 3 "add_operand" "")))]
                    292:   "reload_completed"
                    293:   [(set (match_dup 0) (plus:DI (match_dup 1) (match_dup 2)))
                    294:    (set (match_dup 0) (plus:DI (match_dup 0) (match_dup 3)))]
                    295:   "")
                    296:                                           
                    297: (define_insn ""
1.1.1.4 ! root      298:   [(set (match_operand:SI 0 "some_operand" "=&r")
1.1.1.3   root      299:        (plus:SI (plus:SI (mult:SI (match_operand:SI 1 "some_operand" "rJ")
1.1       root      300:                                   (match_operand:SI 2 "const48_operand" "I"))
1.1.1.4 ! root      301:                          (match_operand:SI 3 "some_operand" "r"))
        !           302:                 (match_operand:SI 4 "some_operand" "rIOKL")))]
1.1       root      303:   "reload_in_progress"
1.1.1.3   root      304:   "#"
1.1       root      305:   [(set_attr "type" "iaddlog")])
                    306: 
1.1.1.3   root      307: (define_split
                    308:   [(set (match_operand:SI 0 "register_operand" "r")
                    309:        (plus:SI (plus:SI (mult:SI (match_operand:SI 1 "reg_or_0_operand" "")
                    310:                                   (match_operand:SI 2 "const48_operand" ""))
                    311:                          (match_operand:SI 3 "register_operand" ""))
                    312:                 (match_operand:SI 4 "add_operand" "rIOKL")))]
                    313:   "reload_completed"
                    314:   [(set (match_dup 0)
                    315:        (plus:SI (mult:SI (match_dup 1) (match_dup 2)) (match_dup 3)))
                    316:    (set (match_dup 0) (plus:SI (match_dup 0) (match_dup 4)))]
                    317:   "")
                    318: 
1.1       root      319: (define_insn ""
1.1.1.4 ! root      320:   [(set (match_operand:DI 0 "some_operand" "=&r")
1.1       root      321:        (sign_extend:DI
                    322:         (plus:SI (plus:SI
1.1.1.3   root      323:                   (mult:SI (match_operand:SI 1 "some_operand" "rJ")
1.1       root      324:                            (match_operand:SI 2 "const48_operand" "I"))
1.1.1.4 ! root      325:                   (match_operand:SI 3 "some_operand" "r"))
        !           326:                  (match_operand:SI 4 "some_operand" "rIOKL"))))]
1.1       root      327:   "reload_in_progress"
1.1.1.3   root      328:   "#"
1.1       root      329:   [(set_attr "type" "iaddlog")])
                    330: 
1.1.1.3   root      331: (define_split
                    332:   [(set (match_operand:DI 0 "register_operand" "")
                    333:        (sign_extend:DI
                    334:         (plus:SI (plus:SI
                    335:                   (mult:SI (match_operand:SI 1 "reg_or_0_operand" "")
                    336:                            (match_operand:SI 2 "const48_operand" ""))
                    337:                   (match_operand:SI 3 "register_operand" ""))
                    338:                  (match_operand:SI 4 "add_operand" ""))))]
                    339:   "reload_completed"
                    340:   [(set (match_dup 5)
                    341:        (plus:SI (mult:SI (match_dup 1) (match_dup 2)) (match_dup 3)))
                    342:    (set (match_dup 0) (sign_extend:DI (plus:SI (match_dup 5) (match_dup 4))))]
                    343:   "
                    344: { operands[5] = gen_lowpart (SImode, operands[0]);
                    345: }")
                    346: 
1.1       root      347: (define_insn ""
1.1.1.4 ! root      348:   [(set (match_operand:DI 0 "some_operand" "=&r")
1.1.1.3   root      349:        (plus:DI (plus:DI (mult:DI (match_operand:DI 1 "some_operand" "rJ")
1.1       root      350:                                   (match_operand:DI 2 "const48_operand" "I"))
1.1.1.4 ! root      351:                          (match_operand:DI 3 "some_operand" "r"))
        !           352:                 (match_operand:DI 4 "some_operand" "rIOKL")))]
1.1       root      353:   "reload_in_progress"
1.1.1.4 ! root      354:   "#"
1.1       root      355:   [(set_attr "type" "iaddlog")])
                    356: 
1.1.1.3   root      357: (define_split
                    358:   [(set (match_operand:DI 0 "register_operand" "=")
                    359:        (plus:DI (plus:DI (mult:DI (match_operand:DI 1 "reg_or_0_operand" "")
                    360:                                   (match_operand:DI 2 "const48_operand" ""))
                    361:                          (match_operand:DI 3 "register_operand" ""))
                    362:                 (match_operand:DI 4 "add_operand" "")))]
                    363:   "reload_completed"
                    364:   [(set (match_dup 0)
                    365:        (plus:DI (mult:DI (match_dup 1) (match_dup 2)) (match_dup 3)))
                    366:    (set (match_dup 0) (plus:DI (match_dup 0) (match_dup 4)))]
                    367:   "")
                    368: 
1.1       root      369: (define_insn "negsi2"
                    370:   [(set (match_operand:SI 0 "register_operand" "=r")
                    371:        (neg:SI (match_operand:SI 1 "reg_or_8bit_operand" "rI")))]
                    372:   ""
                    373:   "subl $31,%1,%0"
                    374:   [(set_attr "type" "iaddlog")])
                    375: 
                    376: (define_insn ""
                    377:   [(set (match_operand:DI 0 "register_operand" "=r")
                    378:        (sign_extend:DI (neg:SI
                    379:                         (match_operand:SI 1 "reg_or_8bit_operand" "rI"))))]
                    380:   ""
                    381:   "subl $31,%1,%0"
                    382:   [(set_attr "type" "iaddlog")])
                    383: 
                    384: (define_insn "negdi2"
                    385:   [(set (match_operand:DI 0 "register_operand" "=r")
                    386:        (neg:DI (match_operand:DI 1 "reg_or_8bit_operand" "rI")))]
                    387:   ""
                    388:   "subq $31,%1,%0"
                    389:   [(set_attr "type" "iaddlog")])
                    390: 
1.1.1.3   root      391: (define_expand "subsi3"
                    392:   [(set (match_operand:SI 0 "register_operand" "")
                    393:        (minus:SI (match_operand:SI 1 "reg_or_0_operand" "")
                    394:                  (match_operand:SI 2 "reg_or_8bit_operand" "")))]
                    395:   ""
                    396:   "
                    397: { emit_insn (gen_rtx (SET, VOIDmode, gen_lowpart (DImode, operands[0]),
                    398:                      gen_rtx (MINUS, DImode,
                    399:                               gen_lowpart (DImode, operands[1]),
                    400:                               gen_lowpart (DImode, operands[2]))));
                    401:   DONE;
                    402: 
                    403: } ")
                    404: 
                    405: (define_insn ""
1.1       root      406:   [(set (match_operand:SI 0 "register_operand" "=r")
                    407:        (minus:SI (match_operand:SI 1 "reg_or_0_operand" "rJ")
                    408:                  (match_operand:SI 2 "reg_or_8bit_operand" "rI")))]
                    409:   ""
                    410:   "subl %r1,%2,%0"
                    411:   [(set_attr "type" "iaddlog")])
                    412: 
                    413: (define_insn ""
                    414:   [(set (match_operand:DI 0 "register_operand" "=r")
                    415:        (sign_extend:DI (minus:SI (match_operand:SI 1 "reg_or_0_operand" "rJ")
                    416:                                  (match_operand:SI 2 "reg_or_8bit_operand" "rI"))))]
                    417:   ""
                    418:   "subl %r1,%2,%0"
                    419:   [(set_attr "type" "iaddlog")])
                    420: 
                    421: (define_insn "subdi3"
                    422:   [(set (match_operand:DI 0 "register_operand" "=r")
                    423:        (minus:DI (match_operand:DI 1 "reg_or_0_operand" "rJ")
                    424:                  (match_operand:DI 2 "reg_or_8bit_operand" "rI")))]
                    425:   ""
                    426:   "subq %r1,%2,%0"
                    427:   [(set_attr "type" "iaddlog")])
                    428: 
                    429: (define_insn ""
                    430:   [(set (match_operand:SI 0 "register_operand" "=r")
                    431:        (minus:SI (mult:SI (match_operand:SI 1 "reg_or_0_operand" "rJ")
                    432:                           (match_operand:SI 2 "const48_operand" "I"))
                    433:                  (match_operand:SI 3 "reg_or_8bit_operand" "rI")))]
                    434:   ""
                    435:   "s%2subl %r1,%3,%0"
                    436:   [(set_attr "type" "iaddlog")])
                    437: 
                    438: (define_insn ""
                    439:   [(set (match_operand:DI 0 "register_operand" "=r")
                    440:        (sign_extend:DI
                    441:         (minus:SI (mult:SI (match_operand:SI 1 "reg_or_0_operand" "rJ")
                    442:                            (match_operand:SI 2 "const48_operand" "I"))
                    443:                   (match_operand:SI 3 "reg_or_8bit_operand" "rI"))))]
                    444:   ""
                    445:   "s%2subl %r1,%3,%0"
                    446:   [(set_attr "type" "iaddlog")])
                    447: 
                    448: (define_insn ""
                    449:   [(set (match_operand:DI 0 "register_operand" "=r")
                    450:        (minus:DI (mult:DI (match_operand:DI 1 "reg_or_0_operand" "rJ")
                    451:                           (match_operand:DI 2 "const48_operand" "I"))
                    452:                  (match_operand:DI 3 "reg_or_8bit_operand" "rI")))]
                    453:   ""
                    454:   "s%2subq %r1,%3,%0"
                    455:   [(set_attr "type" "iaddlog")])
                    456: 
                    457: (define_insn "mulsi3"
                    458:   [(set (match_operand:SI 0 "register_operand" "=r")
                    459:        (mult:SI (match_operand:SI 1 "reg_or_0_operand" "%rJ")
1.1.1.3   root      460:                 (match_operand:SI 2 "reg_or_0_operand" "rJ")))]
1.1       root      461:   ""
1.1.1.3   root      462:   "mull %r1,%r2,%0"
1.1       root      463:   [(set_attr "type" "imull")])
                    464: 
                    465: (define_insn ""
                    466:   [(set (match_operand:DI 0 "register_operand" "=r")
                    467:        (sign_extend:DI (mult:SI (match_operand:SI 1 "reg_or_0_operand" "%rJ")
1.1.1.3   root      468:                                 (match_operand:SI 2 "reg_or_0_operand" "rJ"))))]
1.1       root      469:   ""
1.1.1.3   root      470:   "mull %r1,%r2,%0"
1.1       root      471:   [(set_attr "type" "imull")])
                    472: 
                    473: (define_insn "muldi3"
                    474:   [(set (match_operand:DI 0 "register_operand" "=r")
                    475:        (mult:DI (match_operand:DI 1 "reg_or_0_operand" "%rJ")
1.1.1.3   root      476:                 (match_operand:DI 2 "reg_or_0_operand" "rJ")))]
                    477:   ""
                    478:   "mulq %r1,%r2,%0"
                    479:   [(set_attr "type" "imulq")])
                    480: 
                    481: (define_insn "umuldi3_highpart"
                    482:   [(set (match_operand:DI 0 "register_operand" "=r")
                    483:        (truncate:DI
                    484:         (lshiftrt:TI
                    485:          (mult:TI (zero_extend:TI (match_operand:DI 1 "register_operand" "r"))
                    486:                   (zero_extend:TI (match_operand:DI 2 "register_operand" "r")))
                    487:          (const_int 64))))]
                    488:   ""
                    489:   "umulh %1,%2,%0"
                    490:   [(set_attr "type" "imulq")])
                    491: 
                    492: (define_insn ""
                    493:   [(set (match_operand:DI 0 "register_operand" "=r")
                    494:        (truncate:DI
                    495:         (lshiftrt:TI
                    496:          (mult:TI (zero_extend:TI (match_operand:DI 1 "register_operand" "r"))
                    497:                   (match_operand:TI 2 "cint8_operand" "I"))
                    498:          (const_int 64))))]
1.1       root      499:   ""
1.1.1.3   root      500:   "umulh %1,%2,%0"
1.1       root      501:   [(set_attr "type" "imulq")])
                    502: 
                    503: ;; The divide and remainder operations always take their inputs from
                    504: ;; r24 and r25, put their output in r27, and clobber r23 and r28.
                    505: 
                    506: (define_expand "divsi3"
1.1.1.3   root      507:   [(set (reg:SI 24) (match_operand:SI 1 "input_operand" ""))
                    508:    (set (reg:SI 25) (match_operand:SI 2 "input_operand" ""))
                    509:    (parallel [(set (reg:SI 27)
                    510:                   (div:SI (reg:SI 24)
                    511:                           (reg:SI 25)))
1.1       root      512:              (clobber (reg:DI 23))
                    513:              (clobber (reg:DI 28))])
                    514:    (set (match_operand:SI 0 "general_operand" "")
                    515:        (reg:SI 27))]
                    516:   ""
1.1.1.3   root      517:   "")
1.1       root      518: 
                    519: (define_expand "udivsi3"
1.1.1.3   root      520:   [(set (reg:SI 24) (match_operand:SI 1 "input_operand" ""))
                    521:    (set (reg:SI 25) (match_operand:SI 2 "input_operand" ""))
                    522:    (parallel [(set (reg:SI 27)
                    523:                   (udiv:SI (reg:SI 24)
                    524:                            (reg:SI 25)))
1.1       root      525:              (clobber (reg:DI 23))
                    526:              (clobber (reg:DI 28))])
                    527:    (set (match_operand:SI 0 "general_operand" "")
                    528:        (reg:SI 27))]
                    529:   ""
1.1.1.3   root      530:   "")
1.1       root      531: 
                    532: (define_expand "modsi3"
1.1.1.3   root      533:   [(set (reg:SI 24) (match_operand:SI 1 "input_operand" ""))
                    534:    (set (reg:SI 25) (match_operand:SI 2 "input_operand" ""))
                    535:    (parallel [(set (reg:SI 27)
                    536:                   (mod:SI (reg:SI 24)
                    537:                           (reg:SI 25)))
1.1       root      538:              (clobber (reg:DI 23))
                    539:              (clobber (reg:DI 28))])
                    540:    (set (match_operand:SI 0 "general_operand" "")
                    541:        (reg:SI 27))]
                    542:   ""
1.1.1.3   root      543:   "")
1.1       root      544: 
                    545: (define_expand "umodsi3"
1.1.1.3   root      546:   [(set (reg:SI 24) (match_operand:SI 1 "input_operand" ""))
                    547:    (set (reg:SI 25) (match_operand:SI 2 "input_operand" ""))
                    548:    (parallel [(set (reg:SI 27)
                    549:                   (umod:SI (reg:SI 24)
                    550:                            (reg:SI 25)))
1.1       root      551:              (clobber (reg:DI 23))
                    552:              (clobber (reg:DI 28))])
                    553:    (set (match_operand:SI 0 "general_operand" "")
                    554:        (reg:SI 27))]
                    555:   ""
1.1.1.3   root      556:   "")
1.1       root      557: 
                    558: (define_expand "divdi3"
1.1.1.3   root      559:   [(set (reg:DI 24) (match_operand:DI 1 "input_operand" ""))
                    560:    (set (reg:DI 25) (match_operand:DI 2 "input_operand" ""))
                    561:    (parallel [(set (reg:DI 27)
                    562:                   (div:DI (reg:DI 24)
                    563:                           (reg:DI 25)))
1.1       root      564:              (clobber (reg:DI 23))
                    565:              (clobber (reg:DI 28))])
                    566:    (set (match_operand:DI 0 "general_operand" "")
                    567:        (reg:DI 27))]
                    568:   ""
1.1.1.3   root      569:   "")
1.1       root      570: 
                    571: (define_expand "udivdi3"
1.1.1.3   root      572:   [(set (reg:DI 24) (match_operand:DI 1 "input_operand" ""))
                    573:    (set (reg:DI 25) (match_operand:DI 2 "input_operand" ""))
                    574:    (parallel [(set (reg:DI 27)
                    575:                   (udiv:DI (reg:DI 24)
                    576:                            (reg:DI 25)))
1.1       root      577:              (clobber (reg:DI 23))
                    578:              (clobber (reg:DI 28))])
                    579:    (set (match_operand:DI 0 "general_operand" "")
                    580:        (reg:DI 27))]
                    581:   ""
1.1.1.3   root      582:   "")
1.1       root      583: 
                    584: (define_expand "moddi3"
1.1.1.3   root      585:   [(set (reg:DI 24) (match_operand:DI 1 "input_operand" ""))
                    586:    (set (reg:DI 25) (match_operand:DI 2 "input_operand" ""))
                    587:    (parallel [(set (reg:DI 27)
                    588:                   (mod:DI (reg:DI 24)
                    589:                           (reg:DI 25)))
1.1       root      590:              (clobber (reg:DI 23))
                    591:              (clobber (reg:DI 28))])
                    592:    (set (match_operand:DI 0 "general_operand" "")
                    593:        (reg:DI 27))]
                    594:   ""
1.1.1.3   root      595:   "")
1.1       root      596: 
                    597: (define_expand "umoddi3"
1.1.1.3   root      598:   [(set (reg:DI 24) (match_operand:DI 1 "input_operand" ""))
                    599:    (set (reg:DI 25) (match_operand:DI 2 "input_operand" ""))
                    600:    (parallel [(set (reg:DI 27)
                    601:                   (umod:DI (reg:DI 24)
                    602:                            (reg:DI 25)))
1.1       root      603:              (clobber (reg:DI 23))
                    604:              (clobber (reg:DI 28))])
                    605:    (set (match_operand:DI 0 "general_operand" "")
                    606:        (reg:DI 27))]
                    607:   ""
1.1.1.3   root      608:   "")
1.1       root      609: 
                    610: (define_insn ""
                    611:   [(set (reg:SI 27)
                    612:        (match_operator:SI 1 "divmod_operator"
                    613:                        [(reg:SI 24) (reg:SI 25)]))
                    614:    (clobber (reg:DI 23))
                    615:    (clobber (reg:DI 28))]
                    616:   ""
1.1.1.2   root      617:   "%E1 $24,$25,$27"
                    618:   [(set_attr "type" "isubr")])
1.1       root      619: 
                    620: (define_insn ""
                    621:   [(set (reg:DI 27)
                    622:        (match_operator:DI 1 "divmod_operator"
                    623:                        [(reg:DI 24) (reg:DI 25)]))
                    624:    (clobber (reg:DI 23))
                    625:    (clobber (reg:DI 28))]
                    626:   ""
1.1.1.2   root      627:   "%E1 $24,$25,$27"
                    628:   [(set_attr "type" "isubr")])
1.1       root      629: 
                    630: ;; Next are the basic logical operations.  These only exist in DImode.
                    631: 
                    632: (define_insn "anddi3"
                    633:   [(set (match_operand:DI 0 "register_operand" "=r,r,r")
                    634:        (and:DI (match_operand:DI 1 "reg_or_0_operand" "%rJ,rJ,rJ")
                    635:                (match_operand:DI 2 "and_operand" "rI,N,MH")))]
                    636:   ""
                    637:   "@
                    638:    and %r1,%2,%0
                    639:    bic %r1,%N2,%0
                    640:    zapnot %r1,%m2,%0"
                    641:   [(set_attr "type" "iaddlog,iaddlog,shiftcm")])
                    642: 
                    643: ;; There are times when we can split and AND into two AND insns.  This occurs
                    644: ;; when we can first clear any bytes and then clear anything else.  For
                    645: ;; example "I & 0xffff07" is "(I & 0xffffff) & 0xffffffffffffff07".
                    646: ;; Only to this when running on 64-bit host since the computations are
                    647: ;; too messy otherwise.
                    648: 
                    649: (define_split
                    650:   [(set (match_operand:DI 0 "register_operand" "")
                    651:        (and:DI (match_operand:DI 1 "register_operand" "")
                    652:                (match_operand:DI 2 "const_int_operand" "")))]
                    653:   "HOST_BITS_PER_WIDE_INT == 64 && ! and_operand (operands[2], DImode)"
                    654:   [(set (match_dup 0) (and:DI (match_dup 1) (match_dup 3)))
                    655:    (set (match_dup 0) (and:DI (match_dup 0) (match_dup 4)))]
                    656:   "
                    657: {
                    658:   unsigned HOST_WIDE_INT mask1 = INTVAL (operands[2]);
                    659:   unsigned HOST_WIDE_INT mask2 = mask1;
                    660:   int i;
                    661: 
                    662:   /* For each byte that isn't all zeros, make it all ones.  */
                    663:   for (i = 0; i < 64; i += 8)
                    664:     if ((mask1 & ((HOST_WIDE_INT) 0xff << i)) != 0)
                    665:       mask1 |= (HOST_WIDE_INT) 0xff << i;
                    666: 
                    667:   /* Now turn on any bits we've just turned off.  */
                    668:   mask2 |= ~ mask1;
                    669: 
                    670:   operands[3] = GEN_INT (mask1);
                    671:   operands[4] = GEN_INT (mask2);
                    672: }")
                    673: 
                    674: (define_insn "zero_extendqihi2"
                    675:   [(set (match_operand:HI 0 "register_operand" "=r")
                    676:        (zero_extend:HI (match_operand:QI 1 "register_operand" "r")))]
                    677:   ""
                    678:   "zapnot %1,1,%0"
                    679:   [(set_attr "type" "iaddlog")])
                    680: 
                    681: (define_insn "zero_extendqisi2"
                    682:   [(set (match_operand:SI 0 "register_operand" "=r")
                    683:        (zero_extend:SI (match_operand:QI 1 "register_operand" "r")))]
                    684:   ""
                    685:   "zapnot %1,1,%0"
                    686:   [(set_attr "type" "iaddlog")])
                    687: 
                    688: (define_insn "zero_extendqidi2"
                    689:   [(set (match_operand:DI 0 "register_operand" "=r")
                    690:        (zero_extend:DI (match_operand:QI 1 "register_operand" "r")))]
                    691:   ""
                    692:   "zapnot %1,1,%0"
                    693:   [(set_attr "type" "iaddlog")])
                    694: 
                    695: (define_insn "zero_extendhisi2"
                    696:   [(set (match_operand:SI 0 "register_operand" "=r")
                    697:        (zero_extend:SI (match_operand:HI 1 "register_operand" "r")))]
                    698:   ""
                    699:   "zapnot %1,3,%0"
                    700:   [(set_attr "type" "iaddlog")])
                    701: 
                    702: (define_insn "zero_extendhidi2"
                    703:   [(set (match_operand:DI 0 "register_operand" "=r")
                    704:        (zero_extend:DI (match_operand:HI 1 "register_operand" "r")))]
                    705:   ""
                    706:   "zapnot %1,3,%0"
                    707:   [(set_attr "type" "iaddlog")])
                    708: 
                    709: (define_insn "zero_extendsidi2"
                    710:   [(set (match_operand:DI 0 "register_operand" "=r")
                    711:        (zero_extend:DI (match_operand:SI 1 "register_operand" "r")))]
                    712:   ""
                    713:   "zapnot %1,15,%0"
                    714:   [(set_attr "type" "iaddlog")])
                    715: 
                    716: (define_insn  ""
                    717:   [(set (match_operand:DI 0 "register_operand" "=r")
                    718:        (and:DI (not:DI (match_operand:DI 1 "reg_or_8bit_operand" "rI"))
                    719:                (match_operand:DI 2 "reg_or_0_operand" "rJ")))]
                    720:   ""
                    721:   "bic %r2,%1,%0"
                    722:   [(set_attr "type" "iaddlog")])
                    723: 
                    724: (define_insn "iordi3"
1.1.1.3   root      725:   [(set (match_operand:DI 0 "register_operand" "=r,r")
                    726:        (ior:DI (match_operand:DI 1 "reg_or_0_operand" "%rJ,rJ")
                    727:                (match_operand:DI 2 "or_operand" "rI,N")))]
1.1       root      728:   ""
1.1.1.3   root      729:   "@
                    730:    bis %r1,%2,%0
                    731:    ornot %r1,%N2,%0"
1.1       root      732:   [(set_attr "type" "iaddlog")])
                    733: 
                    734: (define_insn "one_cmpldi2"
                    735:   [(set (match_operand:DI 0 "register_operand" "=r")
                    736:        (not:DI (match_operand:DI 1 "reg_or_8bit_operand" "rI")))]
                    737:   ""
                    738:   "ornot $31,%1,%0"
                    739:   [(set_attr "type" "iaddlog")])
                    740: 
                    741: (define_insn ""
                    742:   [(set (match_operand:DI 0 "register_operand" "=r")
                    743:        (ior:DI (not:DI (match_operand:DI 1 "reg_or_8bit_operand" "rI"))
                    744:                (match_operand:DI 2 "reg_or_0_operand" "rJ")))]
                    745:   ""
                    746:   "ornot %r2,%1,%0"
                    747:   [(set_attr "type" "iaddlog")])
                    748: 
                    749: (define_insn "xordi3"
1.1.1.3   root      750:   [(set (match_operand:DI 0 "register_operand" "=r,r")
                    751:        (xor:DI (match_operand:DI 1 "reg_or_0_operand" "%rJ,rJ")
                    752:                (match_operand:DI 2 "or_operand" "rI,N")))]
1.1       root      753:   ""
1.1.1.3   root      754:   "@
                    755:    xor %r1,%2,%0
                    756:    eqv %r1,%N2,%0"
1.1       root      757:   [(set_attr "type" "iaddlog")])
                    758: 
                    759: (define_insn ""
                    760:   [(set (match_operand:DI 0 "register_operand" "=r")
1.1.1.3   root      761:        (not:DI (xor:DI (match_operand:DI 1 "register_operand" "%rJ")
                    762:                        (match_operand:DI 2 "register_operand" "rI"))))]
1.1       root      763:   ""
                    764:   "eqv %r1,%2,%0"
                    765:   [(set_attr "type" "iaddlog")])
                    766: 
                    767: ;; Next come the shifts and the various extract and insert operations.
                    768: 
                    769: (define_insn "ashldi3"
                    770:   [(set (match_operand:DI 0 "register_operand" "=r,r")
                    771:        (ashift:DI (match_operand:DI 1 "reg_or_0_operand" "rJ,rJ")
1.1.1.2   root      772:                   (match_operand:DI 2 "reg_or_6bit_operand" "P,rI")))]
1.1       root      773:   ""
                    774:   "*
                    775: {
                    776:   switch (which_alternative)
                    777:     {
                    778:     case 0:
                    779:       if (operands[2] == const1_rtx)
                    780:        return \"addq %r1,%r1,%0\";
                    781:       else
                    782:        return \"s%P2addq %r1,0,%0\";
                    783:     case 1:
                    784:       return \"sll %r1,%2,%0\";
                    785:     }
                    786: }"
                    787:   [(set_attr "type" "iaddlog,shiftcm")])
                    788: 
1.1.1.4 ! root      789: ;; ??? The following pattern is made by combine, but earlier phases
        !           790: ;; (specifically flow) can't handle it.  This occurs in jump.c.  Deal
        !           791: ;; with this in a better way at some point.
        !           792: ;;(define_insn ""
        !           793: ;;  [(set (match_operand:DI 0 "register_operand" "=r")
        !           794: ;;     (sign_extend:DI
        !           795: ;;      (subreg:SI (ashift:DI (match_operand:DI 1 "reg_or_0_operand" "rJ")
        !           796: ;;                            (match_operand:DI 2 "const_int_operand" "P"))
        !           797: ;;                 0)))]
        !           798: ;;  "INTVAL (operands[2]) >= 1 && INTVAL (operands[2]) <= 3"
        !           799: ;;  "*
        !           800: ;;{
        !           801: ;;  if (operands[2] == const1_rtx)
        !           802: ;;    return \"addl %r1,%r1,%0\";
        !           803: ;;  else
        !           804: ;;    return \"s%P2addl %r1,0,%0\";
        !           805: ;; }"
        !           806: ;;  [(set_attr "type" "iaddlog")])
1.1       root      807:                          
                    808: (define_insn "lshrdi3"
                    809:   [(set (match_operand:DI 0 "register_operand" "=r")
                    810:        (lshiftrt:DI (match_operand:DI 1 "reg_or_0_operand" "rJ")
1.1.1.2   root      811:                     (match_operand:DI 2 "reg_or_6bit_operand" "rI")))]
1.1       root      812:   ""
                    813:   "srl %r1,%2,%0")
                    814: 
                    815: (define_insn "ashrdi3"
                    816:   [(set (match_operand:DI 0 "register_operand" "=r")
                    817:        (ashiftrt:DI (match_operand:DI 1 "reg_or_0_operand" "rJ")
1.1.1.2   root      818:                     (match_operand:DI 2 "reg_or_6bit_operand" "rI")))]
1.1       root      819:   ""
                    820:   "sra %r1,%2,%0")
                    821: 
                    822: (define_expand "extendqihi2"
                    823:   [(set (match_dup 2)
                    824:        (ashift:DI (match_operand:QI 1 "register_operand" "")
                    825:                   (const_int 56)))
                    826:    (set (match_operand:HI 0 "register_operand" "")
                    827:        (ashiftrt:DI (match_dup 2)
                    828:                     (const_int 56)))]
                    829:   ""
                    830:   "
                    831: { operands[0] = gen_lowpart (DImode, operands[0]);
                    832:   operands[1] = gen_lowpart (DImode, operands[1]);
                    833:   operands[2] = gen_reg_rtx (DImode);
                    834: }")
                    835: 
                    836: (define_expand "extendqisi2"
                    837:   [(set (match_dup 2)
                    838:        (ashift:DI (match_operand:QI 1 "register_operand" "")
                    839:                   (const_int 56)))
                    840:    (set (match_operand:SI 0 "register_operand" "")
                    841:        (ashiftrt:DI (match_dup 2)
                    842:                     (const_int 56)))]
                    843:   ""
                    844:   "
                    845: { operands[0] = gen_lowpart (DImode, operands[0]);
                    846:   operands[1] = gen_lowpart (DImode, operands[1]);
                    847:   operands[2] = gen_reg_rtx (DImode);
                    848: }")
                    849: 
                    850: (define_expand "extendqidi2"
                    851:   [(set (match_dup 2)
                    852:        (ashift:DI (match_operand:QI 1 "register_operand" "")
                    853:                   (const_int 56)))
                    854:    (set (match_operand:DI 0 "register_operand" "")
                    855:        (ashiftrt:DI (match_dup 2)
                    856:                     (const_int 56)))]
                    857:   ""
                    858:   "
                    859: { operands[1] = gen_lowpart (DImode, operands[1]);
                    860:   operands[2] = gen_reg_rtx (DImode);
                    861: }")
                    862: 
                    863: (define_expand "extendhisi2"
                    864:   [(set (match_dup 2)
                    865:        (ashift:DI (match_operand:HI 1 "register_operand" "")
                    866:                   (const_int 48)))
                    867:    (set (match_operand:SI 0 "register_operand" "")
                    868:        (ashiftrt:DI (match_dup 2)
                    869:                     (const_int 48)))]
                    870:   ""
                    871:   "
                    872: { operands[0] = gen_lowpart (DImode, operands[0]);
                    873:   operands[1] = gen_lowpart (DImode, operands[1]);
                    874:   operands[2] = gen_reg_rtx (DImode);
                    875: }")
                    876: 
                    877: (define_expand "extendhidi2"
                    878:   [(set (match_dup 2)
                    879:        (ashift:DI (match_operand:HI 1 "register_operand" "")
                    880:                   (const_int 48)))
                    881:    (set (match_operand:DI 0 "register_operand" "")
                    882:        (ashiftrt:DI (match_dup 2)
                    883:                     (const_int 48)))]
                    884:   ""
                    885:   "
                    886: { operands[1] = gen_lowpart (DImode, operands[1]);
                    887:   operands[2] = gen_reg_rtx (DImode);
                    888: }")
                    889: 
                    890: (define_insn ""
                    891:   [(set (match_operand:DI 0 "register_operand" "=r")
                    892:        (zero_extract:DI (match_operand:DI 1 "reg_or_0_operand" "rJ")
                    893:                         (match_operand:DI 2 "mode_width_operand" "n")
                    894:                         (match_operand:DI 3 "mul8_operand" "I")))]
                    895:   ""
                    896:   "ext%M2l %r1,%s3,%0")
                    897: 
                    898: (define_insn ""
                    899:   [(set (match_operand:DI 0 "register_operand" "=r")
                    900:        (zero_extract:DI (match_operand:DI 1 "reg_or_0_operand" "rJ")
                    901:                         (match_operand:DI 2 "mode_width_operand" "n")
                    902:                         (ashift:DI (match_operand:DI 3 "reg_or_8bit_operand" "rI")
                    903:                                    (const_int 3))))]
                    904:   ""
                    905:   "ext%M2l %r1,%3,%0")
                    906: 
                    907: (define_insn ""
                    908:   [(set (match_operand:DI 0 "register_operand" "=r")
                    909:        (ashift:DI
                    910:         (zero_extract:DI (match_operand:DI 1 "reg_or_0_operand" "rJ")
                    911:                          (const_int 8)
                    912:                          (ashift:DI
                    913:                           (plus:DI
                    914:                            (match_operand:DI 2 "reg_or_8bit_operand" "rI")
                    915:                            (const_int -1))
                    916:                           (const_int 3)))
                    917:         (const_int 56)))]
                    918:   ""
                    919:   "extqh %r1,%2,%0")
                    920: 
                    921: (define_insn ""
                    922:   [(set (match_operand:DI 0 "register_operand" "=r")
                    923:        (ashift:DI
                    924:         (zero_extract:DI (match_operand:DI 1 "reg_or_0_operand" "rJ")
                    925:                          (const_int 16)
                    926:                          (ashift:DI
                    927:                           (plus:DI
                    928:                            (match_operand:DI 2 "reg_or_8bit_operand" "rI")
                    929:                            (const_int -2))
                    930:                           (const_int 3)))
                    931:         (const_int 48)))]
                    932:   ""
                    933:   "extwh %r1,%2,%0")
                    934: 
                    935: (define_insn ""
                    936:   [(set (match_operand:DI 0 "register_operand" "=r")
                    937:        (ashift:DI
                    938:         (zero_extract:DI (match_operand:DI 1 "reg_or_0_operand" "rJ")
                    939:                          (const_int 32)
                    940:                          (ashift:DI
                    941:                           (plus:DI
                    942:                            (match_operand:DI 2 "reg_or_8bit_operand" "rI")
                    943:                            (const_int -4))
                    944:                           (const_int 3)))
                    945:         (const_int 32)))]
                    946:   ""
                    947:   "extlh %r1,%2,%0")
                    948: 
                    949: ;; This converts an extXl into an extXh with an appropriate adjustment
                    950: ;; to the address calculation.
                    951: 
                    952: (define_split
                    953:   [(set (match_operand:DI 0 "register_operand" "")
                    954:        (ashift:DI (zero_extract:DI (match_operand:DI 1 "register_operand" "")
                    955:                                    (match_operand:DI 2 "mode_width_operand" "")
                    956:                                    (ashift:DI (match_operand:DI 3 "" "")
                    957:                                               (const_int 3)))
                    958:                   (match_operand:DI 4 "const_int_operand" "")))
                    959:    (clobber (match_operand:DI 5 "register_operand" ""))]
                    960:   "INTVAL (operands[4]) == 64 - INTVAL (operands[2])"
                    961:   [(set (match_dup 5) (match_dup 6))
                    962:    (set (match_dup 0)
                    963:        (ashift:DI (zero_extract:DI (match_dup 1) (match_dup 2)
                    964:                                    (ashift:DI (plus:DI (match_dup 5)
                    965:                                                        (match_dup 7))
                    966:                                               (const_int 3)))
                    967:                   (match_dup 4)))]
                    968:   "
                    969: {
                    970:   operands[6] = plus_constant (operands[3], 
                    971:                               INTVAL (operands[2]) / BITS_PER_UNIT);
                    972:   operands[7] = GEN_INT (- INTVAL (operands[2]) / BITS_PER_UNIT);
                    973: }")
                    974:   
                    975: (define_insn ""
                    976:   [(set (match_operand:DI 0 "register_operand" "=r")
                    977:        (ashift:DI (zero_extend:DI (match_operand:QI 1 "register_operand" "r"))
                    978:                   (match_operand:DI 2 "mul8_operand" "I")))]
                    979:   ""
                    980:   "insbl %1,%s2,%0")
                    981: 
                    982: (define_insn ""
                    983:   [(set (match_operand:DI 0 "register_operand" "=r")
                    984:        (ashift:DI (zero_extend:DI (match_operand:HI 1 "register_operand" "r"))
                    985:                   (match_operand:DI 2 "mul8_operand" "I")))]
                    986:   ""
                    987:   "inswl %1,%s2,%0")
                    988: 
                    989: (define_insn ""
                    990:   [(set (match_operand:DI 0 "register_operand" "=r")
                    991:        (ashift:DI (zero_extend:DI (match_operand:SI 1 "register_operand" "r"))
                    992:                   (match_operand:DI 2 "mul8_operand" "I")))]
                    993:   ""
                    994:   "insll %1,%s2,%0")
                    995: 
                    996: (define_insn ""
                    997:   [(set (match_operand:DI 0 "register_operand" "=r")
                    998:        (ashift:DI (zero_extend:DI (match_operand:QI 1 "register_operand" "r"))
                    999:                   (ashift:DI (match_operand:DI 2 "reg_or_8bit_operand" "rI")
                   1000:                              (const_int 3))))]
                   1001:   ""
                   1002:   "insbl %1,%2,%0")
                   1003: 
                   1004: (define_insn ""
                   1005:   [(set (match_operand:DI 0 "register_operand" "=r")
                   1006:        (ashift:DI (zero_extend:DI (match_operand:HI 1 "register_operand" "r"))
                   1007:                   (ashift:DI (match_operand:DI 2 "reg_or_8bit_operand" "rI")
                   1008:                              (const_int 3))))]
                   1009:   ""
                   1010:   "inswl %1,%2,%0")
                   1011: 
                   1012: (define_insn ""
                   1013:   [(set (match_operand:DI 0 "register_operand" "=r")
                   1014:        (ashift:DI (zero_extend:DI (match_operand:SI 1 "register_operand" "r"))
                   1015:                   (ashift:DI (match_operand:DI 2 "reg_or_8bit_operand" "rI")
                   1016:                              (const_int 3))))]
                   1017:   ""
                   1018:   "insll %1,%2,%0")
                   1019: 
                   1020: ;; We do not include the insXh insns because they are complex to express
                   1021: ;; and it does not appear that we would ever want to generate them.
                   1022: 
                   1023: (define_insn ""
                   1024:   [(set (match_operand:DI 0 "register_operand" "=r")
1.1.1.3   root     1025:        (and:DI (not:DI (ashift:DI
                   1026:                         (match_operand:DI 2 "mode_mask_operand" "n")
                   1027:                         (ashift:DI
                   1028:                          (match_operand:DI 3 "reg_or_8bit_operand" "rI")
                   1029:                          (const_int 3))))
1.1       root     1030:                (match_operand:DI 1 "reg_or_0_operand" "rJ")))]
                   1031:   ""
                   1032:   "msk%U2l %r1,%3,%0")
                   1033: 
                   1034: ;; We do not include the mskXh insns because it does not appear we would ever
                   1035: ;; generate one.
                   1036: 
                   1037: ;; Floating-point operations.  All the double-precision insns can extend
                   1038: ;; from single, so indicate that.  The exception are the ones that simply
                   1039: ;; play with the sign bits; it's not clear what to do there.
                   1040: 
                   1041: (define_insn "abssf2"
                   1042:   [(set (match_operand:SF 0 "register_operand" "=f")
                   1043:        (abs:SF (match_operand:SF 1 "reg_or_fp0_operand" "fG")))]
                   1044:   "TARGET_FP"
                   1045:   "cpys $f31,%R1,%0"
                   1046:   [(set_attr "type" "fpop")])
                   1047: 
                   1048: (define_insn "absdf2"
                   1049:   [(set (match_operand:DF 0 "register_operand" "=f")
                   1050:        (abs:DF (match_operand:DF 1 "reg_or_fp0_operand" "fG")))]
                   1051:   "TARGET_FP"
                   1052:   "cpys $f31,%R1,%0"
                   1053:   [(set_attr "type" "fpop")])
                   1054: 
                   1055: (define_insn "negsf2"
                   1056:   [(set (match_operand:SF 0 "register_operand" "=f")
                   1057:        (neg:SF (match_operand:SF 1 "reg_or_fp0_operand" "fG")))]
                   1058:   "TARGET_FP"
1.1.1.3   root     1059:   "cpysn %R1,%R1,%0"
1.1       root     1060:   [(set_attr "type" "fpop")])
                   1061: 
                   1062: (define_insn "negdf2"
                   1063:   [(set (match_operand:DF 0 "register_operand" "=f")
                   1064:        (neg:DF (match_operand:DF 1 "reg_or_fp0_operand" "fG")))]
                   1065:   "TARGET_FP"
1.1.1.3   root     1066:   "cpysn %R1,%R1,%0"
1.1       root     1067:   [(set_attr "type" "fpop")])
                   1068: 
                   1069: (define_insn "addsf3"
                   1070:   [(set (match_operand:SF 0 "register_operand" "=f")
                   1071:        (plus:SF (match_operand:SF 1 "reg_or_fp0_operand" "%fG")
                   1072:                 (match_operand:SF 2 "reg_or_fp0_operand" "fG")))]
                   1073:   "TARGET_FP"
                   1074:   "adds %R1,%R2,%0"
                   1075:   [(set_attr "type" "fpop")])
                   1076: 
                   1077: (define_insn "adddf3"
                   1078:   [(set (match_operand:DF 0 "register_operand" "=f")
                   1079:        (plus:DF (match_operand:DF 1 "reg_or_fp0_operand" "%fG")
                   1080:                 (match_operand:DF 2 "reg_or_fp0_operand" "fG")))]
                   1081:   "TARGET_FP"
                   1082:   "addt %R1,%R2,%0"
                   1083:   [(set_attr "type" "fpop")])
                   1084: 
                   1085: (define_insn ""
                   1086:   [(set (match_operand:DF 0 "register_operand" "=f")
                   1087:        (plus:DF (float_extend:DF
1.1.1.2   root     1088:                  (match_operand:SF 1 "reg_or_fp0_operand" "fG"))
1.1       root     1089:                 (match_operand:DF 2 "reg_or_fp0_operand" "fG")))]
                   1090:   "TARGET_FP"
                   1091:   "addt %R1,%R2,%0"
                   1092:   [(set_attr "type" "fpop")])
                   1093: 
                   1094: (define_insn ""
                   1095:   [(set (match_operand:DF 0 "register_operand" "=f")
                   1096:        (plus:DF (float_extend:DF
                   1097:                  (match_operand:SF 1 "reg_or_fp0_operand" "%fG"))
                   1098:                 (float_extend:DF
                   1099:                  (match_operand:SF 2 "reg_or_fp0_operand" "fG"))))]
                   1100:   "TARGET_FP"
                   1101:   "addt %R1,%R2,%0"
                   1102:   [(set_attr "type" "fpop")])
                   1103: 
                   1104: (define_insn "fix_truncdfdi2"
                   1105:   [(set (match_operand:DI 0 "register_operand" "=f")
                   1106:        (fix:DI (match_operand:DF 1 "reg_or_fp0_operand" "fG")))]
                   1107:   "TARGET_FP"
                   1108:   "cvttqc %R1,%0"
                   1109:   [(set_attr "type" "fpop")])
                   1110: 
                   1111: (define_insn "fix_truncsfdi2"
                   1112:   [(set (match_operand:DI 0 "register_operand" "=f")
                   1113:        (fix:DI (float_extend:DF
                   1114:                 (match_operand:SF 1 "reg_or_fp0_operand" "fG"))))]
                   1115:   "TARGET_FP"
                   1116:   "cvttqc %R1,%0"
                   1117:   [(set_attr "type" "fpop")])
                   1118: 
                   1119: (define_insn "floatdisf2"
                   1120:   [(set (match_operand:SF 0 "register_operand" "=f")
                   1121:        (float:SF (match_operand:DI 1 "register_operand" "f")))]
                   1122:   "TARGET_FP"
                   1123:   "cvtqs %1,%0"
                   1124:   [(set_attr "type" "fpop")])
                   1125: 
                   1126: (define_insn "floatdidf2"
                   1127:   [(set (match_operand:DF 0 "register_operand" "=f")
                   1128:        (float:DF (match_operand:DI 1 "register_operand" "f")))]
                   1129:   "TARGET_FP"
                   1130:   "cvtqt %1,%0"
                   1131:   [(set_attr "type" "fpop")])
                   1132: 
                   1133: (define_insn "extendsfdf2"
                   1134:   [(set (match_operand:DF 0 "register_operand" "=f,f")
                   1135:        (float_extend:DF (match_operand:SF 1 "nonimmediate_operand" "f,m")))]
                   1136:   "TARGET_FP"
                   1137:   "@
                   1138:    addt $f31,%1,%0
                   1139:    lds %0,%1"
                   1140:   [(set_attr "type" "fpop,ld")])
                   1141: 
                   1142: (define_insn "truncdfsf2"
                   1143:   [(set (match_operand:SF 0 "register_operand" "=f")
                   1144:        (float_truncate:SF (match_operand:DF 1 "reg_or_fp0_operand" "fG")))]
                   1145:   "TARGET_FP"
                   1146:   "cvtts %R1,%0"
                   1147:   [(set_attr "type" "fpop")])
                   1148: 
                   1149: (define_insn "divsf3"
                   1150:   [(set (match_operand:SF 0 "register_operand" "=f")
                   1151:        (div:SF (match_operand:SF 1 "reg_or_fp0_operand" "fG")
                   1152:                (match_operand:SF 2 "reg_or_fp0_operand" "fG")))]
                   1153:   "TARGET_FP"
                   1154:   "divs %R1,%R2,%0"
                   1155:   [(set_attr "type" "fdivs")])
                   1156: 
                   1157: (define_insn "divdf3"
                   1158:   [(set (match_operand:DF 0 "register_operand" "=f")
                   1159:        (div:DF (match_operand:DF 1 "reg_or_fp0_operand" "fG")
                   1160:                (match_operand:DF 2 "reg_or_fp0_operand" "fG")))]
                   1161:   "TARGET_FP"
                   1162:   "divt %R1,%R2,%0"
                   1163:   [(set_attr "type" "fdivt")])
                   1164: 
                   1165: (define_insn ""
                   1166:   [(set (match_operand:DF 0 "register_operand" "=f")
                   1167:        (div:DF (float_extend:DF (match_operand:SF 1 "reg_or_fp0_operand" "fG"))
                   1168:                (match_operand:DF 2 "reg_or_fp0_operand" "fG")))]
                   1169:   "TARGET_FP"
                   1170:   "divt %R1,%R2,%0"
                   1171:   [(set_attr "type" "fdivt")])
                   1172: 
                   1173: (define_insn ""
                   1174:   [(set (match_operand:DF 0 "register_operand" "=f")
                   1175:        (div:DF (match_operand:DF 1 "reg_or_fp0_operand" "fG")
                   1176:                (float_extend:DF
                   1177:                 (match_operand:SF 2 "reg_or_fp0_operand" "fG"))))]
                   1178:   "TARGET_FP"
                   1179:   "divt %R1,%R2,%0"
                   1180:   [(set_attr "type" "fdivt")])
                   1181: 
                   1182: (define_insn ""
                   1183:   [(set (match_operand:DF 0 "register_operand" "=f")
                   1184:        (div:DF (float_extend:DF (match_operand:SF 1 "reg_or_fp0_operand" "fG"))
                   1185:                (float_extend:DF (match_operand:SF 2 "reg_or_fp0_operand" "fG"))))]
                   1186:   "TARGET_FP"
                   1187:   "divt %R1,%R2,%0"
                   1188:   [(set_attr "type" "fdivt")])
                   1189: 
                   1190: (define_insn "mulsf3"
                   1191:   [(set (match_operand:SF 0 "register_operand" "=f")
1.1.1.2   root     1192:        (mult:SF (match_operand:SF 1 "reg_or_fp0_operand" "%fG")
1.1       root     1193:                 (match_operand:SF 2 "reg_or_fp0_operand" "fG")))]
                   1194:   "TARGET_FP"
                   1195:   "muls %R1,%R2,%0"
                   1196:   [(set_attr "type" "fpop")])
                   1197: 
                   1198: (define_insn "muldf3"
                   1199:   [(set (match_operand:DF 0 "register_operand" "=f")
1.1.1.2   root     1200:        (mult:DF (match_operand:DF 1 "reg_or_fp0_operand" "%fG")
1.1       root     1201:                 (match_operand:DF 2 "reg_or_fp0_operand" "fG")))]
                   1202:   "TARGET_FP"
                   1203:   "mult %R1,%R2,%0"
                   1204:   [(set_attr "type" "fpop")])
                   1205: 
                   1206: (define_insn ""
                   1207:   [(set (match_operand:DF 0 "register_operand" "=f")
                   1208:        (mult:DF (float_extend:DF
                   1209:                  (match_operand:SF 1 "reg_or_fp0_operand" "fG"))
                   1210:                 (match_operand:DF 2 "reg_or_fp0_operand" "fG")))]
                   1211:   "TARGET_FP"
                   1212:   "mult %R1,%R2,%0"
                   1213:   [(set_attr "type" "fpop")])
                   1214: 
                   1215: (define_insn ""
                   1216:   [(set (match_operand:DF 0 "register_operand" "=f")
                   1217:        (mult:DF (float_extend:DF
1.1.1.2   root     1218:                  (match_operand:SF 1 "reg_or_fp0_operand" "%fG"))
1.1       root     1219:                 (float_extend:DF
                   1220:                  (match_operand:SF 2 "reg_or_fp0_operand" "fG"))))]
                   1221:   "TARGET_FP"
                   1222:   "mult %R1,%R2,%0"
                   1223:   [(set_attr "type" "fpop")])
                   1224: 
                   1225: (define_insn "subsf3"
                   1226:   [(set (match_operand:SF 0 "register_operand" "=f")
1.1.1.2   root     1227:        (minus:SF (match_operand:SF 1 "reg_or_fp0_operand" "fG")
1.1       root     1228:                  (match_operand:SF 2 "reg_or_fp0_operand" "fG")))]
                   1229:   "TARGET_FP"
                   1230:   "subs %R1,%R2,%0"
                   1231:   [(set_attr "type" "fpop")])
                   1232: 
                   1233: (define_insn "subdf3"
                   1234:   [(set (match_operand:DF 0 "register_operand" "=f")
1.1.1.2   root     1235:        (minus:DF (match_operand:DF 1 "reg_or_fp0_operand" "fG")
1.1       root     1236:                  (match_operand:DF 2 "reg_or_fp0_operand" "fG")))]
                   1237:   "TARGET_FP"
                   1238:   "subt %R1,%R2,%0"
                   1239:   [(set_attr "type" "fpop")])
                   1240: 
                   1241: (define_insn ""
                   1242:   [(set (match_operand:DF 0 "register_operand" "=f")
                   1243:        (minus:DF (float_extend:DF
1.1.1.2   root     1244:                   (match_operand:SF 1 "reg_or_fp0_operand" "fG"))
1.1       root     1245:                  (match_operand:DF 2 "reg_or_fp0_operand" "fG")))]
                   1246:   "TARGET_FP"
                   1247:   "subt %R1,%R2,%0"
                   1248:   [(set_attr "type" "fpop")])
                   1249: 
                   1250: (define_insn ""
                   1251:   [(set (match_operand:DF 0 "register_operand" "=f")
1.1.1.2   root     1252:        (minus:DF (match_operand:DF 1 "reg_or_fp0_operand" "fG")
1.1       root     1253:                  (float_extend:DF
                   1254:                   (match_operand:SF 2 "reg_or_fp0_operand" "fG"))))]
                   1255:   "TARGET_FP"
                   1256:   "subt %R1,%R2,%0"
                   1257:   [(set_attr "type" "fpop")])
                   1258: 
                   1259: (define_insn ""
                   1260:   [(set (match_operand:DF 0 "register_operand" "=f")
                   1261:        (minus:DF (float_extend:DF
1.1.1.2   root     1262:                   (match_operand:SF 1 "reg_or_fp0_operand" "fG"))
1.1       root     1263:                  (float_extend:DF
                   1264:                   (match_operand:SF 2 "reg_or_fp0_operand" "fG"))))]
                   1265:   "TARGET_FP"
                   1266:   "subt %R1,%R2,%0"
                   1267:   [(set_attr "type" "fpop")])
                   1268: 
                   1269: ;; Next are all the integer comparisons, and conditional moves and branches
                   1270: ;; and some of the related define_expand's and define_split's.
                   1271: 
                   1272: (define_insn ""
                   1273:   [(set (match_operand:DI 0 "register_operand" "=r")
                   1274:        (match_operator:DI 1 "alpha_comparison_operator"
                   1275:                           [(match_operand:DI 2 "reg_or_0_operand" "rJ")
                   1276:                            (match_operand:DI 3 "reg_or_8bit_operand" "rI")]))]
                   1277:   ""
                   1278:   "cmp%C1 %r2,%3,%0"
                   1279:   [(set_attr "type" "icmp")])
                   1280: 
                   1281: ;; There are three important special-case that don't fit the above pattern
                   1282: ;; but which we want to handle here.
                   1283: 
                   1284: (define_insn ""
                   1285:   [(set (match_operand:DI 0 "register_operand" "=r")
                   1286:        (ne:DI (match_operand:DI 1 "register_operand" "r")
                   1287:               (const_int 0)))]
                   1288:   ""
                   1289:   "cmpult $31,%1,%0"
                   1290:   [(set_attr "type" "icmp")])
                   1291: 
                   1292: (define_insn ""
                   1293:   [(set (match_operand:DI 0 "register_operand" "=r")
                   1294:        (gt:DI (match_operand:DI 1 "register_operand" "r")
                   1295:               (const_int 0)))]
                   1296:   ""
                   1297:   "cmplt $31,%1,%0"
                   1298:   [(set_attr "type" "icmp")])
                   1299: 
                   1300: (define_insn ""
                   1301:   [(set (match_operand:DI 0 "register_operand" "=r")
                   1302:        (ge:DI (match_operand:DI 1 "register_operand" "r")
                   1303:               (const_int 0)))]
                   1304:   ""
                   1305:   "cmple $31,%1,%0"
                   1306:   [(set_attr "type" "icmp")])
                   1307: 
1.1.1.4 ! root     1308: ;; This pattern exists so conditional moves of SImode values are handled.
        !          1309: ;; Comparisons are still done in DImode though.
        !          1310: 
1.1       root     1311: (define_insn ""
1.1.1.4 ! root     1312:   [(set (match_operand:SI 0 "register_operand" "=r,r,r,r")
1.1       root     1313:        (if_then_else:DI
                   1314:         (match_operator 2 "signed_comparison_operator"
1.1.1.4 ! root     1315:                         [(match_operand:DI 3 "reg_or_0_operand" "rJ,rJ,J,J")
        !          1316:                          (match_operand:DI 4 "reg_or_0_operand" "J,J,rJ,rJ")])
        !          1317:         (match_operand:SI 1 "reg_or_8bit_operand" "rI,0,rI,0")
        !          1318:         (match_operand:SI 5 "reg_or_8bit_operand" "0,rI,0,rI")))]
        !          1319:   "operands[3] == const0_rtx || operands[4] == const0_rtx"
1.1       root     1320:   "@
                   1321:    cmov%C2 %r3,%1,%0
1.1.1.4 ! root     1322:    cmov%D2 %r3,%5,%0
        !          1323:    cmov%c2 %r4,%1,%0
        !          1324:    cmov%d2 %r4,%5,%0")
        !          1325: 
        !          1326: (define_insn ""
        !          1327:   [(set (match_operand:DI 0 "register_operand" "=r,r,r,r")
        !          1328:        (if_then_else:DI
        !          1329:         (match_operator 2 "signed_comparison_operator"
        !          1330:                         [(match_operand:DI 3 "reg_or_0_operand" "rJ,rJ,J,J")
        !          1331:                          (match_operand:DI 4 "reg_or_0_operand" "J,J,rJ,rJ")])
        !          1332:         (match_operand:DI 1 "reg_or_8bit_operand" "rI,0,rI,0")
        !          1333:         (match_operand:DI 5 "reg_or_8bit_operand" "0,rI,0,rI")))]
        !          1334:   "operands[3] == const0_rtx || operands[4] == const0_rtx"
        !          1335:   "@
        !          1336:    cmov%C2 %r3,%1,%0
        !          1337:    cmov%D2 %r3,%5,%0
        !          1338:    cmov%c2 %r4,%1,%0
        !          1339:    cmov%d2 %r4,%5,%0")
1.1       root     1340: 
                   1341: (define_insn ""
                   1342:   [(set (match_operand:DI 0 "register_operand" "=r,r")
                   1343:        (if_then_else:DI
                   1344:         (eq (zero_extract:DI (match_operand:DI 2 "reg_or_0_operand" "rJ,rJ")
                   1345:                              (const_int 1)
                   1346:                              (const_int 0))
                   1347:             (const_int 0))
                   1348:         (match_operand:DI 1 "reg_or_8bit_operand" "rI,0")
                   1349:         (match_operand:DI 3 "reg_or_8bit_operand" "0,rI")))]
                   1350:   ""
                   1351:   "@
                   1352:    cmovlbc %r2,%1,%0
                   1353:    cmovlbs %r2,%3,%0")
                   1354: 
                   1355: (define_insn ""
                   1356:   [(set (match_operand:DI 0 "register_operand" "=r,r")
                   1357:        (if_then_else:DI
                   1358:         (ne (zero_extract:DI (match_operand:DI 2 "reg_or_0_operand" "rJ,rJ")
                   1359:                              (const_int 1)
                   1360:                              (const_int 0))
                   1361:             (const_int 0))
                   1362:         (match_operand:DI 1 "reg_or_8bit_operand" "rI,0")
                   1363:         (match_operand:DI 3 "reg_or_8bit_operand" "0,rI")))]
                   1364:   ""
                   1365:   "@
                   1366:    cmovlbs %r2,%1,%0
                   1367:    cmovlbc %r2,%3,%0")
                   1368: 
                   1369: ;; This form is added since combine thinks that an IF_THEN_ELSE with both
                   1370: ;; arms constant is a single insn, so it won't try to form it if combine
                   1371: ;; knows they are really two insns.  This occurs in divides by powers
                   1372: ;; of two.
                   1373: 
                   1374: (define_insn ""
                   1375:   [(set (match_operand:DI 0 "register_operand" "=r")
                   1376:        (if_then_else:DI
                   1377:         (match_operator 2 "signed_comparison_operator"
                   1378:                         [(match_operand:DI 3 "reg_or_0_operand" "rJ")
                   1379:                          (const_int 0)])
                   1380:         (plus:DI (match_dup 0)
                   1381:                  (match_operand:DI 1 "reg_or_8bit_operand" "rI"))
                   1382:         (match_dup 0)))
                   1383:    (clobber (match_scratch:DI 4 "=&r"))]
                   1384:   ""
                   1385:   "addq %0,%1,%4\;cmov%C2 %r3,%4,%0")
                   1386: 
                   1387: (define_split
                   1388:   [(set (match_operand:DI 0 "register_operand" "")
                   1389:        (if_then_else:DI
                   1390:         (match_operator 2 "signed_comparison_operator"
                   1391:                         [(match_operand:DI 3 "reg_or_0_operand" "")
                   1392:                          (const_int 0)])
                   1393:         (plus:DI (match_dup 0)
                   1394:                  (match_operand:DI 1 "reg_or_8bit_operand" ""))
                   1395:         (match_dup 0)))
                   1396:    (clobber (match_operand:DI 4 "register_operand" ""))]
                   1397:   ""
                   1398:   [(set (match_dup 4) (plus:DI (match_dup 0) (match_dup 1)))
                   1399:    (set (match_dup 0) (if_then_else:DI (match_op_dup 2
                   1400:                                                     [(match_dup 3)
                   1401:                                                      (const_int 0)])
                   1402:                                       (match_dup 4) (match_dup 0)))]
                   1403:   "")
                   1404: 
                   1405: (define_split
                   1406:   [(parallel
                   1407:     [(set (match_operand:DI 0 "register_operand" "")
                   1408:          (if_then_else:DI
                   1409:           (match_operator 1 "comparison_operator"
                   1410:                           [(zero_extract:DI (match_operand:DI 2 "register_operand" "")
                   1411:                                             (const_int 1)
                   1412:                                             (match_operand:DI 3 "const_int_operand" ""))
                   1413:                            (const_int 0)])
                   1414:           (match_operand:DI 4 "reg_or_8bit_operand" "")
                   1415:           (match_operand:DI 5 "reg_or_8bit_operand" "")))
                   1416:      (clobber (match_operand:DI 6 "register_operand" ""))])]
                   1417:   "INTVAL (operands[3]) != 0"
                   1418:   [(set (match_dup 6)
                   1419:        (lshiftrt:DI (match_dup 2) (match_dup 3)))
                   1420:    (set (match_dup 0)
                   1421:        (if_then_else:DI (match_op_dup 1
                   1422:                                       [(zero_extract:DI (match_dup 6)
                   1423:                                                         (const_int 1)
                   1424:                                                         (const_int 0))
                   1425:                                        (const_int 0)])
                   1426:                         (match_dup 4)
                   1427:                         (match_dup 5)))]
                   1428:   "")
                   1429: 
                   1430: ;; For ABS, we have two choices, depending on whether the input and output
                   1431: ;; registers are the same or not.
                   1432: (define_expand "absdi2"
                   1433:   [(set (match_operand:DI 0 "register_operand" "")
                   1434:        (abs:DI (match_operand:DI 1 "register_operand" "")))]
                   1435:   ""
                   1436:   "
                   1437: { if (rtx_equal_p (operands[0], operands[1]))
                   1438:     emit_insn (gen_absdi2_same (operands[0], gen_reg_rtx (DImode)));
                   1439:   else
                   1440:     emit_insn (gen_absdi2_diff (operands[0], operands[1]));
                   1441: 
                   1442:   DONE;
                   1443: }")
                   1444: 
                   1445: (define_expand "absdi2_same"
                   1446:   [(set (match_operand:DI 1 "register_operand" "")
                   1447:        (neg:DI (match_operand:DI 0 "register_operand" "")))
                   1448:    (set (match_dup 0)
                   1449:        (if_then_else:DI (ge (match_dup 0) (const_int 0))
                   1450:                         (match_dup 0)
                   1451:                         (match_dup 1)))]
                   1452:   ""
                   1453:   "")
                   1454: 
                   1455: (define_expand "absdi2_diff"
                   1456:   [(set (match_operand:DI 0 "register_operand" "")
                   1457:        (neg:DI (match_operand:DI 1 "register_operand" "")))
                   1458:    (set (match_dup 0)
                   1459:        (if_then_else:DI (lt (match_dup 1) (const_int 0))
                   1460:                         (match_dup 0)
                   1461:                         (match_dup 1)))]
                   1462:   ""
                   1463:   "")
                   1464: 
                   1465: (define_split
                   1466:   [(set (match_operand:DI 0 "register_operand" "")
                   1467:        (abs:DI (match_dup 0)))
                   1468:    (clobber (match_operand:DI 2 "register_operand" ""))]
                   1469:   ""
                   1470:   [(set (match_dup 1) (neg:DI (match_dup 0)))
                   1471:    (set (match_dup 0) (if_then_else:DI (ge (match_dup 0) (const_int 0))
                   1472:                                       (match_dup 0) (match_dup 1)))]
                   1473:   "")
                   1474: 
                   1475: (define_split
                   1476:   [(set (match_operand:DI 0 "register_operand" "")
                   1477:        (abs:DI (match_operand:DI 1 "register_operand" "")))]
                   1478:   "! rtx_equal_p (operands[0], operands[1])"
                   1479:   [(set (match_dup 0) (neg:DI (match_dup 1)))
                   1480:    (set (match_dup 0) (if_then_else:DI (lt (match_dup 1) (const_int 0))
                   1481:                                       (match_dup 0) (match_dup 1)))]
                   1482:   "")
                   1483: 
                   1484: (define_split
                   1485:   [(set (match_operand:DI 0 "register_operand" "")
                   1486:        (neg:DI (abs:DI (match_dup 0))))
                   1487:    (clobber (match_operand:DI 2 "register_operand" ""))]
                   1488:   ""
                   1489:   [(set (match_dup 1) (neg:DI (match_dup 0)))
                   1490:    (set (match_dup 0) (if_then_else:DI (le (match_dup 0) (const_int 0))
                   1491:                                       (match_dup 0) (match_dup 1)))]
                   1492:   "")
                   1493: 
                   1494: (define_split
                   1495:   [(set (match_operand:DI 0 "register_operand" "")
                   1496:        (neg:DI (abs:DI (match_operand:DI 1 "register_operand" ""))))]
                   1497:   "! rtx_equal_p (operands[0], operands[1])"
                   1498:   [(set (match_dup 0) (neg:DI (match_dup 1)))
                   1499:    (set (match_dup 0) (if_then_else:DI (gt (match_dup 1) (const_int 0))
                   1500:                                       (match_dup 0) (match_dup 1)))]
                   1501:   "")
                   1502: 
1.1.1.2   root     1503: (define_expand "smaxdi3"
1.1       root     1504:   [(set (match_dup 3)
                   1505:        (le:DI (match_operand:DI 1 "reg_or_0_operand" "")
                   1506:               (match_operand:DI 2 "reg_or_8bit_operand" "")))
                   1507:    (set (match_operand:DI 0 "register_operand" "")
                   1508:        (if_then_else:DI (eq (match_dup 3) (const_int 0))
                   1509:                         (match_dup 1) (match_dup 2)))]
                   1510:   ""
                   1511:   "
                   1512: { operands[3] = gen_reg_rtx (DImode);
                   1513: }")
                   1514: 
                   1515: (define_split
                   1516:   [(set (match_operand:DI 0 "register_operand" "")
                   1517:        (smax:DI (match_operand:DI 1 "reg_or_0_operand" "")
                   1518:                 (match_operand:DI 2 "reg_or_8bit_operand" "")))
                   1519:    (clobber (match_operand:DI 3 "register_operand" ""))]
                   1520:   "operands[2] != const0_rtx"
                   1521:   [(set (match_dup 3) (le:DI (match_dup 1) (match_dup 2)))
                   1522:    (set (match_dup 0) (if_then_else:DI (eq (match_dup 3) (const_int 0))
                   1523:                                       (match_dup 1) (match_dup 2)))]
                   1524:   "")
                   1525: 
                   1526: (define_insn ""
                   1527:   [(set (match_operand:DI 0 "register_operand" "=r")
                   1528:        (smax:DI (match_operand:DI 1 "register_operand" "0")
                   1529:                 (const_int 0)))]
                   1530:   ""
                   1531:   "cmovlt %0,0,%0")
                   1532: 
                   1533: (define_expand "smindi3"
                   1534:   [(set (match_dup 3)
                   1535:        (lt:DI (match_operand:DI 1 "reg_or_0_operand" "")
                   1536:               (match_operand:DI 2 "reg_or_8bit_operand" "")))
                   1537:    (set (match_operand:DI 0 "register_operand" "")
                   1538:        (if_then_else:DI (ne (match_dup 3) (const_int 0))
                   1539:                         (match_dup 1) (match_dup 2)))]
                   1540:   ""
                   1541:   "
                   1542: { operands[3] = gen_reg_rtx (DImode);
                   1543: }")
                   1544: 
                   1545: (define_split
                   1546:   [(set (match_operand:DI 0 "register_operand" "")
                   1547:        (smin:DI (match_operand:DI 1 "reg_or_0_operand" "")
                   1548:                 (match_operand:DI 2 "reg_or_8bit_operand" "")))
                   1549:    (clobber (match_operand:DI 3 "register_operand" ""))]
                   1550:   "operands[2] != const0_rtx"
                   1551:   [(set (match_dup 3) (lt:DI (match_dup 1) (match_dup 2)))
                   1552:    (set (match_dup 0) (if_then_else:DI (ne (match_dup 3) (const_int 0))
                   1553:                                       (match_dup 1) (match_dup 2)))]
                   1554:   "")
                   1555: 
                   1556: (define_insn ""
                   1557:   [(set (match_operand:DI 0 "register_operand" "=r")
                   1558:        (smin:DI (match_operand:DI 1 "register_operand" "0")
                   1559:                 (const_int 0)))]
                   1560:   ""
                   1561:   "cmovgt %0,0,%0")
                   1562: 
                   1563: (define_expand "umaxdi3"
                   1564:   [(set (match_dup 3) 
                   1565:        (leu:DI (match_operand:DI 1 "reg_or_0_operand" "")
                   1566:                (match_operand:DI 2 "reg_or_8bit_operand" "")))
                   1567:    (set (match_operand:DI 0 "register_operand" "")
                   1568:        (if_then_else:DI (eq (match_dup 3) (const_int 0))
                   1569:                         (match_dup 1) (match_dup 2)))]
                   1570:   ""
                   1571:   "
                   1572: { operands[3] = gen_reg_rtx (DImode);
                   1573: }")
                   1574: 
                   1575: (define_split
                   1576:   [(set (match_operand:DI 0 "register_operand" "")
                   1577:        (umax:DI (match_operand:DI 1 "reg_or_0_operand" "")
                   1578:                 (match_operand:DI 2 "reg_or_8bit_operand" "")))
                   1579:    (clobber (match_operand:DI 3 "register_operand" ""))]
                   1580:   "operands[2] != const0_rtx"
                   1581:   [(set (match_dup 3) (leu:DI (match_dup 1) (match_dup 2)))
                   1582:    (set (match_dup 0) (if_then_else:DI (eq (match_dup 3) (const_int 0))
                   1583:                                       (match_dup 1) (match_dup 2)))]
                   1584:   "")
                   1585: 
                   1586: (define_expand "umindi3"
                   1587:   [(set (match_dup 3)
                   1588:        (ltu:DI (match_operand:DI 1 "reg_or_0_operand" "")
                   1589:                (match_operand:DI 2 "reg_or_8bit_operand" "")))
                   1590:    (set (match_operand:DI 0 "register_operand" "")
                   1591:        (if_then_else:DI (ne (match_dup 3) (const_int 0))
                   1592:                         (match_dup 1) (match_dup 2)))]
                   1593:   ""
                   1594:   "
                   1595: { operands[3] = gen_reg_rtx (DImode);
                   1596: }")
                   1597: 
                   1598: (define_split
                   1599:   [(set (match_operand:DI 0 "register_operand" "")
                   1600:        (umin:DI (match_operand:DI 1 "reg_or_0_operand" "")
                   1601:                 (match_operand:DI 2 "reg_or_8bit_operand" "")))
                   1602:    (clobber (match_operand:DI 3 "register_operand" ""))]
                   1603:   "operands[2] != const0_rtx"
                   1604:   [(set (match_dup 3) (ltu:DI (match_dup 1) (match_dup 2)))
                   1605:    (set (match_dup 0) (if_then_else:DI (ne (match_dup 3) (const_int 0))
                   1606:                                       (match_dup 1) (match_dup 2)))]
                   1607:   "")
                   1608: 
                   1609: (define_insn ""
                   1610:   [(set (pc)
                   1611:        (if_then_else
                   1612:         (match_operator 1 "signed_comparison_operator"
                   1613:                         [(match_operand:DI 2 "reg_or_0_operand" "rJ")
                   1614:                          (const_int 0)])
                   1615:         (label_ref (match_operand 0 "" ""))
                   1616:         (pc)))]
                   1617:   ""
                   1618:   "b%C1 %r2,%0"
                   1619:   [(set_attr "type" "ibr")])
                   1620: 
                   1621: (define_insn ""
                   1622:   [(set (pc)
                   1623:        (if_then_else
                   1624:         (ne (zero_extract:DI (match_operand:DI 1 "reg_or_0_operand" "rJ")
                   1625:                              (const_int 1)
                   1626:                              (const_int 0))
                   1627:             (const_int 0))
                   1628:         (label_ref (match_operand 0 "" ""))
                   1629:         (pc)))]
                   1630:   ""
                   1631:   "blbs %r1,%0"
                   1632:   [(set_attr "type" "ibr")])
                   1633: 
                   1634: (define_insn ""
                   1635:   [(set (pc)
                   1636:        (if_then_else
                   1637:         (eq (zero_extract:DI (match_operand:DI 1 "reg_or_0_operand" "rJ")
                   1638:                              (const_int 1)
                   1639:                              (const_int 0))
                   1640:             (const_int 0))
                   1641:         (label_ref (match_operand 0 "" ""))
                   1642:         (pc)))]
                   1643:   ""
                   1644:   "blbc %r1,%0"
                   1645:   [(set_attr "type" "ibr")])
                   1646: 
                   1647: (define_split
                   1648:   [(parallel
                   1649:     [(set (pc)
                   1650:          (if_then_else
                   1651:           (match_operator 1 "comparison_operator"
                   1652:                           [(zero_extract:DI (match_operand:DI 2 "register_operand" "")
                   1653:                                             (const_int 1)
                   1654:                                             (match_operand:DI 3 "const_int_operand" ""))
                   1655:                            (const_int 0)])
                   1656:           (label_ref (match_operand 0 "" ""))
                   1657:           (pc)))
                   1658:      (clobber (match_operand:DI 4 "register_operand" ""))])]
                   1659:   "INTVAL (operands[3]) != 0"
                   1660:   [(set (match_dup 4)
                   1661:        (lshiftrt:DI (match_dup 2) (match_dup 3)))
                   1662:    (set (pc)
                   1663:        (if_then_else (match_op_dup 1
                   1664:                                    [(zero_extract:DI (match_dup 4)
                   1665:                                                      (const_int 1)
                   1666:                                                      (const_int 0))
                   1667:                                     (const_int 0)])
                   1668:                      (label_ref (match_dup 0))
                   1669:                      (pc)))]
                   1670:   "")
                   1671: 
                   1672: ;; The following are the corresponding floating-point insns.  Recall
                   1673: ;; we need to have variants that expand the arguments from SF mode
                   1674: ;; to DFmode.
                   1675: 
                   1676: (define_insn ""
                   1677:   [(set (match_operand:DF 0 "register_operand" "=f")
                   1678:        (match_operator:DF 1 "alpha_comparison_operator"
                   1679:                           [(match_operand:DF 2 "reg_or_fp0_operand" "fG")
                   1680:                            (match_operand:DF 3 "reg_or_fp0_operand" "fG")]))]
                   1681:   "TARGET_FP"
                   1682:   "cmpt%C1 %R2,%R3,%0"
                   1683:   [(set_attr "type" "fpop")])
                   1684: 
                   1685: (define_insn ""
                   1686:   [(set (match_operand:DF 0 "register_operand" "=f")
                   1687:        (match_operator:DF 1 "alpha_comparison_operator"
                   1688:                           [(float_extend:DF
                   1689:                             (match_operand:SF 2 "reg_or_fp0_operand" "fG"))
                   1690:                            (match_operand:DF 3 "reg_or_fp0_operand" "fG")]))]
                   1691:   "TARGET_FP"
                   1692:   "cmpt%C1 %R2,%R3,%0"
                   1693:   [(set_attr "type" "fpop")])
                   1694: 
                   1695: (define_insn ""
                   1696:   [(set (match_operand:DF 0 "register_operand" "=f")
                   1697:        (match_operator:DF 1 "alpha_comparison_operator"
                   1698:                           [(match_operand:DF 2 "reg_or_fp0_operand" "fG")
                   1699:                            (float_extend:DF
                   1700:                             (match_operand:SF 3 "reg_or_fp0_operand" "fG"))]))]
                   1701:   "TARGET_FP"
                   1702:   "cmpt%C1 %R2,%R3,%0"
                   1703:   [(set_attr "type" "fpop")])
                   1704: 
                   1705: (define_insn ""
                   1706:   [(set (match_operand:DF 0 "register_operand" "=f")
                   1707:        (match_operator:DF 1 "alpha_comparison_operator"
                   1708:                           [(float_extend:DF
                   1709:                             (match_operand:SF 2 "reg_or_fp0_operand" "fG"))
                   1710:                            (float_extend:DF
                   1711:                             (match_operand:SF 3 "reg_or_fp0_operand" "fG"))]))]
                   1712:   "TARGET_FP"
                   1713:   "cmpt%C1 %R2,%R3,%0"
                   1714:   [(set_attr "type" "fpop")])
                   1715: 
                   1716: (define_insn ""
                   1717:   [(set (match_operand:DF 0 "register_operand" "=f,f")
                   1718:        (if_then_else:DF 
                   1719:         (match_operator 3 "signed_comparison_operator"
                   1720:                         [(match_operand:DF 4 "reg_or_fp0_operand" "fG,fG")
                   1721:                          (match_operand:DF 2 "fp0_operand" "G,G")])
                   1722:         (match_operand:DF 1 "reg_or_fp0_operand" "fG,0")
                   1723:         (match_operand:DF 5 "reg_or_fp0_operand" "0,fG")))]
                   1724:   "TARGET_FP"
                   1725:   "@
                   1726:    fcmov%C3 %R4,%R1,%0
                   1727:    fcmov%D3 %R4,%R5,%0"
                   1728:   [(set_attr "type" "fpop")])
                   1729: 
                   1730: (define_insn ""
                   1731:   [(set (match_operand:SF 0 "register_operand" "=f,f")
                   1732:        (if_then_else:SF 
                   1733:         (match_operator 3 "signed_comparison_operator"
                   1734:                         [(match_operand:DF 4 "reg_or_fp0_operand" "fG,fG")
                   1735:                          (match_operand:DF 2 "fp0_operand" "G,G")])
                   1736:         (match_operand:SF 1 "reg_or_fp0_operand" "fG,0")
                   1737:         (match_operand:SF 5 "reg_or_fp0_operand" "0,fG")))]
                   1738:   "TARGET_FP"
                   1739:   "@
                   1740:    fcmov%C3 %R4,%R1,%0
                   1741:    fcmov%D3 %R4,%R5,%0"
                   1742:   [(set_attr "type" "fpop")])
                   1743: 
                   1744: (define_insn ""
                   1745:   [(set (match_operand:DF 0 "register_operand" "=f,f")
                   1746:        (if_then_else:DF 
                   1747:         (match_operator 3 "signed_comparison_operator"
                   1748:                         [(match_operand:DF 1 "reg_or_fp0_operand" "fG,fG")
                   1749:                          (match_operand:DF 2 "fp0_operand" "G,G")])
                   1750:         (float_extend:DF (match_operand:SF 4 "reg_or_fp0_operand" "fG,0"))
                   1751:         (match_operand:DF 5 "reg_or_fp0_operand" "0,fG")))]
                   1752:   "TARGET_FP"
                   1753:   "@
                   1754:    fcmov%C3 %R4,%R1,%0
                   1755:    fcmov%D3 %R4,%R5,%0"
                   1756:   [(set_attr "type" "fpop")])
                   1757: 
                   1758: (define_insn ""
                   1759:   [(set (match_operand:DF 0 "register_operand" "=f,f")
                   1760:        (if_then_else:DF 
                   1761:         (match_operator 3 "signed_comparison_operator"
                   1762:                         [(float_extend:DF 
                   1763:                           (match_operand:SF 4 "reg_or_fp0_operand" "fG,fG"))
                   1764:                          (match_operand:DF 2 "fp0_operand" "G,G")])
                   1765:         (match_operand:DF 1 "reg_or_fp0_operand" "fG,0")
                   1766:         (match_operand:DF 5 "reg_or_fp0_operand" "0,fG")))]
                   1767:   "TARGET_FP"
                   1768:   "@
                   1769:    fcmov%C3 %R4,%R1,%0
                   1770:    fcmov%D3 %R4,%R5,%0"
                   1771:   [(set_attr "type" "fpop")])
                   1772: 
                   1773: (define_insn ""
                   1774:   [(set (match_operand:SF 0 "register_operand" "=f,f")
                   1775:        (if_then_else:SF 
                   1776:         (match_operator 3 "signed_comparison_operator"
                   1777:                         [(float_extend:DF
                   1778:                           (match_operand:SF 4 "reg_or_fp0_operand" "fG,fG"))
                   1779:                          (match_operand:DF 2 "fp0_operand" "G,G")])
                   1780:         (match_operand:SF 1 "reg_or_fp0_operand" "fG,0")
                   1781:         (match_operand:SF 5 "reg_or_fp0_operand" "0,fG")))]
                   1782:   "TARGET_FP"
                   1783:   "@
                   1784:    fcmov%C3 %R4,%R1,%0
                   1785:    fcmov%D3 %R4,%R5,%0"
                   1786:   [(set_attr "type" "fpop")])
                   1787: 
                   1788: (define_insn ""
                   1789:   [(set (match_operand:DF 0 "register_operand" "=f,f")
                   1790:        (if_then_else:DF 
                   1791:         (match_operator 3 "signed_comparison_operator"
                   1792:                         [(float_extend:DF
                   1793:                           (match_operand:SF 4 "reg_or_fp0_operand" "fG,fG"))
                   1794:                          (match_operand:DF 2 "fp0_operand" "G,G")])
                   1795:         (float_extend:DF (match_operand:SF 1 "reg_or_fp0_operand" "fG,0"))
                   1796:         (match_operand:DF 5 "reg_or_fp0_operand" "0,fG")))]
                   1797:   "TARGET_FP"
                   1798:   "@
                   1799:    fcmov%C3 %R4,%R1,%0
                   1800:    fcmov%D3 %R4,%R5,%0"
                   1801:   [(set_attr "type" "fpop")])
                   1802: 
                   1803: (define_expand "maxdf3"
                   1804:   [(set (match_dup 3)
                   1805:        (le:DF (match_operand:DF 1 "reg_or_fp0_operand" "")
                   1806:               (match_operand:DF 2 "reg_or_fp0_operand" "")))
                   1807:    (set (match_operand:DF 0 "register_operand" "")
1.1.1.3   root     1808:        (if_then_else:DF (eq (match_dup 3) (match_dup 4))
1.1       root     1809:                         (match_dup 1) (match_dup 2)))]
                   1810:   "TARGET_FP"
                   1811:   "
                   1812: { operands[3] = gen_reg_rtx (DFmode);
1.1.1.3   root     1813:   operands[4] = CONST0_RTX (DFmode);
1.1       root     1814: }")
                   1815: 
                   1816: (define_expand "mindf3"
                   1817:   [(set (match_dup 3)
                   1818:        (lt:DF (match_operand:DF 1 "reg_or_fp0_operand" "")
                   1819:               (match_operand:DF 2 "reg_or_fp0_operand" "")))
                   1820:    (set (match_operand:DF 0 "register_operand" "")
1.1.1.3   root     1821:        (if_then_else:DF (ne (match_dup 3) (match_dup 4))
1.1       root     1822:                         (match_dup 1) (match_dup 2)))]
                   1823:   "TARGET_FP"
                   1824:   "
                   1825: { operands[3] = gen_reg_rtx (DFmode);
1.1.1.3   root     1826:   operands[4] = CONST0_RTX (DFmode);
1.1       root     1827: }")
                   1828: 
                   1829: (define_expand "maxsf3"
                   1830:   [(set (match_dup 3)
1.1.1.3   root     1831:        (le:DF (float_extend:DF (match_operand:SF 1 "reg_or_fp0_operand" ""))
1.1       root     1832:               (float_extend:DF (match_operand:SF 2 "reg_or_fp0_operand" ""))))
                   1833:    (set (match_operand:SF 0 "register_operand" "")
1.1.1.3   root     1834:        (if_then_else:SF (eq (match_dup 3) (match_dup 4))
1.1       root     1835:                         (match_dup 1) (match_dup 2)))]
                   1836:   "TARGET_FP"
                   1837:   "
1.1.1.3   root     1838: { operands[3] = gen_reg_rtx (DFmode);
                   1839:   operands[4] = CONST0_RTX (DFmode);
1.1       root     1840: }")
                   1841: 
                   1842: (define_expand "minsf3"
                   1843:   [(set (match_dup 3)
1.1.1.3   root     1844:        (lt:DF (float_extend:DF (match_operand:SF 1 "reg_or_fp0_operand" ""))
1.1       root     1845:               (float_extend:DF (match_operand:SF 2 "reg_or_fp0_operand" ""))))
                   1846:    (set (match_operand:SF 0 "register_operand" "")
1.1.1.3   root     1847:        (if_then_else:SF (ne (match_dup 3) (match_dup 4))
1.1       root     1848:                      (match_dup 1) (match_dup 2)))]
                   1849:   "TARGET_FP"
                   1850:   "
1.1.1.3   root     1851: { operands[3] = gen_reg_rtx (DFmode);
                   1852:   operands[4] = CONST0_RTX (DFmode);
1.1       root     1853: }")
                   1854: 
                   1855: (define_insn ""
                   1856:   [(set (pc)
                   1857:        (if_then_else
                   1858:         (match_operator 1 "signed_comparison_operator"
                   1859:                         [(match_operand:DF 2 "reg_or_fp0_operand" "fG")
                   1860:                          (match_operand:DF 3 "fp0_operand" "G")])
                   1861:         (label_ref (match_operand 0 "" ""))
                   1862:         (pc)))]
                   1863:   "TARGET_FP"
                   1864:   "fb%C1 %R2,%0"
                   1865:   [(set_attr "type" "fbr")])
                   1866: 
                   1867: (define_insn ""
                   1868:   [(set (pc)
                   1869:        (if_then_else
                   1870:         (match_operator 1 "signed_comparison_operator"
                   1871:                         [(float_extend:DF
                   1872:                           (match_operand:SF 2 "reg_or_fp0_operand" "fG"))
                   1873:                          (match_operand:DF 3 "fp0_operand" "G")])
                   1874:         (label_ref (match_operand 0 "" ""))
                   1875:         (pc)))]
                   1876:   "TARGET_FP"
                   1877:   "fb%C1 %R2,%0"
                   1878:   [(set_attr "type" "fbr")])
                   1879: 
                   1880: ;; These are the main define_expand's used to make conditional branches
                   1881: ;; and compares.
                   1882: 
                   1883: (define_expand "cmpdf"
                   1884:   [(set (cc0) (compare (match_operand:DF 0 "reg_or_fp0_operand" "")
                   1885:                       (match_operand:DF 1 "reg_or_fp0_operand" "")))]
1.1.1.4 ! root     1886:   "TARGET_FP"
1.1       root     1887:   "
                   1888: {
                   1889:   alpha_compare_op0 = operands[0];
                   1890:   alpha_compare_op1 = operands[1];
                   1891:   alpha_compare_fp_p = 1;
                   1892:   DONE;
                   1893: }")
                   1894: 
                   1895: (define_expand "cmpdi"
                   1896:   [(set (cc0) (compare (match_operand:DI 0 "reg_or_0_operand" "")
                   1897:                       (match_operand:DI 1 "reg_or_8bit_operand" "")))]
                   1898:   ""
                   1899:   "
                   1900: {
                   1901:   alpha_compare_op0 = operands[0];
                   1902:   alpha_compare_op1 = operands[1];
                   1903:   alpha_compare_fp_p = 0;
                   1904:   DONE;
                   1905: }")
                   1906: 
                   1907: (define_expand "beq"
                   1908:   [(set (match_dup 1) (match_dup 2))
                   1909:    (set (pc)
                   1910:        (if_then_else (match_dup 3)
                   1911:                      (label_ref (match_operand 0 "" ""))
                   1912:                      (pc)))]
                   1913:   ""
                   1914:   "
                   1915: {
                   1916:   enum machine_mode mode;
                   1917:   enum rtx_code compare_code, branch_code;
                   1918: 
                   1919:   if (alpha_compare_fp_p)
                   1920:     mode = DFmode, compare_code = EQ, branch_code = NE;
                   1921:   else
                   1922:     {
                   1923:       mode = DImode, compare_code = MINUS, branch_code = EQ;
                   1924:       if (GET_CODE (alpha_compare_op1) == CONST_INT)
                   1925:        {
                   1926:          compare_code = PLUS;
                   1927:          alpha_compare_op1 = GEN_INT (- INTVAL (alpha_compare_op1));
                   1928:        }
                   1929:     }
                   1930: 
                   1931:   operands[1] = gen_reg_rtx (mode);
                   1932:   operands[2] = gen_rtx (compare_code, mode,
                   1933:                         alpha_compare_op0, alpha_compare_op1);
                   1934:   operands[3] = gen_rtx (branch_code, VOIDmode,
                   1935:                         operands[1], CONST0_RTX (mode));
                   1936: }")
                   1937: 
                   1938: (define_expand "bne"
                   1939:   [(set (match_dup 1) (match_dup 2))
                   1940:    (set (pc)
                   1941:        (if_then_else (match_dup 3)
                   1942:                      (label_ref (match_operand 0 "" ""))
                   1943:                      (pc)))]
                   1944:   ""
                   1945:   "
                   1946: {
                   1947:   enum machine_mode mode;
                   1948:   enum rtx_code compare_code, branch_code;
                   1949: 
                   1950:   if (alpha_compare_fp_p)
                   1951:     mode = DFmode, compare_code = EQ, branch_code = EQ;
                   1952:   else
                   1953:     {
                   1954:       mode = DImode, compare_code = MINUS, branch_code = NE;
                   1955:       if (GET_CODE (alpha_compare_op1) == CONST_INT)
                   1956:        {
                   1957:          compare_code = PLUS;
                   1958:          alpha_compare_op1 = GEN_INT (- INTVAL (alpha_compare_op1));
                   1959:        }
                   1960:     }
                   1961: 
                   1962:   operands[1] = gen_reg_rtx (mode);
                   1963:   operands[2] = gen_rtx (compare_code, mode,
                   1964:                         alpha_compare_op0, alpha_compare_op1);
                   1965:   operands[3] = gen_rtx (branch_code, VOIDmode,
                   1966:                         operands[1], CONST0_RTX (mode));
                   1967: }")
                   1968: 
                   1969: (define_expand "blt"
                   1970:   [(set (match_dup 1) (match_dup 2))
                   1971:    (set (pc)
                   1972:        (if_then_else (match_dup 3)
                   1973:                      (label_ref (match_operand 0 "" ""))
                   1974:                      (pc)))]
                   1975:   ""
                   1976:   "
                   1977: {
                   1978:   enum machine_mode mode = alpha_compare_fp_p ? DFmode : DImode;
                   1979:   operands[1] = gen_reg_rtx (mode);
                   1980:   operands[2] = gen_rtx (LT, mode, alpha_compare_op0, alpha_compare_op1);
                   1981:   operands[3] = gen_rtx (NE, VOIDmode, operands[1], CONST0_RTX (mode));
                   1982: }")
                   1983: 
                   1984: (define_expand "ble"
                   1985:   [(set (match_dup 1) (match_dup 2))
                   1986:    (set (pc)
                   1987:        (if_then_else (match_dup 3)
                   1988:                      (label_ref (match_operand 0 "" ""))
                   1989:                      (pc)))]
                   1990:   ""
                   1991:   "
                   1992: {
                   1993:   enum machine_mode mode = alpha_compare_fp_p ? DFmode : DImode;
                   1994:   operands[1] = gen_reg_rtx (mode);
                   1995:   operands[2] = gen_rtx (LE, mode, alpha_compare_op0, alpha_compare_op1);
                   1996:   operands[3] = gen_rtx (NE, VOIDmode, operands[1], CONST0_RTX (mode));
                   1997: }")
                   1998: 
                   1999: (define_expand "bgt"
                   2000:   [(set (match_dup 1) (match_dup 2))
                   2001:    (set (pc)
                   2002:        (if_then_else (match_dup 3)
                   2003:                      (label_ref (match_operand 0 "" ""))
                   2004:                      (pc)))]
                   2005:   ""
                   2006:   "
                   2007: {
                   2008:   if (alpha_compare_fp_p)
                   2009:     {
                   2010:       operands[1] = gen_reg_rtx (DFmode);
                   2011:       operands[2] = gen_rtx (LT, DFmode, alpha_compare_op1, alpha_compare_op0);
                   2012:       operands[3] = gen_rtx (NE, VOIDmode, operands[1], CONST0_RTX (DFmode));
                   2013:     }
                   2014:   else
                   2015:     {
                   2016:       operands[1] = gen_reg_rtx (DImode);
                   2017:       operands[2] = gen_rtx (LE, DImode, alpha_compare_op0, alpha_compare_op1);
                   2018:       operands[3] = gen_rtx (EQ, VOIDmode, operands[1], const0_rtx);
                   2019:     }
                   2020: }")
                   2021: 
                   2022: (define_expand "bge"
                   2023:   [(set (match_dup 1) (match_dup 2))
                   2024:    (set (pc)
                   2025:        (if_then_else (match_dup 3)
                   2026:                      (label_ref (match_operand 0 "" ""))
                   2027:                      (pc)))]
                   2028:   ""
                   2029:   "
                   2030: {
                   2031:   if (alpha_compare_fp_p)
                   2032:     {
                   2033:       operands[1] = gen_reg_rtx (DFmode);
                   2034:       operands[2] = gen_rtx (LE, DFmode, alpha_compare_op1, alpha_compare_op0);
                   2035:       operands[3] = gen_rtx (NE, VOIDmode, operands[1], CONST0_RTX (DFmode));
                   2036:     }
                   2037:   else
                   2038:     {
                   2039:       operands[1] = gen_reg_rtx (DImode);
                   2040:       operands[2] = gen_rtx (LT, DImode, alpha_compare_op0, alpha_compare_op1);
                   2041:       operands[3] = gen_rtx (EQ, VOIDmode, operands[1], const0_rtx);
                   2042:     }
                   2043: }")
                   2044: 
                   2045: (define_expand "bltu"
                   2046:   [(set (match_dup 1) (match_dup 2))
                   2047:    (set (pc)
                   2048:        (if_then_else (match_dup 3)
                   2049:                      (label_ref (match_operand 0 "" ""))
                   2050:                      (pc)))]
                   2051:   ""
                   2052:   "
                   2053: {
                   2054:   operands[1] = gen_reg_rtx (DImode);
                   2055:   operands[2] = gen_rtx (LTU, DImode, alpha_compare_op0, alpha_compare_op1);
                   2056:   operands[3] = gen_rtx (NE, VOIDmode, operands[1], const0_rtx);
                   2057: }")
                   2058: 
                   2059: (define_expand "bleu"
                   2060:   [(set (match_dup 1) (match_dup 2))
                   2061:    (set (pc)
                   2062:        (if_then_else (match_dup 3)
                   2063:                      (label_ref (match_operand 0 "" ""))
                   2064:                      (pc)))]
                   2065:   ""
                   2066:   "
                   2067: {
                   2068:   operands[1] = gen_reg_rtx (DImode);
                   2069:   operands[2] = gen_rtx (LEU, DImode, alpha_compare_op0, alpha_compare_op1);
                   2070:   operands[3] = gen_rtx (NE, VOIDmode, operands[1], const0_rtx);
                   2071: }")
                   2072: 
                   2073: (define_expand "bgtu"
                   2074:   [(set (match_dup 1) (match_dup 2))
                   2075:    (set (pc)
                   2076:        (if_then_else (match_dup 3)
                   2077:                      (label_ref (match_operand 0 "" ""))
                   2078:                      (pc)))]
                   2079:   ""
                   2080:   "
                   2081: {
                   2082:   operands[1] = gen_reg_rtx (DImode);
                   2083:   operands[2] = gen_rtx (LEU, DImode, alpha_compare_op0, alpha_compare_op1);
                   2084:   operands[3] = gen_rtx (EQ, VOIDmode, operands[1], const0_rtx);
                   2085: }")
                   2086: 
                   2087: (define_expand "bgeu"
                   2088:   [(set (match_dup 1) (match_dup 2))
                   2089:    (set (pc)
                   2090:        (if_then_else (match_dup 3)
                   2091:                      (label_ref (match_operand 0 "" ""))
                   2092:                      (pc)))]
                   2093:   ""
                   2094:   "
                   2095: {
                   2096:   operands[1] = gen_reg_rtx (DImode);
                   2097:   operands[2] = gen_rtx (LTU, DImode, alpha_compare_op0, alpha_compare_op1);
                   2098:   operands[3] = gen_rtx (EQ, VOIDmode, operands[1], const0_rtx);
                   2099: }")
                   2100: 
                   2101: (define_expand "seq"
                   2102:   [(set (match_operand:DI 0 "register_operand" "")
                   2103:        (match_dup 1))]
                   2104:   ""
                   2105:   "
                   2106: {
                   2107:   if (alpha_compare_fp_p)
                   2108:     FAIL;
                   2109: 
                   2110:   operands[1] = gen_rtx (EQ, DImode, alpha_compare_op0, alpha_compare_op1);
                   2111: }")
                   2112: 
                   2113: (define_expand "sne"
                   2114:   [(set (match_operand:DI 0 "register_operand" "")
                   2115:        (match_dup 1))
                   2116:    (set (match_dup 0) (xor:DI (match_dup 0) (const_int 1)))]
                   2117:   ""
                   2118:   "
                   2119: {
                   2120:   if (alpha_compare_fp_p)
                   2121:     FAIL;
                   2122: 
                   2123:   operands[1] = gen_rtx (EQ, DImode, alpha_compare_op0, alpha_compare_op1);
                   2124: }")
                   2125: 
                   2126: (define_expand "slt"
                   2127:   [(set (match_operand:DI 0 "register_operand" "")
                   2128:        (match_dup 1))]
                   2129:   ""
                   2130:   "
                   2131: {
                   2132:   if (alpha_compare_fp_p)
                   2133:     FAIL;
                   2134: 
                   2135:   operands[1] = gen_rtx (LT, DImode, alpha_compare_op0, alpha_compare_op1);
                   2136: }")
                   2137: 
                   2138: (define_expand "sle"
                   2139:   [(set (match_operand:DI 0 "register_operand" "")
                   2140:        (match_dup 1))]
                   2141:   ""
                   2142:   "
                   2143: {
                   2144:   if (alpha_compare_fp_p)
                   2145:     FAIL;
                   2146: 
                   2147:   operands[1] = gen_rtx (LE, DImode, alpha_compare_op0, alpha_compare_op1);
                   2148: }")
                   2149: 
                   2150: (define_expand "sgt"
                   2151:   [(set (match_operand:DI 0 "register_operand" "")
                   2152:        (match_dup 1))]
                   2153:   ""
                   2154:   "
                   2155: {
                   2156:   if (alpha_compare_fp_p)
                   2157:     FAIL;
                   2158: 
                   2159:   operands[1] = gen_rtx (LT, DImode, force_reg (DImode, alpha_compare_op1),
                   2160:                         alpha_compare_op0);
                   2161: }")
                   2162: 
                   2163: (define_expand "sge"
                   2164:   [(set (match_operand:DI 0 "register_operand" "")
                   2165:        (match_dup 1))]
                   2166:   ""
                   2167:   "
                   2168: {
                   2169:   if (alpha_compare_fp_p)
                   2170:     FAIL;
                   2171: 
                   2172:   operands[1] = gen_rtx (LE, DImode, force_reg (DImode, alpha_compare_op1),
                   2173:                         alpha_compare_op0);
                   2174: }")
                   2175: 
                   2176: (define_expand "sltu"
                   2177:   [(set (match_operand:DI 0 "register_operand" "")
                   2178:        (match_dup 1))]
                   2179:   ""
                   2180:   "
                   2181: {
                   2182:   if (alpha_compare_fp_p)
                   2183:     FAIL;
                   2184: 
                   2185:   operands[1] = gen_rtx (LTU, DImode, alpha_compare_op0, alpha_compare_op1);
                   2186: }")
                   2187: 
                   2188: (define_expand "sleu"
                   2189:   [(set (match_operand:DI 0 "register_operand" "")
                   2190:        (match_dup 1))]
                   2191:   ""
                   2192:   "
                   2193: {
                   2194:   if (alpha_compare_fp_p)
                   2195:     FAIL;
                   2196: 
                   2197:   operands[1] = gen_rtx (LEU, DImode, alpha_compare_op0, alpha_compare_op1);
                   2198: }")
                   2199: 
                   2200: (define_expand "sgtu"
                   2201:   [(set (match_operand:DI 0 "register_operand" "")
                   2202:        (match_dup 1))]
                   2203:   ""
                   2204:   "
                   2205: {
                   2206:   if (alpha_compare_fp_p)
                   2207:     FAIL;
                   2208: 
                   2209:   operands[1] = gen_rtx (LTU, DImode, force_reg (DImode, alpha_compare_op1),
                   2210:                         alpha_compare_op0);
                   2211: }")
                   2212: 
                   2213: (define_expand "sgeu"
                   2214:   [(set (match_operand:DI 0 "register_operand" "")
                   2215:        (match_dup 1))]
                   2216:   ""
                   2217:   "
                   2218: {
                   2219:   if (alpha_compare_fp_p)
                   2220:     FAIL;
                   2221: 
                   2222:   operands[1] = gen_rtx (LEU, DImode, force_reg (DImode, alpha_compare_op1),
                   2223:                         alpha_compare_op0);
                   2224: }")
                   2225: 
1.1.1.4 ! root     2226: ;; These are the main define_expand's used to make conditional moves.
        !          2227: 
        !          2228: (define_expand "movsicc"
        !          2229:   [(set (match_dup 4) (match_operand 1 "comparison_operator" ""))
        !          2230:    (set (match_operand:SI 0 "register_operand" "")
        !          2231:        (if_then_else:DI (match_dup 5)
        !          2232:                         (match_operand:SI 2 "reg_or_8bit_operand" "")
        !          2233:                         (match_operand:SI 3 "reg_or_8bit_operand" "")))]
        !          2234:   ""
        !          2235:   "
        !          2236: {
        !          2237:   rtx op0,op1;
        !          2238:   enum rtx_code code = GET_CODE (operands[1]), code2 = NE;
        !          2239: 
        !          2240:   if (alpha_compare_fp_p)
        !          2241:     FAIL;
        !          2242:   switch (code)
        !          2243:     {
        !          2244:     case EQ: case LE: case LT:
        !          2245:       op0 = alpha_compare_op0;
        !          2246:       op1 = alpha_compare_op1;
        !          2247:       break;
        !          2248:     case NE:
        !          2249:       code = code2 = EQ;
        !          2250:       op0 = alpha_compare_op0;
        !          2251:       op1 = alpha_compare_op1;
        !          2252:       break;
        !          2253:     case GE:
        !          2254:       code = LE;
        !          2255:       op0 = force_reg (DImode, alpha_compare_op1);
        !          2256:       op1 = alpha_compare_op0;
        !          2257:       break;
        !          2258:     case GT:
        !          2259:       code = LT;
        !          2260:       op0 = force_reg (DImode, alpha_compare_op1);
        !          2261:       op1 = alpha_compare_op0;
        !          2262:       break;
        !          2263:     default:
        !          2264:       FAIL;
        !          2265:     }
        !          2266:   operands[1] = gen_rtx (code, DImode, op0, op1);
        !          2267:   operands[4] = gen_reg_rtx (DImode);
        !          2268:   operands[5] = gen_rtx (code2, VOIDmode, operands[4], CONST0_RTX (DImode));
        !          2269: }")
        !          2270: 
        !          2271: (define_expand "movdicc"
        !          2272:   [(set (match_dup 4) (match_operand 1 "comparison_operator" ""))
        !          2273:    (set (match_operand:DI 0 "register_operand" "")
        !          2274:        (if_then_else:DI (match_dup 5)
        !          2275:                         (match_operand:DI 2 "reg_or_8bit_operand" "")
        !          2276:                         (match_operand:DI 3 "reg_or_8bit_operand" "")))]
        !          2277:   ""
        !          2278:   "
        !          2279: {
        !          2280:   rtx op0,op1;
        !          2281:   enum rtx_code code = GET_CODE (operands[1]), code2 = NE;
        !          2282: 
        !          2283:   if (alpha_compare_fp_p)
        !          2284:     FAIL;
        !          2285:   switch (code)
        !          2286:     {
        !          2287:     case EQ: case LE: case LT:
        !          2288:       op0 = alpha_compare_op0;
        !          2289:       op1 = alpha_compare_op1;
        !          2290:       break;
        !          2291:     case NE:
        !          2292:       code = code2 = EQ;
        !          2293:       op0 = alpha_compare_op0;
        !          2294:       op1 = alpha_compare_op1;
        !          2295:       break;
        !          2296:     case GE:
        !          2297:       code = LE;
        !          2298:       op0 = force_reg (DImode, alpha_compare_op1);
        !          2299:       op1 = alpha_compare_op0;
        !          2300:       break;
        !          2301:     case GT:
        !          2302:       code = LT;
        !          2303:       op0 = force_reg (DImode, alpha_compare_op1);
        !          2304:       op1 = alpha_compare_op0;
        !          2305:       break;
        !          2306:     default:
        !          2307:       FAIL;
        !          2308:     }
        !          2309:   operands[1] = gen_rtx (code, DImode, op0, op1);
        !          2310:   operands[4] = gen_reg_rtx (DImode);
        !          2311:   operands[5] = gen_rtx (code2, VOIDmode, operands[4], CONST0_RTX (DImode));
        !          2312: }")
        !          2313: 
        !          2314: (define_expand "movsfcc"
        !          2315:   [(set (match_dup 4) (match_operand 1 "comparison_operator" ""))
        !          2316:    (set (match_operand:SF 0 "register_operand" "")
        !          2317:        (if_then_else:SF (match_dup 5)
        !          2318:                         (match_operand:SF 2 "reg_or_fp0_operand" "")
        !          2319:                         (match_operand:SF 3 "reg_or_fp0_operand" "")))]
        !          2320:   ""
        !          2321:   "
        !          2322: {
        !          2323:   rtx op0,op1;
        !          2324:   enum rtx_code code = GET_CODE (operands[1]), code2 = NE;
        !          2325: 
        !          2326:   if (!alpha_compare_fp_p)
        !          2327:     FAIL;
        !          2328:   switch (code)
        !          2329:     {
        !          2330:     case EQ: case LE: case LT:
        !          2331:       op0 = alpha_compare_op0;
        !          2332:       op1 = alpha_compare_op1;
        !          2333:       break;
        !          2334:     case NE:
        !          2335:       /* There isn't a cmptne insn.  */
        !          2336:       code = code2 = EQ;
        !          2337:       op0 = alpha_compare_op0;
        !          2338:       op1 = alpha_compare_op1;
        !          2339:       break;
        !          2340:     case GE:
        !          2341:       code = LE;
        !          2342:       op0 = force_reg (DFmode, alpha_compare_op1);
        !          2343:       op1 = alpha_compare_op0;
        !          2344:       break;
        !          2345:     case GT:
        !          2346:       code = LT;
        !          2347:       op0 = force_reg (DFmode, alpha_compare_op1);
        !          2348:       op1 = alpha_compare_op0;
        !          2349:       break;
        !          2350:     default:
        !          2351:       FAIL;
        !          2352:     }
        !          2353:   operands[1] = gen_rtx (code, DFmode, op0, op1);
        !          2354:   operands[4] = gen_reg_rtx (DFmode);
        !          2355:   operands[5] = gen_rtx (code2, VOIDmode, operands[4], CONST0_RTX (DFmode));
        !          2356: }")
        !          2357: 
        !          2358: (define_expand "movdfcc"
        !          2359:   [(set (match_dup 4) (match_operand 1 "comparison_operator" ""))
        !          2360:    (set (match_operand:DF 0 "register_operand" "")
        !          2361:        (if_then_else:DF (match_dup 5)
        !          2362:                         (match_operand:DF 2 "reg_or_fp0_operand" "")
        !          2363:                         (match_operand:DF 3 "reg_or_fp0_operand" "")))]
        !          2364:   ""
        !          2365:   "
        !          2366: {
        !          2367:   rtx op0,op1;
        !          2368:   enum rtx_code code = GET_CODE (operands[1]), code2 = NE;
        !          2369: 
        !          2370:   if (!alpha_compare_fp_p)
        !          2371:     FAIL;
        !          2372:   switch (code)
        !          2373:     {
        !          2374:     case EQ: case LE: case LT:
        !          2375:       op0 = alpha_compare_op0;
        !          2376:       op1 = alpha_compare_op1;
        !          2377:       break;
        !          2378:     case NE:
        !          2379:       /* There isn't a cmptne insn.  */
        !          2380:       code = code2 = EQ;
        !          2381:       op0 = alpha_compare_op0;
        !          2382:       op1 = alpha_compare_op1;
        !          2383:       break;
        !          2384:     case GE:
        !          2385:       code = LE;
        !          2386:       op0 = force_reg (DFmode, alpha_compare_op1);
        !          2387:       op1 = alpha_compare_op0;
        !          2388:       break;
        !          2389:     case GT:
        !          2390:       code = LT;
        !          2391:       op0 = force_reg (DFmode, alpha_compare_op1);
        !          2392:       op1 = alpha_compare_op0;
        !          2393:       break;
        !          2394:     default:
        !          2395:       FAIL;
        !          2396:     }
        !          2397:   operands[1] = gen_rtx (code, DFmode, op0, op1);
        !          2398:   operands[4] = gen_reg_rtx (DFmode);
        !          2399:   operands[5] = gen_rtx (code2, VOIDmode, operands[4], CONST0_RTX (DFmode));
        !          2400: }")
        !          2401: 
1.1       root     2402: ;; These define_split definitions are used in cases when comparisons have
                   2403: ;; not be stated in the correct way and we need to reverse the second
                   2404: ;; comparison.  For example, x >= 7 has to be done as x < 6 with the
                   2405: ;; comparison that tests the result being reversed.  We have one define_split
                   2406: ;; for each use of a comparison.  They do not match valid insns and need
                   2407: ;; not generate valid insns.
                   2408: ;;
                   2409: ;; We can also handle equality comparisons (and inequality comparisons in
                   2410: ;; cases where the resulting add cannot overflow) by doing an add followed by
                   2411: ;; a comparison with zero.  This is faster since the addition takes one
                   2412: ;; less cycle than a compare when feeding into a conditional move.
                   2413: ;; For this case, we also have an SImode pattern since we can merge the add
                   2414: ;; and sign extend and the order doesn't matter.
                   2415: ;;
                   2416: ;; We do not do this for floating-point, since it isn't clear how the "wrong"
                   2417: ;; operation could have been generated.
                   2418: 
                   2419: (define_split
                   2420:   [(set (match_operand:DI 0 "register_operand" "")
                   2421:        (if_then_else:DI
                   2422:         (match_operator 1 "comparison_operator"
                   2423:                         [(match_operand:DI 2 "reg_or_0_operand" "")
                   2424:                          (match_operand:DI 3 "reg_or_cint_operand" "")])
                   2425:         (match_operand:DI 4 "reg_or_cint_operand" "")
                   2426:         (match_operand:DI 5 "reg_or_cint_operand" "")))
                   2427:    (clobber (match_operand:DI 6 "register_operand" ""))]
                   2428:   "operands[3] != const0_rtx"
                   2429:   [(set (match_dup 6) (match_dup 7))
                   2430:    (set (match_dup 0)
                   2431:        (if_then_else:DI (match_dup 8) (match_dup 4) (match_dup 5)))]
                   2432:   "
                   2433: { enum rtx_code code = GET_CODE (operands[1]);
                   2434:   int unsignedp = (code == GEU || code == LEU || code == GTU || code == LTU);
                   2435: 
                   2436:   /* If we are comparing for equality with a constant and that constant
                   2437:      appears in the arm when the register equals the constant, use the
                   2438:      register since that is more likely to match (and to produce better code
                   2439:      if both would).  */
                   2440: 
                   2441:   if (code == EQ && GET_CODE (operands[3]) == CONST_INT
                   2442:       && rtx_equal_p (operands[4], operands[3]))
                   2443:     operands[4] = operands[2];
                   2444: 
                   2445:   else if (code == NE && GET_CODE (operands[3]) == CONST_INT
                   2446:           && rtx_equal_p (operands[5], operands[3]))
                   2447:     operands[5] = operands[2];
                   2448: 
                   2449:   if (code == NE || code == EQ
                   2450:       || (extended_count (operands[2], DImode, unsignedp) >= 1
                   2451:          && extended_count (operands[3], DImode, unsignedp) >= 1))
                   2452:     {
                   2453:       if (GET_CODE (operands[3]) == CONST_INT)
                   2454:        operands[7] = gen_rtx (PLUS, DImode, operands[2],
                   2455:                               GEN_INT (- INTVAL (operands[3])));
                   2456:       else
                   2457:        operands[7] = gen_rtx (MINUS, DImode, operands[2], operands[3]);
                   2458: 
                   2459:       operands[8] = gen_rtx (code, VOIDmode, operands[6], const0_rtx);
                   2460:     }
                   2461: 
                   2462:   else if (code == EQ || code == LE || code == LT
                   2463:           || code == LEU || code == LTU)
                   2464:     {
                   2465:       operands[7] = gen_rtx (code, DImode, operands[2], operands[3]);
                   2466:       operands[8] = gen_rtx (NE, VOIDmode, operands[6], const0_rtx);
                   2467:     }
                   2468:   else
                   2469:     {
                   2470:       operands[7] = gen_rtx (reverse_condition (code), DImode, operands[2],
                   2471:                             operands[3]);
                   2472:       operands[8] = gen_rtx (EQ, VOIDmode, operands[6], const0_rtx);
                   2473:     }
                   2474: }")
                   2475: 
                   2476: (define_split
                   2477:   [(set (match_operand:DI 0 "register_operand" "")
                   2478:        (if_then_else:DI
                   2479:         (match_operator 1 "comparison_operator"
                   2480:                         [(match_operand:SI 2 "reg_or_0_operand" "")
                   2481:                          (match_operand:SI 3 "reg_or_cint_operand" "")])
                   2482:         (match_operand:DI 4 "reg_or_8bit_operand" "")
                   2483:         (match_operand:DI 5 "reg_or_8bit_operand" "")))
                   2484:    (clobber (match_operand:DI 6 "register_operand" ""))]
                   2485:   "operands[3] != const0_rtx
                   2486:    && (GET_CODE (operands[1]) == EQ || GET_CODE (operands[1]) == NE)"
                   2487:   [(set (match_dup 6) (match_dup 7))
                   2488:    (set (match_dup 0)
                   2489:        (if_then_else:DI (match_dup 8) (match_dup 4) (match_dup 5)))]
                   2490:   "
                   2491: { enum rtx_code code = GET_CODE (operands[1]);
                   2492:   int unsignedp = (code == GEU || code == LEU || code == GTU || code == LTU);
                   2493:   rtx tem;
                   2494: 
                   2495:   if ((code != NE && code != EQ
                   2496:        && ! (extended_count (operands[2], DImode, unsignedp) >= 1
                   2497:             && extended_count (operands[3], DImode, unsignedp) >= 1)))
                   2498:     FAIL;
                   2499:  
                   2500:   if (GET_CODE (operands[3]) == CONST_INT)
                   2501:     tem = gen_rtx (PLUS, SImode, operands[2],
                   2502:                   GEN_INT (- INTVAL (operands[3])));
                   2503:   else
                   2504:     tem = gen_rtx (MINUS, SImode, operands[2], operands[3]);
                   2505: 
                   2506:   operands[7] = gen_rtx (SIGN_EXTEND, DImode, tem);
                   2507:   operands[8] = gen_rtx (GET_CODE (operands[1]), VOIDmode, operands[6],
                   2508:                         const0_rtx);
                   2509: }")
                   2510: 
                   2511: (define_split
                   2512:   [(set (pc)
                   2513:        (if_then_else
                   2514:         (match_operator 1 "comparison_operator"
                   2515:                         [(match_operand:DI 2 "reg_or_0_operand" "")
                   2516:                          (match_operand:DI 3 "reg_or_cint_operand" "")])
                   2517:         (label_ref (match_operand 0 "" ""))
                   2518:         (pc)))
                   2519:    (clobber (match_operand:DI 4 "register_operand" ""))]
                   2520:   "operands[3] != const0_rtx"
                   2521:   [(set (match_dup 4) (match_dup 5))
                   2522:    (set (pc) (if_then_else (match_dup 6) (label_ref (match_dup 0)) (pc)))]
                   2523:   "
                   2524: { enum rtx_code code = GET_CODE (operands[1]);
                   2525:   int unsignedp = (code == GEU || code == LEU || code == GTU || code == LTU);
                   2526: 
                   2527:   if (code == NE || code == EQ
                   2528:       || (extended_count (operands[2], DImode, unsignedp) >= 1
                   2529:          && extended_count (operands[3], DImode, unsignedp) >= 1))
                   2530:     {
                   2531:       if (GET_CODE (operands[3]) == CONST_INT)
                   2532:        operands[5] = gen_rtx (PLUS, DImode, operands[2],
                   2533:                               GEN_INT (- INTVAL (operands[3])));
                   2534:       else
                   2535:        operands[5] = gen_rtx (MINUS, DImode, operands[2], operands[3]);
                   2536: 
                   2537:       operands[6] = gen_rtx (code, VOIDmode, operands[4], const0_rtx);
                   2538:     }
                   2539: 
                   2540:   else if (code == EQ || code == LE || code == LT
                   2541:           || code == LEU || code == LTU)
                   2542:     {
                   2543:       operands[5] = gen_rtx (code, DImode, operands[2], operands[3]);
                   2544:       operands[6] = gen_rtx (NE, VOIDmode, operands[4], const0_rtx);
                   2545:     }
                   2546:   else
                   2547:     {
                   2548:       operands[5] = gen_rtx (reverse_condition (code), DImode, operands[2],
                   2549:                             operands[3]);
                   2550:       operands[6] = gen_rtx (EQ, VOIDmode, operands[4], const0_rtx);
                   2551:     }
                   2552: }")
                   2553: 
                   2554: (define_split
                   2555:   [(set (pc)
                   2556:        (if_then_else
                   2557:         (match_operator 1 "comparison_operator"
                   2558:                         [(match_operand:SI 2 "reg_or_0_operand" "")
                   2559:                          (match_operand:SI 3 "const_int_operand" "")])
                   2560:         (label_ref (match_operand 0 "" ""))
                   2561:         (pc)))
                   2562:    (clobber (match_operand:DI 4 "register_operand" ""))]
                   2563:   "operands[3] != const0_rtx
                   2564:    && (GET_CODE (operands[1]) == EQ || GET_CODE (operands[1]) == NE)"
                   2565:   [(set (match_dup 4) (match_dup 5))
                   2566:    (set (pc) (if_then_else (match_dup 6) (label_ref (match_dup 0)) (pc)))]
                   2567:   "
                   2568: { rtx tem;
                   2569: 
                   2570:   if (GET_CODE (operands[3]) == CONST_INT)
                   2571:     tem = gen_rtx (PLUS, SImode, operands[2],
                   2572:                   GEN_INT (- INTVAL (operands[3])));
                   2573:   else
                   2574:     tem = gen_rtx (MINUS, SImode, operands[2], operands[3]);
                   2575:   
                   2576:   operands[5] = gen_rtx (SIGN_EXTEND, DImode, tem);
                   2577:   operands[6] = gen_rtx (GET_CODE (operands[1]), VOIDmode,
                   2578:                         operands[4], const0_rtx);
                   2579: }")
1.1.1.3   root     2580: 
                   2581: ;; We can convert such things as "a > 0xffff" to "t = a & ~ 0xffff; t != 0".
                   2582: ;; This eliminates one, and sometimes two, insns when the AND can be done
                   2583: ;; with a ZAP.
                   2584: (define_split
                   2585:   [(set (match_operand:DI 0 "register_operand" "")
                   2586:        (match_operator 1 "comparison_operator"
                   2587:                        [(match_operand:DI 2 "register_operand" "")
                   2588:                         (match_operand:DI 3 "const_int_operand" "")]))
                   2589:    (clobber (match_operand:DI 4 "register_operand" ""))]
                   2590:   "exact_log2 (INTVAL (operands[3]) + 1) >= 0
                   2591:    && (GET_CODE (operands[1]) == GTU
                   2592:        || GET_CODE (operands[1]) == LEU
                   2593:        || ((GET_CODE (operands[1]) == GT || GET_CODE (operands[1]) == LE)
                   2594:           && extended_count (operands[2], DImode, 1) > 0))"
                   2595:   [(set (match_dup 4) (and:DI (match_dup 2) (match_dup 5)))
                   2596:    (set (match_dup 0) (match_dup 6))]
                   2597:   "
                   2598: {
                   2599:   operands[5] = GEN_INT (~ INTVAL (operands[3]));
                   2600:   operands[6] = gen_rtx (((GET_CODE (operands[1]) == GTU
                   2601:                           || GET_CODE (operands[1]) == GT)
                   2602:                          ? NE : EQ),
                   2603:                         DImode, operands[4], const0_rtx);
                   2604: }")
1.1       root     2605: 
1.1.1.4 ! root     2606: ;; Here are the CALL and unconditional branch insns.  Calls on NT and OSF
        !          2607: ;; work differently, so we have different patterns for each.
1.1       root     2608: 
                   2609: (define_expand "call"
1.1.1.4 ! root     2610:   [(use (match_operand:DI 0 "" ""))
        !          2611:    (use (match_operand 1 "" ""))]
        !          2612:   ""
        !          2613:   "
        !          2614: { if (WINDOWS_NT)
        !          2615:     emit_call_insn (gen_call_nt (operands[0], operands[1]));
        !          2616:   else
        !          2617:     emit_call_insn (gen_call_osf (operands[0], operands[1]));
        !          2618: 
        !          2619:   DONE;
        !          2620: }")
        !          2621: 
        !          2622: (define_expand "call_osf"
1.1.1.3   root     2623:   [(parallel [(call (mem:DI (match_operand 0 "" ""))
1.1       root     2624:                    (match_operand 1 "" ""))
1.1.1.3   root     2625:              (clobber (reg:DI 27))
1.1       root     2626:              (clobber (reg:DI 26))])]
                   2627:   ""
                   2628:   "
                   2629: { if (GET_CODE (operands[0]) != MEM)
                   2630:     abort ();
                   2631: 
1.1.1.3   root     2632:   operands[0] = XEXP (operands[0], 0);
1.1       root     2633: 
1.1.1.3   root     2634:   if (GET_CODE (operands[0]) != SYMBOL_REF
                   2635:       && ! (GET_CODE (operands[0]) == REG && REGNO (operands[0]) == 27))
                   2636:     {
                   2637:       rtx tem = gen_rtx (REG, DImode, 27);
                   2638:       emit_move_insn (tem, operands[0]);
                   2639:       operands[0] = tem;
                   2640:     }
1.1       root     2641: }")
                   2642: 
1.1.1.4 ! root     2643: (define_expand "call_nt"
        !          2644:   [(parallel [(call (mem:DI (match_operand:DI 0 "" ""))
        !          2645:                    (match_operand 1 "" ""))
        !          2646:              (clobber (reg:DI 26))])]
        !          2647:   ""
        !          2648:   "
        !          2649: { if (GET_CODE (operands[0]) != MEM)
        !          2650:     abort ();
        !          2651:   operands[0] = XEXP (operands[0], 0);
        !          2652: 
        !          2653:   if (GET_CODE (operands[1]) != SYMBOL_REF
        !          2654:       && ! (GET_CODE (operands[1]) == REG && REGNO (operands[1]) == 27))
        !          2655:     {
        !          2656:       rtx tem = gen_rtx (REG, DImode, 27);
        !          2657:       emit_move_insn (tem, operands[1]);
        !          2658:       operands[1] = tem;
        !          2659:     }
        !          2660: }")
        !          2661: 
1.1       root     2662: (define_expand "call_value"
1.1.1.4 ! root     2663:   [(use (match_operand 0 "" ""))
        !          2664:    (use (match_operand:DI 1 "" ""))
        !          2665:    (use (match_operand 2 "" ""))]
        !          2666:   ""
        !          2667:   "
        !          2668: { if (WINDOWS_NT)
        !          2669:     emit_call_insn (gen_call_value_nt (operands[0], operands[1], operands[2]));
        !          2670:   else
        !          2671:     emit_call_insn (gen_call_value_osf (operands[0], operands[1],
        !          2672:                                        operands[2]));
        !          2673:   DONE;
        !          2674: }")
        !          2675: 
        !          2676: (define_expand "call_value_osf"
1.1       root     2677:   [(parallel [(set (match_operand 0 "" "")
1.1.1.3   root     2678:                   (call (mem:DI (match_operand 1 "" ""))
1.1       root     2679:                         (match_operand 2 "" "")))
1.1.1.3   root     2680:              (clobber (reg:DI 27))
1.1       root     2681:              (clobber (reg:DI 26))])]
                   2682:   ""
                   2683:   "
                   2684: { if (GET_CODE (operands[1]) != MEM)
                   2685:     abort ();
                   2686: 
                   2687:   operands[1] = XEXP (operands[1], 0);
                   2688: 
1.1.1.3   root     2689:   if (GET_CODE (operands[1]) != SYMBOL_REF
                   2690:       && ! (GET_CODE (operands[1]) == REG && REGNO (operands[1]) == 27))
                   2691:     {
                   2692:       rtx tem = gen_rtx (REG, DImode, 27);
                   2693:       emit_move_insn (tem, operands[1]);
                   2694:       operands[1] = tem;
                   2695:     }
1.1       root     2696: }")
                   2697: 
1.1.1.4 ! root     2698: (define_expand "call_value_nt"
        !          2699:   [(parallel [(set (match_operand 0 "" "")
        !          2700:                   (call (mem:DI (match_operand:DI 1 "" ""))
        !          2701:                         (match_operand 2 "" "")))
        !          2702:              (clobber (reg:DI 26))])]
        !          2703:   ""
        !          2704:   "
        !          2705: { if (GET_CODE (operands[1]) != MEM)
        !          2706:     abort ();
        !          2707: 
        !          2708:   operands[1] = XEXP (operands[1], 0);
        !          2709:   if (GET_CODE (operands[1]) != SYMBOL_REF
        !          2710:       && ! (GET_CODE (operands[1]) == REG && REGNO (operands[1]) == 27))
        !          2711:     {
        !          2712:       rtx tem = gen_rtx (REG, DImode, 27);
        !          2713:       emit_move_insn (tem, operands[1]);
        !          2714:       operands[1] = tem;
        !          2715:     }
        !          2716: }")
        !          2717: 
1.1       root     2718: (define_insn ""
1.1.1.3   root     2719:   [(call (mem:DI (match_operand:DI 0 "call_operand" "r,R,i"))
                   2720:         (match_operand 1 "" ""))
                   2721:    (clobber (reg:DI 27))
1.1       root     2722:    (clobber (reg:DI 26))]
1.1.1.4 ! root     2723:   "! WINDOWS_NT"
1.1.1.3   root     2724:   "@
                   2725:    jsr $26,($27),0\;ldgp $29,0($26)
                   2726:    bsr $26,%0..ng
                   2727:    jsr $26,%0\;ldgp $29,0($26)"
                   2728:   [(set_attr "type" "jsr,jsr,ibr")])
1.1       root     2729:       
                   2730: (define_insn ""
1.1.1.4 ! root     2731:   [(call (mem:DI (match_operand:DI 0 "call_operand" "r,i"))
        !          2732:         (match_operand 1 "" ""))
        !          2733:    (clobber (reg:DI 26))]
        !          2734:   "WINDOWS_NT"
        !          2735:   "@
        !          2736:    jsr $26,(%0)
        !          2737:    bsr $26,%0"
        !          2738:   [(set_attr "type" "jsr")])
        !          2739:       
        !          2740: (define_insn ""
1.1.1.3   root     2741:   [(set (match_operand 0 "register_operand" "=rf,rf,rf")
                   2742:        (call (mem:DI (match_operand:DI 1 "call_operand" "r,R,i"))
1.1       root     2743:              (match_operand 2 "" "")))
1.1.1.3   root     2744:    (clobber (reg:DI 27))
1.1       root     2745:    (clobber (reg:DI 26))]
1.1.1.4 ! root     2746:   "! WINDOWS_NT"
1.1.1.3   root     2747:   "@
                   2748:    jsr $26,($27),0\;ldgp $29,0($26)
                   2749:    bsr $26,%1..ng
                   2750:    jsr $26,%1\;ldgp $29,0($26)"
                   2751:   [(set_attr "type" "jsr,jsr,ibr")])
1.1       root     2752: 
1.1.1.4 ! root     2753: (define_insn ""
        !          2754:   [(set (match_operand 0 "register_operand" "=rf,rf")
        !          2755:        (call (mem:DI (match_operand:DI 1 "call_operand" "r,i"))
        !          2756:              (match_operand 2 "" "")))
        !          2757:    (clobber (reg:DI 26))]
        !          2758:   "WINDOWS_NT"
        !          2759:   "@
        !          2760:    jsr $26,(%1)
        !          2761:    bsr $26,%1"
        !          2762:   [(set_attr "type" "jsr")])
        !          2763: 
1.1       root     2764: ;; Call subroutine returning any type.
                   2765: 
                   2766: (define_expand "untyped_call"
                   2767:   [(parallel [(call (match_operand 0 "" "")
                   2768:                    (const_int 0))
                   2769:              (match_operand 1 "" "")
                   2770:              (match_operand 2 "" "")])]
                   2771:   ""
                   2772:   "
                   2773: {
                   2774:   int i;
                   2775: 
                   2776:   emit_call_insn (gen_call (operands[0], const0_rtx, NULL, const0_rtx));
                   2777: 
                   2778:   for (i = 0; i < XVECLEN (operands[2], 0); i++)
                   2779:     {
                   2780:       rtx set = XVECEXP (operands[2], 0, i);
                   2781:       emit_move_insn (SET_DEST (set), SET_SRC (set));
                   2782:     }
                   2783: 
                   2784:   /* The optimizer does not know that the call sets the function value
                   2785:      registers we stored in the result block.  We avoid problems by
                   2786:      claiming that all hard registers are used and clobbered at this
                   2787:      point.  */
                   2788:   emit_insn (gen_blockage ());
                   2789: 
                   2790:   DONE;
                   2791: }")
                   2792: 
                   2793: ;; UNSPEC_VOLATILE is considered to use and clobber all hard registers and
                   2794: ;; all of memory.  This blocks insns from being moved across this point.
                   2795: 
                   2796: (define_insn "blockage"
                   2797:   [(unspec_volatile [(const_int 0)] 1)]
                   2798:   ""
                   2799:   "")
                   2800: 
                   2801: (define_insn "jump"
                   2802:   [(set (pc)
                   2803:        (label_ref (match_operand 0 "" "")))]
                   2804:   ""
                   2805:   "br $31,%l0"
                   2806:   [(set_attr "type" "ibr")])
                   2807: 
                   2808: (define_insn "return"
                   2809:   [(return)]
                   2810:   "direct_return ()"
                   2811:   "ret $31,($26),1"
                   2812:   [(set_attr "type" "ibr")])
                   2813: 
                   2814: (define_insn "indirect_jump"
                   2815:   [(set (pc) (match_operand:DI 0 "register_operand" "r"))]
                   2816:   ""
                   2817:   "jmp $31,(%0),0"
                   2818:   [(set_attr "type" "ibr")])
                   2819: 
                   2820: (define_insn "nop"
                   2821:   [(const_int 0)]
                   2822:   ""
                   2823:   "bis $31,$31,$31"
                   2824:   [(set_attr "type" "iaddlog")])
                   2825: 
                   2826: (define_expand "tablejump"
1.1.1.4 ! root     2827:   [(use (match_operand:SI 0 "register_operand" ""))
        !          2828:    (use (match_operand:SI 1 "" ""))]
        !          2829:   ""
        !          2830:   "
        !          2831: {
        !          2832:   if (WINDOWS_NT)
        !          2833:     emit_jump_insn (gen_tablejump_nt (operands[0], operands[1]));
        !          2834:   else
        !          2835:     emit_jump_insn (gen_tablejump_osf (operands[0], operands[1]));
        !          2836: 
        !          2837:   DONE;
        !          2838: }")
        !          2839: 
        !          2840: (define_expand "tablejump_osf"
1.1       root     2841:   [(set (match_dup 3)
                   2842:        (sign_extend:DI (match_operand:SI 0 "register_operand" "")))
1.1.1.3   root     2843:    (parallel [(set (pc)
                   2844:                   (plus:DI (match_dup 3)
                   2845:                            (label_ref:DI (match_operand 1 "" ""))))
1.1       root     2846:              (clobber (match_scratch:DI 2 "=r"))])]
                   2847:   ""
                   2848:   "
                   2849: { operands[3] = gen_reg_rtx (DImode); }")
                   2850: 
1.1.1.4 ! root     2851: (define_expand "tablejump_nt"
        !          2852:   [(set (match_dup 3)
        !          2853:        (sign_extend:DI (match_operand:SI 0 "register_operand" "")))
        !          2854:    (parallel [(set (pc)
        !          2855:                   (match_dup 3))
        !          2856:              (use (label_ref (match_operand 1 "" "")))])]
        !          2857:   ""
        !          2858:   "
        !          2859: { operands[3] = gen_reg_rtx (DImode); }")
        !          2860: 
1.1       root     2861: (define_insn ""
                   2862:   [(set (pc)
                   2863:        (plus:DI (match_operand:DI 0 "register_operand" "r")
1.1.1.3   root     2864:                 (label_ref:DI (match_operand 1 "" ""))))
1.1       root     2865:    (clobber (match_scratch:DI 2 "=r"))]
1.1.1.4 ! root     2866:   "! WINDOWS_NT && next_active_insn (insn) != 0
1.1.1.3   root     2867:    && GET_CODE (PATTERN (next_active_insn (insn))) == ADDR_DIFF_VEC
                   2868:    && PREV_INSN (next_active_insn (insn)) == operands[1]"
1.1       root     2869:   "*
                   2870: { rtx best_label = 0;
                   2871:   rtx jump_table_insn = next_active_insn (operands[1]);
                   2872: 
                   2873:   if (GET_CODE (jump_table_insn) == JUMP_INSN
1.1.1.3   root     2874:       && GET_CODE (PATTERN (jump_table_insn)) == ADDR_DIFF_VEC)
1.1       root     2875:     {
                   2876:       rtx jump_table = PATTERN (jump_table_insn);
1.1.1.3   root     2877:       int n_labels = XVECLEN (jump_table, 1);
1.1       root     2878:       int best_count = -1;
                   2879:       int i, j;
                   2880: 
                   2881:       for (i = 0; i < n_labels; i++)
                   2882:        {
                   2883:          int count = 1;
                   2884: 
                   2885:          for (j = i + 1; j < n_labels; j++)
1.1.1.3   root     2886:            if (XEXP (XVECEXP (jump_table, 1, i), 0)
                   2887:                == XEXP (XVECEXP (jump_table, 1, j), 0))
1.1       root     2888:              count++;
                   2889: 
                   2890:          if (count > best_count)
1.1.1.3   root     2891:            best_count = count, best_label = XVECEXP (jump_table, 1, i);
1.1       root     2892:        }
                   2893:     }
                   2894: 
                   2895:   if (best_label)
                   2896:     {
                   2897:       operands[3] = best_label;
                   2898:       return \"addq %0,$29,%2\;jmp $31,(%2),%3\";
                   2899:     }
                   2900:   else
                   2901:     return \"addq %0,$29,%2\;jmp $31,(%2),0\";
                   2902: }"
                   2903:   [(set_attr "type" "ibr")])
                   2904: 
1.1.1.4 ! root     2905: (define_insn ""
        !          2906:   [(set (pc)
        !          2907:        (match_operand:DI 0 "register_operand" "r"))
        !          2908:    (use (label_ref (match_operand 1 "" "")))]
        !          2909:   "WINDOWS_NT && next_active_insn (insn) != 0
        !          2910:    && GET_CODE (PATTERN (next_active_insn (insn))) == ADDR_DIFF_VEC
        !          2911:    && PREV_INSN (next_active_insn (insn)) == operands[1]"
        !          2912:   "*
        !          2913: { rtx best_label = 0;
        !          2914:   rtx jump_table_insn = next_active_insn (operands[1]);
        !          2915: 
        !          2916:   if (GET_CODE (jump_table_insn) == JUMP_INSN
        !          2917:       && GET_CODE (PATTERN (jump_table_insn)) == ADDR_DIFF_VEC)
        !          2918:     {
        !          2919:       rtx jump_table = PATTERN (jump_table_insn);
        !          2920:       int n_labels = XVECLEN (jump_table, 1);
        !          2921:       int best_count = -1;
        !          2922:       int i, j;
        !          2923: 
        !          2924:       for (i = 0; i < n_labels; i++)
        !          2925:        {
        !          2926:          int count = 1;
        !          2927: 
        !          2928:          for (j = i + 1; j < n_labels; j++)
        !          2929:            if (XEXP (XVECEXP (jump_table, 1, i), 0)
        !          2930:                == XEXP (XVECEXP (jump_table, 1, j), 0))
        !          2931:              count++;
        !          2932: 
        !          2933:          if (count > best_count)
        !          2934:            best_count = count, best_label = XVECEXP (jump_table, 1, i);
        !          2935:        }
        !          2936:     }
        !          2937: 
        !          2938:   if (best_label)
        !          2939:     {
        !          2940:       operands[2] = best_label;
        !          2941:       return \"jmp $31,(%0),%2\";
        !          2942:     }
        !          2943:   else
        !          2944:     return \"jmp $31,(%0),0\";
        !          2945: }"
        !          2946:   [(set_attr "type" "ibr")])
        !          2947: 
1.1       root     2948: ;; Cache flush.  Used by INITIALIZE_TRAMPOLINE.  0x86 is PAL_imb, but we don't
                   2949: ;; want to have to include pal.h in our .s file.
                   2950: (define_insn ""
                   2951:   [(unspec_volatile [(const_int 0)] 0)]
                   2952:   ""
                   2953:   "call_pal 0x86")
                   2954: 
                   2955: ;; Finally, we have the basic data motion insns.  The byte and word insns
                   2956: ;; are done via define_expand.  Start with the floating-point insns, since
                   2957: ;; they are simpler.
                   2958: 
                   2959: (define_insn ""
                   2960:   [(set (match_operand:SF 0 "nonimmediate_operand" "=r,r,m,f,f,f,m")
1.1.1.2   root     2961:        (match_operand:SF 1 "input_operand" "rG,m,rG,f,G,m,fG"))]
1.1       root     2962:   "register_operand (operands[0], SFmode)
                   2963:    || reg_or_fp0_operand (operands[1], SFmode)"
                   2964:   "@
1.1.1.2   root     2965:    bis %r1,%r1,%0
1.1       root     2966:    ldl %0,%1
                   2967:    stl %r1,%0
                   2968:    cpys %1,%1,%0
                   2969:    cpys $f31,$f31,%0
                   2970:    lds %0,%1
                   2971:    sts %R1,%0"
                   2972:   [(set_attr "type" "iaddlog,ld,st,fpop,fpop,ld,st")])
                   2973: 
                   2974: (define_insn ""
                   2975:   [(set (match_operand:DF 0 "nonimmediate_operand" "=r,r,m,f,f,f,m")
1.1.1.2   root     2976:        (match_operand:DF 1 "input_operand" "rG,m,rG,f,G,m,fG"))]
1.1       root     2977:   "register_operand (operands[0], DFmode)
                   2978:    || reg_or_fp0_operand (operands[1], DFmode)"
                   2979:   "@
1.1.1.2   root     2980:    bis %r1,%r1,%0
1.1       root     2981:    ldq %0,%1
                   2982:    stq %r1,%0
                   2983:    cpys %1,%1,%0
                   2984:    cpys $f31,$f31,%0
                   2985:    ldt %0,%1
                   2986:    stt %R1,%0"
                   2987:   [(set_attr "type" "iaddlog,ld,st,fpop,fpop,ld,st")])
                   2988: 
                   2989: (define_expand "movsf"
                   2990:   [(set (match_operand:SF 0 "nonimmediate_operand" "")
                   2991:        (match_operand:SF 1 "general_operand" ""))]
                   2992:   ""
                   2993:   "
                   2994: {
                   2995:   if (GET_CODE (operands[0]) == MEM
                   2996:       && ! reg_or_fp0_operand (operands[1], SFmode))
                   2997:     operands[1] = force_reg (SFmode, operands[1]);
                   2998: }")
                   2999: 
                   3000: (define_expand "movdf"
                   3001:   [(set (match_operand:DF 0 "nonimmediate_operand" "")
                   3002:        (match_operand:DF 1 "general_operand" ""))]
                   3003:   ""
                   3004:   "
                   3005: {
                   3006:   if (GET_CODE (operands[0]) == MEM
                   3007:       && ! reg_or_fp0_operand (operands[1], DFmode))
                   3008:     operands[1] = force_reg (DFmode, operands[1]);
                   3009: }")
                   3010: 
1.1.1.4 ! root     3011: (define_insn ""
        !          3012:   [(set (match_operand:SI 0 "nonimmediate_operand" "=r,r,r,r,r,r,m,f,f,f,m")
        !          3013:        (match_operand:SI 1 "input_operand" "r,J,I,K,L,m,rJ,f,J,m,fG"))]
        !          3014:   "! WINDOWS_NT && (register_operand (operands[0], SImode)
        !          3015:                    || reg_or_0_operand (operands[1], SImode))"
        !          3016:   "@
        !          3017:    bis %1,%1,%0
        !          3018:    bis $31,$31,%0
        !          3019:    bis $31,%1,%0
        !          3020:    lda %0,%1
        !          3021:    ldah %0,%h1
        !          3022:    ldl %0,%1
        !          3023:    stl %r1,%0
        !          3024:    cpys %1,%1,%0
        !          3025:    cpys $f31,$f31,%0
        !          3026:    lds %0,%1
        !          3027:    sts %R1,%0"
        !          3028:   [(set_attr "type" "iaddlog,iaddlog,iaddlog,iaddlog,iaddlog,ld,st,fpop,fpop,ld,st")])
1.1       root     3029: 
                   3030: (define_insn ""
1.1.1.4 ! root     3031:   [(set (match_operand:SI 0 "nonimmediate_operand" "=r,r,r,r,r,r,r,m,f,f,f,m")
        !          3032:        (match_operand:SI 1 "input_operand" "r,J,I,K,L,s,m,rJ,f,J,m,fG"))]
        !          3033:   "WINDOWS_NT && (register_operand (operands[0], SImode)
        !          3034:                  || reg_or_0_operand (operands[1], SImode))"
1.1       root     3035:   "@
                   3036:    bis %1,%1,%0
                   3037:    bis $31,$31,%0
                   3038:    bis $31,%1,%0
                   3039:    lda %0,%1
                   3040:    ldah %0,%h1
1.1.1.4 ! root     3041:    lda %0,%1
1.1       root     3042:    ldl %0,%1
                   3043:    stl %r1,%0
                   3044:    cpys %1,%1,%0
                   3045:    cpys $f31,$f31,%0
1.1.1.4 ! root     3046:    lds %0,%1
        !          3047:    sts %R1,%0"
        !          3048:   [(set_attr "type" "iaddlog,iaddlog,iaddlog,iaddlog,iaddlog,ldsym,ld,st,fpop,fpop,ld,st")])
1.1       root     3049: 
                   3050: (define_insn ""
                   3051:   [(set (match_operand:HI 0 "nonimmediate_operand" "=r,r,r,r,f,f")
                   3052:        (match_operand:HI 1 "input_operand" "r,J,I,n,f,J"))]
                   3053:   "register_operand (operands[0], HImode)
                   3054:    || register_operand (operands[1], HImode)"
                   3055:   "@
                   3056:    bis %1,%1,%0
                   3057:    bis $31,$31,%0
                   3058:    bis $31,%1,%0
                   3059:    lda %0,%L1
                   3060:    cpys %1,%1,%0
                   3061:    cpys $f31,$f31,%0"
                   3062:   [(set_attr "type" "iaddlog,iaddlog,iaddlog,iaddlog,fpop,fpop")])
                   3063: 
                   3064: (define_insn ""
                   3065:   [(set (match_operand:QI 0 "nonimmediate_operand" "=r,r,r,r,f,f")
                   3066:        (match_operand:QI 1 "input_operand" "r,J,I,n,f,J"))]
                   3067:   "register_operand (operands[0], QImode)
                   3068:    || register_operand (operands[1], QImode)"
                   3069:   "@
                   3070:    bis %1,%1,%0
                   3071:    bis $31,$31,%0
                   3072:    bis $31,%1,%0
                   3073:    lda %0,%L1
                   3074:    cpys %1,%1,%0
                   3075:    cpys $f31,$f31,%0"
                   3076:   [(set_attr "type" "iaddlog,iaddlog,iaddlog,iaddlog,fpop,fpop")])
                   3077: 
                   3078: ;; We do two major things here: handle mem->mem and construct long
                   3079: ;; constants.
                   3080: 
                   3081: (define_expand "movsi"
                   3082:   [(set (match_operand:SI 0 "general_operand" "")
                   3083:        (match_operand:SI 1 "general_operand" ""))]
                   3084:   ""
                   3085:   "
                   3086: {
                   3087:   if (GET_CODE (operands[0]) == MEM
                   3088:       && ! reg_or_0_operand (operands[1], SImode))
                   3089:     operands[1] = force_reg (SImode, operands[1]);
                   3090: 
                   3091:   if (! CONSTANT_P (operands[1]) || input_operand (operands[1], SImode))
                   3092:     ;
                   3093:   else if (GET_CODE (operands[1]) == CONST_INT)
                   3094:     {
1.1.1.4 ! root     3095:       operands[1]
        !          3096:        = alpha_emit_set_const (operands[0], SImode, INTVAL (operands[1]), 3);
        !          3097:       if (rtx_equal_p (operands[0], operands[1]))
1.1       root     3098:        DONE;
                   3099:     }
                   3100: }")
                   3101: 
                   3102: ;; Split a load of a large constant into the appropriate two-insn
                   3103: ;; sequence.
                   3104: 
                   3105: (define_split
                   3106:   [(set (match_operand:SI 0 "register_operand" "")
                   3107:        (match_operand:SI 1 "const_int_operand" ""))]
                   3108:   "! add_operand (operands[1], SImode)"
                   3109:   [(set (match_dup 0) (match_dup 2))
                   3110:    (set (match_dup 0) (plus:SI (match_dup 0) (match_dup 3)))]
                   3111:   "
1.1.1.4 ! root     3112: { rtx tem
        !          3113:     = alpha_emit_set_const (operands[0], SImode, INTVAL (operands[1]), 2);
        !          3114: 
        !          3115:   if (tem == operands[0])
1.1       root     3116:     DONE;
                   3117:   else
                   3118:     FAIL;
                   3119: }")
                   3120: 
                   3121: (define_insn ""
1.1.1.2   root     3122:   [(set (match_operand:DI 0 "general_operand" "=r,r,r,r,r,r,r,m,f,f,f,Q")
                   3123:        (match_operand:DI 1 "input_operand" "r,J,I,K,L,s,m,rJ,f,J,Q,fG"))]
1.1       root     3124:   "register_operand (operands[0], DImode)
                   3125:    || reg_or_0_operand (operands[1], DImode)"
                   3126:   "@
                   3127:    bis %1,%1,%0
                   3128:    bis $31,$31,%0
                   3129:    bis $31,%1,%0
                   3130:    lda %0,%1
                   3131:    ldah %0,%h1
                   3132:    lda %0,%1
                   3133:    ldq%A1 %0,%1
                   3134:    stq%A0 %r1,%0
                   3135:    cpys %1,%1,%0
                   3136:    cpys $f31,$f31,%0
                   3137:    ldt %0,%1
                   3138:    stt %R1,%0"
                   3139:   [(set_attr "type" "iaddlog,iaddlog,iaddlog,iaddlog,iaddlog,ldsym,ld,st,fpop,fpop,ld,st")])
                   3140: 
                   3141: ;; We do three major things here: handle mem->mem, put 64-bit constants in
                   3142: ;; memory, and construct long 32-bit constants.
                   3143: 
                   3144: (define_expand "movdi"
                   3145:   [(set (match_operand:DI 0 "general_operand" "")
                   3146:        (match_operand:DI 1 "general_operand" ""))]
                   3147:   ""
                   3148:   "
                   3149: {
1.1.1.4 ! root     3150:   rtx tem;
        !          3151: 
1.1       root     3152:   if (GET_CODE (operands[0]) == MEM
                   3153:       && ! reg_or_0_operand (operands[1], DImode))
                   3154:     operands[1] = force_reg (DImode, operands[1]);
                   3155: 
                   3156:   if (! CONSTANT_P (operands[1]) || input_operand (operands[1], DImode))
                   3157:     ;
                   3158:   else if (GET_CODE (operands[1]) == CONST_INT
1.1.1.4 ! root     3159:           && (tem = alpha_emit_set_const (operands[0], DImode,
        !          3160:                                           INTVAL (operands[1]), 3)) != 0)
        !          3161:     {
        !          3162:       if (rtx_equal_p (tem, operands[0]))
        !          3163:        DONE;
        !          3164:       else
        !          3165:        operands[1] = tem;
        !          3166:     }
1.1       root     3167:   else if (CONSTANT_P (operands[1]))
                   3168:     {
                   3169:       operands[1] = force_const_mem (DImode, operands[1]);
                   3170:       if (reload_in_progress)
                   3171:        {
                   3172:          emit_move_insn (operands[0], XEXP (operands[1], 0));
1.1.1.4 ! root     3173:          operands[1] = copy_rtx (operands[1]);
1.1       root     3174:          XEXP (operands[1], 0) = operands[0];
                   3175:        }
                   3176:       else
                   3177:        operands[1] = validize_mem (operands[1]);
                   3178:     }
                   3179:   else
                   3180:     abort ();
                   3181: }")
                   3182: 
                   3183: ;; Split a load of a large constant into the appropriate two-insn
                   3184: ;; sequence.
                   3185: 
                   3186: (define_split
                   3187:   [(set (match_operand:DI 0 "register_operand" "")
                   3188:        (match_operand:DI 1 "const_int_operand" ""))]
                   3189:   "! add_operand (operands[1], DImode)"
                   3190:   [(set (match_dup 0) (match_dup 2))
                   3191:    (set (match_dup 0) (plus:DI (match_dup 0) (match_dup 3)))]
                   3192:   "
1.1.1.4 ! root     3193: { rtx tem
        !          3194:     = alpha_emit_set_const (operands[0], DImode, INTVAL (operands[1]), 2);
        !          3195: 
        !          3196:   if (tem == operands[0])
1.1       root     3197:     DONE;
                   3198:   else
                   3199:     FAIL;
                   3200: }")
                   3201: 
                   3202: ;; These are the partial-word cases.
                   3203: ;;
                   3204: ;; First we have the code to load an aligned word.  Operand 0 is the register
                   3205: ;; in which to place the result.  It's mode is QImode or HImode.  Operand 1
                   3206: ;; is an SImode MEM at the low-order byte of the proper word.  Operand 2 is the
                   3207: ;; number of bits within the word that the value is.  Operand 3 is an SImode
                   3208: ;; scratch register.  If operand 0 is a hard register, operand 3 may be the
                   3209: ;; same register.  It is allowed to conflict with operand 1 as well.
                   3210: 
                   3211: (define_expand "aligned_loadqi"
                   3212:   [(set (match_operand:SI 3 "register_operand" "")
                   3213:        (match_operand:SI 1 "memory_operand" ""))
                   3214:    (set (subreg:DI (match_operand:QI 0 "register_operand" "") 0)
                   3215:        (zero_extract:DI (subreg:DI (match_dup 3) 0)
                   3216:                         (const_int 8)
                   3217:                         (match_operand:DI 2 "const_int_operand" "")))]
                   3218:         
                   3219:   ""
                   3220:   "")
                   3221:   
                   3222: (define_expand "aligned_loadhi"
                   3223:   [(set (match_operand:SI 3 "register_operand" "")
                   3224:        (match_operand:SI 1 "memory_operand" ""))
                   3225:    (set (subreg:DI (match_operand:HI 0 "register_operand" "") 0)
                   3226:        (zero_extract:DI (subreg:DI (match_dup 3) 0)
                   3227:                         (const_int 16)
                   3228:                         (match_operand:DI 2 "const_int_operand" "")))]
                   3229:         
                   3230:   ""
                   3231:   "")
                   3232:   
                   3233: ;; Similar for unaligned loads.  For QImode, we use the sequence from the
                   3234: ;; Alpha Architecture manual.  However, for HImode, we do not.  HImode pointers
                   3235: ;; are normally aligned to the byte boundary, so an HImode object cannot
                   3236: ;; cross a longword boundary.  We could use a sequence similar to that for
                   3237: ;; QImode, but that would fail if the pointer, was, in fact, not aligned.
                   3238: ;; Instead, we clear bit 1 in the address and do an ldl.  If the low-order
                   3239: ;; bit was not aligned, this will trap and the trap handler will do what is
                   3240: ;; needed.
                   3241: ;;
                   3242: ;; Here operand 1 is the address.  Operands 2 and 3 are temporaries, where
                   3243: ;; operand 3 can overlap the input and output registers.
                   3244: 
                   3245: (define_expand "unaligned_loadqi"
                   3246:   [(set (match_operand:DI 2 "register_operand" "")
                   3247:        (mem:DI (and:DI (match_operand:DI 1 "address_operand" "")
                   3248:                        (const_int -8))))
                   3249:    (set (match_operand:DI 3 "register_operand" "")
                   3250:        (match_dup 1))
                   3251:    (set (subreg:DI (match_operand:QI 0 "register_operand" "") 0)
                   3252:        (zero_extract:DI (match_dup 2)
                   3253:                         (const_int 8)
                   3254:                         (ashift:DI (match_dup 3) (const_int 3))))]
                   3255:   ""
                   3256:   "")
                   3257: 
                   3258: ;; For this, the address must already be in a register.  We also need two
                   3259: ;; DImode temporaries, neither of which may overlap the input (and hence the
                   3260: ;; output, since they might be the same register), but both of which may
                   3261: ;; be the same.
                   3262: 
                   3263: (define_expand "unaligned_loadhi"
                   3264:   [(set (match_operand:DI 2 "register_operand" "")
                   3265:        (and:DI (match_operand:DI 1 "register_operand" "")
                   3266:                (const_int -7)))
                   3267:    (set (match_operand:DI 3 "register_operand" "")
                   3268:        (mem:DI (match_dup 2)))
1.1.1.3   root     3269:    (set (match_operand:DI 4 "register_operand" "")
                   3270:        (and:DI (match_dup 1) (const_int -2)))
1.1       root     3271:    (set (subreg:DI (match_operand:HI 0 "register_operand" "") 0)
                   3272:        (zero_extract:DI (match_dup 3)
                   3273:                         (const_int 16)
1.1.1.3   root     3274:                         (ashift:DI (match_dup 4) (const_int 3))))]
1.1       root     3275:   ""
                   3276:   "")
                   3277:        
                   3278: ;; Storing an aligned byte or word requires two temporaries.  Operand 0 is the
                   3279: ;; aligned SImode MEM.  Operand 1 is the register containing the 
                   3280: ;; byte or word to store.  Operand 2 is the number of bits within the word that
                   3281: ;; the value should be placed.  Operands 3 and 4 are SImode temporaries.
                   3282: 
                   3283: (define_expand "aligned_store"
                   3284:   [(set (match_operand:SI 3 "register_operand" "")
                   3285:        (match_operand:SI 0 "memory_operand" ""))
                   3286:    (set (subreg:DI (match_dup 3) 0)
                   3287:        (and:DI (subreg:DI (match_dup 3) 0) (match_dup 5)))
                   3288:    (set (subreg:DI (match_operand:SI 4 "register_operand" "") 0)
                   3289:        (ashift:DI (zero_extend:DI (match_operand 1 "register_operand" ""))
                   3290:                   (match_operand:DI 2 "const_int_operand" "")))
                   3291:    (set (subreg:DI (match_dup 4) 0)
                   3292:        (ior:DI (subreg:DI (match_dup 4) 0) (subreg:DI (match_dup 3) 0)))
                   3293:    (set (match_dup 0) (match_dup 4))]
                   3294:   ""
                   3295:   "
                   3296: { operands[5] = GEN_INT (~ (GET_MODE_MASK (GET_MODE (operands[1]))
                   3297:                            << INTVAL (operands[2])));
                   3298: }")
                   3299: 
                   3300: ;; For the unaligned byte case, we use code similar to that in the
                   3301: ;; Architecture book, but reordered to lower the number of registers
                   3302: ;; required.  Operand 0 is the address.  Operand 1 is the data to store.
1.1.1.3   root     3303: ;; Operands 2, 3, and 4 are DImode temporaries, where operands 2 and 4 may
1.1       root     3304: ;; be the same temporary, if desired.  If the address is in a register,
                   3305: ;; operand 2 can be that register.
                   3306: 
                   3307: (define_expand "unaligned_storeqi"
                   3308:   [(set (match_operand:DI 3 "register_operand" "")
                   3309:        (mem:DI (and:DI (match_operand:DI 0 "address_operand" "")
                   3310:                        (const_int -8))))
                   3311:    (set (match_operand:DI 2 "register_operand" "")
                   3312:        (match_dup 0))
                   3313:    (set (match_dup 3)
1.1.1.3   root     3314:        (and:DI (not:DI (ashift:DI (const_int 255)
                   3315:                                   (ashift:DI (match_dup 2) (const_int 3))))
1.1       root     3316:                (match_dup 3)))
                   3317:    (set (match_operand:DI 4 "register_operand" "")
                   3318:        (ashift:DI (zero_extend:DI (match_operand:QI 1 "register_operand" ""))
                   3319:                   (ashift:DI (match_dup 2) (const_int 3))))
                   3320:    (set (match_dup 4) (ior:DI (match_dup 4) (match_dup 3)))
                   3321:    (set (mem:DI (and:DI (match_dup 0) (const_int -8)))
                   3322:        (match_dup 4))]
                   3323:   ""
                   3324:   "")
                   3325: 
                   3326: ;; This is the code for storing into an unaligned short.  It uses the same
                   3327: ;; trick as loading from an unaligned short.  It needs lots of temporaries.
                   3328: ;; However, during reload, we only have two registers available.  So we
                   3329: ;; repeat code so that only two temporaries are available.  During RTL
                   3330: ;; generation, we can use different pseudos for each temporary and CSE
                   3331: ;; will remove the redundancies.  During reload, we have to settle with
                   3332: ;; what we get.  Luckily, unaligned accesses of this kind produced during
                   3333: ;; reload are quite rare.
                   3334: ;;
                   3335: ;; Operand 0 is the address of the memory location.  Operand 1 contains the
                   3336: ;; data to store.  The rest of the operands are all temporaries, with
                   3337: ;; various overlap possibilities during reload.  See reload_outhi for
                   3338: ;; details of this use.
                   3339: 
                   3340: (define_expand "unaligned_storehi"
                   3341:   [(set (match_operand:DI 2 "register_operand" "")
                   3342:        (match_operand:DI 0 "address_operand" ""))
                   3343:    (set (match_operand:DI 3 "register_operand" "")
                   3344:        (and:DI (match_dup 2) (const_int -7)))
                   3345:    (set (match_operand:DI 4 "register_operand" "")
                   3346:        (mem:DI (match_dup 3)))
1.1.1.3   root     3347:    (set (match_operand:DI 10 "register_operand" "")
                   3348:        (and:DI (match_dup 2) (const_int -2)))
1.1       root     3349:    (set (match_operand:DI 5 "register_operand" "")
1.1.1.3   root     3350:        (and:DI (not:DI (ashift:DI (const_int 65535)
                   3351:                                   (ashift:DI (match_dup 10) (const_int 3))))
1.1       root     3352:                (match_dup 4)))
                   3353:    (set (match_operand:DI 6 "register_operand" "")
                   3354:        (ashift:DI (zero_extend:DI (match_operand:HI 1 "register_operand" ""))
1.1.1.3   root     3355:                   (ashift:DI (match_dup 10) (const_int 3))))
1.1       root     3356:    (set (match_operand:DI 7 "register_operand" "")
                   3357:        (ior:DI (match_dup 5) (match_dup 6)))
                   3358:    (set (match_operand:DI 8 "register_operand" "") (match_dup 0))
                   3359:    (set (match_operand:DI 9 "register_operand" "")
                   3360:        (and:DI (match_dup 8) (const_int -7)))
                   3361:    (set (mem:DI (match_dup 9)) (match_dup 7))]
                   3362:   ""
                   3363:   "")
                   3364: 
                   3365: ;; Here are the define_expand's for QI and HI moves that use the above
                   3366: ;; patterns.  We have the normal sets, plus the ones that need scratch
                   3367: ;; registers for reload.
                   3368: 
                   3369: (define_expand "movqi"
                   3370:   [(set (match_operand:QI 0 "general_operand" "")
                   3371:        (match_operand:QI 1 "general_operand" ""))]
                   3372:   ""
                   3373:   "
                   3374: { extern rtx get_unaligned_address ();
                   3375: 
                   3376:   /* If the output is not a register, the input must be.  */
                   3377:   if (GET_CODE (operands[0]) == MEM)
                   3378:     operands[1] = force_reg (QImode, operands[1]);
                   3379: 
                   3380:   /* Handle four memory cases, unaligned and aligned for either the input
                   3381:      or the output.  The only case where we can be called during reload is
                   3382:      for aligned loads; all other cases require temporaries.  */
                   3383: 
                   3384:   if (GET_CODE (operands[1]) == MEM
                   3385:       || (GET_CODE (operands[1]) == SUBREG
                   3386:          && GET_CODE (SUBREG_REG (operands[1])) == MEM)
                   3387:       || (reload_in_progress && GET_CODE (operands[1]) == REG
                   3388:          && REGNO (operands[1]) >= FIRST_PSEUDO_REGISTER)
                   3389:       || (reload_in_progress && GET_CODE (operands[1]) == SUBREG
                   3390:          && GET_CODE (SUBREG_REG (operands[1])) == REG
                   3391:          && REGNO (SUBREG_REG (operands[1])) >= FIRST_PSEUDO_REGISTER))
                   3392:     {
                   3393:       if (aligned_memory_operand (operands[1], QImode))
                   3394:        {
                   3395:          rtx aligned_mem, bitnum;
                   3396:          rtx scratch = (reload_in_progress
                   3397:                         ? gen_rtx (REG, SImode, REGNO (operands[0]))
                   3398:                         : gen_reg_rtx (SImode));
                   3399: 
                   3400:          get_aligned_mem (operands[1], &aligned_mem, &bitnum);
                   3401: 
                   3402:          emit_insn (gen_aligned_loadqi (operands[0], aligned_mem, bitnum,
                   3403:                                         scratch));
                   3404:        }
                   3405:       else
                   3406:        {
                   3407:          /* Don't pass these as parameters since that makes the generated
                   3408:             code depend on parameter evaluation order which will cause
                   3409:             bootstrap failures.  */
                   3410: 
                   3411:          rtx temp1 = gen_reg_rtx (DImode);
                   3412:          rtx temp2 = gen_reg_rtx (DImode);
                   3413:          rtx seq = gen_unaligned_loadqi (operands[0],
                   3414:                                          get_unaligned_address (operands[1]),
                   3415:                                          temp1, temp2);
                   3416: 
                   3417:          alpha_set_memflags (seq, operands[1]);
                   3418:          emit_insn (seq);
                   3419:        }
                   3420: 
                   3421:       DONE;
                   3422:     }
                   3423: 
                   3424:   else if (GET_CODE (operands[0]) == MEM
                   3425:           || (GET_CODE (operands[0]) == SUBREG 
                   3426:               && GET_CODE (SUBREG_REG (operands[0])) == MEM)
                   3427:           || (reload_in_progress && GET_CODE (operands[0]) == REG
                   3428:               && REGNO (operands[0]) >= FIRST_PSEUDO_REGISTER)
                   3429:           || (reload_in_progress && GET_CODE (operands[0]) == SUBREG
                   3430:               && GET_CODE (SUBREG_REG (operands[0])) == REG
                   3431:               && REGNO (operands[0]) >= FIRST_PSEUDO_REGISTER))
                   3432:     {
                   3433:       if (aligned_memory_operand (operands[0], QImode))
                   3434:        {
                   3435:          rtx aligned_mem, bitnum;
                   3436:          rtx temp1 = gen_reg_rtx (SImode);
                   3437:          rtx temp2 = gen_reg_rtx (SImode);
                   3438: 
                   3439:          get_aligned_mem (operands[0], &aligned_mem, &bitnum);
                   3440: 
                   3441:          emit_insn (gen_aligned_store (aligned_mem, operands[1], bitnum,
                   3442:                                        temp1, temp2));
                   3443:        }
                   3444:       else
                   3445:        {
                   3446:          rtx temp1 = gen_reg_rtx (DImode);
                   3447:          rtx temp2 = gen_reg_rtx (DImode);
                   3448:          rtx temp3 = gen_reg_rtx (DImode);
                   3449:          rtx seq = gen_unaligned_storeqi (get_unaligned_address (operands[0]),
                   3450:                                           operands[1], temp1, temp2, temp3);
                   3451: 
                   3452:          alpha_set_memflags (seq, operands[0]);
                   3453:          emit_insn (seq);
                   3454:        }
                   3455:       DONE;
                   3456:     }
                   3457: }")
                   3458: 
                   3459: (define_expand "movhi"
                   3460:   [(set (match_operand:HI 0 "general_operand" "")
                   3461:        (match_operand:HI 1 "general_operand" ""))]
                   3462:   ""
                   3463:   "
                   3464: { extern rtx get_unaligned_address ();
                   3465: 
                   3466:   /* If the output is not a register, the input must be.  */
                   3467:   if (GET_CODE (operands[0]) == MEM)
                   3468:     operands[1] = force_reg (HImode, operands[1]);
                   3469: 
                   3470:   /* Handle four memory cases, unaligned and aligned for either the input
                   3471:      or the output.  The only case where we can be called during reload is
                   3472:      for aligned loads; all other cases require temporaries.  */
                   3473: 
                   3474:   if (GET_CODE (operands[1]) == MEM
                   3475:       || (GET_CODE (operands[1]) == SUBREG
                   3476:          && GET_CODE (SUBREG_REG (operands[1])) == MEM)
                   3477:       || (reload_in_progress && GET_CODE (operands[1]) == REG
                   3478:          && REGNO (operands[1]) >= FIRST_PSEUDO_REGISTER)
                   3479:       || (reload_in_progress && GET_CODE (operands[1]) == SUBREG
                   3480:          && GET_CODE (SUBREG_REG (operands[1])) == REG
                   3481:          && REGNO (SUBREG_REG (operands[1])) >= FIRST_PSEUDO_REGISTER))
                   3482:     {
                   3483:       if (aligned_memory_operand (operands[1], HImode))
                   3484:        {
                   3485:          rtx aligned_mem, bitnum;
                   3486:          rtx scratch = (reload_in_progress
                   3487:                         ? gen_rtx (REG, SImode, REGNO (operands[0]))
                   3488:                         : gen_reg_rtx (SImode));
                   3489: 
                   3490:          get_aligned_mem (operands[1], &aligned_mem, &bitnum);
                   3491: 
                   3492:          emit_insn (gen_aligned_loadhi (operands[0], aligned_mem, bitnum,
                   3493:                                         scratch));
                   3494:        }
                   3495:       else
                   3496:        {
                   3497:          rtx addr
                   3498:            = force_reg (DImode,
                   3499:                         force_operand (get_unaligned_address (operands[1]),
                   3500:                                        NULL_RTX));
                   3501:          rtx scratch1 = gen_reg_rtx (DImode);
                   3502:          rtx scratch2 = gen_reg_rtx (DImode);
1.1.1.3   root     3503:          rtx scratch3 = gen_reg_rtx (DImode);
                   3504: 
1.1       root     3505:          rtx seq = gen_unaligned_loadhi (operands[0], addr, scratch1,
1.1.1.3   root     3506:                                          scratch2, scratch3);
1.1       root     3507: 
                   3508:          alpha_set_memflags (seq, operands[1]);
                   3509:          emit_insn (seq);
                   3510:        }
                   3511: 
                   3512:       DONE;
                   3513:     }
                   3514: 
                   3515:   else if (GET_CODE (operands[0]) == MEM
                   3516:           || (GET_CODE (operands[0]) == SUBREG 
                   3517:               && GET_CODE (SUBREG_REG (operands[0])) == MEM)
                   3518:           || (reload_in_progress && GET_CODE (operands[0]) == REG
                   3519:               && REGNO (operands[0]) >= FIRST_PSEUDO_REGISTER)
                   3520:           || (reload_in_progress && GET_CODE (operands[0]) == SUBREG
                   3521:               && GET_CODE (SUBREG_REG (operands[0])) == REG
                   3522:               && REGNO (operands[0]) >= FIRST_PSEUDO_REGISTER))
                   3523:     {
                   3524:       if (aligned_memory_operand (operands[0], HImode))
                   3525:        {
                   3526:          rtx aligned_mem, bitnum;
                   3527:          rtx temp1 = gen_reg_rtx (SImode);
                   3528:          rtx temp2 = gen_reg_rtx (SImode);
                   3529: 
                   3530:          get_aligned_mem (operands[0], &aligned_mem, &bitnum);
                   3531: 
                   3532:          emit_insn (gen_aligned_store (aligned_mem, operands[1], bitnum,
                   3533:                                        temp1, temp2));
                   3534:        }
                   3535:       else
                   3536:        {
                   3537:          rtx temp1 = gen_reg_rtx (DImode);
                   3538:          rtx temp2 = gen_reg_rtx (DImode);
                   3539:          rtx temp3 = gen_reg_rtx (DImode);
                   3540:          rtx temp4 = gen_reg_rtx (DImode);
                   3541:          rtx temp5 = gen_reg_rtx (DImode);
                   3542:          rtx temp6 = gen_reg_rtx (DImode);
                   3543:          rtx temp7 = gen_reg_rtx (DImode);
                   3544:          rtx temp8 = gen_reg_rtx (DImode);
1.1.1.3   root     3545:          rtx temp9 = gen_reg_rtx (DImode);
                   3546: 
1.1       root     3547:          rtx seq = gen_unaligned_storehi (get_unaligned_address (operands[0]),
                   3548:                                           operands[1], temp1, temp2,temp3,
1.1.1.3   root     3549:                                           temp4, temp5, temp6,temp7,
                   3550:                                           temp8, temp9);
1.1       root     3551: 
                   3552:          alpha_set_memflags (seq, operands[0]);
                   3553:          emit_insn (seq);
                   3554:        }
                   3555: 
                   3556:       DONE;
                   3557:     }
                   3558: }")
                   3559: 
                   3560: ;; Here are the versions for reload.  Note that in the unaligned cases
                   3561: ;; we know that the operand must not be a pseudo-register because stack
                   3562: ;; slots are always aligned references.
                   3563: 
                   3564: (define_expand "reload_inqi"
                   3565:   [(parallel [(match_operand:QI 0 "register_operand" "=r")
                   3566:              (match_operand:QI 1 "unaligned_memory_operand" "m")
1.1.1.3   root     3567:              (match_operand:TI 2 "register_operand" "=&r")])]
1.1       root     3568:   ""
                   3569:   "
                   3570: { extern rtx get_unaligned_address ();
                   3571:   rtx addr = get_unaligned_address (operands[1]);
1.1.1.3   root     3572:   /* It is possible that one of the registers we got for operands[2]
1.1.1.4 ! root     3573:      might coincide with that of operands[0] (which is why we made
1.1.1.3   root     3574:      it TImode).  Pick the other one to use as our scratch.  */
                   3575:   rtx scratch = gen_rtx (REG, DImode,
                   3576:                         REGNO (operands[0]) == REGNO (operands[2]) 
                   3577:                         ? REGNO (operands[2]) + 1 : REGNO (operands[2]));
                   3578:   rtx seq = gen_unaligned_loadqi (operands[0], addr, scratch,
1.1       root     3579:                                  gen_rtx (REG, DImode, REGNO (operands[0])));
                   3580: 
                   3581:   alpha_set_memflags (seq, operands[1]);
                   3582:   emit_insn (seq);
                   3583:   DONE;
                   3584: }")
                   3585: 
                   3586: (define_expand "reload_inhi"
                   3587:   [(parallel [(match_operand:HI 0 "register_operand" "=r")
                   3588:              (match_operand:HI 1 "unaligned_memory_operand" "m")
                   3589:              (match_operand:TI 2 "register_operand" "=&r")])]
                   3590:   ""
                   3591:   "
                   3592: { extern rtx get_unaligned_address ();
                   3593:   rtx addr = get_unaligned_address (operands[1]);
                   3594:   rtx scratch1 = gen_rtx (REG, DImode, REGNO (operands[2]));
                   3595:   rtx scratch2 = gen_rtx (REG, DImode, REGNO (operands[2]) + 1);
                   3596:   rtx seq;
                   3597: 
                   3598:   if (GET_CODE (addr) != REG)
                   3599:     {
                   3600:       emit_insn (gen_rtx (SET, VOIDmode, scratch2, addr));
                   3601:       addr = scratch2;
                   3602:     }
                   3603:       
1.1.1.3   root     3604:   seq = gen_unaligned_loadhi (operands[0], addr, scratch1, scratch1, scratch2);
1.1       root     3605:   alpha_set_memflags (seq, operands[1]);
                   3606:   emit_insn (seq);
                   3607:   DONE;
                   3608: }")
                   3609: 
                   3610: (define_expand "reload_outqi"
                   3611:   [(parallel [(match_operand:QI 0 "any_memory_operand" "=m")
                   3612:              (match_operand:QI 1 "register_operand" "r")
                   3613:              (match_operand:TI 2 "register_operand" "=&r")])]
                   3614:   ""
                   3615:   "
                   3616: { extern rtx get_unaligned_address ();
                   3617: 
                   3618:   if (aligned_memory_operand (operands[0], QImode))
                   3619:     {
                   3620:       rtx aligned_mem, bitnum;
                   3621: 
                   3622:       get_aligned_mem (operands[0], &aligned_mem, &bitnum);
                   3623: 
                   3624:       emit_insn (gen_aligned_store (aligned_mem, operands[1], bitnum,
                   3625:                                    gen_rtx (REG, SImode, REGNO (operands[2])),
                   3626:                                    gen_rtx (REG, SImode,
                   3627:                                             REGNO (operands[2]) + 1)));
                   3628:     }
                   3629:   else
                   3630:     {
                   3631:       rtx addr = get_unaligned_address (operands[0]);
                   3632:       rtx scratch1 = gen_rtx (REG, DImode, REGNO (operands[2]));
                   3633:       rtx scratch2 = gen_rtx (REG, DImode, REGNO (operands[2]) + 1);
1.1.1.3   root     3634:       rtx scratch3 = scratch1;
1.1       root     3635:       rtx seq;
                   3636: 
                   3637:       if (GET_CODE (addr) == REG)
                   3638:        scratch1 = addr;
                   3639: 
                   3640:       seq = gen_unaligned_storeqi (addr, operands[1], scratch1,
1.1.1.3   root     3641:                                   scratch2, scratch3);
1.1       root     3642:       alpha_set_memflags (seq, operands[0]);
                   3643:       emit_insn (seq);
                   3644:     }
                   3645: 
                   3646:   DONE;
                   3647: }")
                   3648: 
                   3649: (define_expand "reload_outhi"
                   3650:   [(parallel [(match_operand:HI 0 "any_memory_operand" "=m")
                   3651:              (match_operand:HI 1 "register_operand" "r")
                   3652:              (match_operand:TI 2 "register_operand" "=&r")])]
                   3653:   ""
                   3654:   "
                   3655: { extern rtx get_unaligned_address ();
                   3656: 
                   3657:   if (aligned_memory_operand (operands[0], HImode))
                   3658:     {
                   3659:       rtx aligned_mem, bitnum;
                   3660: 
                   3661:       get_aligned_mem (operands[0], &aligned_mem, &bitnum);
                   3662: 
                   3663:       emit_insn (gen_aligned_store (aligned_mem, operands[1], bitnum,
                   3664:                                    gen_rtx (REG, SImode, REGNO (operands[2])),
                   3665:                                    gen_rtx (REG, SImode,
                   3666:                                             REGNO (operands[2]) + 1)));
                   3667:     }
                   3668:   else
                   3669:     {
                   3670:       rtx addr = get_unaligned_address (operands[0]);
                   3671:       rtx scratch1 = gen_rtx (REG, DImode, REGNO (operands[2]));
                   3672:       rtx scratch2 = gen_rtx (REG, DImode, REGNO (operands[2]) + 1);
                   3673:       rtx scratch_a = GET_CODE (addr) == REG ? addr : scratch1;
                   3674:       rtx seq;
                   3675: 
                   3676:       seq = gen_unaligned_storehi (addr, operands[1], scratch_a,
                   3677:                                   scratch2, scratch2, scratch2,
                   3678:                                   scratch1, scratch2, scratch_a,
1.1.1.3   root     3679:                                   scratch1, scratch_a);
1.1       root     3680:       alpha_set_memflags (seq, operands[0]);
                   3681:       emit_insn (seq);
                   3682:     }
                   3683: 
                   3684:   DONE;
                   3685: }")
                   3686: 
                   3687: ;; Subroutine of stack space allocation.  Perform a stack probe.
                   3688: (define_expand "probe_stack"
                   3689:   [(set (match_dup 1) (match_operand:DI 0 "const_int_operand" ""))]
                   3690:   ""
                   3691:   "
                   3692: {
1.1.1.4 ! root     3693:   operands[1] = gen_rtx (MEM, DImode, plus_constant (stack_pointer_rtx,
1.1       root     3694:                                                     INTVAL (operands[0])));
1.1.1.4 ! root     3695:   MEM_VOLATILE_P (operands[1]) = 1;
1.1       root     3696: 
1.1.1.4 ! root     3697:   operands[0] = const0_rtx;
1.1       root     3698: }")
                   3699: 
                   3700: ;; This is how we allocate stack space.  If we are allocating a
                   3701: ;; constant amount of space and we know it is less than 4096
                   3702: ;; bytes, we need do nothing.
                   3703: ;;
                   3704: ;; If it is more than 4096 bytes, we need to probe the stack
                   3705: ;; periodically. 
                   3706: (define_expand "allocate_stack"
                   3707:   [(set (reg:DI 30)
                   3708:        (plus:DI (reg:DI 30)
                   3709:                 (match_operand:DI 0 "reg_or_cint_operand" "")))]
                   3710:   ""
                   3711:   "
                   3712: {
                   3713:   if (GET_CODE (operands[0]) == CONST_INT
                   3714:           && INTVAL (operands[0]) < 32768)
                   3715:     {
                   3716:       if (INTVAL (operands[0]) >= 4096)
                   3717:        {
                   3718:          /* We do this the same way as in the prologue and generate explicit
                   3719:             probes.  Then we update the stack by the constant.  */
                   3720: 
                   3721:          int probed = 4096;
                   3722: 
                   3723:          emit_insn (gen_probe_stack (GEN_INT (- probed)));
                   3724:          while (probed + 8192 < INTVAL (operands[0]))
                   3725:            emit_insn (gen_probe_stack (GEN_INT (- (probed += 8192))));
                   3726: 
                   3727:          if (probed + 4096 < INTVAL (operands[0]))
1.1.1.4 ! root     3728:            emit_insn (gen_probe_stack (GEN_INT (- INTVAL(operands[0]))));
1.1       root     3729:        }
                   3730: 
                   3731:       operands[0] = GEN_INT (- INTVAL (operands[0]));
                   3732:     }
                   3733:   else
                   3734:     {
                   3735:       rtx out_label = 0;
                   3736:       rtx loop_label = gen_label_rtx ();
1.1.1.4 ! root     3737:       rtx want = gen_reg_rtx (Pmode);
        !          3738:       rtx tmp = gen_reg_rtx (Pmode);
        !          3739:       rtx memref;
1.1       root     3740: 
1.1.1.4 ! root     3741:       emit_insn (gen_subdi3 (want, stack_pointer_rtx,
        !          3742:                             force_reg (Pmode, operands[0])));
        !          3743:       emit_insn (gen_adddi3 (tmp, stack_pointer_rtx, GEN_INT (-4096)));
1.1       root     3744: 
                   3745:       if (GET_CODE (operands[0]) != CONST_INT)
                   3746:        {
                   3747:          out_label = gen_label_rtx ();
1.1.1.4 ! root     3748:          emit_insn (gen_cmpdi (want, tmp));
        !          3749:          emit_jump_insn (gen_bgeu (out_label));
1.1       root     3750:        }
                   3751: 
                   3752:       emit_label (loop_label);
1.1.1.4 ! root     3753:       memref = gen_rtx (MEM, DImode, tmp);
        !          3754:       MEM_VOLATILE_P (memref) = 1;
        !          3755:       emit_move_insn (memref, const0_rtx);
        !          3756:       emit_insn (gen_adddi3 (tmp, tmp, GEN_INT(-8192)));
        !          3757:       emit_insn (gen_cmpdi (tmp, want));
        !          3758:       emit_jump_insn (gen_bgtu (loop_label));
        !          3759:       memref = gen_rtx (MEM, DImode, want);
        !          3760:       MEM_VOLATILE_P (memref) = 1;
        !          3761:       emit_move_insn (memref, const0_rtx);
1.1       root     3762: 
                   3763:       if (out_label)
                   3764:        emit_label (out_label);
                   3765: 
1.1.1.4 ! root     3766:       emit_move_insn (stack_pointer_rtx, want);
1.1       root     3767: 
                   3768:       DONE;
                   3769:     }
                   3770: }")

unix.superglobalmegacorp.com

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