Annotation of gcc/config/1750a/1750a.md, revision 1.1.1.1

1.1       root        1: ;;- Machine description for GNU compiler
                      2: ;;- MIL-STD-1750A version.
                      3: ;; Copyright (C) 1994 Free Software Foundation, Inc.
                      4: ;; Contributed by O.M.Kellogg, DASA ([email protected]).
                      5: 
                      6: ;; This file is part of GNU CC.
                      7: 
                      8: ;; GNU CC is free software; you can redistribute it and/or modify
                      9: ;; it under the terms of the GNU General Public License as published by
                     10: ;; the Free Software Foundation; either version 1, or (at your option)
                     11: ;; any later version.
                     12: 
                     13: ;; GNU CC is distributed in the hope that it will be useful,
                     14: ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
                     15: ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     16: ;; GNU General Public License for more details.
                     17: 
                     18: ;; You should have received a copy of the GNU General Public License
                     19: ;; along with GNU CC; see the file COPYING.  If not, write to
                     20: ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
                     21: 
                     22: 
                     23: ;;- instruction definitions
                     24: 
                     25: ;;- See file "rtl.def" for documentation on define_insn, match_*, et. al.
                     26: 
                     27: ;;- When naming insn's (operand 0 of define_insn) be careful about using
                     28: ;;- names from other targets machine descriptions.
                     29: 
                     30: ;; MIL-STD-1750 specific remarks:
                     31: ;;
                     32: ;; 1) BITS_PER_UNIT = 16
                     33: ;;
                     34: ;; 2) GCC   to    MIL-STD-1750       data type mappings:
                     35: ;;    QImode => single integer (16 bits or 1 reg).
                     36: ;;    HImode => double integer (32 bits or 2 regs).
                     37: ;;    HFmode => single precision float (32 bits or 2 regs).
                     38: ;;    TQFmode => extended precision float (48 bits or 3 regs).
                     39: ;; 
                     40: ;; 3) Immediate integer operands Constraints:
                     41: ;;    'I'  1 .. 16
                     42: ;;    'J' -1 ..-16
                     43: ;;    'K'  0 .. 15
                     44: ;;    'L'  0 .. 255
                     45: ;;    'M' -32768 .. 32767
                     46: ;;    'O' => 0  (for optimizations and GCC quirks)
                     47: ;;
                     48: ;; Further notes:
                     49: ;;-  Assembly output ending in ".M" are macros in file M1750.INC
                     50: 
                     51: 
                     52: ;; stackpush
                     53: (define_insn ""
                     54:   [(set (match_operand:QI 0 "push_operand" "=<")
                     55:         (match_operand:QI 1 "general_operand" "r"))]
                     56:   ""
                     57:   "pshm r%1,r%1")
                     58: 
                     59: (define_insn ""
                     60:   [(set (match_operand:HI 0 "push_operand" "=<")
                     61:         (match_operand:HI 1 "general_operand" "r"))]
                     62:   ""
                     63:   "*
                     64:    { 
                     65:         rtx new_operands[2];
                     66:         new_operands[0] = operands[1];
                     67:         new_operands[1] = gen_rtx(CONST_INT,VOIDmode,REGNO(operands[1])+1);
                     68:    } ")
                     69: 
                     70: (define_insn ""
                     71:   [(set (match_operand:HF 0 "push_operand" "=<")
                     72:         (match_operand:HF 1 "general_operand" "r"))]
                     73:   ""
                     74:   "*
                     75:   { 
                     76:         rtx new_operands[2];
                     77:         new_operands[0] = operands[1];
                     78:         new_operands[1] = gen_rtx(CONST_INT,VOIDmode,REGNO(operands[1])+1);
                     79:         output_asm_insn(\"pshm r%0,r%1\",new_operands);
                     80:         return \"\;\";
                     81:    } ")
                     82: 
                     83: (define_insn ""
                     84:   [(set (match_operand:TQF 0 "push_operand" "=<")
                     85:         (match_operand:TQF 1 "general_operand" "r"))]
                     86:   ""
                     87:   "*
                     88:    { 
                     89:         rtx new_operands[2];
                     90:         new_operands[0] = operands[1];
                     91:         new_operands[1] = gen_rtx(CONST_INT,VOIDmode,REGNO(operands[1])+2);
                     92:         output_asm_insn(\"pshm r%0,r%1\",new_operands);
                     93:         return \"\;\";
                     94:    } ")
                     95: 
                     96: ;; stackpop
                     97: (define_insn ""
                     98:   [(set (match_operand:QI 0 "general_operand" "=r")
                     99:         (match_operand:QI 1 "push_operand" ">"))]
                    100:   ""
                    101:   "popm r%1,r%1")
                    102: 
                    103: (define_insn ""
                    104:   [(set (match_operand:HI 0 "general_operand" "=r")
                    105:         (match_operand:HI 1 "push_operand" ">"))]
                    106:   ""
                    107:   "*
                    108:    { 
                    109:         rtx new_operands[2];
                    110:         new_operands[0] = operands[0];
                    111:         new_operands[1] = gen_rtx(CONST_INT,VOIDmode,REGNO(operands[0])+1);
                    112:         output_asm_insn(\"popm r%0,r%1\",new_operands);
                    113:         return \"\;\";
                    114:    } ")
                    115: 
                    116: (define_insn ""
                    117:   [(set (match_operand:HF 0 "general_operand" "=r")
                    118:         (match_operand:HF 1 "push_operand" ">"))]
                    119:   ""
                    120:   "*
                    121:    { 
                    122:         rtx new_operands[2];
                    123:         new_operands[0] = operands[0];
                    124:         new_operands[1] = gen_rtx(CONST_INT,VOIDmode,REGNO(operands[0])+1);
                    125:         output_asm_insn(\"popm r%0,r%1\",new_operands);
                    126:         return \"\;\";
                    127:    } ")
                    128: 
                    129: (define_insn ""
                    130:   [(set (match_operand:TQF 0 "general_operand" "=r")
                    131:         (match_operand:TQF 1 "push_operand" ">"))]
                    132:   ""
                    133:   "*
                    134:    { 
                    135:         rtx new_operands[2];
                    136:         new_operands[0] = operands[0];
                    137:         new_operands[1] = gen_rtx(CONST_INT,VOIDmode,REGNO(operands[0])+2);
                    138:         output_asm_insn(\"popm r%0,r%1\",new_operands);
                    139:         return \"\;\";
                    140:    } ")
                    141: 
                    142: ;; Test operations. These shouldn't really occur for 1750:
                    143: ;; all important instructions set the cc's (see NOTICE_UPDATE_CC)
                    144: 
                    145: (define_insn "tstqi"
                    146:   [(set (cc0)
                    147:         (match_operand:QI 0 "register_operand" "r"))]
                    148:   ""
                    149:   "lr r%0,r%0   ; from tstqi")
                    150: 
                    151: (define_insn "tsthi"
                    152:   [(set (cc0)
                    153:         (match_operand:HI 0 "register_operand" "r"))]
                    154:   ""
                    155:   "dlr r%0,r%0   ; from tsthi")
                    156: 
                    157: (define_insn "tsthf"
                    158:   [(set (cc0)
                    159:         (match_operand:HF 0 "register_operand" "r"))]
                    160:   ""
                    161:   "dlr r%0,r%0   ; from tsthf")
                    162: 
                    163: ;; This one is happy with "roughly zero" :-)  (should be improved)
                    164: (define_insn "tsttqf"
                    165:   [(set (cc0)
                    166:         (match_operand:TQF 0 "register_operand" "r"))]
                    167:   ""
                    168:   "dlr r%0,r%0   ; from tsttqf")
                    169: 
                    170: 
                    171: ;; block move.
                    172: 
                    173: ; there is a problem with this insn in gcc-2.2.3
                    174: ; (clobber (match_dup 2)) does not prevent use of this operand later
                    175: ;
                    176: (define_insn "movstrqi"
                    177:   [(set (mem:BLK (match_operand:QI 0 "register_operand" "r"))
                    178:        (mem:BLK (match_operand:QI 1 "register_operand" "r")))
                    179:    (use (match_operand:QI 2 "register_operand" "r"))
                    180:    (use (match_operand:QI 3 "immediate_operand" ""))
                    181:    (clobber (match_dup 0))
                    182:    (clobber (match_dup 1))
                    183:    (clobber (match_dup 2))]
                    184:   ""
                    185:   "* return (char *)movcnt_regno_adjust(operands); ")
                    186: 
                    187: 
                    188: ;; compare instructions.
                    189: 
                    190: (define_insn "cmpqi"
                    191:   [(set (cc0)
                    192:         (compare (match_operand:QI 0 "register_operand" "r,r,r,r,r")
                    193:                  (match_operand:QI 1 "general_operand"  "I,J,i,r,m")))]
                    194:   ""
                    195:   "@
                    196:      cisp r%0,%1
                    197:      cisn r%0,%J1
                    198:      cim  r%0,%1
                    199:      cr   r%0,r%1
                    200:      c    r%0,%1 ")
                    201: 
                    202: (define_insn "cmphi"
                    203:   [(set (cc0)
                    204:         (compare (match_operand:HI 0 "general_operand" "r,r")
                    205:                  (match_operand:HI 1 "general_operand" "r,m")))]
                    206:   ""
                    207:   "@
                    208:     dcr r%0,r%1
                    209:     dc  r%0,%1 ")
                    210: 
                    211: (define_insn "cmphf"
                    212:  [(set (cc0)
                    213:        (compare (match_operand:HF 0 "general_operand" "r,r")
                    214:                 (match_operand:HF 1 "general_operand" "r,m")))]
                    215:  ""
                    216:  "@
                    217:    fcr r%0,r%1
                    218:    fc  r%0,%1 ")
                    219: 
                    220: (define_insn "cmptqf"
                    221:   [(set (cc0)
                    222:         (compare (match_operand:TQF 0 "general_operand" "r,r")
                    223:                  (match_operand:TQF 1 "general_operand" "r,m")))]
                    224:   ""
                    225:   "@
                    226:     efcr r%0,r%1
                    227:     efc  r%0,%1 ")
                    228: 
                    229: 
                    230: ;; truncation instructions
                    231: ;;- 1750: any needed?
                    232: 
                    233: (define_insn "trunchiqi2"
                    234:   [(set (match_operand:QI 0 "register_operand" "=r")
                    235:         (truncate:QI
                    236:          (match_operand:HI 1 "register_operand" "r")))]
                    237:   ""
                    238:   "*
                    239:      {
                    240:         REGNO(operands[1]) += 1;
                    241:         return \"lr r%0,r%1  ;trunchiqi2\";
                    242:      } ")
                    243: 
                    244: ;; zero extension instructions
                    245: 
                    246: (define_insn "zero_extendqihi2"
                    247:   [(set (match_operand:HI 0 "register_operand" "=r,r,r")
                    248:         (zero_extend:HI (match_operand:QI 1 "general_operand" "r,m,i")))]
                    249:   ""
                    250:   "*
                    251:       {
                    252:         output_asm_insn(\"xorr r%0,r%0   ;zero_extendqihi2\",operands);
                    253:         REGNO(operands[0]) += 1;
                    254:         switch (which_alternative)
                    255:           {
                    256:             case 0:
                    257:               return \"lr  r%0,r%1\";
                    258:             case 1:
                    259:               return \"l   r%0,%1\";
                    260:             case 2:
                    261:               return \"lim r%0,%1\";
                    262:           }
                    263:       } ")
                    264: 
                    265: ;; sign extension instructions
                    266: 
                    267: (define_insn "extendqihi2"
                    268:   [(set (match_operand:HI 0 "register_operand" "=r,r,r")
                    269:         (sign_extend:HI (match_operand:QI 1 "general_operand" "r,m,i")) )]
                    270:   ""
                    271:   "@
                    272:     lr  r%0,r%1 ;extendqihi2\;dsra r%0,16
                    273:     l   r%0,%1  ;extendqihi2\;dsra r%0,16
                    274:     lim r%0,%1  ;extendqihi2\;dsra r%0,16 ")
                    275: 
                    276: 
                    277: ;; Conversions between float and double.
                    278: 
                    279: ; 1750 HF-to-TQF extend: just append 16 bits (least signif.) with all bits zero
                    280: (define_insn "extendhftqf2"
                    281:   [(set (match_operand:TQF 0 "register_operand" "=r,r")
                    282:         (float_extend:TQF
                    283:          (match_operand:HF 1 "general_operand" "r,m")))]
                    284:   ""
                    285:   "*
                    286:       {
                    287:         REGNO(operands[0]) += 2;
                    288:         output_asm_insn(\"xorr r%0,r%0   ;extendhftqf2\",operands);
                    289:         REGNO(operands[0]) -= 2;
                    290:         if (which_alternative == 0)
                    291:           return \"dlr r%0,r%1\";
                    292:         else
                    293:           return \"dl  r%0,%1\";
                    294:       } ")
                    295: 
                    296: ; 1750 TQF-to-HF truncate is a no-op: just leave away the least signif. 16 bits
                    297: (define_insn "trunctqfhf2"
                    298:   [(set (match_operand:HF 0 "register_operand" "=r,r")
                    299:         (float_truncate:HF
                    300:           (match_operand:TQF 1 "general_operand" "r,m")))]
                    301:   ""
                    302:   "@
                    303:      dlr r%0,r%1  ;trunctqfhf2
                    304:      dl  r%0,%1   ;trunctqfhf2 ")
                    305: 
                    306: 
                    307: ;; Conversion between fixed point and floating point.
                    308: 
                    309: (define_insn "floatqihf2"
                    310:   [(set           (match_operand:HF 0 "register_operand" "=r")
                    311:         (float:HF (match_operand:QI 1 "register_operand" "r")))]
                    312:   ""
                    313:   "flt r%0,r%1")
                    314: 
                    315: (define_insn "floathitqf2"
                    316:   [(set           (match_operand:TQF 0 "register_operand" "=r")
                    317:         (float:TQF (match_operand:HI 1 "register_operand" "r")))]
                    318:   ""
                    319:   "eflt r%0,r%1")
                    320: 
                    321: 
                    322: ;; Convert floats to ints
                    323: 
                    324: (define_insn "fix_trunchfqi2"
                    325:   [(set                 (match_operand:QI 0 "register_operand" "=r")
                    326:         (fix:QI (fix:HF (match_operand:HF 1 "register_operand" "r"))))]
                    327:   ""
                    328:   "fix r%0,r%1")
                    329: 
                    330: (define_insn "fix_trunctqfhi2"
                    331:   [(set                 (match_operand:HI 0 "register_operand" "=r")
                    332:         (fix:HI (fix:TQF (match_operand:TQF 1 "register_operand" "r"))))]
                    333:   ""
                    334:   "efix r%0,r%1")
                    335: 
                    336: 
                    337: ;; Move instructions
                    338: 
                    339: ;; We can't deal with normal byte-size characters, only with WIDE characters!
                    340: ;; This may appear as a serious restriction, but it also opens the doors
                    341: ;; for ISO 10646  :-)
                    342: 
                    343: ;; 16-bit moves
                    344: 
                    345: (define_insn "movqi"
                    346:   [(set (match_operand:QI 0 "general_operand" "=r,r,r,r,r,r,r,m,m")
                    347:         (match_operand:QI 1 "general_operand"  "O,I,J,M,i,r,m,r,K"))]
                    348:   ""
                    349:   "@
                    350:      xorr r%0,r%0
                    351:      lisp r%0,%1
                    352:      lisn r%0,%J1
                    353:      lim  r%0,%1  ; 'M' constraint
                    354:      lim  r%0,%1  ; 'i' constraint
                    355:      lr   r%0,r%1
                    356:      l    r%0,%1
                    357:      st   r%1,%0
                    358:      stc  %1,%0   ")
                    359: 
                    360: ;; 32-bit moves
                    361: 
                    362: ;; Set HIreg to constant
                    363: (define_insn ""
                    364:   [(set (match_operand:HI 0 "register_operand" "=r")
                    365:         (match_operand    1 "immediate_operand" "i"))]
                    366:   ""
                    367:   "*
                    368:     if (GET_CODE(operands[1]) == CONST_INT)
                    369:       {
                    370:         int val = INTVAL(operands[1]);
                    371:         if (val >= 0)
                    372:           {
                    373:             if (val <= 65535)
                    374:               {
                    375:                 output_asm_insn(\"xorr   r%0,r%0 ;movhi cst->reg\",operands);
                    376:                 operands[0] = gen_rtx(REG,QImode,REGNO(operands[0]) + 1);
                    377:                 if (val == 0)
                    378:                   return \"xorr r%0,r%0\";
                    379:                 else if (val <= 16)
                    380:                   return \"lisp r%0,%1\";
                    381:                 else
                    382:                   return \"lim  r%0,%1\";
                    383:               }
                    384:           }
                    385:         else if (val >= -16)
                    386:           return \"lisn r%0,%J1\;dsra r%0,16 ;movhi cst\";
                    387:         INTVAL(operands[1]) >>= 16;
                    388:         output_asm_insn(\"lim r%0,%1 ;movhi cst->reg\",operands);
                    389:         REGNO(operands[0]) += 1;
                    390:         INTVAL(operands[1]) = val & 0xFFFF;
                    391:         return \"lim r%0,%1\";
                    392:       }
                    393:     return \"lim r%0,%1\;dsra r%0,16 ;movhi cst\";
                    394:   ")
                    395: 
                    396: (define_insn "movhi"
                    397:   [(set (match_operand:HI 0 "general_operand" "=r,r,m")
                    398:         (match_operand:HI 1 "general_operand"  "r,m,r"))]
                    399:   ""
                    400:   "@
                    401:     dlr r%0,r%1
                    402:     dl  r%0,%1
                    403:     dst r%1,%0 ")
                    404: 
                    405: 
                    406: ;; Single-Float moves are *same* as HImode moves:
                    407: 
                    408: ;(define_insn "movhf"
                    409: ;  [(set (match_operand:HF 0 "general_operand" "=r,r,r,m")
                    410: ;        (match_operand:HF 1 "general_operand"  "F,r,m,r"))]
                    411: ;  ""
                    412: ;  "@
                    413: ;    %D1\;dl r%0,%F1
                    414: ;    dlr r%0,r%1
                    415: ;    dl  r%0,%1
                    416: ;    dst r%1,%0 ")
                    417: 
                    418: (define_insn "movhf"
                    419:   [(set (match_operand:HF 0 "general_operand" "=r,r,m")
                    420:         (match_operand:HF 1 "general_operand"  "r,m,r"))]
                    421:   ""
                    422:   "@
                    423:     dlr r%0,r%1
                    424:     dl  r%0,%1
                    425:     dst r%1,%0 ")
                    426: 
                    427: 
                    428: ;; Longfloat moves
                    429: 
                    430: ;(define_insn "movtqf"
                    431: ;  [(set (match_operand:TQF 0 "general_operand" "=r,r,r,m")
                    432: ;        (match_operand:TQF 1 "general_operand"  "F,r,m,r"))]
                    433: ;  ""
                    434: ;  "@
                    435: ;    %E1\;efl r%0,%G1
                    436: ;    eflr.m %0,%1
                    437: ;    efl  r%0,%1
                    438: ;    efst r%1,%0 ")
                    439: 
                    440: (define_insn "movtqf"
                    441:   [(set (match_operand:TQF 0 "general_operand" "=r,r,m")
                    442:         (match_operand:TQF 1 "general_operand"  "r,m,r"))]
                    443:   ""
                    444:   "@
                    445:     eflr.m %0,%1
                    446:     efl  r%0,%1
                    447:     efst r%1,%0 ")
                    448: 
                    449: 
                    450: ;; add instructions 
                    451: 
                    452: ;; single integer
                    453: 
                    454: ;; Use "LIM Ra,sym,Rb" for adding a symbol value to a register and
                    455: ;; transferring the result to a different register.
                    456: ;(define_insn ""
                    457: ;  [(set (match_operand:QI 0 "register_operand" "=r")
                    458: ;        (plus:QI (match_operand:QI 1 "register_operand" "b")
                    459: ;                 (match_operand:QI 2 "immediate_operand"  "i")))]
                    460: ;   "REGNO(operands[0]) != REGNO(operands[1])"
                    461: ;   "lim r%0,%2,r%1 ;md special addqi")
                    462: 
                    463: (define_insn "addqi3"
                    464:   [(set (match_operand:QI 0 "general_operand" "=r,r,r,r,r,m,m")
                    465:         (plus:QI (match_operand:QI 1 "general_operand" "%0,0,0,0,0,0,0")
                    466:                  (match_operand:QI 2 "general_operand"  "I,J,i,r,m,I,J")))]
                    467:   ""
                    468:   "*
                    469:     switch (which_alternative)
                    470:       {
                    471:         case 0:
                    472:           return \"aisp r%0,%2\";
                    473:         case 1:
                    474:           return \"sisp r%0,%J2\";
                    475:         case 2:
                    476:           if (INTVAL(operands[2]) < 0)
                    477:             return \"sim r%0,%J2\";
                    478:           else
                    479:             return \"aim r%0,%2\";
                    480:         case 3:
                    481:           return \"ar r%0,r%2\";
                    482:         case 4:
                    483:           return \"a r%0,%2\";
                    484:         case 5:
                    485:           return \"incm %2,%0\";
                    486:         case 6:
                    487:           return \"decm %J2,%0\";
                    488:       } ")
                    489: 
                    490: ;; double integer
                    491: (define_insn "addhi3"
                    492:   [(set (match_operand:HI 0 "register_operand" "=r,r")
                    493:         (plus:HI (match_operand:HI 1 "register_operand" "%0,0")
                    494:                  (match_operand:HI 2 "general_operand" "r,m")))]
                    495:   ""
                    496:   "@
                    497:     dar r%0,r%2
                    498:     da  r%0,%2 ")
                    499: 
                    500: (define_insn "addhf3"
                    501:   [(set (match_operand:HF 0 "register_operand" "=r,r")
                    502:         (plus:HF (match_operand:HF 1 "register_operand" "%0,0")
                    503:                  (match_operand:HF 2 "general_operand" "m,r")))]
                    504:   ""
                    505:   "@
                    506:     fa  r%0,%2
                    507:     far r%0,r%2 ")
                    508: 
                    509: (define_insn "addtqf3"
                    510:   [(set (match_operand:TQF 0 "register_operand" "=r,r")
                    511:         (plus:TQF (match_operand:TQF 1 "register_operand" "%0,0")
                    512:                  (match_operand:TQF 2 "general_operand" "m,r")))]
                    513:   ""
                    514:   "@
                    515:     efa  r%0,%2
                    516:     efar r%0,r%2 ")
                    517: 
                    518: 
                    519: ;; subtract instructions
                    520: 
                    521: ;; single integer
                    522: (define_insn "subqi3"
                    523:   [(set (match_operand:QI 0 "general_operand" "=r,r,r,r,m")
                    524:         (minus:QI (match_operand:QI 1 "general_operand" "0,0,0,0,0")
                    525:                   (match_operand:QI 2 "general_operand"  "I,i,r,m,I")))]
                    526:   ""
                    527:   "@
                    528:     sisp r%0,%2
                    529:     sim  r%0,%2
                    530:     sr   r%0,r%2
                    531:     s    r%0,%2
                    532:     decm %2,%0 ")
                    533: 
                    534: ;; double integer
                    535: (define_insn "subhi3"
                    536:   [(set (match_operand:HI 0 "register_operand" "=r,r")
                    537:         (minus:HI (match_operand:HI 1 "register_operand" "0,0")
                    538:                   (match_operand:HI 2 "general_operand" "r,m")))]
                    539:   ""
                    540:   "@
                    541:     dsr r%0,r%2
                    542:     ds  r%0,%2 ")
                    543: 
                    544: (define_insn "subhf3"
                    545:   [(set (match_operand:HF 0 "register_operand" "=r,r")
                    546:         (minus:HF (match_operand:HF 1 "register_operand" "0,0")
                    547:                   (match_operand:HF 2 "general_operand" "r,m")))]
                    548:   ""
                    549:   "@
                    550:     fsr r%0,r%2
                    551:     fs  r%0,%2 ")
                    552: 
                    553: (define_insn "subtqf3"
                    554:   [(set (match_operand:TQF 0 "register_operand" "=r,r")
                    555:         (minus:TQF (match_operand:TQF 1 "register_operand" "0,0")
                    556:                   (match_operand:TQF 2 "general_operand" "r,m")))]
                    557:   ""
                    558:   "@
                    559:     efsr r%0,r%2
                    560:     efs  r%0,%2 ")
                    561: 
                    562: 
                    563: ;; multiply instructions
                    564: 
                    565: (define_insn "mulqi3"
                    566:   [(set (match_operand:QI 0 "register_operand" "=r,r,r,r,r")
                    567:         (mult:QI (match_operand:QI 1 "register_operand" "%0,0,0,0,0")
                    568:                  (match_operand:QI 2 "general_operand"  "I,J,M,r,m")))]
                    569:   ""
                    570:   "@
                    571:      misp r%0,%2
                    572:      misn r%0,%J2
                    573:      msim r%0,%2
                    574:      msr  r%0,r%2
                    575:      ms   r%0,%2  ")
                    576: 
                    577: 
                    578: ; 32-bit product
                    579: (define_insn "mulqihi3"
                    580:   [(set (match_operand:HI 0 "register_operand" "=r,r,r")
                    581:         (mult:HI (match_operand:QI 1 "register_operand" "%0,0,0")
                    582:                  (match_operand:QI 2 "general_operand" "M,r,m")))]
                    583:   ""
                    584:   "@
                    585:     mim r%0,%1
                    586:     mr  r%0,r%2
                    587:     m   r%0,%2 ")
                    588: 
                    589: (define_insn "mulhi3"
                    590:   [(set (match_operand:HI 0 "register_operand" "=r,r")
                    591:         (mult:HI (match_operand:HI 1 "register_operand" "%0,0")
                    592:                  (match_operand:HI 2 "general_operand" "r,m")))]
                    593:   ""
                    594:   "@
                    595:     dmr r%0,r%2
                    596:     dm  r%0,%2 ")
                    597: 
                    598: ; not available on 1750: "umulhi3","umulhisi3","umulsi3" (unsigned multiply's)
                    599: 
                    600: (define_insn "mulhf3"
                    601:   [(set (match_operand:HF 0 "register_operand" "=r,r")
                    602:         (mult:HF (match_operand:HF 1 "register_operand" "%0,0")
                    603:                  (match_operand:HF 2 "general_operand" "r,m")))]
                    604:   ""
                    605:   "@
                    606:     fmr r%0,r%2
                    607:     fm  r%0,%2 ")
                    608: 
                    609: (define_insn "multqf3"
                    610:   [(set (match_operand:TQF 0 "register_operand" "=r,r")
                    611:         (mult:TQF (match_operand:TQF 1 "register_operand" "%0,0")
                    612:                  (match_operand:TQF 2 "general_operand" "r,m")))]
                    613:   ""
                    614:   "@
                    615:     efmr r%0,r%2
                    616:     efm  r%0,%2 ")
                    617: 
                    618: 
                    619: ;; divide instructions
                    620: ;; The 1750 16bit integer division instructions deliver a 16-bit
                    621: ;; quotient and a 16-bit remainder, where the remainder is in the next higher
                    622: ;; register number above the quotient. For now, we haven't found a way
                    623: ;; to give the reload pass knowledge of this property. So we make do with
                    624: ;; whatever registers the allocator wants, and willy-nilly output a pair of
                    625: ;; register-copy ops when needed. (See mod_regno_adjust() in file aux-output.c)
                    626: ;; A comment in the description of `divmodM4' suggests that one leave the divM3
                    627: ;; undefined when there is a divmodM4 available.
                    628: 
                    629: (define_insn "divmodqi4"
                    630:   [(set (match_operand:QI 0 "register_operand" "=r,r,r,r,r")
                    631:         (div:QI (match_operand:QI 1 "register_operand" "0,0,0,0,0")
                    632:                 (match_operand:QI 2 "general_operand"  "I,J,M,r,m")))
                    633:    (set (match_operand:QI 3 "register_operand" "=r,r,r,r,r")
                    634:         (mod:QI (match_dup 1) (match_dup 2)))]
                    635:   ""
                    636:   "*
                    637:    {
                    638:      char *istr;
                    639:      switch(which_alternative)
                    640:        {
                    641:        case 0:
                    642:          istr = \"disp\";
                    643:          break;
                    644:        case 1:
                    645:          INTVAL(operands[2]) = - INTVAL(operands[2]); /* to be corrected */
                    646:          istr = \"disn\";
                    647:          break;
                    648:        case 2:
                    649:          istr = \"dvim\";
                    650:          break;
                    651:        case 3:
                    652:          istr = \"dvr \";
                    653:          break;
                    654:        case 4:
                    655:          istr = \"dv  \";
                    656:          break;
                    657:       }
                    658:       return (char *)mod_regno_adjust(istr,operands);
                    659:      }")
                    660: 
                    661: ;; Division for other types is straightforward.
                    662: 
                    663: (define_insn "divhi3"
                    664:   [(set (match_operand:HI 0 "register_operand" "=r,r")
                    665:         (div:HI (match_operand:HI 1 "register_operand" "0,0")
                    666:                 (match_operand:HI 2 "general_operand" "r,m")))]
                    667:   ""
                    668:   "@
                    669:     ddr r%0,r%2
                    670:     dd  r%0,%2 ")
                    671: 
                    672: (define_insn "divhf3"
                    673:   [(set (match_operand:HF 0 "register_operand" "=r,r")
                    674:         (div:HF (match_operand:HF 1 "register_operand" "0,0")
                    675:                 (match_operand:HF 2 "general_operand" "r,m")))]
                    676:   ""
                    677:   "@
                    678:     fdr r%0,r%2
                    679:     fd  r%0,%2 ")
                    680: 
                    681: (define_insn "divtqf3"
                    682:   [(set (match_operand:TQF 0 "register_operand" "=r,r")
                    683:         (div:TQF (match_operand:TQF 1 "register_operand" "0,0")
                    684:                 (match_operand:TQF 2 "general_operand" "r,m")))]
                    685:   ""
                    686:   "@
                    687:     efdr r%0,r%2
                    688:     efd  r%0,%2 ")
                    689: 
                    690: 
                    691: ;; Other arithmetic instructions:
                    692: 
                    693: ;; Absolute value
                    694: 
                    695: (define_insn "absqi2"
                    696:   [(set (match_operand:QI 0 "register_operand" "=r")
                    697:         (abs:QI (match_operand:QI 1 "register_operand" "r")))]
                    698:   ""
                    699:   "abs r%0,r%1")
                    700: 
                    701: (define_insn "abshi2"
                    702:   [(set (match_operand:HI 0 "register_operand" "=r")
                    703:         (abs:HI (match_operand:HI 1 "register_operand" "r")))]
                    704:   ""
                    705:   "dabs r%0,r%1")
                    706: 
                    707: (define_insn "abshf2"
                    708:   [(set (match_operand:HF 0 "register_operand" "=r")
                    709:         (abs:HF (match_operand:HF 1 "register_operand" "r")))]
                    710:   ""
                    711:   "fabs r%0,r%1")
                    712: 
                    713: 
                    714: ;; Negation
                    715: 
                    716: (define_insn "negqi2"
                    717:   [(set (match_operand:QI 0 "register_operand" "=r")
                    718:         (neg:QI (match_operand:QI 1 "register_operand" "r")))]
                    719:   ""
                    720:   "neg r%0,r%1")
                    721: 
                    722: (define_insn "neghi2"
                    723:   [(set (match_operand:HI 0 "register_operand" "=r")
                    724:         (neg:HI (match_operand:HI 1 "register_operand" "r")))]
                    725:   ""
                    726:   "dneg r%0,r%1")
                    727: 
                    728: (define_insn "neghf2"
                    729:   [(set (match_operand:HF 0 "register_operand" "=r")
                    730:         (neg:HF (match_operand:HF 1 "register_operand" "r")))]
                    731:   ""
                    732:   "fneg r%0,r%1")
                    733: 
                    734: ; The 1750A does not have an extended float negate instruction, so simulate.
                    735: (define_expand "negtqf2"
                    736:   [(set (match_operand:TQF 0 "register_operand" "=&r")
                    737:         (neg:TQF (match_operand:TQF 1 "register_operand" "r")))]
                    738:   ""
                    739:   "
                    740:    emit_insn(gen_rtx(SET,VOIDmode,operands[0],CONST0_RTX(TQFmode)));
                    741:    emit_insn(gen_rtx(SET,VOIDmode,operands[0],
                    742:              gen_rtx(MINUS,TQFmode,operands[0],operands[1])));
                    743:    DONE;
                    744:   ")
                    745: 
                    746: 
                    747: ;; bit-logical instructions
                    748: 
                    749: ;; AND
                    750: 
                    751: (define_insn "andqi3"
                    752:   [(set (match_operand:QI 0 "general_operand" "=r,r,r")
                    753:         (and:QI (match_operand:QI 1 "general_operand" "%0,0,0")
                    754:                 (match_operand:QI 2 "general_operand" "M,r,m")))]
                    755:   ""
                    756:   "@
                    757:     andm r%0,%2
                    758:     andr r%0,r%2
                    759:     and  r%0,%2 ")
                    760: 
                    761: ; This sets incorrect condition codes. See notice_update_cc()
                    762: (define_insn "andhi3"
                    763:   [(set (match_operand:HI 0 "register_operand" "=r")
                    764:         (and:HI (match_operand:HI 1 "register_operand" "%0")
                    765:                 (match_operand:HI 2 "register_operand" "r")))]
                    766:   ""
                    767:   "danr.m %0,%2")
                    768: 
                    769: ;; OR
                    770: 
                    771: (define_insn "iorqi3"
                    772:   [(set (match_operand:QI 0 "general_operand" "=r,r,r")
                    773:         (ior:QI  (match_operand:QI 1 "general_operand" "%0,0,0")
                    774:                 (match_operand:QI 2 "general_operand" "M,r,m")))]
                    775:   ""
                    776:   "@
                    777:     orim r%0,%2
                    778:     orr  r%0,r%2
                    779:     or   r%0,%2 ")
                    780: 
                    781: ; This sets incorrect condition codes. See notice_update_cc()
                    782: (define_insn "iorhi3"
                    783:   [(set (match_operand:HI 0 "register_operand" "=r")
                    784:         (ior:HI (match_operand:HI 1 "register_operand" "%0")
                    785:                 (match_operand:HI 2 "register_operand" "r")))]
                    786:   ""
                    787:   "dorr.m %0,%2")
                    788: 
                    789: ;; XOR
                    790: 
                    791: (define_insn "xorqi3"
                    792:   [(set (match_operand:QI 0 "register_operand" "=r,r,r")
                    793:         (xor:QI (match_operand:QI 1 "register_operand" "%0,0,0")
                    794:                 (match_operand:QI 2 "general_operand"  "M,r,m")))]
                    795:   ""
                    796:   "@
                    797:     xorm r%0,%2
                    798:     xorr r%0,r%2
                    799:     xor  r%0,%2 ")
                    800: 
                    801: ; This sets incorrect condition codes. See notice_update_cc()
                    802: (define_insn "xorhi3"
                    803:   [(set (match_operand:HI 0 "register_operand" "=r")
                    804:         (xor:HI (match_operand:HI 1 "register_operand" "%0")
                    805:                 (match_operand:HI 2 "register_operand" "r")))]
                    806:   ""
                    807:   "dxrr.m %0,%2")
                    808: 
                    809: ;; NAND
                    810: 
                    811: (define_insn ""
                    812:   [(set (match_operand:QI 0 "register_operand" "=r,r,r")
                    813:        (ior:QI (not:QI (match_operand:QI 1 "register_operand" "%0,0,0"))
                    814:                (not:QI (match_operand:QI 2 "general_operand" "M,r,m"))))]
                    815:   ""
                    816:   "@
                    817:     nim r%0,%2
                    818:     nr  r%0,r%2
                    819:     n   r%0,%2 ")
                    820: 
                    821: ; This sets incorrect condition codes. See notice_update_cc()
                    822: (define_insn ""
                    823:   [(set (match_operand:HI 0 "register_operand" "=r")
                    824:        (ior:HI (not:HI (match_operand:HI 1 "register_operand" "%0"))
                    825:                (not:HI (match_operand:HI 2 "register_operand" "r"))))]
                    826:   ""
                    827:   "dnr.m %0,%2")
                    828: 
                    829: ;; NOT
                    830: 
                    831: (define_insn "one_cmplqi2"
                    832:   [(set (match_operand:QI 0 "register_operand" "=r")
                    833:         (not:QI (match_operand:QI 1 "register_operand" "0")))]
                    834:   ""
                    835:   "nr r%0,r%0")
                    836: 
                    837: ; This sets incorrect condition codes. See notice_update_cc()
                    838: (define_insn "one_cmplhi2"
                    839:   [(set (match_operand:HI 0 "register_operand" "=r")
                    840:         (not:HI (match_operand:HI 1 "register_operand" "0")))]
                    841:   ""
                    842:   "dnr.m %0,%0")
                    843: 
                    844: 
                    845: ;; Shift instructions
                    846: 
                    847: ; (What to the 1750 is logical-shift-left, GCC likes to call "arithmetic")
                    848: (define_insn "ashlqi3"
                    849:   [(set (match_operand:QI 0 "register_operand" "=r,r,r")
                    850:         (ashift:QI (match_operand:QI 1 "register_operand" "0,0,0")
                    851:                    (match_operand:QI 2 "general_operand" "O,I,r")))]
                    852:   ""
                    853:   "@
                    854:     ; optimized away an SLL r%0,0
                    855:     sll r%0,%2
                    856:     slr r%0,r%2 ")
                    857: 
                    858: (define_insn "ashlhi3"
                    859:   [(set (match_operand:HI 0 "register_operand" "=r,r")
                    860:         (ashift:HI (match_operand:HI 1 "register_operand" "0,0")
                    861:                    (match_operand:QI 2 "general_operand" "L,r")))]
                    862:   ""                        ; the 'L' constraint is a slight imprecise...
                    863:   "@
                    864:      dsll r%0,%2
                    865:      dslr r%0,r%2 ")
                    866: 
                    867: (define_insn "lshrqi3"
                    868:   [(set (match_operand:QI 0 "register_operand" "=r,r")
                    869:         (lshiftrt:QI (match_operand:QI 1 "register_operand" "0,0")
                    870:                      (match_operand:QI 2 "general_operand" "I,r")))]
                    871:   ""
                    872:   "@
                    873:     srl r%0,%2
                    874:     neg r%2,r%2\;slr    r%0,r%2 ")
                    875: 
                    876: (define_insn "lshrhi3"
                    877:   [(set (match_operand:HI 0 "register_operand" "=r,r")
                    878:         (lshiftrt:HI (match_operand:HI 1 "register_operand" "0,0")
                    879:                      (match_operand:QI 2 "general_operand" "L,r")))]
                    880:   ""                        ; the 'L' constraint is a slight imprecise...
                    881:   "@
                    882:     dsrl r%0,%2
                    883:     neg  r%2,r%2\;dslr   r%0,r%2 ")
                    884: 
                    885: (define_insn "ashrqi3"
                    886:   [(set (match_operand:QI 0 "register_operand" "=r,r")
                    887:         (ashiftrt:QI (match_operand:QI 1 "register_operand" "0,0")
                    888:                      (match_operand:QI 2 "general_operand" "I,r")))]
                    889:   ""
                    890:   "@
                    891:      sra r%0,%2
                    892:      neg r%2,r%2\;sar    r%0,r%2 ")
                    893: 
                    894: (define_insn "ashrhi3"
                    895:   [(set (match_operand:HI 0 "register_operand" "=r,r")
                    896:         (ashiftrt:HI (match_operand:HI 1 "register_operand" "0,0")
                    897:                      (match_operand:QI 2 "general_operand" "I,r")))]
                    898:   ""
                    899:   "@
                    900:      dsra r%0,%2
                    901:      neg  r%2,r%2\;dsar   r%0,r%2 ")
                    902: 
                    903: 
                    904: ;; rotate instructions
                    905: 
                    906: (define_insn "rotlqi3"
                    907:   [(set (match_operand:QI 0 "register_operand" "=r,r")
                    908:         (rotate:QI (match_operand:QI 1 "register_operand" "0,0")
                    909:                    (match_operand:QI 2 "general_operand" "I,r")))]
                    910:   ""
                    911:   "@
                    912:     slc r%0,%2
                    913:     scr r%0,r%2 ")
                    914: 
                    915: (define_insn "rotlhi3"
                    916:   [(set (match_operand:HI 0 "register_operand" "=r,r")
                    917:         (rotate:HI (match_operand:HI 1 "register_operand" "0,0")
                    918:                    (match_operand:QI 2 "general_operand" "I,r")))]
                    919:   ""
                    920:   "@
                    921:     dslc r%0,%2
                    922:     dscr r%0,r%2 ")
                    923: 
                    924: (define_insn "rotrqi3"
                    925:   [(set (match_operand:QI 0 "register_operand" "=r,r")
                    926:         (rotatert:QI (match_operand:QI 1 "register_operand" "0,0")
                    927:                      (match_operand:QI 2 "general_operand" "I,r")))]
                    928:   ""
                    929:   "@
                    930:     slc r%0,%2
                    931:     neg r%2,r%2\;scr    r%0,r%2 ")
                    932: 
                    933: (define_insn "rotrhi3"
                    934:   [(set (match_operand:HI 0 "register_operand" "=r,r")
                    935:         (rotatert:HI (match_operand:HI 1 "register_operand" "0,0")
                    936:                      (match_operand:QI 2 "general_operand" "I,r")))]
                    937:   ""
                    938:   "@
                    939:     dslc r%0,%2
                    940:     neg  r%2,r%2\;dscr   r%0,r%2 ")
                    941: 
                    942: 
                    943: 
                    944: ;; Special cases of bit-field insns which we should
                    945: ;; recognize in preference to the general case.
                    946: ;; These handle aligned 8-bit and 16-bit fields,
                    947: ;; which can usually be done with move instructions.
                    948: ;    1750: t.b.d.
                    949: ;********************
                    950: 
                    951: ;; Bit field instructions, general cases.
                    952: ;; "o,d" constraint causes a nonoffsetable memref to match the "o"
                    953: ;; so that its address is reloaded.
                    954: 
                    955: ;; (define_insn "extv" ...
                    956: 
                    957: ;; (define_insn "extzv" ...
                    958: 
                    959: ;; (define_insn "insv" ...
                    960: 
                    961: ;; Now recognize bit field insns that operate on registers
                    962: ;; (or at least were intended to do so).
                    963: ;[unnamed only]
                    964: 
                    965: ;; Special patterns for optimizing bit-field instructions.
                    966: ;**************************************
                    967: 
                    968: ; cc status test ops n.a. on 1750 ......... e.g. "sleu" on 68k:
                    969: ;  [(set (match_operand:QI 0 "general_operand" "=d")
                    970: ;        (leu (cc0) (const_int 0)))]
                    971: ;  ""
                    972: ;  "* cc_status = cc_prev_status;
                    973: ;     return \"sls %0\"; ")
                    974: 
                    975: 
                    976: ;; Basic conditional jump instructions.
                    977: 
                    978: (define_insn "beq"
                    979:   [(set (pc)
                    980:         (if_then_else (eq (cc0)
                    981:                           (const_int 0))
                    982:                       (label_ref (match_operand 0 "" ""))
                    983:                       (pc)))]
                    984:   ""
                    985:   "* return (char *)branch_or_jump(\"ez\",CODE_LABEL_NUMBER(operands[0]));
                    986:   ")
                    987: 
                    988: (define_insn "bne"
                    989:   [(set (pc)
                    990:         (if_then_else (ne (cc0)
                    991:                           (const_int 0))
                    992:                       (label_ref (match_operand 0 "" ""))
                    993:                       (pc)))]
                    994:   ""
                    995:   "* return (char *)branch_or_jump(\"nz\",CODE_LABEL_NUMBER(operands[0]));
                    996:   ")
                    997: 
                    998: (define_insn "bgt"
                    999:   [(set (pc)
                   1000:         (if_then_else (gt (cc0)
                   1001:                           (const_int 0))
                   1002:                       (label_ref (match_operand 0 "" ""))
                   1003:                       (pc)))]
                   1004:   ""
                   1005:   "* return (char *)branch_or_jump(\"gt\",CODE_LABEL_NUMBER(operands[0]));
                   1006:   ")
                   1007: 
                   1008: (define_insn "blt"
                   1009:   [(set (pc)
                   1010:         (if_then_else (lt (cc0)
                   1011:                           (const_int 0))
                   1012:                       (label_ref (match_operand 0 "" ""))
                   1013:                       (pc)))]
                   1014:   ""
                   1015:   "* return (char *)branch_or_jump(\"lt\",CODE_LABEL_NUMBER(operands[0]));
                   1016:   ")
                   1017: 
                   1018: (define_insn "bge"
                   1019:   [(set (pc)
                   1020:         (if_then_else (ge (cc0)
                   1021:                           (const_int 0))
                   1022:                       (label_ref (match_operand 0 "" ""))
                   1023:                       (pc)))]
                   1024:   ""
                   1025:   "* return (char *)branch_or_jump(\"ge\",CODE_LABEL_NUMBER(operands[0]));
                   1026:   ")
                   1027: 
                   1028: (define_insn "ble"
                   1029:   [(set (pc)
                   1030:         (if_then_else (le (cc0)
                   1031:                           (const_int 0))
                   1032:                       (label_ref (match_operand 0 "" ""))
                   1033:                       (pc)))]
                   1034:   ""
                   1035:   "* return (char *)branch_or_jump(\"le\",CODE_LABEL_NUMBER(operands[0]));
                   1036:   ")
                   1037: 
                   1038: 
                   1039: ; no unsigned branches available on 1750. But GCC still needs them, so faking:
                   1040: 
                   1041: (define_insn "bgtu"
                   1042:   [(set (pc)
                   1043:         (if_then_else (gtu (cc0)
                   1044:                           (const_int 0))
                   1045:                       (label_ref (match_operand 0 "" ""))
                   1046:                       (pc)))]
                   1047:   ""
                   1048:   "jc gt,%l0 ; Warning: this should be an *unsigned* test!")
                   1049: 
                   1050: (define_insn "bltu"
                   1051:   [(set (pc)
                   1052:         (if_then_else (ltu (cc0)
                   1053:                           (const_int 0))
                   1054:                       (label_ref (match_operand 0 "" ""))
                   1055:                       (pc)))]
                   1056:   ""
                   1057:   "jc lt,%l0 ; Warning: this should be an *unsigned* test!")
                   1058: 
                   1059: (define_insn "bgeu"
                   1060:   [(set (pc)
                   1061:         (if_then_else (geu (cc0)
                   1062:                           (const_int 0))
                   1063:                       (label_ref (match_operand 0 "" ""))
                   1064:                       (pc)))]
                   1065:   ""
                   1066:   "jc ge,%l0 ; Warning: this should be an *unsigned* test!")
                   1067: 
                   1068: (define_insn "bleu"
                   1069:   [(set (pc)
                   1070:         (if_then_else (leu (cc0)
                   1071:                           (const_int 0))
                   1072:                       (label_ref (match_operand 0 "" ""))
                   1073:                       (pc)))]
                   1074:   ""
                   1075:   "jc le,%l0 ; Warning: this should be an *unsigned* test!")
                   1076: 
                   1077: 
                   1078: ;; Negated conditional jump instructions.
                   1079: 
                   1080: (define_insn ""
                   1081:   [(set (pc)
                   1082:         (if_then_else (eq (cc0)
                   1083:                           (const_int 0))
                   1084:                       (pc)
                   1085:                       (label_ref (match_operand 0 "" ""))))]
                   1086:   ""
                   1087:   "* return (char *)branch_or_jump(\"nz\",CODE_LABEL_NUMBER(operands[0]));
                   1088:   ")
                   1089: 
                   1090: (define_insn ""
                   1091:   [(set (pc)
                   1092:         (if_then_else (ne (cc0)
                   1093:                           (const_int 0))
                   1094:                       (pc)
                   1095:                       (label_ref (match_operand 0 "" ""))))]
                   1096:   ""
                   1097:   "* return (char *)branch_or_jump(\"ez\",CODE_LABEL_NUMBER(operands[0]));
                   1098:   ")
                   1099: 
                   1100: (define_insn ""
                   1101:   [(set (pc)
                   1102:         (if_then_else (gt (cc0)
                   1103:                           (const_int 0))
                   1104:                       (pc)
                   1105:                       (label_ref (match_operand 0 "" ""))))]
                   1106:   ""
                   1107:   "* return (char *)branch_or_jump(\"le\",CODE_LABEL_NUMBER(operands[0]));
                   1108:   ")
                   1109: 
                   1110: (define_insn ""
                   1111:   [(set (pc)
                   1112:         (if_then_else (lt (cc0)
                   1113:                           (const_int 0))
                   1114:                       (pc)
                   1115:                       (label_ref (match_operand 0 "" ""))))]
                   1116:   ""
                   1117:   "* return (char *)branch_or_jump(\"ge\",CODE_LABEL_NUMBER(operands[0]));
                   1118:   ")
                   1119: 
                   1120: (define_insn ""
                   1121:   [(set (pc)
                   1122:         (if_then_else (ge (cc0)
                   1123:                           (const_int 0))
                   1124:                       (pc)
                   1125:                       (label_ref (match_operand 0 "" ""))))]
                   1126:   ""
                   1127:   "* return (char *)branch_or_jump(\"lt\",CODE_LABEL_NUMBER(operands[0]));
                   1128:   ")
                   1129: 
                   1130: (define_insn ""
                   1131:   [(set (pc)
                   1132:         (if_then_else (le (cc0)
                   1133:                           (const_int 0))
                   1134:                       (pc)
                   1135:                       (label_ref (match_operand 0 "" ""))))]
                   1136:   ""
                   1137:   "* return (char *)branch_or_jump(\"gt\",CODE_LABEL_NUMBER(operands[0]));
                   1138:   ")
                   1139: 
                   1140: 
                   1141: ;; Negated unsigned conditional jump instructions (faked for 1750).
                   1142: 
                   1143: (define_insn ""
                   1144:   [(set (pc)
                   1145:         (if_then_else (gtu (cc0)
                   1146:                           (const_int 0))
                   1147:                       (pc)
                   1148:                       (label_ref (match_operand 0 "" ""))))]
                   1149:   ""
                   1150:   "jc le,%l0 ;inv.cond. ;Warning: this should be an *unsigned* test!")
                   1151: 
                   1152: (define_insn ""
                   1153:   [(set (pc)
                   1154:         (if_then_else (ltu (cc0)
                   1155:                           (const_int 0))
                   1156:                       (pc)
                   1157:                       (label_ref (match_operand 0 "" ""))))]
                   1158:   ""
                   1159:   "jc ge,%l0 ;inv.cond. ;Warning: this should be an *unsigned* test!")
                   1160: 
                   1161: (define_insn ""
                   1162:   [(set (pc)
                   1163:         (if_then_else (geu (cc0)
                   1164:                           (const_int 0))
                   1165:                       (pc)
                   1166:                       (label_ref (match_operand 0 "" ""))))]
                   1167:   ""
                   1168:   "jc lt,%l0 ;inv.cond. ;Warning: this should be an *unsigned* test!")
                   1169: 
                   1170: (define_insn ""
                   1171:   [(set (pc)
                   1172:         (if_then_else (leu (cc0)
                   1173:                           (const_int 0))
                   1174:                       (pc)
                   1175:                       (label_ref (match_operand 0 "" ""))))]
                   1176:   ""
                   1177:   "jc gt,%l0 ;inv.cond. ;Warning: this should be an *unsigned* test!")
                   1178: 
                   1179: ;; Tablejump 
                   1180: ;; 1750 note: CASE_VECTOR_PC_RELATIVE is not defined
                   1181: (define_insn "tablejump"
                   1182:   [(set (pc)
                   1183:         (match_operand:QI 0 "register_operand" "b"))
                   1184:    (use (label_ref (match_operand 1 "" "")))]
                   1185:   ""
                   1186:   "jc 15,0,r%0   ; tablejump label_ref=%1")
                   1187: 
                   1188: 
                   1189: ;; Unconditional jump
                   1190: (define_insn "jump"
                   1191:   [(set (pc)
                   1192:         (label_ref (match_operand 0 "" "")))]
                   1193:   ""
                   1194:   "jc uc,%0")
                   1195: 
                   1196: ;; Call subroutine, returning value in operand 0
                   1197: ;; (which must be a hard register).
                   1198: (define_insn "call_value"
                   1199:   [(set (match_operand 0 "register_operand" "r")
                   1200:         (call (match_operand:QI 1 "memory_operand" "m")
                   1201:               (match_operand:QI 2 "general_operand" "g")))]
                   1202:   ;; Operand 2 not really used for 1750.
                   1203:   ""
                   1204:   "sjs r15,%1   ; return value in R0")
                   1205: 
                   1206: ;; Call subroutine with no return value.
                   1207: 
                   1208: ;;  Operand 1 not really used in MIL-STD-1750.
                   1209: (define_insn ""
                   1210:   [(call (match_operand:QI 0 "memory_operand" "mp")
                   1211:          (match_operand:QI 1 "general_operand" ""))]
                   1212:   ""
                   1213:   "sjs r15,%0   ; no return value")
                   1214: 
                   1215: ;;;;;;;;;;;; 1750: NOT READY YET.
                   1216: (define_insn "call"
                   1217:   [(call (match_operand:QI 0 "" "")
                   1218:          (match_operand:QI 1 "" ""))]
                   1219:   ""
                   1220:   "ANYCALL %0")
                   1221: 
                   1222: 
                   1223: ; (define_insn "return"
                   1224: ;   [(return)]
                   1225: ;   ""
                   1226: ;   "*
                   1227: ;    { 
                   1228: ;         rtx oprnd = gen_rtx(CONST_INT,VOIDmode,get_frame_size());
                   1229: ;         output_asm_insn(\"ret.m  %0\",&oprnd);
                   1230: ;         return \"\;\";
                   1231: ;    } ")
                   1232: 
                   1233: (define_insn "indirect_jump"
                   1234:   [(set (pc) (match_operand:QI 0 "address_operand" "p"))]
                   1235:   ""
                   1236:   "jci 15,%0")
                   1237: 
                   1238: (define_insn "nop"
                   1239:   [(const_int 0)]
                   1240:   ""
                   1241:   "nop")
                   1242: 
                   1243: 
                   1244: ;; Subtract One and Jump (if non-zero)
                   1245: (define_peephole 
                   1246:   [(set (match_operand:QI 0 "register_operand" "=r")
                   1247:         (plus:QI (match_operand:QI 1 "register_operand" "%0")
                   1248:                  (match_operand:QI 2 "immediate_operand" "J")))
                   1249:    (set (cc0) (match_dup 0))
                   1250:    (set (pc)
                   1251:         (if_then_else (ne (cc0) (const_int 0))
                   1252:          (label_ref (match_operand 3 "" ""))
                   1253:          (pc)))
                   1254:    ]
                   1255:   "INTVAL(operands[2]) == -1"
                   1256:   "soj r%0,%3")
                   1257: 
                   1258: ;;;End.
                   1259: 

unix.superglobalmegacorp.com

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