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

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

unix.superglobalmegacorp.com

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