Annotation of gcc/config/tahoe.md, revision 1.1.1.3

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

unix.superglobalmegacorp.com

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