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