|
|
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:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.