Annotation of gcc/config/vax.md, revision 1.1.1.1

1.1       root        1: 
                      2: ;;- Machine description for GNU compiler
                      3: ;;- Vax Version
                      4: ;;   Copyright (C) 1987, 1988 Free Software Foundation, Inc.
                      5: 
                      6: ;; This file is part of GNU CC.
                      7: 
                      8: ;; GNU CC is free software; you can redistribute it and/or modify
                      9: ;; it under the terms of the GNU General Public License as published by
                     10: ;; the Free Software Foundation; either version 1, or (at your option)
                     11: ;; any later version.
                     12: 
                     13: ;; GNU CC is distributed in the hope that it will be useful,
                     14: ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
                     15: ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     16: ;; GNU General Public License for more details.
                     17: 
                     18: ;; You should have received a copy of the GNU General Public License
                     19: ;; along with GNU CC; see the file COPYING.  If not, write to
                     20: ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
                     21: 
                     22: 
                     23: ;;- Instruction patterns.  When multiple patterns apply,
                     24: ;;- the first one in the file is chosen.
                     25: ;;-
                     26: ;;- See file "rtl.def" for documentation on define_insn, match_*, et. al.
                     27: ;;-
                     28: ;;- cpp macro #define NOTICE_UPDATE_CC in file tm.h handles condition code
                     29: ;;- updates for most instructions.
                     30: 
                     31: ; tstsi is first test insn so that it is the one to match
                     32: ; a constant argument.
                     33: 
                     34: (define_insn "tstsi"
                     35:   [(set (cc0)
                     36:        (match_operand:SI 0 "general_operand" "g"))]
                     37:   ""
                     38:   "tstl %0")
                     39: 
                     40: (define_insn "tsthi"
                     41:   [(set (cc0)
                     42:        (match_operand:HI 0 "general_operand" "g"))]
                     43:   ""
                     44:   "tstw %0")
                     45: 
                     46: (define_insn "tstqi"
                     47:   [(set (cc0)
                     48:        (match_operand:QI 0 "general_operand" "g"))]
                     49:   ""
                     50:   "tstb %0")
                     51: 
                     52: (define_insn "tstdf"
                     53:   [(set (cc0)
                     54:        (match_operand:DF 0 "general_operand" "gF"))]
                     55:   ""
                     56:   "tst%# %0")
                     57: 
                     58: (define_insn "tstsf"
                     59:   [(set (cc0)
                     60:        (match_operand:SF 0 "general_operand" "gF"))]
                     61:   ""
                     62:   "tstf %0")
                     63: 
                     64: ;; Put cmpsi first among compare insns so it matches two CONST_INT operands.
                     65: 
                     66: (define_insn "cmpsi"
                     67:   [(set (cc0)
                     68:        (compare (match_operand:SI 0 "general_operand" "g")
                     69:                 (match_operand:SI 1 "general_operand" "g")))]
                     70:   ""
                     71:   "cmpl %0,%1")
                     72: 
                     73: (define_insn "cmphi"
                     74:   [(set (cc0)
                     75:        (compare (match_operand:HI 0 "general_operand" "g")
                     76:                 (match_operand:HI 1 "general_operand" "g")))]
                     77:   ""
                     78:   "cmpw %0,%1")
                     79: 
                     80: (define_insn "cmpqi"
                     81:   [(set (cc0)
                     82:        (compare (match_operand:QI 0 "general_operand" "g")
                     83:                 (match_operand:QI 1 "general_operand" "g")))]
                     84:   ""
                     85:   "cmpb %0,%1")
                     86: 
                     87: (define_insn "cmpdf"
                     88:   [(set (cc0)
                     89:        (compare (match_operand:DF 0 "general_operand" "gF")
                     90:                 (match_operand:DF 1 "general_operand" "gF")))]
                     91:   ""
                     92:   "cmp%# %0,%1")
                     93: 
                     94: (define_insn "cmpsf"
                     95:   [(set (cc0)
                     96:        (compare (match_operand:SF 0 "general_operand" "gF")
                     97:                 (match_operand:SF 1 "general_operand" "gF")))]
                     98:   ""
                     99:   "cmpf %0,%1")
                    100: 
                    101: (define_insn ""
                    102:   [(set (cc0)
                    103:        (and:SI (match_operand:SI 0 "general_operand" "g")
                    104:                (match_operand:SI 1 "general_operand" "g")))]
                    105:   ""
                    106:   "bitl %0,%1")
                    107: 
                    108: (define_insn ""
                    109:   [(set (cc0)
                    110:        (and:HI (match_operand:HI 0 "general_operand" "g")
                    111:                (match_operand:HI 1 "general_operand" "g")))]
                    112:   ""
                    113:   "bitw %0,%1")
                    114: 
                    115: (define_insn ""
                    116:   [(set (cc0)
                    117:        (and:QI (match_operand:QI 0 "general_operand" "g")
                    118:                (match_operand:QI 1 "general_operand" "g")))]
                    119:   ""
                    120:   "bitb %0,%1")
                    121: 
                    122: (define_insn "movdf"
                    123:   [(set (match_operand:DF 0 "general_operand" "=g")
                    124:        (match_operand:DF 1 "general_operand" "gF"))]
                    125:   ""
                    126:   "*
                    127: {
                    128:   if (operands[1] == dconst0_rtx)
                    129:     return \"clr%# %0\";
                    130:   return \"mov%# %1,%0\";
                    131: }")
                    132: 
                    133: (define_insn "movsf"
                    134:   [(set (match_operand:SF 0 "general_operand" "=g")
                    135:        (match_operand:SF 1 "general_operand" "gF"))]
                    136:   ""
                    137:   "*
                    138: {
                    139:   if (operands[1] == fconst0_rtx)
                    140:     return \"clrf %0\";
                    141:   return \"movf %1,%0\";
                    142: }")
                    143: 
                    144: ;; Some vaxes don't support this instruction.
                    145: ;;(define_insn "movti"
                    146: ;;  [(set (match_operand:TI 0 "general_operand" "=g")
                    147: ;;     (match_operand:TI 1 "general_operand" "g"))]
                    148: ;;  ""
                    149: ;;  "movh %1,%0")
                    150: 
                    151: (define_insn "movdi"
                    152:   [(set (match_operand:DI 0 "general_operand" "=g")
                    153:        (match_operand:DI 1 "general_operand" "g"))]
                    154:   ""
                    155:   "movq %1,%0")
                    156: 
                    157: (define_insn "movsi"
                    158:   [(set (match_operand:SI 0 "general_operand" "=g")
                    159:        (match_operand:SI 1 "general_operand" "g"))]
                    160:   ""
                    161:   "*
                    162: {
                    163:   rtx link;
                    164:   if (operands[1] == const1_rtx
                    165:       && (link = find_reg_note (insn, REG_WAS_0, 0))
                    166:       /* Make sure the insn that stored the 0 is still present.  */
                    167:       && ! XEXP (link, 0)->volatil
                    168:       && GET_CODE (XEXP (link, 0)) != NOTE
                    169:       /* Make sure cross jumping didn't happen here.  */
                    170:       && no_labels_between_p (XEXP (link, 0), insn))
                    171:     /* Fastest way to change a 0 to a 1.  */
                    172:     return \"incl %0\";
                    173:   if (GET_CODE (operands[1]) == SYMBOL_REF || GET_CODE (operands[1]) == CONST)
                    174:     {
                    175:       if (push_operand (operands[0], SImode))
                    176:        return \"pushab %a1\";
                    177:       return \"movab %a1,%0\";
                    178:     }
                    179:   /* this is slower than a movl, except when pushing an operand */
                    180:   if (operands[1] == const0_rtx)
                    181:     return \"clrl %0\";
                    182:   if (GET_CODE (operands[1]) == CONST_INT
                    183:       && (unsigned) INTVAL (operands[1]) >= 64)
                    184:     {
                    185:       int i = INTVAL (operands[1]);
                    186:       if ((unsigned)(~i) < 64)
                    187:        {
                    188:          operands[1] = gen_rtx (CONST_INT, VOIDmode, ~i);
                    189:          return \"mcoml %1,%0\";
                    190:        }
                    191:       if ((unsigned)i < 127)
                    192:        {
                    193:          operands[1] = gen_rtx (CONST_INT, VOIDmode, 63);
                    194:          operands[2] = gen_rtx (CONST_INT, VOIDmode, i-63);
                    195:          return \"addl3 %2,%1,%0\";
                    196:        }
                    197:       /* trading speed for space */
                    198:       if ((unsigned)i < 0x100)
                    199:        return \"movzbl %1,%0\";
                    200:       if (i >= -0x80 && i < 0)
                    201:        return \"cvtbl %1,%0\";
                    202:       if ((unsigned)i < 0x10000)
                    203:        return \"movzwl %1,%0\";
                    204:       if (i >= -0x8000 && i < 0)
                    205:        return \"cvtwl %1,%0\";
                    206:     }
                    207:   if (push_operand (operands[0], SImode))
                    208:     return \"pushl %1\";
                    209:   return \"movl %1,%0\";
                    210: }")
                    211: 
                    212: (define_insn "movhi"
                    213:   [(set (match_operand:HI 0 "general_operand" "=g")
                    214:        (match_operand:HI 1 "general_operand" "g"))]
                    215:   ""
                    216:   "*
                    217: {
                    218:   rtx link;
                    219:   if (operands[1] == const1_rtx
                    220:       && (link = find_reg_note (insn, REG_WAS_0, 0))
                    221:       /* Make sure the insn that stored the 0 is still present.  */
                    222:       && ! XEXP (link, 0)->volatil
                    223:       && GET_CODE (XEXP (link, 0)) != NOTE
                    224:       /* Make sure cross jumping didn't happen here.  */
                    225:       && no_labels_between_p (XEXP (link, 0), insn))
                    226:     /* Fastest way to change a 0 to a 1.  */
                    227:     return \"incw %0\";
                    228:   if (operands[1] == const0_rtx)
                    229:     return \"clrw %0\";
                    230:   if (GET_CODE (operands[1]) == CONST_INT
                    231:       && (unsigned) INTVAL (operands[1]) >= 64)
                    232:     {
                    233:       int i = INTVAL (operands[1]);
                    234:       if ((unsigned)((~i) & 0xffff) < 64)
                    235:        {
                    236:          operands[1] = gen_rtx (CONST_INT, VOIDmode, (~i) & 0xffff);
                    237:          return \"mcomw %1,%0\";
                    238:        }
                    239:       if ((unsigned)(i & 0xffff) < 127)
                    240:        {
                    241:           operands[1] = gen_rtx (CONST_INT, VOIDmode, 63);
                    242:           operands[2] = gen_rtx (CONST_INT, VOIDmode, (i-63) & 0xffff);
                    243:           return \"addw3 %2,%1,%0\";
                    244:        }
                    245:       /* this is a lot slower, and only saves 1 measly byte! */
                    246:       /* if ((unsigned)i < 0x100)
                    247:           return \"movzbw %1,%0\"; */
                    248:       /* if (i >= -0x80 && i < 0)
                    249:           return \"cvtbw %1,%0\"; */
                    250:     }
                    251:   return \"movw %1,%0\";
                    252: }")
                    253: 
                    254: (define_insn "movqi"
                    255:   [(set (match_operand:QI 0 "general_operand" "=g")
                    256:        (match_operand:QI 1 "general_operand" "g"))]
                    257:   ""
                    258:   "*
                    259: {
                    260:   if (operands[1] == const0_rtx)
                    261:     return \"clrb %0\";
                    262:   if (GET_CODE (operands[1]) == CONST_INT
                    263:       && (unsigned) INTVAL (operands[1]) >= 64)
                    264:     {
                    265:       int i = INTVAL (operands[1]);
                    266:       if ((unsigned)((~i) & 0xff) < 64)
                    267:        {
                    268:          operands[1] = gen_rtx (CONST_INT, VOIDmode, (~i) & 0xff);
                    269:          return \"mcomb %1,%0\";
                    270:        }
                    271: #if 0
                    272:       /* ASCII alphabetics */
                    273:       if (((unsigned) INTVAL (operands[1]) &0xff) < 127)
                    274:        {
                    275:          operands[1] = gen_rtx (CONST_INT, VOIDmode, 63);
                    276:          operands[2] = gen_rtx (CONST_INT, VOIDmode, i-63);
                    277:          return \"addb3 %2,%1,%0\";
                    278:        }
                    279: #endif
                    280:     }
                    281:   return \"movb %1,%0\";
                    282: }")
                    283: 
                    284: ;; The definition of this insn does not really explain what it does,
                    285: ;; but it should suffice
                    286: ;; that anything generated as this insn will be recognized as one
                    287: ;; and that it won't successfully combine with anything.
                    288: (define_insn "movstrhi"
                    289:   [(set (match_operand:BLK 0 "general_operand" "=g")
                    290:        (match_operand:BLK 1 "general_operand" "g"))
                    291:    (use (match_operand:HI 2 "general_operand" "g"))
                    292:    (clobber (reg:SI 0))
                    293:    (clobber (reg:SI 1))
                    294:    (clobber (reg:SI 2))
                    295:    (clobber (reg:SI 3))
                    296:    (clobber (reg:SI 4))
                    297:    (clobber (reg:SI 5))]
                    298:   ""
                    299:   "movc3 %2,%1,%0")
                    300: 
                    301: ;; Extension and truncation insns.
                    302: ;; Those for integer source operand
                    303: ;; are ordered widest source type first.
                    304: 
                    305: (define_insn "truncsiqi2"
                    306:   [(set (match_operand:QI 0 "general_operand" "=g")
                    307:        (truncate:QI (match_operand:SI 1 "general_operand" "g")))]
                    308:   ""
                    309:   "cvtlb %1,%0")
                    310: 
                    311: (define_insn "truncsihi2"
                    312:   [(set (match_operand:HI 0 "general_operand" "=g")
                    313:        (truncate:HI (match_operand:SI 1 "general_operand" "g")))]
                    314:   ""
                    315:   "cvtlw %1,%0")
                    316: 
                    317: (define_insn "trunchiqi2"
                    318:   [(set (match_operand:QI 0 "general_operand" "=g")
                    319:        (truncate:QI (match_operand:HI 1 "general_operand" "g")))]
                    320:   ""
                    321:   "cvtwb %1,%0")
                    322: 
                    323: (define_insn "extendhisi2"
                    324:   [(set (match_operand:SI 0 "general_operand" "=g")
                    325:        (sign_extend:SI (match_operand:HI 1 "general_operand" "g")))]
                    326:   ""
                    327:   "cvtwl %1,%0")
                    328: 
                    329: (define_insn "extendqihi2"
                    330:   [(set (match_operand:HI 0 "general_operand" "=g")
                    331:        (sign_extend:HI (match_operand:QI 1 "general_operand" "g")))]
                    332:   ""
                    333:   "cvtbw %1,%0")
                    334: 
                    335: (define_insn "extendqisi2"
                    336:   [(set (match_operand:SI 0 "general_operand" "=g")
                    337:        (sign_extend:SI (match_operand:QI 1 "general_operand" "g")))]
                    338:   ""
                    339:   "cvtbl %1,%0")
                    340: 
                    341: (define_insn "extendsfdf2"
                    342:   [(set (match_operand:DF 0 "general_operand" "=g")
                    343:        (float_extend:DF (match_operand:SF 1 "general_operand" "gF")))]
                    344:   ""
                    345:   "cvtf%# %1,%0")
                    346: 
                    347: (define_insn "truncdfsf2"
                    348:   [(set (match_operand:SF 0 "general_operand" "=g")
                    349:        (float_truncate:SF (match_operand:DF 1 "general_operand" "gF")))]
                    350:   ""
                    351:   "cvt%#f %1,%0")
                    352: 
                    353: (define_insn "zero_extendhisi2"
                    354:   [(set (match_operand:SI 0 "general_operand" "=g")
                    355:        (zero_extend:SI (match_operand:HI 1 "general_operand" "g")))]
                    356:   ""
                    357:   "movzwl %1,%0")
                    358: 
                    359: (define_insn "zero_extendqihi2"
                    360:   [(set (match_operand:HI 0 "general_operand" "=g")
                    361:        (zero_extend:HI (match_operand:QI 1 "general_operand" "g")))]
                    362:   ""
                    363:   "movzbw %1,%0")
                    364: 
                    365: (define_insn "zero_extendqisi2"
                    366:   [(set (match_operand:SI 0 "general_operand" "=g")
                    367:        (zero_extend:SI (match_operand:QI 1 "general_operand" "g")))]
                    368:   ""
                    369:   "movzbl %1,%0")
                    370: 
                    371: ;; Fix-to-float conversion insns.
                    372: ;; Note that the ones that start with SImode come first.
                    373: ;; That is so that an operand that is a CONST_INT
                    374: ;; (and therefore lacks a specific machine mode).
                    375: ;; will be recognized as SImode (which is always valid)
                    376: ;; rather than as QImode or HImode.
                    377: 
                    378: (define_insn "floatsisf2"
                    379:   [(set (match_operand:SF 0 "general_operand" "=g")
                    380:        (float:SF (match_operand:SI 1 "general_operand" "g")))]
                    381:   ""
                    382:   "cvtlf %1,%0")
                    383: 
                    384: (define_insn "floatsidf2"
                    385:   [(set (match_operand:DF 0 "general_operand" "=g")
                    386:        (float:DF (match_operand:SI 1 "general_operand" "g")))]
                    387:   ""
                    388:   "cvtl%# %1,%0")
                    389: 
                    390: (define_insn "floathisf2"
                    391:   [(set (match_operand:SF 0 "general_operand" "=g")
                    392:        (float:SF (match_operand:HI 1 "general_operand" "g")))]
                    393:   ""
                    394:   "cvtwf %1,%0")
                    395: 
                    396: (define_insn "floathidf2"
                    397:   [(set (match_operand:DF 0 "general_operand" "=g")
                    398:        (float:DF (match_operand:HI 1 "general_operand" "g")))]
                    399:   ""
                    400:   "cvtw%# %1,%0")
                    401: 
                    402: (define_insn "floatqisf2"
                    403:   [(set (match_operand:SF 0 "general_operand" "=g")
                    404:        (float:SF (match_operand:QI 1 "general_operand" "g")))]
                    405:   ""
                    406:   "cvtbf %1,%0")
                    407: 
                    408: (define_insn "floatqidf2"
                    409:   [(set (match_operand:DF 0 "general_operand" "=g")
                    410:        (float:DF (match_operand:QI 1 "general_operand" "g")))]
                    411:   ""
                    412:   "cvtb%# %1,%0")
                    413: 
                    414: ;; Float-to-fix conversion insns.
                    415: 
                    416: (define_insn "fix_truncsfqi2"
                    417:   [(set (match_operand:QI 0 "general_operand" "=g")
                    418:        (fix:QI (fix:SF (match_operand:SF 1 "general_operand" "gF"))))]
                    419:   ""
                    420:   "cvtfb %1,%0")
                    421: 
                    422: (define_insn "fix_truncsfhi2"
                    423:   [(set (match_operand:HI 0 "general_operand" "=g")
                    424:        (fix:HI (fix:SF (match_operand:SF 1 "general_operand" "gF"))))]
                    425:   ""
                    426:   "cvtfw %1,%0")
                    427: 
                    428: (define_insn "fix_truncsfsi2"
                    429:   [(set (match_operand:SI 0 "general_operand" "=g")
                    430:        (fix:SI (fix:SF (match_operand:SF 1 "general_operand" "gF"))))]
                    431:   ""
                    432:   "cvtfl %1,%0")
                    433: 
                    434: (define_insn "fix_truncdfqi2"
                    435:   [(set (match_operand:QI 0 "general_operand" "=g")
                    436:        (fix:QI (fix:DF (match_operand:DF 1 "general_operand" "gF"))))]
                    437:   ""
                    438:   "cvt%#b %1,%0")
                    439: 
                    440: (define_insn "fix_truncdfhi2"
                    441:   [(set (match_operand:HI 0 "general_operand" "=g")
                    442:        (fix:HI (fix:DF (match_operand:DF 1 "general_operand" "gF"))))]
                    443:   ""
                    444:   "cvt%#w %1,%0")
                    445: 
                    446: (define_insn "fix_truncdfsi2"
                    447:   [(set (match_operand:SI 0 "general_operand" "=g")
                    448:        (fix:SI (fix:DF (match_operand:DF 1 "general_operand" "gF"))))]
                    449:   ""
                    450:   "cvt%#l %1,%0")
                    451: 
                    452: ;;- All kinds of add instructions.
                    453: 
                    454: (define_insn "adddf3"
                    455:   [(set (match_operand:DF 0 "general_operand" "=g")
                    456:        (plus:DF (match_operand:DF 1 "general_operand" "gF")
                    457:                 (match_operand:DF 2 "general_operand" "gF")))]
                    458:   ""
                    459:   "*
                    460: {
                    461:   if (rtx_equal_p (operands[0], operands[1]))
                    462:     return \"add%#2 %2,%0\";
                    463:   if (rtx_equal_p (operands[0], operands[2]))
                    464:     return \"add%#2 %1,%0\";
                    465:   return \"add%#3 %1,%2,%0\";
                    466: }")
                    467: 
                    468: (define_insn "addsf3"
                    469:   [(set (match_operand:SF 0 "general_operand" "=g")
                    470:        (plus:SF (match_operand:SF 1 "general_operand" "gF")
                    471:                 (match_operand:SF 2 "general_operand" "gF")))]
                    472:   ""
                    473:   "*
                    474: {
                    475:   if (rtx_equal_p (operands[0], operands[1]))
                    476:     return \"addf2 %2,%0\";
                    477:   if (rtx_equal_p (operands[0], operands[2]))
                    478:     return \"addf2 %1,%0\";
                    479:   return \"addf3 %1,%2,%0\";
                    480: }")
                    481: 
                    482: (define_insn "addsi3"
                    483:   [(set (match_operand:SI 0 "general_operand" "=g")
                    484:        (plus:SI (match_operand:SI 1 "general_operand" "g")
                    485:                 (match_operand:SI 2 "general_operand" "g")))]
                    486:   ""
                    487:   "*
                    488: {
                    489:   if (rtx_equal_p (operands[0], operands[1]))
                    490:     {
                    491:       if (operands[2] == const1_rtx)
                    492:        return \"incl %0\";
                    493:       if (GET_CODE (operands[2]) == CONST_INT
                    494:          && INTVAL (operands[2]) == -1)
                    495:        return \"decl %0\";
                    496:       if (GET_CODE (operands[2]) == CONST_INT
                    497:          && (unsigned) (- INTVAL (operands[2])) < 64)
                    498:        return \"subl2 $%n2,%0\";
                    499:       if (GET_CODE (operands[2]) == CONST_INT
                    500:          && (unsigned) INTVAL (operands[2]) >= 64
                    501:          && GET_CODE (operands[1]) == REG)
                    502:        return \"movab %c2(%1),%0\";
                    503:       return \"addl2 %2,%0\";
                    504:     }
                    505:   if (rtx_equal_p (operands[0], operands[2]))
                    506:     return \"addl2 %1,%0\";
                    507:   if (GET_CODE (operands[2]) == CONST_INT
                    508:       && (unsigned) (- INTVAL (operands[2])) < 64)
                    509:     return \"subl3 $%n2,%1,%0\";
                    510:   if (GET_CODE (operands[2]) == CONST_INT
                    511:       && (unsigned) INTVAL (operands[2]) >= 64
                    512:       && GET_CODE (operands[1]) == REG)
                    513:     {
                    514:       if (push_operand (operands[0], SImode))
                    515:        return \"pushab %c2(%1)\";
                    516:       return \"movab %c2(%1),%0\";
                    517:     }
                    518:   return \"addl3 %1,%2,%0\";
                    519: }")
                    520: 
                    521: (define_insn "addhi3"
                    522:   [(set (match_operand:HI 0 "general_operand" "=g")
                    523:        (plus:HI (match_operand:HI 1 "general_operand" "g")
                    524:                 (match_operand:HI 2 "general_operand" "g")))]
                    525:   ""
                    526:   "*
                    527: {
                    528:   if (rtx_equal_p (operands[0], operands[1]))
                    529:     {
                    530:       if (operands[2] == const1_rtx)
                    531:        return \"incw %0\";
                    532:       if (GET_CODE (operands[1]) == CONST_INT
                    533:          && INTVAL (operands[1]) == -1)
                    534:        return \"decw %0\";
                    535:       if (GET_CODE (operands[2]) == CONST_INT
                    536:          && (unsigned) (- INTVAL (operands[2])) < 64)
                    537:        return \"subw2 $%n2,%0\";
                    538:       return \"addw2 %2,%0\";
                    539:     }
                    540:   if (rtx_equal_p (operands[0], operands[2]))
                    541:     return \"addw2 %1,%0\";
                    542:   if (GET_CODE (operands[2]) == CONST_INT
                    543:       && (unsigned) (- INTVAL (operands[2])) < 64)
                    544:     return \"subw3 $%n2,%1,%0\";
                    545:   return \"addw3 %1,%2,%0\";
                    546: }")
                    547: 
                    548: (define_insn "addqi3"
                    549:   [(set (match_operand:QI 0 "general_operand" "=g")
                    550:        (plus:QI (match_operand:QI 1 "general_operand" "g")
                    551:                 (match_operand:QI 2 "general_operand" "g")))]
                    552:   ""
                    553:   "*
                    554: {
                    555:   if (rtx_equal_p (operands[0], operands[1]))
                    556:     {
                    557:       if (operands[2] == const1_rtx)
                    558:        return \"incb %0\";
                    559:       if (GET_CODE (operands[1]) == CONST_INT
                    560:          && INTVAL (operands[1]) == -1)
                    561:        return \"decb %0\";
                    562:       if (GET_CODE (operands[2]) == CONST_INT
                    563:          && (unsigned) (- INTVAL (operands[2])) < 64)
                    564:        return \"subb2 $%n2,%0\";
                    565:       return \"addb2 %2,%0\";
                    566:     }
                    567:   if (rtx_equal_p (operands[0], operands[2]))
                    568:     return \"addb2 %1,%0\";
                    569:   if (GET_CODE (operands[2]) == CONST_INT
                    570:       && (unsigned) (- INTVAL (operands[2])) < 64)
                    571:     return \"subb3 $%n2,%1,%0\";
                    572:   return \"addb3 %1,%2,%0\";
                    573: }")
                    574: 
                    575: ;;- All kinds of subtract instructions.
                    576: 
                    577: (define_insn "subdf3"
                    578:   [(set (match_operand:DF 0 "general_operand" "=g")
                    579:        (minus:DF (match_operand:DF 1 "general_operand" "gF")
                    580:                  (match_operand:DF 2 "general_operand" "gF")))]
                    581:   ""
                    582:   "*
                    583: {
                    584:   if (rtx_equal_p (operands[0], operands[1]))
                    585:     return \"sub%#2 %2,%0\";
                    586:   return \"sub%#3 %2,%1,%0\";
                    587: }")
                    588: 
                    589: (define_insn "subsf3"
                    590:   [(set (match_operand:SF 0 "general_operand" "=g")
                    591:        (minus:SF (match_operand:SF 1 "general_operand" "gF")
                    592:                  (match_operand:SF 2 "general_operand" "gF")))]
                    593:   ""
                    594:   "*
                    595: {
                    596:   if (rtx_equal_p (operands[0], operands[1]))
                    597:     return \"subf2 %2,%0\";
                    598:   return \"subf3 %2,%1,%0\";
                    599: }")
                    600: 
                    601: (define_insn "subsi3"
                    602:   [(set (match_operand:SI 0 "general_operand" "=g")
                    603:        (minus:SI (match_operand:SI 1 "general_operand" "g")
                    604:                  (match_operand:SI 2 "general_operand" "g")))]
                    605:   ""
                    606:   "*
                    607: {
                    608:   if (rtx_equal_p (operands[0], operands[1]))
                    609:     {
                    610:       if (operands[2] == const1_rtx)
                    611:        return \"decl %0\";
                    612:       return \"subl2 %2,%0\";
                    613:     }
                    614:   return \"subl3 %2,%1,%0\";
                    615: }")
                    616: 
                    617: (define_insn "subhi3"
                    618:   [(set (match_operand:HI 0 "general_operand" "=g")
                    619:        (minus:HI (match_operand:HI 1 "general_operand" "g")
                    620:                  (match_operand:HI 2 "general_operand" "g")))]
                    621:   ""
                    622:   "*
                    623: {
                    624:   if (rtx_equal_p (operands[0], operands[1]))
                    625:     {
                    626:       if (operands[2] == const1_rtx)
                    627:        return \"decw %0\";
                    628:       return \"subw2 %2,%0\";
                    629:     }
                    630:   return \"subw3 %2,%1,%0\";
                    631: }")
                    632: 
                    633: (define_insn "subqi3"
                    634:   [(set (match_operand:QI 0 "general_operand" "=g")
                    635:        (minus:QI (match_operand:QI 1 "general_operand" "g")
                    636:                  (match_operand:QI 2 "general_operand" "g")))]
                    637:   ""
                    638:   "*
                    639: {
                    640:   if (rtx_equal_p (operands[0], operands[1]))
                    641:     {
                    642:       if (operands[2] == const1_rtx)
                    643:        return \"decb %0\";
                    644:       return \"subb2 %2,%0\";
                    645:     }
                    646:   return \"subb3 %2,%1,%0\";
                    647: }")
                    648: 
                    649: ;;- Multiply instructions.
                    650: 
                    651: (define_insn "muldf3"
                    652:   [(set (match_operand:DF 0 "general_operand" "=g")
                    653:        (mult:DF (match_operand:DF 1 "general_operand" "gF")
                    654:                 (match_operand:DF 2 "general_operand" "gF")))]
                    655:   ""
                    656:   "*
                    657: {
                    658:   if (rtx_equal_p (operands[0], operands[1]))
                    659:     return \"mul%#2 %2,%0\";
                    660:   if (rtx_equal_p (operands[0], operands[2]))
                    661:     return \"mul%#2 %1,%0\";
                    662:   return \"mul%#3 %1,%2,%0\";
                    663: }")
                    664: 
                    665: (define_insn "mulsf3"
                    666:   [(set (match_operand:SF 0 "general_operand" "=g")
                    667:        (mult:SF (match_operand:SF 1 "general_operand" "gF")
                    668:                 (match_operand:SF 2 "general_operand" "gF")))]
                    669:   ""
                    670:   "*
                    671: {
                    672:   if (rtx_equal_p (operands[0], operands[1]))
                    673:     return \"mulf2 %2,%0\";
                    674:   if (rtx_equal_p (operands[0], operands[2]))
                    675:     return \"mulf2 %1,%0\";
                    676:   return \"mulf3 %1,%2,%0\";
                    677: }")
                    678: 
                    679: (define_insn "mulsi3"
                    680:   [(set (match_operand:SI 0 "general_operand" "=g")
                    681:        (mult:SI (match_operand:SI 1 "general_operand" "g")
                    682:                 (match_operand:SI 2 "general_operand" "g")))]
                    683:   ""
                    684:   "*
                    685: {
                    686:   if (rtx_equal_p (operands[0], operands[1]))
                    687:     return \"mull2 %2,%0\";
                    688:   if (rtx_equal_p (operands[0], operands[2]))
                    689:     return \"mull2 %1,%0\";
                    690:   return \"mull3 %1,%2,%0\";
                    691: }")
                    692: 
                    693: (define_insn "mulhi3"
                    694:   [(set (match_operand:HI 0 "general_operand" "=g")
                    695:        (mult:HI (match_operand:HI 1 "general_operand" "g")
                    696:                 (match_operand:HI 2 "general_operand" "g")))]
                    697:   ""
                    698:   "*
                    699: {
                    700:   if (rtx_equal_p (operands[0], operands[1]))
                    701:     return \"mulw2 %2,%0\";
                    702:   if (rtx_equal_p (operands[0], operands[2]))
                    703:     return \"mulw2 %1,%0\";
                    704:   return \"mulw3 %1,%2,%0\";
                    705: }")
                    706: 
                    707: (define_insn "mulqi3"
                    708:   [(set (match_operand:QI 0 "general_operand" "=g")
                    709:        (mult:QI (match_operand:QI 1 "general_operand" "g")
                    710:                 (match_operand:QI 2 "general_operand" "g")))]
                    711:   ""
                    712:   "*
                    713: {
                    714:   if (rtx_equal_p (operands[0], operands[1]))
                    715:     return \"mulb2 %2,%0\";
                    716:   if (rtx_equal_p (operands[0], operands[2]))
                    717:     return \"mulb2 %1,%0\";
                    718:   return \"mulb3 %1,%2,%0\";
                    719: }")
                    720: 
                    721: ;;- Divide instructions.
                    722: 
                    723: (define_insn "divdf3"
                    724:   [(set (match_operand:DF 0 "general_operand" "=g")
                    725:        (div:DF (match_operand:DF 1 "general_operand" "gF")
                    726:                (match_operand:DF 2 "general_operand" "gF")))]
                    727:   ""
                    728:   "*
                    729: {
                    730:   if (rtx_equal_p (operands[0], operands[1]))
                    731:     return \"div%#2 %2,%0\";
                    732:   return \"div%#3 %2,%1,%0\";
                    733: }")
                    734: 
                    735: (define_insn "divsf3"
                    736:   [(set (match_operand:SF 0 "general_operand" "=g")
                    737:        (div:SF (match_operand:SF 1 "general_operand" "gF")
                    738:                (match_operand:SF 2 "general_operand" "gF")))]
                    739:   ""
                    740:   "*
                    741: {
                    742:   if (rtx_equal_p (operands[0], operands[1]))
                    743:     return \"divf2 %2,%0\";
                    744:   return \"divf3 %2,%1,%0\";
                    745: }")
                    746: 
                    747: (define_insn "divsi3"
                    748:   [(set (match_operand:SI 0 "general_operand" "=g")
                    749:        (div:SI (match_operand:SI 1 "general_operand" "g")
                    750:                (match_operand:SI 2 "general_operand" "g")))]
                    751:   ""
                    752:   "*
                    753: {
                    754:   if (rtx_equal_p (operands[0], operands[1]))
                    755:     return \"divl2 %2,%0\";
                    756:   return \"divl3 %2,%1,%0\";
                    757: }")
                    758: 
                    759: (define_insn "divhi3"
                    760:   [(set (match_operand:HI 0 "general_operand" "=g")
                    761:        (div:HI (match_operand:HI 1 "general_operand" "g")
                    762:                (match_operand:HI 2 "general_operand" "g")))]
                    763:   ""
                    764:   "*
                    765: {
                    766:   if (rtx_equal_p (operands[0], operands[1]))
                    767:     return \"divw2 %2,%0\";
                    768:   return \"divw3 %2,%1,%0\";
                    769: }")
                    770: 
                    771: (define_insn "divqi3"
                    772:   [(set (match_operand:QI 0 "general_operand" "=g")
                    773:        (div:QI (match_operand:QI 1 "general_operand" "g")
                    774:                (match_operand:QI 2 "general_operand" "g")))]
                    775:   ""
                    776:   "*
                    777: {
                    778:   if (rtx_equal_p (operands[0], operands[1]))
                    779:     return \"divb2 %2,%0\";
                    780:   return \"divb3 %2,%1,%0\";
                    781: }")
                    782: 
                    783: ;This is left out because it is very slow;
                    784: ;we are better off programming around the "lack" of this insn.
                    785: ;(define_insn "divmoddisi4"
                    786: ;  [(set (match_operand:SI 0 "general_operand" "=g")
                    787: ;      (div:SI (match_operand:DI 1 "general_operand" "g")
                    788: ;              (match_operand:SI 2 "general_operand" "g")))
                    789: ;   (set (match_operand:SI 3 "general_operand" "=g")
                    790: ;      (mod:SI (match_operand:DI 1 "general_operand" "g")
                    791: ;              (match_operand:SI 2 "general_operand" "g")))]
                    792: ;  ""
                    793: ;  "ediv %2,%1,%0,%3")
                    794: 
                    795: ;; Bit-and on the vax is done with a clear-bits insn.
                    796: (define_expand "andsi3"
                    797:   [(set (match_operand:SI 0 "general_operand" "=g")
                    798:        (and:SI (match_operand:SI 1 "general_operand" "g")
                    799:                (not:SI (match_operand:SI 2 "general_operand" "g"))))]
                    800:   ""
                    801:   "
                    802: {
                    803:   extern rtx expand_unop ();
                    804:   if (GET_CODE (operands[2]) == CONST_INT)
                    805:     operands[2] = gen_rtx (CONST_INT, VOIDmode, ~INTVAL (operands[2]));
                    806:   else
                    807:     operands[2] = expand_unop (SImode, one_cmpl_optab, operands[2], 0, 1);
                    808: }")
                    809: 
                    810: (define_expand "andhi3"
                    811:   [(set (match_operand:HI 0 "general_operand" "=g")
                    812:        (and:HI (match_operand:HI 1 "general_operand" "g")
                    813:                (not:HI (match_operand:HI 2 "general_operand" "g"))))]
                    814:   ""
                    815:   "
                    816: {
                    817:   extern rtx expand_unop ();
                    818:   rtx op = operands[2];
                    819:   if (GET_CODE (op) == CONST_INT)
                    820:     operands[2] = gen_rtx (CONST_INT, VOIDmode,
                    821:                           ((1 << 16) - 1) & ~INTVAL (op));
                    822:   else
                    823:     operands[2] = expand_unop (HImode, one_cmpl_optab, op, 0, 1);
                    824: }")
                    825: 
                    826: (define_expand "andqi3"
                    827:   [(set (match_operand:QI 0 "general_operand" "=g")
                    828:        (and:QI (match_operand:QI 1 "general_operand" "g")
                    829:                (not:QI (match_operand:QI 2 "general_operand" "g"))))]
                    830:   ""
                    831:   "
                    832: {
                    833:   extern rtx expand_unop ();
                    834:   rtx op = operands[2];
                    835:   if (GET_CODE (op) == CONST_INT)
                    836:     operands[2] = gen_rtx (CONST_INT, VOIDmode,
                    837:                           ((1 << 8) - 1) & ~INTVAL (op));
                    838:   else
                    839:     operands[2] = expand_unop (QImode, one_cmpl_optab, op, 0, 1);
                    840: }")
                    841: 
                    842: (define_insn "andcbsi3"
                    843:   [(set (match_operand:SI 0 "general_operand" "=g")
                    844:        (and:SI (match_operand:SI 1 "general_operand" "g")
                    845:                (not:SI (match_operand:SI 2 "general_operand" "g"))))]
                    846:   ""
                    847:   "*
                    848: {
                    849:   if (rtx_equal_p (operands[0], operands[1]))
                    850:     return \"bicl2 %2,%0\";
                    851:   return \"bicl3 %2,%1,%0\";
                    852: }")
                    853: 
                    854: (define_insn "andcbhi3"
                    855:   [(set (match_operand:HI 0 "general_operand" "=g")
                    856:        (and:HI (match_operand:HI 1 "general_operand" "g")
                    857:                (not:HI (match_operand:HI 2 "general_operand" "g"))))]
                    858:   ""
                    859:   "*
                    860: {
                    861:   if (rtx_equal_p (operands[0], operands[1]))
                    862:     return \"bicw2 %2,%0\";
                    863:   return \"bicw3 %2,%1,%0\";
                    864: }")
                    865: 
                    866: (define_insn "andcbqi3"
                    867:   [(set (match_operand:QI 0 "general_operand" "=g")
                    868:        (and:QI (match_operand:QI 1 "general_operand" "g")
                    869:                (not:QI (match_operand:QI 2 "general_operand" "g"))))]
                    870:   ""
                    871:   "*
                    872: {
                    873:   if (rtx_equal_p (operands[0], operands[1]))
                    874:     return \"bicb2 %2,%0\";
                    875:   return \"bicb3 %2,%1,%0\";
                    876: }")
                    877: 
                    878: ;; The following are needed because constant propagation can
                    879: ;; create them starting from the bic insn patterns above.
                    880: 
                    881: (define_insn ""
                    882:   [(set (match_operand:SI 0 "general_operand" "=g")
                    883:        (and:SI (match_operand:SI 1 "general_operand" "g")
                    884:                (match_operand:SI 2 "general_operand" "g")))]
                    885:   "GET_CODE (operands[2]) == CONST_INT"
                    886:   "*
                    887: { operands[2] = gen_rtx (CONST_INT, VOIDmode, ~INTVAL (operands[2]));
                    888:   if (rtx_equal_p (operands[1], operands[0]))
                    889:     return \"bicl2 %2,%0\";
                    890:   return \"bicl3 %2,%1,%0\";
                    891: }")
                    892: 
                    893: (define_insn ""
                    894:   [(set (match_operand:HI 0 "general_operand" "=g")
                    895:        (and:HI (match_operand:HI 1 "general_operand" "g")
                    896:                (match_operand:HI 2 "general_operand" "g")))]
                    897:   "GET_CODE (operands[2]) == CONST_INT"
                    898:   "*
                    899: { operands[2] = gen_rtx (CONST_INT, VOIDmode, 0xffff & ~INTVAL (operands[2]));
                    900:   if (rtx_equal_p (operands[1], operands[0]))
                    901:     return \"bicw2 %2,%0\";
                    902:   return \"bicw3 %2,%1,%0\";
                    903: }")
                    904: 
                    905: (define_insn ""
                    906:   [(set (match_operand:QI 0 "general_operand" "=g")
                    907:        (and:QI (match_operand:QI 1 "general_operand" "g")
                    908:                (match_operand:QI 2 "general_operand" "g")))]
                    909:   "GET_CODE (operands[2]) == CONST_INT"
                    910:   "*
                    911: { operands[2] = gen_rtx (CONST_INT, VOIDmode, 0xff & ~INTVAL (operands[2]));
                    912:   if (rtx_equal_p (operands[1], operands[0]))
                    913:     return \"bicb2 %2,%0\";
                    914:   return \"bicb3 %2,%1,%0\";
                    915: }")
                    916: 
                    917: ;;- Bit set instructions.
                    918: 
                    919: (define_insn "iorsi3"
                    920:   [(set (match_operand:SI 0 "general_operand" "=g")
                    921:        (ior:SI (match_operand:SI 1 "general_operand" "g")
                    922:                (match_operand:SI 2 "general_operand" "g")))]
                    923:   ""
                    924:   "*
                    925: {
                    926:   if (rtx_equal_p (operands[0], operands[1]))
                    927:     return \"bisl2 %2,%0\";
                    928:   if (rtx_equal_p (operands[0], operands[2]))
                    929:     return \"bisl2 %1,%0\";
                    930:   return \"bisl3 %2,%1,%0\";
                    931: }")
                    932: 
                    933: (define_insn "iorhi3"
                    934:   [(set (match_operand:HI 0 "general_operand" "=g")
                    935:        (ior:HI (match_operand:HI 1 "general_operand" "g")
                    936:                (match_operand:HI 2 "general_operand" "g")))]
                    937:   ""
                    938:   "*
                    939: {
                    940:   if (rtx_equal_p (operands[0], operands[1]))
                    941:     return \"bisw2 %2,%0\";
                    942:   if (rtx_equal_p (operands[0], operands[2]))
                    943:     return \"bisw2 %1,%0\";
                    944:   return \"bisw3 %2,%1,%0\";
                    945: }")
                    946: 
                    947: (define_insn "iorqi3"
                    948:   [(set (match_operand:QI 0 "general_operand" "=g")
                    949:        (ior:QI (match_operand:QI 1 "general_operand" "g")
                    950:                (match_operand:QI 2 "general_operand" "g")))]
                    951:   ""
                    952:   "*
                    953: {
                    954:   if (rtx_equal_p (operands[0], operands[1]))
                    955:     return \"bisb2 %2,%0\";
                    956:   if (rtx_equal_p (operands[0], operands[2]))
                    957:     return \"bisb2 %1,%0\";
                    958:   return \"bisb3 %2,%1,%0\";
                    959: }")
                    960: 
                    961: ;;- xor instructions.
                    962: 
                    963: (define_insn "xorsi3"
                    964:   [(set (match_operand:SI 0 "general_operand" "=g")
                    965:        (xor:SI (match_operand:SI 1 "general_operand" "g")
                    966:                (match_operand:SI 2 "general_operand" "g")))]
                    967:   ""
                    968:   "*
                    969: {
                    970:   if (rtx_equal_p (operands[0], operands[1]))
                    971:     return \"xorl2 %2,%0\";
                    972:   if (rtx_equal_p (operands[0], operands[2]))
                    973:     return \"xorl2 %1,%0\";
                    974:   return \"xorl3 %2,%1,%0\";
                    975: }")
                    976: 
                    977: (define_insn "xorhi3"
                    978:   [(set (match_operand:HI 0 "general_operand" "=g")
                    979:        (xor:HI (match_operand:HI 1 "general_operand" "g")
                    980:                (match_operand:HI 2 "general_operand" "g")))]
                    981:   ""
                    982:   "*
                    983: {
                    984:   if (rtx_equal_p (operands[0], operands[1]))
                    985:     return \"xorw2 %2,%0\";
                    986:   if (rtx_equal_p (operands[0], operands[2]))
                    987:     return \"xorw2 %1,%0\";
                    988:   return \"xorw3 %2,%1,%0\";
                    989: }")
                    990: 
                    991: (define_insn "xorqi3"
                    992:   [(set (match_operand:QI 0 "general_operand" "=g")
                    993:        (xor:QI (match_operand:QI 1 "general_operand" "g")
                    994:                (match_operand:QI 2 "general_operand" "g")))]
                    995:   ""
                    996:   "*
                    997: {
                    998:   if (rtx_equal_p (operands[0], operands[1]))
                    999:     return \"xorb2 %2,%0\";
                   1000:   if (rtx_equal_p (operands[0], operands[2]))
                   1001:     return \"xorb2 %1,%0\";
                   1002:   return \"xorb3 %2,%1,%0\";
                   1003: }")
                   1004: 
                   1005: (define_insn "negdf2"
                   1006:   [(set (match_operand:DF 0 "general_operand" "=g")
                   1007:        (neg:DF (match_operand:DF 1 "general_operand" "gF")))]
                   1008:   ""
                   1009:   "mneg%# %1,%0")
                   1010: 
                   1011: (define_insn "negsf2"
                   1012:   [(set (match_operand:SF 0 "general_operand" "=g")
                   1013:        (neg:SF (match_operand:SF 1 "general_operand" "gF")))]
                   1014:   ""
                   1015:   "mnegf %1,%0")
                   1016: 
                   1017: (define_insn "negsi2"
                   1018:   [(set (match_operand:SI 0 "general_operand" "=g")
                   1019:        (neg:SI (match_operand:SI 1 "general_operand" "g")))]
                   1020:   ""
                   1021:   "mnegl %1,%0")
                   1022: 
                   1023: (define_insn "neghi2"
                   1024:   [(set (match_operand:HI 0 "general_operand" "=g")
                   1025:        (neg:HI (match_operand:HI 1 "general_operand" "g")))]
                   1026:   ""
                   1027:   "mnegw %1,%0")
                   1028: 
                   1029: (define_insn "negqi2"
                   1030:   [(set (match_operand:QI 0 "general_operand" "=g")
                   1031:        (neg:QI (match_operand:QI 1 "general_operand" "g")))]
                   1032:   ""
                   1033:   "mnegb %1,%0")
                   1034: 
                   1035: (define_insn "one_cmplsi2"
                   1036:   [(set (match_operand:SI 0 "general_operand" "=g")
                   1037:        (not:SI (match_operand:SI 1 "general_operand" "g")))]
                   1038:   ""
                   1039:   "mcoml %1,%0")
                   1040: 
                   1041: (define_insn "one_cmplhi2"
                   1042:   [(set (match_operand:HI 0 "general_operand" "=g")
                   1043:        (not:HI (match_operand:HI 1 "general_operand" "g")))]
                   1044:   ""
                   1045:   "mcomw %1,%0")
                   1046: 
                   1047: (define_insn "one_cmplqi2"
                   1048:   [(set (match_operand:QI 0 "general_operand" "=g")
                   1049:        (not:QI (match_operand:QI 1 "general_operand" "g")))]
                   1050:   ""
                   1051:   "mcomb %1,%0")
                   1052: 
                   1053: ;; Arithmetic right shift on the vax works by negating the shift count.
                   1054: (define_expand "ashrsi3"
                   1055:   [(set (match_operand:SI 0 "general_operand" "=g")
                   1056:        (ashift:SI (match_operand:SI 1 "general_operand" "g")
                   1057:                   (match_operand:QI 2 "general_operand" "g")))]
                   1058:   ""
                   1059:   "
                   1060: {
                   1061:   operands[2] = negate_rtx (QImode, operands[2]);
                   1062: }")
                   1063: 
                   1064: (define_insn "ashlsi3"
                   1065:   [(set (match_operand:SI 0 "general_operand" "=g")
                   1066:        (ashift:SI (match_operand:SI 1 "general_operand" "g")
                   1067:                   (match_operand:QI 2 "general_operand" "g")))]
                   1068:   ""
                   1069:   "*
                   1070: {
                   1071:   if (operands[2] == const1_rtx && rtx_equal_p (operands[0], operands[1]))
                   1072:     return \"addl2 %0,%0\";
                   1073:   if (GET_CODE (operands[1]) == REG
                   1074:       && GET_CODE (operands[2]) == CONST_INT)
                   1075:     {
                   1076:       int i = INTVAL (operands[2]);
                   1077:       if (i == 1)
                   1078:        return \"addl3 %1,%1,%0\";
                   1079:       if (i == 2)
                   1080:        return \"moval 0[%1],%0\";
                   1081:       if (i == 3)
                   1082:        return \"movad 0[%1],%0\";
                   1083:     }
                   1084:   return \"ashl %2,%1,%0\";
                   1085: }")
                   1086: 
                   1087: ;; Arithmetic right shift on the vax works by negating the shift count.
                   1088: (define_expand "ashrdi3"
                   1089:   [(set (match_operand:DI 0 "general_operand" "=g")
                   1090:        (ashift:DI (match_operand:DI 1 "general_operand" "g")
                   1091:                   (match_operand:QI 2 "general_operand" "g")))]
                   1092:   ""
                   1093:   "
                   1094: {
                   1095:   operands[2] = negate_rtx (QImode, operands[2]);
                   1096: }")
                   1097: 
                   1098: (define_insn "ashldi3"
                   1099:   [(set (match_operand:DI 0 "general_operand" "=g")
                   1100:        (ashift:DI (match_operand:DI 1 "general_operand" "g")
                   1101:                   (match_operand:QI 2 "general_operand" "g")))]
                   1102:   ""
                   1103:   "ashq %2,%1,%0")
                   1104: 
                   1105: ;; Rotate right on the vax works by negating the shift count.
                   1106: (define_expand "rotrsi3"
                   1107:   [(set (match_operand:SI 0 "general_operand" "=g")
                   1108:        (rotate:SI (match_operand:SI 1 "general_operand" "g")
                   1109:                   (match_operand:QI 2 "general_operand" "g")))]
                   1110:   ""
                   1111:   "
                   1112: {
                   1113:   operands[2] = negate_rtx (QImode, operands[2]);
                   1114: }")
                   1115: 
                   1116: (define_insn "rotlsi3"
                   1117:   [(set (match_operand:SI 0 "general_operand" "=g")
                   1118:        (rotate:SI (match_operand:SI 1 "general_operand" "g")
                   1119:                   (match_operand:QI 2 "general_operand" "g")))]
                   1120:   ""
                   1121:   "rotl %2,%1,%0")
                   1122: 
                   1123: ;This insn is probably slower than a multiply and an add.
                   1124: ;(define_insn ""
                   1125: ;  [(set (match_operand:SI 0 "general_operand" "=g")
                   1126: ;      (mult:SI (plus:SI (match_operand:SI 1 "general_operand" "g")
                   1127: ;                        (match_operand:SI 2 "general_operand" "g"))
                   1128: ;               (match_operand:SI 3 "general_operand" "g")))]
                   1129: ;  ""
                   1130: ;  "index %1,$0x80000000,$0x7fffffff,%3,%2,%0")
                   1131: 
                   1132: ;; Special cases of bit-field insns which we should
                   1133: ;; recognize in preference to the general case.
                   1134: ;; These handle aligned 8-bit and 16-bit fields,
                   1135: ;; which can usually be done with move instructions.
                   1136: 
                   1137: (define_insn ""
                   1138:   [(set (zero_extract:SI (match_operand:SI 0 "general_operand" "+ro")
                   1139:                         (match_operand:SI 1 "immediate_operand" "i")
                   1140:                         (match_operand:SI 2 "immediate_operand" "i"))
                   1141:        (match_operand:SI 3 "general_operand" "g"))]
                   1142:    "GET_CODE (operands[1]) == CONST_INT
                   1143:    && (INTVAL (operands[1]) == 8 || INTVAL (operands[1]) == 16)
                   1144:    && GET_CODE (operands[2]) == CONST_INT
                   1145:    && INTVAL (operands[2]) % INTVAL (operands[1]) == 0
                   1146:    && (GET_CODE (operands[0]) == REG
                   1147:        || ! mode_dependent_address_p (XEXP (operands[0], 0)))"
                   1148:   "*
                   1149: {
                   1150:   if (REG_P (operands[0]))
                   1151:     {
                   1152:       if (INTVAL (operands[2]) != 0)
                   1153:        return \"insv %3,%2,%1,%0\";
                   1154:     }
                   1155:   else
                   1156:     operands[0]
                   1157:       = adj_offsettable_operand (operands[0], INTVAL (operands[2]) / 8);
                   1158: 
                   1159:   if (INTVAL (operands[1]) == 8)
                   1160:     return \"movb %3,%0\";
                   1161:   return \"movw %3,%0\";
                   1162: }")
                   1163: 
                   1164: (define_insn ""
                   1165:   [(set (match_operand:SI 0 "general_operand" "=&g")
                   1166:        (zero_extract:SI (match_operand:SI 1 "general_operand" "ro")
                   1167:                         (match_operand:SI 2 "immediate_operand" "i")
                   1168:                         (match_operand:SI 3 "immediate_operand" "i")))]
                   1169:    "GET_CODE (operands[2]) == CONST_INT
                   1170:    && (INTVAL (operands[2]) == 8 || INTVAL (operands[2]) == 16)
                   1171:    && GET_CODE (operands[3]) == CONST_INT
                   1172:    && INTVAL (operands[3]) % INTVAL (operands[2]) == 0
                   1173:    && (GET_CODE (operands[1]) == REG
                   1174:        || ! mode_dependent_address_p (XEXP (operands[1], 0)))"
                   1175:   "*
                   1176: {
                   1177:   if (REG_P (operands[1]))
                   1178:     {
                   1179:       if (INTVAL (operands[3]) != 0)
                   1180:        return \"extzv %3,%2,%1,%0\";
                   1181:     }
                   1182:   else
                   1183:     operands[1]
                   1184:       = adj_offsettable_operand (operands[1], INTVAL (operands[3]) / 8);
                   1185: 
                   1186:   if (INTVAL (operands[2]) == 8)
                   1187:     return \"movzbl %1,%0\";
                   1188:   return \"movzwl %1,%0\";
                   1189: }")
                   1190: 
                   1191: (define_insn ""
                   1192:   [(set (match_operand:SI 0 "general_operand" "=g")
                   1193:        (sign_extract:SI (match_operand:SI 1 "general_operand" "ro")
                   1194:                         (match_operand:SI 2 "immediate_operand" "i")
                   1195:                         (match_operand:SI 3 "immediate_operand" "i")))]
                   1196:    "GET_CODE (operands[2]) == CONST_INT
                   1197:    && (INTVAL (operands[2]) == 8 || INTVAL (operands[2]) == 16)
                   1198:    && GET_CODE (operands[3]) == CONST_INT
                   1199:    && INTVAL (operands[3]) % INTVAL (operands[2]) == 0
                   1200:    && (GET_CODE (operands[1]) == REG
                   1201:        || ! mode_dependent_address_p (XEXP (operands[1], 0)))"
                   1202:   "*
                   1203: {
                   1204:   if (REG_P (operands[1]))
                   1205:     {
                   1206:       if (INTVAL (operands[3]) != 0)
                   1207:        return \"extv %3,%2,%1,%0\";
                   1208:     }
                   1209:   else
                   1210:     operands[1]
                   1211:       = adj_offsettable_operand (operands[1], INTVAL (operands[3]) / 8);
                   1212: 
                   1213:   if (INTVAL (operands[2]) == 8)
                   1214:     return \"cvtbl %1,%0\";
                   1215:   return \"cvtwl %1,%0\";
                   1216: }")
                   1217: 
                   1218: ;; Register-only SImode cases of bit-field insns.
                   1219: 
                   1220: (define_insn ""
                   1221:   [(set (cc0)
                   1222:        (compare
                   1223:         (sign_extract:SI (match_operand:SI 0 "general_operand" "r")
                   1224:                          (match_operand:SI 1 "general_operand" "g")
                   1225:                          (match_operand:SI 2 "general_operand" "g"))
                   1226:         (match_operand:SI 3 "general_operand" "g")))]
                   1227:   ""
                   1228:   "cmpv %2,%1,%0,%3")
                   1229: 
                   1230: (define_insn ""
                   1231:   [(set (cc0)
                   1232:        (compare
                   1233:         (zero_extract:SI (match_operand:SI 0 "general_operand" "r")
                   1234:                          (match_operand:SI 1 "general_operand" "g")
                   1235:                          (match_operand:SI 2 "general_operand" "g"))
                   1236:         (match_operand:SI 3 "general_operand" "g")))]
                   1237:   ""
                   1238:   "cmpzv %2,%1,%0,%3")
                   1239: 
                   1240: (define_insn ""
                   1241:   [(set (match_operand:SI 0 "general_operand" "=g")
                   1242:        (sign_extract:SI (match_operand:SI 1 "general_operand" "r")
                   1243:                         (match_operand:SI 2 "general_operand" "g")
                   1244:                         (match_operand:SI 3 "general_operand" "g")))]
                   1245:   ""
                   1246:   "extv %3,%2,%1,%0")
                   1247: 
                   1248: (define_insn ""
                   1249:   [(set (match_operand:SI 0 "general_operand" "=g")
                   1250:        (zero_extract:SI (match_operand:SI 1 "general_operand" "r")
                   1251:                         (match_operand:SI 2 "general_operand" "g")
                   1252:                         (match_operand:SI 3 "general_operand" "g")))]
                   1253:   ""
                   1254:   "extzv %3,%2,%1,%0")
                   1255: 
                   1256: ;; Non-register cases.
                   1257: ;; nonimmediate_operand is used to make sure that mode-ambiguous cases
                   1258: ;; don't match these (and therefore match the cases above instead).
                   1259: 
                   1260: (define_insn ""
                   1261:   [(set (cc0)
                   1262:        (compare
                   1263:         (sign_extract:SI (match_operand:QI 0 "nonimmediate_operand" "rm")
                   1264:                          (match_operand:SI 1 "general_operand" "g")
                   1265:                          (match_operand:SI 2 "general_operand" "g"))
                   1266:         (match_operand:SI 3 "general_operand" "g")))]
                   1267:   ""
                   1268:   "cmpv %2,%1,%0,%3")
                   1269: 
                   1270: (define_insn ""
                   1271:   [(set (cc0)
                   1272:        (compare
                   1273:         (zero_extract:SI (match_operand:QI 0 "nonimmediate_operand" "rm")
                   1274:                          (match_operand:SI 1 "general_operand" "g")
                   1275:                          (match_operand:SI 2 "general_operand" "g"))
                   1276:         (match_operand:SI 3 "general_operand" "g")))]
                   1277:   ""
                   1278:   "cmpzv %2,%1,%0,%3")
                   1279: 
                   1280: (define_insn "extv"
                   1281:   [(set (match_operand:SI 0 "general_operand" "=g")
                   1282:        (sign_extract:SI (match_operand:QI 1 "nonimmediate_operand" "rm")
                   1283:                         (match_operand:SI 2 "general_operand" "g")
                   1284:                         (match_operand:SI 3 "general_operand" "g")))]
                   1285:   ""
                   1286:   "extv %3,%2,%1,%0")
                   1287: 
                   1288: (define_insn "extzv"
                   1289:   [(set (match_operand:SI 0 "general_operand" "=g")
                   1290:        (zero_extract:SI (match_operand:QI 1 "nonimmediate_operand" "rm")
                   1291:                         (match_operand:SI 2 "general_operand" "g")
                   1292:                         (match_operand:SI 3 "general_operand" "g")))]
                   1293:   ""
                   1294:   "extzv %3,%2,%1,%0")
                   1295: 
                   1296: (define_insn "insv"
                   1297:   [(set (zero_extract:SI (match_operand:QI 0 "general_operand" "+g")
                   1298:                         (match_operand:SI 1 "general_operand" "g")
                   1299:                         (match_operand:SI 2 "general_operand" "g"))
                   1300:        (match_operand:SI 3 "general_operand" "g"))]
                   1301:   ""
                   1302:   "insv %3,%2,%1,%0")
                   1303: 
                   1304: (define_insn ""
                   1305:   [(set (zero_extract:SI (match_operand:SI 0 "register_operand" "+r")
                   1306:                         (match_operand:SI 1 "general_operand" "g")
                   1307:                         (match_operand:SI 2 "general_operand" "g"))
                   1308:        (match_operand:SI 3 "general_operand" "g"))]
                   1309:   ""
                   1310:   "insv %3,%2,%1,%0")
                   1311: 
                   1312: (define_insn "jump"
                   1313:   [(set (pc)
                   1314:        (label_ref (match_operand 0 "" "")))]
                   1315:   ""
                   1316:   "jbr %l0")
                   1317: 
                   1318: (define_insn "beq"
                   1319:   [(set (pc)
                   1320:        (if_then_else (eq (cc0)
                   1321:                          (const_int 0))
                   1322:                      (label_ref (match_operand 0 "" ""))
                   1323:                      (pc)))]
                   1324:   ""
                   1325:   "jeql %l0")
                   1326: 
                   1327: (define_insn "bne"
                   1328:   [(set (pc)
                   1329:        (if_then_else (ne (cc0)
                   1330:                          (const_int 0))
                   1331:                      (label_ref (match_operand 0 "" ""))
                   1332:                      (pc)))]
                   1333:   ""
                   1334:   "jneq %l0")
                   1335: 
                   1336: (define_insn "bgt"
                   1337:   [(set (pc)
                   1338:        (if_then_else (gt (cc0)
                   1339:                          (const_int 0))
                   1340:                      (label_ref (match_operand 0 "" ""))
                   1341:                      (pc)))]
                   1342:   ""
                   1343:   "jgtr %l0")
                   1344: 
                   1345: (define_insn "bgtu"
                   1346:   [(set (pc)
                   1347:        (if_then_else (gtu (cc0)
                   1348:                           (const_int 0))
                   1349:                      (label_ref (match_operand 0 "" ""))
                   1350:                      (pc)))]
                   1351:   ""
                   1352:   "jgtru %l0")
                   1353: 
                   1354: (define_insn "blt"
                   1355:   [(set (pc)
                   1356:        (if_then_else (lt (cc0)
                   1357:                          (const_int 0))
                   1358:                      (label_ref (match_operand 0 "" ""))
                   1359:                      (pc)))]
                   1360:   ""
                   1361:   "jlss %l0")
                   1362: 
                   1363: (define_insn "bltu"
                   1364:   [(set (pc)
                   1365:        (if_then_else (ltu (cc0)
                   1366:                           (const_int 0))
                   1367:                      (label_ref (match_operand 0 "" ""))
                   1368:                      (pc)))]
                   1369:   ""
                   1370:   "jlssu %l0")
                   1371: 
                   1372: (define_insn "bge"
                   1373:   [(set (pc)
                   1374:        (if_then_else (ge (cc0)
                   1375:                          (const_int 0))
                   1376:                      (label_ref (match_operand 0 "" ""))
                   1377:                      (pc)))]
                   1378:   ""
                   1379:   "jgeq %l0")
                   1380: 
                   1381: (define_insn "bgeu"
                   1382:   [(set (pc)
                   1383:        (if_then_else (geu (cc0)
                   1384:                           (const_int 0))
                   1385:                      (label_ref (match_operand 0 "" ""))
                   1386:                      (pc)))]
                   1387:   ""
                   1388:   "jgequ %l0")
                   1389: 
                   1390: (define_insn "ble"
                   1391:   [(set (pc)
                   1392:        (if_then_else (le (cc0)
                   1393:                          (const_int 0))
                   1394:                      (label_ref (match_operand 0 "" ""))
                   1395:                      (pc)))]
                   1396:   ""
                   1397:   "jleq %l0")
                   1398: 
                   1399: (define_insn "bleu"
                   1400:   [(set (pc)
                   1401:        (if_then_else (leu (cc0)
                   1402:                           (const_int 0))
                   1403:                      (label_ref (match_operand 0 "" ""))
                   1404:                      (pc)))]
                   1405:   ""
                   1406:   "jlequ %l0")
                   1407: 
                   1408: (define_insn ""
                   1409:   [(set (pc)
                   1410:        (if_then_else (eq (cc0)
                   1411:                          (const_int 0))
                   1412:                      (pc)
                   1413:                      (label_ref (match_operand 0 "" ""))))]
                   1414:   ""
                   1415:   "jneq %l0")
                   1416: 
                   1417: (define_insn ""
                   1418:   [(set (pc)
                   1419:        (if_then_else (ne (cc0)
                   1420:                          (const_int 0))
                   1421:                      (pc)
                   1422:                      (label_ref (match_operand 0 "" ""))))]
                   1423:   ""
                   1424:   "jeql %l0")
                   1425: 
                   1426: (define_insn ""
                   1427:   [(set (pc)
                   1428:        (if_then_else (gt (cc0)
                   1429:                          (const_int 0))
                   1430:                      (pc)
                   1431:                      (label_ref (match_operand 0 "" ""))))]
                   1432:   ""
                   1433:   "jleq %l0")
                   1434: 
                   1435: (define_insn ""
                   1436:   [(set (pc)
                   1437:        (if_then_else (gtu (cc0)
                   1438:                           (const_int 0))
                   1439:                      (pc)
                   1440:                      (label_ref (match_operand 0 "" ""))))]
                   1441:   ""
                   1442:   "jlequ %l0")
                   1443: 
                   1444: (define_insn ""
                   1445:   [(set (pc)
                   1446:        (if_then_else (lt (cc0)
                   1447:                          (const_int 0))
                   1448:                      (pc)
                   1449:                      (label_ref (match_operand 0 "" ""))))]
                   1450:   ""
                   1451:   "jgeq %l0")
                   1452: 
                   1453: (define_insn ""
                   1454:   [(set (pc)
                   1455:        (if_then_else (ltu (cc0)
                   1456:                           (const_int 0))
                   1457:                      (pc)
                   1458:                      (label_ref (match_operand 0 "" ""))))]
                   1459:   ""
                   1460:   "jgequ %l0")
                   1461: 
                   1462: (define_insn ""
                   1463:   [(set (pc)
                   1464:        (if_then_else (ge (cc0)
                   1465:                          (const_int 0))
                   1466:                      (pc)
                   1467:                      (label_ref (match_operand 0 "" ""))))]
                   1468:   ""
                   1469:   "jlss %l0")
                   1470: 
                   1471: (define_insn ""
                   1472:   [(set (pc)
                   1473:        (if_then_else (geu (cc0)
                   1474:                           (const_int 0))
                   1475:                      (pc)
                   1476:                      (label_ref (match_operand 0 "" ""))))]
                   1477:   ""
                   1478:   "jlssu %l0")
                   1479: 
                   1480: (define_insn ""
                   1481:   [(set (pc)
                   1482:        (if_then_else (le (cc0)
                   1483:                          (const_int 0))
                   1484:                      (pc)
                   1485:                      (label_ref (match_operand 0 "" ""))))]
                   1486:   ""
                   1487:   "jgtr %l0")
                   1488: 
                   1489: (define_insn ""
                   1490:   [(set (pc)
                   1491:        (if_then_else (leu (cc0)
                   1492:                           (const_int 0))
                   1493:                      (pc)
                   1494:                      (label_ref (match_operand 0 "" ""))))]
                   1495:   ""
                   1496:   "jgtru %l0")
                   1497: 
                   1498: ;; Recognize jlbs and jlbc insns.
                   1499: ;; These come before the jbc and jbs recognizers so these will be preferred.
                   1500: 
                   1501: (define_insn ""
                   1502:   [(set (pc)
                   1503:        (if_then_else
                   1504:         (ne (and:SI (match_operand:SI 0 "general_operand" "g")
                   1505:                     (const_int 1))
                   1506:             (const_int 0))
                   1507:         (label_ref (match_operand 1 "" ""))
                   1508:         (pc)))]
                   1509:   "GET_CODE (operands[0]) != MEM
                   1510:    || ! mode_dependent_address_p (XEXP (operands[0], 0))"
                   1511:   "jlbs %0,%l1")
                   1512: 
                   1513: (define_insn ""
                   1514:   [(set (pc)
                   1515:        (if_then_else
                   1516:         (eq (and:SI (match_operand:SI 0 "general_operand" "g")
                   1517:                     (const_int 1))
                   1518:             (const_int 0))
                   1519:         (label_ref (match_operand 1 "" ""))
                   1520:         (pc)))]
                   1521:   "GET_CODE (operands[0]) != MEM
                   1522:    || ! mode_dependent_address_p (XEXP (operands[0], 0))"
                   1523:   "jlbc %0,%l1")
                   1524: 
                   1525: (define_insn ""
                   1526:   [(set (pc)
                   1527:        (if_then_else
                   1528:         (ne (and:SI (match_operand:SI 0 "general_operand" "g")
                   1529:                     (const_int 1))
                   1530:             (const_int 0))
                   1531:         (pc)
                   1532:         (label_ref (match_operand 1 "" ""))))]
                   1533:   "GET_CODE (operands[0]) != MEM
                   1534:    || ! mode_dependent_address_p (XEXP (operands[0], 0))"
                   1535:   "jlbc %0,%l1")
                   1536: 
                   1537: (define_insn ""
                   1538:   [(set (pc)
                   1539:        (if_then_else
                   1540:         (eq (and:SI (match_operand:SI 0 "general_operand" "g")
                   1541:                     (const_int 1))
                   1542:             (const_int 0))
                   1543:         (pc)
                   1544:         (label_ref (match_operand 1 "" ""))))]
                   1545:   "GET_CODE (operands[0]) != MEM
                   1546:    || ! mode_dependent_address_p (XEXP (operands[0], 0))"
                   1547:   "jlbs %0,%l1")
                   1548: 
                   1549: ;; These four entries allow a jlbc or jlbs to be made
                   1550: ;; by combination with a bic.
                   1551: (define_insn ""
                   1552:   [(set (pc)
                   1553:        (if_then_else
                   1554:         (ne (and:SI (match_operand:SI 0 "general_operand" "g")
                   1555:                     (not:SI (const_int -2)))
                   1556:             (const_int 0))
                   1557:         (label_ref (match_operand 1 "" ""))
                   1558:         (pc)))]
                   1559:   "GET_CODE (operands[0]) != MEM
                   1560:    || ! mode_dependent_address_p (XEXP (operands[0], 0))"
                   1561:   "jlbs %0,%l1")
                   1562: 
                   1563: (define_insn ""
                   1564:   [(set (pc)
                   1565:        (if_then_else
                   1566:         (eq (and:SI (match_operand:SI 0 "general_operand" "g")
                   1567:                     (not:SI (const_int -2)))
                   1568:             (const_int 0))
                   1569:         (label_ref (match_operand 1 "" ""))
                   1570:         (pc)))]
                   1571:   "GET_CODE (operands[0]) != MEM
                   1572:    || ! mode_dependent_address_p (XEXP (operands[0], 0))"
                   1573:   "jlbc %0,%l1")
                   1574: 
                   1575: (define_insn ""
                   1576:   [(set (pc)
                   1577:        (if_then_else
                   1578:         (ne (and:SI (match_operand:SI 0 "general_operand" "g")
                   1579:                     (not:SI (const_int -2)))
                   1580:             (const_int 0))
                   1581:         (pc)
                   1582:         (label_ref (match_operand 1 "" ""))))]
                   1583:   "GET_CODE (operands[0]) != MEM
                   1584:    || ! mode_dependent_address_p (XEXP (operands[0], 0))"
                   1585:   "jlbc %0,%l1")
                   1586: 
                   1587: (define_insn ""
                   1588:   [(set (pc)
                   1589:        (if_then_else
                   1590:         (eq (and:SI (match_operand:SI 0 "general_operand" "g")
                   1591:                     (not:SI (const_int -2)))
                   1592:             (const_int 0))
                   1593:         (pc)
                   1594:         (label_ref (match_operand 1 "" ""))))]
                   1595:   "GET_CODE (operands[0]) != MEM
                   1596:    || ! mode_dependent_address_p (XEXP (operands[0], 0))"
                   1597:   "jlbs %0,%l1")
                   1598: 
                   1599: ;; Recognize jbs and jbc instructions.
                   1600: 
                   1601: (define_insn ""
                   1602:   [(set (pc)
                   1603:        (if_then_else
                   1604:         (ne (sign_extract:SI (match_operand:QI 0 "general_operand" "g")
                   1605:                              (const_int 1)
                   1606:                              (match_operand:SI 1 "general_operand" "g"))
                   1607:             (const_int 0))
                   1608:         (label_ref (match_operand 2 "" ""))
                   1609:         (pc)))]
                   1610:   ""
                   1611:   "jbs %1,%0,%l2")
                   1612: 
                   1613: (define_insn ""
                   1614:   [(set (pc)
                   1615:        (if_then_else
                   1616:         (eq (sign_extract:SI (match_operand:QI 0 "general_operand" "g")
                   1617:                              (const_int 1)
                   1618:                              (match_operand:SI 1 "general_operand" "g"))
                   1619:             (const_int 0))
                   1620:         (label_ref (match_operand 2 "" ""))
                   1621:         (pc)))]
                   1622:   ""
                   1623:   "jbc %1,%0,%l2")
                   1624: 
                   1625: (define_insn ""
                   1626:   [(set (pc)
                   1627:        (if_then_else
                   1628:         (ne (sign_extract:SI (match_operand:QI 0 "general_operand" "g")
                   1629:                              (const_int 1)
                   1630:                              (match_operand:SI 1 "general_operand" "g"))
                   1631:             (const_int 0))
                   1632:         (pc)
                   1633:         (label_ref (match_operand 2 "" ""))))]
                   1634:   ""
                   1635:   "jbc %1,%0,%l2")
                   1636: 
                   1637: (define_insn ""
                   1638:   [(set (pc)
                   1639:        (if_then_else
                   1640:         (eq (sign_extract:SI (match_operand:QI 0 "general_operand" "g")
                   1641:                              (const_int 1)
                   1642:                              (match_operand:SI 1 "general_operand" "g"))
                   1643:             (const_int 0))
                   1644:         (pc)
                   1645:         (label_ref (match_operand 2 "" ""))))]
                   1646:   ""
                   1647:   "jbs %1,%0,%l2")
                   1648: 
                   1649: (define_insn ""
                   1650:   [(set (pc)
                   1651:        (if_then_else
                   1652:         (ne (sign_extract:SI (match_operand:SI 0 "general_operand" "r")
                   1653:                              (const_int 1)
                   1654:                              (match_operand:SI 1 "general_operand" "g"))
                   1655:             (const_int 0))
                   1656:         (label_ref (match_operand 2 "" ""))
                   1657:         (pc)))]
                   1658:   "GET_CODE (operands[0]) != MEM
                   1659:    || ! mode_dependent_address_p (XEXP (operands[0], 0))"
                   1660:   "jbs %1,%0,%l2")
                   1661: 
                   1662: (define_insn ""
                   1663:   [(set (pc)
                   1664:        (if_then_else
                   1665:         (eq (sign_extract:SI (match_operand:SI 0 "general_operand" "r")
                   1666:                              (const_int 1)
                   1667:                              (match_operand:SI 1 "general_operand" "g"))
                   1668:             (const_int 0))
                   1669:         (label_ref (match_operand 2 "" ""))
                   1670:         (pc)))]
                   1671:   "GET_CODE (operands[0]) != MEM
                   1672:    || ! mode_dependent_address_p (XEXP (operands[0], 0))"
                   1673:   "jbc %1,%0,%l2")
                   1674: 
                   1675: (define_insn ""
                   1676:   [(set (pc)
                   1677:        (if_then_else
                   1678:         (eq (and:SI (match_operand:SI 0 "general_operand" "g")
                   1679:                     (match_operand:SI 1 "general_operand" "g"))
                   1680:             (const_int 0))
                   1681:         (pc)
                   1682:         (label_ref (match_operand 2 "" ""))))]
                   1683:   "GET_CODE (operands[1]) == CONST_INT
                   1684:    && exact_log2 (INTVAL (operands[1])) >= 0
                   1685:    && (GET_CODE (operands[0]) != MEM
                   1686:        || ! mode_dependent_address_p (XEXP (operands[0], 0)))"
                   1687:   "*
                   1688: {
                   1689:   operands[1]
                   1690:     = gen_rtx (CONST_INT, VOIDmode, exact_log2 (INTVAL (operands[1])));
                   1691:   return \"jbs %1,%0,%l2\";
                   1692: }")
                   1693: 
                   1694: (define_insn ""
                   1695:   [(set (pc)
                   1696:        (if_then_else
                   1697:         (eq (and:SI (match_operand:SI 0 "general_operand" "g")
                   1698:                     (match_operand:SI 1 "general_operand" "g"))
                   1699:             (const_int 0))
                   1700:         (label_ref (match_operand 2 "" ""))
                   1701:         (pc)))]
                   1702:   "GET_CODE (operands[1]) == CONST_INT
                   1703:    && exact_log2 (INTVAL (operands[1])) >= 0
                   1704:    && (GET_CODE (operands[0]) != MEM
                   1705:        || ! mode_dependent_address_p (XEXP (operands[0], 0)))"
                   1706:   "*
                   1707: {
                   1708:   operands[1]
                   1709:     = gen_rtx (CONST_INT, VOIDmode, exact_log2 (INTVAL (operands[1])));
                   1710:   return \"jbc %1,%0,%l2\";
                   1711: }")
                   1712: 
                   1713: (define_insn ""
                   1714:   [(set (pc)
                   1715:        (if_then_else
                   1716:         (ne (and:SI (match_operand:SI 0 "general_operand" "g")
                   1717:                     (match_operand:SI 1 "general_operand" "g"))
                   1718:             (const_int 0))
                   1719:         (pc)
                   1720:         (label_ref (match_operand 2 "" ""))))]
                   1721:   "GET_CODE (operands[1]) == CONST_INT
                   1722:    && exact_log2 (INTVAL (operands[1])) >= 0
                   1723:    && (GET_CODE (operands[0]) != MEM
                   1724:        || ! mode_dependent_address_p (XEXP (operands[0], 0)))"
                   1725:   "*
                   1726: {
                   1727:   operands[1]
                   1728:     = gen_rtx (CONST_INT, VOIDmode, exact_log2 (INTVAL (operands[1])));
                   1729:   return \"jbc %1,%0,%l2\";
                   1730: }")
                   1731: 
                   1732: (define_insn ""
                   1733:   [(set (pc)
                   1734:        (if_then_else
                   1735:         (ne (and:SI (match_operand:SI 0 "general_operand" "g")
                   1736:                     (match_operand:SI 1 "general_operand" "g"))
                   1737:             (const_int 0))
                   1738:         (label_ref (match_operand 2 "" ""))
                   1739:         (pc)))]
                   1740:   "GET_CODE (operands[1]) == CONST_INT
                   1741:    && exact_log2 (INTVAL (operands[1])) >= 0
                   1742:    && (GET_CODE (operands[0]) != MEM
                   1743:        || ! mode_dependent_address_p (XEXP (operands[0], 0)))"
                   1744:   "*
                   1745: {
                   1746:   operands[1]
                   1747:     = gen_rtx (CONST_INT, VOIDmode, exact_log2 (INTVAL (operands[1])));
                   1748:   return \"jbs %1,%0,%l2\";
                   1749: }")
                   1750: 
                   1751: (define_insn ""
                   1752:   [(set (pc)
                   1753:        (if_then_else
                   1754:         (ne (sign_extract:SI (match_operand:SI 0 "general_operand" "r")
                   1755:                              (const_int 1)
                   1756:                              (match_operand:SI 1 "general_operand" "g"))
                   1757:             (const_int 0))
                   1758:         (pc)
                   1759:         (label_ref (match_operand 2 "" ""))))]
                   1760:   "GET_CODE (operands[0]) != MEM
                   1761:    || ! mode_dependent_address_p (XEXP (operands[0], 0))"
                   1762:   "jbc %1,%0,%l2")
                   1763: 
                   1764: (define_insn ""
                   1765:   [(set (pc)
                   1766:        (if_then_else
                   1767:         (eq (sign_extract:SI (match_operand:SI 0 "general_operand" "r")
                   1768:                              (const_int 1)
                   1769:                              (match_operand:SI 1 "general_operand" "g"))
                   1770:             (const_int 0))
                   1771:         (pc)
                   1772:         (label_ref (match_operand 2 "" ""))))]
                   1773:   "GET_CODE (operands[0]) != MEM
                   1774:    || ! mode_dependent_address_p (XEXP (operands[0], 0))"
                   1775:   "jbs %1,%0,%l2")
                   1776: 
                   1777: ;; Subtract-and-jump and Add-and-jump insns.
                   1778: ;; These are not used when output is for the Unix assembler
                   1779: ;; because it does not know how to modify them to reach far.
                   1780: 
                   1781: ;; Normal sob insns.
                   1782: 
                   1783: (define_insn ""
                   1784:   [(set (pc)
                   1785:        (if_then_else
                   1786:         (gt (plus:SI (match_operand:SI 0 "general_operand" "+g")
                   1787:                      (const_int -1))
                   1788:             (const_int 0))
                   1789:         (label_ref (match_operand 1 "" ""))
                   1790:         (pc)))
                   1791:    (set (match_dup 0)
                   1792:        (plus:SI (match_dup 0)
                   1793:                 (const_int -1)))]
                   1794:   "!TARGET_UNIX_ASM"
                   1795:   "jsobgtr %0,%l1")
                   1796: 
                   1797: (define_insn ""
                   1798:   [(set (pc)
                   1799:        (if_then_else
                   1800:         (ge (plus:SI (match_operand:SI 0 "general_operand" "+g")
                   1801:                      (const_int -1))
                   1802:             (const_int 0))
                   1803:         (label_ref (match_operand 1 "" ""))
                   1804:         (pc)))
                   1805:    (set (match_dup 0)
                   1806:        (plus:SI (match_dup 0)
                   1807:                 (const_int -1)))]
                   1808:   "!TARGET_UNIX_ASM"
                   1809:   "jsobgeq %0,%l1")
                   1810: 
                   1811: ;; Reversed sob insns.
                   1812: 
                   1813: (define_insn ""
                   1814:   [(set (pc)
                   1815:        (if_then_else
                   1816:         (le (plus:SI (match_operand:SI 0 "general_operand" "+g")
                   1817:                      (const_int -1))
                   1818:             (const_int 0))
                   1819:         (pc)
                   1820:         (label_ref (match_operand 1 "" ""))))
                   1821:    (set (match_dup 0)
                   1822:        (plus:SI (match_dup 0)
                   1823:                 (const_int -1)))]
                   1824:   "!TARGET_UNIX_ASM"
                   1825:   "jsobgtr %0,%l1")
                   1826: 
                   1827: (define_insn ""
                   1828:   [(set (pc)
                   1829:        (if_then_else
                   1830:         (lt (plus:SI (match_operand:SI 0 "general_operand" "+g")
                   1831:                      (const_int -1))
                   1832:             (const_int 0))
                   1833:         (pc)
                   1834:         (label_ref (match_operand 1 "" ""))))
                   1835:    (set (match_dup 0)
                   1836:        (plus:SI (match_dup 0)
                   1837:                 (const_int -1)))]
                   1838:   "!TARGET_UNIX_ASM"
                   1839:   "jsobgeq %0,%l1")
                   1840: 
                   1841: ;; Normal aob insns.
                   1842: (define_insn ""
                   1843:   [(set (pc)
                   1844:        (if_then_else
                   1845:         (lt (compare (plus:SI (match_operand:SI 0 "general_operand" "+g")
                   1846:                               (const_int 1))
                   1847:                      (match_operand:SI 1 "general_operand" "g"))
                   1848:             (const_int 0))
                   1849:         (label_ref (match_operand 2 "" ""))
                   1850:         (pc)))
                   1851:    (set (match_dup 0)
                   1852:        (plus:SI (match_dup 0)
                   1853:                 (const_int 1)))]
                   1854:   "!TARGET_UNIX_ASM"
                   1855:   "jaoblss %1,%0,%l2")
                   1856: 
                   1857: (define_insn ""
                   1858:   [(set (pc)
                   1859:        (if_then_else
                   1860:         (le (compare (plus:SI (match_operand:SI 0 "general_operand" "+g")
                   1861:                               (const_int 1))
                   1862:                      (match_operand:SI 1 "general_operand" "g"))
                   1863:             (const_int 0))
                   1864:         (label_ref (match_operand 2 "" ""))
                   1865:         (pc)))
                   1866:    (set (match_dup 0)
                   1867:        (plus:SI (match_dup 0)
                   1868:                 (const_int 1)))]
                   1869:   "!TARGET_UNIX_ASM"
                   1870:   "jaobleq %1,%0,%l2")
                   1871: 
                   1872: ;; Reverse aob insns.
                   1873: (define_insn ""
                   1874:   [(set (pc)
                   1875:        (if_then_else
                   1876:         (ge (compare (plus:SI (match_operand:SI 0 "general_operand" "+g")
                   1877:                               (const_int 1))
                   1878:                      (match_operand:SI 1 "general_operand" "g"))
                   1879:             (const_int 0))
                   1880:         (pc)
                   1881:         (label_ref (match_operand 2 "" ""))))
                   1882:    (set (match_dup 0)
                   1883:        (plus:SI (match_dup 0)
                   1884:                 (const_int 1)))]
                   1885:   "!TARGET_UNIX_ASM"
                   1886:   "jaoblss %1,%0,%l2")
                   1887: 
                   1888: (define_insn ""
                   1889:   [(set (pc)
                   1890:        (if_then_else
                   1891:         (gt (compare (plus:SI (match_operand:SI 0 "general_operand" "+g")
                   1892:                               (const_int 1))
                   1893:                      (match_operand:SI 1 "general_operand" "g"))
                   1894:             (const_int 0))
                   1895:         (pc)
                   1896:         (label_ref (match_operand 2 "" ""))))
                   1897:    (set (match_dup 0)
                   1898:        (plus:SI (match_dup 0)
                   1899:                 (const_int 1)))]
                   1900:   "!TARGET_UNIX_ASM"
                   1901:   "jaobleq %1,%0,%l2")
                   1902: 
                   1903: ;; Something like a sob insn, but compares against -1.
                   1904: ;; This finds `while (foo--)' which was changed to `while (--foo != -1)'.
                   1905: 
                   1906: (define_insn ""
                   1907:   [(set (pc)
                   1908:        (if_then_else
                   1909:         (ne (compare (plus:SI (match_operand:SI 0 "general_operand" "g")
                   1910:                               (const_int -1))
                   1911:                      (const_int -1))
                   1912:             (const_int 0))
                   1913:         (label_ref (match_operand 1 "" ""))
                   1914:         (pc)))
                   1915:    (set (match_dup 0)
                   1916:        (plus:SI (match_dup 0)
                   1917:                 (const_int -1)))]
                   1918:   ""
                   1919:   "decl %0\;jgequ %l1")
                   1920: 
                   1921: ;; Note that operand 1 is total size of args, in bytes,
                   1922: ;; and what the call insn wants is the number of words.
                   1923: (define_insn "call"
                   1924:   [(call (match_operand:QI 0 "general_operand" "g")
                   1925:         (match_operand:QI 1 "general_operand" "g"))]
                   1926:   ""
                   1927:   "*
                   1928:   if (INTVAL (operands[1]) > 255 * 4)
                   1929:     /* Vax `calls' really uses only one byte of #args, so pop explicitly.  */
                   1930:     return \"calls $0,%0\;addl2 %1,sp\";
                   1931:   operands[1] = gen_rtx (CONST_INT, VOIDmode, (INTVAL (operands[1]) + 3)/ 4);
                   1932:   return \"calls %1,%0\";
                   1933: ")
                   1934: 
                   1935: (define_insn "call_value"
                   1936:   [(set (match_operand 0 "" "=g")
                   1937:        (call (match_operand:QI 1 "general_operand" "g")
                   1938:              (match_operand:QI 2 "general_operand" "g")))]
                   1939:   ""
                   1940:   "*
                   1941:   if (INTVAL (operands[2]) > 255 * 4)
                   1942:     /* Vax `calls' really uses only one byte of #args, so pop explicitly.  */
                   1943:     return \"calls $0,%1\;addl2 %2,sp\";
                   1944:   operands[2] = gen_rtx (CONST_INT, VOIDmode, (INTVAL (operands[2]) + 3)/ 4);
                   1945:   return \"calls %2,%1\";
                   1946: ")
                   1947: 
                   1948: (define_insn "return"
                   1949:   [(return)]
                   1950:   ""
                   1951:   "ret")
                   1952: 
                   1953: (define_insn "nop"
                   1954:   [(const_int 0)]
                   1955:   ""
                   1956:   "nop")
                   1957: 
                   1958: (define_insn "casesi"
                   1959:   [(set (pc)
                   1960:        (if_then_else (le (minus:SI (match_operand:SI 0 "general_operand" "g")
                   1961:                                    (match_operand:SI 1 "general_operand" "g"))
                   1962:                          (match_operand:SI 2 "general_operand" "g"))
                   1963:                      (plus:SI (sign_extend:SI
                   1964:                                (mem:HI (plus:SI (pc)
                   1965:                                                 (minus:SI (match_dup 0)
                   1966:                                                           (match_dup 1)))))
                   1967:                               (label_ref:SI (match_operand 3 "" "")))
                   1968:                      (pc)))]
                   1969:   ""
                   1970:   "casel %0,%1,%2")
                   1971: 
                   1972: ;; This used to arise from the preceding by simplification
                   1973: ;; if operand 1 is zero.  Perhaps it is no longer necessary.
                   1974: (define_insn ""
                   1975:   [(set (pc)
                   1976:        (if_then_else (le (match_operand:SI 0 "general_operand" "g")
                   1977:                          (match_operand:SI 1 "general_operand" "g"))
                   1978:                      (plus:SI (sign_extend:SI
                   1979:                                (mem:HI (plus:SI (pc)
                   1980:                                                 (minus:SI (match_dup 0)
                   1981:                                                           (const_int 0)))))
                   1982:                               (label_ref:SI (match_operand 3 "" "")))
                   1983:                      (pc)))]
                   1984:   ""
                   1985:   "casel %0,$0,%1")
                   1986: 
                   1987: ;; This arises from the preceding by simplification if operand 1 is zero.
                   1988: (define_insn ""
                   1989:   [(set (pc)
                   1990:        (if_then_else (le (match_operand:SI 0 "general_operand" "g")
                   1991:                          (match_operand:SI 1 "general_operand" "g"))
                   1992:                      (plus:SI (sign_extend:SI
                   1993:                                (mem:HI (plus:SI (pc)
                   1994:                                                 (match_dup 0))))
                   1995:                               (label_ref:SI (match_operand 3 "" "")))
                   1996:                      (pc)))]
                   1997:   ""
                   1998:   "casel %0,$0,%1")
                   1999: 
                   2000: ;; This arises from casesi if operand 0 is a constant, in range.
                   2001: (define_insn ""
                   2002:   [(set (pc)
                   2003:        (plus:SI (sign_extend:SI
                   2004:                  (mem:HI (plus:SI (pc)
                   2005:                                   (match_operand:SI 0 "general_operand" "g"))))
                   2006:                 (label_ref:SI (match_operand 3 "" ""))))]
                   2007:   ""
                   2008:   "casel %0,$0,%0")
                   2009: 
                   2010: ;;- load or push effective address 
                   2011: ;; These come after the move and add/sub patterns
                   2012: ;; because we don't want pushl $1 turned into pushad 1.
                   2013: ;; or addl3 r1,r2,r3 turned into movab 0(r1)[r2],r3.
                   2014: 
                   2015: (define_insn ""
                   2016:   [(set (match_operand:SI 0 "general_operand" "=g")
                   2017:        (match_operand:QI 1 "address_operand" "p"))]
                   2018:   ""
                   2019:   "*
                   2020: {
                   2021:   if (push_operand (operands[0], SImode))
                   2022:     return \"pushab %a1\";
                   2023:   return \"movab %a1,%0\";
                   2024: }")
                   2025: 
                   2026: (define_insn ""
                   2027:   [(set (match_operand:SI 0 "general_operand" "=g")
                   2028:        (match_operand:HI 1 "address_operand" "p"))]
                   2029:   ""
                   2030:   "*
                   2031: {
                   2032:   if (push_operand (operands[0], SImode))
                   2033:     return \"pushaw %a1\";
                   2034:   return \"movaw %a1,%0\";
                   2035: }")
                   2036: 
                   2037: (define_insn ""
                   2038:   [(set (match_operand:SI 0 "general_operand" "=g")
                   2039:        (match_operand:SI 1 "address_operand" "p"))]
                   2040:   ""
                   2041:   "*
                   2042: {
                   2043:   if (push_operand (operands[0], SImode))
                   2044:     return \"pushal %a1\";
                   2045:   return \"moval %a1,%0\";
                   2046: }")
                   2047: 
                   2048: (define_insn ""
                   2049:   [(set (match_operand:SI 0 "general_operand" "=g")
                   2050:        (match_operand:SF 1 "address_operand" "p"))]
                   2051:   ""
                   2052:   "*
                   2053: {
                   2054:   if (push_operand (operands[0], SImode))
                   2055:     return \"pushaf %a1\";
                   2056:   return \"movaf %a1,%0\";
                   2057: }")
                   2058: 
                   2059: (define_insn ""
                   2060:   [(set (match_operand:SI 0 "general_operand" "=g")
                   2061:        (match_operand:DF 1 "address_operand" "p"))]
                   2062:   ""
                   2063:   "*
                   2064: {
                   2065:   if (push_operand (operands[0], SImode))
                   2066:     return \"pushad %a1\";
                   2067:   return \"movad %a1,%0\";
                   2068: }")
                   2069: 
                   2070: ;; Optimize   extzv ...,z;    andl2 ...,z
                   2071: ;; with other operands constant.
                   2072: (define_peephole
                   2073:   [(set (match_operand:SI 0 "general_operand" "g")
                   2074:        (zero_extract:SI (match_operand:SI 1 "general_operand" "g")
                   2075:                         (match_operand:SI 2 "general_operand" "g")
                   2076:                         (match_operand:SI 3 "general_operand" "g")))
                   2077:    (set (match_operand:SI 4 "general_operand" "g")
                   2078:        (and:SI (match_dup 0)
                   2079:                (match_operand:SI 5 "general_operand" "g")))]
                   2080:   "GET_CODE (operands[2]) == CONST_INT
                   2081:    && GET_CODE (operands[3]) == CONST_INT
                   2082:    && (INTVAL (operands[2]) + INTVAL (operands[3])) == 32
                   2083:    && GET_CODE (operands[5]) == CONST_INT
                   2084:    && dead_or_set_p (insn, operands[0])"
                   2085:   "*
                   2086: {
                   2087:   unsigned long mask = INTVAL (operands[5]);
                   2088:   operands[3] = gen_rtx (CONST_INT, VOIDmode, -INTVAL (operands[3]));
                   2089: 
                   2090:   if ((floor_log2 (mask) + 1) >= INTVAL (operands[2]))
                   2091:     mask &= ((1 << INTVAL (operands[2])) - 1);
                   2092: 
                   2093:   operands[5] = gen_rtx (CONST_INT, VOIDmode, ~mask);
                   2094:   if (push_operand (operands[4], SImode))
                   2095:     {
                   2096:       output_asm_insn (\"rotl %3,%1,%0\", operands);
                   2097:       return \"bicl3 %5,%0,%4\";
                   2098:     }
                   2099:   else
                   2100:     {
                   2101:       output_asm_insn (\"rotl %3,%1,%4\", operands);
                   2102:       return \"bicl2 %5,%4\";
                   2103:     }
                   2104: }")
                   2105: 
                   2106: ;; Optimize   andl3 x,y,z; extzv z,....,z
                   2107: 
                   2108: (define_peephole
                   2109:   [(set (match_operand:SI 0 "general_operand" "g")
                   2110:        (and:SI (match_operand:SI 1 "general_operand" "g")
                   2111:                (match_operand:SI 2 "general_operand" "g")))
                   2112:    (set (match_operand 3 "general_operand" "g")
                   2113:        (zero_extract:SI (match_dup 0)
                   2114:                         (match_operand:SI 4 "general_operand" "g")
                   2115:                         (match_operand:SI 5 "general_operand" "g")))]
                   2116:   "GET_CODE (operands[2]) == CONST_INT
                   2117:    && GET_CODE (operands[4]) == CONST_INT
                   2118:    && GET_CODE (operands[5]) == CONST_INT
                   2119:    && (INTVAL (operands[4]) + INTVAL (operands[5])) == 32
                   2120:    && dead_or_set_p (insn, operands[0])"
                   2121:   "*
                   2122: {
                   2123:   unsigned long mask = INTVAL (operands[2]);
                   2124: 
                   2125:   mask &= ~((1 << INTVAL (operands[5])) - 1);
                   2126:   operands[2] = gen_rtx (CONST_INT, VOIDmode, ~mask);
                   2127: 
                   2128:   operands[5] = gen_rtx (CONST_INT, VOIDmode, -INTVAL (operands[5]));
                   2129: 
                   2130:   if (rtx_equal_p (operands[0], operands[1]))
                   2131:     output_asm_insn (\"bicl2 %2,%0\", operands);
                   2132:   else
                   2133:     output_asm_insn (\"bicl3 %2,%1,%0\", operands);
                   2134:   return \"rotl %5,%0,%3\";
                   2135: }")
                   2136: 
                   2137: ;;- Local variables:
                   2138: ;;- mode:emacs-lisp
                   2139: ;;- comment-start: ";;- "
                   2140: ;;- eval: (set-syntax-table (copy-sequence (syntax-table)))
                   2141: ;;- eval: (modify-syntax-entry ?[ "(]")
                   2142: ;;- eval: (modify-syntax-entry ?] ")[")
                   2143: ;;- eval: (modify-syntax-entry ?{ "(}")
                   2144: ;;- eval: (modify-syntax-entry ?} "){")
                   2145: ;;- End:

unix.superglobalmegacorp.com

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