Annotation of GNUtools/cc/config/gmicro/gmicro.md, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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