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

1.1     ! root        1: ;; Machine description for Pyramid 90 Series for GNU C compiler
        !             2: ;; Copyright (C) 1989 Free Software Foundation, Inc.
        !             3: 
        !             4: ;; This file is part of GNU CC.
        !             5: 
        !             6: ;; GNU CC is free software; you can redistribute it and/or modify
        !             7: ;; it under the terms of the GNU General Public License as published by
        !             8: ;; the Free Software Foundation; either version 1, or (at your option)
        !             9: ;; any later version.
        !            10: 
        !            11: ;; GNU CC is distributed in the hope that it will be useful,
        !            12: ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
        !            13: ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        !            14: ;; GNU General Public License for more details.
        !            15: 
        !            16: ;; You should have received a copy of the GNU General Public License
        !            17: ;; along with GNU CC; see the file COPYING.  If not, write to
        !            18: ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
        !            19: 
        !            20: ;; Instruction patterns.  When multiple patterns apply,
        !            21: ;; the first one in the file is chosen.
        !            22: ;;
        !            23: ;; See file "rtl.def" for documentation on define_insn, match_*, et. al.
        !            24: ;;
        !            25: ;; cpp macro #define NOTICE_UPDATE_CC in file tm.h handles condition code
        !            26: ;; updates for most instructions.
        !            27: 
        !            28: ;; * Should we check for SUBREG as well as REG, in some places???
        !            29: ;; * Make the jump tables contain branches, not addresses!  This would
        !            30: ;;   save us one instruction.
        !            31: ;; * Could the compilcated scheme for compares be simplyfied, if we had
        !            32: ;;   no named cmpqi or cmphi patterns, and instead anonymous patterns for
        !            33: ;;   the less-than-word compare cases pyr can handle???
        !            34: ;; * The jump insn seems to accept more than just IR addressing.  Would
        !            35: ;;   we win by telling GCC?
        !            36: ;; * More DImode patterns.
        !            37: ;; * Expansion of "cmpsi" is not necessary.  Also, some define_insn could
        !            38: ;;   be taken away if constraints were used.
        !            39: ;; * Scan backwards in "zero_extendhisi2", "zero_extendqisi2" to find out
        !            40: ;;   if the extension can be omitted.  Also improve the scan (now in the sign
        !            41: ;;   extenstion patterns), to handle more cases than extension regx->regx.
        !            42: ;; * Enhance NOTICE_UPDATE_CC.  1) Should not be reset by insn that don't
        !            43: ;;   modify cc.  2) cc is preserved by CALL.
        !            44: ;; * "divmodsi" with Pyramid "ediv" insn.  Is it possible in rtl??
        !            45: ;; * Would "rcsp tmpreg; u?cmp[bh] op1_regdispl(tmpreg),op2" win in
        !            46: ;;   comparison with the two extensions and single test generated now?
        !            47: ;;   The rcsp insn could be expanded, and moved out of loops by the
        !            48: ;;   optimizer, making 1 (64 bit) insn of 3 (32 bit) insns in loops.
        !            49: ;;   The rcsp insn could be followed by an add insn, making non-displacement
        !            50: ;;   IR addressing sufficient.
        !            51: 
        !            52: ;______________________________________________________________________
        !            53: ;
        !            54: ;      Test and Compare Patterns.
        !            55: ;______________________________________________________________________
        !            56: 
        !            57: (define_expand "cmpsi"
        !            58:   [(set (cc0)
        !            59:        (compare (match_operand:SI 0 "general_operand" "")
        !            60:                 (match_operand:SI 1 "general_operand" "")))]
        !            61:   ""
        !            62:   "
        !            63: {
        !            64:   extern rtx test_op0, test_op1;
        !            65:   test_op0 = copy_rtx (operands[0]);
        !            66:   test_op1 = copy_rtx (operands[1]);
        !            67:   DONE;
        !            68: }")
        !            69: 
        !            70: (define_expand "tstsi"
        !            71:   [(set (cc0)
        !            72:        (match_operand:SI 0 "general_operand" ""))]
        !            73:   ""
        !            74:   "
        !            75: {
        !            76:   extern rtx test_op0, test_op1;
        !            77:   test_op0 = copy_rtx (operands[0]);
        !            78:   DONE;
        !            79: }")
        !            80: 
        !            81: (define_insn ""
        !            82:   [(set (cc0)
        !            83:        (compare (match_operand:SI 0 "memory_operand" "m")
        !            84:                 (match_operand:SI 1 "memory_operand" "m")))]
        !            85:   "weird_memory_memory (operands[0], operands[1])"
        !            86:   "*
        !            87: {
        !            88:   rtx br_insn = NEXT_INSN (insn);
        !            89:   RTX_CODE br_code;
        !            90: 
        !            91:   if (GET_CODE (br_insn) != JUMP_INSN)
        !            92:     abort();
        !            93:   br_code =  GET_CODE (XEXP (XEXP (PATTERN (br_insn), 1), 0));
        !            94: 
        !            95:   weird_memory_memory (operands[0], operands[1]);
        !            96: 
        !            97:   if (swap_operands == 0)
        !            98:     return (br_code >= GEU && br_code <= LTU
        !            99:            ? \"ucmpw %1,%0\" : \"cmpw %1,%0\");
        !           100:   else
        !           101:     {
        !           102:       cc_status.flags |= CC_REVERSED;
        !           103:       return (br_code >= GEU && br_code <= LTU
        !           104:              ? \"ucmpw %0,%1\" : \"cmpw %0,%1\");
        !           105:     }
        !           106: }")
        !           107: 
        !           108: (define_insn ""
        !           109:   [(set (cc0)
        !           110:        (compare (match_operand:SI 0 "general_operand" "r,g")
        !           111:                 (match_operand:SI 1 "general_operand" "g,r")))]
        !           112:   ""
        !           113:   "*
        !           114: {
        !           115:   rtx br_insn = NEXT_INSN (insn);
        !           116:   RTX_CODE br_code;
        !           117: 
        !           118:   if (GET_CODE (br_insn) != JUMP_INSN)
        !           119:     abort();
        !           120:   br_code =  GET_CODE (XEXP (XEXP (PATTERN (br_insn), 1), 0));
        !           121: 
        !           122:   if (which_alternative == 0)
        !           123:     return (br_code >= GEU && br_code <= LTU)
        !           124:       ? \"ucmpw %1,%0\" : \"cmpw %1,%0\";
        !           125:   else
        !           126:     {
        !           127:       cc_status.flags |= CC_REVERSED;
        !           128:       return (br_code >= GEU && br_code <= LTU)
        !           129:        ? \"ucmpw %0,%1\" : \"cmpw %0,%1\";
        !           130:     }
        !           131: }")
        !           132: 
        !           133: (define_insn ""
        !           134:   [(set (cc0)
        !           135:        (match_operand:SI 0 "register_operand" "r"))]
        !           136:   ""
        !           137:   "mtstw %0,%0")
        !           138: 
        !           139: (define_expand "cmphi"
        !           140:   [(set (cc0)
        !           141:        (compare (match_operand:HI 0 "general_operand" "")
        !           142:                 (match_operand:HI 1 "general_operand" "")))]
        !           143:   ""
        !           144:   "
        !           145: {
        !           146:   extern rtx test_op0, test_op1;
        !           147:   test_op0 = copy_rtx (operands[0]);
        !           148:   test_op1 = copy_rtx (operands[1]);
        !           149:   DONE;
        !           150: }")
        !           151: 
        !           152: (define_expand "tsthi"
        !           153:   [(set (cc0)
        !           154:        (match_operand:HI 0 "general_operand" ""))]
        !           155:   ""
        !           156:   "
        !           157: {
        !           158:   extern rtx test_op0, test_op1;
        !           159:   test_op0 = copy_rtx (operands[0]);
        !           160:   DONE;
        !           161: }")
        !           162: 
        !           163: (define_insn ""
        !           164:   [(set (cc0)
        !           165:        (compare (match_operand:HI 0 "memory_operand" "m")
        !           166:                 (match_operand:HI 1 "memory_operand" "m")))]
        !           167:   "weird_memory_memory (operands[0], operands[1])"
        !           168:   "*
        !           169: {
        !           170:   rtx br_insn = NEXT_INSN (insn);
        !           171: 
        !           172:   if (GET_CODE (br_insn) != JUMP_INSN)
        !           173:     abort();
        !           174: 
        !           175:   weird_memory_memory (operands[0], operands[1]);
        !           176: 
        !           177:   if (swap_operands == 0)
        !           178:     return \"cmph %1,%0\";
        !           179:   else
        !           180:     {
        !           181:       cc_status.flags |= CC_REVERSED;
        !           182:       return \"cmph %0,%1\";
        !           183:     }
        !           184: }")
        !           185: 
        !           186: (define_insn ""
        !           187:   [(set (cc0)
        !           188:        (compare (match_operand:HI 0 "nonimmediate_operand" "r,m")
        !           189:                 (match_operand:HI 1 "nonimmediate_operand" "m,r")))]
        !           190:   ""
        !           191:   "*
        !           192: {
        !           193:   rtx br_insn = NEXT_INSN (insn);
        !           194: 
        !           195:   if (GET_CODE (br_insn) != JUMP_INSN)
        !           196:     abort();
        !           197: 
        !           198:   if (which_alternative == 0)
        !           199:     return \"cmph %1,%0\";
        !           200:   else
        !           201:     {
        !           202:       cc_status.flags |= CC_REVERSED;
        !           203:       return \"cmph %0,%1\";
        !           204:     }
        !           205: }")
        !           206: 
        !           207: (define_expand "cmpqi"
        !           208:   [(set (cc0)
        !           209:        (compare (match_operand:QI 0 "general_operand" "")
        !           210:                 (match_operand:QI 1 "general_operand" "")))]
        !           211:   ""
        !           212:   "
        !           213: {
        !           214:   extern rtx test_op0, test_op1;
        !           215:   test_op0 = copy_rtx (operands[0]);
        !           216:   test_op1 = copy_rtx (operands[1]);
        !           217:   DONE;
        !           218: }")
        !           219: 
        !           220: (define_expand "tstqi"
        !           221:   [(set (cc0)
        !           222:        (match_operand:QI 0 "general_operand" ""))]
        !           223:   ""
        !           224:   "
        !           225: {
        !           226:   extern rtx test_op0, test_op1;
        !           227:   test_op0 = copy_rtx (operands[0]);
        !           228:   DONE;
        !           229: }")
        !           230: 
        !           231: (define_insn ""
        !           232:   [(set (cc0)
        !           233:        (compare (match_operand:QI 0 "memory_operand" "m")
        !           234:                 (match_operand:QI 1 "memory_operand" "m")))]
        !           235:   "weird_memory_memory (operands[0], operands[1])"
        !           236:   "*
        !           237: {
        !           238:   rtx br_insn = NEXT_INSN (insn);
        !           239:   RTX_CODE br_code;
        !           240: 
        !           241:   if (GET_CODE (br_insn) != JUMP_INSN)
        !           242:     abort();
        !           243:   br_code =  GET_CODE (XEXP (XEXP (PATTERN (br_insn), 1), 0));
        !           244: 
        !           245:   weird_memory_memory (operands[0], operands[1]);
        !           246: 
        !           247:   if (swap_operands == 0)
        !           248:     return (br_code >= GEU && br_code <= LTU
        !           249:            ? \"ucmpb %1,%0\" : \"cmpb %1,%0\");
        !           250:   else
        !           251:     {
        !           252:       cc_status.flags |= CC_REVERSED;
        !           253:       return (br_code >= GEU && br_code <= LTU
        !           254:              ? \"ucmpb %0,%1\" : \"cmpb %0,%1\");
        !           255:     }
        !           256: }")
        !           257: 
        !           258: (define_insn ""
        !           259:   [(set (cc0)
        !           260:        (compare (match_operand:QI 0 "nonimmediate_operand" "r,m")
        !           261:                 (match_operand:QI 1 "nonimmediate_operand" "m,r")))]
        !           262:   ""
        !           263:   "*
        !           264: {
        !           265:   rtx br_insn = NEXT_INSN (insn);
        !           266:   RTX_CODE br_code;
        !           267: 
        !           268:   if (GET_CODE (br_insn) != JUMP_INSN)
        !           269:     abort();
        !           270:   br_code =  GET_CODE (XEXP (XEXP (PATTERN (br_insn), 1), 0));
        !           271: 
        !           272:   if (which_alternative == 0)
        !           273:     return (br_code >= GEU && br_code <= LTU)
        !           274:       ? \"ucmpb %1,%0\" : \"cmpb %1,%0\";
        !           275:   else
        !           276:     {
        !           277:       cc_status.flags |= CC_REVERSED;
        !           278:       return (br_code >= GEU && br_code <= LTU)
        !           279:        ? \"ucmpb %0,%1\" : \"cmpb %0,%1\";
        !           280:     }
        !           281: }")
        !           282: 
        !           283: (define_expand "bgt"
        !           284:   [(set (pc) (if_then_else (gt (cc0) (const_int 0))
        !           285:                           (label_ref (match_operand 0 "" "")) (pc)))]
        !           286:   "" "extend_and_branch (SIGN_EXTEND);")
        !           287: 
        !           288: (define_expand "blt"
        !           289:   [(set (pc) (if_then_else (lt (cc0) (const_int 0))
        !           290:                           (label_ref (match_operand 0 "" "")) (pc)))]
        !           291:   "" "extend_and_branch (SIGN_EXTEND);")
        !           292: 
        !           293: (define_expand "bge"
        !           294:   [(set (pc) (if_then_else (ge (cc0) (const_int 0))
        !           295:                           (label_ref (match_operand 0 "" "")) (pc)))]
        !           296:   "" "extend_and_branch (SIGN_EXTEND);")
        !           297: 
        !           298: (define_expand "ble"
        !           299:   [(set (pc) (if_then_else (le (cc0) (const_int 0))
        !           300:                           (label_ref (match_operand 0 "" "")) (pc)))]
        !           301:   "" "extend_and_branch (SIGN_EXTEND);")
        !           302: 
        !           303: (define_expand "beq"
        !           304:   [(set (pc) (if_then_else (eq (cc0) (const_int 0))
        !           305:                           (label_ref (match_operand 0 "" "")) (pc)))]
        !           306:   "" "extend_and_branch (SIGN_EXTEND);")
        !           307: 
        !           308: (define_expand "bne"
        !           309:   [(set (pc) (if_then_else (ne (cc0) (const_int 0))
        !           310:                           (label_ref (match_operand 0 "" "")) (pc)))]
        !           311:   "" "extend_and_branch (SIGN_EXTEND);")
        !           312: 
        !           313: (define_expand "bgtu"
        !           314:   [(set (pc) (if_then_else (gtu (cc0) (const_int 0))
        !           315:                           (label_ref (match_operand 0 "" "")) (pc)))]
        !           316:   "" "extend_and_branch (ZERO_EXTEND);")
        !           317: 
        !           318: (define_expand "bltu"
        !           319:   [(set (pc) (if_then_else (ltu (cc0) (const_int 0))
        !           320:                           (label_ref (match_operand 0 "" "")) (pc)))]
        !           321:   "" "extend_and_branch (ZERO_EXTEND);")
        !           322: 
        !           323: (define_expand "bgeu"
        !           324:   [(set (pc) (if_then_else (geu (cc0) (const_int 0))
        !           325:                           (label_ref (match_operand 0 "" "")) (pc)))]
        !           326:   "" "extend_and_branch (ZERO_EXTEND);")
        !           327: 
        !           328: (define_expand "bleu"
        !           329:   [(set (pc) (if_then_else (leu (cc0) (const_int 0))
        !           330:                           (label_ref (match_operand 0 "" "")) (pc)))]
        !           331:   "" "extend_and_branch (ZERO_EXTEND);")
        !           332: 
        !           333: (define_insn "cmpdf"
        !           334:   [(set (cc0)
        !           335:        (compare (match_operand:DF 0 "register_operand" "r")
        !           336:                 (match_operand:DF 1 "register_operand" "r")))]
        !           337:   ""
        !           338:   "cmpd %1,%0")
        !           339: 
        !           340: (define_insn "cmpsf"
        !           341:   [(set (cc0)
        !           342:        (compare (match_operand:SF 0 "register_operand" "r")
        !           343:                 (match_operand:SF 1 "register_operand" "r")))]
        !           344:   ""
        !           345:   "cmpf %1,%0")
        !           346: 
        !           347: (define_insn "tstdf"
        !           348:   [(set (cc0)
        !           349:                (match_operand:DF 0 "register_operand" "r"))]
        !           350:   ""
        !           351:   "mtstd %0,%0")
        !           352: 
        !           353: (define_insn "tstsf"
        !           354:   [(set (cc0)
        !           355:                (match_operand:SF 0 "register_operand" "r"))]
        !           356:   ""
        !           357:   "mtstf %0,%0")
        !           358: 
        !           359: ;______________________________________________________________________
        !           360: ;
        !           361: ;      Fixed-point Arithmetic.
        !           362: ;______________________________________________________________________
        !           363: 
        !           364: (define_insn "addsi3"
        !           365:   [(set (match_operand:SI 0 "register_operand" "=r,!r")
        !           366:        (plus:SI (match_operand:SI 1 "register_operand" "%0,r")
        !           367:                 (match_operand:SI 2 "general_operand" "g,rJ")))]
        !           368:   ""
        !           369:   "*
        !           370: {
        !           371:   if (which_alternative == 0)
        !           372:     return \"addw %2,%0\";
        !           373:   else
        !           374:     {
        !           375:       CC_STATUS_INIT;
        !           376:       if (REG_P (operands[2]))
        !           377:        return \"mova (%2)[%1*1],%0\";
        !           378:       else
        !           379:        return \"mova %a2[%1*1],%0\";
        !           380:     }
        !           381: }")
        !           382: 
        !           383: (define_insn "subsi3"
        !           384:   [(set (match_operand:SI 0 "register_operand" "=r,r")
        !           385:        (minus:SI (match_operand:SI 1 "general_operand" "0,g")
        !           386:                  (match_operand:SI 2 "general_operand" "g,0")))]
        !           387:   ""
        !           388:   "*
        !           389: {
        !           390:   if (which_alternative == 0)
        !           391:     return \"subw %2,%0\";
        !           392:   else
        !           393:     return \"rsubw %1,%0\";
        !           394: }")
        !           395: 
        !           396: (define_insn "mulsi3"
        !           397:   [(set (match_operand:SI 0 "register_operand" "=r")
        !           398:        (mult:SI (match_operand:SI 1 "register_operand" "%0")
        !           399:                 (match_operand:SI 2 "general_operand" "g")))]
        !           400:   ""
        !           401:   "mulw %2,%0")
        !           402: 
        !           403: (define_insn "umulsi3"
        !           404:   [(set (match_operand:SI 0 "register_operand" "=r")
        !           405:        (umult:SI (match_operand:SI 1 "register_operand" "%0")
        !           406:                  (match_operand:SI 2 "general_operand" "g")))]
        !           407:   ""
        !           408:   "umulw %2,%0")
        !           409: 
        !           410: (define_insn "divsi3"
        !           411:   [(set (match_operand:SI 0 "register_operand" "=r,r")
        !           412:        (div:SI (match_operand:SI 1 "general_operand" "0,g")
        !           413:                (match_operand:SI 2 "general_operand" "g,0")))]
        !           414:   ""
        !           415:   "*
        !           416: {
        !           417:   if (which_alternative == 0)
        !           418:     return \"divw %2,%0\";
        !           419:   else
        !           420:     return \"rdivw %1,%0\";
        !           421: }")
        !           422: 
        !           423: (define_insn "udivsi3"
        !           424:   [(set (match_operand:SI 0 "register_operand" "=r")
        !           425:        (udiv:SI (match_operand:SI 1 "register_operand" "0")
        !           426:                 (match_operand:SI 2 "general_operand" "g")))]
        !           427:   ""
        !           428:   "*
        !           429: {
        !           430:   CC_STATUS_INIT;
        !           431:   return \"udivw %2,%0\";
        !           432: }")
        !           433: 
        !           434: (define_insn "modsi3"
        !           435:   [(set (match_operand:SI 0 "register_operand" "=r")
        !           436:        (mod:SI (match_operand:SI 1 "register_operand" "0")
        !           437:                (match_operand:SI 2 "general_operand" "g")))]
        !           438:   ""
        !           439:   "modw %2,%0")
        !           440: 
        !           441: (define_insn "umodsi3"
        !           442:   [(set (match_operand:SI 0 "register_operand" "=r")
        !           443:        (umod:SI (match_operand:SI 1 "register_operand" "0")
        !           444:                 (match_operand:SI 2 "general_operand" "g")))]
        !           445:   ""
        !           446:   "*
        !           447: {
        !           448:   CC_STATUS_INIT;
        !           449:   return \"umodw %2,%0\";
        !           450: }")
        !           451: 
        !           452: (define_insn "negsi2"
        !           453:   [(set (match_operand:SI 0 "register_operand" "=r")
        !           454:        (neg:SI (match_operand:SI 1 "nonimmediate_operand" "rm")))]
        !           455:   ""
        !           456:   "mnegw %1,%0")
        !           457: 
        !           458: (define_insn "one_cmplsi2"
        !           459:   [(set (match_operand:SI 0 "register_operand" "=r")
        !           460:        (not:SI (match_operand:SI 1 "nonimmediate_operand" "rm")))]
        !           461:   ""
        !           462:   "mcomw %1,%0")
        !           463: 
        !           464: (define_insn "abssi2"
        !           465:   [(set (match_operand:SI 0 "register_operand" "=r")
        !           466:        (abs:SI (match_operand:SI 1 "nonimmediate_operand" "rm")))]
        !           467:   ""
        !           468:   "mabsw %1,%0")
        !           469: 
        !           470: ;______________________________________________________________________
        !           471: ;
        !           472: ;      Floating-point Arithmetic.
        !           473: ;______________________________________________________________________
        !           474: 
        !           475: (define_insn "adddf3"
        !           476:   [(set (match_operand:DF 0 "register_operand" "=r")
        !           477:        (plus:DF (match_operand:DF 1 "register_operand" "%0")
        !           478:                 (match_operand:DF 2 "register_operand" "r")))]
        !           479:   ""
        !           480:   "addd %2,%0")
        !           481: 
        !           482: (define_insn "addsf3"
        !           483:   [(set (match_operand:SF 0 "register_operand" "=r")
        !           484:        (plus:SF (match_operand:SF 1 "register_operand" "%0")
        !           485:                 (match_operand:SF 2 "register_operand" "r")))]
        !           486:   ""
        !           487:   "addf %2,%0")
        !           488: 
        !           489: (define_insn "subdf3"
        !           490:   [(set (match_operand:DF 0 "register_operand" "=r")
        !           491:        (minus:DF (match_operand:DF 1 "register_operand" "0")
        !           492:                  (match_operand:DF 2 "register_operand" "r")))]
        !           493:   ""
        !           494:   "subd %2,%0")
        !           495: 
        !           496: (define_insn "subsf3"
        !           497:   [(set (match_operand:SF 0 "register_operand" "=r")
        !           498:        (minus:SF (match_operand:SF 1 "register_operand" "0")
        !           499:                  (match_operand:SF 2 "register_operand" "r")))]
        !           500:   ""
        !           501:   "subf %2,%0")
        !           502: 
        !           503: (define_insn "muldf3"
        !           504:   [(set (match_operand:DF 0 "register_operand" "=r")
        !           505:        (mult:DF (match_operand:DF 1 "register_operand" "%0")
        !           506:                 (match_operand:DF 2 "register_operand" "r")))]
        !           507:   ""
        !           508:   "muld %2,%0")
        !           509: 
        !           510: (define_insn "mulsf3"
        !           511:   [(set (match_operand:SF 0 "register_operand" "=r")
        !           512:        (mult:SF (match_operand:SF 1 "register_operand" "%0")
        !           513:                 (match_operand:SF 2 "register_operand" "r")))]
        !           514:   ""
        !           515:   "mulf %2,%0")
        !           516: 
        !           517: (define_insn "divdf3"
        !           518:   [(set (match_operand:DF 0 "register_operand" "=r")
        !           519:        (div:DF (match_operand:DF 1 "register_operand" "0")
        !           520:                (match_operand:DF 2 "register_operand" "r")))]
        !           521:   ""
        !           522:   "divd %2,%0")
        !           523: 
        !           524: (define_insn "divsf3"
        !           525:   [(set (match_operand:SF 0 "register_operand" "=r")
        !           526:        (div:SF (match_operand:SF 1 "register_operand" "0")
        !           527:                (match_operand:SF 2 "register_operand" "r")))]
        !           528:   ""
        !           529:   "divf %2,%0")
        !           530: 
        !           531: (define_insn "negdf2"
        !           532:   [(set (match_operand:DF 0 "register_operand" "=r")
        !           533:        (neg:DF (match_operand:DF 1 "register_operand" "r")))]
        !           534:   ""
        !           535:   "mnegd %1,%0")
        !           536: 
        !           537: (define_insn "negsf2"
        !           538:   [(set (match_operand:SF 0 "register_operand" "=r")
        !           539:        (neg:SF (match_operand:SF 1 "register_operand" "r")))]
        !           540:   ""
        !           541:   "mnegf %1,%0")
        !           542: 
        !           543: (define_insn "absdf2"
        !           544:   [(set (match_operand:DF 0 "register_operand" "=r")
        !           545:        (abs:DF (match_operand:DF 1 "register_operand" "r")))]
        !           546:   ""
        !           547:   "mabsd %1,%0")
        !           548: 
        !           549: (define_insn "abssf2"
        !           550:   [(set (match_operand:SF 0 "register_operand" "=r")
        !           551:        (abs:SF (match_operand:SF 1 "register_operand" "r")))]
        !           552:   ""
        !           553:   "mabsf %1,%0")
        !           554: 
        !           555: ;______________________________________________________________________
        !           556: ;
        !           557: ;      Logical and Shift Instructions.
        !           558: ;______________________________________________________________________
        !           559: 
        !           560: (define_insn ""
        !           561:   [(set (cc0)
        !           562:        (and:SI (match_operand:SI 0 "register_operand" "%r")
        !           563:                (match_operand:SI 1 "general_operand" "g")))]
        !           564:   ""
        !           565:   "bitw %1,%0");
        !           566: 
        !           567: (define_insn "andsi3"
        !           568:   [(set (match_operand:SI 0 "register_operand" "=r,r")
        !           569:        (and:SI (match_operand:SI 1 "register_operand" "%0,r")
        !           570:                (match_operand:SI 2 "general_operand" "g,K")))]
        !           571:   ""
        !           572:   "*
        !           573: {
        !           574:   if (which_alternative == 0)
        !           575:     return \"andw %2,%0\";
        !           576:   else
        !           577:     {
        !           578:       CC_STATUS_INIT;
        !           579:       return (INTVAL (operands[2]) == 255
        !           580:              ? \"movzbw %1,%0\" : \"movzhw %1,%0\");
        !           581:     }
        !           582: }")
        !           583: 
        !           584: (define_insn "andcbsi3"
        !           585:   [(set (match_operand:SI 0 "register_operand" "=r")
        !           586:        (and:SI (match_operand:SI 1 "register_operand" "0")
        !           587:                (not:SI (match_operand:SI 2 "general_operand" "g"))))]
        !           588:   ""
        !           589:   "bicw %2,%0")
        !           590: 
        !           591: (define_insn ""
        !           592:   [(set (match_operand:SI 0 "register_operand" "=r")
        !           593:        (and:SI (not:SI (match_operand:SI 1 "general_operand" "g"))
        !           594:                (match_operand:SI 2 "register_operand" "0")))]
        !           595:   ""
        !           596:   "bicw %1,%0")
        !           597: 
        !           598: (define_insn "iorsi3"
        !           599:   [(set (match_operand:SI 0 "register_operand" "=r")
        !           600:        (ior:SI (match_operand:SI 1 "register_operand" "%0")
        !           601:                (match_operand:SI 2 "general_operand" "g")))]
        !           602:   ""
        !           603:   "orw %2,%0")
        !           604: 
        !           605: (define_insn "xorsi3"
        !           606:   [(set (match_operand:SI 0 "register_operand" "=r")
        !           607:        (xor:SI (match_operand:SI 1 "register_operand" "%0")
        !           608:                (match_operand:SI 2 "general_operand" "g")))]
        !           609:   ""
        !           610:   "xorw %2,%0")
        !           611: 
        !           612: ; Some patterns using De Morgan law.
        !           613: ;
        !           614: ;(define_insn ""
        !           615: ;  [(set (match_operand:SI 0 "register_operand" "=r")
        !           616: ;      (not:SI (and:SI (not:SI (match_operand:SI 1 "register_operand" "%0"))
        !           617: ;                      (not:SI (match_operand:SI 2 "general_operand" "g")))))]
        !           618: ;  ""
        !           619: ;  "orw %2,%0")
        !           620: ;
        !           621: ;(define_insn ""
        !           622: ;  [(set (match_operand:SI 0 "register_operand" "=r")
        !           623: ;      (not:SI (ior:SI (not:SI (match_operand:SI 1 "register_operand" "%0"))
        !           624: ;                      (not:SI (match_operand:SI 2 "general_operand" "g")))))]
        !           625: ;  ""
        !           626: ;  "andw %2,%0")
        !           627: ;
        !           628: ;(define_insn ""
        !           629: ;  [(set (match_operand:SI 0 "register_operand" "=r")
        !           630: ;      (not:SI (and:SI (not:SI (match_operand:SI 1 "register_operand" "0"))
        !           631: ;                      (match_operand:SI 2 "immediate_operand" "n"))))]
        !           632: ;  ""
        !           633: ;  "*
        !           634: ;  operands[2] = gen_rtx (CONST_INT, VOIDmode, ~INTVAL (operands[2]));
        !           635: ;  return \"orw %2,%0\";
        !           636: ;")
        !           637: ;
        !           638: ;(define_insn ""
        !           639: ;  [(set (match_operand:SI 0 "register_operand" "=r")
        !           640: ;      (not:SI (ior:SI (not:SI (match_operand:SI 1 "register_operand" "0"))
        !           641: ;                      (match_operand:SI 2 "immediate_operand" "n"))))]
        !           642: ;  ""
        !           643: ;  "*
        !           644: ;  operands[2] = gen_rtx (CONST_INT, VOIDmode, ~INTVAL (operands[2]));
        !           645: ;  return \"andw %2,%0\";
        !           646: ;")
        !           647: 
        !           648: (define_insn "ashlsi3"
        !           649:   [(set (match_operand:SI 0 "register_operand" "=r")
        !           650:        (ashift:SI (match_operand:SI 1 "register_operand" "0")
        !           651:                   (match_operand:SI 2 "general_operand" "rnm")))]
        !           652:   ""
        !           653:   "*
        !           654: {
        !           655:   if (GET_CODE (operands[2]) == CONST_INT)
        !           656:     {
        !           657:       int cnt = INTVAL (operands[2]) % 32;
        !           658:       if (cnt == 0)
        !           659:          return \"\";
        !           660:       operands[2] = gen_rtx (CONST_INT, VOIDmode, cnt);
        !           661:     }
        !           662:   /* Use lshlw, not ashlw, since arithmetic shifts work strangely on pyr.  */
        !           663:   return \"lshlw %2,%0\";
        !           664: }")
        !           665: 
        !           666: ; The arithmetic left shift instructions work strange on pyramids.
        !           667: ; They fail to modify the sign bit.
        !           668: ;(define_insn "ashldi3"
        !           669: ;  [(set (match_operand:DI 0 "register_operand" "=r")
        !           670: ;      (ashift:DI (match_operand:DI 1 "register_operand" "0")
        !           671: ;                 (match_operand:SI 2 "general_operand" "rnm")))]
        !           672: ;  ""
        !           673: ;  "*
        !           674: ;{
        !           675: ;  if (GET_CODE (operands[2]) == CONST_INT)
        !           676: ;    {
        !           677: ;      int cnt = INTVAL (operands[2]) % 64;
        !           678: ;      if (cnt == 0)
        !           679: ;        return \"\";
        !           680: ;      operands[2] = gen_rtx (CONST_INT, VOIDmode, cnt);
        !           681: ;    }
        !           682: ;  return \"ashll %2,%0\";
        !           683: ;}")
        !           684: 
        !           685: (define_insn "ashrsi3"
        !           686:   [(set (match_operand:SI 0 "register_operand" "=r")
        !           687:        (ashiftrt:SI (match_operand:SI 1 "register_operand" "0")
        !           688:                     (match_operand:SI 2 "general_operand" "rnm")))]
        !           689:   ""
        !           690:   "*
        !           691: {
        !           692:   if (GET_CODE (operands[2]) == CONST_INT)
        !           693:     {
        !           694:       int cnt = INTVAL (operands[2]) % 32;
        !           695:       if (cnt == 0)
        !           696:          return \"\";
        !           697:       operands[2] = gen_rtx (CONST_INT, VOIDmode, cnt);
        !           698:     }
        !           699:   return \"ashrw %2,%0\";
        !           700: }")
        !           701: 
        !           702: (define_insn "ashrdi3"
        !           703:   [(set (match_operand:DI 0 "register_operand" "=r")
        !           704:        (ashiftrt:DI (match_operand:DI 1 "register_operand" "0")
        !           705:                     (match_operand:SI 2 "general_operand" "rnm")))]
        !           706:   ""
        !           707:   "*
        !           708: {
        !           709:   if (GET_CODE (operands[2]) == CONST_INT)
        !           710:     {
        !           711:       int cnt = INTVAL (operands[2]) % 64;
        !           712:       if (cnt == 0)
        !           713:        return \"\";
        !           714:       operands[2] = gen_rtx (CONST_INT, VOIDmode, cnt);
        !           715:     }
        !           716:   return \"ashrl %2,%0\";
        !           717: }")
        !           718: 
        !           719: (define_insn "lshrsi3"
        !           720:   [(set (match_operand:SI 0 "register_operand" "=r")
        !           721:        (lshiftrt:SI (match_operand:SI 1 "register_operand" "0")
        !           722:                     (match_operand:SI 2 "general_operand" "rnm")))]
        !           723:   ""
        !           724:   "*
        !           725: {
        !           726:   if (GET_CODE (operands[2]) == CONST_INT)
        !           727:     {
        !           728:       int cnt = INTVAL (operands[2]) % 32;
        !           729:       if (cnt == 0)
        !           730:          return \"\";
        !           731:       operands[2] = gen_rtx (CONST_INT, VOIDmode, cnt);
        !           732:     }
        !           733:   return \"lshrw %2,%0\";
        !           734: }")
        !           735: 
        !           736: (define_insn "rotlsi3"
        !           737:   [(set (match_operand:SI 0 "register_operand" "=r")
        !           738:        (rotate:SI (match_operand:SI 1 "register_operand" "0")
        !           739:                   (match_operand:SI 2 "general_operand" "rnm")))]
        !           740:   ""
        !           741:   "*
        !           742: {
        !           743:   if (GET_CODE (operands[2]) == CONST_INT)
        !           744:     {
        !           745:       int cnt = INTVAL (operands[2]) % 32;
        !           746:       if (cnt == 0)
        !           747:          return \"\";
        !           748:       operands[2] = gen_rtx (CONST_INT, VOIDmode, cnt);
        !           749:     }
        !           750:   return \"rotlw %2,%0\";
        !           751: }")
        !           752: 
        !           753: (define_insn "rotrsi3"
        !           754:   [(set (match_operand:SI 0 "register_operand" "=r")
        !           755:        (rotatert:SI (match_operand:SI 1 "register_operand" "0")
        !           756:                     (match_operand:SI 2 "general_operand" "rnm")))]
        !           757:   ""
        !           758:   "*
        !           759: {
        !           760:   if (GET_CODE (operands[2]) == CONST_INT)
        !           761:     {
        !           762:       int cnt = INTVAL (operands[2]) % 32;
        !           763:       if (cnt == 0)
        !           764:          return \"\";
        !           765:       operands[2] = gen_rtx (CONST_INT, VOIDmode, cnt);
        !           766:     }
        !           767:   return \"rotrw %2,%0\";
        !           768: }")
        !           769: 
        !           770: ;______________________________________________________________________
        !           771: ;
        !           772: ;      Fixed and Floating Moves.
        !           773: ;______________________________________________________________________
        !           774: 
        !           775: ;; If the destination is a memory address, indexed source operands are
        !           776: ;; disallowed.  Big DImode constants are always loaded into a reg pair,
        !           777: ;; although offsetable memory addresses really could be dealt with.
        !           778: 
        !           779: (define_insn ""
        !           780:   [(set (match_operand:DI 0 "memory_operand" "=m")
        !           781:        (match_operand:DI 1 "nonindexed_operand" "gF"))]
        !           782:   "(GET_CODE (operands[1]) == CONST_DOUBLE
        !           783:     ? CONST_DOUBLE_HIGH (operands[1]) == 0
        !           784:     : 1)"
        !           785:   "*
        !           786: {
        !           787:   CC_STATUS_INIT;
        !           788:   if (GET_CODE (operands[1]) == CONST_DOUBLE)
        !           789:     operands[1] = gen_rtx (CONST_INT, VOIDmode,
        !           790:                                      CONST_DOUBLE_LOW (operands[1]));
        !           791:   return \"movl %1,%0\";
        !           792: }")
        !           793: 
        !           794: ;; Force the destination to a register, so all source operands are allowed.
        !           795: 
        !           796: (define_insn "movdi"
        !           797:   [(set (match_operand:DI 0 "general_operand" "=r")
        !           798:        (match_operand:DI 1 "general_operand" "gF"))]
        !           799:   ""
        !           800:   "* return output_move_double (operands); ")
        !           801: 
        !           802: ;; If the destination is a memory address, indexed operands are disallowed.
        !           803: 
        !           804: (define_insn ""
        !           805:   [(set (match_operand:SI 0 "memory_operand" "=m")
        !           806:        (match_operand:SI 1 "nonindexed_operand" "g"))]
        !           807:   ""
        !           808:   "*
        !           809: {
        !           810:   CC_STATUS_INIT;
        !           811:   return \"movw %1,%0\";
        !           812: }")
        !           813: 
        !           814: ;; Force the destination to a register, so all source operands are allowed.
        !           815: 
        !           816: (define_insn "movsi"
        !           817:   [(set (match_operand:SI 0 "general_operand" "=r")
        !           818:        (match_operand:SI 1 "general_operand" "g"))]
        !           819:   ""
        !           820:   "*
        !           821: {
        !           822:   CC_STATUS_INIT;
        !           823:   return \"movw %1,%0\";
        !           824: }")
        !           825: 
        !           826: ;; If the destination is a memory address, indexed operands are disallowed.
        !           827: 
        !           828: (define_insn ""
        !           829:   [(set (match_operand:HI 0 "memory_operand" "=m")
        !           830:        (match_operand:HI 1 "nonindexed_operand" "g"))]
        !           831:   ""
        !           832:   "*
        !           833: {
        !           834:   if (REG_P (operands[1]))
        !           835:     return \"cvtwh %1,%0\";            /* reg -> mem */
        !           836:   else
        !           837:     {
        !           838:       CC_STATUS_INIT;
        !           839:       return \"movh %1,%0\";           /* mem imm -> mem */
        !           840:     }
        !           841: }")
        !           842: 
        !           843: ;; Force the destination to a register, so all source operands are allowed.
        !           844: 
        !           845: (define_insn "movhi"
        !           846:   [(set (match_operand:HI 0 "general_operand" "=r")
        !           847:        (match_operand:HI 1 "general_operand" "g"))]
        !           848:   ""
        !           849:   "*
        !           850: {
        !           851:   if (GET_CODE (operands[1]) != MEM)
        !           852:     {
        !           853:       CC_STATUS_INIT;
        !           854:       return \"movw %1,%0\";
        !           855:     }
        !           856:   return \"cvthw %1,%0\";
        !           857: }")
        !           858: 
        !           859: ;; If the destination is a memory address, indexed operands are disallowed.
        !           860: 
        !           861: (define_insn ""
        !           862:   [(set (match_operand:QI 0 "memory_operand" "=m")
        !           863:        (match_operand:QI 1 "nonindexed_operand" "g"))]
        !           864:   ""
        !           865:   "*
        !           866: {
        !           867:   if (REG_P (operands[1]))
        !           868:     return \"cvtwb %1,%0\";            /* reg -> mem */
        !           869:   else
        !           870:     {
        !           871:       CC_STATUS_INIT;
        !           872:       return \"movb %1,%0\";           /* mem imm -> mem */
        !           873:     }
        !           874: }")
        !           875: 
        !           876: ;; Force the destination to a register, so all source operands are allowed.
        !           877: 
        !           878: (define_insn "movqi"
        !           879:   [(set (match_operand:QI 0 "general_operand" "=r")
        !           880:        (match_operand:QI 1 "general_operand" "g"))]
        !           881:   ""
        !           882:   "*
        !           883: {
        !           884:   if (GET_CODE (operands[1]) != MEM)
        !           885:     {
        !           886:       CC_STATUS_INIT;
        !           887:       return \"movw %1,%0\";
        !           888:     }
        !           889:   return \"cvtbw %1,%0\";
        !           890: }")
        !           891: 
        !           892: ;; If the destination is a memory address, indexed operands are disallowed, and
        !           893: ;; so are immediate operands.  (Constants are always loaded into a reg pair,
        !           894: ;; although offsetable memory addresses really doesn't need that.)
        !           895: 
        !           896: (define_insn ""
        !           897:   [(set (match_operand:DF 0 "memory_operand" "=m")
        !           898:        (match_operand:DF 1 "nonindexed_operand" "g"))]
        !           899:   "GET_CODE (operands[1]) != CONST_DOUBLE"
        !           900:   "*
        !           901: {
        !           902:   CC_STATUS_INIT;
        !           903:   return \"movl %1,%0\";
        !           904: }")
        !           905: 
        !           906: ;; Force the destination to a register, so all source operands are allowed.
        !           907: 
        !           908: (define_insn "movdf"
        !           909:   [(set (match_operand:DF 0 "general_operand" "=r")
        !           910:        (match_operand:DF 1 "general_operand" "gF"))]
        !           911:   ""
        !           912:   "* return output_move_double (operands); ")
        !           913: 
        !           914: ;; If the destination is a memory address, indexed operands are disallowed.
        !           915: 
        !           916: (define_insn ""
        !           917:   [(set (match_operand:SF 0 "memory_operand" "=m")
        !           918:        (match_operand:SF 1 "nonindexed_operand" "g"))]
        !           919:   ""
        !           920:   "*
        !           921: {
        !           922:   CC_STATUS_INIT;
        !           923:   return \"movw %1,%0\";
        !           924: }")
        !           925: 
        !           926: ;; Force the destination to a register, so all source operands are allowed.
        !           927: 
        !           928: (define_insn "movsf"
        !           929:   [(set (match_operand:SF 0 "general_operand" "=r")
        !           930:        (match_operand:SF 1 "general_operand" "g"))]
        !           931:   ""
        !           932:   "*
        !           933: {
        !           934:   CC_STATUS_INIT;
        !           935:   return \"movw %1,%0\";
        !           936: }")
        !           937: 
        !           938: (define_insn ""
        !           939:   [(set (match_operand:SI 0 "register_operand" "=r")
        !           940:        (match_operand:QI 1 "address_operand" "p"))]
        !           941:   ""
        !           942:   "*
        !           943:   CC_STATUS_INIT;
        !           944:   return \"mova %a1,%0\";
        !           945: ")
        !           946: 
        !           947: ;______________________________________________________________________
        !           948: ;
        !           949: ;      Conversion patterns.
        !           950: ;______________________________________________________________________
        !           951: 
        !           952: ;; The trunc patterns are used only when non compile-time constants are used.
        !           953: 
        !           954: (define_insn "truncsiqi2"
        !           955:   [(set (match_operand:QI 0 "general_operand" "=r,m")
        !           956:        (truncate:QI (match_operand:SI 1 "nonimmediate_operand" "rm,r")))]
        !           957:   ""
        !           958:   "*
        !           959: {
        !           960:   CC_STATUS_INIT;
        !           961:   if (REGNO (operands[0]) == REGNO (operands[1]))
        !           962:     return \"\";
        !           963:   else
        !           964:     return \"movw %1,%0\";
        !           965: }")
        !           966: 
        !           967: (define_insn "truncsihi2"
        !           968:   [(set (match_operand:HI 0 "general_operand" "=r,m")
        !           969:        (truncate:HI (match_operand:SI 1 "nonimmediate_operand" "rm,r")))]
        !           970:   ""
        !           971:   "*
        !           972: {
        !           973:   CC_STATUS_INIT;
        !           974:   if (REGNO (operands[0]) == REGNO (operands[1]))
        !           975:     return \"\";
        !           976:   else
        !           977:     return \"movw %1,%0\";
        !           978: }")
        !           979: 
        !           980: (define_insn "extendhisi2"
        !           981:   [(set (match_operand:SI 0 "general_operand" "=r,m")
        !           982:        (sign_extend:SI (match_operand:HI 1 "nonimmediate_operand" "rm,r")))]
        !           983:   ""
        !           984:   "*
        !           985: {
        !           986:   extern int optimize;
        !           987:   if (optimize && REG_P (operands[0]) && REG_P (operands[1])
        !           988:       && REGNO (operands[0]) == REGNO (operands[1])
        !           989:       && already_sign_extended (insn, HImode, operands[0]))
        !           990:     {
        !           991:       CC_STATUS_INIT;
        !           992:       return \"\";
        !           993:     }
        !           994:   return \"cvthw %1,%0\";
        !           995: }")
        !           996: 
        !           997: (define_insn "extendqisi2"
        !           998:   [(set (match_operand:SI 0 "general_operand" "=r,m")
        !           999:        (sign_extend:SI (match_operand:QI 1 "nonimmediate_operand" "rm,r")))]
        !          1000:   ""
        !          1001:   "*
        !          1002: {
        !          1003:   extern int optimize;
        !          1004:   if (optimize && REG_P (operands[0]) && REG_P (operands[1])
        !          1005:       && REGNO (operands[0]) == REGNO (operands[1])
        !          1006:       && already_sign_extended (insn, QImode, operands[0]))
        !          1007:     {
        !          1008:       CC_STATUS_INIT;
        !          1009:       return \"\";
        !          1010:     }
        !          1011:   return \"cvtbw %1,%0\";
        !          1012: }")
        !          1013: 
        !          1014: ; Pyramid doesn't have insns *called* "cvtbh" or "movzbh".
        !          1015: ; But we can cvtbw/movzbw into a register, where there is no distinction
        !          1016: ; between words and halfwords.
        !          1017: (define_insn "extendqihi2"
        !          1018:   [(set (match_operand:HI 0 "register_operand" "=r")
        !          1019:        (sign_extend:HI (match_operand:QI 1 "nonimmediate_operand" "rm")))]
        !          1020:   ""
        !          1021:   "cvtbw %1,%0")
        !          1022: 
        !          1023: (define_insn "zero_extendhisi2"
        !          1024:   [(set (match_operand:SI 0 "register_operand" "=r")
        !          1025:        (zero_extend:SI (match_operand:HI 1 "nonimmediate_operand" "rm")))]
        !          1026:   ""
        !          1027:   "*
        !          1028: {
        !          1029:   CC_STATUS_INIT;
        !          1030:   return \"movzhw %1,%0\";
        !          1031: }")
        !          1032: 
        !          1033: (define_insn "zero_extendqisi2"
        !          1034:   [(set (match_operand:SI 0 "register_operand" "=r")
        !          1035:        (zero_extend:SI (match_operand:QI 1 "nonimmediate_operand" "rm")))]
        !          1036:   ""
        !          1037:   "*
        !          1038: {
        !          1039:   CC_STATUS_INIT;
        !          1040:   return \"movzbw %1,%0\";
        !          1041: }")
        !          1042: 
        !          1043: (define_insn "zero_extendqihi2"
        !          1044:   [(set (match_operand:HI 0 "register_operand" "=r")
        !          1045:        (zero_extend:HI (match_operand:QI 1 "nonimmediate_operand" "rm")))]
        !          1046:   ""
        !          1047:   "*
        !          1048: {
        !          1049:   CC_STATUS_INIT;
        !          1050:   return \"movzbw %1,%0\";
        !          1051: }")
        !          1052: 
        !          1053: (define_insn "extendsfdf2"
        !          1054:   [(set (match_operand:DF 0 "general_operand" "=r,m")
        !          1055:        (float_extend:DF (match_operand:SF 1 "nonimmediate_operand" "rm,r")))]
        !          1056:   ""
        !          1057:   "cvtfd %1,%0")
        !          1058: 
        !          1059: (define_insn "truncdfsf2"
        !          1060:   [(set (match_operand:SF 0 "general_operand" "=r,m")
        !          1061:        (float_truncate:SF (match_operand:DF 1 "nonimmediate_operand" "rm,r")))]
        !          1062:   ""
        !          1063:   "cvtdf %1,%0")
        !          1064: 
        !          1065: ;;----------------------------------------------------------------------------
        !          1066: ;;
        !          1067: ;; Fix-to-Float and Float-to-Fix Conversion Patterns.
        !          1068: ;;
        !          1069: ;; Note that the ones that start with SImode come first.
        !          1070: ;; That is so that an operand that is a CONST_INT
        !          1071: ;; (and therefore lacks a specific machine mode).
        !          1072: ;; will be recognized as SImode (which is always valid)
        !          1073: ;; rather than as QImode or HImode.
        !          1074: ;;
        !          1075: ;;----------------------------------------------------------------------------
        !          1076: 
        !          1077: (define_insn "floatsisf2"
        !          1078:   [(set (match_operand:SF 0 "general_operand" "=r,m")
        !          1079:        (float:SF (match_operand:SI 1 "nonimmediate_operand" "rm,r")))]
        !          1080:   ""
        !          1081:   "cvtwf %1,%0")
        !          1082: 
        !          1083: (define_insn "floatsidf2"
        !          1084:   [(set (match_operand:DF 0 "general_operand" "=r,m")
        !          1085:        (float:DF (match_operand:SI 1 "nonimmediate_operand" "rm,r")))]
        !          1086:   ""
        !          1087:   "cvtwd %1,%0")
        !          1088: 
        !          1089: (define_insn "fix_truncsfsi2"
        !          1090:   [(set (match_operand:SI 0 "general_operand" "=r,m")
        !          1091:        (fix:SI (fix:SF (match_operand:SF 1 "nonimmediate_operand" "rm,r"))))]
        !          1092:   ""
        !          1093:   "cvtfw %1,%0")
        !          1094: 
        !          1095: (define_insn "fix_truncdfsi2"
        !          1096:   [(set (match_operand:SI 0 "general_operand" "=r,m")
        !          1097:        (fix:SI (fix:DF (match_operand:DF 1 "nonimmediate_operand" "rm,r"))))]
        !          1098:   ""
        !          1099:   "cvtdw %1,%0")
        !          1100: 
        !          1101: ;______________________________________________________________________
        !          1102: ;
        !          1103: ;      Flow Control Patterns.
        !          1104: ;______________________________________________________________________
        !          1105: 
        !          1106: ;; Prefer "br" to "jump" for unconditional jumps, since it's faster.
        !          1107: ;; (The assembler can manage with out-of-range branches.)
        !          1108: 
        !          1109: (define_insn "jump"
        !          1110:   [(set (pc)
        !          1111:        (label_ref (match_operand 0 "" "")))]
        !          1112:   ""
        !          1113:   "br %l0")
        !          1114: 
        !          1115: (define_insn ""
        !          1116:   [(set (pc)
        !          1117:        (if_then_else (match_operator 0 "relop" [(cc0) (const_int 0)])
        !          1118:                      (label_ref (match_operand 1 "" ""))
        !          1119:                      (pc)))]
        !          1120:   ""
        !          1121:   "b%N0 %l1")
        !          1122: 
        !          1123: (define_insn ""
        !          1124:   [(set (pc)
        !          1125:        (if_then_else (match_operator 0 "relop" [(cc0) (const_int 0)])
        !          1126:                      (pc)
        !          1127:                      (label_ref (match_operand 1 "" ""))))]
        !          1128:   ""
        !          1129:   "b%C0 %l1")
        !          1130: 
        !          1131: (define_insn "call"
        !          1132:   [(call (match_operand:QI 0 "memory_operand" "m")
        !          1133:         (match_operand:QI 1 "immediate_operand" "n"))]
        !          1134:   ""
        !          1135:   "call %0")
        !          1136: 
        !          1137: (define_insn "call_value"
        !          1138:   [(set (match_operand 0 "" "=r")
        !          1139:        (call (match_operand:QI 1 "memory_operand" "m")
        !          1140:              (match_operand:SI 2 "immediate_operand" "n")))]
        !          1141:   ;; Operand 2 not really used on Pyramid architecture.
        !          1142:   ""
        !          1143:   "call %1")
        !          1144: 
        !          1145: (define_insn ""
        !          1146:   [(return)]
        !          1147:   ""
        !          1148:   "ret")
        !          1149: 
        !          1150: (define_insn "tablejump"
        !          1151:   [(set (pc) (match_operand:SI 0 "register_operand" "r"))
        !          1152:    (use (label_ref (match_operand 1 "" "")))]
        !          1153:   ""
        !          1154:   "jump (%0)")
        !          1155: 
        !          1156: ;______________________________________________________________________
        !          1157: ;
        !          1158: ;      Peep-hole Optimization Patterns.
        !          1159: ;______________________________________________________________________
        !          1160: 
        !          1161: ;; Optimize fullword move followed by a test of the moved value.
        !          1162: 
        !          1163: ;(define_peephole
        !          1164: ;  [(set (match_operand:SI 0 "register_operand" "=r")
        !          1165: ;      (match_operand:SI 1 "nonimmediate_operand" "rm"))
        !          1166: ;   (set (cc0) (match_operand:SI 2 "nonimmediate_operand" "rm"))]
        !          1167: ;  "rtx_equal_p (operands[2], operands[0])
        !          1168: ;   || rtx_equal_p (operands[2], operands[1])"
        !          1169: ;  "mtstw %1,%0")
        !          1170: ;
        !          1171: ;;; Optimize loops with a incremented/decremented variable.
        !          1172: ;
        !          1173: ;(define_peephole
        !          1174: ;  [(set (match_operand:SI 0 "register_operand" "=r")
        !          1175: ;      (plus:SI (match_dup 0)
        !          1176: ;               (const_int -1)))
        !          1177: ;   (set (cc0)
        !          1178: ;      (compare (match_operand:SI 1 "register_operand" "r")
        !          1179: ;               (match_operand:SI 2 "nonmemory_operand" "ri")))
        !          1180: ;   (set (pc)
        !          1181: ;      (if_then_else (match_operator:SI 3 "signed_comparison"
        !          1182: ;                       [(cc0) (const_int 0)])
        !          1183: ;                    (label_ref (match_operand 4 "" ""))
        !          1184: ;                    (pc)))]
        !          1185: ;  "rtx_equal_p (operands[0], operands[1])
        !          1186: ;     || rtx_equal_p (operands[0], operands[2])"
        !          1187: ;  "*
        !          1188: ;  if (rtx_equal_p (operands[0], operands[1]))
        !          1189: ;    {
        !          1190: ;      output_asm_insn (\"dcmpw %2,%0\", operands);
        !          1191: ;      return output_branch (GET_CODE (operands[3]));
        !          1192: ;    }
        !          1193: ;  else
        !          1194: ;    {
        !          1195: ;      output_asm_insn (\"dcmpw %1,%0\", operands);
        !          1196: ;      return output_inv_branch (GET_CODE (operands[3]));
        !          1197: ;    }
        !          1198: ;")
        !          1199: ;
        !          1200: ;(define_peephole
        !          1201: ;  [(set (match_operand:SI 0 "register_operand" "=r")
        !          1202: ;      (plus:SI (match_dup 0)
        !          1203: ;               (const_int 1)))
        !          1204: ;   (set (cc0)
        !          1205: ;      (compare (match_operand:SI 1 "register_operand" "r")
        !          1206: ;               (match_operand:SI 2 "nonmemory_operand" "ri")))
        !          1207: ;   (set (pc)
        !          1208: ;      (if_then_else (match_operator:SI 3 "signed_comparison"
        !          1209: ;                       [(cc0) (const_int 0)])
        !          1210: ;                    (label_ref (match_operand 4 "" ""))
        !          1211: ;                    (pc)))]
        !          1212: ;  "rtx_equal_p (operands[0], operands[1])
        !          1213: ;     || rtx_equal_p (operands[0], operands[2])"
        !          1214: ;  "*
        !          1215: ;  if (rtx_equal_p (operands[0], operands[1]))
        !          1216: ;    {
        !          1217: ;      output_asm_insn (\"icmpw %2,%0\", operands);
        !          1218: ;      return output_branch (GET_CODE (operands[3]));
        !          1219: ;    }
        !          1220: ;  else
        !          1221: ;    {
        !          1222: ;      output_asm_insn (\"icmpw %1,%0\", operands);
        !          1223: ;      return output_inv_branch (GET_CODE (operands[3]));
        !          1224: ;    }
        !          1225: ;")
        !          1226: ;
        !          1227: ;(define_peephole
        !          1228: ;  [(set (match_operand:SI 0 "register_operand" "=r")
        !          1229: ;      (plus:SI (match_dup 0) (const_int -1)))
        !          1230: ;   (set (cc0) (match_dup 0))
        !          1231: ;   (set (pc) (if_then_else (match_operator:SI 1 "signed_comparison"
        !          1232: ;                                            [(cc0) (const_int 0)])
        !          1233: ;                         (label_ref (match_operand 4 "" ""))
        !          1234: ;                         (pc)))]
        !          1235: ;  ""
        !          1236: ;  "*
        !          1237: ;    output_asm_insn (\"dcmpw $0,%0\", operands);
        !          1238: ;    return output_branch (GET_CODE (operands[1]));
        !          1239: ;")
        !          1240: ;
        !          1241: ;(define_peephole
        !          1242: ;  [(set (match_operand:SI 0 "register_operand" "=r")
        !          1243: ;      (plus:SI (match_dup 0) (const_int 1)))
        !          1244: ;   (set (cc0) (match_dup 0))
        !          1245: ;   (set (pc) (if_then_else (match_operator:SI 1 "signed_comparison"
        !          1246: ;                                            [(cc0) (const_int 0)])
        !          1247: ;                         (label_ref (match_operand 4 "" ""))
        !          1248: ;                         (pc)))]
        !          1249: ;  ""
        !          1250: ;  "*
        !          1251: ;    output_asm_insn (\"icmpw $0,%0\", operands);
        !          1252: ;    return output_branch (GET_CODE (operands[1]));
        !          1253: ;")
        !          1254: ;
        !          1255: ;;; Combine word moves with consequtive operands into a long move.
        !          1256: ;;; Also combines immediate moves, if the high-order destination operand
        !          1257: ;;; is loaded with zero.
        !          1258: ;
        !          1259: ;(define_peephole
        !          1260: ;  [(set (match_operand:SI 0 "general_operand" "=g")
        !          1261: ;      (match_operand:SI 1 "general_operand" "g"))
        !          1262: ;   (set (match_operand:SI 2 "general_operand" "=g")
        !          1263: ;      (match_operand:SI 3 "general_operand" "g"))]
        !          1264: ;  "movdi_possible (operands)"
        !          1265: ;  "*
        !          1266: ;  CC_STATUS_INIT;
        !          1267: ;  movdi_possible (operands);
        !          1268: ;  if (CONSTANT_P (operands[1]))
        !          1269: ;    /* Also operand 3 is guarranteed to be CONSTANT by movdi_possible.  */
        !          1270: ;    return (swap_operands) ? \"movl %3,%0\" : \"movl %1,%2\";
        !          1271: ;
        !          1272: ;  return (swap_operands) ? \"movl %1,%0\" : \"movl %3,%2\";
        !          1273: ;")
        !          1274: ;
        !          1275: ;;; Optimize certain tests after memory stores.
        !          1276: ;
        !          1277: ;(define_peephole
        !          1278: ;  [(set (match_operand 0 "memory_operand" "=m")
        !          1279: ;      (match_operand 1 "register_operand" "r"))
        !          1280: ;   (set (match_operand:SI 2 "register_operand" "=r")
        !          1281: ;      (sign_extend:SI (match_dup 1)))
        !          1282: ;   (set (cc0)
        !          1283: ;      (match_dup 2))]
        !          1284: ;  "dead_or_set_p (insn, operands[2])"
        !          1285: ;  "*
        !          1286: ;  if (GET_MODE (operands[0]) == QImode)
        !          1287: ;    return \"cvtwb %1,%0\";
        !          1288: ;  else
        !          1289: ;    return \"cvtwh %1,%0\";
        !          1290: ;")
        !          1291: 
        !          1292: ;______________________________________________________________________
        !          1293: ;
        !          1294: ;      DImode Patterns.
        !          1295: ;______________________________________________________________________
        !          1296: 
        !          1297: (define_expand "extendsidi2"
        !          1298:   [(set (subreg:SI (match_operand:DI 0 "register_operand" "=r") 1)
        !          1299:        (match_operand:SI 1 "register_operand" "r"))
        !          1300:    (set (subreg:SI (match_dup 0) 0)
        !          1301:        (subreg:SI (match_dup 0) 1))
        !          1302:    (set (subreg:SI (match_dup 0) 0)
        !          1303:        (ashiftrt:SI (subreg:SI (match_dup 0) 0)
        !          1304:                     (const_int 31)))]
        !          1305:   ""
        !          1306:   "")
        !          1307: 
        !          1308: ;; I need to debug these.
        !          1309: 
        !          1310: ;(define_expand "cmpdi"
        !          1311: ;  [(set (cc0)
        !          1312: ;      (compare (subreg:SI (match_operand:DI 0 "register_operand" "r") 0)
        !          1313: ;               (subreg:SI (match_operand:DI 1 "register_operand" "r") 0)))
        !          1314: ;   (set (pc) (if_then_else (ne (cc0) (const_int 0))
        !          1315: ;                         (label_ref (match_dup 2))
        !          1316: ;                         (pc)))
        !          1317: ;   (set (cc0)
        !          1318: ;      (compare (subreg:SI (match_dup 0) 1)
        !          1319: ;               (subreg:SI (match_dup 1) 1)))
        !          1320: ;   (match_dup 2)]
        !          1321: ;  ""
        !          1322: ;  "operands[2] = gen_label_rtx ();")
        !          1323: ;
        !          1324: ;(define_expand "tstdi"
        !          1325: ;  [(set (cc0) (subreg:SI (match_operand:DI 0 "register_operand" "r") 0))
        !          1326: ;   (set (pc) (if_then_else (ne (cc0) (const_int 0))
        !          1327: ;                         (label_ref (match_dup 1))
        !          1328: ;                         (pc)))
        !          1329: ;   (set (cc0) (subreg:SI (match_dup 0) 1))
        !          1330: ;   (match_dup 1)]
        !          1331: ;  ""
        !          1332: ;  "operands[1] = gen_label_rtx ();")
        !          1333: 
        !          1334: (define_insn "adddi3"
        !          1335:   [(set (match_operand:DI 0 "register_operand" "=r")
        !          1336:        (plus:DI (match_operand:DI 1 "register_operand" "%0")
        !          1337:                 (match_operand:DI 2 "nonmemory_operand" "rF")))]
        !          1338:   ""
        !          1339:   "*
        !          1340: {
        !          1341:   rtx xoperands[2];
        !          1342:   CC_STATUS_INIT;
        !          1343:   xoperands[0] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1);
        !          1344:   if (REG_P (operands[2]))
        !          1345:     xoperands[1] = gen_rtx (REG, SImode, REGNO (operands[2]) + 1);
        !          1346:   else
        !          1347:     {
        !          1348:       xoperands[1] = gen_rtx (CONST_INT, VOIDmode,
        !          1349:                              CONST_DOUBLE_LOW (operands[2]));
        !          1350:       operands[2] = gen_rtx (CONST_INT, VOIDmode,
        !          1351:                             CONST_DOUBLE_HIGH (operands[2]));
        !          1352:     }
        !          1353:   output_asm_insn (\"addw %1,%0\", xoperands);
        !          1354:   return \"addwc %2,%0\";
        !          1355: }")
        !          1356: 
        !          1357: (define_insn "subdi3"
        !          1358:   [(set (match_operand:DI 0 "register_operand" "=r")
        !          1359:        (minus:DI (match_operand:DI 1 "register_operand" "0")
        !          1360:                  (match_operand:DI 2 "nonmemory_operand" "rF")))]
        !          1361:   ""
        !          1362:   "*
        !          1363: {
        !          1364:   rtx xoperands[2];
        !          1365:   CC_STATUS_INIT;
        !          1366:   xoperands[0] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1);
        !          1367:   if (REG_P (operands[2]))
        !          1368:     xoperands[1] = gen_rtx (REG, SImode, REGNO (operands[2]) + 1);
        !          1369:   else
        !          1370:     {
        !          1371:       xoperands[1] = gen_rtx (CONST_INT, VOIDmode,
        !          1372:                              CONST_DOUBLE_LOW (operands[2]));
        !          1373:       operands[2] = gen_rtx (CONST_INT, VOIDmode,
        !          1374:                             CONST_DOUBLE_HIGH (operands[2]));
        !          1375:     }
        !          1376:   output_asm_insn (\"subw %1,%0\", xoperands);
        !          1377:   return \"subwb %2,%0\";
        !          1378: }")
        !          1379: 
        !          1380: (define_insn "iordi3"
        !          1381:   [(set (match_operand:DI 0 "register_operand" "=r")
        !          1382:        (ior:DI (match_operand:DI 1 "register_operand" "%0")
        !          1383:                (match_operand:DI 2 "nonmemory_operand" "rF")))]
        !          1384:   ""
        !          1385:   "*
        !          1386: {
        !          1387:   rtx xoperands[2];
        !          1388:   CC_STATUS_INIT;
        !          1389:   xoperands[0] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1);
        !          1390:   if (REG_P (operands[2]))
        !          1391:     xoperands[1] = gen_rtx (REG, SImode, REGNO (operands[2]) + 1);
        !          1392:   else
        !          1393:     {
        !          1394:       xoperands[1] = gen_rtx (CONST_INT, VOIDmode,
        !          1395:                              CONST_DOUBLE_LOW (operands[2]));
        !          1396:       operands[2] = gen_rtx (CONST_INT, VOIDmode,
        !          1397:                             CONST_DOUBLE_HIGH (operands[2]));
        !          1398:     }
        !          1399:   output_asm_insn (\"orw %1,%0\", xoperands);
        !          1400:   return \"orw %2,%0\";
        !          1401: }")
        !          1402: 
        !          1403: (define_insn "anddi3"
        !          1404:   [(set (match_operand:DI 0 "register_operand" "=r")
        !          1405:        (and:DI (match_operand:DI 1 "register_operand" "%0")
        !          1406:                (match_operand:DI 2 "nonmemory_operand" "rF")))]
        !          1407:   ""
        !          1408:   "*
        !          1409: {
        !          1410:   rtx xoperands[2];
        !          1411:   CC_STATUS_INIT;
        !          1412:   xoperands[0] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1);
        !          1413:   if (REG_P (operands[2]))
        !          1414:     xoperands[1] = gen_rtx (REG, SImode, REGNO (operands[2]) + 1);
        !          1415:   else
        !          1416:     {
        !          1417:       xoperands[1] = gen_rtx (CONST_INT, VOIDmode,
        !          1418:                              CONST_DOUBLE_LOW (operands[2]));
        !          1419:       operands[2] = gen_rtx (CONST_INT, VOIDmode,
        !          1420:                             CONST_DOUBLE_HIGH (operands[2]));
        !          1421:     }
        !          1422:   output_asm_insn (\"andw %1,%0\", xoperands);
        !          1423:   return \"andw %2,%0\";
        !          1424: }")
        !          1425: 
        !          1426: (define_insn "xordi3"
        !          1427:   [(set (match_operand:DI 0 "register_operand" "=r")
        !          1428:        (xor:DI (match_operand:DI 1 "register_operand" "%0")
        !          1429:                (match_operand:DI 2 "nonmemory_operand" "rF")))]
        !          1430:   ""
        !          1431:   "*
        !          1432: {
        !          1433:   rtx xoperands[2];
        !          1434:   CC_STATUS_INIT;
        !          1435:   xoperands[0] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1);
        !          1436:   if (REG_P (operands[2]))
        !          1437:     xoperands[1] = gen_rtx (REG, SImode, REGNO (operands[2]) + 1);
        !          1438:   else
        !          1439:     {
        !          1440:       xoperands[1] = gen_rtx (CONST_INT, VOIDmode,
        !          1441:                              CONST_DOUBLE_LOW (operands[2]));
        !          1442:       operands[2] = gen_rtx (CONST_INT, VOIDmode,
        !          1443:                             CONST_DOUBLE_HIGH (operands[2]));
        !          1444:     }
        !          1445:   output_asm_insn (\"xorw %1,%0\", xoperands);
        !          1446:   return \"xorw %2,%0\";
        !          1447: }")
        !          1448: 
        !          1449: (define_insn "nop"
        !          1450:   [(const_int 0)]
        !          1451:   ""
        !          1452:   "movw gr0,gr0  # nop")
        !          1453: 
        !          1454: ;;- Local variables:
        !          1455: ;;- mode:emacs-lisp
        !          1456: ;;- comment-start: ";;- "
        !          1457: ;;- eval: (set-syntax-table (copy-sequence (syntax-table)))
        !          1458: ;;- eval: (modify-syntax-entry ?] ")[")
        !          1459: ;;- eval: (modify-syntax-entry ?{ "(}")
        !          1460: ;;- eval: (modify-syntax-entry ?} "){")
        !          1461: ;;- End:

unix.superglobalmegacorp.com

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