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

1.1       root        1: ;;- Machine description for GNU compiler, Clipper Version
1.1.1.3 ! root        2: ;;   Copyright (C) 1987, 1988, 1991, 1993, 1994 Free Software Foundation, Inc.
1.1       root        3: ;; Contributed by Holger Teutsch ([email protected])
                      4: 
                      5: ;; This file is part of GNU CC.
                      6: 
                      7: ;; GNU CC is free software; you can redistribute it and/or modify
                      8: ;; it under the terms of the GNU General Public License as published by
                      9: ;; the Free Software Foundation; either version 2, or (at your option)
                     10: ;; any later version.
                     11: 
                     12: ;; GNU CC is distributed in the hope that it will be useful,
                     13: ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
                     14: ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     15: ;; GNU General Public License for more details.
                     16: 
                     17: ;; You should have received a copy of the GNU General Public License
                     18: ;; along with GNU CC; see the file COPYING.  If not, write to
                     19: ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
                     20: 
                     21: 
                     22: ;;- Instruction patterns.  When multiple patterns apply,
                     23: ;;- the first one in the file is chosen.
                     24: ;;-
                     25: ;;- See file "rtl.def" for documentation on define_insn, match_*, et. al.
                     26: ;;-
                     27: ;;- cpp macro #define NOTICE_UPDATE_CC in file tm.h handles condition code
                     28: ;;- updates for most instructions.
                     29: 
                     30: ;;
                     31: ;; define attributes
                     32: ;;
                     33: ;; instruction type
                     34: ;;
                     35: ;; unknown is temporary in order to generate 'cc clobber' until attribute
                     36: ;; assignment is consistent
                     37: ;;
                     38: (define_attr "type" "load,store,arith,fp,branch,unknown"
                     39:  (const_string "unknown"))
                     40: 
                     41: ;; condition code setting
                     42: ;;
                     43: ;; clobber     destroyed
                     44: ;; unchanged
                     45: ;; set1                set cc_status.value1, e.g. sub r0,r1
                     46: ;; set2                set value1 and value2, e.g. mov r0,r1
                     47: ;; change0     may be side effect, i.e. load mem,r0
                     48: ;;
                     49: ;; note: loadi and loadq are 'arith' instructions that set the condition codes
                     50: ;;       mul,div,mod do NOT set the condition codes
                     51: ;;
                     52: (define_attr "cc" "clobber,unchanged,set1,set2,change0"
                     53:  (cond [(eq_attr "type" "load")        (const_string "change0")
                     54:        (eq_attr "type" "store,branch") (const_string "unchanged")
                     55:        (eq_attr "type" "arith") (if_then_else (match_operand:SI 0 "" "")
                     56:                                  (const_string "set1")
                     57:                                  (const_string "clobber"))
                     58:        ]
                     59:   (const_string "clobber")))
                     60: 
                     61: ;;
                     62: ;; clipper seems to be a tradional risc processor
                     63: ;; we define a functional unit 'memory'
                     64: ;;
                     65: (define_function_unit "memory" 1 1 (eq_attr "type" "load") 4 0)     
                     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 "int_reg_operand" "r"))]
                     75:   ""
                     76:   "cmpq   $0,%0")
                     77: 
                     78: (define_insn "cmpsi"
                     79:   [(set (cc0)
                     80:        (compare (match_operand:SI 0 "nonimmediate_operand" "r,r,n")
                     81:                 (match_operand:SI 1 "nonmemory_operand" "r,n,r")))]
                     82:   ""
                     83:   "*
                     84: {
                     85:   int val;
                     86: 
                     87:   if (which_alternative == 0)
                     88:     return \"cmpw   %1,%0\";
                     89: 
                     90:   if (which_alternative == 1)
                     91:     {
                     92:       val = INTVAL (operands[1]);
                     93:       if (0 <= val && val < 16)
                     94:        return \"cmpq   %1,%0\";
                     95:       return \"cmpi   %1,%0\";
                     96:     }
                     97: 
                     98:   cc_status.flags |= CC_REVERSED;      /* immediate must be first */
                     99: 
                    100:   val = INTVAL (operands[0]);
                    101: 
                    102:   if (0 <= val && val < 16)
                    103:     return \"cmpq   %0,%1\";
                    104: 
                    105:   return \"cmpi   %0,%1\";
                    106: }")
                    107: 
                    108: (define_insn "cmpdf"
                    109:   [(set (cc0)
                    110:        (compare (match_operand:DF 0 "fp_reg_operand" "f")
                    111:                 (match_operand:DF 1 "fp_reg_operand" "f")))]
                    112:   ""
                    113:   "cmpd   %1,%0")
                    114: 
                    115: (define_insn "cmpsf"
                    116:   [(set (cc0)
                    117:        (compare (match_operand:SF 0 "fp_reg_operand" "f")
                    118:                 (match_operand:SF 1 "fp_reg_operand" "f")))]
                    119:   ""
                    120:   "cmps   %1,%0")
                    121: 
                    122: 
                    123: ;;
                    124: ;; double and single float move
                    125: ;;
                    126: (define_expand "movdf"
                    127:   [(set (match_operand:DF 0 "general_operand" "")
                    128:        (match_operand:DF 1 "general_operand" ""))]
                    129:   ""
                    130:   "
                    131: {
                    132:   if (GET_CODE (operands[0]) == MEM)
                    133:     {
                    134:       if (GET_CODE (operands[1]) == CONST_DOUBLE)
                    135:        operands[1] = force_reg (DFmode,
                    136:                                 force_const_mem (DFmode, operands[1]));
                    137:       else if (GET_CODE (operands[1]) != REG)
                    138:        operands[1] = force_reg (DFmode, operands[1]);
                    139:     }
                    140: 
                    141:   else if (GET_CODE (operands[1]) == CONST_DOUBLE)
                    142:     operands[1] = force_const_mem (DFmode, operands[1]);
                    143: }")
                    144: 
                    145: ;;
                    146: ;; provide two patterns with different predicates as we don't want combine
                    147: ;; to recombine a mem -> mem move
                    148: ;; 
                    149: (define_insn ""
1.1.1.2   root      150:   [(set (match_operand:DF 0 "register_operand" "=*rf")
                    151:        (match_operand:DF 1 "nonimmediate_operand" "*rfo"))]
1.1       root      152:   ""
                    153:   "*
                    154: {
                    155: #define FP_REG_P(X) (GET_CODE (X) == REG && REGNO (X) >= 16)
                    156: 
                    157:   if (FP_REG_P (operands[0]))
                    158:     {
                    159:       if (FP_REG_P (operands[1]))      /* f -> f */
                    160:        return \"movd   %1,%0\";
                    161: 
                    162:       if (GET_CODE (operands[1]) == REG) /* r -> f */
                    163:        return \"movld  %1,%0\";
                    164: 
                    165:       return \"loadd  %1,%0\";         /* m -> f */
                    166:     }
                    167: 
                    168:   if (FP_REG_P (operands[1]))
                    169:     {
                    170:       if (GET_CODE (operands[0]) == REG) /* f -> r */
                    171:        return \"movdl  %1,%0\";
                    172: 
                    173:       abort ();
                    174:     }
                    175: 
                    176:   if (GET_CODE (operands[1]) == MEM)   /* m -> r */
                    177:     {
                    178:       rtx xops[4];
                    179:       xops[0] = operands[0];
                    180:       xops[1] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1);
                    181:       xops[2] = operands[1];
                    182:       xops[3] = adj_offsettable_operand (operands[1], 4);
                    183:       output_asm_insn (\"loadw  %2,%0\;loadw  %3,%1\", xops);
                    184:       return \"\";
                    185:     }
                    186: 
                    187:   if (GET_CODE (operands[1]) == REG)   /* r -> r */
                    188:     {
                    189:       rtx xops[4];
                    190:       xops[0] = operands[0];
                    191:       xops[1] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1);
                    192:       xops[2] = operands[1];
                    193:       xops[3] = gen_rtx (REG, SImode, REGNO (operands[1]) + 1);
                    194:       output_asm_insn (\"movw   %2,%0\;movw   %3,%1\", xops);
                    195:       return \"\";
                    196:     }
                    197: 
                    198:   abort ();
                    199: #undef FP_REG_P
                    200: }")
                    201: 
                    202: 
                    203: (define_insn ""
                    204:   [(set (match_operand:DF 0 "memory_operand" "=o,m")
1.1.1.2   root      205:        (match_operand:DF 1 "register_operand" "*rf,f"))]
1.1       root      206:   ""
                    207:   "*
                    208: {
1.1.1.2   root      209:   rtx xops[4];
                    210: 
                    211:   if (REGNO (operands[1]) >= 16)       /* f -> m */
                    212:     return \"stord  %1,%0\";
1.1       root      213: 
1.1.1.2   root      214:   xops[0] = operands[0];               /* r -> o */
                    215:   xops[1] = adj_offsettable_operand (operands[0], 4);
                    216:   xops[2] = operands[1];
                    217:   xops[3] = gen_rtx (REG, SImode, REGNO (operands[1]) + 1);
                    218:   output_asm_insn (\"storw  %2,%0\;storw  %3,%1\", xops);
                    219:   return \"\";
1.1       root      220: }"
                    221: [(set_attr "type" "store,store")
                    222:  (set_attr "cc" "clobber,unchanged")])
                    223: 
                    224: 
                    225: (define_expand "movsf"
                    226:   [(set (match_operand:SF 0 "general_operand" "")
                    227:        (match_operand:SF 1 "general_operand" ""))]
                    228:   ""
                    229:   "
                    230: {
                    231:   if (GET_CODE (operands[0]) == MEM)
                    232:     {
                    233:       if (GET_CODE (operands[1]) == CONST_DOUBLE)
                    234:        operands[1] = force_reg (SFmode,
                    235:                                 force_const_mem (SFmode, operands[1]));
                    236:       else if (GET_CODE (operands[1]) != REG)
                    237:        operands[1] = force_reg (SFmode, operands[1]);
                    238:     }
                    239: 
                    240:   else if (GET_CODE (operands[1]) == CONST_DOUBLE)
                    241:     operands[1] = force_const_mem (SFmode, operands[1]);
                    242: }")
                    243: 
                    244: ;;
                    245: ;; provide two patterns with different predicates as we don't want combine
                    246: ;; to recombine a mem -> mem move
                    247: ;; 
                    248: (define_insn ""
1.1.1.2   root      249:   [(set (match_operand:SF 0 "register_operand" "=*rf")
                    250:        (match_operand:SF 1 "nonimmediate_operand" "*rfm"))]
1.1       root      251:   ""
                    252:   "*
                    253: {
                    254: #define FP_REG_P(X) (GET_CODE (X) == REG && REGNO (X) >= 16)
                    255: 
                    256:   if (FP_REG_P (operands[0]))
                    257:     {
                    258:       if (FP_REG_P (operands[1]))      /* f -> f */
                    259:        return \"movs   %1,%0\";
                    260:       if (GET_CODE (operands[1]) == REG) /* r -> f */
                    261:        return
                    262:          \"subq   $8,sp\;storw  %1,(sp)\;loads  (sp),%0\;addq   $8,sp\";
                    263:       return \"loads  %1,%0\";         /* m -> f */
                    264:     }
                    265: 
                    266:   if (FP_REG_P (operands[1]))
                    267:     {
                    268:       if (GET_CODE (operands[0]) == REG) /* f -> r */
                    269:        return
                    270:          \"subq   $8,sp\;stors  %1,(sp)\;loadw  (sp),%0\;addq   $8,sp\";
                    271:       abort ();
                    272:     }
                    273: 
                    274:   if (GET_CODE (operands[1]) == MEM)   /* m -> r */
                    275:     return \"loadw   %1,%0\";
                    276: 
                    277:   if (GET_CODE (operands[1]) == REG)   /* r -> r */
                    278:     return \"movw    %1,%0\";
                    279: 
                    280:   abort ();
                    281: #undef FP_REG_P
                    282: }")
                    283: 
                    284: (define_insn ""
                    285:   [(set (match_operand:SF 0 "memory_operand" "=m")
1.1.1.2   root      286:        (match_operand:SF 1 "register_operand" "*rf"))]
1.1       root      287:   ""
                    288:   "*
                    289: {
                    290:   if (GET_CODE (operands[1]) == REG && REGNO (operands[1]) >= 16)
                    291:     return \"stors  %1,%0\";           /* f-> m */
                    292: 
                    293:   return \"storw   %1,%0\";            /* r -> m */
                    294: }"
                    295: [(set_attr "type" "store")])
                    296: 
                    297: 
                    298: (define_expand "movdi"
                    299:   [(set (match_operand:DI 0 "general_operand" "")
                    300:        (match_operand:DI 1 "general_operand" ""))]
                    301:   ""
                    302:   "
                    303: {
                    304:   if (GET_CODE (operands[0]) == MEM && GET_CODE (operands[1]) != REG)
                    305:     operands[1] = force_reg (DImode, operands[1]);
                    306: }")
                    307: 
1.1.1.2   root      308: ;; If an operand is a MEM but not offsetable, we can't load it into
                    309: ;; a register, so we must force the third alternative to be the one
                    310: ;; reloaded.  Hence we show the first as more expensive.
1.1       root      311: (define_insn ""
1.1.1.2   root      312:   [(set (match_operand:DI 0 "register_operand" "=?r,r,r")
1.1       root      313:        (match_operand:DI 1 "general_operand"   "r,n,o"))]
                    314:   ""
                    315:   "*
                    316: {
                    317:   rtx xoperands[2],yoperands[2];
                    318: 
                    319:   xoperands[0] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1);
                    320: 
                    321:   if (which_alternative == 0)          /* r -> r */
                    322:     {
                    323:       output_asm_insn (\"movw   %1,%0\", operands);
                    324:       xoperands[1] = gen_rtx (REG, SImode, REGNO (operands[1]) + 1);
                    325:       output_asm_insn (\"movw   %1,%0\", xoperands);
                    326:       return \"\";
                    327:     }
                    328: 
                    329:   if (which_alternative == 1)          /* n -> r */
                    330:     {
                    331:       if (GET_CODE (operands[1]) == CONST_INT)
                    332:        {
                    333:          output_asm_insn (\"loadi   %1,%0\", operands);
                    334:          output_asm_insn (\"loadq   $0,%0\", xoperands);
                    335:          return \"\";
                    336:        }
                    337: 
                    338:       if (GET_CODE (operands[1]) != CONST_DOUBLE)
                    339:        abort ();
                    340: 
                    341:       yoperands[0] = operands[0];
                    342:       yoperands[1] = gen_rtx (CONST_INT, VOIDmode,
                    343:                              CONST_DOUBLE_LOW (operands[1]));
                    344:       output_asm_insn (\"loadi  %1,%0\", yoperands);
                    345: 
                    346:       xoperands[1] = gen_rtx (CONST_INT, VOIDmode,
                    347:                              CONST_DOUBLE_HIGH (operands[1]));
                    348:       output_asm_insn (\"loadi  %1,%0\", xoperands);
                    349:       return \"\";
                    350:     }
                    351:                                        /* m -> r */
                    352:   output_asm_insn (\"loadw  %1,%0\", operands);
                    353:   xoperands[1] = adj_offsettable_operand (operands[1], 4);
                    354:   output_asm_insn (\"loadw  %1,%0\", xoperands);
                    355:   return \"\";
                    356: }" 
                    357: [(set_attr "type" "arith,arith,load")
                    358:   (set_attr "cc" "clobber,clobber,clobber")])
                    359: 
                    360: (define_insn ""
                    361:   [(set (match_operand:DI 0 "memory_operand" "=o")
                    362:        (match_operand:DI 1 "register_operand" "r"))]
                    363:   ""
                    364:   "*
                    365: {
                    366:   rtx xops[4];
                    367:   xops[0] = operands[0];
                    368:   xops[1] = adj_offsettable_operand (operands[0], 4);
                    369:   xops[2] = operands[1];
                    370:   xops[3] = gen_rtx (REG, SImode, REGNO (operands[1]) + 1);
                    371:   output_asm_insn (\"storw  %2,%0\;storw  %3,%1\", xops);
                    372:   return \"\";
                    373: }"
                    374: [(set_attr "type" "store")
                    375:  (set_attr "cc" "clobber")])
                    376: 
                    377: (define_expand "movsi"
                    378:   [(set (match_operand:SI 0 "general_operand" "")
                    379:        (match_operand:SI 1 "general_operand" ""))]
                    380:   ""
                    381:   "
                    382: {
                    383:   if (GET_CODE (operands[0]) == MEM &&
                    384:       GET_CODE (operands[1]) != REG)
                    385:     operands[1] = force_reg (SImode, operands[1]);
                    386: }")
                    387: 
1.1.1.3 ! root      388: ;; Reject both args with `general_operand' if not reloading because a
        !           389: ;; mem -> mem move that was split by 'movsi' can be recombined to
        !           390: ;; mem -> mem by the combiner.
        !           391: ;;
        !           392: ;; As a pseudo register can end up in a stack slot during reloading we must
        !           393: ;; allow a r->m move for the next pattern. 
        !           394: ;; The first predicate must be `general_operand' because a predicate must
        !           395: ;; be true for each constraint.
        !           396: ;;  
        !           397: (define_insn ""
        !           398:   [(set (match_operand:SI 0 "general_operand" "=r,r,r,r,m")
        !           399:        (match_operand:SI 1 "general_operand"  "r,m,n,i,r"))]
        !           400:   "reload_in_progress || register_operand (operands[0], SImode)"
1.1       root      401:   "*
                    402: {
                    403:   int val;
                    404: 
                    405:   if (which_alternative == 0)
                    406:     return \"movw   %1,%0\";           /* reg -> reg */
                    407: 
                    408:   if (which_alternative == 1)
                    409:     return \"loadw  %1,%0\";           /* mem -> reg */
                    410: 
                    411:   if (which_alternative == 2)
                    412:     {
                    413:       val = INTVAL (operands[1]);      /* known const ->reg */
                    414: 
                    415:       if (val == -1)
                    416:        return \"notq   $0,%0\";
                    417: 
                    418:       if (val < 0 || val >= 16)
                    419:        return \"loadi  %1,%0\";
                    420: 
                    421:       return \"loadq  %1,%0\";
                    422:     }
                    423: 
                    424:   if (which_alternative == 3)          /* unknown const */
                    425:     return \"loada  %a1,%0\";
1.1.1.3 ! root      426: 
        !           427:   return \"storw  %1,%0\";
1.1       root      428: }"
1.1.1.3 ! root      429: [(set_attr "type" "arith,load,arith,load,store")
        !           430:  (set_attr "cc" "set2,change0,set1,change0,unchanged")])
1.1       root      431: 
                    432: 
                    433: (define_insn ""
                    434:   [(set (match_operand:SI 0 "memory_operand" "=m")
                    435:        (match_operand:SI 1 "int_reg_operand" "r"))]
                    436:   ""
                    437:   "storw  %1,%0"
                    438: [(set_attr "type" "store")])
                    439: 
                    440: ;; movhi
                    441: ;;
                    442: ;; loadh  mem to reg
                    443: ;; storh  reg to mem
                    444: ;;
                    445: ;;
                    446: (define_expand "movhi"
                    447:   [(set (match_operand:HI 0 "general_operand" "")
                    448:        (match_operand:HI 1 "general_operand" ""))]
                    449:   ""
                    450:   "
                    451: {
                    452:   if (GET_CODE (operands[0]) == MEM
                    453:       && ! register_operand (operands[1], HImode))
                    454:     operands[1] = force_reg (HImode, operands[1]);
                    455: }")
                    456: 
                    457: 
                    458: (define_insn ""
                    459:   [(set (match_operand:HI 0 "register_operand" "=r,r,r")
                    460:        (match_operand:HI 1 "general_operand"   "r,m,n"))]
                    461:   ""
                    462:   "@
                    463:    movw   %1,%0
                    464:    loadh  %1,%0
                    465:    loadi  %1,%0"
                    466: [(set_attr "type" "arith,load,arith")])
                    467: 
                    468: (define_insn ""
                    469:   [(set (match_operand:HI 0 "memory_operand"  "=m")
                    470:        (match_operand:HI 1 "register_operand" "r"))]
                    471:   ""
                    472:   "storh  %1,%0"
                    473:  [(set_attr "type" "store")])
                    474: 
                    475: ;; movqi
                    476: ;;
                    477: ;; loadb  mem to reg
                    478: ;; storb  reg to mem
                    479: ;;
                    480: (define_expand "movqi"
                    481:   [(set (match_operand:QI 0 "general_operand" "")
                    482:        (match_operand:QI 1 "general_operand" ""))]
                    483:   ""
                    484:   "
                    485: {
                    486:   if (GET_CODE (operands[0]) == MEM && 
                    487:       ! register_operand (operands[1], QImode))
                    488:     operands[1] = force_reg (QImode, operands[1]);
                    489: }")
                    490: 
                    491: 
                    492: (define_insn ""
                    493:   [(set (match_operand:QI 0 "register_operand" "=r,r,r")
                    494:        (match_operand:QI 1 "general_operand"   "r,m,n"))]
                    495:   ""
                    496:   "@
                    497:    movw   %1,%0
                    498:    loadb  %1,%0
                    499:    loadi  %1,%0"
                    500: [(set_attr "type" "arith,load,arith")])
                    501: 
                    502: (define_insn ""
                    503:   [(set (match_operand:QI 0 "memory_operand" "=m")
                    504:        (match_operand:QI 1 "register_operand" "r"))]
                    505:   ""
                    506:   "storb  %1,%0"
                    507: [(set_attr "type" "store")])
                    508: 
                    509: 
                    510: ;;
                    511: ;; block move
                    512: ;;
                    513: (define_expand "movstrsi"
                    514:   [(parallel
                    515:     [(set (match_operand:BLK 0 "memory_operand" "")
                    516:           (match_operand:BLK 1 "memory_operand" ""))
                    517:      (use (match_operand:SI 2 "general_operand" ""))
                    518:      (use (match_operand:SI 3 "const_int_operand" ""))
                    519:      (clobber (match_scratch:SI 4 ""))
                    520:      (clobber (match_scratch:SI 5 ""))
                    521:      (clobber (match_dup 6))
                    522:      (clobber (match_dup 7))])]
                    523:   ""
                    524:   "
                    525: {
                    526:   rtx addr0, addr1;
                    527: 
                    528:   addr0 = copy_to_mode_reg (Pmode, XEXP (operands[0], 0));
                    529:   addr1 = copy_to_mode_reg (Pmode, XEXP (operands[1], 0));
                    530: 
                    531:   operands[6] = addr0;
                    532:   operands[7] = addr1;
                    533: 
                    534:   operands[0] = gen_rtx (MEM, BLKmode, addr0);
                    535:   operands[1] = gen_rtx (MEM, BLKmode, addr1);
                    536: 
                    537:   if (GET_CODE (operands[2]) != CONST_INT)
                    538:     operands[2] = force_reg (SImode, operands[2]);
                    539: }")
                    540: 
                    541: ;;
                    542: ;; there is a problem with this insn in gcc-2.2.3
                    543: ;; (clobber (match_dup 2)) does not prevent use of this operand later
                    544: ;; we always use a scratch register and leave operand 2 unchanged
                    545: ;;
                    546: (define_insn ""
                    547:   [(set (mem:BLK (match_operand:SI 0 "register_operand" "r"))
                    548:        (mem:BLK (match_operand:SI 1 "register_operand" "r")))
                    549:    (use (match_operand:SI 2 "nonmemory_operand" "rn"))
                    550:    (use (match_operand:SI 3 "const_int_operand" "n"))
                    551:    (clobber (match_scratch:SI 4 "=r"))
                    552:    (clobber (match_scratch:SI 5 "=r"))
                    553:    (clobber (match_dup 0))
                    554:    (clobber (match_dup 1))]
                    555:   ""
                    556:   "*
                    557: {
                    558:   extern void clipper_movstr ();
                    559:   clipper_movstr (operands);
                    560:   return \"\";
                    561: }"
                    562: [(set_attr "cc" "clobber")])
                    563: 
                    564: 
                    565: 
                    566: ;; Extension and truncation insns.
                    567: (define_insn "extendhisi2"
                    568:   [(set (match_operand:SI 0 "int_reg_operand" "=r,r")
                    569:        (sign_extend:SI (match_operand:HI 1 "general_operand" "0,m")))]
                    570:   ""
                    571:   "@
                    572:    andi   $65535,%0\;xori   $32768,%0\;subi   $32768,%0
                    573:    loadh  %1,%0"
                    574: [(set_attr "type" "arith,load")])
                    575: 
                    576: 
                    577: (define_insn "extendqihi2"
                    578:   [(set (match_operand:HI 0 "int_reg_operand" "=r,r")
                    579:        (sign_extend:HI (match_operand:QI 1 "general_operand" "0,m")))]
                    580:   ""
                    581:   "@
                    582:    andi   $255,%0\;xori   $128,%0\;subi   $128,%0
                    583:    loadb  %1,%0"
                    584: [(set_attr "type" "arith,load")
                    585:  (set_attr "cc" "set1,change0")])
                    586: 
                    587: 
                    588: (define_insn "extendqisi2"
                    589:   [(set (match_operand:SI 0 "int_reg_operand" "=r,r")
                    590:        (sign_extend:SI (match_operand:QI 1 "general_operand" "0,m")))]
                    591:   ""
                    592:   "@
                    593:    andi   $255,%0\;xori   $128,%0\;subi   $128,%0
                    594:    loadb  %1,%0"
                    595: [(set_attr "type" "arith,load")])
                    596: 
                    597: 
                    598: (define_insn "extendsfdf2"
                    599:   [(set (match_operand:DF 0 "fp_reg_operand" "=f")
                    600:        (float_extend:DF (match_operand:SF 1 "fp_reg_operand" "f")))]
                    601:   ""
                    602:   "cnvsd  %1,%0")
                    603: 
                    604: (define_insn "truncdfsf2"
                    605:   [(set (match_operand:SF 0 "fp_reg_operand" "=f")
                    606:        (float_truncate:SF (match_operand:DF 1 "fp_reg_operand" "f")))]
                    607:   ""
                    608:   "cnvds  %1,%0")
                    609: 
                    610: (define_insn "zero_extendhisi2"
                    611:   [(set (match_operand:SI 0 "int_reg_operand" "=r,r")
                    612:        (zero_extend:SI (match_operand:HI 1 "general_operand" "0,m")))]
                    613:   ""
                    614:   "@
                    615:    andi   $65535,%0
                    616:    loadhu %1,%0"
                    617: [(set_attr "type" "arith,load")])
                    618: 
                    619: 
                    620: (define_insn "zero_extendqihi2"
                    621:   [(set (match_operand:HI 0 "int_reg_operand" "=r,r")
                    622:        (zero_extend:HI (match_operand:QI 1 "general_operand" "0,m")))]
                    623:   ""
                    624:   "@
                    625:    andi   $255,%0
                    626:    loadbu %1,%0"
                    627: [(set_attr "type" "arith,load")
                    628:  (set_attr "cc" "clobber,clobber")])
                    629: 
                    630: 
                    631: (define_insn "zero_extendqisi2"
                    632:   [(set (match_operand:SI 0 "int_reg_operand" "=r,r")
                    633:        (zero_extend:SI (match_operand:QI 1 "general_operand" "0,m")))]
                    634:   ""
                    635:   "@
                    636:    andi   $255,%0
                    637:    loadbu %1,%0"
                    638: [(set_attr "type" "arith,load")])
                    639: 
                    640: 
                    641: 
                    642: ;; Fix-to-float conversion insns.
                    643: 
                    644: (define_insn "floatsisf2"
                    645:   [(set (match_operand:SF 0 "fp_reg_operand" "=f")
                    646:        (float:SF (match_operand:SI 1 "int_reg_operand" "r")))]
                    647:   ""
                    648:   "cnvws  %1,%0")
                    649: 
                    650: (define_insn "floatsidf2"
                    651:   [(set (match_operand:DF 0 "fp_reg_operand" "=f")
                    652:        (float:DF (match_operand:SI 1 "int_reg_operand" "r")))]
                    653:   ""
                    654:   "cnvwd  %1,%0")
                    655: 
                    656: 
                    657: ;; Float-to-fix conversion insns.
                    658: 
                    659: (define_insn "fix_truncsfsi2"
                    660:   [(set (match_operand:SI 0 "int_reg_operand" "=r")
                    661:        (fix:SI (fix:SF (match_operand:SF 1 "fp_reg_operand" "f"))))]
                    662:   ""
                    663:   "cnvtsw %1,%0")
                    664: 
                    665: (define_insn "fix_truncdfsi2"
                    666:   [(set (match_operand:SI 0 "int_reg_operand" "=r")
                    667:        (fix:SI (fix:DF (match_operand:DF 1 "fp_reg_operand" "f"))))]
                    668:   ""
                    669:   "cnvtdw %1,%0")
                    670: 
                    671: ;;- All kinds of add instructions.
                    672: 
                    673: (define_insn "adddf3"
                    674:   [(set (match_operand:DF 0 "fp_reg_operand" "=f")
                    675:        (plus:DF (match_operand:DF 1 "fp_reg_operand" "0")
                    676:                 (match_operand:DF 2 "fp_reg_operand" "f")))]
                    677:   ""
                    678:   "addd   %2,%0"
                    679:  [(set_attr "type" "fp")])
                    680: 
                    681: 
                    682: (define_insn "addsf3"
                    683:   [(set (match_operand:SF 0 "fp_reg_operand" "=f")
                    684:        (plus:SF (match_operand:SF 1 "fp_reg_operand" "0")
                    685:                 (match_operand:SF 2 "fp_reg_operand" "f")))]
                    686:   ""
                    687:   "adds   %2,%0"
                    688:  [(set_attr "type" "fp")])
                    689: 
                    690: (define_insn "adddi3"
                    691:   [(set (match_operand:DI 0 "int_reg_operand" "=r")
                    692:        (plus:DI (match_operand:DI 1 "int_reg_operand" "%0")
                    693:                 (match_operand:DI 2 "int_reg_operand" "r")))]
                    694:   ""
                    695:   "*
                    696: {
                    697:   rtx xoperands[4];
                    698: 
                    699:   xoperands[0] = operands[0];
                    700:   xoperands[1] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1);
                    701:   xoperands[2] = operands[2];
                    702:   xoperands[3] = gen_rtx (REG, SImode, REGNO (operands[2]) + 1);
                    703:   output_asm_insn (\"addw   %2,%0\;addwc  %3,%1\", xoperands);
                    704:   return \"\";
                    705: }"
                    706: [(set_attr "type" "arith")
                    707:  (set_attr "cc" "clobber")])
                    708: 
                    709: (define_insn "addsi3"
                    710:   [(set (match_operand:SI 0 "int_reg_operand" "=r,r,r")
                    711:        (plus:SI (match_operand:SI 1 "int_reg_operand" "%0,r,r")
                    712:                 (match_operand:SI 2 "nonmemory_operand" "rn,0,rn")))]
                    713:   ""
                    714:   "*
                    715: {
                    716:   if (which_alternative == 2)          /* 3 address version */
                    717:     {
                    718:       if (GET_CODE (operands[2]) == CONST_INT)
                    719:        return \"loada  %a2(%1),%0\";
                    720:       return \"loada  [%2](%1),%0\";
                    721:     }
                    722:                                        /* 2 address version */
                    723:   if (GET_CODE (operands[2]) == CONST_INT)
                    724:     {
                    725:       int val = INTVAL (operands[2]);
                    726: 
                    727:       if (val >= 16 || val == 0x80000000)
                    728:        return \"addi   %2,%0\";
                    729: 
                    730:       if (val < 0)                     /* change to sub */
                    731:        {
                    732:          rtx xops[2];
                    733: 
                    734:          val = -val;
                    735: 
                    736:          xops[0] = operands[0];
                    737:          xops[1] = gen_rtx (CONST_INT, VOIDmode, val);
                    738: 
                    739:          if (val >= 16)
                    740:            output_asm_insn (\"subi   %1,%0\", xops);
                    741:          else
                    742:            output_asm_insn (\"subq   %1,%0\", xops);
                    743: 
                    744:          return \"\";
                    745:        }
                    746: 
                    747:       return \"addq   %2,%0\";
                    748:     }
                    749: 
                    750:   if (which_alternative == 0)
                    751:     return \"addw   %2,%0\";
                    752: 
                    753:   return \"addw   %1,%0\";
                    754: }"
                    755: [(set_attr "type" "arith,arith,arith")
                    756:  (set_attr "cc" "set1,set1,change0")])
                    757: 
                    758: 
                    759: ;;- All kinds of subtract instructions.
                    760: 
                    761: (define_insn "subdi3"
                    762:   [(set (match_operand:DI 0 "int_reg_operand" "=r")
1.1.1.3 ! root      763:        (minus:DI (match_operand:DI 1 "int_reg_operand" "0")
1.1       root      764:                  (match_operand:DI 2 "int_reg_operand" "r")))]
                    765:   ""
                    766:   "*
                    767: {
                    768:   rtx xoperands[4];
                    769: 
                    770:   xoperands[0] = operands[0];
                    771:   xoperands[1] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1);
                    772:   xoperands[2] = operands[2];
                    773:   xoperands[3] = gen_rtx (REG, SImode, REGNO (operands[2]) + 1);
                    774:   output_asm_insn (\"subw   %2,%0\;subwc  %3,%1\", xoperands);
                    775:   return \"\";
                    776: }"
                    777: [(set_attr "type" "arith")
                    778:  (set_attr "cc" "clobber")])
                    779: 
                    780: (define_insn "subsi3"
                    781:   [(set (match_operand:SI 0 "int_reg_operand" "=r")
                    782:        (minus:SI (match_operand:SI 1 "int_reg_operand" "0")
                    783:                  (match_operand:SI 2 "nonmemory_operand" "rn")))]
                    784:   ""
                    785:   "*
                    786: {
                    787:   if (GET_CODE (operands[2]) == CONST_INT)
                    788:     {
                    789:       int val = INTVAL (operands[2]);
                    790: 
                    791:       if (val < 0 || val >= 16)
                    792:        return \"subi   %2,%0\";
                    793:       else
                    794:        return \"subq   %2,%0\";
                    795:     }
                    796: 
                    797:   return \"subw   %2,%0\";
                    798: }"
                    799: [(set_attr "type" "arith")])
                    800: 
                    801: (define_insn "subdf3"
                    802:   [(set (match_operand:DF 0 "fp_reg_operand" "=f")
                    803:        (minus:DF (match_operand:DF 1 "fp_reg_operand" "0")
                    804:                  (match_operand:DF 2 "fp_reg_operand" "f")))]
                    805:   ""
                    806:   "subd   %2,%0"
                    807:  [(set_attr "type" "fp")])
                    808: 
                    809: (define_insn "subsf3"
                    810:   [(set (match_operand:SF 0 "fp_reg_operand" "=f")
                    811:        (minus:SF (match_operand:SF 1 "fp_reg_operand" "0")
                    812:                  (match_operand:SF 2 "fp_reg_operand" "f")))]
                    813:   ""
                    814:   "subs   %2,%0"
                    815:  [(set_attr "type" "fp")])
                    816: 
                    817: 
                    818: ;;- Multiply instructions.
                    819: 
                    820: (define_insn "muldf3"
                    821:   [(set (match_operand:DF 0 "fp_reg_operand" "=f")
                    822:        (mult:DF (match_operand:DF 1 "fp_reg_operand" "0")
                    823:                 (match_operand:DF 2 "fp_reg_operand" "f")))]
                    824:   ""
                    825:   "muld   %2,%0"
                    826:  [(set_attr "type" "fp")])
                    827: 
                    828: (define_insn "mulsf3"
                    829:   [(set (match_operand:SF 0 "fp_reg_operand" "=f")
                    830:        (mult:SF (match_operand:SF 1 "fp_reg_operand" "0")
                    831:                 (match_operand:SF 2 "fp_reg_operand" "f")))]
                    832:   ""
                    833:   "muls   %2,%0"
                    834:  [(set_attr "type" "fp")])
                    835: 
                    836: (define_insn "mulsidi3"
                    837:   [(set (match_operand:DI 0 "int_reg_operand" "=r")
                    838:        (mult:DI (sign_extend:DI (match_operand:SI 1 "int_reg_operand" "%0"))
                    839:                 (sign_extend:DI (match_operand:SI 2 "int_reg_operand" "r"))))]
                    840:   ""
                    841:   "mulwx  %2,%0"
                    842: [(set_attr "type" "arith")
                    843:  (set_attr "cc" "clobber")])
                    844: 
                    845: (define_insn "umulsidi3"
                    846:   [(set (match_operand:DI 0 "int_reg_operand" "=r")
                    847:        (mult:DI (zero_extend:DI (match_operand:SI 1 "int_reg_operand" "%0"))
                    848:                 (zero_extend:DI (match_operand:SI 2 "int_reg_operand" "r"))))]
                    849:   ""
                    850:   "mulwux %2,%0"
                    851: [(set_attr "type" "arith")
                    852:  (set_attr "cc" "clobber")])
                    853: 
                    854: (define_insn "mulsi3"
                    855:   [(set (match_operand:SI 0 "int_reg_operand" "=r")
                    856:        (mult:SI (match_operand:SI 1 "int_reg_operand" "%0")
                    857:                 (match_operand:SI 2 "int_reg_operand" "r")))]
                    858:   ""
                    859:   "mulw   %2,%0"
                    860:  [(set_attr "type" "arith")
                    861:   (set_attr "cc" "clobber")])
                    862: 
                    863: 
                    864: ;;- Divide and mod instructions.
                    865: 
                    866: (define_insn "divdf3"
                    867:   [(set (match_operand:DF 0 "fp_reg_operand" "=f")
                    868:        (div:DF (match_operand:DF 1 "fp_reg_operand" "0")
                    869:                (match_operand:DF 2 "fp_reg_operand" "f")))]
                    870:   ""
                    871:   "divd   %2,%0"
                    872:  [(set_attr "type" "fp")])
                    873: 
                    874: (define_insn "divsf3"
                    875:   [(set (match_operand:SF 0 "fp_reg_operand" "=f")
                    876:        (div:SF (match_operand:SF 1 "fp_reg_operand" "0")
                    877:                (match_operand:SF 2 "fp_reg_operand" "f")))]
                    878:   ""
                    879:   "divs   %2,%0"
                    880:  [(set_attr "type" "fp")])
                    881: 
                    882: (define_insn "divsi3"
                    883:   [(set (match_operand:SI 0 "int_reg_operand" "=r")
                    884:        (div:SI (match_operand:SI 1 "int_reg_operand" "0")
                    885:                (match_operand:SI 2 "int_reg_operand" "r")))]
                    886:   ""
                    887:   "divw   %2,%0"
                    888:  [(set_attr "type" "arith")
                    889:   (set_attr "cc" "clobber")])
                    890: 
                    891: (define_insn "udivsi3"
                    892:   [(set (match_operand:SI 0 "int_reg_operand" "=r")
                    893:        (udiv:SI (match_operand:SI 1 "int_reg_operand" "0")
                    894:                 (match_operand:SI 2 "int_reg_operand" "r")))]
                    895:   ""
                    896:   "divwu  %2,%0"
                    897:  [(set_attr "type" "arith")
                    898:   (set_attr "cc" "clobber")])
                    899: 
                    900: 
                    901: (define_insn "modsi3"
                    902:   [(set (match_operand:SI 0 "int_reg_operand" "=r")
                    903:        (mod:SI (match_operand:SI 1 "int_reg_operand" "0")
                    904:                (match_operand:SI 2 "int_reg_operand" "r")))]
                    905:   ""
                    906:   "modw   %2,%0"
                    907:  [(set_attr "type" "arith")
                    908:   (set_attr "cc" "clobber")])
                    909: 
                    910: (define_insn "umodsi3"
                    911:   [(set (match_operand:SI 0 "int_reg_operand" "=r")
                    912:        (umod:SI (match_operand:SI 1 "int_reg_operand" "0")
                    913:                 (match_operand:SI 2 "int_reg_operand" "r")))]
                    914:   ""
                    915:   "modwu  %2,%0"
                    916:  [(set_attr "type" "arith")
                    917:   (set_attr "cc" "clobber")])
                    918: 
                    919: ;;
                    920: ;; bit and/or instructions
                    921: ;;
                    922: (define_insn "andsi3"
                    923:   [(set (match_operand:SI 0 "int_reg_operand" "=r,r")
                    924:         (and:SI (match_operand:SI 1 "int_reg_operand" "%0,0")
                    925:                (match_operand:SI 2 "nonmemory_operand" "r,n")))]
                    926:   ""
                    927:   "@
                    928:    andw   %2,%0
                    929:    andi   %2,%0"
                    930:  [(set_attr "type" "arith")])
                    931: 
                    932: (define_insn "iorsi3"
                    933:   [(set (match_operand:SI 0 "int_reg_operand" "=r,r")
                    934:        (ior:SI (match_operand:SI 1 "int_reg_operand" "%0,0")
                    935:                (match_operand:SI 2 "nonmemory_operand" "r,n")))]
                    936:   ""
                    937:   "@
                    938:    orw    %2,%0
                    939:    ori    %2,%0"
                    940:  [(set_attr "type" "arith")])
                    941: 
                    942: (define_insn "xorsi3"
                    943:   [(set (match_operand:SI 0 "int_reg_operand" "=r,r")
                    944:        (xor:SI (match_operand:SI 1 "int_reg_operand" "%0,0")
                    945:                (match_operand:SI 2 "nonmemory_operand" "r,n")))]
                    946:   ""
                    947:   "@
                    948:    xorw   %2,%0
                    949:    xori   %2,%0"
                    950:  [(set_attr "type" "arith")])
                    951: 
                    952: (define_insn "negdf2"
                    953:   [(set (match_operand:DF 0 "fp_reg_operand" "=f")
                    954:        (neg:DF (match_operand:DF 1 "fp_reg_operand" "f")))]
                    955:   ""
                    956:   "negd   %1,%0"
                    957:  [(set_attr "type" "fp")])
                    958: 
                    959: (define_insn "negsf2"
                    960:   [(set (match_operand:SF 0 "fp_reg_operand" "=f")
                    961:        (neg:SF (match_operand:SF 1 "fp_reg_operand" "f")))]
                    962:   ""
                    963:   "negs   %1,%0"
                    964:  [(set_attr "type" "fp")])
                    965: 
                    966: (define_insn "negsi2"
                    967:   [(set (match_operand:SI 0 "int_reg_operand" "=r")
                    968:        (neg:SI (match_operand:SI 1 "int_reg_operand" "r")))]
                    969:   ""
                    970:   "negw   %1,%0"
                    971:  [(set_attr "type" "arith")])
                    972: 
                    973: 
                    974: (define_insn "one_cmplsi2"
                    975:   [(set (match_operand:SI 0 "int_reg_operand" "=r")
                    976:        (not:SI (match_operand:SI 1 "int_reg_operand" "r")))]
                    977:   ""
                    978:   "notw   %1,%0"
                    979:  [(set_attr "type" "arith")])
                    980: 
                    981: 
                    982: 
                    983: ;; Right shift on the clipper works by negating the shift count,
                    984: ;; then emitting a right shift with the shift count negated.  This means
                    985: ;; that all actual shift counts in the RTL will be positive.
                    986: 
                    987: (define_expand "ashrdi3"
                    988:   [(set (match_operand:DI 0 "int_reg_operand" "")
                    989:        (ashiftrt:DI (match_operand:DI 1 "int_reg_operand" "")
                    990:                     (match_operand:SI 2 "nonmemory_operand" "")))]
                    991:   ""
                    992:   "
                    993: {
                    994:   if (GET_CODE (operands[2]) != CONST_INT)
                    995:     operands[2] = gen_rtx (NEG, SImode, negate_rtx (SImode, operands[2]));
                    996: }")
                    997: 
                    998: (define_insn ""
                    999:   [(set (match_operand:DI 0 "int_reg_operand" "=r")
                   1000:        (ashiftrt:DI (match_operand:DI 1 "int_reg_operand" "0")
                   1001:                     (match_operand:SI 2 "const_int_operand" "n")))]
                   1002:   ""
                   1003:   "shali  $%n2,%0"
                   1004:  [(set_attr "type" "arith")])
                   1005: 
                   1006: (define_insn ""
                   1007:   [(set (match_operand:DI 0 "int_reg_operand" "=r")
                   1008:        (ashiftrt:DI (match_operand:DI 1 "int_reg_operand" "0")
                   1009:                     (neg:SI (match_operand:SI 2 "nonmemory_operand" "r"))))]
                   1010:   ""
                   1011:   "shal   %2,%0"
                   1012:  [(set_attr "type" "arith")])
                   1013: 
                   1014: (define_expand "ashrsi3"
                   1015:   [(set (match_operand:SI 0 "int_reg_operand" "")
                   1016:        (ashiftrt:SI (match_operand:SI 1 "int_reg_operand" "")
                   1017:                     (match_operand:SI 2 "nonmemory_operand" "")))]
                   1018:   ""
                   1019:   "
                   1020: {
                   1021:   if (GET_CODE (operands[2]) != CONST_INT)
                   1022:     operands[2] = gen_rtx (NEG, SImode, negate_rtx (SImode, operands[2]));
                   1023: }")
                   1024: 
                   1025: (define_insn ""
                   1026:   [(set (match_operand:SI 0 "int_reg_operand" "=r")
                   1027:        (ashiftrt:SI (match_operand:SI 1 "int_reg_operand" "0")
                   1028:                     (match_operand:SI 2 "const_int_operand" "n")))]
                   1029:   ""
                   1030:   "shai   $%n2,%0"
                   1031:  [(set_attr "type" "arith")])
                   1032: 
                   1033: (define_insn ""
                   1034:   [(set (match_operand:SI 0 "int_reg_operand" "=r")
                   1035:        (ashiftrt:SI (match_operand:SI 1 "int_reg_operand" "0")
                   1036:                     (neg:SI (match_operand:SI 2 "nonmemory_operand" "r"))))]
                   1037:   ""
                   1038:   "shaw   %2,%0"
                   1039:  [(set_attr "type" "arith")])
                   1040: 
                   1041: ;;
                   1042: ;; left shift
                   1043: ;;
                   1044: 
                   1045: (define_insn "ashldi3"
                   1046:   [(set (match_operand:DI 0 "int_reg_operand" "=r,r")
                   1047:        (ashift:DI (match_operand:DI 1 "int_reg_operand" "0,0")
                   1048:                   (match_operand:SI 2 "nonmemory_operand" "r,n")))]
                   1049:   ""
                   1050:   "@
                   1051:    shal   %2,%0
                   1052:    shali  %2,%0"
                   1053:  [(set_attr "type" "arith")])
                   1054: 
                   1055: 
                   1056: (define_insn "ashlsi3"
                   1057:   [(set (match_operand:SI 0 "int_reg_operand" "=r,r")
                   1058:        (ashift:SI (match_operand:SI 1 "int_reg_operand" "0,0")
                   1059:                   (match_operand:SI 2 "nonmemory_operand" "r,n")))]
                   1060:   ""
                   1061:   "*
                   1062: {
                   1063:   int val;
                   1064: 
                   1065:   if (which_alternative == 0)
                   1066:    return \"shaw   %2,%0\";
                   1067: 
                   1068:   val = INTVAL (operands[2]);
                   1069: 
                   1070:   if (val == 2)
                   1071:     return \"addw   %0,%0\;addw   %0,%0\";
                   1072: 
                   1073:   if (val == 1)
                   1074:     return \"addw   %0,%0\";
                   1075: 
                   1076:   return \"shai   %2,%0\";
                   1077: }"
                   1078: [(set_attr "type" "arith")])
                   1079: 
                   1080: ;;
                   1081: ;; logical shift
                   1082: ;;
                   1083: 
                   1084: (define_expand "lshrdi3"
                   1085:   [(set (match_operand:DI 0 "int_reg_operand" "")
                   1086:        (lshiftrt:DI (match_operand:DI 1 "int_reg_operand" "")
                   1087:                     (match_operand:SI 2 "nonmemory_operand" "")))]
                   1088:   ""
                   1089:   "
                   1090: {
                   1091:   if (GET_CODE (operands[2]) != CONST_INT)
                   1092:     operands[2] = gen_rtx (NEG, SImode, negate_rtx (SImode, operands[2]));
                   1093: }")
                   1094: 
                   1095: (define_insn ""
                   1096:   [(set (match_operand:DI 0 "int_reg_operand" "=r")
                   1097:        (lshiftrt:DI (match_operand:DI 1 "int_reg_operand" "0")
                   1098:                     (match_operand:SI 2 "const_int_operand" "n")))]
                   1099:   ""
                   1100:   "shlli  $%n2,%0"
                   1101:  [(set_attr "type" "arith")])
                   1102: 
                   1103: (define_insn ""
                   1104:   [(set (match_operand:DI 0 "int_reg_operand" "=r")
                   1105:        (lshiftrt:DI (match_operand:DI 1 "int_reg_operand" "0")
                   1106:                     (neg:SI (match_operand:SI 2 "nonmemory_operand" "r"))))]
                   1107:   ""
                   1108:   "shll   %2,%0"
                   1109:  [(set_attr "type" "arith")])
                   1110: 
                   1111: (define_expand "lshrsi3"
                   1112:   [(set (match_operand:SI 0 "int_reg_operand" "")
                   1113:        (lshiftrt:SI (match_operand:SI 1 "int_reg_operand" "")
                   1114:                     (match_operand:SI 2 "nonmemory_operand" "")))]
                   1115:   ""
                   1116:   "
                   1117: {
                   1118:   if (GET_CODE (operands[2]) != CONST_INT)
                   1119:     operands[2] = gen_rtx (NEG, SImode, negate_rtx (SImode, operands[2]));
                   1120: }")
                   1121: 
                   1122: (define_insn ""
                   1123:   [(set (match_operand:SI 0 "int_reg_operand" "=r")
                   1124:        (lshiftrt:SI (match_operand:SI 1 "int_reg_operand" "0")
                   1125:                     (match_operand:SI 2 "const_int_operand" "n")))]
                   1126:   ""
                   1127:   "shli   $%n2,%0"
                   1128:  [(set_attr "type" "arith")])
                   1129: 
                   1130: (define_insn ""
                   1131:   [(set (match_operand:SI 0 "int_reg_operand" "=r")
                   1132:        (lshiftrt:SI (match_operand:SI 1 "int_reg_operand" "0")
                   1133:                     (neg:SI (match_operand:SI 2 "nonmemory_operand" "r"))))]
                   1134:   ""
                   1135:   "shlw   %2,%0"
                   1136:  [(set_attr "type" "arith")])
                   1137: 
                   1138: 
                   1139: ;;
                   1140: ;; rotate insn
                   1141: ;;
                   1142: (define_expand "rotrdi3"
                   1143:   [(set (match_operand:DI 0 "int_reg_operand" "")
                   1144:        (rotatert:DI (match_operand:DI 1 "int_reg_operand" "")
                   1145:                     (match_operand:SI 2 "nonmemory_operand" "")))]
                   1146:   ""
                   1147:   "
                   1148: {
                   1149:   if (GET_CODE (operands[2]) != CONST_INT)
                   1150:     operands[2] = gen_rtx (NEG, SImode, negate_rtx (SImode, operands[2]));
                   1151: }")
                   1152: 
                   1153: (define_insn ""
                   1154:   [(set (match_operand:DI 0 "int_reg_operand" "=r")
                   1155:        (rotatert:DI (match_operand:DI 1 "int_reg_operand" "0")
                   1156:                     (match_operand:SI 2 "const_int_operand" "n")))]
                   1157:   ""
                   1158:   "rotli  $%n2,%0"
                   1159:  [(set_attr "type" "arith")])
                   1160: 
                   1161: (define_insn ""
                   1162:   [(set (match_operand:DI 0 "int_reg_operand" "=r")
                   1163:        (rotatert:DI (match_operand:DI 1 "int_reg_operand" "0")
                   1164:                     (neg:SI (match_operand:SI 2 "nonmemory_operand" "r"))))]
                   1165:   ""
                   1166:   "rotl   %2,%0"
                   1167:  [(set_attr "type" "arith")])
                   1168: 
                   1169: (define_expand "rotrsi3"
                   1170:   [(set (match_operand:SI 0 "int_reg_operand" "")
                   1171:        (rotatert:SI (match_operand:SI 1 "int_reg_operand" "")
                   1172:                     (match_operand:SI 2 "nonmemory_operand" "")))]
                   1173:   ""
                   1174:   "
                   1175: {
                   1176:   if (GET_CODE (operands[2]) != CONST_INT)
                   1177:     operands[2] = gen_rtx (NEG, SImode, negate_rtx (SImode, operands[2]));
                   1178: }")
                   1179: 
                   1180: (define_insn ""
                   1181:   [(set (match_operand:SI 0 "int_reg_operand" "=r")
                   1182:        (rotatert:SI (match_operand:SI 1 "int_reg_operand" "0")
                   1183:                     (match_operand:SI 2 "const_int_operand" "n")))]
                   1184:   ""
                   1185:   "roti   $%n2,%0"
                   1186:  [(set_attr "type" "arith")])
                   1187: 
                   1188: (define_insn ""
                   1189:   [(set (match_operand:SI 0 "int_reg_operand" "=r")
                   1190:        (rotatert:SI (match_operand:SI 1 "int_reg_operand" "0")
                   1191:                     (neg:SI (match_operand:SI 2 "nonmemory_operand" "r"))))]
                   1192:   ""
                   1193:   "rotw   %2,%0"
                   1194:  [(set_attr "type" "arith")])
                   1195: 
                   1196: (define_insn "rotldi3"
                   1197:   [(set (match_operand:DI 0 "int_reg_operand" "=r,r")
                   1198:        (rotate:DI (match_operand:DI 1 "int_reg_operand" "0,0")
                   1199:                   (match_operand:SI 2 "nonmemory_operand" "r,n")))]
                   1200:   ""
                   1201:   "@
                   1202:    rotl   %2,%0
                   1203:    rotli  %2,%0"
                   1204:  [(set_attr "type" "arith")])
                   1205: 
                   1206: (define_insn "rotlsi3"
                   1207:   [(set (match_operand:SI 0 "int_reg_operand" "=r,r")
                   1208:        (rotate:SI (match_operand:SI 1 "int_reg_operand" "0,0")
                   1209:                   (match_operand:SI 2 "nonmemory_operand" "r,n")))]
                   1210:   ""
                   1211:   "@
                   1212:    rotw   %2,%0
                   1213:    roti   %2,%0"
                   1214:  [(set_attr "type" "arith")])
                   1215: 
                   1216: 
                   1217: ;;
                   1218: ;; jump and branch insns
                   1219: ;;
                   1220: (define_insn "jump"
                   1221:   [(set (pc)
                   1222:        (label_ref (match_operand 0 "" "")))]
                   1223:   ""
                   1224:   "b      %l0"
                   1225:  [(set_attr "type" "branch")])
                   1226: 
                   1227: (define_insn "tablejump"
                   1228:   [(set (pc) (match_operand:SI 0 "register_operand" "r"))
                   1229:    (use (label_ref (match_operand 1 "" "")))]
                   1230:   ""
                   1231:   "b      (%0)"
                   1232:  [(set_attr "type" "branch")])
                   1233: 
                   1234: (define_insn "beq"
                   1235:   [(set (pc)
                   1236:        (if_then_else (eq (cc0)
                   1237:                          (const_int 0))
                   1238:                      (label_ref (match_operand 0 "" ""))
                   1239:                      (pc)))]
                   1240:   ""
                   1241:   "breq   %l0"
                   1242:  [(set_attr "type" "branch")])
                   1243: 
                   1244: (define_insn "bne"
                   1245:   [(set (pc)
                   1246:        (if_then_else (ne (cc0)
                   1247:                          (const_int 0))
                   1248:                      (label_ref (match_operand 0 "" ""))
                   1249:                      (pc)))]
                   1250:   ""
                   1251:   "brne   %l0"
                   1252:  [(set_attr "type" "branch")])
                   1253: 
                   1254: (define_insn "bgt"
                   1255:   [(set (pc)
                   1256:        (if_then_else (gt (cc0)
                   1257:                          (const_int 0))
                   1258:                      (label_ref (match_operand 0 "" ""))
                   1259:                      (pc)))]
                   1260:   ""
                   1261:   "brgt   %l0"
                   1262:  [(set_attr "type" "branch")])
                   1263: 
                   1264: (define_insn "bgtu"
                   1265:   [(set (pc)
                   1266:        (if_then_else (gtu (cc0)
                   1267:                           (const_int 0))
                   1268:                      (label_ref (match_operand 0 "" ""))
                   1269:                      (pc)))]
                   1270:   ""
                   1271:   "brgtu  %l0"
                   1272:  [(set_attr "type" "branch")])
                   1273: 
                   1274: (define_insn "blt"
                   1275:   [(set (pc)
                   1276:        (if_then_else (lt (cc0)
                   1277:                          (const_int 0))
                   1278:                      (label_ref (match_operand 0 "" ""))
                   1279:                      (pc)))]
                   1280:   ""
                   1281:   "brlt   %l0"
                   1282:  [(set_attr "type" "branch")])
                   1283: 
                   1284: (define_insn "bltu"
                   1285:   [(set (pc)
                   1286:        (if_then_else (ltu (cc0)
                   1287:                           (const_int 0))
                   1288:                      (label_ref (match_operand 0 "" ""))
                   1289:                      (pc)))]
                   1290:   ""
                   1291:   "brltu  %l0"
                   1292:  [(set_attr "type" "branch")])
                   1293: 
                   1294: (define_insn "bge"
                   1295:   [(set (pc)
                   1296:        (if_then_else (ge (cc0)
                   1297:                          (const_int 0))
                   1298:                      (label_ref (match_operand 0 "" ""))
                   1299:                      (pc)))]
                   1300:   ""
                   1301:   "brge   %l0"
                   1302:  [(set_attr "type" "branch")])
                   1303: 
                   1304: (define_insn "bgeu"
                   1305:   [(set (pc)
                   1306:        (if_then_else (geu (cc0)
                   1307:                           (const_int 0))
                   1308:                      (label_ref (match_operand 0 "" ""))
                   1309:                      (pc)))]
                   1310:   ""
                   1311:   "brgeu  %l0"
                   1312:  [(set_attr "type" "branch")])
                   1313: 
                   1314: (define_insn "ble"
                   1315:   [(set (pc)
                   1316:        (if_then_else (le (cc0)
                   1317:                          (const_int 0))
                   1318:                      (label_ref (match_operand 0 "" ""))
                   1319:                      (pc)))]
                   1320:  ""
                   1321:  "brle   %l0"
                   1322:  [(set_attr "type" "branch")])
                   1323: 
                   1324: (define_insn "bleu"
                   1325:   [(set (pc)
                   1326:        (if_then_else (leu (cc0)
                   1327:                           (const_int 0))
                   1328:                      (label_ref (match_operand 0 "" ""))
                   1329:                      (pc)))]
                   1330:  ""
                   1331:  "brleu  %l0"
                   1332:  [(set_attr "type" "branch")])
                   1333: 
                   1334: ;; Recognize reversed jumps.
                   1335: (define_insn ""
                   1336:   [(set (pc)
                   1337:        (if_then_else (match_operator 0 "comparison_operator"
                   1338:                                      [(cc0)
                   1339:                                       (const_int 0)])
                   1340:                      (pc)
                   1341:                      (label_ref (match_operand 1 "" ""))))]
                   1342:  ""
                   1343:  "br%C0    %l1" ; %C0 negates condition
                   1344:  [(set_attr "type" "branch")])
                   1345: 
                   1346: ;;
                   1347: ;; call instructions
                   1348: ;;
                   1349: (define_insn "call"
                   1350:   [(call (match_operand:QI 0 "general_operand" "m")
                   1351:         (match_operand:SI 1 "general_operand" ""))]
                   1352:   ;; Operand 1 not used on the clipper.
                   1353:   ""
                   1354:   "call   sp,%0")
                   1355: 
                   1356: (define_insn "call_value"
                   1357:   [(set (match_operand 0 "" "=rf")
                   1358:        (call (match_operand:QI 1 "general_operand" "m")
                   1359:              (match_operand:SI 2 "general_operand" "g")))]
                   1360:   ;; Operand 2 not used on the clipper
                   1361:   ""
                   1362:   "call   sp,%1")
                   1363: 
                   1364: (define_insn "indirect_jump"
                   1365:   [(set (pc) (match_operand:SI 0 "register_operand" "r"))]
                   1366:   ""
                   1367:   "b      (%0)"
                   1368:  [(set_attr "type" "branch")])
                   1369: 
                   1370: 
                   1371: (define_insn "nop"
                   1372:   [(const_int 0)]
                   1373:   ""
                   1374:   "noop"
                   1375:  [(set_attr "type" "arith")
                   1376:   (set_attr "cc" "unchanged")])
                   1377: 
                   1378: 
                   1379: 
                   1380: ;; while (--foo >= 0)
                   1381: ;;
                   1382: ;; Combiners for 'decrement test and branch' do not work for clipper.
                   1383: ;; These patters are jump_insns that do not allow output reloads and clipper
                   1384: ;; can only decrement and test registers.
                   1385: ;;

unix.superglobalmegacorp.com

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