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

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

unix.superglobalmegacorp.com

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