Annotation of gcc/config/fx80/fx80.md, revision 1.1.1.3

1.1       root        1: ;;- Machine description for GNU C compiler for Alliant FX systems
1.1.1.2   root        2: ;;  Copyright (C) 1989, 1994 Free Software Foundation, Inc.
                      3: ;;  Adapted from m68k.md by Paul Petersen ([email protected])
                      4: ;;  and Joe Weening ([email protected]).
1.1       root        5: 
                      6: ;; This file is part of GNU CC.
                      7: 
                      8: ;; GNU CC is free software; you can redistribute it and/or modify
                      9: ;; it under the terms of the GNU General Public License as published by
                     10: ;; the Free Software Foundation; either version 2, or (at your option)
                     11: ;; any later version.
                     12: 
                     13: ;; GNU CC is distributed in the hope that it will be useful,
                     14: ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
                     15: ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     16: ;; GNU General Public License for more details.
                     17: 
                     18: ;; You should have received a copy of the GNU General Public License
                     19: ;; along with GNU CC; see the file COPYING.  If not, write to
1.1.1.3 ! root       20: ;; the Free Software Foundation, 59 Temple Place - Suite 330,
        !            21: ;; Boston, MA 02111-1307, USA.
1.1       root       22: 
                     23: 
                     24: ;;- instruction definitions
                     25: 
                     26: ;;- @@The original PO technology requires these to be ordered by speed,
                     27: ;;- @@    so that assigner will pick the fastest.
                     28: 
                     29: ;;- See file "rtl.def" for documentation on define_insn, match_*, et. al.
                     30: 
                     31: ;;- When naming insn's (operand 0 of define_insn) be careful about using
                     32: ;;- names from other targets machine descriptions.
                     33: 
                     34: ;;- cpp macro #define NOTICE_UPDATE_CC in file tm.h handles condition code
                     35: ;;- updates for most instructions.
                     36: 
                     37: ;;- Operand classes for the register allocator:
                     38: ;;- 'a' one of the address registers can be used.
                     39: ;;- 'd' one of the data registers can be used.
                     40: ;;- 'f' one of the CE floating point registers can be used
                     41: ;;- 'r' either a data or an address register can be used.
                     42: 
                     43: ;;- Immediate integer operand constraints:
                     44: ;;- 'I'  1 .. 8
                     45: ;;- 'J'  -32768 .. 32767
                     46: ;;- 'K'  -128 .. 127
                     47: ;;- 'L'  -8 .. -1
                     48: 
                     49: ;;- Some remnants of constraint codes for the m68k ('x','y','G','H')
                     50: ;;- may remain in the insn definitions.
                     51: 
                     52: ;;- Some of these insn's are composites of several Alliant op codes.
                     53: ;;- The assembler (or final @@??) insures that the appropriate one is
                     54: ;;- selected.
                     55: 
                     56: ;; We don't want to allow a constant operand for test insns because
                     57: ;; (set (cc0) (const_int foo)) has no mode information.  Such insns will
                     58: ;; be folded while optimizing anyway.
                     59: 
                     60: (define_insn "tstsi"
                     61:   [(set (cc0)
                     62:        (match_operand:SI 0 "nonimmediate_operand" "rm"))]
                     63:   ""
                     64:   "*
                     65: {
                     66:   if (TARGET_68020 || ! ADDRESS_REG_P (operands[0]))
                     67:     return \"tst%.l %0\";
                     68:   /* If you think that the 68020 does not support tstl a0,
                     69:      reread page B-167 of the 68020 manual more carefully.  */
                     70:   /* On an address reg, cmpw may replace cmpl.  */
                     71:   return \"cmp%.w %#0,%0\";
                     72: }")
                     73: 
                     74: (define_insn "tsthi"
                     75:   [(set (cc0)
                     76:        (match_operand:HI 0 "nonimmediate_operand" "rm"))]
                     77:   ""
                     78:   "*
                     79: {
                     80:   if (TARGET_68020 || ! ADDRESS_REG_P (operands[0]))
                     81:     return \"tst%.w %0\";
                     82:   return \"cmp%.w %#0,%0\";
                     83: }")
                     84: 
                     85: (define_insn "tstqi"
                     86:   [(set (cc0)
                     87:        (match_operand:QI 0 "nonimmediate_operand" "dm"))]
                     88:   ""
                     89:   "tst%.b %0")
                     90: 
                     91: (define_insn "tstsf"
                     92:   [(set (cc0)
                     93:        (match_operand:SF 0 "nonimmediate_operand" "fm"))]
                     94:   "TARGET_CE"
                     95:   "*
                     96: {
                     97:   cc_status.flags = CC_IN_FP;
                     98:   return \"ftest%.s %0\";
                     99: }")
                    100: 
                    101: (define_insn "tstdf"
                    102:   [(set (cc0)
                    103:        (match_operand:DF 0 "nonimmediate_operand" "fm"))]
                    104:   "TARGET_CE"
                    105:   "*
                    106: {
                    107:   cc_status.flags = CC_IN_FP;
                    108:   return \"ftest%.d %0\";
                    109: }")
                    110: 
                    111: ;; compare instructions.
                    112: 
                    113: ;; A composite of the cmp, cmpa, & cmpi m68000 op codes.
                    114: (define_insn "cmpsi"
                    115:   [(set (cc0)
                    116:        (compare (match_operand:SI 0 "nonimmediate_operand" "rKs,mr,>")
                    117:                 (match_operand:SI 1 "general_operand" "mr,Ksr,>")))]
                    118:   ""
                    119:   "*
                    120: {
                    121:   if (GET_CODE (operands[0]) == MEM && GET_CODE (operands[1]) == MEM)
                    122:     return \"cmpm%.l %1,%0\";
                    123:   if (REG_P (operands[1])
                    124:       || (!REG_P (operands[0]) && GET_CODE (operands[0]) != MEM))
                    125:     {
                    126:       cc_status.flags |= CC_REVERSED;
                    127:       return \"cmp%.l %d0,%d1\"; 
                    128:     }
                    129:   return \"cmp%.l %d1,%d0\";
                    130: }")
                    131: 
                    132: (define_insn "cmphi"
                    133:   [(set (cc0)
                    134:        (compare (match_operand:HI 0 "nonimmediate_operand" "rnm,d,n,m")
                    135:                 (match_operand:HI 1 "general_operand" "d,rnm,m,n")))]
                    136:   ""
                    137:   "*
                    138: {
                    139:   if (GET_CODE (operands[0]) == MEM && GET_CODE (operands[1]) == MEM)
                    140:     return \"cmpm%.w %1,%0\";
                    141:   if ((REG_P (operands[1]) && !ADDRESS_REG_P (operands[1]))
                    142:       || (!REG_P (operands[0]) && GET_CODE (operands[0]) != MEM))
                    143:     { cc_status.flags |= CC_REVERSED;
                    144:       return \"cmp%.w %d0,%d1\"; 
                    145:     }
                    146:   return \"cmp%.w %d1,%d0\";
                    147: }")
                    148: 
                    149: (define_insn "cmpqi"
                    150:   [(set (cc0)
                    151:        (compare (match_operand:QI 0 "nonimmediate_operand" "dn,md,>")
                    152:                 (match_operand:QI 1 "general_operand" "dm,nd,>")))]
                    153:   ""
                    154:   "*
                    155: {
                    156:   if (GET_CODE (operands[0]) == MEM && GET_CODE (operands[1]) == MEM)
                    157:     return \"cmpm%.b %1,%0\";
                    158:   if (REG_P (operands[1])
                    159:       || (!REG_P (operands[0]) && GET_CODE (operands[0]) != MEM))
                    160:     {
                    161:       cc_status.flags |= CC_REVERSED;
                    162:       return \"cmp%.b %d0,%d1\";
                    163:     }
                    164:   return \"cmp%.b %d1,%d0\";
                    165: }")
                    166: 
                    167: (define_insn "cmpdf"
                    168:   [(set (cc0)
                    169:        (compare (match_operand:DF 0 "nonimmediate_operand" "f,m")
                    170:                 (match_operand:DF 1 "nonimmediate_operand" "fm,f")))]
                    171:   "TARGET_CE"
                    172:   "*
                    173: {
                    174:   cc_status.flags = CC_IN_FP;
                    175:   if (FP_REG_P (operands[0]))
                    176:     return \"fcmp%.d %1,%0\";
                    177:   cc_status.flags |= CC_REVERSED;
                    178:   return \"fcmp%.d %0,%1\";
                    179: }")
                    180: 
                    181: (define_insn "cmpsf"
                    182:   [(set (cc0)
                    183:        (compare (match_operand:SF 0 "nonimmediate_operand" "f,m")
                    184:                 (match_operand:SF 1 "nonimmediate_operand" "fm,f")))]
                    185:   "TARGET_CE"
                    186:   "*
                    187: {
                    188:   cc_status.flags = CC_IN_FP;
                    189:   if (FP_REG_P (operands[0]))
                    190:     return \"fcmp%.s %1,%0\";
                    191:   cc_status.flags |= CC_REVERSED;
                    192:   return \"fcmp%.s %0,%1\";
                    193: }")
                    194: 
                    195: ;; Recognizers for btst instructions.
                    196: 
                    197: (define_insn ""
                    198:   [(set (cc0) (zero_extract (match_operand:QI 0 "nonimmediate_operand" "do")
                    199:                            (const_int 1)
                    200:                            (minus:SI (const_int 7)
                    201:                                      (match_operand:SI 1 "general_operand" "di"))))]
                    202:   ""
                    203:   "* { return output_btst (operands, operands[1], operands[0], insn, 7); }")
                    204: 
                    205: (define_insn ""
                    206:   [(set (cc0) (zero_extract (match_operand:SI 0 "nonimmediate_operand" "d")
                    207:                            (const_int 1)
                    208:                            (minus:SI (const_int 31)
                    209:                                      (match_operand:SI 1 "general_operand" "di"))))]
                    210:   ""
                    211:   "* { return output_btst (operands, operands[1], operands[0], insn, 31); }")
                    212: 
                    213: ;; The following two patterns are like the previous two
                    214: ;; except that they use the fact that bit-number operands
                    215: ;; are automatically masked to 3 or 5 bits.
                    216: 
                    217: (define_insn ""
                    218:   [(set (cc0) (zero_extract (match_operand:QI 0 "nonimmediate_operand" "do")
                    219:                            (const_int 1)
                    220:                            (minus:SI (const_int 7)
                    221:                                      (and:SI
                    222:                                       (match_operand:SI 1 "general_operand" "d")
                    223:                                       (const_int 7)))))]
                    224:   ""
                    225:   "* { return output_btst (operands, operands[1], operands[0], insn, 7); }")
                    226: 
                    227: (define_insn ""
                    228:   [(set (cc0) (zero_extract (match_operand:SI 0 "nonimmediate_operand" "d")
                    229:                            (const_int 1)
                    230:                            (minus:SI (const_int 31)
                    231:                                      (and:SI
                    232:                                       (match_operand:SI 1 "general_operand" "d")
                    233:                                       (const_int 31)))))]
                    234:   ""
                    235:   "* { return output_btst (operands, operands[1], operands[0], insn, 31); }")
                    236: 
                    237: ;; Nonoffsettable mem refs are ok in this one pattern
                    238: ;; since we don't try to adjust them.
                    239: (define_insn ""
                    240:   [(set (cc0) (zero_extract (match_operand:QI 0 "nonimmediate_operand" "md")
                    241:                            (const_int 1)
                    242:                            (match_operand:SI 1 "general_operand" "i")))]
                    243:   "GET_CODE (operands[1]) == CONST_INT
                    244:    && (unsigned) INTVAL (operands[1]) < 8"
                    245:   "*
                    246: {
                    247:   operands[1] = gen_rtx (CONST_INT, VOIDmode, 7 - INTVAL (operands[1]));
                    248:   return output_btst (operands, operands[1], operands[0], insn, 7);
                    249: }")
                    250: 
                    251: 
                    252: (define_insn ""
                    253:   [(set (cc0) (zero_extract (match_operand:SI 0 "nonimmediate_operand" "do")
                    254:                            (const_int 1)
                    255:                            (match_operand:SI 1 "general_operand" "i")))]
                    256:   "GET_CODE (operands[1]) == CONST_INT"
                    257:   "*
                    258: {
                    259:   if (GET_CODE (operands[0]) == MEM)
                    260:     {
                    261:       operands[0] = adj_offsettable_operand (operands[0],
                    262:                                             INTVAL (operands[1]) / 8);
                    263:       operands[1] = gen_rtx (CONST_INT, VOIDmode, 
                    264:                             7 - INTVAL (operands[1]) % 8);
                    265:       return output_btst (operands, operands[1], operands[0], insn, 7);
                    266:     }
                    267:   operands[1] = gen_rtx (CONST_INT, VOIDmode,
                    268:                         31 - INTVAL (operands[1]));
                    269:   return output_btst (operands, operands[1], operands[0], insn, 31);
                    270: }")
                    271: 
                    272: 
                    273: ;; move instructions
                    274: 
                    275: ;; A special case in which it is not desirable
                    276: ;; to reload the constant into a data register.
                    277: (define_insn ""
                    278:   [(set (match_operand:SI 0 "push_operand" "=m")
                    279:        (match_operand:SI 1 "general_operand" "J"))]
                    280:   "GET_CODE (operands[1]) == CONST_INT
                    281:    && INTVAL (operands[1]) >= -0x8000
                    282:    && INTVAL (operands[1]) < 0x8000"
                    283:   "*
                    284: {
                    285:   if (operands[1] == const0_rtx)
                    286:     return \"clr%.l %0\";
                    287:   return \"pea %a1\";
                    288: }")
                    289: 
                    290: ;This is never used.
                    291: ;(define_insn "swapsi"
                    292: ;  [(set (match_operand:SI 0 "general_operand" "r")
                    293: ;      (match_operand:SI 1 "general_operand" "r"))
                    294: ;   (set (match_dup 1) (match_dup 0))]
                    295: ;  ""
                    296: ;  "exg %1,%0")
                    297: 
                    298: ;; Special case of fullword move when source is zero.
                    299: ;; The reason this is special is to avoid loading a zero
                    300: ;; into a data reg with moveq in order to store it elsewhere.
                    301:    
                    302: (define_insn ""
                    303:   [(set (match_operand:SI 0 "general_operand" "=a,g")
                    304:        (const_int 0))]
                    305:   ""
                    306:   "@
                    307:    sub%.l %0,%0
                    308:    clr%.l %0")
                    309: 
                    310: ;; General case of fullword move.  The register constraints
                    311: ;; force integer constants in range for a moveq to be reloaded
                    312: ;; if they are headed for memory.
                    313: (define_insn "movsi"
                    314:   ;; Notes: make sure no alternative allows g vs g.
                    315:   ;; We don't allow f-regs since fixed point cannot go in them.
                    316:   ;; We do allow y and x regs since fixed point is allowed in them.
                    317:   [(set (match_operand:SI 0 "general_operand" "=g,da,y,!*x*r*m")
                    318:        (match_operand:SI 1 "general_operand" "daymKs,i,g,*x*r*m"))]
                    319:   ""
                    320:   "*
                    321: {
                    322:   if (GET_CODE (operands[1]) == CONST_INT)
                    323:     {
                    324:       if (operands[1] == const0_rtx
                    325:          && (DATA_REG_P (operands[0])
                    326:              || GET_CODE (operands[0]) == MEM))
                    327:        return \"clr%.l %0\";
                    328:       else if (DATA_REG_P (operands[0])
                    329:               && INTVAL (operands[1]) < 128
                    330:               && INTVAL (operands[1]) >= -128)
                    331:        return \"moveq %1,%0\";
                    332:       else if (ADDRESS_REG_P (operands[0])
                    333:               && INTVAL (operands[1]) < 0x8000
                    334:               && INTVAL (operands[1]) >= -0x8000)
                    335:        return \"mov%.w %1,%0\";
                    336:       else if (push_operand (operands[0], SImode)
                    337:               && INTVAL (operands[1]) < 0x8000
                    338:               && INTVAL (operands[1]) >= -0x8000)
                    339:         return \"pea %a1\";
                    340:     }
                    341:   else if ((GET_CODE (operands[1]) == SYMBOL_REF
                    342:            || GET_CODE (operands[1]) == CONST)
                    343:           && push_operand (operands[0], SImode))
                    344:     return \"pea %a1\";
                    345:   else if ((GET_CODE (operands[1]) == SYMBOL_REF
                    346:            || GET_CODE (operands[1]) == CONST)
                    347:           && ADDRESS_REG_P (operands[0]))
                    348:     return \"lea %a1,%0\";
                    349:   return \"mov%.l %1,%0\";
                    350: }")
                    351: 
                    352: (define_insn "movhi"
                    353:   [(set (match_operand:HI 0 "general_operand" "=g")
                    354:        (match_operand:HI 1 "general_operand" "g"))]
                    355:   ""
                    356:   "*
                    357: {
                    358:   if (GET_CODE (operands[1]) == CONST_INT)
                    359:     {
                    360:       if (operands[1] == const0_rtx
                    361:          && (DATA_REG_P (operands[0])
                    362:              || GET_CODE (operands[0]) == MEM))
                    363:        return \"clr%.w %0\";
                    364:       else if (DATA_REG_P (operands[0])
                    365:               && INTVAL (operands[1]) < 128
                    366:               && INTVAL (operands[1]) >= -128)
                    367:         {
                    368:          return \"moveq %1,%0\";
                    369:        }
                    370:       else if (INTVAL (operands[1]) < 0x8000
                    371:               && INTVAL (operands[1]) >= -0x8000)
                    372:        return \"mov%.w %1,%0\";
                    373:     }
                    374:   else if (CONSTANT_P (operands[1]))
                    375:     return \"mov%.l %1,%0\";
                    376:   /* Recognize the insn before a tablejump, one that refers
                    377:      to a table of offsets.  Such an insn will need to refer
                    378:      to a label on the insn.  So output one.  Use the label-number
                    379:      of the table of offsets to generate this label.  */
                    380:   if (GET_CODE (operands[1]) == MEM
                    381:       && GET_CODE (XEXP (operands[1], 0)) == PLUS
                    382:       && (GET_CODE (XEXP (XEXP (operands[1], 0), 0)) == LABEL_REF
                    383:          || GET_CODE (XEXP (XEXP (operands[1], 0), 1)) == LABEL_REF)
                    384:       && GET_CODE (XEXP (XEXP (operands[1], 0), 0)) != PLUS
                    385:       && GET_CODE (XEXP (XEXP (operands[1], 0), 1)) != PLUS)
                    386:     {
                    387:       rtx labelref;
                    388:       if (GET_CODE (XEXP (XEXP (operands[1], 0), 0)) == LABEL_REF)
                    389:        labelref = XEXP (XEXP (operands[1], 0), 0);
                    390:       else
                    391:        labelref = XEXP (XEXP (operands[1], 0), 1);
                    392:       ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, \"LI\",
                    393:                                 CODE_LABEL_NUMBER (XEXP (labelref, 0)));
                    394:     }
                    395:   return \"mov%.w %1,%0\";
                    396: }")
                    397: 
                    398: (define_insn "movstricthi"
                    399:   [(set (strict_low_part (match_operand:HI 0 "general_operand" "+dm"))
                    400:        (match_operand:HI 1 "general_operand" "rmn"))]
                    401:   ""
                    402:   "*
                    403: {
                    404:   if (operands[1] == const0_rtx)
                    405:     return \"clr%.w %0\";
                    406:   return \"mov%.w %1,%0\";
                    407: }")
                    408: 
                    409: (define_insn "movqi"
                    410:   [(set (match_operand:QI 0 "general_operand" "=d,*a,m,m,?*a")
                    411:        (match_operand:QI 1 "general_operand" "dmi*a,d*a,dmi,?*a,m"))]
                    412:   ""
                    413:   "*
                    414: {
                    415:   rtx xoperands[4];
                    416:   if (ADDRESS_REG_P (operands[0]) && GET_CODE (operands[1]) == MEM)
                    417:     {
                    418:       xoperands[1] = operands[1];
                    419:       xoperands[2]
                    420:         = gen_rtx (MEM, QImode,
                    421:                   gen_rtx (PLUS, VOIDmode, stack_pointer_rtx, const1_rtx));
                    422:       xoperands[3] = stack_pointer_rtx;
                    423:       /* Just pushing a byte puts it in the high byte of the halfword.  */
                    424:       /* We must put it in the low half, the second byte.  */
                    425:       output_asm_insn (\"subq%.w %#2,%3\;mov%.b %1,%2\", xoperands);
                    426:       return \"mov%.w %+,%0\";
                    427:     }
                    428:   if (ADDRESS_REG_P (operands[1]) && GET_CODE (operands[0]) == MEM)
                    429:     {
                    430:       xoperands[0] = operands[0];
                    431:       xoperands[1] = operands[1];
                    432:       xoperands[2]
                    433:         = gen_rtx (MEM, QImode,
                    434:                   gen_rtx (PLUS, VOIDmode, stack_pointer_rtx, const1_rtx));
                    435:       xoperands[3] = stack_pointer_rtx;
                    436:       output_asm_insn (\"mov%.w %1,%-\;mov%.b %2,%0\;addq%.w %#2,%3\", xoperands);
                    437:       return \"\";
                    438:     }
                    439:   if (operands[1] == const0_rtx)
                    440:     return \"clr%.b %0\";
                    441:   if (GET_CODE (operands[1]) == CONST_INT
                    442:       && INTVAL (operands[1]) == -1)
                    443:     return \"st %0\";
                    444:   if (GET_CODE (operands[1]) != CONST_INT && CONSTANT_P (operands[1]))
                    445:     return \"mov%.l %1,%0\";
                    446:   if (ADDRESS_REG_P (operands[0]) || ADDRESS_REG_P (operands[1]))
                    447:     return \"mov%.w %1,%0\";
                    448:   return \"mov%.b %1,%0\";
                    449: }")
                    450: 
                    451: (define_insn "movstrictqi"
                    452:   [(set (strict_low_part (match_operand:QI 0 "general_operand" "+dm"))
                    453:        (match_operand:QI 1 "general_operand" "dmn"))]
                    454:   ""
                    455:   "*
                    456: {
                    457:   if (operands[1] == const0_rtx)
                    458:     return \"clr%.b %0\";
                    459:   return \"mov%.b %1,%0\";
                    460: }")
                    461: 
                    462: ;; Floating-point moves on a CE are faster using an FP register than
                    463: ;; with movl instructions.  (Especially for double floats, but also
                    464: ;; for single floats, even though it takes an extra instruction.)  But
                    465: ;; on an IP, the FP registers are simulated and so should be avoided.
                    466: ;; We do this by using define_expand for movsf and movdf, and using
                    467: ;; different constraints for each target type.  The constraints for
                    468: ;; TARGET_CE allow general registers because they sometimes need to
                    469: ;; hold floats, but they are not preferable.
                    470: 
                    471: (define_expand "movsf"
                    472:   [(set (match_operand:SF 0 "general_operand" "")
                    473:        (match_operand:SF 1 "nonimmediate_operand" ""))]
                    474:   ""
                    475:   "")
                    476: 
                    477: (define_insn ""
                    478:   [(set (match_operand:SF 0 "general_operand" "=f,m,!*r,!f*m")
                    479:        (match_operand:SF 1 "nonimmediate_operand" "fm,f,f*r*m,*r"))]
                    480:   "TARGET_CE"
                    481:   "*
                    482: {
                    483:   if (FP_REG_P (operands[0]))
                    484:     {
                    485:       if (FP_REG_P (operands[1]))
                    486:        return \"fmove%.s %1,%0\";
                    487:       if (REG_P (operands[1]))
                    488:        return \"mov%.l %1,%-\;fmove%.s %+,%0\";
                    489:       return \"fmove%.s %1,%0\";
                    490:     }
                    491:   if (FP_REG_P (operands[1]))
                    492:     {
                    493:       if (REG_P (operands[0]))
                    494:        return \"fmove%.s %1,%-\;mov%.l %+,%0\";
                    495:       return \"fmove%.s %1,%0\";
                    496:     }
                    497:   return \"mov%.l %1,%0\";
                    498: }")
                    499: 
                    500: (define_insn ""
                    501:   [(set (match_operand:SF 0 "general_operand" "=frm")
                    502:        (match_operand:SF 1 "nonimmediate_operand" "frm"))]
                    503:   "!TARGET_CE"
                    504:   "*
                    505: {
                    506:   if (FP_REG_P (operands[0]))
                    507:     {
                    508:       if (FP_REG_P (operands[1]))
                    509:        return \"fmove%.s %1,%0\";
                    510:       if (REG_P (operands[1]))
                    511:        return \"mov%.l %1,%-\;fmove%.s %+,%0\";
                    512:       return \"fmove%.s %1,%0\";
                    513:     }
                    514:   if (FP_REG_P (operands[1]))
                    515:     {
                    516:       if (REG_P (operands[0]))
                    517:        return \"fmove%.s %1,%-\;mov%.l %+,%0\";
                    518:       return \"fmove%.s %1,%0\";
                    519:     }
                    520:   return \"mov%.l %1,%0\";
                    521: }")
                    522: 
                    523: (define_expand "movdf"
                    524:   [(set (match_operand:DF 0 "general_operand" "")
                    525:        (match_operand:DF 1 "nonimmediate_operand" ""))]
                    526:   ""
                    527:   "")
                    528: 
                    529: (define_insn ""
                    530:   [(set (match_operand:DF 0 "general_operand" "=f,m,!*r,!f*m")
                    531:        (match_operand:DF 1 "nonimmediate_operand" "fm,f,f*r*m,*r"))]
                    532:   "TARGET_CE"
                    533:   "*
                    534: {
                    535:   if (FP_REG_P (operands[0]))
                    536:     {
                    537:       if (FP_REG_P (operands[1]))
                    538:        return \"fmove%.d %1,%0\";
                    539:       if (REG_P (operands[1]))
                    540:        {
                    541:          rtx xoperands[2];
                    542:          xoperands[1] = gen_rtx (REG, SImode, REGNO (operands[1]) + 1);
                    543:          output_asm_insn (\"mov%.l %1,%-\", xoperands);
                    544:          output_asm_insn (\"mov%.l %1,%-\", operands);
                    545:          return \"fmove%.d %+,%0\";
                    546:        }
                    547:       return \"fmove%.d %1,%0\";
                    548:     }
                    549:   else if (FP_REG_P (operands[1]))
                    550:     {
                    551:       if (REG_P (operands[0]))
                    552:        {
                    553:          output_asm_insn (\"fmove%.d %1,%-\;mov%.l %+,%0\", operands);
                    554:          operands[0] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1);
                    555:          return \"mov%.l %+,%0\";
                    556:        }
                    557:       return \"fmove%.d %1,%0\";
                    558:     }
                    559:   return output_move_double (operands);
                    560: }")
                    561: 
                    562: (define_insn ""
                    563:   [(set (match_operand:DF 0 "general_operand" "=frm")
                    564:        (match_operand:DF 1 "nonimmediate_operand" "frm"))]
                    565:   "!TARGET_CE"
                    566:   "*
                    567: {
                    568:   if (FP_REG_P (operands[0]))
                    569:     {
                    570:       if (FP_REG_P (operands[1]))
                    571:        return \"fmove%.d %1,%0\";
                    572:       if (REG_P (operands[1]))
                    573:        {
                    574:          rtx xoperands[2];
                    575:          xoperands[1] = gen_rtx (REG, SImode, REGNO (operands[1]) + 1);
                    576:          output_asm_insn (\"mov%.l %1,%-\", xoperands);
                    577:          output_asm_insn (\"mov%.l %1,%-\", operands);
                    578:          return \"fmove%.d %+,%0\";
                    579:        }
                    580:       return \"fmove%.d %1,%0\";
                    581:     }
                    582:   else if (FP_REG_P (operands[1]))
                    583:     {
                    584:       if (REG_P (operands[0]))
                    585:        {
                    586:          output_asm_insn (\"fmove%.d %1,%-\;mov%.l %+,%0\", operands);
                    587:          operands[0] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1);
                    588:          return \"mov%.l %+,%0\";
                    589:        }
                    590:       return \"fmove%.d %1,%0\";
                    591:     }
                    592:   return output_move_double (operands);
                    593: }")
                    594: 
                    595: (define_insn "movdi"
                    596:   [(set (match_operand:DI 0 "general_operand" "=rm,&r,&ro<>")
                    597:        (match_operand:DI 1 "general_operand" "r,m,roi<>"))]
                    598:   ""
                    599:   "*
                    600: {
                    601:   return output_move_double (operands);
                    602: }
                    603: ")
                    604: 
                    605: ;; This goes after the move instructions
                    606: ;; because the move instructions are better (require no spilling)
                    607: ;; when they can apply.  It goes before the add/sub insns
                    608: ;; so we will prefer it to them.
                    609: 
                    610: (define_insn "pushasi"
                    611:   [(set (match_operand:SI 0 "push_operand" "=m")
                    612:        (match_operand:SI 1 "address_operand" "p"))]
                    613:   ""
                    614:   "pea %a1")
                    615: 
                    616: ;; truncation instructions
                    617: (define_insn "truncsiqi2"
                    618:   [(set (match_operand:QI 0 "general_operand" "=dm,d")
                    619:        (truncate:QI
                    620:         (match_operand:SI 1 "general_operand" "doJ,i")))]
                    621:   ""
                    622:   "*
                    623: {
                    624:   if (GET_CODE (operands[0]) == REG)
                    625:     return \"mov%.l %1,%0\";
                    626:   if (GET_CODE (operands[1]) == MEM)
                    627:     operands[1] = adj_offsettable_operand (operands[1], 3);
                    628:   return \"mov%.b %1,%0\";
                    629: }")
                    630: 
                    631: (define_insn "trunchiqi2"
                    632:   [(set (match_operand:QI 0 "general_operand" "=dm,d")
                    633:        (truncate:QI
                    634:         (match_operand:HI 1 "general_operand" "doJ,i")))]
                    635:   ""
                    636:   "*
                    637: {
                    638:   if (GET_CODE (operands[0]) == REG
                    639:       && (GET_CODE (operands[1]) == MEM
                    640:          || GET_CODE (operands[1]) == CONST_INT))
                    641:     return \"mov%.w %1,%0\";
                    642:   if (GET_CODE (operands[0]) == REG)
                    643:     return \"mov%.l %1,%0\";
                    644:   if (GET_CODE (operands[1]) == MEM)
                    645:     operands[1] = adj_offsettable_operand (operands[1], 1);
                    646:   return \"mov%.b %1,%0\";
                    647: }")
                    648: 
                    649: (define_insn "truncsihi2"
                    650:   [(set (match_operand:HI 0 "general_operand" "=dm,d")
                    651:        (truncate:HI
                    652:         (match_operand:SI 1 "general_operand" "roJ,i")))]
                    653:   ""
                    654:   "*
                    655: {
                    656:   if (GET_CODE (operands[0]) == REG)
                    657:     return \"mov%.l %1,%0\";
                    658:   if (GET_CODE (operands[1]) == MEM)
                    659:     operands[1] = adj_offsettable_operand (operands[1], 2);
                    660:   return \"mov%.w %1,%0\";
                    661: }")
                    662: 
                    663: ;; zero extension instructions
                    664: 
                    665: (define_expand "zero_extendhisi2"
                    666:   [(set (match_operand:SI 0 "register_operand" "")
                    667:        (const_int 0))
                    668:    (set (strict_low_part (subreg:HI (match_dup 0) 0))
                    669:        (match_operand:HI 1 "general_operand" ""))]
                    670:   ""
                    671:   "operands[1] = make_safe_from (operands[1], operands[0]);")
                    672: 
                    673: (define_expand "zero_extendqihi2"
                    674:   [(set (match_operand:HI 0 "register_operand" "")
                    675:        (const_int 0))
                    676:    (set (strict_low_part (subreg:QI (match_dup 0) 0))
                    677:        (match_operand:QI 1 "general_operand" ""))]
                    678:   ""
                    679:   "operands[1] = make_safe_from (operands[1], operands[0]);")
                    680: 
                    681: (define_expand "zero_extendqisi2"
                    682:   [(set (match_operand:SI 0 "register_operand" "")
                    683:        (const_int 0))
                    684:    (set (strict_low_part (subreg:QI (match_dup 0) 0))
                    685:        (match_operand:QI 1 "general_operand" ""))]
                    686:   ""
                    687:   " operands[1] = make_safe_from (operands[1], operands[0]); ")
                    688: 
                    689: ;; Patterns to recognize zero-extend insns produced by the combiner.
                    690: (define_insn ""
                    691:   [(set (match_operand:SI 0 "general_operand" "=do<>")
                    692:        (zero_extend:SI
                    693:         (match_operand:HI 1 "nonimmediate_operand" "rm")))]
                    694:   ""
                    695:   "*
                    696: {
                    697:   if (DATA_REG_P (operands[0]))
                    698:     {
                    699:       if (GET_CODE (operands[1]) == REG
                    700:          && REGNO (operands[0]) == REGNO (operands[1]))
                    701:        return \"and%.l %#0xFFFF,%0\";
                    702:       if (reg_mentioned_p (operands[0], operands[1]))
                    703:         return \"mov%.w %1,%0\;and%.l %#0xFFFF,%0\";
                    704:       return \"clr%.l %0\;mov%.w %1,%0\";
                    705:     }
                    706:   else if (GET_CODE (operands[0]) == MEM
                    707:           && GET_CODE (XEXP (operands[0], 0)) == PRE_DEC)
                    708:     return \"mov%.w %1,%0\;clr%.w %0\";
                    709:   else if (GET_CODE (operands[0]) == MEM
                    710:           && GET_CODE (XEXP (operands[0], 0)) == POST_INC)
                    711:     return \"clr%.w %0\;mov%.w %1,%0\";
                    712:   else
                    713:     {
                    714:       output_asm_insn (\"clr%.w %0\", operands);
                    715:       operands[0] = adj_offsettable_operand (operands[0], 2);
                    716:       return \"mov%.w %1,%0\";
                    717:     }
                    718: }")
                    719: 
                    720: (define_insn ""
                    721:   [(set (match_operand:HI 0 "general_operand" "=do<>")
                    722:        (zero_extend:HI
                    723:         (match_operand:QI 1 "nonimmediate_operand" "dm")))]
                    724:   ""
                    725:   "*
                    726: {
                    727:   if (DATA_REG_P (operands[0]))
                    728:     {
                    729:       if (GET_CODE (operands[1]) == REG
                    730:          && REGNO (operands[0]) == REGNO (operands[1]))
                    731:        return \"and%.w %#0xFF,%0\";
                    732:       if (reg_mentioned_p (operands[0], operands[1]))
                    733:         return \"mov%.b %1,%0\;and%.w %#0xFF,%0\";
                    734:       return \"clr%.w %0\;mov%.b %1,%0\";
                    735:     }
                    736:   else if (GET_CODE (operands[0]) == MEM
                    737:           && GET_CODE (XEXP (operands[0], 0)) == PRE_DEC)
                    738:     {
                    739:       if (REGNO (XEXP (XEXP (operands[0], 0), 0))
                    740:          == STACK_POINTER_REGNUM)
                    741:        return \"clr%.w %-\;mov%.b %1,%0\";
                    742:       else
                    743:        return \"mov%.b %1,%0\;clr%.b %0\";
                    744:     }
                    745:   else if (GET_CODE (operands[0]) == MEM
                    746:           && GET_CODE (XEXP (operands[0], 0)) == POST_INC)
                    747:     return \"clr%.b %0\;mov%.b %1,%0\";
                    748:   else
                    749:     {
                    750:       output_asm_insn (\"clr%.b %0\", operands);
                    751:       operands[0] = adj_offsettable_operand (operands[0], 1);
                    752:       return \"mov%.b %1,%0\";
                    753:     }
                    754: }")
                    755: 
                    756: (define_insn ""
                    757:   [(set (match_operand:SI 0 "general_operand" "=do<>")
                    758:        (zero_extend:SI
                    759:         (match_operand:QI 1 "nonimmediate_operand" "dm")))]
                    760:   ""
                    761:   "*
                    762: {
                    763:   if (DATA_REG_P (operands[0]))
                    764:     {
                    765:       if (GET_CODE (operands[1]) == REG
                    766:          && REGNO (operands[0]) == REGNO (operands[1]))
                    767:        return \"and%.l %#0xFF,%0\";
                    768:       if (reg_mentioned_p (operands[0], operands[1]))
                    769:         return \"mov%.b %1,%0\;and%.l %#0xFF,%0\";
                    770:       return \"clr%.l %0\;mov%.b %1,%0\";
                    771:     }
                    772:   else if (GET_CODE (operands[0]) == MEM
                    773:           && GET_CODE (XEXP (operands[0], 0)) == PRE_DEC)
                    774:     {
                    775:       operands[0] = XEXP (XEXP (operands[0], 0), 0);
                    776:       return \"clr%.l %0@-\;mov%.b %1,%0@(3)\";
                    777:     }
                    778:   else if (GET_CODE (operands[0]) == MEM
                    779:           && GET_CODE (XEXP (operands[0], 0)) == POST_INC)
                    780:     {
                    781:       operands[0] = XEXP (XEXP (operands[0], 0), 0);
                    782:       return \"clr%.l %0@+\;mov%.b %1,%0@(-1)\";
                    783:     }
                    784:   else
                    785:     {
                    786:       output_asm_insn (\"clr%.l %0\", operands);
                    787:       operands[0] = adj_offsettable_operand (operands[0], 3);
                    788:       return \"mov%.b %1,%0\";
                    789:     }
                    790: }")
                    791: 
                    792: ;; sign extension instructions
                    793: 
                    794: (define_insn "extendhisi2"
                    795:   [(set (match_operand:SI 0 "general_operand" "=*d,a")
                    796:        (sign_extend:SI
                    797:         (match_operand:HI 1 "nonimmediate_operand" "0,rmn")))]
                    798:   ""
                    799:   "@
                    800:    ext%.l %0
                    801:    mov%.w %1,%0")
                    802: 
                    803: (define_insn "extendqihi2"
                    804:   [(set (match_operand:HI 0 "general_operand" "=d")
                    805:        (sign_extend:HI
                    806:         (match_operand:QI 1 "nonimmediate_operand" "0")))]
                    807:   ""
                    808:   "ext%.w %0")
                    809: 
                    810: (define_insn "extendqisi2"
                    811:   [(set (match_operand:SI 0 "general_operand" "=d")
                    812:        (sign_extend:SI
                    813:         (match_operand:QI 1 "nonimmediate_operand" "0")))]
                    814:   "TARGET_68020"
                    815:   "extb%.l %0")
                    816: 
                    817: ;; Conversions between float and double.
                    818: 
                    819: (define_insn "extendsfdf2"
                    820:   [(set (match_operand:DF 0 "general_operand" "=f,m")
                    821:        (float_extend:DF
                    822:          (match_operand:SF 1 "nonimmediate_operand" "fm,f")))]
                    823:   "TARGET_CE"
                    824:   "fmovesd %1,%0")
                    825: 
                    826: (define_insn "truncdfsf2"
                    827:   [(set (match_operand:SF 0 "general_operand" "=f,m")
                    828:        (float_truncate:SF
                    829:          (match_operand:DF 1 "nonimmediate_operand" "fm,f")))]
                    830:   "TARGET_CE"
                    831:   "fmoveds %1,%0")
                    832: 
                    833: ;; Conversion between fixed point and floating point.
                    834: ;; Note that among the fix-to-float insns
                    835: ;; the ones that start with SImode come first.
                    836: ;; That is so that an operand that is a CONST_INT
                    837: ;; (and therefore lacks a specific machine mode).
                    838: ;; will be recognized as SImode (which is always valid)
                    839: ;; rather than as QImode or HImode.
                    840: 
                    841: (define_insn "floatsisf2"
                    842:   [(set (match_operand:SF 0 "register_operand" "=f")
                    843:        (float:SF (match_operand:SI 1 "nonimmediate_operand" "dm")))]
                    844:   "TARGET_CE"
                    845:   "fmovels %1,%0")
                    846: 
                    847: (define_insn "floatsidf2"
                    848:   [(set (match_operand:DF 0 "register_operand" "=f")
                    849:        (float:DF (match_operand:SI 1 "nonimmediate_operand" "dm")))]
                    850:   "TARGET_CE"
                    851:   "fmoveld %1,%0")
                    852: 
                    853: (define_insn "floathisf2"
                    854:   [(set (match_operand:SF 0 "register_operand" "=f")
                    855:        (float:SF (match_operand:HI 1 "nonimmediate_operand" "dm")))]
                    856:   "TARGET_CE"
                    857:   "fmovews %1,%0")
                    858: 
                    859: (define_insn "floathidf2"
                    860:   [(set (match_operand:DF 0 "register_operand" "=f")
                    861:        (float:DF (match_operand:HI 1 "nonimmediate_operand" "dm")))]
                    862:   "TARGET_CE"
                    863:   "fmovewd %1,%0")
                    864: 
                    865: (define_insn "floatqisf2"
                    866:   [(set (match_operand:SF 0 "register_operand" "=f")
                    867:        (float:SF (match_operand:QI 1 "nonimmediate_operand" "dm")))]
                    868:   "TARGET_CE"
                    869:   "fmovebs %1,%0")
                    870: 
                    871: (define_insn "floatqidf2"
                    872:   [(set (match_operand:DF 0 "register_operand" "=f")
                    873:        (float:DF (match_operand:QI 1 "nonimmediate_operand" "dm")))]
                    874:   "TARGET_CE"
                    875:   "fmovebd %1,%0")
                    876: 
                    877: ;; Float-to-fix conversion insns.
                    878: 
                    879: (define_insn "fix_truncsfqi2"
                    880:   [(set (match_operand:QI 0 "general_operand" "=dm")
                    881:        (fix:QI (fix:SF (match_operand:SF 1 "register_operand" "f"))))]
                    882:   "TARGET_CE"
                    883:   "fmovesb %1,%0")
                    884: 
                    885: (define_insn "fix_truncsfhi2"
                    886:   [(set (match_operand:HI 0 "general_operand" "=dm")
                    887:        (fix:HI (fix:SF (match_operand:SF 1 "register_operand" "f"))))]
                    888:   "TARGET_CE"
                    889:   "fmovesw %1,%0")
                    890: 
                    891: (define_insn "fix_truncsfsi2"
                    892:   [(set (match_operand:SI 0 "general_operand" "=dm")
                    893:        (fix:SI (fix:SF (match_operand:SF 1 "register_operand" "f"))))]
                    894:   "TARGET_CE"
                    895:   "fmovesl %1,%0")
                    896: 
                    897: (define_insn "fix_truncdfqi2"
                    898:   [(set (match_operand:QI 0 "general_operand" "=dm")
                    899:        (fix:QI (fix:DF (match_operand:DF 1 "register_operand" "f"))))]
                    900:   "TARGET_CE"
                    901:   "fmovedb %1,%0")
                    902: 
                    903: (define_insn "fix_truncdfhi2"
                    904:   [(set (match_operand:HI 0 "general_operand" "=dm")
                    905:        (fix:HI (fix:DF (match_operand:DF 1 "register_operand" "f"))))]
                    906:   "TARGET_CE"
                    907:   "fmovedw %1,%0")
                    908: 
                    909: (define_insn "fix_truncdfsi2"
                    910:   [(set (match_operand:SI 0 "general_operand" "=dm")
                    911:        (fix:SI (fix:DF (match_operand:DF 1 "register_operand" "f"))))]
                    912:   "TARGET_CE"
                    913:   "fmovedl %1,%0")
                    914: 
                    915: ;; add instructions
                    916: 
                    917: (define_insn "addsi3"
                    918:   [(set (match_operand:SI 0 "general_operand" "=m,r,!a,!a")
                    919:        (plus:SI (match_operand:SI 1 "general_operand" "%0,0,a,rJK")
                    920:                 (match_operand:SI 2 "general_operand" "dIKLs,mrIKLs,rJK,a")))]
                    921:   ""
                    922:   "*
                    923: {
                    924:   if (! operands_match_p (operands[0], operands[1]))
                    925:     {
                    926:       if (!ADDRESS_REG_P (operands[1]))
                    927:        {
                    928:          rtx tmp = operands[1];
                    929: 
                    930:          operands[1] = operands[2];
                    931:          operands[2] = tmp;
                    932:        }
                    933: 
                    934:       /* These insns can result from reloads to access
                    935:         stack slots over 64k from the frame pointer.  */
                    936:       if (GET_CODE (operands[2]) == CONST_INT
                    937:          && INTVAL (operands[2]) + 0x8000 >= (unsigned) 0x10000)
                    938:         return \"mov%.l %2,%0\;add%.l %1,%0\";
                    939:       if (GET_CODE (operands[2]) == REG)
                    940:        return \"lea %1@[%2:L:B],%0\";
                    941:       else
                    942:        return \"lea %1@(%c2),%0\";
                    943:     }
                    944:   if (GET_CODE (operands[2]) == CONST_INT)
                    945:     {
                    946:       if (INTVAL (operands[2]) > 0
                    947:          && INTVAL (operands[2]) <= 8)
                    948:        return (ADDRESS_REG_P (operands[0])
                    949:                ? \"addq%.w %2,%0\"
                    950:                : \"addq%.l %2,%0\");
                    951:       if (INTVAL (operands[2]) < 0
                    952:          && INTVAL (operands[2]) >= -8)
                    953:         {
                    954:          operands[2] = gen_rtx (CONST_INT, VOIDmode,
                    955:                                 - INTVAL (operands[2]));
                    956:          return (ADDRESS_REG_P (operands[0])
                    957:                  ? \"subq%.w %2,%0\"
                    958:                  : \"subq%.l %2,%0\");
                    959:        }
                    960:       if (ADDRESS_REG_P (operands[0])
                    961:          && INTVAL (operands[2]) >= -0x8000
                    962:          && INTVAL (operands[2]) < 0x8000)
                    963:        return \"add%.w %2,%0\";
                    964:     }
                    965:   return \"add%.l %2,%0\";
                    966: }")
                    967: 
                    968: (define_insn ""
                    969:   [(set (match_operand:SI 0 "general_operand" "=a")
                    970:        (plus:SI (match_operand:SI 1 "general_operand" "0")
                    971:                 (sign_extend:SI (match_operand:HI 2 "nonimmediate_operand" "rmn"))))]
                    972:   ""
                    973:   "add%.w %2,%0")
                    974: 
                    975: (define_insn "addhi3"
                    976:   [(set (match_operand:HI 0 "general_operand" "=mr,mr,m,r")
                    977:        (plus:HI (match_operand:HI 1 "general_operand" "%0,0,0,0")
                    978:                 (match_operand:HI 2 "general_operand" "I,L,dn,rmn")))]
                    979:   ""
                    980:   "@
                    981:    addq%.w %2,%0
                    982:    subq%.w #%n2,%0
                    983:    add%.w %2,%0
                    984:    add%.w %2,%0")
                    985: 
                    986: (define_insn ""
                    987:   [(set (strict_low_part (match_operand:HI 0 "general_operand" "+m,d"))
                    988:        (plus:HI (match_dup 0)
                    989:                 (match_operand:HI 1 "general_operand" "dn,rmn")))]
                    990:   ""
                    991:   "add%.w %1,%0")
                    992: 
                    993: (define_insn "addqi3"
                    994:   [(set (match_operand:QI 0 "general_operand" "=md,mr,m,d")
                    995:        (plus:QI (match_operand:QI 1 "general_operand" "%0,0,0,0")
                    996:                 (match_operand:QI 2 "general_operand" "I,L,dn,dmn")))]
                    997:   ""
                    998:   "@
                    999:    addq%.b %2,%0
                   1000:    subq%.b #%n2,%0
                   1001:    add%.b %2,%0
                   1002:    add%.b %2,%0")
                   1003: 
                   1004: (define_insn ""
                   1005:   [(set (strict_low_part (match_operand:QI 0 "general_operand" "+m,d"))
                   1006:        (plus:QI (match_dup 0)
                   1007:                 (match_operand:QI 1 "general_operand" "dn,dmn")))]
                   1008:   ""
                   1009:   "add%.b %1,%0")
                   1010: 
                   1011: (define_insn "adddf3"
                   1012:   [(set (match_operand:DF 0 "register_operand" "=f")
                   1013:        (plus:DF (match_operand:DF 1 "nonimmediate_operand" "%f")
                   1014:                 (match_operand:DF 2 "nonimmediate_operand" "fm")))]
                   1015:   "TARGET_CE"
                   1016:   "fadd%.d %2,%1,%0")
                   1017: 
                   1018: (define_insn "addsf3"
                   1019:   [(set (match_operand:SF 0 "register_operand" "=f")
                   1020:        (plus:SF (match_operand:SF 1 "nonimmediate_operand" "%f")
                   1021:                 (match_operand:SF 2 "nonimmediate_operand" "fm")))]
                   1022:   "TARGET_CE"
                   1023:   "fadd%.s %2,%1,%0")
                   1024: 
                   1025: ;; subtract instructions
                   1026: 
                   1027: (define_insn "subsi3"
                   1028:   [(set (match_operand:SI 0 "general_operand" "=m,r,!a,?d")
                   1029:        (minus:SI (match_operand:SI 1 "general_operand" "0,0,a,mrIKs")
                   1030:                  (match_operand:SI 2 "general_operand" "dIKs,mrIKs,J,0")))]
                   1031:   ""
                   1032:   "*
                   1033: {
                   1034:   if (! operands_match_p (operands[0], operands[1]))
                   1035:     {
                   1036:       if (operands_match_p (operands[0], operands[2]))
                   1037:        {
                   1038:          if (GET_CODE (operands[1]) == CONST_INT)
                   1039:            {
                   1040:              if (INTVAL (operands[1]) > 0
                   1041:                  && INTVAL (operands[1]) <= 8)
                   1042:                return \"subq%.l %1,%0\;neg%.l %0\";
                   1043:            }
                   1044:          return \"sub%.l %1,%0\;neg%.l %0\";
                   1045:        }
                   1046:       /* This case is matched by J, but negating -0x8000
                   1047:          in an lea would give an invalid displacement.
                   1048:         So do this specially.  */
                   1049:       if (INTVAL (operands[2]) == -0x8000)
                   1050:        return \"mov%.l %1,%0\;sub%.l %2,%0\";
                   1051:       return \"lea %1@(%n2),%0\";
                   1052:     }
                   1053:   if (GET_CODE (operands[2]) == CONST_INT)
                   1054:     {
                   1055:       if (INTVAL (operands[2]) > 0
                   1056:          && INTVAL (operands[2]) <= 8)
                   1057:        return \"subq%.l %2,%0\";
                   1058:       if (ADDRESS_REG_P (operands[0])
                   1059:          && INTVAL (operands[2]) >= -0x8000
                   1060:          && INTVAL (operands[2]) < 0x8000)
                   1061:        return \"sub%.w %2,%0\";
                   1062:     }
                   1063:   return \"sub%.l %2,%0\";
                   1064: }")
                   1065: 
                   1066: (define_insn ""
                   1067:   [(set (match_operand:SI 0 "general_operand" "=a")
                   1068:        (minus:SI (match_operand:SI 1 "general_operand" "0")
                   1069:                  (sign_extend:SI (match_operand:HI 2 "nonimmediate_operand" "rmn"))))]
                   1070:   ""
                   1071:   "sub%.w %2,%0")
                   1072: 
                   1073: (define_insn "subhi3"
                   1074:   [(set (match_operand:HI 0 "general_operand" "=m,r")
                   1075:        (minus:HI (match_operand:HI 1 "general_operand" "0,0")
                   1076:                  (match_operand:HI 2 "general_operand" "dn,rmn")))]
                   1077:   ""
                   1078:   "sub%.w %2,%0")
                   1079: 
                   1080: (define_insn ""
                   1081:   [(set (strict_low_part (match_operand:HI 0 "general_operand" "+m,d"))
                   1082:        (minus:HI (match_dup 0)
                   1083:                  (match_operand:HI 1 "general_operand" "dn,rmn")))]
                   1084:   ""
                   1085:   "sub%.w %1,%0")
                   1086: 
                   1087: (define_insn "subqi3"
                   1088:   [(set (match_operand:QI 0 "general_operand" "=m,d")
                   1089:        (minus:QI (match_operand:QI 1 "general_operand" "0,0")
                   1090:                  (match_operand:QI 2 "general_operand" "dn,dmn")))]
                   1091:   ""
                   1092:   "sub%.b %2,%0")
                   1093: 
                   1094: (define_insn ""
                   1095:   [(set (strict_low_part (match_operand:QI 0 "general_operand" "+m,d"))
                   1096:        (minus:QI (match_dup 0)
                   1097:                  (match_operand:QI 1 "general_operand" "dn,dmn")))]
                   1098:   ""
                   1099:   "sub%.b %1,%0")
                   1100: 
                   1101: (define_insn "subdf3"
                   1102:   [(set (match_operand:DF 0 "register_operand" "=f,f,f")
                   1103:        (minus:DF (match_operand:DF 1 "nonimmediate_operand" "f,f,m")
                   1104:                  (match_operand:DF 2 "nonimmediate_operand" "f,m,f")))]
                   1105:   "TARGET_CE"
                   1106:   "@
                   1107:    fsub%.d %2,%1,%0
                   1108:    fsub%.d %2,%1,%0
                   1109:    frsub%.d %1,%2,%0")
                   1110: 
                   1111: (define_insn "subsf3"
                   1112:   [(set (match_operand:SF 0 "register_operand" "=f,f,f")
                   1113:        (minus:SF (match_operand:SF 1 "nonimmediate_operand" "f,f,m")
                   1114:                  (match_operand:SF 2 "nonimmediate_operand" "f,m,f")))]
                   1115:   "TARGET_CE"
                   1116:   "@
                   1117:    fsub%.s %2,%1,%0
                   1118:    fsub%.s %2,%1,%0
                   1119:    frsub%.s %1,%2,%0")
                   1120: 
                   1121: ;; multiply instructions
                   1122: 
                   1123: (define_insn "mulhi3"
                   1124:   [(set (match_operand:HI 0 "general_operand" "=d")
                   1125:        (mult:HI (match_operand:HI 1 "general_operand" "%0")
                   1126:                 (match_operand:HI 2 "general_operand" "dmn")))]
                   1127:   ""
                   1128:   "muls %2,%0")
                   1129: 
                   1130: (define_insn "mulhisi3"
                   1131:   [(set (match_operand:SI 0 "general_operand" "=d")
                   1132:        (mult:SI (sign_extend:SI (match_operand:HI 1 "nonimmediate_operand" "%0"))
                   1133:                 (sign_extend:SI (match_operand:HI 2 "nonimmediate_operand" "dm"))))]
                   1134:   ""
                   1135:   "muls %2,%0")
                   1136: 
                   1137: (define_insn ""
                   1138:   [(set (match_operand:SI 0 "general_operand" "=d")
                   1139:        (mult:SI (sign_extend:SI (match_operand:HI 1 "nonimmediate_operand" "%0"))
                   1140:                 (match_operand:SI 2 "const_int_operand" "n")))]
                   1141:   ""
                   1142:   "muls %2,%0")
                   1143: 
                   1144: (define_insn "mulsi3"
                   1145:   [(set (match_operand:SI 0 "general_operand" "=d")
                   1146:        (mult:SI (match_operand:SI 1 "general_operand" "%0")
                   1147:                 (match_operand:SI 2 "general_operand" "dmsK")))]
                   1148:   "TARGET_68020"
                   1149:   "muls%.l %2,%0")
                   1150: 
                   1151: (define_insn "umulhisi3"
                   1152:   [(set (match_operand:SI 0 "general_operand" "=d")
                   1153:        (mult:SI (zero_extend:SI
                   1154:                  (match_operand:HI 1 "nonimmediate_operand" "%0"))
                   1155:                 (zero_extend:SI
                   1156:                  (match_operand:HI 2 "nonimmediate_operand" "dm"))))]
                   1157:   ""
                   1158:   "mulu %2,%0")
                   1159: 
                   1160: (define_insn ""
                   1161:   [(set (match_operand:SI 0 "general_operand" "=d")
                   1162:        (mult:SI (zero_extend:SI
                   1163:                  (match_operand:HI 1 "nonimmediate_operand" "%0"))
                   1164:                 (match_operand:SI 2 "const_int_operand" "n")))]
                   1165:   ""
                   1166:   "mulu %2,%0")
                   1167: 
                   1168: (define_insn "muldf3"
                   1169:   [(set (match_operand:DF 0 "register_operand" "=f")
                   1170:        (mult:DF (match_operand:DF 1 "nonimmediate_operand" "%f")
                   1171:                 (match_operand:DF 2 "nonimmediate_operand" "fm")))]
                   1172:   "TARGET_CE"
                   1173:   "fmul%.d %2,%1,%0")
                   1174: 
                   1175: (define_insn "mulsf3"
                   1176:   [(set (match_operand:SF 0 "register_operand" "=f")
                   1177:        (mult:SF (match_operand:SF 1 "nonimmediate_operand" "%f")
                   1178:                 (match_operand:SF 2 "nonimmediate_operand" "fm")))]
                   1179:   "TARGET_CE"
                   1180:   "fmul%.s %2,%1,%0")
                   1181: 
                   1182: ;; divide instructions
                   1183: 
                   1184: (define_insn "divhi3"
                   1185:   [(set (match_operand:HI 0 "general_operand" "=d")
                   1186:        (div:HI (match_operand:HI 1 "general_operand" "0")
                   1187:                (match_operand:HI 2 "general_operand" "dmn")))]
                   1188:   ""
                   1189:   "extl %0\;divs %2,%0")
                   1190: 
                   1191: (define_insn "divhisi3"
                   1192:   [(set (match_operand:HI 0 "general_operand" "=d")
                   1193:        (truncate:HI
                   1194:         (div:SI
                   1195:          (match_operand:SI 1 "general_operand" "0")
                   1196:          (sign_extend:SI (match_operand:HI 2 "nonimmediate_operand" "dm")))))]
                   1197:   ""
                   1198:   "divs %2,%0")
                   1199: 
                   1200: (define_insn ""
                   1201:   [(set (match_operand:HI 0 "general_operand" "=d")
                   1202:        (truncate:HI (div:SI (match_operand:SI 1 "general_operand" "0")
                   1203:                             (match_operand:SI 2 "const_int_operand" "n"))))]
                   1204:   ""
                   1205:   "divs %2,%0")
                   1206: 
                   1207: (define_insn "divsi3"
                   1208:   [(set (match_operand:SI 0 "general_operand" "=d")
                   1209:        (div:SI (match_operand:SI 1 "general_operand" "0")
                   1210:                (match_operand:SI 2 "general_operand" "dmsK")))]
                   1211:   "TARGET_68020"
                   1212:   "divs%.l %2,%0,%0")
                   1213: 
                   1214: (define_insn "udivhi3"
                   1215:   [(set (match_operand:HI 0 "general_operand" "=d")
                   1216:        (udiv:HI (match_operand:HI 1 "general_operand" "0")
                   1217:                 (match_operand:HI 2 "general_operand" "dmn")))]
                   1218:   ""
                   1219:   "and%.l %#0xFFFF,%0\;divu %2,%0")
                   1220: 
                   1221: (define_insn "udivhisi3"
                   1222:   [(set (match_operand:HI 0 "general_operand" "=d")
                   1223:        (truncate:HI
                   1224:         (udiv:SI
                   1225:          (match_operand:SI 1 "general_operand" "0")
                   1226:          (zero_extend:SI (match_operand:HI 2 "nonimmediate_operand" "dm")))))]
                   1227:   ""
                   1228:   "divu %2,%0")
                   1229: 
                   1230: (define_insn ""
                   1231:   [(set (match_operand:HI 0 "general_operand" "=d")
                   1232:        (truncate:HI (udiv:SI (match_operand:SI 1 "nonimmediate_operand" "0")
                   1233:                              (match_operand:HI 2 "const_int_operand" "n"))))]
                   1234:   ""
                   1235:   "divu %2,%0")
                   1236: 
                   1237: (define_insn "udivsi3"
                   1238:   [(set (match_operand:SI 0 "general_operand" "=d")
                   1239:        (udiv:SI (match_operand:SI 1 "general_operand" "0")
                   1240:                 (match_operand:SI 2 "general_operand" "dmsK")))]
                   1241:   "TARGET_68020"
                   1242:   "divu%.l %2,%0,%0")
                   1243: 
                   1244: (define_insn "divdf3"
                   1245:   [(set (match_operand:DF 0 "register_operand" "=f,f,f")
                   1246:        (div:DF (match_operand:DF 1 "nonimmediate_operand" "f,f,m")
                   1247:                (match_operand:DF 2 "nonimmediate_operand" "f,m,f")))]
                   1248:   "TARGET_CE"
                   1249:   "@
                   1250:    fdiv%.d %2,%1,%0
                   1251:    fdiv%.d %2,%1,%0
                   1252:    frdiv%.d %1,%2,%0")
                   1253: 
                   1254: (define_insn "divsf3"
                   1255:   [(set (match_operand:SF 0 "register_operand" "=f,f,f")
                   1256:        (div:SF (match_operand:SF 1 "nonimmediate_operand" "f,f,m")
                   1257:                (match_operand:SF 2 "nonimmediate_operand" "f,m,f")))]
                   1258:   "TARGET_CE"
                   1259:   "@
                   1260:    fdiv%.s %2,%1,%0
                   1261:    fdiv%.s %2,%1,%0
                   1262:    frdiv%.s %1,%2,%0")
                   1263: 
                   1264: ;; Remainder instructions.
                   1265: 
                   1266: (define_insn "modhi3"
                   1267:   [(set (match_operand:HI 0 "general_operand" "=d")
                   1268:        (mod:HI (match_operand:HI 1 "general_operand" "0")
                   1269:                (match_operand:HI 2 "general_operand" "dmn")))]
                   1270:   ""
                   1271:   "extl %0\;divs %2,%0\;swap %0")
                   1272: 
                   1273: (define_insn "modhisi3"
                   1274:   [(set (match_operand:HI 0 "general_operand" "=d")
                   1275:        (truncate:HI
                   1276:         (mod:SI
                   1277:          (match_operand:SI 1 "general_operand" "0")
                   1278:          (sign_extend:SI (match_operand:HI 2 "nonimmediate_operand" "dm")))))]
                   1279:   ""
                   1280:   "divs %2,%0\;swap %0")
                   1281: 
                   1282: (define_insn ""
                   1283:   [(set (match_operand:HI 0 "general_operand" "=d")
                   1284:        (truncate:HI (mod:SI (match_operand:SI 1 "general_operand" "0")
                   1285:                             (match_operand:SI 2 "const_int_operand" "n"))))]
                   1286:   ""
                   1287:   "divs %2,%0\;swap %0")
                   1288: 
                   1289: (define_insn "umodhi3"
                   1290:   [(set (match_operand:HI 0 "general_operand" "=d")
                   1291:        (umod:HI (match_operand:HI 1 "general_operand" "0")
                   1292:                 (match_operand:HI 2 "general_operand" "dmn")))]
                   1293:   ""
                   1294:   "and%.l %#0xFFFF,%0\;divu %2,%0\;swap %0")
                   1295: 
                   1296: (define_insn "umodhisi3"
                   1297:   [(set (match_operand:HI 0 "general_operand" "=d")
                   1298:        (truncate:HI
                   1299:         (umod:SI
                   1300:          (match_operand:SI 1 "general_operand" "0")
                   1301:          (zero_extend:SI (match_operand:HI 2 "nonimmediate_operand" "dm")))))]
                   1302:   ""
                   1303:   "divu %2,%0\;swap %0")
                   1304: 
                   1305: (define_insn ""
                   1306:   [(set (match_operand:HI 0 "general_operand" "=d")
                   1307:        (truncate:HI (umod:SI (match_operand:SI 1 "general_operand" "0")
                   1308:                              (match_operand:SI 2 "const_int_operand" "n"))))]
                   1309:   ""
                   1310:   "divu %2,%0\;swap %0")
                   1311: 
                   1312: (define_insn "divmodsi4"
                   1313:   [(set (match_operand:SI 0 "general_operand" "=d")
                   1314:        (div:SI (match_operand:SI 1 "general_operand" "0")
                   1315:                (match_operand:SI 2 "general_operand" "dmsK")))
                   1316:    (set (match_operand:SI 3 "general_operand" "=d")
                   1317:        (mod:SI (match_dup 1) (match_dup 2)))]
                   1318:   "TARGET_68020"
                   1319:   "divs%.l %2,%0,%3")
                   1320: 
                   1321: (define_insn "udivmodsi4"
                   1322:   [(set (match_operand:SI 0 "general_operand" "=d")
                   1323:        (udiv:SI (match_operand:SI 1 "general_operand" "0")
                   1324:                 (match_operand:SI 2 "general_operand" "dmsK")))
                   1325:    (set (match_operand:SI 3 "general_operand" "=d")
                   1326:        (umod:SI (match_dup 1) (match_dup 2)))]
                   1327:   "TARGET_68020"
                   1328:   "divu%.l %2,%0,%3")
                   1329: 
                   1330: ;; logical-and instructions
                   1331: 
                   1332: (define_insn "andsi3"
                   1333:   [(set (match_operand:SI 0 "general_operand" "=m,d")
                   1334:        (and:SI (match_operand:SI 1 "general_operand" "%0,0")
                   1335:                (match_operand:SI 2 "general_operand" "dKs,dmKs")))]
                   1336:   ""
                   1337:   "*
                   1338: {
                   1339:   if (GET_CODE (operands[2]) == CONST_INT
                   1340:       && (INTVAL (operands[2]) | 0xffff) == 0xffffffff
                   1341:       && (DATA_REG_P (operands[0])
                   1342:          || offsettable_memref_p (operands[0])))
                   1343:     { 
                   1344:       if (GET_CODE (operands[0]) != REG)
                   1345:         operands[0] = adj_offsettable_operand (operands[0], 2);
                   1346:       operands[2] = gen_rtx (CONST_INT, VOIDmode,
                   1347:                             INTVAL (operands[2]) & 0xffff);
                   1348:       /* Do not delete a following tstl %0 insn; that would be incorrect.  */
                   1349:       CC_STATUS_INIT;
                   1350:       if (operands[2] == const0_rtx)
                   1351:         return \"clr%.w %0\";
                   1352:       return \"and%.w %2,%0\";
                   1353:     }
                   1354:   return \"and%.l %2,%0\";
                   1355: }")
                   1356: 
                   1357: (define_insn "andhi3"
                   1358:   [(set (match_operand:HI 0 "general_operand" "=m,d")
                   1359:        (and:HI (match_operand:HI 1 "general_operand" "%0,0")
                   1360:                (match_operand:HI 2 "general_operand" "dn,dmn")))]
                   1361:   ""
                   1362:   "and%.w %2,%0")
                   1363: 
                   1364: (define_insn "andqi3"
                   1365:   [(set (match_operand:QI 0 "general_operand" "=m,d")
                   1366:        (and:QI (match_operand:QI 1 "general_operand" "%0,0")
                   1367:                (match_operand:QI 2 "general_operand" "dn,dmn")))]
                   1368:   ""
                   1369:   "and%.b %2,%0")
                   1370: 
                   1371: 
                   1372: ;; inclusive-or instructions
                   1373: 
                   1374: (define_insn "iorsi3"
                   1375:   [(set (match_operand:SI 0 "general_operand" "=m,d")
                   1376:        (ior:SI (match_operand:SI 1 "general_operand" "%0,0")
                   1377:                (match_operand:SI 2 "general_operand" "dKs,dmKs")))]
                   1378:   ""
                   1379:   "*
                   1380: {
                   1381:   register int logval;
                   1382:   if (GET_CODE (operands[2]) == CONST_INT
                   1383:       && INTVAL (operands[2]) >> 16 == 0
                   1384:       && (DATA_REG_P (operands[0])
                   1385:          || offsettable_memref_p (operands[0])))
                   1386:     { 
                   1387:       if (GET_CODE (operands[0]) != REG)
                   1388:         operands[0] = adj_offsettable_operand (operands[0], 2);
                   1389:       /* Do not delete a following tstl %0 insn; that would be incorrect.  */
                   1390:       CC_STATUS_INIT;
                   1391:       return \"or%.w %2,%0\";
                   1392:     }
                   1393:   if (GET_CODE (operands[2]) == CONST_INT
                   1394:       && (logval = exact_log2 (INTVAL (operands[2]))) >= 0
                   1395:       && (DATA_REG_P (operands[0])
                   1396:          || offsettable_memref_p (operands[0])))
                   1397:     { 
                   1398:       if (DATA_REG_P (operands[0]))
                   1399:        operands[1] = gen_rtx (CONST_INT, VOIDmode, logval);
                   1400:       else
                   1401:         {
                   1402:          operands[0] = adj_offsettable_operand (operands[0], 3 - (logval / 8));
                   1403:          operands[1] = gen_rtx (CONST_INT, VOIDmode, logval % 8);
                   1404:        }
                   1405:       return \"bset %1,%0\";
                   1406:     }
                   1407:   return \"or%.l %2,%0\";
                   1408: }")
                   1409: 
                   1410: (define_insn "iorhi3"
                   1411:   [(set (match_operand:HI 0 "general_operand" "=m,d")
                   1412:        (ior:HI (match_operand:HI 1 "general_operand" "%0,0")
                   1413:                (match_operand:HI 2 "general_operand" "dn,dmn")))]
                   1414:   ""
                   1415:   "or%.w %2,%0")
                   1416: 
                   1417: (define_insn "iorqi3"
                   1418:   [(set (match_operand:QI 0 "general_operand" "=m,d")
                   1419:        (ior:QI (match_operand:QI 1 "general_operand" "%0,0")
                   1420:                (match_operand:QI 2 "general_operand" "dn,dmn")))]
                   1421:   ""
                   1422:   "or%.b %2,%0")
                   1423: 
                   1424: ;; xor instructions
                   1425: 
                   1426: (define_insn "xorsi3"
                   1427:   [(set (match_operand:SI 0 "general_operand" "=do,m")
                   1428:        (xor:SI (match_operand:SI 1 "general_operand" "%0,0")
                   1429:                (match_operand:SI 2 "general_operand" "di,dKs")))]
                   1430:   ""
                   1431:   "*
                   1432: {
                   1433:   if (GET_CODE (operands[2]) == CONST_INT
                   1434:       && INTVAL (operands[2]) >> 16 == 0
                   1435:       && (offsettable_memref_p (operands[0]) || DATA_REG_P (operands[0])))
                   1436:     { 
                   1437:       if (! DATA_REG_P (operands[0]))
                   1438:        operands[0] = adj_offsettable_operand (operands[0], 2);
                   1439:       /* Do not delete a following tstl %0 insn; that would be incorrect.  */
                   1440:       CC_STATUS_INIT;
                   1441:       return \"eor%.w %2,%0\";
                   1442:     }
                   1443:   return \"eor%.l %2,%0\";
                   1444: }")
                   1445: 
                   1446: (define_insn "xorhi3"
                   1447:   [(set (match_operand:HI 0 "general_operand" "=dm")
                   1448:        (xor:HI (match_operand:HI 1 "general_operand" "%0")
                   1449:                (match_operand:HI 2 "general_operand" "dn")))]
                   1450:   ""
                   1451:   "eor%.w %2,%0")
                   1452: 
                   1453: (define_insn "xorqi3"
                   1454:   [(set (match_operand:QI 0 "general_operand" "=dm")
                   1455:        (xor:QI (match_operand:QI 1 "general_operand" "%0")
                   1456:                (match_operand:QI 2 "general_operand" "dn")))]
                   1457:   ""
                   1458:   "eor%.b %2,%0")
                   1459: 
                   1460: ;; negation instructions
                   1461: 
                   1462: (define_insn "negsi2"
                   1463:   [(set (match_operand:SI 0 "general_operand" "=dm")
                   1464:        (neg:SI (match_operand:SI 1 "general_operand" "0")))]
                   1465:   ""
                   1466:   "neg%.l %0")
                   1467: 
                   1468: (define_insn "neghi2"
                   1469:   [(set (match_operand:HI 0 "general_operand" "=dm")
                   1470:        (neg:HI (match_operand:HI 1 "general_operand" "0")))]
                   1471:   ""
                   1472:   "neg%.w %0")
                   1473: 
                   1474: (define_insn "negqi2"
                   1475:   [(set (match_operand:QI 0 "general_operand" "=dm")
                   1476:        (neg:QI (match_operand:QI 1 "general_operand" "0")))]
                   1477:   ""
                   1478:   "neg%.b %0")
                   1479: 
                   1480: (define_insn "negsf2"
                   1481:   [(set (match_operand:SF 0 "register_operand" "=f")
                   1482:        (neg:SF (match_operand:SF 1 "nonimmediate_operand" "fm")))]
                   1483:   "TARGET_CE"
                   1484:   "fneg%.s %1,%0")
                   1485: 
                   1486: (define_insn "negdf2"
                   1487:   [(set (match_operand:DF 0 "register_operand" "=f")
                   1488:        (neg:DF (match_operand:DF 1 "nonimmediate_operand" "fm")))]
                   1489:   "TARGET_CE"
                   1490:   "fneg%.d %1,%0")
                   1491: 
                   1492: ;; Absolute value instructions
                   1493: 
                   1494: (define_insn "abssf2"
                   1495:   [(set (match_operand:SF 0 "register_operand" "=f")
                   1496:        (abs:SF (match_operand:SF 1 "nonimmediate_operand" "fm")))]
                   1497:   "TARGET_CE"
                   1498:   "fabs%.s %1,%0")
                   1499: 
                   1500: (define_insn "absdf2"
                   1501:   [(set (match_operand:DF 0 "register_operand" "=f")
                   1502:        (abs:DF (match_operand:DF 1 "nonimmediate_operand" "fm")))]
                   1503:   "TARGET_CE"
                   1504:   "fabs%.d %1,%0")
                   1505: 
                   1506: ;; Square root instructions
                   1507: 
                   1508: (define_insn "sqrtsf2"
                   1509:   [(set (match_operand:SF 0 "register_operand" "=f")
                   1510:        (sqrt:SF (match_operand:SF 1 "nonimmediate_operand" "fm")))]
                   1511:   "TARGET_CE"
                   1512:   "fsqrt%.s %1,%0")
                   1513: 
                   1514: (define_insn "sqrtdf2"
                   1515:   [(set (match_operand:DF 0 "register_operand" "=f")
                   1516:        (sqrt:DF (match_operand:DF 1 "nonimmediate_operand" "fm")))]
                   1517:   "TARGET_CE"
                   1518:   "fsqrt%.d %1,%0")
                   1519: 
                   1520: ;; one complement instructions
                   1521: 
                   1522: (define_insn "one_cmplsi2"
                   1523:   [(set (match_operand:SI 0 "general_operand" "=dm")
                   1524:        (not:SI (match_operand:SI 1 "general_operand" "0")))]
                   1525:   ""
                   1526:   "not%.l %0")
                   1527: 
                   1528: (define_insn "one_cmplhi2"
                   1529:   [(set (match_operand:HI 0 "general_operand" "=dm")
                   1530:        (not:HI (match_operand:HI 1 "general_operand" "0")))]
                   1531:   ""
                   1532:   "not%.w %0")
                   1533: 
                   1534: (define_insn "one_cmplqi2"
                   1535:   [(set (match_operand:QI 0 "general_operand" "=dm")
                   1536:        (not:QI (match_operand:QI 1 "general_operand" "0")))]
                   1537:   ""
                   1538:   "not%.b %0")
                   1539: 
                   1540: 
                   1541: ;; arithmetic shift instructions
                   1542: ;; We don't need the shift memory by 1 bit instruction
                   1543: 
                   1544: (define_insn "ashlsi3"
                   1545:   [(set (match_operand:SI 0 "general_operand" "=d")
                   1546:        (ashift:SI (match_operand:SI 1 "general_operand" "0")
                   1547:                   (match_operand:SI 2 "general_operand" "dI")))]
                   1548:   ""
                   1549:   "asl%.l %2,%0")
                   1550: 
                   1551: (define_insn "ashlhi3"
                   1552:   [(set (match_operand:HI 0 "general_operand" "=d")
                   1553:        (ashift:HI (match_operand:HI 1 "general_operand" "0")
                   1554:                   (match_operand:HI 2 "general_operand" "dI")))]
                   1555:   ""
                   1556:   "asl%.w %2,%0")
                   1557: 
                   1558: (define_insn "ashlqi3"
                   1559:   [(set (match_operand:QI 0 "general_operand" "=d")
                   1560:        (ashift:QI (match_operand:QI 1 "general_operand" "0")
                   1561:                   (match_operand:QI 2 "general_operand" "dI")))]
                   1562:   ""
                   1563:   "asl%.b %2,%0")
                   1564: 
                   1565: (define_insn "ashrsi3"
                   1566:   [(set (match_operand:SI 0 "general_operand" "=d")
                   1567:        (ashiftrt:SI (match_operand:SI 1 "general_operand" "0")
                   1568:                     (match_operand:SI 2 "general_operand" "dI")))]
                   1569:   ""
                   1570:   "asr%.l %2,%0")
                   1571: 
                   1572: (define_insn "ashrhi3"
                   1573:   [(set (match_operand:HI 0 "general_operand" "=d")
                   1574:        (ashiftrt:HI (match_operand:HI 1 "general_operand" "0")
                   1575:                     (match_operand:HI 2 "general_operand" "dI")))]
                   1576:   ""
                   1577:   "asr%.w %2,%0")
                   1578: 
                   1579: (define_insn "ashrqi3"
                   1580:   [(set (match_operand:QI 0 "general_operand" "=d")
                   1581:        (ashiftrt:QI (match_operand:QI 1 "general_operand" "0")
                   1582:                     (match_operand:QI 2 "general_operand" "dI")))]
                   1583:   ""
                   1584:   "asr%.b %2,%0")
                   1585: 
                   1586: ;; logical shift instructions
                   1587: 
                   1588: (define_insn "lshrsi3"
                   1589:   [(set (match_operand:SI 0 "general_operand" "=d")
                   1590:        (lshiftrt:SI (match_operand:SI 1 "general_operand" "0")
                   1591:                     (match_operand:SI 2 "general_operand" "dI")))]
                   1592:   ""
                   1593:   "lsr%.l %2,%0")
                   1594: 
                   1595: (define_insn "lshrhi3"
                   1596:   [(set (match_operand:HI 0 "general_operand" "=d")
                   1597:        (lshiftrt:HI (match_operand:HI 1 "general_operand" "0")
                   1598:                     (match_operand:HI 2 "general_operand" "dI")))]
                   1599:   ""
                   1600:   "lsr%.w %2,%0")
                   1601: 
                   1602: (define_insn "lshrqi3"
                   1603:   [(set (match_operand:QI 0 "general_operand" "=d")
                   1604:        (lshiftrt:QI (match_operand:QI 1 "general_operand" "0")
                   1605:                     (match_operand:QI 2 "general_operand" "dI")))]
                   1606:   ""
                   1607:   "lsr%.b %2,%0")
                   1608: 
                   1609: ;; rotate instructions
                   1610: 
                   1611: (define_insn "rotlsi3"
                   1612:   [(set (match_operand:SI 0 "general_operand" "=d")
                   1613:        (rotate:SI (match_operand:SI 1 "general_operand" "0")
                   1614:                   (match_operand:SI 2 "general_operand" "dI")))]
                   1615:   ""
                   1616:   "rol%.l %2,%0")
                   1617: 
                   1618: (define_insn "rotlhi3"
                   1619:   [(set (match_operand:HI 0 "general_operand" "=d")
                   1620:        (rotate:HI (match_operand:HI 1 "general_operand" "0")
                   1621:                   (match_operand:HI 2 "general_operand" "dI")))]
                   1622:   ""
                   1623:   "rol%.w %2,%0")
                   1624: 
                   1625: (define_insn "rotlqi3"
                   1626:   [(set (match_operand:QI 0 "general_operand" "=d")
                   1627:        (rotate:QI (match_operand:QI 1 "general_operand" "0")
                   1628:                   (match_operand:QI 2 "general_operand" "dI")))]
                   1629:   ""
                   1630:   "rol%.b %2,%0")
                   1631: 
                   1632: (define_insn "rotrsi3"
                   1633:   [(set (match_operand:SI 0 "general_operand" "=d")
                   1634:        (rotatert:SI (match_operand:SI 1 "general_operand" "0")
                   1635:                     (match_operand:SI 2 "general_operand" "dI")))]
                   1636:   ""
                   1637:   "ror%.l %2,%0")
                   1638: 
                   1639: (define_insn "rotrhi3"
                   1640:   [(set (match_operand:HI 0 "general_operand" "=d")
                   1641:        (rotatert:HI (match_operand:HI 1 "general_operand" "0")
                   1642:                     (match_operand:HI 2 "general_operand" "dI")))]
                   1643:   ""
                   1644:   "ror%.w %2,%0")
                   1645: 
                   1646: (define_insn "rotrqi3"
                   1647:   [(set (match_operand:QI 0 "general_operand" "=d")
                   1648:        (rotatert:QI (match_operand:QI 1 "general_operand" "0")
                   1649:                     (match_operand:QI 2 "general_operand" "dI")))]
                   1650:   ""
                   1651:   "ror%.b %2,%0")
                   1652: 
                   1653: ;; Special cases of bit-field insns which we should
                   1654: ;; recognize in preference to the general case.
                   1655: ;; These handle aligned 8-bit and 16-bit fields,
                   1656: ;; which can usually be done with move instructions.
                   1657: 
                   1658: (define_insn ""
                   1659:   [(set (zero_extract:SI (match_operand:SI 0 "nonimmediate_operand" "+do")
                   1660:                         (match_operand:SI 1 "const_int_operand" "i")
                   1661:                         (match_operand:SI 2 "const_int_operand" "i"))
                   1662:        (match_operand:SI 3 "general_operand" "d"))]
                   1663:   "TARGET_68020 && TARGET_BITFIELD
                   1664:    && (INTVAL (operands[1]) == 8 || INTVAL (operands[1]) == 16)
                   1665:    && INTVAL (operands[2]) % INTVAL (operands[1]) == 0
                   1666:    && (GET_CODE (operands[0]) == REG
                   1667:        || ! mode_dependent_address_p (XEXP (operands[0], 0)))"
                   1668:   "*
                   1669: {
                   1670:   if (REG_P (operands[0]))
                   1671:     {
                   1672:       if (INTVAL (operands[1]) + INTVAL (operands[2]) != 32)
                   1673:         return \"bfins %3,[%c2,%c1]%0\";
                   1674:     }
                   1675:   else
                   1676:     operands[0]
                   1677:       = adj_offsettable_operand (operands[0], INTVAL (operands[2]) / 8);
                   1678: 
                   1679:   if (GET_CODE (operands[3]) == MEM)
                   1680:     operands[3] = adj_offsettable_operand (operands[3],
                   1681:                                           (32 - INTVAL (operands[1])) / 8);
                   1682:   if (INTVAL (operands[1]) == 8)
                   1683:     return \"mov%.b %3,%0\";
                   1684:   return \"mov%.w %3,%0\";
                   1685: }")
                   1686: 
                   1687: (define_insn ""
                   1688:   [(set (match_operand:SI 0 "general_operand" "=&d")
                   1689:        (zero_extract:SI (match_operand:SI 1 "nonimmediate_operand" "do")
                   1690:                         (match_operand:SI 2 "const_int_operand" "i")
                   1691:                         (match_operand:SI 3 "const_int_operand" "i")))]
                   1692:   "TARGET_68020 && TARGET_BITFIELD
                   1693:    && (INTVAL (operands[2]) == 8 || INTVAL (operands[2]) == 16)
                   1694:    && INTVAL (operands[3]) % INTVAL (operands[2]) == 0
                   1695:    && (GET_CODE (operands[1]) == REG
                   1696:        || ! mode_dependent_address_p (XEXP (operands[1], 0)))"
                   1697:   "*
                   1698: {
                   1699:   if (REG_P (operands[1]))
                   1700:     {
                   1701:       if (INTVAL (operands[2]) + INTVAL (operands[3]) != 32)
                   1702:        return \"bfextu [%c3,%c2]%1,%0\";
                   1703:     }
                   1704:   else
                   1705:     operands[1]
                   1706:       = adj_offsettable_operand (operands[1], INTVAL (operands[3]) / 8);
                   1707: 
                   1708:   output_asm_insn (\"clrl %0\", operands);
                   1709:   if (GET_CODE (operands[0]) == MEM)
                   1710:     operands[0] = adj_offsettable_operand (operands[0],
                   1711:                                           (32 - INTVAL (operands[1])) / 8);
                   1712:   if (INTVAL (operands[2]) == 8)
                   1713:     return \"mov%.b %1,%0\";
                   1714:   return \"mov%.w %1,%0\";
                   1715: }")
                   1716: 
                   1717: (define_insn ""
                   1718:   [(set (match_operand:SI 0 "general_operand" "=d")
                   1719:        (sign_extract:SI (match_operand:SI 1 "nonimmediate_operand" "do")
                   1720:                         (match_operand:SI 2 "const_int_operand" "i")
                   1721:                         (match_operand:SI 3 "const_int_operand" "i")))]
                   1722:   "TARGET_68020 && TARGET_BITFIELD
                   1723:    && (INTVAL (operands[2]) == 8 || INTVAL (operands[2]) == 16)
                   1724:    && INTVAL (operands[3]) % INTVAL (operands[2]) == 0
                   1725:    && (GET_CODE (operands[1]) == REG
                   1726:        || ! mode_dependent_address_p (XEXP (operands[1], 0)))"
                   1727:   "*
                   1728: {
                   1729:   if (REG_P (operands[1]))
                   1730:     {
                   1731:       if (INTVAL (operands[2]) + INTVAL (operands[3]) != 32)
                   1732:        return \"bfexts [%c3,%c2]%1,%0\";
                   1733:     }
                   1734:   else
                   1735:     operands[1]
                   1736:       = adj_offsettable_operand (operands[1], INTVAL (operands[3]) / 8);
                   1737: 
                   1738:   if (INTVAL (operands[2]) == 8)
                   1739:     return \"mov%.b %1,%0\;extb%.l %0\";
                   1740:   return \"mov%.w %1,%0\;ext%.l %0\";
                   1741: }")
                   1742: 
                   1743: ;; Bit field instructions, general cases.
                   1744: ;; "o,d" constraint causes a nonoffsettable memref to match the "o"
                   1745: ;; so that its address is reloaded.
                   1746: 
                   1747: (define_insn "extv"
                   1748:   [(set (match_operand:SI 0 "general_operand" "=d,d")
                   1749:        (sign_extract:SI (match_operand:QI 1 "nonimmediate_operand" "o,d")
                   1750:                         (match_operand:SI 2 "general_operand" "di,di")
                   1751:                         (match_operand:SI 3 "general_operand" "di,di")))]
                   1752:   "TARGET_68020 && TARGET_BITFIELD"
                   1753:   "bfexts [%c3,%c2]%1,%0")
                   1754: 
                   1755: (define_insn "extzv"
                   1756:   [(set (match_operand:SI 0 "general_operand" "=d,d")
                   1757:        (zero_extract:SI (match_operand:QI 1 "nonimmediate_operand" "o,d")
                   1758:                         (match_operand:SI 2 "general_operand" "di,di")
                   1759:                         (match_operand:SI 3 "general_operand" "di,di")))]
                   1760:   "TARGET_68020 && TARGET_BITFIELD"
                   1761:   "bfextu [%c3,%c2]%1,%0")
                   1762: 
                   1763: (define_insn ""
                   1764:   [(set (zero_extract:SI (match_operand:QI 0 "nonimmediate_operand" "+o,d")
                   1765:                         (match_operand:SI 1 "general_operand" "di,di")
                   1766:                         (match_operand:SI 2 "general_operand" "di,di"))
                   1767:         (xor:SI (zero_extract:SI (match_dup 0) (match_dup 1) (match_dup 2))
                   1768:                (match_operand:SI 3 "const_int_operand" "i,i")))]
                   1769:   "TARGET_68020 && TARGET_BITFIELD
                   1770:    && (INTVAL (operands[3]) == -1
                   1771:        || (GET_CODE (operands[1]) == CONST_INT
                   1772:            && (~ INTVAL (operands[3]) & ((1 << INTVAL (operands[1]))- 1)) == 0))"
                   1773:   "*
                   1774: {
                   1775:   CC_STATUS_INIT;
                   1776:   return \"bfchg [%c2,%c1]%0\";
                   1777: }")
                   1778: 
                   1779: (define_insn ""
                   1780:   [(set (zero_extract:SI (match_operand:QI 0 "nonimmediate_operand" "+o,d")
                   1781:                         (match_operand:SI 1 "general_operand" "di,di")
                   1782:                         (match_operand:SI 2 "general_operand" "di,di"))
                   1783:        (const_int 0))]
                   1784:   "TARGET_68020 && TARGET_BITFIELD"
                   1785:   "*
                   1786: {
                   1787:   CC_STATUS_INIT;
                   1788:   return \"bfclr [%c2,%c1]%0\";
                   1789: }")
                   1790: 
                   1791: (define_insn ""
                   1792:   [(set (zero_extract:SI (match_operand:QI 0 "nonimmediate_operand" "+o,d")
                   1793:                         (match_operand:SI 1 "general_operand" "di,di")
                   1794:                         (match_operand:SI 2 "general_operand" "di,di"))
                   1795:        (const_int -1))]
                   1796:   "TARGET_68020 && TARGET_BITFIELD"
                   1797:   "*
                   1798: {
                   1799:   CC_STATUS_INIT;
                   1800:   return \"bfset [%c2,%c1]%0\";
                   1801: }")
                   1802: 
                   1803: (define_insn "insv"
                   1804:   [(set (zero_extract:SI (match_operand:QI 0 "nonimmediate_operand" "+o,d")
                   1805:                         (match_operand:SI 1 "general_operand" "di,di")
                   1806:                         (match_operand:SI 2 "general_operand" "di,di"))
                   1807:        (match_operand:SI 3 "general_operand" "d,d"))]
                   1808:   "TARGET_68020 && TARGET_BITFIELD"
                   1809:   "bfins %3,[%c2,%c1]%0")
                   1810: 
                   1811: ;; Now recognize bit field insns that operate on registers
                   1812: ;; (or at least were intended to do so).
                   1813: 
                   1814: (define_insn ""
                   1815:   [(set (match_operand:SI 0 "general_operand" "=d")
                   1816:        (sign_extract:SI (match_operand:SI 1 "nonimmediate_operand" "d")
                   1817:                         (match_operand:SI 2 "general_operand" "di")
                   1818:                         (match_operand:SI 3 "general_operand" "di")))]
                   1819:   "TARGET_68020 && TARGET_BITFIELD"
                   1820:   "bfexts [%c3,%c2]%1,%0")
                   1821: 
                   1822: (define_insn ""
                   1823:   [(set (match_operand:SI 0 "general_operand" "=d")
                   1824:        (zero_extract:SI (match_operand:SI 1 "nonimmediate_operand" "d")
                   1825:                         (match_operand:SI 2 "general_operand" "di")
                   1826:                         (match_operand:SI 3 "general_operand" "di")))]
                   1827:   "TARGET_68020 && TARGET_BITFIELD"
                   1828:   "bfextu [%c3,%c2]%1,%0")
                   1829: 
                   1830: (define_insn ""
                   1831:   [(set (zero_extract:SI (match_operand:SI 0 "nonimmediate_operand" "+d")
                   1832:                         (match_operand:SI 1 "general_operand" "di")
                   1833:                         (match_operand:SI 2 "general_operand" "di"))
                   1834:        (const_int 0))]
                   1835:   "TARGET_68020 && TARGET_BITFIELD"
                   1836:   "*
                   1837: {
                   1838:   CC_STATUS_INIT;
                   1839:   return \"bfclr [%c2,%c1]%0\";
                   1840: }")
                   1841: 
                   1842: (define_insn ""
                   1843:   [(set (zero_extract:SI (match_operand:SI 0 "nonimmediate_operand" "+d")
                   1844:                         (match_operand:SI 1 "general_operand" "di")
                   1845:                         (match_operand:SI 2 "general_operand" "di"))
                   1846:        (const_int -1))]
                   1847:   "TARGET_68020 && TARGET_BITFIELD"
                   1848:   "*
                   1849: {
                   1850:   CC_STATUS_INIT;
                   1851:   return \"bfset [%c2,%c1]%0\";
                   1852: }")
                   1853: 
                   1854: (define_insn ""
                   1855:   [(set (zero_extract:SI (match_operand:SI 0 "nonimmediate_operand" "+d")
                   1856:                         (match_operand:SI 1 "general_operand" "di")
                   1857:                         (match_operand:SI 2 "general_operand" "di"))
                   1858:        (match_operand:SI 3 "general_operand" "d"))]
                   1859:   "TARGET_68020 && TARGET_BITFIELD"
                   1860:   "*
                   1861: {
                   1862:   return \"bfins %3,[%c2,%c1]%0\";
                   1863: }")
                   1864: 
                   1865: ;; Special patterns for optimizing bit-field instructions.
                   1866: 
                   1867: (define_insn ""
                   1868:   [(set (cc0)
                   1869:        (zero_extract:SI (match_operand:QI 0 "memory_operand" "o")
                   1870:                         (match_operand:SI 1 "const_int_operand" "i")
                   1871:                         (match_operand:SI 2 "general_operand" "di")))]
                   1872:   "TARGET_68020 && TARGET_BITFIELD"
                   1873:   "*
                   1874: {
                   1875:   if (operands[1] == const1_rtx
                   1876:       && GET_CODE (operands[2]) == CONST_INT)
                   1877:     {    
                   1878:       int width = GET_CODE (operands[0]) == REG ? 31 : 7;
                   1879:       return output_btst (operands,
                   1880:                          gen_rtx (CONST_INT, VOIDmode,
                   1881:                                   width - INTVAL (operands[2])),
                   1882:                          operands[0],
                   1883:                          insn, 1000);
                   1884:       /* Pass 1000 as SIGNPOS argument so that btst will
                   1885:          not think we are testing the sign bit for an `and'
                   1886:         and assume that nonzero implies a negative result.  */
                   1887:     }
                   1888:   if (INTVAL (operands[1]) != 32)
                   1889:     cc_status.flags = CC_NOT_NEGATIVE;
                   1890:   return \"bftst [%c2,%c1]%0\";
                   1891: }")
                   1892: 
                   1893: ;;; now handle the register cases
                   1894: (define_insn ""
                   1895:   [(set (cc0)
                   1896:        (zero_extract:SI (match_operand:SI 0 "nonimmediate_operand" "d")
                   1897:                         (match_operand:SI 1 "const_int_operand" "i")
                   1898:                         (match_operand:SI 2 "general_operand" "di")))]
                   1899:   "TARGET_68020 && TARGET_BITFIELD"
                   1900:   "*
                   1901: {
                   1902:   if (operands[1] == const1_rtx
                   1903:       && GET_CODE (operands[2]) == CONST_INT)
                   1904:     {    
                   1905:       int width = GET_CODE (operands[0]) == REG ? 31 : 7;
                   1906:       return output_btst (operands,
                   1907:                          gen_rtx (CONST_INT, VOIDmode,
                   1908:                                   width - INTVAL (operands[2])),
                   1909:                          operands[0],
                   1910:                          insn, 1000);
                   1911:       /* Pass 1000 as SIGNPOS argument so that btst will
                   1912:          not think we are testing the sign bit for an `and'
                   1913:         and assume that nonzero implies a negative result.  */
                   1914:     }
                   1915:   if (INTVAL (operands[1]) != 32)
                   1916:     cc_status.flags = CC_NOT_NEGATIVE;
                   1917:   return \"bftst [%c2,%c1]%0\";
                   1918: }")
                   1919: 
                   1920: 
                   1921: (define_insn "seq"
                   1922:   [(set (match_operand:QI 0 "general_operand" "=d")
                   1923:        (eq:QI (cc0) (const_int 0)))]
                   1924:   ""
                   1925:   "*
                   1926:   cc_status = cc_prev_status;
                   1927:   OUTPUT_JUMP (\"seq %0\", \"fseq %0\", \"seq %0\");
                   1928: ")
                   1929: 
                   1930: (define_insn "sne"
                   1931:   [(set (match_operand:QI 0 "general_operand" "=d")
                   1932:        (ne:QI (cc0) (const_int 0)))]
                   1933:   ""
                   1934:   "*
                   1935:   cc_status = cc_prev_status;
                   1936:   OUTPUT_JUMP (\"sne %0\", \"fsneq %0\", \"sne %0\");
                   1937: ")
                   1938: 
                   1939: (define_insn "sgt"
                   1940:   [(set (match_operand:QI 0 "general_operand" "=d")
                   1941:        (gt:QI (cc0) (const_int 0)))]
                   1942:   ""
                   1943:   "*
                   1944:   cc_status = cc_prev_status;
                   1945:   OUTPUT_JUMP (\"sgt %0\", \"fsgt %0\", \"and%.b %#0xc,%!\;sgt %0\");
                   1946: ")
                   1947: 
                   1948: (define_insn "sgtu"
                   1949:   [(set (match_operand:QI 0 "general_operand" "=d")
                   1950:        (gtu:QI (cc0) (const_int 0)))]
                   1951:   ""
                   1952:   "* cc_status = cc_prev_status;
                   1953:      return \"shi %0\"; ")
                   1954: 
                   1955: (define_insn "slt"
                   1956:   [(set (match_operand:QI 0 "general_operand" "=d")
                   1957:        (lt:QI (cc0) (const_int 0)))]
                   1958:   ""
                   1959:   "* cc_status = cc_prev_status;
                   1960:      OUTPUT_JUMP (\"slt %0\", \"fslt %0\", \"smi %0\"); ")
                   1961: 
                   1962: (define_insn "sltu"
                   1963:   [(set (match_operand:QI 0 "general_operand" "=d")
                   1964:        (ltu:QI (cc0) (const_int 0)))]
                   1965:   ""
                   1966:   "* cc_status = cc_prev_status;
                   1967:      return \"scs %0\"; ")
                   1968: 
                   1969: (define_insn "sge"
                   1970:   [(set (match_operand:QI 0 "general_operand" "=d")
                   1971:        (ge:QI (cc0) (const_int 0)))]
                   1972:   ""
                   1973:   "* cc_status = cc_prev_status;
                   1974:      OUTPUT_JUMP (\"sge %0\", \"fsge %0\", \"spl %0\"); ")
                   1975: 
                   1976: (define_insn "sgeu"
                   1977:   [(set (match_operand:QI 0 "general_operand" "=d")
                   1978:        (geu:QI (cc0) (const_int 0)))]
                   1979:   ""
                   1980:   "* cc_status = cc_prev_status;
                   1981:      return \"scc %0\"; ")
                   1982: 
                   1983: (define_insn "sle"
                   1984:   [(set (match_operand:QI 0 "general_operand" "=d")
                   1985:        (le:QI (cc0) (const_int 0)))]
                   1986:   ""
                   1987:   "*
                   1988:   cc_status = cc_prev_status;
                   1989:   OUTPUT_JUMP (\"sle %0\", \"fsle %0\", \"and%.b %#0xc,%!\;sle %0\");
                   1990: ")
                   1991: 
                   1992: (define_insn "sleu"
                   1993:   [(set (match_operand:QI 0 "general_operand" "=d")
                   1994:        (leu:QI (cc0) (const_int 0)))]
                   1995:   ""
                   1996:   "* cc_status = cc_prev_status;
                   1997:      return \"sls %0\"; ")
                   1998: 
                   1999: ;; Basic conditional jump instructions.
                   2000: 
                   2001: (define_insn "beq"
                   2002:   [(set (pc)
                   2003:        (if_then_else (eq (cc0)
                   2004:                          (const_int 0))
                   2005:                      (label_ref (match_operand 0 "" ""))
                   2006:                      (pc)))]
                   2007:   ""
                   2008:   "*
                   2009: {
                   2010:   OUTPUT_JUMP (\"jeq %l0\", \"fbeq %l0\", \"jeq %l0\");
                   2011: }")
                   2012: 
                   2013: (define_insn "bne"
                   2014:   [(set (pc)
                   2015:        (if_then_else (ne (cc0)
                   2016:                          (const_int 0))
                   2017:                      (label_ref (match_operand 0 "" ""))
                   2018:                      (pc)))]
                   2019:   ""
                   2020:   "*
                   2021: {
                   2022:   OUTPUT_JUMP (\"jne %l0\", \"fbneq %l0\", \"jne %l0\");
                   2023: }")
                   2024: 
                   2025: (define_insn "bgt"
                   2026:   [(set (pc)
                   2027:        (if_then_else (gt (cc0)
                   2028:                          (const_int 0))
                   2029:                      (label_ref (match_operand 0 "" ""))
                   2030:                      (pc)))]
                   2031:   ""
                   2032:   "*
                   2033:   OUTPUT_JUMP (\"jgt %l0\", \"fbgt %l0\", \"and%.b %#0xc,%!\;jgt %l0\");
                   2034: ")
                   2035: 
                   2036: (define_insn "bgtu"
                   2037:   [(set (pc)
                   2038:        (if_then_else (gtu (cc0)
                   2039:                           (const_int 0))
                   2040:                      (label_ref (match_operand 0 "" ""))
                   2041:                      (pc)))]
                   2042:   ""
                   2043:   "*
                   2044:   return \"jhi %l0\";
                   2045: ")
                   2046: 
                   2047: (define_insn "blt"
                   2048:   [(set (pc)
                   2049:        (if_then_else (lt (cc0)
                   2050:                          (const_int 0))
                   2051:                      (label_ref (match_operand 0 "" ""))
                   2052:                      (pc)))]
                   2053:   ""
                   2054:   "*
                   2055:   OUTPUT_JUMP (\"jlt %l0\", \"fblt %l0\", \"jmi %l0\");
                   2056: ")
                   2057: 
                   2058: (define_insn "bltu"
                   2059:   [(set (pc)
                   2060:        (if_then_else (ltu (cc0)
                   2061:                           (const_int 0))
                   2062:                      (label_ref (match_operand 0 "" ""))
                   2063:                      (pc)))]
                   2064:   ""
                   2065:   "*
                   2066:   return \"jcs %l0\";
                   2067: ")
                   2068: 
                   2069: (define_insn "bge"
                   2070:   [(set (pc)
                   2071:        (if_then_else (ge (cc0)
                   2072:                          (const_int 0))
                   2073:                      (label_ref (match_operand 0 "" ""))
                   2074:                      (pc)))]
                   2075:   ""
                   2076:   "*
                   2077:   OUTPUT_JUMP (\"jge %l0\", \"fbge %l0\", \"jpl %l0\");
                   2078: ")
                   2079: 
                   2080: (define_insn "bgeu"
                   2081:   [(set (pc)
                   2082:        (if_then_else (geu (cc0)
                   2083:                           (const_int 0))
                   2084:                      (label_ref (match_operand 0 "" ""))
                   2085:                      (pc)))]
                   2086:   ""
                   2087:   "*
                   2088:   return \"jcc %l0\";
                   2089: ")
                   2090: 
                   2091: (define_insn "ble"
                   2092:   [(set (pc)
                   2093:        (if_then_else (le (cc0)
                   2094:                          (const_int 0))
                   2095:                      (label_ref (match_operand 0 "" ""))
                   2096:                      (pc)))]
                   2097:   ""
                   2098:   "*
                   2099:   OUTPUT_JUMP (\"jle %l0\", \"fble %l0\", \"and%.b %#0xc,%!\;jle %l0\");
                   2100: ")
                   2101: 
                   2102: (define_insn "bleu"
                   2103:   [(set (pc)
                   2104:        (if_then_else (leu (cc0)
                   2105:                           (const_int 0))
                   2106:                      (label_ref (match_operand 0 "" ""))
                   2107:                      (pc)))]
                   2108:   ""
                   2109:   "*
                   2110:   return \"jls %l0\";
                   2111: ")
                   2112: 
                   2113: ;; Negated conditional jump instructions.
                   2114: 
                   2115: (define_insn ""
                   2116:   [(set (pc)
                   2117:        (if_then_else (eq (cc0)
                   2118:                          (const_int 0))
                   2119:                      (pc)
                   2120:                      (label_ref (match_operand 0 "" ""))))]
                   2121:   ""
                   2122:   "*
                   2123: {
                   2124:   OUTPUT_JUMP (\"jne %l0\", \"fbneq %l0\", \"jne %l0\");
                   2125: }")
                   2126: 
                   2127: (define_insn ""
                   2128:   [(set (pc)
                   2129:        (if_then_else (ne (cc0)
                   2130:                          (const_int 0))
                   2131:                      (pc)
                   2132:                      (label_ref (match_operand 0 "" ""))))]
                   2133:   ""
                   2134:   "*
                   2135: {
                   2136:   OUTPUT_JUMP (\"jeq %l0\", \"fbeq %l0\", \"jeq %l0\");
                   2137: }")
                   2138: 
                   2139: (define_insn ""
                   2140:   [(set (pc)
                   2141:        (if_then_else (gt (cc0)
                   2142:                          (const_int 0))
                   2143:                      (pc)
                   2144:                      (label_ref (match_operand 0 "" ""))))]
                   2145:   ""
                   2146:   "*
                   2147:   OUTPUT_JUMP (\"jle %l0\", \"fbngt %l0\", \"and%.b %#0xc,%!\;jle %l0\");
                   2148: ")
                   2149: 
                   2150: (define_insn ""
                   2151:   [(set (pc)
                   2152:        (if_then_else (gtu (cc0)
                   2153:                           (const_int 0))
                   2154:                      (pc)
                   2155:                      (label_ref (match_operand 0 "" ""))))]
                   2156:   ""
                   2157:   "*
                   2158:   return \"jls %l0\";
                   2159: ")
                   2160: 
                   2161: (define_insn ""
                   2162:   [(set (pc)
                   2163:        (if_then_else (lt (cc0)
                   2164:                          (const_int 0))
                   2165:                      (pc)
                   2166:                      (label_ref (match_operand 0 "" ""))))]
                   2167:   ""
                   2168:   "*
                   2169:   OUTPUT_JUMP (\"jge %l0\", \"fbnlt %l0\", \"jpl %l0\");
                   2170: ")
                   2171: 
                   2172: (define_insn ""
                   2173:   [(set (pc)
                   2174:        (if_then_else (ltu (cc0)
                   2175:                           (const_int 0))
                   2176:                      (pc)
                   2177:                      (label_ref (match_operand 0 "" ""))))]
                   2178:   ""
                   2179:   "*
                   2180:   return \"jcc %l0\";
                   2181: ")
                   2182: 
                   2183: (define_insn ""
                   2184:   [(set (pc)
                   2185:        (if_then_else (ge (cc0)
                   2186:                          (const_int 0))
                   2187:                      (pc)
                   2188:                      (label_ref (match_operand 0 "" ""))))]
                   2189:   ""
                   2190:   "*
                   2191:   OUTPUT_JUMP (\"jlt %l0\", \"fbnge %l0\", \"jmi %l0\");
                   2192: ")
                   2193: 
                   2194: (define_insn ""
                   2195:   [(set (pc)
                   2196:        (if_then_else (geu (cc0)
                   2197:                           (const_int 0))
                   2198:                      (pc)
                   2199:                      (label_ref (match_operand 0 "" ""))))]
                   2200:   ""
                   2201:   "*
                   2202:   return \"jcs %l0\";
                   2203: ")
                   2204: 
                   2205: (define_insn ""
                   2206:   [(set (pc)
                   2207:        (if_then_else (le (cc0)
                   2208:                          (const_int 0))
                   2209:                      (pc)
                   2210:                      (label_ref (match_operand 0 "" ""))))]
                   2211:   ""
                   2212:   "*
                   2213:   OUTPUT_JUMP (\"jgt %l0\", \"fbnle %l0\", \"and%.b %#0xc,%!\;jgt %l0\");
                   2214: ")
                   2215: 
                   2216: (define_insn ""
                   2217:   [(set (pc)
                   2218:        (if_then_else (leu (cc0)
                   2219:                           (const_int 0))
                   2220:                      (pc)
                   2221:                      (label_ref (match_operand 0 "" ""))))]
                   2222:   ""
                   2223:   "*
                   2224:   return \"jhi %l0\";
                   2225: ")
                   2226: 
                   2227: ;; Subroutines of "casesi".
                   2228: 
                   2229: (define_expand "casesi_1"
                   2230:   [(set (match_operand:SI 3 "general_operand" "")
                   2231:        (plus:SI (match_operand:SI 0 "general_operand" "")
                   2232:                 ;; Note operand 1 has been negated!
                   2233:                 (match_operand:SI 1 "immediate_operand" "")))
                   2234:    (set (cc0) (compare (match_operand:SI 2 "nonimmediate_operand" "")
                   2235:                       (match_dup 3)))
                   2236:    (set (pc) (if_then_else (ltu (cc0) (const_int 0))
                   2237:                           (label_ref (match_operand 4 "" "")) (pc)))]
                   2238:   ""
                   2239:   "")
                   2240: 
                   2241: (define_expand "casesi_2"
1.1.1.2   root     2242:   [(set (match_operand:HI 0 "" "") (mem:HI (match_operand:SI 1 "" "")))
1.1       root     2243:    ;; The USE here is so that at least one jump-insn will refer to the label,
                   2244:    ;; to keep it alive in jump_optimize.
                   2245:    (parallel [(set (pc)
1.1.1.2   root     2246:                   (plus:SI (pc) (sign_extend:SI (match_dup 0))))
1.1       root     2247:              (use (label_ref (match_operand 2 "" "")))])]
                   2248:   ""
                   2249:   "")
                   2250: 
                   2251: ;; Operand 0 is index (in bytes); operand 1 is minimum, operand 2 the maximum;
                   2252: ;; operand 3 is CODE_LABEL for the table;
                   2253: ;; operand 4 is the CODE_LABEL to go to if index out of range.
                   2254: (define_expand "casesi"
                   2255:   ;; We don't use these for generating the RTL, but we must describe
                   2256:   ;; the operands here.
1.1.1.2   root     2257:   [(match_operand:HI 0 "general_operand" "")
1.1       root     2258:    (match_operand:SI 1 "immediate_operand" "")
                   2259:    (match_operand:SI 2 "general_operand" "")
                   2260:    (match_operand 3 "" "")
                   2261:    (match_operand 4 "" "")]
                   2262:   ""
                   2263:   "
                   2264: {
                   2265:   rtx table_elt_addr;
                   2266:   rtx index_diff;
                   2267: 
                   2268:   operands[1] = negate_rtx (SImode, operands[1]);
                   2269:   index_diff = gen_reg_rtx (SImode);
                   2270:   /* Emit the first few insns.  */
                   2271:   emit_insn (gen_casesi_1 (operands[0], operands[1], operands[2],
                   2272:                           index_diff, operands[4]));
                   2273:   /* Construct a memory address.  This may emit some insns.  */
                   2274:   table_elt_addr
                   2275:     = memory_address_noforce
                   2276:         (HImode,
                   2277:         gen_rtx (PLUS, Pmode,
                   2278:                  gen_rtx (MULT, Pmode, index_diff,
                   2279:                           gen_rtx (CONST_INT, VOIDmode, 2)),
                   2280:                  gen_rtx (LABEL_REF, VOIDmode, operands[3])));
                   2281:   /* Emit the last few insns.  */
                   2282:   emit_insn (gen_casesi_2 (gen_reg_rtx (HImode), table_elt_addr, operands[3]));
                   2283:   DONE;
                   2284: }")
                   2285: 
                   2286: ;; Recognize one of the insns resulting from casesi_2.
                   2287: (define_insn ""
                   2288:   [(set (pc)
1.1.1.2   root     2289:        (plus:SI (pc)
                   2290:                 (sign_extend:SI (match_operand:HI 0 "general_operand" "r"))))
1.1       root     2291:    (use (label_ref (match_operand 1 "" "")))]
                   2292:   ""
                   2293:   "*
                   2294:   return \"jmp pc@(2:B)[%0:W:B]\";
                   2295: ")
                   2296: 
                   2297: ;; Unconditional and other jump instructions
                   2298: (define_insn "jump"
                   2299:   [(set (pc)
                   2300:        (label_ref (match_operand 0 "" "")))]
                   2301:   ""
                   2302:   "*
                   2303:   return \"jra %l0\";
                   2304: ")
                   2305: 
                   2306: (define_insn ""
                   2307:   [(set (pc)
                   2308:        (if_then_else
                   2309:         (ne (match_operand:HI 0 "general_operand" "d,m,g")
                   2310:             (const_int 0))
                   2311:         (label_ref (match_operand 1 "" ""))
                   2312:         (pc)))
                   2313:    (set (match_dup 0)
                   2314:        (plus:HI (match_dup 0)
                   2315:                 (const_int -1)))]
                   2316:   ""
                   2317:   "@
                   2318:    dbra %0,%l1
                   2319:    subq%.w %#1,%0\;jcc %l1
                   2320:    subq%.w %#1,%0\;cmp%.w %#-1,%0\;jne %l1")
                   2321: 
                   2322: (define_insn ""
                   2323:   [(set (pc)
                   2324:        (if_then_else
                   2325:         (ne (match_operand:SI 0 "general_operand" "d,m,g")
                   2326:             (const_int 0))
                   2327:         (label_ref (match_operand 1 "" ""))
                   2328:         (pc)))
                   2329:    (set (match_dup 0)
                   2330:        (plus:SI (match_dup 0)
                   2331:                 (const_int -1)))]
                   2332:   ""
                   2333:   "@
                   2334:    dbra %0,%l1\;clr%.w %0\;subq%.l %#1,%0\;jcc %l1
                   2335:    subq%.l %#1,%0\;jcc %l1
                   2336:    subq%.l %#1,%0\;cmp%.l %#-1,%0\;jne %l1")
                   2337: 
                   2338: ;; dbra patterns that use REG_NOTES info generated by strength_reduce.
                   2339: 
                   2340: (define_insn "decrement_and_branch_until_zero"
                   2341:   [(set (pc)
                   2342:        (if_then_else
                   2343:          (ge (match_operand:SI 0 "general_operand" "d,m,g")
                   2344:              (const_int 1))
                   2345:          (label_ref (match_operand 1 "" ""))
                   2346:          (pc)))
                   2347:    (set (match_dup 0)
                   2348:        (plus:SI (match_dup 0)
                   2349:                 (const_int -1)))]
                   2350:   "find_reg_note (insn, REG_NONNEG, 0)"
                   2351:   "@
                   2352:    dbra %0,%l1\;clrw %0\;subql %#1,%0\;jcc %l1
                   2353:    subq%.l %#1,%0\;jcc %l1
                   2354:    subq%.l %#1,%0\;cmp%.l %#-1,%0\;jne %l1")
                   2355: 
                   2356: ;; Call subroutine with no return value.
                   2357: (define_insn "call"
                   2358:   [(call (match_operand:QI 0 "memory_operand" "o")
                   2359:         (match_operand:SI 1 "general_operand" "g"))]
                   2360:   ""
                   2361:   "*
                   2362: {
                   2363:   rtx xoperands[2];
                   2364:   int size = XINT(operands[1],0);
                   2365: 
                   2366:   if (size == 0) 
                   2367:     output_asm_insn (\"sub%.l a0,a0\;jbsr %0\", operands);
                   2368:   else
                   2369:   {
                   2370:     xoperands[1] = gen_rtx (CONST_INT, VOIDmode, size/4);
                   2371:     output_asm_insn (\"mov%.l sp,a0\;pea %a1\", xoperands);
                   2372:     output_asm_insn (\"jbsr %0\", operands);
                   2373:     size = size + 4;
                   2374:     xoperands[1] = gen_rtx (CONST_INT, VOIDmode, size);
                   2375:     if (size <= 8)
                   2376:       output_asm_insn (\"addq%.l %1,sp\", xoperands);
                   2377:     else if (size < 0x8000)
                   2378:       output_asm_insn (\"add%.w %1,sp\", xoperands);
                   2379:     else
                   2380:       output_asm_insn (\"add%.l %1,sp\", xoperands);
                   2381:   }
                   2382:   return \"mov%.l a6@(-4),a0\";
                   2383: }")
                   2384: 
                   2385: ;; Call subroutine, returning value in operand 0
                   2386: ;; (which must be a hard register).
                   2387: (define_insn "call_value"
                   2388:   [(set (match_operand 0 "" "=rf")
                   2389:        (call (match_operand:QI 1 "memory_operand" "o")
                   2390:              (match_operand:SI 2 "general_operand" "g")))]
                   2391:   ""
                   2392:   "*
                   2393: {
                   2394:   rtx xoperands[3];
                   2395:   int size = XINT(operands[2],0);
                   2396: 
                   2397:   if (size == 0)
                   2398:     output_asm_insn(\"sub%.l a0,a0\;jbsr %1\", operands);
                   2399:   else
                   2400:   {
                   2401:     xoperands[2] = gen_rtx (CONST_INT, VOIDmode, size/4);
                   2402:     output_asm_insn (\"mov%.l sp,a0\;pea %a2\", xoperands);
                   2403:     output_asm_insn (\"jbsr %1\", operands);
                   2404:     size = size + 4;
                   2405:     xoperands[2] = gen_rtx (CONST_INT, VOIDmode, size);
                   2406:     if (size <= 8)
                   2407:       output_asm_insn (\"addq%.l %2,sp\", xoperands);
                   2408:     else if (size < 0x8000)
                   2409:       output_asm_insn (\"add%.w %2,sp\", xoperands);
                   2410:     else
                   2411:       output_asm_insn (\"add%.l %2,sp\", xoperands);
                   2412:   }
                   2413:   return \"mov%.l a6@(-4),a0\";
                   2414: }")
                   2415: 
                   2416: ;; Call subroutine returning any type.
                   2417: 
                   2418: (define_expand "untyped_call"
                   2419:   [(parallel [(call (match_operand 0 "" "")
                   2420:                    (const_int 0))
                   2421:              (match_operand 1 "" "")
                   2422:              (match_operand 2 "" "")])]
                   2423:   ""
                   2424:   "
                   2425: {
                   2426:   int i;
                   2427: 
                   2428:   emit_call_insn (gen_call (operands[0], const0_rtx, NULL, const0_rtx));
                   2429: 
                   2430:   for (i = 0; i < XVECLEN (operands[2], 0); i++)
                   2431:     {
                   2432:       rtx set = XVECEXP (operands[2], 0, i);
                   2433:       emit_move_insn (SET_DEST (set), SET_SRC (set));
                   2434:     }
                   2435: 
                   2436:   /* The optimizer does not know that the call sets the function value
                   2437:      registers we stored in the result block.  We avoid problems by
                   2438:      claiming that all hard registers are used and clobbered at this
                   2439:      point.  */
                   2440:   emit_insn (gen_blockage ());
                   2441: 
                   2442:   DONE;
                   2443: }")
                   2444: 
                   2445: ;; UNSPEC_VOLATILE is considered to use and clobber all hard registers and
                   2446: ;; all of memory.  This blocks insns from being moved across this point.
                   2447: 
                   2448: (define_insn "blockage"
                   2449:   [(unspec_volatile [(const_int 0)] 0)]
                   2450:   ""
                   2451:   "")
                   2452: 
                   2453: (define_insn "nop"
                   2454:   [(const_int 0)]
                   2455:   ""
                   2456:   "nop")
                   2457: 
                   2458: ;; This should not be used unless the add/sub insns can't be.
                   2459: 
                   2460: (define_insn ""
                   2461:   [(set (match_operand:SI 0 "general_operand" "=a")
                   2462:        (match_operand:QI 1 "address_operand" "p"))]
                   2463:   ""
                   2464:   "lea %a1,%0")
                   2465: 
                   2466: ;; This is the first machine-dependent peephole optimization.
                   2467: ;; It is useful when a floating value is returned from a function call
                   2468: ;; and then is moved into an FP register.
                   2469: ;; But it is mainly intended to test the support for these optimizations.
                   2470: 
                   2471: ;Not applicable to Alliant -- floating results are returned in fp0
                   2472: ;(define_peephole
                   2473: ;  [(set (reg:SI 15) (plus:SI (reg:SI 15) (const_int 4)))
                   2474: ;   (set (match_operand:DF 0 "register_operand" "f")
                   2475: ;      (match_operand:DF 1 "register_operand" "ad"))]
                   2476: ;  "FP_REG_P (operands[0]) && ! FP_REG_P (operands[1])"
                   2477: ;  "*
                   2478: ;{
                   2479: ;  rtx xoperands[2];
                   2480: ;  xoperands[1] = gen_rtx (REG, SImode, REGNO (operands[1]) + 1);
                   2481: ;  output_asm_insn (\"mov%.l %1,%@\", xoperands);
                   2482: ;  output_asm_insn (\"mov%.l %1,%-\", operands);
                   2483: ;  return \"fmove%.d %+,%0\";
                   2484: ;}
                   2485: ;")

unix.superglobalmegacorp.com

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