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

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

unix.superglobalmegacorp.com

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