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

unix.superglobalmegacorp.com

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