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