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

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

unix.superglobalmegacorp.com

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