|
|
1.1 ! root 1: ;;- Machine description for GNU compiler ! 2: ;;- Tahoe version ! 3: ;; Copyright (C) 1989 Free Software Foundation, Inc. ! 4: ! 5: ;; This file is part of GNU CC. ! 6: ! 7: ;; GNU CC is free software; you can redistribute it and/or modify ! 8: ;; it under the terms of the GNU General Public License as published by ! 9: ;; the Free Software Foundation; either version 1, or (at your option) ! 10: ;; any later version. ! 11: ! 12: ;; GNU CC is distributed in the hope that it will be useful, ! 13: ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ! 14: ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ! 15: ;; GNU General Public License for more details. ! 16: ! 17: ;; You should have received a copy of the GNU General Public License ! 18: ;; along with GNU CC; see the file COPYING. If not, write to ! 19: ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. ! 20: ! 21: ! 22: ; File: tahoe.md ! 23: ; ! 24: ; This port made at the University of Buffalo by Devon Bowen, ! 25: ; Dale Wiles and Kevin Zachmann. ! 26: ; ! 27: ; Mail bugs reports or fixes to: [email protected] ! 28: ! 29: ! 30: ; movdi must call the output_move_double routine to move it around since ! 31: ; the tahoe doesn't efficiently support 8 bit moves. ! 32: ! 33: (define_insn "movdi" ! 34: [(set (match_operand:DI 0 "general_operand" "=g") ! 35: (match_operand:DI 1 "general_operand" "g"))] ! 36: "" ! 37: "* ! 38: { ! 39: CC_STATUS_INIT; ! 40: return output_move_double (operands); ! 41: }") ! 42: ! 43: ! 44: ; The trick in the movsi is accessing the contents of the sp register. The ! 45: ; tahoe doesn't allow you to access it directly so you have to access the ! 46: ; address of the top of the stack instead. ! 47: ! 48: (define_insn "movsi" ! 49: [(set (match_operand:SI 0 "general_operand" "=g") ! 50: (match_operand:SI 1 "general_operand" "g"))] ! 51: "" ! 52: "* ! 53: { ! 54: rtx link; ! 55: if (operands[1] == const1_rtx ! 56: && (link = find_reg_note (insn, REG_WAS_0, 0)) ! 57: && ! XEXP (link, 0)->volatil ! 58: && GET_CODE (XEXP (link, 0)) != NOTE ! 59: && no_labels_between_p (XEXP (link, 0), insn)) ! 60: return \"incl %0\"; ! 61: if (GET_CODE (operands[1]) == SYMBOL_REF || GET_CODE (operands[1]) == CONST) ! 62: { ! 63: if (push_operand (operands[0], SImode)) ! 64: return \"pushab %a1\"; ! 65: return \"movab %a1,%0\"; ! 66: } ! 67: if (operands[1] == const0_rtx) ! 68: return \"clrl %0\"; ! 69: if (push_operand (operands[0], SImode)) ! 70: return \"pushl %1\"; ! 71: if (GET_CODE (operands[1]) == REG && REGNO (operands[1]) == 14) ! 72: return \"moval (sp),%0\"; ! 73: return \"movl %1,%0\"; ! 74: }") ! 75: ! 76: ! 77: (define_insn "movhi" ! 78: [(set (match_operand:HI 0 "general_operand" "=g") ! 79: (match_operand:HI 1 "general_operand" "g"))] ! 80: "" ! 81: "* ! 82: { ! 83: rtx link; ! 84: if (operands[1] == const1_rtx ! 85: && (link = find_reg_note (insn, REG_WAS_0, 0)) ! 86: && ! XEXP (link, 0)->volatil ! 87: && GET_CODE (XEXP (link, 0)) != NOTE ! 88: && no_labels_between_p (XEXP (link, 0), insn)) ! 89: return \"incw %0\"; ! 90: if (operands[1] == const0_rtx) ! 91: return \"clrw %0\"; ! 92: return \"movw %1,%0\"; ! 93: }") ! 94: ! 95: ! 96: (define_insn "movqi" ! 97: [(set (match_operand:QI 0 "general_operand" "=g") ! 98: (match_operand:QI 1 "general_operand" "g"))] ! 99: "" ! 100: "* ! 101: { ! 102: if (operands[1] == const0_rtx) ! 103: return \"clrb %0\"; ! 104: return \"movb %1,%0\"; ! 105: }") ! 106: ! 107: ! 108: ; movsf has three cases since they can move from one place to another ! 109: ; or to/from the fpp and since different instructions are needed for ! 110: ; each case. The fpp related instructions don't set the flags properly. ! 111: ! 112: (define_insn "movsf" ! 113: [(set (match_operand:SF 0 "general_operand" "=g,=a,=g") ! 114: (match_operand:SF 1 "general_operand" "g,g,a"))] ! 115: "" ! 116: "* ! 117: { ! 118: CC_STATUS_INIT; ! 119: switch (which_alternative) ! 120: { ! 121: case 0: ! 122: return \"movl %1,%0\"; ! 123: case 1: ! 124: return \"ldf %1\"; ! 125: case 2: ! 126: return \"stf %0\"; ! 127: } ! 128: }") ! 129: ! 130: ! 131: ; movdf has a number of different cases. If it's going to or from ! 132: ; the fpp, use the special instructions to do it. If not, use the ! 133: ; output_move_double function. ! 134: ! 135: (define_insn "movdf" ! 136: [(set (match_operand:DF 0 "general_operand" "=a,=g,?=g") ! 137: (match_operand:DF 1 "general_operand" "g,a,g"))] ! 138: "" ! 139: "* ! 140: { ! 141: CC_STATUS_INIT; ! 142: switch (which_alternative) ! 143: { ! 144: case 0: ! 145: return \"ldd %1\"; ! 146: case 1: ! 147: if (push_operand (operands[0], DFmode)) ! 148: return \"pushd\"; ! 149: else ! 150: return \"std %0\"; ! 151: case 2: ! 152: return output_move_double (operands); ! 153: } ! 154: }") ! 155: ! 156: ! 157: (define_insn "addsi3" ! 158: [(set (match_operand:SI 0 "general_operand" "=g") ! 159: (plus:SI (match_operand:SI 1 "general_operand" "g") ! 160: (match_operand:SI 2 "general_operand" "g")))] ! 161: "" ! 162: "* ! 163: { ! 164: if (rtx_equal_p (operands[0], operands[1])) ! 165: { ! 166: if (operands[2] == const1_rtx) ! 167: return \"incl %0\"; ! 168: if (GET_CODE (operands[2]) == CONST_INT ! 169: && INTVAL (operands[2]) == -1) ! 170: return \"decl %0\"; ! 171: if (GET_CODE (operands[2]) == CONST_INT ! 172: && (unsigned) (- INTVAL (operands[2])) < 64) ! 173: return \"subl2 $%n2,%0\"; ! 174: return \"addl2 %2,%0\"; ! 175: } ! 176: if (rtx_equal_p (operands[0], operands[2])) ! 177: return \"addl2 %1,%0\"; ! 178: if (GET_CODE (operands[2]) == CONST_INT ! 179: && GET_CODE (operands[1]) == REG) ! 180: { ! 181: if (push_operand (operands[0], SImode)) ! 182: return \"pushab %c2(%1)\"; ! 183: return \"movab %c2(%1),%0\"; ! 184: } ! 185: if (GET_CODE (operands[2]) == CONST_INT ! 186: && (unsigned) (- INTVAL (operands[2])) < 64) ! 187: return \"subl3 $%n2,%1,%0\"; ! 188: return \"addl3 %1,%2,%0\"; ! 189: }") ! 190: ! 191: ! 192: (define_insn "addhi3" ! 193: [(set (match_operand:HI 0 "general_operand" "=g") ! 194: (plus:HI (match_operand:HI 1 "general_operand" "g") ! 195: (match_operand:HI 2 "general_operand" "g")))] ! 196: "" ! 197: "* ! 198: { ! 199: if (rtx_equal_p (operands[0], operands[1])) ! 200: { ! 201: if (operands[2] == const1_rtx) ! 202: return \"incw %0\"; ! 203: if (GET_CODE (operands[1]) == CONST_INT ! 204: && INTVAL (operands[1]) == -1) ! 205: return \"decw %0\"; ! 206: if (GET_CODE (operands[2]) == CONST_INT ! 207: && (unsigned) (- INTVAL (operands[2])) < 64) ! 208: return \"subw2 $%n2,%0\"; ! 209: return \"addw2 %2,%0\"; ! 210: } ! 211: if (rtx_equal_p (operands[0], operands[2])) ! 212: return \"addw2 %1,%0\"; ! 213: if (GET_CODE (operands[2]) == CONST_INT ! 214: && (unsigned) (- INTVAL (operands[2])) < 64) ! 215: return \"subw3 $%n2,%1,%0\"; ! 216: return \"addw3 %1,%2,%0\"; ! 217: }") ! 218: ! 219: ! 220: (define_insn "addqi3" ! 221: [(set (match_operand:QI 0 "general_operand" "=g") ! 222: (plus:QI (match_operand:QI 1 "general_operand" "g") ! 223: (match_operand:QI 2 "general_operand" "g")))] ! 224: "" ! 225: "* ! 226: { ! 227: if (rtx_equal_p (operands[0], operands[1])) ! 228: { ! 229: if (operands[2] == const1_rtx) ! 230: return \"incb %0\"; ! 231: if (GET_CODE (operands[1]) == CONST_INT ! 232: && INTVAL (operands[1]) == -1) ! 233: return \"decb %0\"; ! 234: if (GET_CODE (operands[2]) == CONST_INT ! 235: && (unsigned) (- INTVAL (operands[2])) < 64) ! 236: return \"subb2 $%n2,%0\"; ! 237: return \"addb2 %2,%0\"; ! 238: } ! 239: if (rtx_equal_p (operands[0], operands[2])) ! 240: return \"addb2 %1,%0\"; ! 241: if (GET_CODE (operands[2]) == CONST_INT ! 242: && (unsigned) (- INTVAL (operands[2])) < 64) ! 243: return \"subb3 $%n2,%1,%0\"; ! 244: return \"addb3 %1,%2,%0\"; ! 245: }") ! 246: ! 247: ! 248: ; addsf3 can only add into the fpp register since the fpp is treated ! 249: ; as a separate unit in the machine. It also doesn't set the flags at ! 250: ; all. ! 251: ! 252: (define_insn "addsf3" ! 253: [(set (match_operand:SF 0 "register_operand" "=a") ! 254: (plus:SF (match_operand:SF 1 "register_operand" "%0") ! 255: (match_operand:SF 2 "general_operand" "g")))] ! 256: "" ! 257: "* ! 258: { ! 259: CC_STATUS_INIT; ! 260: return \"addf %2\"; ! 261: }") ! 262: ! 263: ! 264: ; adddf3 can only add into the fpp reg since the fpp is treated as a ! 265: ; separate entity. Doubles can only be read from a register or memory ! 266: ; since a double is not an immediate mode. Flags are not set by this ! 267: ; instruction. ! 268: ! 269: (define_insn "adddf3" ! 270: [(set (match_operand:DF 0 "register_operand" "=a") ! 271: (plus:DF (match_operand:DF 1 "register_operand" "%0") ! 272: (match_operand:DF 2 "general_operand" "rm")))] ! 273: "" ! 274: "* ! 275: { ! 276: CC_STATUS_INIT; ! 277: return \"addd %2\"; ! 278: }") ! 279: ! 280: ! 281: ; Subtraction from the sp (needed by the built in alloc funtion) needs ! 282: ; to be different since the sp cannot be directly read on the tahoe. ! 283: ; If it's a simple constant, you just use displacment. Otherwise, you ! 284: ; push the sp, and then do the subtraction off the stack. ! 285: ! 286: (define_insn "subsi3" ! 287: [(set (match_operand:SI 0 "general_operand" "=g") ! 288: (minus:SI (match_operand:SI 1 "general_operand" "g") ! 289: (match_operand:SI 2 "general_operand" "g")))] ! 290: "" ! 291: "* ! 292: { ! 293: if (rtx_equal_p (operands[0], operands[1])) ! 294: { ! 295: if (operands[2] == const1_rtx) ! 296: return \"decl %0\"; ! 297: if (GET_CODE (operands[0]) == REG && REGNO (operands[0]) == 14) ! 298: if (GET_CODE (operands[2]) == CONST_INT) ! 299: return \"movab %n2(sp),sp\"; ! 300: else ! 301: return \"pushab (sp)\;subl3 %2,(sp),sp\"; ! 302: return \"subl2 %2,%0\"; ! 303: } ! 304: if (rtx_equal_p (operands[1], operands[2])) ! 305: return \"clrl %0\"; ! 306: return \"subl3 %2,%1,%0\"; ! 307: }") ! 308: ! 309: ! 310: (define_insn "subhi3" ! 311: [(set (match_operand:HI 0 "general_operand" "=g") ! 312: (minus:HI (match_operand:HI 1 "general_operand" "g") ! 313: (match_operand:HI 2 "general_operand" "g")))] ! 314: "" ! 315: "* ! 316: { ! 317: if (rtx_equal_p (operands[0], operands[1])) ! 318: { ! 319: if (operands[2] == const1_rtx) ! 320: return \"decw %0\"; ! 321: return \"subw2 %2,%0\"; ! 322: } ! 323: if (rtx_equal_p (operands[1], operands[2])) ! 324: return \"clrw %0\"; ! 325: return \"subw3 %2,%1,%0\"; ! 326: }") ! 327: ! 328: ! 329: (define_insn "subqi3" ! 330: [(set (match_operand:QI 0 "general_operand" "=g") ! 331: (minus:QI (match_operand:QI 1 "general_operand" "g") ! 332: (match_operand:QI 2 "general_operand" "g")))] ! 333: "" ! 334: "* ! 335: { ! 336: if (rtx_equal_p (operands[0], operands[1])) ! 337: { ! 338: if (operands[2] == const1_rtx) ! 339: return \"decb %0\"; ! 340: return \"subb2 %2,%0\"; ! 341: } ! 342: if (rtx_equal_p (operands[1], operands[2])) ! 343: return \"clrb %0\"; ! 344: return \"subb3 %2,%1,%0\"; ! 345: }") ! 346: ! 347: ! 348: ; subsf3 can only subtract into the fpp accumulator due to the way ! 349: ; the fpp reg is limited by the instruction set. This also doesn't ! 350: ; bother setting up flags. ! 351: ! 352: (define_insn "subsf3" ! 353: [(set (match_operand:SF 0 "register_operand" "=a") ! 354: (minus:SF (match_operand:SF 1 "register_operand" "0") ! 355: (match_operand:SF 2 "general_operand" "g")))] ! 356: "" ! 357: "* ! 358: { ! 359: CC_STATUS_INIT; ! 360: return \"subf %2\"; ! 361: }") ! 362: ! 363: ! 364: ; subdf3 is set up to subtract into the fpp reg due to limitations ! 365: ; of the fpp instruction set. Doubles can not be immediate. This ! 366: ; instruction does not set the flags. ! 367: ! 368: (define_insn "subdf3" ! 369: [(set (match_operand:DF 0 "register_operand" "=a") ! 370: (minus:DF (match_operand:DF 1 "register_operand" "0") ! 371: (match_operand:DF 2 "general_operand" "rm")))] ! 372: "" ! 373: "* ! 374: { ! 375: CC_STATUS_INIT; ! 376: return \"subd %2\"; ! 377: }") ! 378: ! 379: ! 380: (define_insn "mulsi3" ! 381: [(set (match_operand:SI 0 "general_operand" "=g") ! 382: (mult:SI (match_operand:SI 1 "general_operand" "g") ! 383: (match_operand:SI 2 "general_operand" "g")))] ! 384: "" ! 385: "* ! 386: { ! 387: if (rtx_equal_p (operands[0], operands[1])) ! 388: return \"mull2 %2,%0\"; ! 389: if (rtx_equal_p (operands[0], operands[2])) ! 390: return \"mull2 %1,%0\"; ! 391: return \"mull3 %1,%2,%0\"; ! 392: }") ! 393: ! 394: ! 395: ; mulsf3 can only multiply into the fpp accumulator due to limitations ! 396: ; of the fpp. It also does not set the condition codes properly. ! 397: ! 398: (define_insn "mulsf3" ! 399: [(set (match_operand:SF 0 "register_operand" "=a") ! 400: (mult:SF (match_operand:SF 1 "register_operand" "%0") ! 401: (match_operand:SF 2 "general_operand" "g")))] ! 402: "" ! 403: "* ! 404: { ! 405: CC_STATUS_INIT; ! 406: return \"mulf %2\"; ! 407: }") ! 408: ! 409: ! 410: ; muldf3 can only multiply into the fpp reg since the fpp is limited ! 411: ; from the rest. Doubles may not be immediate mode. This does not set ! 412: ; the flags like GCC would expect. ! 413: ! 414: (define_insn "muldf3" ! 415: [(set (match_operand:DF 0 "register_operand" "=a") ! 416: (mult:DF (match_operand:DF 1 "register_operand" "%0") ! 417: (match_operand:DF 2 "general_operand" "rm")))] ! 418: "" ! 419: "* ! 420: { ! 421: CC_STATUS_INIT; ! 422: return \"muld %2\"; ! 423: }") ! 424: ! 425: ! 426: (define_insn "divsi3" ! 427: [(set (match_operand:SI 0 "general_operand" "=g") ! 428: (div:SI (match_operand:SI 1 "general_operand" "g") ! 429: (match_operand:SI 2 "general_operand" "g")))] ! 430: "" ! 431: "* ! 432: { ! 433: if (rtx_equal_p (operands[1], operands[2])) ! 434: return \"movl $1,%0\"; ! 435: if (operands[1] == const0_rtx) ! 436: return \"clrl %0\"; ! 437: if (GET_CODE (operands[2]) == CONST_INT ! 438: && INTVAL (operands[2]) == -1) ! 439: return \"mnegl %1,%0\"; ! 440: if (rtx_equal_p (operands[0], operands[1])) ! 441: return \"divl2 %2,%0\"; ! 442: return \"divl3 %2,%1,%0\"; ! 443: }") ! 444: ! 445: ! 446: ; divsf3 must divide into the fpp accumulator. Flags are not set by ! 447: ; this instruction, so they are cleared. ! 448: ! 449: (define_insn "divsf3" ! 450: [(set (match_operand:SF 0 "register_operand" "=a") ! 451: (div:SF (match_operand:SF 1 "register_operand" "0") ! 452: (match_operand:SF 2 "general_operand" "g")))] ! 453: "" ! 454: "* ! 455: { ! 456: CC_STATUS_INIT; ! 457: return \"divf %2\"; ! 458: }") ! 459: ! 460: ! 461: ; divdf3 also must divide into the fpp reg so optimization isn't ! 462: ; possible. Note that doubles cannot be immediate. The flags here ! 463: ; are not set correctly so they must be ignored. ! 464: ! 465: (define_insn "divdf3" ! 466: [(set (match_operand:DF 0 "register_operand" "=a") ! 467: (div:DF (match_operand:DF 1 "register_operand" "0") ! 468: (match_operand:DF 2 "general_operand" "rm")))] ! 469: "" ! 470: "* ! 471: { ! 472: CC_STATUS_INIT; ! 473: return \"divd %2\"; ! 474: }") ! 475: ! 476: ! 477: (define_insn "andsi3" ! 478: [(set (match_operand:SI 0 "general_operand" "=g") ! 479: (and:SI (match_operand:SI 1 "general_operand" "g") ! 480: (match_operand:SI 2 "general_operand" "g")))] ! 481: "" ! 482: "andl3 %2,%1,%0") ! 483: ! 484: ! 485: (define_insn "andhi3" ! 486: [(set (match_operand:HI 0 "general_operand" "=g") ! 487: (and:HI (match_operand:HI 1 "general_operand" "g") ! 488: (match_operand:HI 2 "general_operand" "g")))] ! 489: "" ! 490: "andw3 %1,%2,%0") ! 491: ! 492: ! 493: (define_insn "andqi3" ! 494: [(set (match_operand:QI 0 "general_operand" "=g") ! 495: (and:QI (match_operand:QI 1 "general_operand" "g") ! 496: (match_operand:QI 2 "general_operand" "g")))] ! 497: "" ! 498: "andb3 %1,%2,%0") ! 499: ! 500: ! 501: (define_insn "iorsi3" ! 502: [(set (match_operand:SI 0 "general_operand" "=g") ! 503: (ior:SI (match_operand:SI 1 "general_operand" "g") ! 504: (match_operand:SI 2 "general_operand" "g")))] ! 505: "" ! 506: "orl3 %2,%1,%0") ! 507: ! 508: ! 509: (define_insn "iorhi3" ! 510: [(set (match_operand:HI 0 "general_operand" "=g") ! 511: (ior:HI (match_operand:HI 1 "general_operand" "g") ! 512: (match_operand:HI 2 "general_operand" "g")))] ! 513: "" ! 514: "orw3 %2,%1,%0") ! 515: ! 516: ! 517: (define_insn "iorqi3" ! 518: [(set (match_operand:QI 0 "general_operand" "=g") ! 519: (ior:QI (match_operand:QI 1 "general_operand" "g") ! 520: (match_operand:QI 2 "general_operand" "g")))] ! 521: "" ! 522: "orb3 %2,%1,%0") ! 523: ! 524: ! 525: (define_insn "xorsi3" ! 526: [(set (match_operand:SI 0 "general_operand" "=g") ! 527: (xor:SI (match_operand:SI 1 "general_operand" "g") ! 528: (match_operand:SI 2 "general_operand" "g")))] ! 529: "" ! 530: "xorl3 %1,%2,%0") ! 531: ! 532: ! 533: (define_insn "xorhi3" ! 534: [(set (match_operand:HI 0 "general_operand" "=g") ! 535: (xor:HI (match_operand:HI 1 "general_operand" "g") ! 536: (match_operand:HI 2 "general_operand" "g")))] ! 537: "" ! 538: "xorw3 %1,%2,%0") ! 539: ! 540: ! 541: (define_insn "xorqi3" ! 542: [(set (match_operand:QI 0 "general_operand" "=g") ! 543: (xor:QI (match_operand:QI 1 "general_operand" "g") ! 544: (match_operand:QI 2 "general_operand" "g")))] ! 545: "" ! 546: "xorb3 %1,%2,%0") ! 547: ! 548: ! 549: ; Shifts on the tahoe are expensive, so try to do an add instead. ! 550: ! 551: (define_insn "ashlsi3" ! 552: [(set (match_operand:SI 0 "general_operand" "=g") ! 553: (ashift:SI (match_operand:SI 1 "general_operand" "g") ! 554: (match_operand:QI 2 "general_operand" "g")))] ! 555: "" ! 556: "* ! 557: { ! 558: if (operands[2] == const1_rtx && rtx_equal_p (operands[0], operands[1])) ! 559: { ! 560: CC_STATUS_INIT; ! 561: return \"addl2 %0,%0\"; ! 562: } ! 563: return \"shal %2,%1,%0\"; ! 564: }") ! 565: ! 566: ! 567: (define_insn "ashrsi3" ! 568: [(set (match_operand:SI 0 "general_operand" "=g") ! 569: (ashiftrt:SI (match_operand:SI 1 "general_operand" "g") ! 570: (match_operand:QI 2 "general_operand" "g")))] ! 571: "" ! 572: "shar %2,%1,%0") ! 573: ! 574: ! 575: ; Shifts are very expensive, so try to do an add if possible. ! 576: ! 577: (define_insn "lshlsi3" ! 578: [(set (match_operand:SI 0 "general_operand" "=g") ! 579: (lshift:SI (match_operand:SI 1 "general_operand" "g") ! 580: (match_operand:QI 2 "general_operand" "g")))] ! 581: "" ! 582: "* ! 583: { ! 584: if (operands[2] == const1_rtx && rtx_equal_p (operands[0], operands[1])) ! 585: { ! 586: CC_STATUS_INIT; ! 587: return \"addl2 %0,%0\"; ! 588: } ! 589: return \"shll %2,%1,%0\"; ! 590: }") ! 591: ! 592: ! 593: (define_insn "lshrsi3" ! 594: [(set (match_operand:SI 0 "general_operand" "=g") ! 595: (lshiftrt:SI (match_operand:SI 1 "general_operand" "g") ! 596: (match_operand:QI 2 "general_operand" "g")))] ! 597: "" ! 598: "shrl %2,%1,%0") ! 599: ! 600: ! 601: (define_insn "negsi2" ! 602: [(set (match_operand:SI 0 "general_operand" "=g") ! 603: (neg:SI (match_operand:SI 1 "general_operand" "g")))] ! 604: "" ! 605: "mnegl %1,%0") ! 606: ! 607: ! 608: (define_insn "neghi2" ! 609: [(set (match_operand:HI 0 "general_operand" "=g") ! 610: (neg:HI (match_operand:HI 1 "general_operand" "g")))] ! 611: "" ! 612: "mnegw %1,%0") ! 613: ! 614: ! 615: (define_insn "negqi2" ! 616: [(set (match_operand:QI 0 "general_operand" "=g") ! 617: (neg:QI (match_operand:QI 1 "general_operand" "g")))] ! 618: "" ! 619: "mnegb %1,%0") ! 620: ! 621: ! 622: ; negsf2 can only negate the value already in the fpp accumulator. ! 623: ; The value remains in the fpp accumulator. No flags are set. ! 624: ! 625: (define_insn "negsf2" ! 626: [(set (match_operand:SF 0 "register_operand" "=a,=a") ! 627: (neg:SF (match_operand:SF 1 "register_operand" "a,g")))] ! 628: "" ! 629: "* ! 630: { ! 631: CC_STATUS_INIT; ! 632: switch (which_alternative) ! 633: { ! 634: case 0: ! 635: return \"negf\"; ! 636: case 1: ! 637: return \"lnf %1\"; ! 638: } ! 639: }") ! 640: ! 641: ! 642: ; negdf2 can only negate the value already in the fpp accumulator. ! 643: ; The value remains in the fpp accumulator. No flags are set. ! 644: ! 645: (define_insn "negdf2" ! 646: [(set (match_operand:DF 0 "register_operand" "=a,=a") ! 647: (neg:DF (match_operand:DF 1 "register_operand" "a,g")))] ! 648: "" ! 649: "* ! 650: { ! 651: CC_STATUS_INIT; ! 652: switch (which_alternative) ! 653: { ! 654: case 0: ! 655: return \"negd\"; ! 656: case 1: ! 657: return \"lnd %1\"; ! 658: } ! 659: }") ! 660: ! 661: ! 662: ; sqrtsf2 tahoe can calculate the square root of a float in the ! 663: ; fpp accumulator. The answer remains in the fpp accumulator. No ! 664: ; flags are set by this function. ! 665: ! 666: (define_insn "sqrtsf2" ! 667: [(set (match_operand:SF 0 "register_operand" "=a") ! 668: (sqrt:SF (match_operand:SF 1 "register_operand" "0")))] ! 669: "" ! 670: "* ! 671: { ! 672: CC_STATUS_INIT; ! 673: return \"sqrtf\"; ! 674: }") ! 675: ! 676: ! 677: ; ffssi2 tahoe instruction gives one less than GCC desired result for ! 678: ; any given input. So the increment is necessary here. ! 679: ! 680: (define_insn "ffssi2" ! 681: [(set (match_operand:SI 0 "general_operand" "=g") ! 682: (ffs:SI (match_operand:SI 1 "general_operand" "g")))] ! 683: "" ! 684: "ffs %1,%0\;incl %0") ! 685: ! 686: ! 687: (define_insn "one_cmplsi2" ! 688: [(set (match_operand:SI 0 "general_operand" "=g") ! 689: (not:SI (match_operand:SI 1 "general_operand" "g")))] ! 690: "" ! 691: "mcoml %1,%0") ! 692: ! 693: ! 694: (define_insn "one_cmplhi2" ! 695: [(set (match_operand:HI 0 "general_operand" "=g") ! 696: (not:HI (match_operand:HI 1 "general_operand" "g")))] ! 697: "" ! 698: "mcomw %1,%0") ! 699: ! 700: ! 701: (define_insn "one_cmplqi2" ! 702: [(set (match_operand:QI 0 "general_operand" "=g") ! 703: (not:QI (match_operand:QI 1 "general_operand" "g")))] ! 704: "" ! 705: "mcomb %1,%0") ! 706: ! 707: ! 708: ; cmpsi works fine, but due to microcode problems, the tahoe doesn't ! 709: ; properly compare hi's and qi's. Leaving them out seems to be acceptable ! 710: ; to the compiler, so they were left out. Compares of the stack are ! 711: ; possible, though. ! 712: ! 713: ;; Put cmpsi first among compare insns so it matches two CONST_INT operands. ! 714: ! 715: (define_insn "cmpsi" ! 716: [(set (cc0) ! 717: (compare (match_operand:SI 0 "general_operand" "g") ! 718: (match_operand:SI 1 "general_operand" "g")))] ! 719: "" ! 720: "cmpl %0,%1") ! 721: ! 722: ! 723: ; cmpsf similar to vax, but first operand is expected to be in the ! 724: ; fpp accumulator. ! 725: ! 726: (define_insn "cmpsf" ! 727: [(set (cc0) ! 728: (compare (match_operand:SF 0 "register_operand" "a") ! 729: (match_operand:SF 1 "general_operand" "g")))] ! 730: "" ! 731: "cmpf %1") ! 732: ! 733: ! 734: ; cmpdf similar to vax, but first operand is expected to be in the ! 735: ; fpp accumulator. Immediate doubles not allowed. ! 736: ! 737: (define_insn "cmpdf" ! 738: [(set (cc0) ! 739: (compare (match_operand:DF 0 "register_operand" "a") ! 740: (match_operand:DF 1 "general_operand" "rm")))] ! 741: "" ! 742: "cmpd %1") ! 743: ! 744: ! 745: ;; Put tstsi first among test insns so it matches a CONST_INT operand. ! 746: ! 747: (define_insn "tstsi" ! 748: [(set (cc0) ! 749: (match_operand:SI 0 "general_operand" "g"))] ! 750: "" ! 751: "tstl %0") ! 752: ! 753: ! 754: ; Small tests from memory are normal, but testing from registers don't ! 755: ; expand the data properly. So test in this case does a convert and tests ! 756: ; the new register data from the stack. ! 757: ! 758: (define_insn "tsthi" ! 759: [(set (cc0) ! 760: (match_operand:HI 0 "general_operand" "m,?r"))] ! 761: "" ! 762: "* ! 763: { ! 764: switch (which_alternative) ! 765: { ! 766: case 0: ! 767: return \"tstw %0\"; ! 768: case 1: ! 769: return \"pushl %0\;cvtwl 2(sp),(sp)\;tstl (sp)+\"; ! 770: } ! 771: }") ! 772: ! 773: ! 774: ; Small tests from memory are normal, but testing from registers don't ! 775: ; expand the data properly. So test in this case does a convert and tests ! 776: ; the new register data from the stack. ! 777: ! 778: (define_insn "tstqi" ! 779: [(set (cc0) ! 780: (match_operand:QI 0 "general_operand" "m,?r"))] ! 781: "" ! 782: "* ! 783: { ! 784: switch (which_alternative) ! 785: { ! 786: case 0: ! 787: return \"tstb %0\"; ! 788: case 1: ! 789: return \"pushl %0\;cvtbl 3(sp),(sp)\;tstl (sp)+\"; ! 790: } ! 791: }") ! 792: ! 793: ! 794: ; tstsf compares a given value to a value already in the fpp accumulator. ! 795: ; No flags are set by this so ignore them. ! 796: ! 797: (define_insn "tstsf" ! 798: [(set (cc0) ! 799: (match_operand:SF 0 "register_operand" "a"))] ! 800: "" ! 801: "tstf") ! 802: ! 803: ! 804: ; tstdf compares a given value to a value already in the fpp accumulator. ! 805: ; immediate doubles not allowed. Flags are ignored after this. ! 806: ! 807: (define_insn "tstdf" ! 808: [(set (cc0) ! 809: (match_operand:DF 0 "register_operand" "a"))] ! 810: "" ! 811: "tstd") ! 812: ! 813: ! 814: ; movstrhi tahoe instruction does not load registers by itself like ! 815: ; the vax counterpart does. registers 0-2 must be primed by hand. ! 816: ; we have loaded the registers in the order: dst, src, count. ! 817: ! 818: (define_insn "movstrhi" ! 819: [(set (match_operand:BLK 0 "general_operand" "p") ! 820: (match_operand:BLK 1 "general_operand" "p")) ! 821: (use (match_operand:HI 2 "general_operand" "g")) ! 822: (clobber (reg:SI 0)) ! 823: (clobber (reg:SI 1)) ! 824: (clobber (reg:SI 2))] ! 825: "" ! 826: "movab %0,r1\;movab %1,r0\;movl %2,r2\;movblk") ! 827: ! 828: ! 829: ; floatsisf2 on tahoe converts the long from reg/mem into the fpp ! 830: ; accumulator. There are no hi and qi counterparts. Flags are not ! 831: ; set correctly here. ! 832: ! 833: (define_insn "floatsisf2" ! 834: [(set (match_operand:SF 0 "register_operand" "=a") ! 835: (float:SF (match_operand:SI 1 "general_operand" "g")))] ! 836: "" ! 837: "* ! 838: { ! 839: CC_STATUS_INIT; ! 840: return \"cvlf %1\"; ! 841: }") ! 842: ! 843: ! 844: ; floatsidf2 on tahoe converts the long from reg/mem into the fpp ! 845: ; accumulator. There are no hi and qi counterparts. Flags are not ! 846: ; set correctly here. ! 847: ! 848: (define_insn "floatsidf2" ! 849: [(set (match_operand:DF 0 "register_operand" "=a") ! 850: (float:DF (match_operand:SI 1 "general_operand" "g")))] ! 851: "" ! 852: "* ! 853: { ! 854: CC_STATUS_INIT; ! 855: return \"cvld %1\"; ! 856: }") ! 857: ! 858: ! 859: ; fix_truncsfsi2 to convert a float to long, tahoe must have the float ! 860: ; in the fpp accumulator. Flags are not set here. ! 861: ! 862: (define_insn "fix_truncsfsi2" ! 863: [(set (match_operand:SI 0 "general_operand" "=g") ! 864: (fix:SI (fix:SF (match_operand:SF 1 "register_operand" "a"))))] ! 865: "" ! 866: "* ! 867: { ! 868: CC_STATUS_INIT; ! 869: return \"cvfl %0\"; ! 870: }") ! 871: ! 872: ! 873: ; fix_truncsfsi2 to convert a double to long, tahoe must have the double ! 874: ; in the fpp accumulator. Flags are not set here. ! 875: ! 876: (define_insn "fix_truncdfsi2" ! 877: [(set (match_operand:SI 0 "general_operand" "=g") ! 878: (fix:SI (fix:DF (match_operand:DF 1 "register_operand" "a"))))] ! 879: "" ! 880: "* ! 881: { ! 882: CC_STATUS_INIT; ! 883: return \"cvdl %0\"; ! 884: }") ! 885: ! 886: ! 887: (define_insn "truncsihi2" ! 888: [(set (match_operand:HI 0 "general_operand" "=g") ! 889: (truncate:HI (match_operand:SI 1 "general_operand" "g")))] ! 890: "" ! 891: "cvtlw %1,%0") ! 892: ! 893: ! 894: (define_insn "truncsiqi2" ! 895: [(set (match_operand:QI 0 "general_operand" "=g") ! 896: (truncate:QI (match_operand:SI 1 "general_operand" "g")))] ! 897: "" ! 898: "cvtlb %1,%0") ! 899: ! 900: ! 901: (define_insn "trunchiqi2" ! 902: [(set (match_operand:QI 0 "general_operand" "=g") ! 903: (truncate:QI (match_operand:HI 1 "general_operand" "g")))] ! 904: "" ! 905: "cvtwb %1,%0") ! 906: ! 907: ! 908: ; The fpp related instructions don't set flags, so ignore them ! 909: ; after this instruction. ! 910: ! 911: (define_insn "truncdfsf2" ! 912: [(set (match_operand:SF 0 "register_operand" "=a") ! 913: (float_truncate:SF (match_operand:DF 1 "register_operand" "0")))] ! 914: "" ! 915: "* ! 916: { ! 917: CC_STATUS_INIT; ! 918: return \"cvdf\"; ! 919: }") ! 920: ! 921: ! 922: ; This monster is to cover for the Tahoe's nasty habit of not extending ! 923: ; a number if the source is in a register. (It just moves it!) Case 0 is ! 924: ; a normal extend from memory. Case 1 does the extension from the top of ! 925: ; the stack. Extension from the stack doesn't set the flags right since ! 926: ; the moval changes them. ! 927: ! 928: (define_insn "extendhisi2" ! 929: [(set (match_operand:SI 0 "general_operand" "=g,?=g") ! 930: (sign_extend:SI (match_operand:HI 1 "general_operand" "m,r")))] ! 931: "" ! 932: "* ! 933: { ! 934: switch (which_alternative) ! 935: { ! 936: case 0: ! 937: return \"cvtwl %1,%0\"; ! 938: case 1: ! 939: if (push_operand(operands[0], SImode)) ! 940: return \"pushl %1\;cvtwl 2(sp),(sp)\"; ! 941: else ! 942: { ! 943: CC_STATUS_INIT; ! 944: return \"pushl %1\;cvtwl 2(sp),%0\;moval 4(sp),sp\"; ! 945: } ! 946: } ! 947: }") ! 948: ! 949: ! 950: ; This monster is to cover for the Tahoe's nasty habit of not extending ! 951: ; a number if the source is in a register. (It just moves it!) Case 0 is ! 952: ; a normal extend from memory. Case 1 does the extension from the top of ! 953: ; the stack. Extension from the stack doesn't set the flags right since ! 954: ; the moval changes them. ! 955: ! 956: (define_insn "extendqisi2" ! 957: [(set (match_operand:SI 0 "general_operand" "=g,?=g") ! 958: (sign_extend:SI (match_operand:QI 1 "general_operand" "m,r")))] ! 959: "" ! 960: "* ! 961: { ! 962: switch (which_alternative) ! 963: { ! 964: case 0: ! 965: return \"cvtbl %1,%0\"; ! 966: case 1: ! 967: if (push_operand(operands[0], SImode)) ! 968: return \"pushl %1\;cvtbl 3(sp),(sp)\"; ! 969: else ! 970: { ! 971: CC_STATUS_INIT; ! 972: return \"pushl %1\;cvtbl 3(sp),%0\;moval 4(sp),sp\"; ! 973: } ! 974: } ! 975: }") ! 976: ! 977: ! 978: ; This monster is to cover for the Tahoe's nasty habit of not extending ! 979: ; a number if the source is in a register. (It just moves it!) Case 0 is ! 980: ; a normal extend from memory. Case 1 does the extension from the top of ! 981: ; the stack. Extension from the stack doesn't set the flags right since ! 982: ; the moval changes them. ! 983: ! 984: (define_insn "extendqihi2" ! 985: [(set (match_operand:HI 0 "general_operand" "=g,?=g") ! 986: (sign_extend:HI (match_operand:QI 1 "general_operand" "m,r")))] ! 987: "" ! 988: "* ! 989: { ! 990: switch (which_alternative) ! 991: { ! 992: case 0: ! 993: return \"cvtbw %1,%0\"; ! 994: case 1: ! 995: if (push_operand(operands[0], SImode)) ! 996: return \"pushl %1\;cvtbw 3(sp),2(sp)\"; ! 997: else { ! 998: CC_STATUS_INIT; ! 999: return \"pushl %1\;cvtbw 3(sp),%0\;moval 4(sp),sp\"; ! 1000: } ! 1001: } ! 1002: }") ! 1003: ! 1004: ! 1005: ; extendsfdf2 tahoe uses the fpp accumulator to do the extension. ! 1006: ; It takes a float and loads it up directly as a double. ! 1007: ! 1008: (define_insn "extendsfdf2" ! 1009: [(set (match_operand:DF 0 "register_operand" "=a") ! 1010: (float_extend:DF (match_operand:SF 1 "general_operand" "g")))] ! 1011: "" ! 1012: "* ! 1013: { ! 1014: CC_STATUS_INIT; ! 1015: return \"ldfd %1\"; ! 1016: }") ! 1017: ! 1018: ! 1019: ; movz works fine from memory but not from register for the same reasons ! 1020: ; the cvt instructions don't work right. So we use the normal instruction ! 1021: ; from memory and we use an and to simulate it from register. This is faster ! 1022: ; than pulling it off the stack. ! 1023: ! 1024: (define_insn "zero_extendhisi2" ! 1025: [(set (match_operand:SI 0 "general_operand" "=g,?=g") ! 1026: (zero_extend:SI (match_operand:HI 1 "general_operand" "m,r")))] ! 1027: "" ! 1028: "* ! 1029: { ! 1030: switch (which_alternative) ! 1031: { ! 1032: case 0: ! 1033: return \"movzwl %1,%0\"; ! 1034: case 1: ! 1035: return \"andl3 $0xffff,%1,%0\"; ! 1036: } ! 1037: }") ! 1038: ! 1039: ! 1040: ; movz works fine from memory but not from register for the same reasons ! 1041: ; the cvt instructions don't work right. So we use the normal instruction ! 1042: ; from memory and we use an and to simulate it from register. This is faster ! 1043: ; than pulling it off the stack. ! 1044: ! 1045: (define_insn "zero_extendqihi2" ! 1046: [(set (match_operand:HI 0 "general_operand" "=g,?=g") ! 1047: (zero_extend:HI (match_operand:QI 1 "general_operand" "m,r")))] ! 1048: "" ! 1049: "* ! 1050: { ! 1051: switch (which_alternative) ! 1052: { ! 1053: case 0: ! 1054: return \"movzbw %1,%0\"; ! 1055: case 1: ! 1056: return \"andw3 $0xff,%1,%0\"; ! 1057: } ! 1058: }") ! 1059: ! 1060: ! 1061: ; movz works fine from memory but not from register for the same reasons ! 1062: ; the cvt instructions don't work right. So we use the normal instruction ! 1063: ; from memory and we use an and to simulate it from register. This is faster ! 1064: ; than pulling it off the stack. ! 1065: ! 1066: (define_insn "zero_extendqisi2" ! 1067: [(set (match_operand:SI 0 "general_operand" "=g,?=g") ! 1068: (zero_extend:SI (match_operand:QI 1 "general_operand" "m,r")))] ! 1069: "" ! 1070: "* ! 1071: { ! 1072: switch (which_alternative) ! 1073: { ! 1074: case 0: ! 1075: return \"movzbl %1,%0\"; ! 1076: case 1: ! 1077: return \"andl3 $0xff,%1,%0\"; ! 1078: } ! 1079: }") ! 1080: ! 1081: ! 1082: (define_insn "beq" ! 1083: [(set (pc) ! 1084: (if_then_else (eq (cc0) ! 1085: (const_int 0)) ! 1086: (label_ref (match_operand 0 "" "")) ! 1087: (pc)))] ! 1088: "" ! 1089: "jeql %l0") ! 1090: ! 1091: ! 1092: (define_insn "bne" ! 1093: [(set (pc) ! 1094: (if_then_else (ne (cc0) ! 1095: (const_int 0)) ! 1096: (label_ref (match_operand 0 "" "")) ! 1097: (pc)))] ! 1098: "" ! 1099: "jneq %l0") ! 1100: ! 1101: ! 1102: (define_insn "bgt" ! 1103: [(set (pc) ! 1104: (if_then_else (gt (cc0) ! 1105: (const_int 0)) ! 1106: (label_ref (match_operand 0 "" "")) ! 1107: (pc)))] ! 1108: "" ! 1109: "jgtr %l0") ! 1110: ! 1111: ! 1112: (define_insn "bgtu" ! 1113: [(set (pc) ! 1114: (if_then_else (gtu (cc0) ! 1115: (const_int 0)) ! 1116: (label_ref (match_operand 0 "" "")) ! 1117: (pc)))] ! 1118: "" ! 1119: "jgtru %l0") ! 1120: ! 1121: ! 1122: (define_insn "blt" ! 1123: [(set (pc) ! 1124: (if_then_else (lt (cc0) ! 1125: (const_int 0)) ! 1126: (label_ref (match_operand 0 "" "")) ! 1127: (pc)))] ! 1128: "" ! 1129: "jlss %l0") ! 1130: ! 1131: ! 1132: (define_insn "bltu" ! 1133: [(set (pc) ! 1134: (if_then_else (ltu (cc0) ! 1135: (const_int 0)) ! 1136: (label_ref (match_operand 0 "" "")) ! 1137: (pc)))] ! 1138: "" ! 1139: "jlssu %l0") ! 1140: ! 1141: ! 1142: (define_insn "bge" ! 1143: [(set (pc) ! 1144: (if_then_else (ge (cc0) ! 1145: (const_int 0)) ! 1146: (label_ref (match_operand 0 "" "")) ! 1147: (pc)))] ! 1148: "" ! 1149: "jgeq %l0") ! 1150: ! 1151: ! 1152: (define_insn "bgeu" ! 1153: [(set (pc) ! 1154: (if_then_else (geu (cc0) ! 1155: (const_int 0)) ! 1156: (label_ref (match_operand 0 "" "")) ! 1157: (pc)))] ! 1158: "" ! 1159: "jgequ %l0") ! 1160: ! 1161: ! 1162: (define_insn "ble" ! 1163: [(set (pc) ! 1164: (if_then_else (le (cc0) ! 1165: (const_int 0)) ! 1166: (label_ref (match_operand 0 "" "")) ! 1167: (pc)))] ! 1168: "" ! 1169: "jleq %l0") ! 1170: ! 1171: ! 1172: (define_insn "bleu" ! 1173: [(set (pc) ! 1174: (if_then_else (leu (cc0) ! 1175: (const_int 0)) ! 1176: (label_ref (match_operand 0 "" "")) ! 1177: (pc)))] ! 1178: "" ! 1179: "jlequ %l0") ! 1180: ! 1181: ! 1182: ; GCC does not account for register mask/argc longword. Thus the number ! 1183: ; for the call = number bytes for args + 4 ! 1184: ! 1185: (define_insn "call" ! 1186: [(call (match_operand:QI 0 "general_operand" "g") ! 1187: (match_operand:QI 1 "general_operand" "g"))] ! 1188: "" ! 1189: "* ! 1190: { ! 1191: operands[1] = gen_rtx (CONST_INT, VOIDmode, (INTVAL (operands[1]) + 4)); ! 1192: return \"calls %1,%0\"; ! 1193: }") ! 1194: ! 1195: ! 1196: ; GCC does not account for register mask/argc longword. Thus the number ! 1197: ; for the call = number bytes for args + 4 ! 1198: ! 1199: (define_insn "call_value" ! 1200: [(set (match_operand 0 "" "=g") ! 1201: (call (match_operand:QI 1 "general_operand" "g") ! 1202: (match_operand:QI 2 "general_operand" "g")))] ! 1203: "" ! 1204: "* ! 1205: { ! 1206: operands[2] = gen_rtx (CONST_INT, VOIDmode, (INTVAL (operands[2]) + 4)); ! 1207: return \"calls %2,%1\"; ! 1208: }") ! 1209: ! 1210: ! 1211: (define_insn "nop" ! 1212: [(const_int 0)] ! 1213: "" ! 1214: "nop") ! 1215: ! 1216: ! 1217: (define_insn "return" ! 1218: [(return)] ! 1219: "" ! 1220: "ret") ! 1221: ! 1222: ! 1223: ; casesi, extracted from the vax code. The instructions are ! 1224: ; very similar. Tahoe requires that the table be word aligned. GCC ! 1225: ; places the table immediately after, thus the alignment directive. ! 1226: ! 1227: (define_insn "casesi" ! 1228: [(set (pc) ! 1229: (if_then_else (le (minus:SI (match_operand:SI 0 "general_operand" "g") ! 1230: (match_operand:SI 1 "general_operand" "g")) ! 1231: (match_operand:SI 2 "general_operand" "g")) ! 1232: (plus:SI (sign_extend:SI ! 1233: (mem:HI (plus:SI (pc) ! 1234: (minus:SI (match_dup 0) ! 1235: (match_dup 1))))) ! 1236: (label_ref:SI (match_operand 3 "" ""))) ! 1237: (pc)))] ! 1238: "" ! 1239: "casel %0,%1,%2\;.align %@") ! 1240: ! 1241: ! 1242: (define_insn "jump" ! 1243: [(set (pc) ! 1244: (label_ref (match_operand 0 "" "")))] ! 1245: "" ! 1246: "jbr %l0") ! 1247: ! 1248: ! 1249: ;; This is the list of all the non-standard insn patterns ! 1250: ! 1251: ! 1252: ; This is used to access the address of a byte. This is similar to ! 1253: ; movqi, but the second operand had to be "address_operand" type, so ! 1254: ; it had to be an unnamed one. ! 1255: ! 1256: (define_insn "" ! 1257: [(set (match_operand:SI 0 "general_operand" "=g") ! 1258: (match_operand:QI 1 "address_operand" "p"))] ! 1259: "" ! 1260: "* ! 1261: { ! 1262: if (push_operand (operands[0], SImode)) ! 1263: return \"pushab %a1\"; ! 1264: return \"movab %a1,%0\"; ! 1265: }") ! 1266: ! 1267: ; This is used to access the address of a word. This is similar to ! 1268: ; movhi, but the second operand had to be "address_operand" type, so ! 1269: ; it had to be an unnamed one. ! 1270: ! 1271: (define_insn "" ! 1272: [(set (match_operand:SI 0 "general_operand" "=g") ! 1273: (match_operand:HI 1 "address_operand" "p"))] ! 1274: "" ! 1275: "* ! 1276: { ! 1277: if (push_operand (operands[0], SImode)) ! 1278: return \"pushaw %a1\"; ! 1279: return \"movaw %a1,%0\"; ! 1280: }") ! 1281: ! 1282: ; This is used to access the address of a long. This is similar to ! 1283: ; movsi, but the second operand had to be "address_operand" type, so ! 1284: ; it had to be an unnamed one. ! 1285: ! 1286: (define_insn "" ! 1287: [(set (match_operand:SI 0 "general_operand" "=g") ! 1288: (match_operand:SI 1 "address_operand" "p"))] ! 1289: "" ! 1290: "* ! 1291: { ! 1292: if (push_operand (operands[0], SImode)) ! 1293: return \"pushal %a1\"; ! 1294: return \"moval %a1,%0\"; ! 1295: }") ! 1296: ! 1297: ; The tahoe doesn't have an 8 byte indexed move address command ! 1298: ; and GCC needs it. To work around it, double the index (%2) and ! 1299: ; then use the 4 byte indexed move address command. ! 1300: ; ! 1301: ;(define_insn "" ! 1302: ; [(set (match_operand:SI 0 "general_operand" "=g") ! 1303: ; (plus:SI (match_operand:SI 1 "general_operand" "g") ! 1304: ; (mult:SI (match_operand:SI 2 "register_operand" "r") ! 1305: ; (const_int 8))))] ! 1306: ; "" ! 1307: ; "* ! 1308: ;{ ! 1309: ; if (GET_CODE (operands[0]) == REG && ! 1310: ; REGNO (operands[0]) == REGNO (operands[2])) { ! 1311: ; return \"shll $3,%2,%2\;addl3 %1,%2,%0\"; ! 1312: ; } else { ! 1313: ; return \"shll $3,%2,%2\;addl3 %1,%2,%0\;shrl $3,%2,%2\"; } ! 1314: ;}") ! 1315: ! 1316: ! 1317: ; Bit test longword instruction, same as vax. ! 1318: ! 1319: (define_insn "" ! 1320: [(set (cc0) ! 1321: (and:SI (match_operand:SI 0 "general_operand" "g") ! 1322: (match_operand:SI 1 "general_operand" "g")))] ! 1323: "" ! 1324: "bitl %0,%1") ! 1325: ! 1326: ! 1327: ; Bit test word instructions, same as vax. ! 1328: ! 1329: (define_insn "" ! 1330: [(set (cc0) ! 1331: (and:HI (match_operand:HI 0 "general_operand" "g") ! 1332: (match_operand:HI 1 "general_operand" "g")))] ! 1333: "" ! 1334: "bitw %0,%1") ! 1335: ! 1336: ! 1337: ; Bit test instructions, same as vax. ! 1338: ! 1339: (define_insn "" ! 1340: [(set (cc0) ! 1341: (and:QI (match_operand:QI 0 "general_operand" "g") ! 1342: (match_operand:QI 1 "general_operand" "g")))] ! 1343: "" ! 1344: "bitb %0,%1") ! 1345: ! 1346: ! 1347: ; bne counterpart. In case GCC reverses the conditional. ! 1348: ! 1349: (define_insn "" ! 1350: [(set (pc) ! 1351: (if_then_else (eq (cc0) ! 1352: (const_int 0)) ! 1353: (pc) ! 1354: (label_ref (match_operand 0 "" ""))))] ! 1355: "" ! 1356: "jneq %l0") ! 1357: ! 1358: ! 1359: ; beq counterpart. In case GCC reverses the conditional. ! 1360: ! 1361: (define_insn "" ! 1362: [(set (pc) ! 1363: (if_then_else (ne (cc0) ! 1364: (const_int 0)) ! 1365: (pc) ! 1366: (label_ref (match_operand 0 "" ""))))] ! 1367: "" ! 1368: "jeql %l0") ! 1369: ! 1370: ! 1371: ; ble counterpart. In case GCC reverses the conditional. ! 1372: ! 1373: (define_insn "" ! 1374: [(set (pc) ! 1375: (if_then_else (gt (cc0) ! 1376: (const_int 0)) ! 1377: (pc) ! 1378: (label_ref (match_operand 0 "" ""))))] ! 1379: "" ! 1380: "jleq %l0") ! 1381: ! 1382: ! 1383: ; bleu counterpart. In case GCC reverses the conditional. ! 1384: ! 1385: (define_insn "" ! 1386: [(set (pc) ! 1387: (if_then_else (gtu (cc0) ! 1388: (const_int 0)) ! 1389: (pc) ! 1390: (label_ref (match_operand 0 "" ""))))] ! 1391: "" ! 1392: "jlequ %l0") ! 1393: ! 1394: ! 1395: ; bge counterpart. In case GCC reverses the conditional. ! 1396: ! 1397: (define_insn "" ! 1398: [(set (pc) ! 1399: (if_then_else (lt (cc0) ! 1400: (const_int 0)) ! 1401: (pc) ! 1402: (label_ref (match_operand 0 "" ""))))] ! 1403: "" ! 1404: "jgeq %l0") ! 1405: ! 1406: ! 1407: ; bgeu counterpart. In case GCC reverses the conditional. ! 1408: ! 1409: (define_insn "" ! 1410: [(set (pc) ! 1411: (if_then_else (ltu (cc0) ! 1412: (const_int 0)) ! 1413: (pc) ! 1414: (label_ref (match_operand 0 "" ""))))] ! 1415: "" ! 1416: "jgequ %l0") ! 1417: ! 1418: ! 1419: ; blt counterpart. In case GCC reverses the conditional. ! 1420: ! 1421: (define_insn "" ! 1422: [(set (pc) ! 1423: (if_then_else (ge (cc0) ! 1424: (const_int 0)) ! 1425: (pc) ! 1426: (label_ref (match_operand 0 "" ""))))] ! 1427: "" ! 1428: "jlss %l0") ! 1429: ! 1430: ! 1431: ; bltu counterpart. In case GCC reverses the conditional. ! 1432: ! 1433: (define_insn "" ! 1434: [(set (pc) ! 1435: (if_then_else (geu (cc0) ! 1436: (const_int 0)) ! 1437: (pc) ! 1438: (label_ref (match_operand 0 "" ""))))] ! 1439: "" ! 1440: "jlssu %l0") ! 1441: ! 1442: ! 1443: ; bgt counterpart. In case GCC reverses the conditional. ! 1444: ! 1445: (define_insn "" ! 1446: [(set (pc) ! 1447: (if_then_else (le (cc0) ! 1448: (const_int 0)) ! 1449: (pc) ! 1450: (label_ref (match_operand 0 "" ""))))] ! 1451: "" ! 1452: "jgtr %l0") ! 1453: ! 1454: ! 1455: ; bgtu counterpart. In case GCC reverses the conditional. ! 1456: ! 1457: (define_insn "" ! 1458: [(set (pc) ! 1459: (if_then_else (leu (cc0) ! 1460: (const_int 0)) ! 1461: (pc) ! 1462: (label_ref (match_operand 0 "" ""))))] ! 1463: "" ! 1464: "jgtru %l0") ! 1465: ! 1466: ! 1467: ; casesi alternate form as found in vax code. This form is to ! 1468: ; compensate for the table's offset being no distance (0 displacement) ! 1469: ! 1470: (define_insn "" ! 1471: [(set (pc) ! 1472: (if_then_else (le (match_operand:SI 0 "general_operand" "g") ! 1473: (match_operand:SI 1 "general_operand" "g")) ! 1474: (plus:SI (sign_extend:SI ! 1475: (mem:HI (plus:SI (pc) ! 1476: (minus:SI (match_dup 0) ! 1477: (const_int 0))))) ! 1478: (label_ref:SI (match_operand 3 "" ""))) ! 1479: (pc)))] ! 1480: "" ! 1481: "casel %0,$0,%1\;.align %@") ! 1482: ! 1483: ! 1484: ; casesi alternate form as found in vax code. Another form to ! 1485: ; compensate for the table's offset being no distance (0 displacement) ! 1486: ! 1487: (define_insn "" ! 1488: [(set (pc) ! 1489: (if_then_else (le (match_operand:SI 0 "general_operand" "g") ! 1490: (match_operand:SI 1 "general_operand" "g")) ! 1491: (plus:SI (sign_extend:SI ! 1492: (mem:HI (plus:SI (pc) ! 1493: (match_dup 0)))) ! 1494: (label_ref:SI (match_operand 3 "" ""))) ! 1495: (pc)))] ! 1496: "" ! 1497: "casel %0,$0,%1 \;.align %@")
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.