Annotation of researchv10dc/cmd/gcc/m68k.md, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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