Annotation of GNUtools/cc/config/clipper/clipper.md, revision 1.1

1.1     ! root        1: ;;- Machine description for GNU compiler, Clipper Version
        !             2: ;;   Copyright (C) 1987, 1988, 1991, 1993 Free Software Foundation, Inc.
        !             3: 
        !             4: ;; Contributed by Holger Teutsch ([email protected])
        !             5: 
        !             6: ;; This file is part of GNU CC.
        !             7: 
        !             8: ;; GNU CC is free software; you can redistribute it and/or modify
        !             9: ;; it under the terms of the GNU General Public License as published by
        !            10: ;; the Free Software Foundation; either version 2, or (at your option)
        !            11: ;; any later version.
        !            12: 
        !            13: ;; GNU CC is distributed in the hope that it will be useful,
        !            14: ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
        !            15: ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        !            16: ;; GNU General Public License for more details.
        !            17: 
        !            18: ;; You should have received a copy of the GNU General Public License
        !            19: ;; along with GNU CC; see the file COPYING.  If not, write to
        !            20: ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
        !            21: 
        !            22: 
        !            23: ;;- Instruction 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: ;;
        !            63: ;; clipper seems to be a tradional risc processor
        !            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 ""
        !           151:   [(set (match_operand:DF 0 "register_operand" "=*rf")
        !           152:        (match_operand:DF 1 "nonimmediate_operand" "*rfo"))]
        !           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")
        !           206:        (match_operand:DF 1 "register_operand" "*rf,f"))]
        !           207:   ""
        !           208:   "*
        !           209: {
        !           210:   rtx xops[4];
        !           211: 
        !           212:   if (REGNO (operands[1]) >= 16)       /* f -> m */
        !           213:     return \"stord  %1,%0\";
        !           214: 
        !           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 \"\";
        !           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 ""
        !           250:   [(set (match_operand:SF 0 "register_operand" "=*rf")
        !           251:        (match_operand:SF 1 "nonimmediate_operand" "*rfm"))]
        !           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")
        !           287:        (match_operand:SF 1 "register_operand" "*rf"))]
        !           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: 
        !           309: ;; If an operand is a MEM but not offsetable, we can't load it into
        !           310: ;; a register, so we must force the third alternative to be the one
        !           311: ;; reloaded.  Hence we show the first as more expensive.
        !           312: (define_insn ""
        !           313:   [(set (match_operand:DI 0 "register_operand" "=?r,r,r")
        !           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: 
        !           389: ;; provide 2 patterns with different predicates as 'general_operand' in both
        !           390: ;; positions results in a 'mem -> mem' move from combine that must be reloaded 
        !           391: ;;
        !           392: 
        !           393: (define_insn ""
        !           394:   [(set (match_operand:SI 0 "register_operand" "=r,r,r,r")
        !           395:        (match_operand:SI 1 "general_operand"   "r,m,n,i"))]
        !           396:   ""
        !           397:   "*
        !           398: {
        !           399:   int val;
        !           400: 
        !           401:   if (which_alternative == 0)
        !           402:     return \"movw   %1,%0\";           /* reg -> reg */
        !           403: 
        !           404:   if (which_alternative == 1)
        !           405:     return \"loadw  %1,%0\";           /* mem -> reg */
        !           406: 
        !           407:   if (which_alternative == 2)
        !           408:     {
        !           409:       val = INTVAL (operands[1]);      /* known const ->reg */
        !           410: 
        !           411:       if (val == -1)
        !           412:        return \"notq   $0,%0\";
        !           413: 
        !           414:       if (val < 0 || val >= 16)
        !           415:        return \"loadi  %1,%0\";
        !           416: 
        !           417:       return \"loadq  %1,%0\";
        !           418:     }
        !           419: 
        !           420:   if (which_alternative == 3)          /* unknown const */
        !           421:     return \"loada  %a1,%0\";
        !           422: }"
        !           423: [(set_attr "type" "arith,load,arith,load")
        !           424:  (set_attr "cc" "set2,change0,set1,change0")])
        !           425: 
        !           426: 
        !           427: (define_insn ""
        !           428:   [(set (match_operand:SI 0 "memory_operand" "=m")
        !           429:        (match_operand:SI 1 "int_reg_operand" "r"))]
        !           430:   ""
        !           431:   "storw  %1,%0"
        !           432: [(set_attr "type" "store")])
        !           433: 
        !           434: ;; movhi
        !           435: ;;
        !           436: ;; loadh  mem to reg
        !           437: ;; storh  reg to mem
        !           438: ;;
        !           439: ;;
        !           440: (define_expand "movhi"
        !           441:   [(set (match_operand:HI 0 "general_operand" "")
        !           442:        (match_operand:HI 1 "general_operand" ""))]
        !           443:   ""
        !           444:   "
        !           445: {
        !           446:   if (GET_CODE (operands[0]) == MEM
        !           447:       && ! register_operand (operands[1], HImode))
        !           448:     operands[1] = force_reg (HImode, operands[1]);
        !           449: }")
        !           450: 
        !           451: 
        !           452: (define_insn ""
        !           453:   [(set (match_operand:HI 0 "register_operand" "=r,r,r")
        !           454:        (match_operand:HI 1 "general_operand"   "r,m,n"))]
        !           455:   ""
        !           456:   "@
        !           457:    movw   %1,%0
        !           458:    loadh  %1,%0
        !           459:    loadi  %1,%0"
        !           460: [(set_attr "type" "arith,load,arith")])
        !           461: 
        !           462: (define_insn ""
        !           463:   [(set (match_operand:HI 0 "memory_operand"  "=m")
        !           464:        (match_operand:HI 1 "register_operand" "r"))]
        !           465:   ""
        !           466:   "storh  %1,%0"
        !           467:  [(set_attr "type" "store")])
        !           468: 
        !           469: ;; movqi
        !           470: ;;
        !           471: ;; loadb  mem to reg
        !           472: ;; storb  reg to mem
        !           473: ;;
        !           474: (define_expand "movqi"
        !           475:   [(set (match_operand:QI 0 "general_operand" "")
        !           476:        (match_operand:QI 1 "general_operand" ""))]
        !           477:   ""
        !           478:   "
        !           479: {
        !           480:   if (GET_CODE (operands[0]) == MEM && 
        !           481:       ! register_operand (operands[1], QImode))
        !           482:     operands[1] = force_reg (QImode, operands[1]);
        !           483: }")
        !           484: 
        !           485: 
        !           486: (define_insn ""
        !           487:   [(set (match_operand:QI 0 "register_operand" "=r,r,r")
        !           488:        (match_operand:QI 1 "general_operand"   "r,m,n"))]
        !           489:   ""
        !           490:   "@
        !           491:    movw   %1,%0
        !           492:    loadb  %1,%0
        !           493:    loadi  %1,%0"
        !           494: [(set_attr "type" "arith,load,arith")])
        !           495: 
        !           496: (define_insn ""
        !           497:   [(set (match_operand:QI 0 "memory_operand" "=m")
        !           498:        (match_operand:QI 1 "register_operand" "r"))]
        !           499:   ""
        !           500:   "storb  %1,%0"
        !           501: [(set_attr "type" "store")])
        !           502: 
        !           503: 
        !           504: ;;
        !           505: ;; block move
        !           506: ;;
        !           507: (define_expand "movstrsi"
        !           508:   [(parallel
        !           509:     [(set (match_operand:BLK 0 "memory_operand" "")
        !           510:           (match_operand:BLK 1 "memory_operand" ""))
        !           511:      (use (match_operand:SI 2 "general_operand" ""))
        !           512:      (use (match_operand:SI 3 "const_int_operand" ""))
        !           513:      (clobber (match_scratch:SI 4 ""))
        !           514:      (clobber (match_scratch:SI 5 ""))
        !           515:      (clobber (match_dup 6))
        !           516:      (clobber (match_dup 7))])]
        !           517:   ""
        !           518:   "
        !           519: {
        !           520:   rtx addr0, addr1;
        !           521: 
        !           522:   addr0 = copy_to_mode_reg (Pmode, XEXP (operands[0], 0));
        !           523:   addr1 = copy_to_mode_reg (Pmode, XEXP (operands[1], 0));
        !           524: 
        !           525:   operands[6] = addr0;
        !           526:   operands[7] = addr1;
        !           527: 
        !           528:   operands[0] = gen_rtx (MEM, BLKmode, addr0);
        !           529:   operands[1] = gen_rtx (MEM, BLKmode, addr1);
        !           530: 
        !           531:   if (GET_CODE (operands[2]) != CONST_INT)
        !           532:     operands[2] = force_reg (SImode, operands[2]);
        !           533: }")
        !           534: 
        !           535: ;;
        !           536: ;; there is a problem with this insn in gcc-2.2.3
        !           537: ;; (clobber (match_dup 2)) does not prevent use of this operand later
        !           538: ;; we always use a scratch register and leave operand 2 unchanged
        !           539: ;;
        !           540: (define_insn ""
        !           541:   [(set (mem:BLK (match_operand:SI 0 "register_operand" "r"))
        !           542:        (mem:BLK (match_operand:SI 1 "register_operand" "r")))
        !           543:    (use (match_operand:SI 2 "nonmemory_operand" "rn"))
        !           544:    (use (match_operand:SI 3 "const_int_operand" "n"))
        !           545:    (clobber (match_scratch:SI 4 "=r"))
        !           546:    (clobber (match_scratch:SI 5 "=r"))
        !           547:    (clobber (match_dup 0))
        !           548:    (clobber (match_dup 1))]
        !           549:   ""
        !           550:   "*
        !           551: {
        !           552:   extern void clipper_movstr ();
        !           553:   clipper_movstr (operands);
        !           554:   return \"\";
        !           555: }"
        !           556: [(set_attr "cc" "clobber")])
        !           557: 
        !           558: 
        !           559: 
        !           560: ;; Extension and truncation insns.
        !           561: (define_insn "extendhisi2"
        !           562:   [(set (match_operand:SI 0 "int_reg_operand" "=r,r")
        !           563:        (sign_extend:SI (match_operand:HI 1 "general_operand" "0,m")))]
        !           564:   ""
        !           565:   "@
        !           566:    andi   $65535,%0\;xori   $32768,%0\;subi   $32768,%0
        !           567:    loadh  %1,%0"
        !           568: [(set_attr "type" "arith,load")])
        !           569: 
        !           570: 
        !           571: (define_insn "extendqihi2"
        !           572:   [(set (match_operand:HI 0 "int_reg_operand" "=r,r")
        !           573:        (sign_extend:HI (match_operand:QI 1 "general_operand" "0,m")))]
        !           574:   ""
        !           575:   "@
        !           576:    andi   $255,%0\;xori   $128,%0\;subi   $128,%0
        !           577:    loadb  %1,%0"
        !           578: [(set_attr "type" "arith,load")
        !           579:  (set_attr "cc" "set1,change0")])
        !           580: 
        !           581: 
        !           582: (define_insn "extendqisi2"
        !           583:   [(set (match_operand:SI 0 "int_reg_operand" "=r,r")
        !           584:        (sign_extend:SI (match_operand:QI 1 "general_operand" "0,m")))]
        !           585:   ""
        !           586:   "@
        !           587:    andi   $255,%0\;xori   $128,%0\;subi   $128,%0
        !           588:    loadb  %1,%0"
        !           589: [(set_attr "type" "arith,load")])
        !           590: 
        !           591: 
        !           592: (define_insn "extendsfdf2"
        !           593:   [(set (match_operand:DF 0 "fp_reg_operand" "=f")
        !           594:        (float_extend:DF (match_operand:SF 1 "fp_reg_operand" "f")))]
        !           595:   ""
        !           596:   "cnvsd  %1,%0")
        !           597: 
        !           598: (define_insn "truncdfsf2"
        !           599:   [(set (match_operand:SF 0 "fp_reg_operand" "=f")
        !           600:        (float_truncate:SF (match_operand:DF 1 "fp_reg_operand" "f")))]
        !           601:   ""
        !           602:   "cnvds  %1,%0")
        !           603: 
        !           604: (define_insn "zero_extendhisi2"
        !           605:   [(set (match_operand:SI 0 "int_reg_operand" "=r,r")
        !           606:        (zero_extend:SI (match_operand:HI 1 "general_operand" "0,m")))]
        !           607:   ""
        !           608:   "@
        !           609:    andi   $65535,%0
        !           610:    loadhu %1,%0"
        !           611: [(set_attr "type" "arith,load")])
        !           612: 
        !           613: 
        !           614: (define_insn "zero_extendqihi2"
        !           615:   [(set (match_operand:HI 0 "int_reg_operand" "=r,r")
        !           616:        (zero_extend:HI (match_operand:QI 1 "general_operand" "0,m")))]
        !           617:   ""
        !           618:   "@
        !           619:    andi   $255,%0
        !           620:    loadbu %1,%0"
        !           621: [(set_attr "type" "arith,load")
        !           622:  (set_attr "cc" "clobber,clobber")])
        !           623: 
        !           624: 
        !           625: (define_insn "zero_extendqisi2"
        !           626:   [(set (match_operand:SI 0 "int_reg_operand" "=r,r")
        !           627:        (zero_extend:SI (match_operand:QI 1 "general_operand" "0,m")))]
        !           628:   ""
        !           629:   "@
        !           630:    andi   $255,%0
        !           631:    loadbu %1,%0"
        !           632: [(set_attr "type" "arith,load")])
        !           633: 
        !           634: 
        !           635: 
        !           636: ;; Fix-to-float conversion insns.
        !           637: 
        !           638: (define_insn "floatsisf2"
        !           639:   [(set (match_operand:SF 0 "fp_reg_operand" "=f")
        !           640:        (float:SF (match_operand:SI 1 "int_reg_operand" "r")))]
        !           641:   ""
        !           642:   "cnvws  %1,%0")
        !           643: 
        !           644: (define_insn "floatsidf2"
        !           645:   [(set (match_operand:DF 0 "fp_reg_operand" "=f")
        !           646:        (float:DF (match_operand:SI 1 "int_reg_operand" "r")))]
        !           647:   ""
        !           648:   "cnvwd  %1,%0")
        !           649: 
        !           650: 
        !           651: ;; Float-to-fix conversion insns.
        !           652: 
        !           653: (define_insn "fix_truncsfsi2"
        !           654:   [(set (match_operand:SI 0 "int_reg_operand" "=r")
        !           655:        (fix:SI (fix:SF (match_operand:SF 1 "fp_reg_operand" "f"))))]
        !           656:   ""
        !           657:   "cnvtsw %1,%0")
        !           658: 
        !           659: (define_insn "fix_truncdfsi2"
        !           660:   [(set (match_operand:SI 0 "int_reg_operand" "=r")
        !           661:        (fix:SI (fix:DF (match_operand:DF 1 "fp_reg_operand" "f"))))]
        !           662:   ""
        !           663:   "cnvtdw %1,%0")
        !           664: 
        !           665: ;;- All kinds of add instructions.
        !           666: 
        !           667: (define_insn "adddf3"
        !           668:   [(set (match_operand:DF 0 "fp_reg_operand" "=f")
        !           669:        (plus:DF (match_operand:DF 1 "fp_reg_operand" "0")
        !           670:                 (match_operand:DF 2 "fp_reg_operand" "f")))]
        !           671:   ""
        !           672:   "addd   %2,%0"
        !           673:  [(set_attr "type" "fp")])
        !           674: 
        !           675: 
        !           676: (define_insn "addsf3"
        !           677:   [(set (match_operand:SF 0 "fp_reg_operand" "=f")
        !           678:        (plus:SF (match_operand:SF 1 "fp_reg_operand" "0")
        !           679:                 (match_operand:SF 2 "fp_reg_operand" "f")))]
        !           680:   ""
        !           681:   "adds   %2,%0"
        !           682:  [(set_attr "type" "fp")])
        !           683: 
        !           684: (define_insn "adddi3"
        !           685:   [(set (match_operand:DI 0 "int_reg_operand" "=r")
        !           686:        (plus:DI (match_operand:DI 1 "int_reg_operand" "%0")
        !           687:                 (match_operand:DI 2 "int_reg_operand" "r")))]
        !           688:   ""
        !           689:   "*
        !           690: {
        !           691:   rtx xoperands[4];
        !           692: 
        !           693:   xoperands[0] = operands[0];
        !           694:   xoperands[1] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1);
        !           695:   xoperands[2] = operands[2];
        !           696:   xoperands[3] = gen_rtx (REG, SImode, REGNO (operands[2]) + 1);
        !           697:   output_asm_insn (\"addw   %2,%0\;addwc  %3,%1\", xoperands);
        !           698:   return \"\";
        !           699: }"
        !           700: [(set_attr "type" "arith")
        !           701:  (set_attr "cc" "clobber")])
        !           702: 
        !           703: (define_insn "addsi3"
        !           704:   [(set (match_operand:SI 0 "int_reg_operand" "=r,r,r")
        !           705:        (plus:SI (match_operand:SI 1 "int_reg_operand" "%0,r,r")
        !           706:                 (match_operand:SI 2 "nonmemory_operand" "rn,0,rn")))]
        !           707:   ""
        !           708:   "*
        !           709: {
        !           710:   if (which_alternative == 2)          /* 3 address version */
        !           711:     {
        !           712:       if (GET_CODE (operands[2]) == CONST_INT)
        !           713:        return \"loada  %a2(%1),%0\";
        !           714:       return \"loada  [%2](%1),%0\";
        !           715:     }
        !           716:                                        /* 2 address version */
        !           717:   if (GET_CODE (operands[2]) == CONST_INT)
        !           718:     {
        !           719:       int val = INTVAL (operands[2]);
        !           720: 
        !           721:       if (val >= 16 || val == 0x80000000)
        !           722:        return \"addi   %2,%0\";
        !           723: 
        !           724:       if (val < 0)                     /* change to sub */
        !           725:        {
        !           726:          rtx xops[2];
        !           727: 
        !           728:          val = -val;
        !           729: 
        !           730:          xops[0] = operands[0];
        !           731:          xops[1] = gen_rtx (CONST_INT, VOIDmode, val);
        !           732: 
        !           733:          if (val >= 16)
        !           734:            output_asm_insn (\"subi   %1,%0\", xops);
        !           735:          else
        !           736:            output_asm_insn (\"subq   %1,%0\", xops);
        !           737: 
        !           738:          return \"\";
        !           739:        }
        !           740: 
        !           741:       return \"addq   %2,%0\";
        !           742:     }
        !           743: 
        !           744:   if (which_alternative == 0)
        !           745:     return \"addw   %2,%0\";
        !           746: 
        !           747:   return \"addw   %1,%0\";
        !           748: }"
        !           749: [(set_attr "type" "arith,arith,arith")
        !           750:  (set_attr "cc" "set1,set1,change0")])
        !           751: 
        !           752: 
        !           753: ;;- All kinds of subtract instructions.
        !           754: 
        !           755: (define_insn "subdi3"
        !           756:   [(set (match_operand:DI 0 "int_reg_operand" "=r")
        !           757:        (minus:DI (match_operand:DI 1 "int_reg_operand" "%0")
        !           758:                  (match_operand:DI 2 "int_reg_operand" "r")))]
        !           759:   ""
        !           760:   "*
        !           761: {
        !           762:   rtx xoperands[4];
        !           763: 
        !           764:   xoperands[0] = operands[0];
        !           765:   xoperands[1] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1);
        !           766:   xoperands[2] = operands[2];
        !           767:   xoperands[3] = gen_rtx (REG, SImode, REGNO (operands[2]) + 1);
        !           768:   output_asm_insn (\"subw   %2,%0\;subwc  %3,%1\", xoperands);
        !           769:   return \"\";
        !           770: }"
        !           771: [(set_attr "type" "arith")
        !           772:  (set_attr "cc" "clobber")])
        !           773: 
        !           774: (define_insn "subsi3"
        !           775:   [(set (match_operand:SI 0 "int_reg_operand" "=r")
        !           776:        (minus:SI (match_operand:SI 1 "int_reg_operand" "0")
        !           777:                  (match_operand:SI 2 "nonmemory_operand" "rn")))]
        !           778:   ""
        !           779:   "*
        !           780: {
        !           781:   if (GET_CODE (operands[2]) == CONST_INT)
        !           782:     {
        !           783:       int val = INTVAL (operands[2]);
        !           784: 
        !           785:       if (val < 0 || val >= 16)
        !           786:        return \"subi   %2,%0\";
        !           787:       else
        !           788:        return \"subq   %2,%0\";
        !           789:     }
        !           790: 
        !           791:   return \"subw   %2,%0\";
        !           792: }"
        !           793: [(set_attr "type" "arith")])
        !           794: 
        !           795: (define_insn "subdf3"
        !           796:   [(set (match_operand:DF 0 "fp_reg_operand" "=f")
        !           797:        (minus:DF (match_operand:DF 1 "fp_reg_operand" "0")
        !           798:                  (match_operand:DF 2 "fp_reg_operand" "f")))]
        !           799:   ""
        !           800:   "subd   %2,%0"
        !           801:  [(set_attr "type" "fp")])
        !           802: 
        !           803: (define_insn "subsf3"
        !           804:   [(set (match_operand:SF 0 "fp_reg_operand" "=f")
        !           805:        (minus:SF (match_operand:SF 1 "fp_reg_operand" "0")
        !           806:                  (match_operand:SF 2 "fp_reg_operand" "f")))]
        !           807:   ""
        !           808:   "subs   %2,%0"
        !           809:  [(set_attr "type" "fp")])
        !           810: 
        !           811: 
        !           812: ;;- Multiply instructions.
        !           813: 
        !           814: (define_insn "muldf3"
        !           815:   [(set (match_operand:DF 0 "fp_reg_operand" "=f")
        !           816:        (mult:DF (match_operand:DF 1 "fp_reg_operand" "0")
        !           817:                 (match_operand:DF 2 "fp_reg_operand" "f")))]
        !           818:   ""
        !           819:   "muld   %2,%0"
        !           820:  [(set_attr "type" "fp")])
        !           821: 
        !           822: (define_insn "mulsf3"
        !           823:   [(set (match_operand:SF 0 "fp_reg_operand" "=f")
        !           824:        (mult:SF (match_operand:SF 1 "fp_reg_operand" "0")
        !           825:                 (match_operand:SF 2 "fp_reg_operand" "f")))]
        !           826:   ""
        !           827:   "muls   %2,%0"
        !           828:  [(set_attr "type" "fp")])
        !           829: 
        !           830: (define_insn "mulsidi3"
        !           831:   [(set (match_operand:DI 0 "int_reg_operand" "=r")
        !           832:        (mult:DI (sign_extend:DI (match_operand:SI 1 "int_reg_operand" "%0"))
        !           833:                 (sign_extend:DI (match_operand:SI 2 "int_reg_operand" "r"))))]
        !           834:   ""
        !           835:   "mulwx  %2,%0"
        !           836: [(set_attr "type" "arith")
        !           837:  (set_attr "cc" "clobber")])
        !           838: 
        !           839: (define_insn "umulsidi3"
        !           840:   [(set (match_operand:DI 0 "int_reg_operand" "=r")
        !           841:        (mult:DI (zero_extend:DI (match_operand:SI 1 "int_reg_operand" "%0"))
        !           842:                 (zero_extend:DI (match_operand:SI 2 "int_reg_operand" "r"))))]
        !           843:   ""
        !           844:   "mulwux %2,%0"
        !           845: [(set_attr "type" "arith")
        !           846:  (set_attr "cc" "clobber")])
        !           847: 
        !           848: (define_insn "mulsi3"
        !           849:   [(set (match_operand:SI 0 "int_reg_operand" "=r")
        !           850:        (mult:SI (match_operand:SI 1 "int_reg_operand" "%0")
        !           851:                 (match_operand:SI 2 "int_reg_operand" "r")))]
        !           852:   ""
        !           853:   "mulw   %2,%0"
        !           854:  [(set_attr "type" "arith")
        !           855:   (set_attr "cc" "clobber")])
        !           856: 
        !           857: 
        !           858: ;;- Divide and mod instructions.
        !           859: 
        !           860: (define_insn "divdf3"
        !           861:   [(set (match_operand:DF 0 "fp_reg_operand" "=f")
        !           862:        (div:DF (match_operand:DF 1 "fp_reg_operand" "0")
        !           863:                (match_operand:DF 2 "fp_reg_operand" "f")))]
        !           864:   ""
        !           865:   "divd   %2,%0"
        !           866:  [(set_attr "type" "fp")])
        !           867: 
        !           868: (define_insn "divsf3"
        !           869:   [(set (match_operand:SF 0 "fp_reg_operand" "=f")
        !           870:        (div:SF (match_operand:SF 1 "fp_reg_operand" "0")
        !           871:                (match_operand:SF 2 "fp_reg_operand" "f")))]
        !           872:   ""
        !           873:   "divs   %2,%0"
        !           874:  [(set_attr "type" "fp")])
        !           875: 
        !           876: (define_insn "divsi3"
        !           877:   [(set (match_operand:SI 0 "int_reg_operand" "=r")
        !           878:        (div:SI (match_operand:SI 1 "int_reg_operand" "0")
        !           879:                (match_operand:SI 2 "int_reg_operand" "r")))]
        !           880:   ""
        !           881:   "divw   %2,%0"
        !           882:  [(set_attr "type" "arith")
        !           883:   (set_attr "cc" "clobber")])
        !           884: 
        !           885: (define_insn "udivsi3"
        !           886:   [(set (match_operand:SI 0 "int_reg_operand" "=r")
        !           887:        (udiv:SI (match_operand:SI 1 "int_reg_operand" "0")
        !           888:                 (match_operand:SI 2 "int_reg_operand" "r")))]
        !           889:   ""
        !           890:   "divwu  %2,%0"
        !           891:  [(set_attr "type" "arith")
        !           892:   (set_attr "cc" "clobber")])
        !           893: 
        !           894: 
        !           895: (define_insn "modsi3"
        !           896:   [(set (match_operand:SI 0 "int_reg_operand" "=r")
        !           897:        (mod:SI (match_operand:SI 1 "int_reg_operand" "0")
        !           898:                (match_operand:SI 2 "int_reg_operand" "r")))]
        !           899:   ""
        !           900:   "modw   %2,%0"
        !           901:  [(set_attr "type" "arith")
        !           902:   (set_attr "cc" "clobber")])
        !           903: 
        !           904: (define_insn "umodsi3"
        !           905:   [(set (match_operand:SI 0 "int_reg_operand" "=r")
        !           906:        (umod:SI (match_operand:SI 1 "int_reg_operand" "0")
        !           907:                 (match_operand:SI 2 "int_reg_operand" "r")))]
        !           908:   ""
        !           909:   "modwu  %2,%0"
        !           910:  [(set_attr "type" "arith")
        !           911:   (set_attr "cc" "clobber")])
        !           912: 
        !           913: ;;
        !           914: ;; bit and/or instructions
        !           915: ;;
        !           916: (define_insn "andsi3"
        !           917:   [(set (match_operand:SI 0 "int_reg_operand" "=r,r")
        !           918:         (and:SI (match_operand:SI 1 "int_reg_operand" "%0,0")
        !           919:                (match_operand:SI 2 "nonmemory_operand" "r,n")))]
        !           920:   ""
        !           921:   "@
        !           922:    andw   %2,%0
        !           923:    andi   %2,%0"
        !           924:  [(set_attr "type" "arith")])
        !           925: 
        !           926: (define_insn "iorsi3"
        !           927:   [(set (match_operand:SI 0 "int_reg_operand" "=r,r")
        !           928:        (ior:SI (match_operand:SI 1 "int_reg_operand" "%0,0")
        !           929:                (match_operand:SI 2 "nonmemory_operand" "r,n")))]
        !           930:   ""
        !           931:   "@
        !           932:    orw    %2,%0
        !           933:    ori    %2,%0"
        !           934:  [(set_attr "type" "arith")])
        !           935: 
        !           936: (define_insn "xorsi3"
        !           937:   [(set (match_operand:SI 0 "int_reg_operand" "=r,r")
        !           938:        (xor:SI (match_operand:SI 1 "int_reg_operand" "%0,0")
        !           939:                (match_operand:SI 2 "nonmemory_operand" "r,n")))]
        !           940:   ""
        !           941:   "@
        !           942:    xorw   %2,%0
        !           943:    xori   %2,%0"
        !           944:  [(set_attr "type" "arith")])
        !           945: 
        !           946: (define_insn "negdf2"
        !           947:   [(set (match_operand:DF 0 "fp_reg_operand" "=f")
        !           948:        (neg:DF (match_operand:DF 1 "fp_reg_operand" "f")))]
        !           949:   ""
        !           950:   "negd   %1,%0"
        !           951:  [(set_attr "type" "fp")])
        !           952: 
        !           953: (define_insn "negsf2"
        !           954:   [(set (match_operand:SF 0 "fp_reg_operand" "=f")
        !           955:        (neg:SF (match_operand:SF 1 "fp_reg_operand" "f")))]
        !           956:   ""
        !           957:   "negs   %1,%0"
        !           958:  [(set_attr "type" "fp")])
        !           959: 
        !           960: (define_insn "negsi2"
        !           961:   [(set (match_operand:SI 0 "int_reg_operand" "=r")
        !           962:        (neg:SI (match_operand:SI 1 "int_reg_operand" "r")))]
        !           963:   ""
        !           964:   "negw   %1,%0"
        !           965:  [(set_attr "type" "arith")])
        !           966: 
        !           967: 
        !           968: (define_insn "one_cmplsi2"
        !           969:   [(set (match_operand:SI 0 "int_reg_operand" "=r")
        !           970:        (not:SI (match_operand:SI 1 "int_reg_operand" "r")))]
        !           971:   ""
        !           972:   "notw   %1,%0"
        !           973:  [(set_attr "type" "arith")])
        !           974: 
        !           975: 
        !           976: 
        !           977: ;; Right shift on the clipper works by negating the shift count,
        !           978: ;; then emitting a right shift with the shift count negated.  This means
        !           979: ;; that all actual shift counts in the RTL will be positive.
        !           980: 
        !           981: (define_expand "ashrdi3"
        !           982:   [(set (match_operand:DI 0 "int_reg_operand" "")
        !           983:        (ashiftrt:DI (match_operand:DI 1 "int_reg_operand" "")
        !           984:                     (match_operand:SI 2 "nonmemory_operand" "")))]
        !           985:   ""
        !           986:   "
        !           987: {
        !           988:   if (GET_CODE (operands[2]) != CONST_INT)
        !           989:     operands[2] = gen_rtx (NEG, SImode, negate_rtx (SImode, operands[2]));
        !           990: }")
        !           991: 
        !           992: (define_insn ""
        !           993:   [(set (match_operand:DI 0 "int_reg_operand" "=r")
        !           994:        (ashiftrt:DI (match_operand:DI 1 "int_reg_operand" "0")
        !           995:                     (match_operand:SI 2 "const_int_operand" "n")))]
        !           996:   ""
        !           997:   "shali  $%n2,%0"
        !           998:  [(set_attr "type" "arith")])
        !           999: 
        !          1000: (define_insn ""
        !          1001:   [(set (match_operand:DI 0 "int_reg_operand" "=r")
        !          1002:        (ashiftrt:DI (match_operand:DI 1 "int_reg_operand" "0")
        !          1003:                     (neg:SI (match_operand:SI 2 "nonmemory_operand" "r"))))]
        !          1004:   ""
        !          1005:   "shal   %2,%0"
        !          1006:  [(set_attr "type" "arith")])
        !          1007: 
        !          1008: (define_expand "ashrsi3"
        !          1009:   [(set (match_operand:SI 0 "int_reg_operand" "")
        !          1010:        (ashiftrt:SI (match_operand:SI 1 "int_reg_operand" "")
        !          1011:                     (match_operand:SI 2 "nonmemory_operand" "")))]
        !          1012:   ""
        !          1013:   "
        !          1014: {
        !          1015:   if (GET_CODE (operands[2]) != CONST_INT)
        !          1016:     operands[2] = gen_rtx (NEG, SImode, negate_rtx (SImode, operands[2]));
        !          1017: }")
        !          1018: 
        !          1019: (define_insn ""
        !          1020:   [(set (match_operand:SI 0 "int_reg_operand" "=r")
        !          1021:        (ashiftrt:SI (match_operand:SI 1 "int_reg_operand" "0")
        !          1022:                     (match_operand:SI 2 "const_int_operand" "n")))]
        !          1023:   ""
        !          1024:   "shai   $%n2,%0"
        !          1025:  [(set_attr "type" "arith")])
        !          1026: 
        !          1027: (define_insn ""
        !          1028:   [(set (match_operand:SI 0 "int_reg_operand" "=r")
        !          1029:        (ashiftrt:SI (match_operand:SI 1 "int_reg_operand" "0")
        !          1030:                     (neg:SI (match_operand:SI 2 "nonmemory_operand" "r"))))]
        !          1031:   ""
        !          1032:   "shaw   %2,%0"
        !          1033:  [(set_attr "type" "arith")])
        !          1034: 
        !          1035: ;;
        !          1036: ;; left shift
        !          1037: ;;
        !          1038: 
        !          1039: (define_insn "ashldi3"
        !          1040:   [(set (match_operand:DI 0 "int_reg_operand" "=r,r")
        !          1041:        (ashift:DI (match_operand:DI 1 "int_reg_operand" "0,0")
        !          1042:                   (match_operand:SI 2 "nonmemory_operand" "r,n")))]
        !          1043:   ""
        !          1044:   "@
        !          1045:    shal   %2,%0
        !          1046:    shali  %2,%0"
        !          1047:  [(set_attr "type" "arith")])
        !          1048: 
        !          1049: 
        !          1050: (define_insn "ashlsi3"
        !          1051:   [(set (match_operand:SI 0 "int_reg_operand" "=r,r")
        !          1052:        (ashift:SI (match_operand:SI 1 "int_reg_operand" "0,0")
        !          1053:                   (match_operand:SI 2 "nonmemory_operand" "r,n")))]
        !          1054:   ""
        !          1055:   "*
        !          1056: {
        !          1057:   int val;
        !          1058: 
        !          1059:   if (which_alternative == 0)
        !          1060:    return \"shaw   %2,%0\";
        !          1061: 
        !          1062:   val = INTVAL (operands[2]);
        !          1063: 
        !          1064:   if (val == 2)
        !          1065:     return \"addw   %0,%0\;addw   %0,%0\";
        !          1066: 
        !          1067:   if (val == 1)
        !          1068:     return \"addw   %0,%0\";
        !          1069: 
        !          1070:   return \"shai   %2,%0\";
        !          1071: }"
        !          1072: [(set_attr "type" "arith")])
        !          1073: 
        !          1074: ;;
        !          1075: ;; logical shift
        !          1076: ;;
        !          1077: 
        !          1078: (define_expand "lshrdi3"
        !          1079:   [(set (match_operand:DI 0 "int_reg_operand" "")
        !          1080:        (lshiftrt:DI (match_operand:DI 1 "int_reg_operand" "")
        !          1081:                     (match_operand:SI 2 "nonmemory_operand" "")))]
        !          1082:   ""
        !          1083:   "
        !          1084: {
        !          1085:   if (GET_CODE (operands[2]) != CONST_INT)
        !          1086:     operands[2] = gen_rtx (NEG, SImode, negate_rtx (SImode, operands[2]));
        !          1087: }")
        !          1088: 
        !          1089: (define_insn ""
        !          1090:   [(set (match_operand:DI 0 "int_reg_operand" "=r")
        !          1091:        (lshiftrt:DI (match_operand:DI 1 "int_reg_operand" "0")
        !          1092:                     (match_operand:SI 2 "const_int_operand" "n")))]
        !          1093:   ""
        !          1094:   "shlli  $%n2,%0"
        !          1095:  [(set_attr "type" "arith")])
        !          1096: 
        !          1097: (define_insn ""
        !          1098:   [(set (match_operand:DI 0 "int_reg_operand" "=r")
        !          1099:        (lshiftrt:DI (match_operand:DI 1 "int_reg_operand" "0")
        !          1100:                     (neg:SI (match_operand:SI 2 "nonmemory_operand" "r"))))]
        !          1101:   ""
        !          1102:   "shll   %2,%0"
        !          1103:  [(set_attr "type" "arith")])
        !          1104: 
        !          1105: (define_expand "lshrsi3"
        !          1106:   [(set (match_operand:SI 0 "int_reg_operand" "")
        !          1107:        (lshiftrt:SI (match_operand:SI 1 "int_reg_operand" "")
        !          1108:                     (match_operand:SI 2 "nonmemory_operand" "")))]
        !          1109:   ""
        !          1110:   "
        !          1111: {
        !          1112:   if (GET_CODE (operands[2]) != CONST_INT)
        !          1113:     operands[2] = gen_rtx (NEG, SImode, negate_rtx (SImode, operands[2]));
        !          1114: }")
        !          1115: 
        !          1116: (define_insn ""
        !          1117:   [(set (match_operand:SI 0 "int_reg_operand" "=r")
        !          1118:        (lshiftrt:SI (match_operand:SI 1 "int_reg_operand" "0")
        !          1119:                     (match_operand:SI 2 "const_int_operand" "n")))]
        !          1120:   ""
        !          1121:   "shli   $%n2,%0"
        !          1122:  [(set_attr "type" "arith")])
        !          1123: 
        !          1124: (define_insn ""
        !          1125:   [(set (match_operand:SI 0 "int_reg_operand" "=r")
        !          1126:        (lshiftrt:SI (match_operand:SI 1 "int_reg_operand" "0")
        !          1127:                     (neg:SI (match_operand:SI 2 "nonmemory_operand" "r"))))]
        !          1128:   ""
        !          1129:   "shlw   %2,%0"
        !          1130:  [(set_attr "type" "arith")])
        !          1131: 
        !          1132: (define_insn "lshldi3"
        !          1133:   [(set (match_operand:DI 0 "int_reg_operand" "=r,r")
        !          1134:        (lshift:DI (match_operand:DI 1 "int_reg_operand" "0,0")
        !          1135:                   (match_operand:SI 2 "nonmemory_operand" "r,n")))]
        !          1136:   ""
        !          1137:   "@
        !          1138:    shll   %2,%0
        !          1139:    shlli  %2,%0"
        !          1140:  [(set_attr "type" "arith")])
        !          1141: 
        !          1142: (define_insn "lshlsi3"
        !          1143:   [(set (match_operand:SI 0 "int_reg_operand" "=r,r")
        !          1144:        (lshift:SI (match_operand:SI 1 "int_reg_operand" "0,0")
        !          1145:                   (match_operand:SI 2 "nonmemory_operand" "r,n")))]
        !          1146:   ""
        !          1147:   "@
        !          1148:    shlw   %2,%0
        !          1149:    shli   %2,%0"
        !          1150:  [(set_attr "type" "arith")])
        !          1151: 
        !          1152: ;;
        !          1153: ;; rotate insn
        !          1154: ;;
        !          1155: (define_expand "rotrdi3"
        !          1156:   [(set (match_operand:DI 0 "int_reg_operand" "")
        !          1157:        (rotatert:DI (match_operand:DI 1 "int_reg_operand" "")
        !          1158:                     (match_operand:SI 2 "nonmemory_operand" "")))]
        !          1159:   ""
        !          1160:   "
        !          1161: {
        !          1162:   if (GET_CODE (operands[2]) != CONST_INT)
        !          1163:     operands[2] = gen_rtx (NEG, SImode, negate_rtx (SImode, operands[2]));
        !          1164: }")
        !          1165: 
        !          1166: (define_insn ""
        !          1167:   [(set (match_operand:DI 0 "int_reg_operand" "=r")
        !          1168:        (rotatert:DI (match_operand:DI 1 "int_reg_operand" "0")
        !          1169:                     (match_operand:SI 2 "const_int_operand" "n")))]
        !          1170:   ""
        !          1171:   "rotli  $%n2,%0"
        !          1172:  [(set_attr "type" "arith")])
        !          1173: 
        !          1174: (define_insn ""
        !          1175:   [(set (match_operand:DI 0 "int_reg_operand" "=r")
        !          1176:        (rotatert:DI (match_operand:DI 1 "int_reg_operand" "0")
        !          1177:                     (neg:SI (match_operand:SI 2 "nonmemory_operand" "r"))))]
        !          1178:   ""
        !          1179:   "rotl   %2,%0"
        !          1180:  [(set_attr "type" "arith")])
        !          1181: 
        !          1182: (define_expand "rotrsi3"
        !          1183:   [(set (match_operand:SI 0 "int_reg_operand" "")
        !          1184:        (rotatert:SI (match_operand:SI 1 "int_reg_operand" "")
        !          1185:                     (match_operand:SI 2 "nonmemory_operand" "")))]
        !          1186:   ""
        !          1187:   "
        !          1188: {
        !          1189:   if (GET_CODE (operands[2]) != CONST_INT)
        !          1190:     operands[2] = gen_rtx (NEG, SImode, negate_rtx (SImode, operands[2]));
        !          1191: }")
        !          1192: 
        !          1193: (define_insn ""
        !          1194:   [(set (match_operand:SI 0 "int_reg_operand" "=r")
        !          1195:        (rotatert:SI (match_operand:SI 1 "int_reg_operand" "0")
        !          1196:                     (match_operand:SI 2 "const_int_operand" "n")))]
        !          1197:   ""
        !          1198:   "roti   $%n2,%0"
        !          1199:  [(set_attr "type" "arith")])
        !          1200: 
        !          1201: (define_insn ""
        !          1202:   [(set (match_operand:SI 0 "int_reg_operand" "=r")
        !          1203:        (rotatert:SI (match_operand:SI 1 "int_reg_operand" "0")
        !          1204:                     (neg:SI (match_operand:SI 2 "nonmemory_operand" "r"))))]
        !          1205:   ""
        !          1206:   "rotw   %2,%0"
        !          1207:  [(set_attr "type" "arith")])
        !          1208: 
        !          1209: (define_insn "rotldi3"
        !          1210:   [(set (match_operand:DI 0 "int_reg_operand" "=r,r")
        !          1211:        (rotate:DI (match_operand:DI 1 "int_reg_operand" "0,0")
        !          1212:                   (match_operand:SI 2 "nonmemory_operand" "r,n")))]
        !          1213:   ""
        !          1214:   "@
        !          1215:    rotl   %2,%0
        !          1216:    rotli  %2,%0"
        !          1217:  [(set_attr "type" "arith")])
        !          1218: 
        !          1219: (define_insn "rotlsi3"
        !          1220:   [(set (match_operand:SI 0 "int_reg_operand" "=r,r")
        !          1221:        (rotate:SI (match_operand:SI 1 "int_reg_operand" "0,0")
        !          1222:                   (match_operand:SI 2 "nonmemory_operand" "r,n")))]
        !          1223:   ""
        !          1224:   "@
        !          1225:    rotw   %2,%0
        !          1226:    roti   %2,%0"
        !          1227:  [(set_attr "type" "arith")])
        !          1228: 
        !          1229: 
        !          1230: ;;
        !          1231: ;; jump and branch insns
        !          1232: ;;
        !          1233: (define_insn "jump"
        !          1234:   [(set (pc)
        !          1235:        (label_ref (match_operand 0 "" "")))]
        !          1236:   ""
        !          1237:   "b      %l0"
        !          1238:  [(set_attr "type" "branch")])
        !          1239: 
        !          1240: (define_insn "tablejump"
        !          1241:   [(set (pc) (match_operand:SI 0 "register_operand" "r"))
        !          1242:    (use (label_ref (match_operand 1 "" "")))]
        !          1243:   ""
        !          1244:   "b      (%0)"
        !          1245:  [(set_attr "type" "branch")])
        !          1246: 
        !          1247: (define_insn "beq"
        !          1248:   [(set (pc)
        !          1249:        (if_then_else (eq (cc0)
        !          1250:                          (const_int 0))
        !          1251:                      (label_ref (match_operand 0 "" ""))
        !          1252:                      (pc)))]
        !          1253:   ""
        !          1254:   "breq   %l0"
        !          1255:  [(set_attr "type" "branch")])
        !          1256: 
        !          1257: (define_insn "bne"
        !          1258:   [(set (pc)
        !          1259:        (if_then_else (ne (cc0)
        !          1260:                          (const_int 0))
        !          1261:                      (label_ref (match_operand 0 "" ""))
        !          1262:                      (pc)))]
        !          1263:   ""
        !          1264:   "brne   %l0"
        !          1265:  [(set_attr "type" "branch")])
        !          1266: 
        !          1267: (define_insn "bgt"
        !          1268:   [(set (pc)
        !          1269:        (if_then_else (gt (cc0)
        !          1270:                          (const_int 0))
        !          1271:                      (label_ref (match_operand 0 "" ""))
        !          1272:                      (pc)))]
        !          1273:   ""
        !          1274:   "brgt   %l0"
        !          1275:  [(set_attr "type" "branch")])
        !          1276: 
        !          1277: (define_insn "bgtu"
        !          1278:   [(set (pc)
        !          1279:        (if_then_else (gtu (cc0)
        !          1280:                           (const_int 0))
        !          1281:                      (label_ref (match_operand 0 "" ""))
        !          1282:                      (pc)))]
        !          1283:   ""
        !          1284:   "brgtu  %l0"
        !          1285:  [(set_attr "type" "branch")])
        !          1286: 
        !          1287: (define_insn "blt"
        !          1288:   [(set (pc)
        !          1289:        (if_then_else (lt (cc0)
        !          1290:                          (const_int 0))
        !          1291:                      (label_ref (match_operand 0 "" ""))
        !          1292:                      (pc)))]
        !          1293:   ""
        !          1294:   "brlt   %l0"
        !          1295:  [(set_attr "type" "branch")])
        !          1296: 
        !          1297: (define_insn "bltu"
        !          1298:   [(set (pc)
        !          1299:        (if_then_else (ltu (cc0)
        !          1300:                           (const_int 0))
        !          1301:                      (label_ref (match_operand 0 "" ""))
        !          1302:                      (pc)))]
        !          1303:   ""
        !          1304:   "brltu  %l0"
        !          1305:  [(set_attr "type" "branch")])
        !          1306: 
        !          1307: (define_insn "bge"
        !          1308:   [(set (pc)
        !          1309:        (if_then_else (ge (cc0)
        !          1310:                          (const_int 0))
        !          1311:                      (label_ref (match_operand 0 "" ""))
        !          1312:                      (pc)))]
        !          1313:   ""
        !          1314:   "brge   %l0"
        !          1315:  [(set_attr "type" "branch")])
        !          1316: 
        !          1317: (define_insn "bgeu"
        !          1318:   [(set (pc)
        !          1319:        (if_then_else (geu (cc0)
        !          1320:                           (const_int 0))
        !          1321:                      (label_ref (match_operand 0 "" ""))
        !          1322:                      (pc)))]
        !          1323:   ""
        !          1324:   "brgeu  %l0"
        !          1325:  [(set_attr "type" "branch")])
        !          1326: 
        !          1327: (define_insn "ble"
        !          1328:   [(set (pc)
        !          1329:        (if_then_else (le (cc0)
        !          1330:                          (const_int 0))
        !          1331:                      (label_ref (match_operand 0 "" ""))
        !          1332:                      (pc)))]
        !          1333:  ""
        !          1334:  "brle   %l0"
        !          1335:  [(set_attr "type" "branch")])
        !          1336: 
        !          1337: (define_insn "bleu"
        !          1338:   [(set (pc)
        !          1339:        (if_then_else (leu (cc0)
        !          1340:                           (const_int 0))
        !          1341:                      (label_ref (match_operand 0 "" ""))
        !          1342:                      (pc)))]
        !          1343:  ""
        !          1344:  "brleu  %l0"
        !          1345:  [(set_attr "type" "branch")])
        !          1346: 
        !          1347: ;; Recognize reversed jumps.
        !          1348: (define_insn ""
        !          1349:   [(set (pc)
        !          1350:        (if_then_else (match_operator 0 "comparison_operator"
        !          1351:                                      [(cc0)
        !          1352:                                       (const_int 0)])
        !          1353:                      (pc)
        !          1354:                      (label_ref (match_operand 1 "" ""))))]
        !          1355:  ""
        !          1356:  "br%C0    %l1" ; %C0 negates condition
        !          1357:  [(set_attr "type" "branch")])
        !          1358: 
        !          1359: ;;
        !          1360: ;; call instructions
        !          1361: ;;
        !          1362: (define_insn "call"
        !          1363:   [(call (match_operand:QI 0 "general_operand" "m")
        !          1364:         (match_operand:SI 1 "general_operand" ""))]
        !          1365:   ;; Operand 1 not used on the clipper.
        !          1366:   ""
        !          1367:   "call   sp,%0")
        !          1368: 
        !          1369: (define_insn "call_value"
        !          1370:   [(set (match_operand 0 "" "=rf")
        !          1371:        (call (match_operand:QI 1 "general_operand" "m")
        !          1372:              (match_operand:SI 2 "general_operand" "g")))]
        !          1373:   ;; Operand 2 not used on the clipper
        !          1374:   ""
        !          1375:   "call   sp,%1")
        !          1376: 
        !          1377: (define_insn "indirect_jump"
        !          1378:   [(set (pc) (match_operand:SI 0 "register_operand" "r"))]
        !          1379:   ""
        !          1380:   "b      (%0)"
        !          1381:  [(set_attr "type" "branch")])
        !          1382: 
        !          1383: 
        !          1384: (define_insn "nop"
        !          1385:   [(const_int 0)]
        !          1386:   ""
        !          1387:   "noop"
        !          1388:  [(set_attr "type" "arith")
        !          1389:   (set_attr "cc" "unchanged")])
        !          1390: 
        !          1391: 
        !          1392: 
        !          1393: ;; while (--foo >= 0)
        !          1394: ;;
        !          1395: ;; Combiners for 'decrement test and branch' do not work for clipper.
        !          1396: ;; These patters are jump_insns that do not allow output reloads and clipper
        !          1397: ;; can only decrement and test registers.
        !          1398: ;;

unix.superglobalmegacorp.com

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