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

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

unix.superglobalmegacorp.com

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