|
|
1.1 root 1: ;;- Machine description for GNU compiler, Vax Version 1.1.1.3 ! root 2: ;; Copyright (C) 1987, 1988, 1991, 1994, 1995 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 1.1.1.3 ! root 18: ;; the Free Software Foundation, 59 Temple Place - Suite 330, ! 19: ;; Boston, MA 02111-1307, USA. 1.1 root 20: 21: 22: ;;- Instruction patterns. When multiple patterns apply, 23: ;;- the first one in the file is chosen. 24: ;;- 25: ;;- See file "rtl.def" for documentation on define_insn, match_*, et. al. 26: ;;- 27: ;;- cpp macro #define NOTICE_UPDATE_CC in file tm.h handles condition code 28: ;;- updates for most instructions. 29: 30: ;; We don't want to allow a constant operand for test insns because 31: ;; (set (cc0) (const_int foo)) has no mode information. Such insns will 32: ;; be folded while optimizing anyway. 33: 34: (define_insn "tstsi" 35: [(set (cc0) 36: (match_operand:SI 0 "nonimmediate_operand" "g"))] 37: "" 38: "tstl %0") 39: 40: (define_insn "tsthi" 41: [(set (cc0) 42: (match_operand:HI 0 "nonimmediate_operand" "g"))] 43: "" 44: "tstw %0") 45: 46: (define_insn "tstqi" 47: [(set (cc0) 48: (match_operand:QI 0 "nonimmediate_operand" "g"))] 49: "" 50: "tstb %0") 51: 52: (define_insn "tstdf" 53: [(set (cc0) 54: (match_operand:DF 0 "general_operand" "gF"))] 55: "" 56: "tst%# %0") 57: 58: (define_insn "tstsf" 59: [(set (cc0) 60: (match_operand:SF 0 "general_operand" "gF"))] 61: "" 62: "tstf %0") 63: 64: (define_insn "cmpsi" 65: [(set (cc0) 66: (compare (match_operand:SI 0 "nonimmediate_operand" "g") 67: (match_operand:SI 1 "general_operand" "g")))] 68: "" 69: "cmpl %0,%1") 70: 71: (define_insn "cmphi" 72: [(set (cc0) 73: (compare (match_operand:HI 0 "nonimmediate_operand" "g") 74: (match_operand:HI 1 "general_operand" "g")))] 75: "" 76: "cmpw %0,%1") 77: 78: (define_insn "cmpqi" 79: [(set (cc0) 80: (compare (match_operand:QI 0 "nonimmediate_operand" "g") 81: (match_operand:QI 1 "general_operand" "g")))] 82: "" 83: "cmpb %0,%1") 84: 85: (define_insn "cmpdf" 86: [(set (cc0) 87: (compare (match_operand:DF 0 "general_operand" "gF,gF") 88: (match_operand:DF 1 "general_operand" "G,gF")))] 89: "" 90: "@ 91: tst%# %0 92: cmp%# %0,%1") 93: 94: (define_insn "cmpsf" 95: [(set (cc0) 96: (compare (match_operand:SF 0 "general_operand" "gF,gF") 97: (match_operand:SF 1 "general_operand" "G,gF")))] 98: "" 99: "@ 100: tstf %0 101: cmpf %0,%1") 102: 103: (define_insn "" 104: [(set (cc0) 105: (and:SI (match_operand:SI 0 "general_operand" "g") 106: (match_operand:SI 1 "general_operand" "g")))] 107: "" 108: "bitl %0,%1") 109: 110: (define_insn "" 111: [(set (cc0) 112: (and:HI (match_operand:HI 0 "general_operand" "g") 113: (match_operand:HI 1 "general_operand" "g")))] 114: "" 115: "bitw %0,%1") 116: 117: (define_insn "" 118: [(set (cc0) 119: (and:QI (match_operand:QI 0 "general_operand" "g") 120: (match_operand:QI 1 "general_operand" "g")))] 121: "" 122: "bitb %0,%1") 123: 124: ;; The vax has no sltu or sgeu patterns, but does have two-operand 125: ;; add/subtract with carry. This is still better than the alternative. 126: ;; Since the cc0-using insn cannot be separated from the cc0-setting insn, 127: ;; and the two are created independently, we can't just use a define_expand 128: ;; to try to optimize this. (The "movl" and "clrl" insns alter the cc0 129: ;; flags, but leave the carry flag alone, but that can't easily be expressed.) 130: ;; 131: ;; Several two-operator combinations could be added to make slightly more 132: ;; optimal code, but they'd have to cover all combinations of plus and minus 133: ;; using match_dup. If you want to do this, I'd suggest changing the "sgeu" 134: ;; pattern to something like (minus (const_int 1) (ltu ...)), so fewer 135: ;; patterns need to be recognized. 136: ;; -- Ken Raeburn ([email protected]) 24 August 1991. 137: 138: (define_insn "sltu" 139: [(set (match_operand:SI 0 "general_operand" "=ro") 140: (ltu (cc0) (const_int 0)))] 141: "" 142: "clrl %0\;adwc $0,%0") 143: 144: (define_insn "sgeu" 145: [(set (match_operand:SI 0 "general_operand" "=ro") 146: (geu (cc0) (const_int 0)))] 147: "" 148: "movl $1,%0\;sbwc $0,%0") 149: 150: (define_insn "movdf" 151: [(set (match_operand:DF 0 "general_operand" "=g,g") 152: (match_operand:DF 1 "general_operand" "G,gF"))] 153: "" 154: "@ 155: clr%# %0 156: mov%# %1,%0") 157: 158: (define_insn "movsf" 159: [(set (match_operand:SF 0 "general_operand" "=g,g") 160: (match_operand:SF 1 "general_operand" "G,gF"))] 161: "" 162: "@ 163: clrf %0 164: movf %1,%0") 165: 166: ;; Some vaxes don't support this instruction. 167: ;;(define_insn "movti" 168: ;; [(set (match_operand:TI 0 "general_operand" "=g") 169: ;; (match_operand:TI 1 "general_operand" "g"))] 170: ;; "" 171: ;; "movh %1,%0") 172: 173: (define_insn "movdi" 174: [(set (match_operand:DI 0 "general_operand" "=g,g") 175: (match_operand:DI 1 "general_operand" "I,g"))] 176: "" 177: "@ 178: clrq %0 179: movq %D1,%0") 180: 181: ;; The VAX move instructions have space-time tradeoffs. On a microVAX 182: ;; register-register mov instructions take 3 bytes and 2 CPU cycles. clrl 183: ;; takes 2 bytes and 3 cycles. mov from constant to register takes 2 cycles 184: ;; if the constant is smaller than 4 bytes, 3 cycles for a longword 185: ;; constant. movz, mneg, and mcom are as fast as mov, so movzwl is faster 186: ;; than movl for positive constants that fit in 16 bits but not 6 bits. cvt 187: ;; instructions take 4 cycles. inc takes 3 cycles. The machine description 188: ;; is willing to trade 1 byte for 1 cycle (clrl instead of movl $0; cvtwl 189: ;; instead of movl). 190: 191: ;; Cycle counts for other models may vary (on a VAX 750 they are similar, 192: ;; but on a VAX 9000 most move and add instructions with one constant 193: ;; operand take 1 cycle). 194: 195: ;; Loads of constants between 64 and 128 used to be done with 196: ;; "addl3 $63,#,dst" but this is slower than movzbl and takes as much space. 197: 198: (define_insn "movsi" 199: [(set (match_operand:SI 0 "general_operand" "=g") 200: (match_operand:SI 1 "general_operand" "g"))] 201: "" 202: "* 203: { 204: rtx link; 205: if (operands[1] == const1_rtx 206: && (link = find_reg_note (insn, REG_WAS_0, 0)) 207: /* Make sure the insn that stored the 0 is still present. */ 208: && ! INSN_DELETED_P (XEXP (link, 0)) 209: && GET_CODE (XEXP (link, 0)) != NOTE 210: /* Make sure cross jumping didn't happen here. */ 211: && no_labels_between_p (XEXP (link, 0), insn) 212: /* Make sure the reg hasn't been clobbered. */ 213: && ! reg_set_between_p (operands[0], XEXP (link, 0), insn)) 214: return \"incl %0\"; 215: if (GET_CODE (operands[1]) == SYMBOL_REF || GET_CODE (operands[1]) == CONST) 216: { 217: if (push_operand (operands[0], SImode)) 218: return \"pushab %a1\"; 219: return \"movab %a1,%0\"; 220: } 221: if (operands[1] == const0_rtx) 222: return \"clrl %0\"; 223: if (GET_CODE (operands[1]) == CONST_INT 224: && (unsigned) INTVAL (operands[1]) >= 64) 225: { 226: int i = INTVAL (operands[1]); 227: if ((unsigned)(~i) < 64) 228: return \"mcoml %N1,%0\"; 229: if ((unsigned)i < 0x100) 230: return \"movzbl %1,%0\"; 231: if (i >= -0x80 && i < 0) 232: return \"cvtbl %1,%0\"; 233: if ((unsigned)i < 0x10000) 234: return \"movzwl %1,%0\"; 235: if (i >= -0x8000 && i < 0) 236: return \"cvtwl %1,%0\"; 237: } 238: if (push_operand (operands[0], SImode)) 239: return \"pushl %1\"; 240: return \"movl %1,%0\"; 241: }") 242: 243: (define_insn "movhi" 244: [(set (match_operand:HI 0 "general_operand" "=g") 245: (match_operand:HI 1 "general_operand" "g"))] 246: "" 247: "* 248: { 249: rtx link; 250: if (operands[1] == const1_rtx 251: && (link = find_reg_note (insn, REG_WAS_0, 0)) 252: /* Make sure the insn that stored the 0 is still present. */ 253: && ! INSN_DELETED_P (XEXP (link, 0)) 254: && GET_CODE (XEXP (link, 0)) != NOTE 255: /* Make sure cross jumping didn't happen here. */ 256: && no_labels_between_p (XEXP (link, 0), insn) 257: /* Make sure the reg hasn't been clobbered. */ 258: && ! reg_set_between_p (operands[0], XEXP (link, 0), insn)) 259: return \"incw %0\"; 260: 261: if (GET_CODE (operands[1]) == CONST_INT) 262: { 263: int i = INTVAL (operands[1]); 264: if (i == 0) 265: return \"clrw %0\"; 266: else if ((unsigned int)i < 64) 267: return \"movw %1,%0\"; 268: else if ((unsigned int)~i < 64) 269: return \"mcomw %H1,%0\"; 270: else if ((unsigned int)i < 256) 271: return \"movzbw %1,%0\"; 272: } 273: return \"movw %1,%0\"; 274: }") 275: 276: (define_insn "movstricthi" 277: [(set (strict_low_part (match_operand:HI 0 "register_operand" "=g")) 278: (match_operand:HI 1 "general_operand" "g"))] 279: "" 280: "* 281: { 282: if (GET_CODE (operands[1]) == CONST_INT) 283: { 284: int i = INTVAL (operands[1]); 285: if (i == 0) 286: return \"clrw %0\"; 287: else if ((unsigned int)i < 64) 288: return \"movw %1,%0\"; 289: else if ((unsigned int)~i < 64) 290: return \"mcomw %H1,%0\"; 291: else if ((unsigned int)i < 256) 292: return \"movzbw %1,%0\"; 293: } 294: return \"movw %1,%0\"; 295: }") 296: 297: (define_insn "movqi" 298: [(set (match_operand:QI 0 "general_operand" "=g") 299: (match_operand:QI 1 "general_operand" "g"))] 300: "" 301: "* 302: { 303: rtx link; 304: if (operands[1] == const1_rtx 305: && (link = find_reg_note (insn, REG_WAS_0, 0)) 306: /* Make sure the insn that stored the 0 is still present. */ 307: && ! INSN_DELETED_P (XEXP (link, 0)) 308: && GET_CODE (XEXP (link, 0)) != NOTE 309: /* Make sure cross jumping didn't happen here. */ 310: && no_labels_between_p (XEXP (link, 0), insn) 311: /* Make sure the reg hasn't been clobbered. */ 312: && ! reg_set_between_p (operands[0], XEXP (link, 0), insn)) 313: return \"incb %0\"; 314: 315: if (GET_CODE (operands[1]) == CONST_INT) 316: { 317: int i = INTVAL (operands[1]); 318: if (i == 0) 319: return \"clrb %0\"; 320: else if ((unsigned int)~i < 64) 321: return \"mcomb %B1,%0\"; 322: } 323: return \"movb %1,%0\"; 324: }") 325: 326: (define_insn "movstrictqi" 327: [(set (strict_low_part (match_operand:QI 0 "register_operand" "=g")) 328: (match_operand:QI 1 "general_operand" "g"))] 329: "" 330: "* 331: { 332: if (GET_CODE (operands[1]) == CONST_INT) 333: { 334: int i = INTVAL (operands[1]); 335: if (i == 0) 336: return \"clrb %0\"; 337: else if ((unsigned int)~i < 64) 338: return \"mcomb %B1,%0\"; 339: } 340: return \"movb %1,%0\"; 341: }") 342: 343: ;; This is here to accept 4 arguments and pass the first 3 along 344: ;; to the movstrhi1 pattern that really does the work. 345: (define_expand "movstrhi" 346: [(set (match_operand:BLK 0 "general_operand" "=g") 347: (match_operand:BLK 1 "general_operand" "g")) 348: (use (match_operand:HI 2 "general_operand" "g")) 349: (match_operand 3 "" "")] 350: "" 351: " 352: emit_insn (gen_movstrhi1 (operands[0], operands[1], operands[2])); 353: DONE; 354: ") 355: 356: ;; The definition of this insn does not really explain what it does, 357: ;; but it should suffice 358: ;; that anything generated as this insn will be recognized as one 359: ;; and that it won't successfully combine with anything. 360: (define_insn "movstrhi1" 361: [(set (match_operand:BLK 0 "general_operand" "=g") 362: (match_operand:BLK 1 "general_operand" "g")) 363: (use (match_operand:HI 2 "general_operand" "g")) 364: (clobber (reg:SI 0)) 365: (clobber (reg:SI 1)) 366: (clobber (reg:SI 2)) 367: (clobber (reg:SI 3)) 368: (clobber (reg:SI 4)) 369: (clobber (reg:SI 5))] 370: "" 371: "movc3 %2,%1,%0") 372: 373: ;; Extension and truncation insns. 374: 375: (define_insn "truncsiqi2" 376: [(set (match_operand:QI 0 "general_operand" "=g") 377: (truncate:QI (match_operand:SI 1 "nonimmediate_operand" "g")))] 378: "" 379: "cvtlb %1,%0") 380: 381: (define_insn "truncsihi2" 382: [(set (match_operand:HI 0 "general_operand" "=g") 383: (truncate:HI (match_operand:SI 1 "nonimmediate_operand" "g")))] 384: "" 385: "cvtlw %1,%0") 386: 387: (define_insn "trunchiqi2" 388: [(set (match_operand:QI 0 "general_operand" "=g") 389: (truncate:QI (match_operand:HI 1 "nonimmediate_operand" "g")))] 390: "" 391: "cvtwb %1,%0") 392: 393: (define_insn "extendhisi2" 394: [(set (match_operand:SI 0 "general_operand" "=g") 395: (sign_extend:SI (match_operand:HI 1 "nonimmediate_operand" "g")))] 396: "" 397: "cvtwl %1,%0") 398: 399: (define_insn "extendqihi2" 400: [(set (match_operand:HI 0 "general_operand" "=g") 401: (sign_extend:HI (match_operand:QI 1 "nonimmediate_operand" "g")))] 402: "" 403: "cvtbw %1,%0") 404: 405: (define_insn "extendqisi2" 406: [(set (match_operand:SI 0 "general_operand" "=g") 407: (sign_extend:SI (match_operand:QI 1 "nonimmediate_operand" "g")))] 408: "" 409: "cvtbl %1,%0") 410: 411: (define_insn "extendsfdf2" 412: [(set (match_operand:DF 0 "general_operand" "=g") 413: (float_extend:DF (match_operand:SF 1 "general_operand" "gF")))] 414: "" 415: "cvtf%# %1,%0") 416: 417: (define_insn "truncdfsf2" 418: [(set (match_operand:SF 0 "general_operand" "=g") 419: (float_truncate:SF (match_operand:DF 1 "general_operand" "gF")))] 420: "" 421: "cvt%#f %1,%0") 422: 423: (define_insn "zero_extendhisi2" 424: [(set (match_operand:SI 0 "general_operand" "=g") 425: (zero_extend:SI (match_operand:HI 1 "nonimmediate_operand" "g")))] 426: "" 427: "movzwl %1,%0") 428: 429: (define_insn "zero_extendqihi2" 430: [(set (match_operand:HI 0 "general_operand" "=g") 431: (zero_extend:HI (match_operand:QI 1 "nonimmediate_operand" "g")))] 432: "" 433: "movzbw %1,%0") 434: 435: (define_insn "zero_extendqisi2" 436: [(set (match_operand:SI 0 "general_operand" "=g") 437: (zero_extend:SI (match_operand:QI 1 "nonimmediate_operand" "g")))] 438: "" 439: "movzbl %1,%0") 440: 441: ;; Fix-to-float conversion insns. 442: 443: (define_insn "floatsisf2" 444: [(set (match_operand:SF 0 "general_operand" "=g") 445: (float:SF (match_operand:SI 1 "nonimmediate_operand" "g")))] 446: "" 447: "cvtlf %1,%0") 448: 449: (define_insn "floatsidf2" 450: [(set (match_operand:DF 0 "general_operand" "=g") 451: (float:DF (match_operand:SI 1 "nonimmediate_operand" "g")))] 452: "" 453: "cvtl%# %1,%0") 454: 455: (define_insn "floathisf2" 456: [(set (match_operand:SF 0 "general_operand" "=g") 457: (float:SF (match_operand:HI 1 "nonimmediate_operand" "g")))] 458: "" 459: "cvtwf %1,%0") 460: 461: (define_insn "floathidf2" 462: [(set (match_operand:DF 0 "general_operand" "=g") 463: (float:DF (match_operand:HI 1 "nonimmediate_operand" "g")))] 464: "" 465: "cvtw%# %1,%0") 466: 467: (define_insn "floatqisf2" 468: [(set (match_operand:SF 0 "general_operand" "=g") 469: (float:SF (match_operand:QI 1 "nonimmediate_operand" "g")))] 470: "" 471: "cvtbf %1,%0") 472: 473: (define_insn "floatqidf2" 474: [(set (match_operand:DF 0 "general_operand" "=g") 475: (float:DF (match_operand:QI 1 "nonimmediate_operand" "g")))] 476: "" 477: "cvtb%# %1,%0") 478: 479: ;; Float-to-fix conversion insns. 480: 481: (define_insn "fix_truncsfqi2" 482: [(set (match_operand:QI 0 "general_operand" "=g") 483: (fix:QI (fix:SF (match_operand:SF 1 "general_operand" "gF"))))] 484: "" 485: "cvtfb %1,%0") 486: 487: (define_insn "fix_truncsfhi2" 488: [(set (match_operand:HI 0 "general_operand" "=g") 489: (fix:HI (fix:SF (match_operand:SF 1 "general_operand" "gF"))))] 490: "" 491: "cvtfw %1,%0") 492: 493: (define_insn "fix_truncsfsi2" 494: [(set (match_operand:SI 0 "general_operand" "=g") 495: (fix:SI (fix:SF (match_operand:SF 1 "general_operand" "gF"))))] 496: "" 497: "cvtfl %1,%0") 498: 499: (define_insn "fix_truncdfqi2" 500: [(set (match_operand:QI 0 "general_operand" "=g") 501: (fix:QI (fix:DF (match_operand:DF 1 "general_operand" "gF"))))] 502: "" 503: "cvt%#b %1,%0") 504: 505: (define_insn "fix_truncdfhi2" 506: [(set (match_operand:HI 0 "general_operand" "=g") 507: (fix:HI (fix:DF (match_operand:DF 1 "general_operand" "gF"))))] 508: "" 509: "cvt%#w %1,%0") 510: 511: (define_insn "fix_truncdfsi2" 512: [(set (match_operand:SI 0 "general_operand" "=g") 513: (fix:SI (fix:DF (match_operand:DF 1 "general_operand" "gF"))))] 514: "" 515: "cvt%#l %1,%0") 516: 517: ;;- All kinds of add instructions. 518: 519: (define_insn "adddf3" 520: [(set (match_operand:DF 0 "general_operand" "=g,g,g") 521: (plus:DF (match_operand:DF 1 "general_operand" "0,gF,gF") 522: (match_operand:DF 2 "general_operand" "gF,0,gF")))] 523: "" 524: "@ 525: add%#2 %2,%0 526: add%#2 %1,%0 527: add%#3 %1,%2,%0") 528: 529: (define_insn "addsf3" 530: [(set (match_operand:SF 0 "general_operand" "=g,g,g") 531: (plus:SF (match_operand:SF 1 "general_operand" "0,gF,gF") 532: (match_operand:SF 2 "general_operand" "gF,0,gF")))] 533: "" 534: "@ 535: addf2 %2,%0 536: addf2 %1,%0 537: addf3 %1,%2,%0") 538: 539: /* The space-time-opcode tradeoffs for addition vary by model of VAX. 540: 541: On a VAX 3 "movab (r1)[r2],r3" is faster than "addl3 r1,r2,r3", 542: but it not faster on other models. 543: 544: "movab #(r1),r2" is usually shorter than "addl3 #,r1,r2", and is 545: faster on a VAX 3, but some VAXes (e.g. VAX 9000) will stall if 546: a register is used in an address too soon after it is set. 547: Compromise by using movab only when it is shorter than the add 548: or the base register in the address is one of sp, ap, and fp, 549: which are not modified very often. */ 550: 551: 552: (define_insn "addsi3" 553: [(set (match_operand:SI 0 "general_operand" "=g") 554: (plus:SI (match_operand:SI 1 "general_operand" "g") 555: (match_operand:SI 2 "general_operand" "g")))] 556: "" 557: "* 558: { 559: if (rtx_equal_p (operands[0], operands[1])) 560: { 561: if (operands[2] == const1_rtx) 562: return \"incl %0\"; 563: if (operands[2] == constm1_rtx) 564: return \"decl %0\"; 565: if (GET_CODE (operands[2]) == CONST_INT 566: && (unsigned) (- INTVAL (operands[2])) < 64) 567: return \"subl2 $%n2,%0\"; 568: if (GET_CODE (operands[2]) == CONST_INT 569: && (unsigned) INTVAL (operands[2]) >= 64 570: && GET_CODE (operands[1]) == REG 571: && ((INTVAL (operands[2]) < 32767 && INTVAL (operands[2]) > -32768) 572: || REGNO (operands[1]) > 11)) 573: return \"movab %c2(%1),%0\"; 574: return \"addl2 %2,%0\"; 575: } 576: if (rtx_equal_p (operands[0], operands[2])) 577: return \"addl2 %1,%0\"; 578: 579: if (GET_CODE (operands[2]) == CONST_INT 580: && INTVAL (operands[2]) < 32767 581: && INTVAL (operands[2]) > -32768 582: && GET_CODE (operands[1]) == REG 583: && push_operand (operands[0], SImode)) 584: return \"pushab %c2(%1)\"; 585: 586: if (GET_CODE (operands[2]) == CONST_INT 587: && (unsigned) (- INTVAL (operands[2])) < 64) 588: return \"subl3 $%n2,%1,%0\"; 589: 590: if (GET_CODE (operands[2]) == CONST_INT 591: && (unsigned) INTVAL (operands[2]) >= 64 592: && GET_CODE (operands[1]) == REG 593: && ((INTVAL (operands[2]) < 32767 && INTVAL (operands[2]) > -32768) 594: || REGNO (operands[1]) > 11)) 595: return \"movab %c2(%1),%0\"; 596: 597: /* Add this if using gcc on a VAX 3xxx: 598: if (REG_P (operands[1]) && REG_P (operands[2])) 599: return \"movab (%1)[%2],%0\"; 600: */ 601: return \"addl3 %1,%2,%0\"; 602: }") 603: 604: (define_insn "addhi3" 605: [(set (match_operand:HI 0 "general_operand" "=g") 606: (plus:HI (match_operand:HI 1 "general_operand" "g") 607: (match_operand:HI 2 "general_operand" "g")))] 608: "" 609: "* 610: { 611: if (rtx_equal_p (operands[0], operands[1])) 612: { 613: if (operands[2] == const1_rtx) 614: return \"incw %0\"; 615: if (operands[2] == constm1_rtx) 616: return \"decw %0\"; 617: if (GET_CODE (operands[2]) == CONST_INT 618: && (unsigned) (- INTVAL (operands[2])) < 64) 619: return \"subw2 $%n2,%0\"; 620: return \"addw2 %2,%0\"; 621: } 622: if (rtx_equal_p (operands[0], operands[2])) 623: return \"addw2 %1,%0\"; 624: if (GET_CODE (operands[2]) == CONST_INT 625: && (unsigned) (- INTVAL (operands[2])) < 64) 626: return \"subw3 $%n2,%1,%0\"; 627: return \"addw3 %1,%2,%0\"; 628: }") 629: 630: (define_insn "addqi3" 631: [(set (match_operand:QI 0 "general_operand" "=g") 632: (plus:QI (match_operand:QI 1 "general_operand" "g") 633: (match_operand:QI 2 "general_operand" "g")))] 634: "" 635: "* 636: { 637: if (rtx_equal_p (operands[0], operands[1])) 638: { 639: if (operands[2] == const1_rtx) 640: return \"incb %0\"; 641: if (operands[2] == constm1_rtx) 642: return \"decb %0\"; 643: if (GET_CODE (operands[2]) == CONST_INT 644: && (unsigned) (- INTVAL (operands[2])) < 64) 645: return \"subb2 $%n2,%0\"; 646: return \"addb2 %2,%0\"; 647: } 648: if (rtx_equal_p (operands[0], operands[2])) 649: return \"addb2 %1,%0\"; 650: if (GET_CODE (operands[2]) == CONST_INT 651: && (unsigned) (- INTVAL (operands[2])) < 64) 652: return \"subb3 $%n2,%1,%0\"; 653: return \"addb3 %1,%2,%0\"; 654: }") 655: 656: ;; The add-with-carry (adwc) instruction only accepts two operands. 657: (define_insn "adddi3" 658: [(set (match_operand:DI 0 "general_operand" "=ro>,ro>") 659: (plus:DI (match_operand:DI 1 "general_operand" "%0,ro>") 660: (match_operand:DI 2 "general_operand" "Fro,F")))] 661: "" 662: "* 663: { 664: rtx low[3]; 665: char *pattern; 666: int carry = 1; 667: 668: split_quadword_operands (operands, low, 3); 669: /* Add low parts. */ 670: if (rtx_equal_p (operands[0], operands[1])) 671: { 672: if (low[2] == const0_rtx) 673: /* Should examine operand, punt if not POST_INC. */ 674: pattern = \"tstl %0\", carry = 0; 675: else if (low[2] == const1_rtx) 676: pattern = \"incl %0\"; 677: else 678: pattern = \"addl2 %2,%0\"; 679: } 680: else 681: { 682: if (low[2] == const0_rtx) 683: pattern = \"movl %1,%0\", carry = 0; 684: else 685: pattern = \"addl3 %2,%1,%0\"; 686: } 687: if (pattern) 688: output_asm_insn (pattern, low); 689: if (!carry) 690: /* If CARRY is 0, we don't have any carry value to worry about. */ 691: return OUT_FCN (CODE_FOR_addsi3) (operands, insn); 692: /* %0 = C + %1 + %2 */ 693: if (!rtx_equal_p (operands[0], operands[1])) 694: output_asm_insn ((operands[1] == const0_rtx 695: ? \"clrl %0\" 696: : \"movl %1,%0\"), operands); 697: return \"adwc %2,%0\"; 698: }") 699: 700: ;;- All kinds of subtract instructions. 701: 702: (define_insn "subdf3" 703: [(set (match_operand:DF 0 "general_operand" "=g,g") 704: (minus:DF (match_operand:DF 1 "general_operand" "0,gF") 705: (match_operand:DF 2 "general_operand" "gF,gF")))] 706: "" 707: "@ 708: sub%#2 %2,%0 709: sub%#3 %2,%1,%0") 710: 711: (define_insn "subsf3" 712: [(set (match_operand:SF 0 "general_operand" "=g,g") 713: (minus:SF (match_operand:SF 1 "general_operand" "0,gF") 714: (match_operand:SF 2 "general_operand" "gF,gF")))] 715: "" 716: "@ 717: subf2 %2,%0 718: subf3 %2,%1,%0") 719: 720: (define_insn "subsi3" 721: [(set (match_operand:SI 0 "general_operand" "=g,g") 722: (minus:SI (match_operand:SI 1 "general_operand" "0,g") 723: (match_operand:SI 2 "general_operand" "g,g")))] 724: "" 725: "@ 726: subl2 %2,%0 727: subl3 %2,%1,%0") 728: 729: (define_insn "subhi3" 730: [(set (match_operand:HI 0 "general_operand" "=g,g") 731: (minus:HI (match_operand:HI 1 "general_operand" "0,g") 732: (match_operand:HI 2 "general_operand" "g,g")))] 733: "" 734: "@ 735: subw2 %2,%0 736: subw3 %2,%1,%0") 737: 738: (define_insn "subqi3" 739: [(set (match_operand:QI 0 "general_operand" "=g,g") 740: (minus:QI (match_operand:QI 1 "general_operand" "0,g") 741: (match_operand:QI 2 "general_operand" "g,g")))] 742: "" 743: "@ 744: subb2 %2,%0 745: subb3 %2,%1,%0") 746: 747: ;; The subtract-with-carry (sbwc) instruction only takes two operands. 748: (define_insn "subdi3" 749: [(set (match_operand:DI 0 "general_operand" "=or>,or>") 750: (minus:DI (match_operand:DI 1 "general_operand" "0,or>") 751: (match_operand:DI 2 "general_operand" "For,F")))] 752: "" 753: "* 754: { 755: rtx low[3]; 756: char *pattern; 757: int carry = 1; 758: 759: split_quadword_operands (operands, low, 3); 760: /* Subtract low parts. */ 761: if (rtx_equal_p (operands[0], operands[1])) 762: { 763: if (low[2] == const0_rtx) 764: pattern = 0, carry = 0; 765: else if (low[2] == constm1_rtx) 766: pattern = \"decl %0\"; 767: else 768: pattern = \"subl2 %2,%0\"; 769: } 770: else 771: { 772: if (low[2] == constm1_rtx) 773: pattern = \"decl %0\"; 774: else if (low[2] == const0_rtx) 775: pattern = OUT_FCN (CODE_FOR_movsi) (low, insn), carry = 0; 776: else 777: pattern = \"subl3 %2,%1,%0\"; 778: } 779: if (pattern) 780: output_asm_insn (pattern, low); 781: if (carry) 782: { 783: if (!rtx_equal_p (operands[0], operands[1])) 784: return \"movl %1,%0\;sbwc %2,%0\"; 785: return \"sbwc %2,%0\"; 786: /* %0 = %2 - %1 - C */ 787: } 788: return OUT_FCN (CODE_FOR_subsi3) (operands, insn); 789: }") 790: 791: ;;- Multiply instructions. 792: 793: (define_insn "muldf3" 794: [(set (match_operand:DF 0 "general_operand" "=g,g,g") 795: (mult:DF (match_operand:DF 1 "general_operand" "0,gF,gF") 796: (match_operand:DF 2 "general_operand" "gF,0,gF")))] 797: "" 798: "@ 799: mul%#2 %2,%0 800: mul%#2 %1,%0 801: mul%#3 %1,%2,%0") 802: 803: (define_insn "mulsf3" 804: [(set (match_operand:SF 0 "general_operand" "=g,g,g") 805: (mult:SF (match_operand:SF 1 "general_operand" "0,gF,gF") 806: (match_operand:SF 2 "general_operand" "gF,0,gF")))] 807: "" 808: "@ 809: mulf2 %2,%0 810: mulf2 %1,%0 811: mulf3 %1,%2,%0") 812: 813: (define_insn "mulsi3" 814: [(set (match_operand:SI 0 "general_operand" "=g,g,g") 815: (mult:SI (match_operand:SI 1 "general_operand" "0,g,g") 816: (match_operand:SI 2 "general_operand" "g,0,g")))] 817: "" 818: "@ 819: mull2 %2,%0 820: mull2 %1,%0 821: mull3 %1,%2,%0") 822: 823: (define_insn "mulhi3" 824: [(set (match_operand:HI 0 "general_operand" "=g,g,") 825: (mult:HI (match_operand:HI 1 "general_operand" "0,g,g") 826: (match_operand:HI 2 "general_operand" "g,0,g")))] 827: "" 828: "@ 829: mulw2 %2,%0 830: mulw2 %1,%0 831: mulw3 %1,%2,%0") 832: 833: (define_insn "mulqi3" 834: [(set (match_operand:QI 0 "general_operand" "=g,g,g") 835: (mult:QI (match_operand:QI 1 "general_operand" "0,g,g") 836: (match_operand:QI 2 "general_operand" "g,0,g")))] 837: "" 838: "@ 839: mulb2 %2,%0 840: mulb2 %1,%0 841: mulb3 %1,%2,%0") 842: 843: (define_insn "mulsidi3" 844: [(set (match_operand:DI 0 "general_operand" "=g") 845: (mult:DI (sign_extend:DI 846: (match_operand:SI 1 "nonimmediate_operand" "g")) 847: (sign_extend:DI 848: (match_operand:SI 2 "nonimmediate_operand" "g"))))] 849: "" 850: "emul %1,%2,$0,%0") 851: 852: (define_insn "" 853: [(set (match_operand:DI 0 "general_operand" "=g") 854: (plus:DI 855: (mult:DI (sign_extend:DI 856: (match_operand:SI 1 "nonimmediate_operand" "g")) 857: (sign_extend:DI 858: (match_operand:SI 2 "nonimmediate_operand" "g"))) 859: (sign_extend:DI (match_operand:SI 3 "nonimmediate_operand" "g"))))] 860: "" 861: "emul %1,%2,%3,%0") 862: 863: ;; 'F' constraint means type CONST_DOUBLE 864: (define_insn "" 865: [(set (match_operand:DI 0 "general_operand" "=g") 866: (plus:DI 867: (mult:DI (sign_extend:DI 868: (match_operand:SI 1 "nonimmediate_operand" "g")) 869: (sign_extend:DI 870: (match_operand:SI 2 "nonimmediate_operand" "g"))) 871: (match_operand:DI 3 "immediate_operand" "F")))] 872: "GET_CODE (operands[3]) == CONST_DOUBLE 873: && CONST_DOUBLE_HIGH (operands[3]) == (CONST_DOUBLE_LOW (operands[3]) >> 31)" 874: "* 875: { 876: if (CONST_DOUBLE_HIGH (operands[3])) 877: operands[3] = gen_rtx (CONST_INT, VOIDmode, CONST_DOUBLE_LOW (operands[3])); 878: return \"emul %1,%2,%3,%0\"; 879: }") 880: 881: ;;- Divide instructions. 882: 883: (define_insn "divdf3" 884: [(set (match_operand:DF 0 "general_operand" "=g,g") 885: (div:DF (match_operand:DF 1 "general_operand" "0,gF") 886: (match_operand:DF 2 "general_operand" "gF,gF")))] 887: "" 888: "@ 889: div%#2 %2,%0 890: div%#3 %2,%1,%0") 891: 892: (define_insn "divsf3" 893: [(set (match_operand:SF 0 "general_operand" "=g,g") 894: (div:SF (match_operand:SF 1 "general_operand" "0,gF") 895: (match_operand:SF 2 "general_operand" "gF,gF")))] 896: "" 897: "@ 898: divf2 %2,%0 899: divf3 %2,%1,%0") 900: 901: (define_insn "divsi3" 902: [(set (match_operand:SI 0 "general_operand" "=g,g") 903: (div:SI (match_operand:SI 1 "general_operand" "0,g") 904: (match_operand:SI 2 "general_operand" "g,g")))] 905: "" 906: "@ 907: divl2 %2,%0 908: divl3 %2,%1,%0") 909: 910: (define_insn "divhi3" 911: [(set (match_operand:HI 0 "general_operand" "=g,g") 912: (div:HI (match_operand:HI 1 "general_operand" "0,g") 913: (match_operand:HI 2 "general_operand" "g,g")))] 914: "" 915: "@ 916: divw2 %2,%0 917: divw3 %2,%1,%0") 918: 919: (define_insn "divqi3" 920: [(set (match_operand:QI 0 "general_operand" "=g,g") 921: (div:QI (match_operand:QI 1 "general_operand" "0,g") 922: (match_operand:QI 2 "general_operand" "g,g")))] 923: "" 924: "@ 925: divb2 %2,%0 926: divb3 %2,%1,%0") 927: 928: ;This is left out because it is very slow; 929: ;we are better off programming around the "lack" of this insn. 930: ;(define_insn "divmoddisi4" 931: ; [(set (match_operand:SI 0 "general_operand" "=g") 932: ; (div:SI (match_operand:DI 1 "general_operand" "g") 933: ; (match_operand:SI 2 "general_operand" "g"))) 934: ; (set (match_operand:SI 3 "general_operand" "=g") 935: ; (mod:SI (match_operand:DI 1 "general_operand" "g") 936: ; (match_operand:SI 2 "general_operand" "g")))] 937: ; "" 938: ; "ediv %2,%1,%0,%3") 939: 940: ;; Bit-and on the vax is done with a clear-bits insn. 941: (define_expand "andsi3" 942: [(set (match_operand:SI 0 "general_operand" "=g") 943: (and:SI (not:SI (match_operand:SI 1 "general_operand" "g")) 944: (match_operand:SI 2 "general_operand" "g")))] 945: "" 946: " 947: { 948: rtx op1 = operands[1]; 949: 950: /* If there is a constant argument, complement that one. */ 951: if (GET_CODE (operands[2]) == CONST_INT && GET_CODE (op1) != CONST_INT) 952: { 953: operands[1] = operands[2]; 954: operands[2] = op1; 955: op1 = operands[1]; 956: } 957: 958: if (GET_CODE (op1) == CONST_INT) 959: operands[1] = gen_rtx (CONST_INT, VOIDmode, ~INTVAL (op1)); 960: else 961: operands[1] = expand_unop (SImode, one_cmpl_optab, op1, 0, 1); 962: }") 963: 964: (define_expand "andhi3" 965: [(set (match_operand:HI 0 "general_operand" "=g") 966: (and:HI (not:HI (match_operand:HI 1 "general_operand" "g")) 967: (match_operand:HI 2 "general_operand" "g")))] 968: "" 969: " 970: { 971: rtx op1 = operands[1]; 972: 973: if (GET_CODE (operands[2]) == CONST_INT && GET_CODE (op1) != CONST_INT) 974: { 975: operands[1] = operands[2]; 976: operands[2] = op1; 977: op1 = operands[1]; 978: } 979: 980: if (GET_CODE (op1) == CONST_INT) 981: operands[1] = gen_rtx (CONST_INT, VOIDmode, 65535 & ~INTVAL (op1)); 982: else 983: operands[1] = expand_unop (HImode, one_cmpl_optab, op1, 0, 1); 984: }") 985: 986: (define_expand "andqi3" 987: [(set (match_operand:QI 0 "general_operand" "=g") 988: (and:QI (not:QI (match_operand:QI 1 "general_operand" "g")) 989: (match_operand:QI 2 "general_operand" "g")))] 990: "" 991: " 992: { 993: rtx op1 = operands[1]; 994: 995: if (GET_CODE (operands[2]) == CONST_INT && GET_CODE (op1) != CONST_INT) 996: { 997: operands[1] = operands[2]; 998: operands[2] = op1; 999: op1 = operands[1]; 1000: } 1001: 1002: if (GET_CODE (op1) == CONST_INT) 1003: operands[1] = gen_rtx (CONST_INT, VOIDmode, 255 & ~INTVAL (op1)); 1004: else 1005: operands[1] = expand_unop (QImode, one_cmpl_optab, op1, 0, 1); 1006: }") 1007: 1008: (define_insn "" 1009: [(set (match_operand:SI 0 "general_operand" "=g,g") 1010: (and:SI (not:SI (match_operand:SI 1 "general_operand" "g,g")) 1011: (match_operand:SI 2 "general_operand" "0,g")))] 1012: "" 1013: "@ 1014: bicl2 %1,%0 1015: bicl3 %1,%2,%0") 1016: 1017: (define_insn "" 1018: [(set (match_operand:HI 0 "general_operand" "=g,g") 1019: (and:HI (not:HI (match_operand:HI 1 "general_operand" "g,g")) 1020: (match_operand:HI 2 "general_operand" "0,g")))] 1021: "" 1022: "@ 1023: bicw2 %1,%0 1024: bicw3 %1,%2,%0") 1025: 1026: (define_insn "" 1027: [(set (match_operand:QI 0 "general_operand" "=g,g") 1028: (and:QI (not:QI (match_operand:QI 1 "general_operand" "g,g")) 1029: (match_operand:QI 2 "general_operand" "0,g")))] 1030: "" 1031: "@ 1032: bicb2 %1,%0 1033: bicb3 %1,%2,%0") 1034: 1035: ;; The following used to be needed because constant propagation can 1036: ;; create them starting from the bic insn patterns above. This is no 1037: ;; longer a problem. However, having these patterns allows optimization 1038: ;; opportunities in combine.c. 1039: 1040: (define_insn "" 1041: [(set (match_operand:SI 0 "general_operand" "=g,g") 1042: (and:SI (match_operand:SI 1 "general_operand" "0,g") 1043: (match_operand:SI 2 "const_int_operand" "n,n")))] 1044: "" 1045: "@ 1046: bicl2 %N2,%0 1047: bicl3 %N2,%1,%0") 1048: 1049: (define_insn "" 1050: [(set (match_operand:HI 0 "general_operand" "=g,g") 1051: (and:HI (match_operand:HI 1 "general_operand" "0,g") 1052: (match_operand:HI 2 "const_int_operand" "n,n")))] 1053: "" 1054: "@ 1055: bicw2 %H2,%0 1056: bicw3 %H2,%1,%0") 1057: 1058: (define_insn "" 1059: [(set (match_operand:QI 0 "general_operand" "=g,g") 1060: (and:QI (match_operand:QI 1 "general_operand" "0,g") 1061: (match_operand:QI 2 "const_int_operand" "n,n")))] 1062: "" 1063: "@ 1064: bicb2 %B2,%0 1065: bicb3 %B2,%1,%0") 1066: 1067: ;;- Bit set instructions. 1068: 1069: (define_insn "iorsi3" 1070: [(set (match_operand:SI 0 "general_operand" "=g,g,g") 1071: (ior:SI (match_operand:SI 1 "general_operand" "0,g,g") 1072: (match_operand:SI 2 "general_operand" "g,0,g")))] 1073: "" 1074: "@ 1075: bisl2 %2,%0 1076: bisl2 %1,%0 1077: bisl3 %2,%1,%0") 1078: 1079: (define_insn "iorhi3" 1080: [(set (match_operand:HI 0 "general_operand" "=g,g,g") 1081: (ior:HI (match_operand:HI 1 "general_operand" "0,g,g") 1082: (match_operand:HI 2 "general_operand" "g,0,g")))] 1083: "" 1084: "@ 1085: bisw2 %2,%0 1086: bisw2 %1,%0 1087: bisw3 %2,%1,%0") 1088: 1089: (define_insn "iorqi3" 1090: [(set (match_operand:QI 0 "general_operand" "=g,g,g") 1091: (ior:QI (match_operand:QI 1 "general_operand" "0,g,g") 1092: (match_operand:QI 2 "general_operand" "g,0,g")))] 1093: "" 1094: "@ 1095: bisb2 %2,%0 1096: bisb2 %1,%0 1097: bisb3 %2,%1,%0") 1098: 1099: ;;- xor instructions. 1100: 1101: (define_insn "xorsi3" 1102: [(set (match_operand:SI 0 "general_operand" "=g,g,g") 1103: (xor:SI (match_operand:SI 1 "general_operand" "0,g,g") 1104: (match_operand:SI 2 "general_operand" "g,0,g")))] 1105: "" 1106: "@ 1107: xorl2 %2,%0 1108: xorl2 %1,%0 1109: xorl3 %2,%1,%0") 1110: 1111: (define_insn "xorhi3" 1112: [(set (match_operand:HI 0 "general_operand" "=g,g,g") 1113: (xor:HI (match_operand:HI 1 "general_operand" "0,g,g") 1114: (match_operand:HI 2 "general_operand" "g,0,g")))] 1115: "" 1116: "@ 1117: xorw2 %2,%0 1118: xorw2 %1,%0 1119: xorw3 %2,%1,%0") 1120: 1121: (define_insn "xorqi3" 1122: [(set (match_operand:QI 0 "general_operand" "=g,g,g") 1123: (xor:QI (match_operand:QI 1 "general_operand" "0,g,g") 1124: (match_operand:QI 2 "general_operand" "g,0,g")))] 1125: "" 1126: "@ 1127: xorb2 %2,%0 1128: xorb2 %1,%0 1129: xorb3 %2,%1,%0") 1130: 1131: (define_insn "negdf2" 1132: [(set (match_operand:DF 0 "general_operand" "=g") 1133: (neg:DF (match_operand:DF 1 "general_operand" "gF")))] 1134: "" 1135: "mneg%# %1,%0") 1136: 1137: (define_insn "negsf2" 1138: [(set (match_operand:SF 0 "general_operand" "=g") 1139: (neg:SF (match_operand:SF 1 "general_operand" "gF")))] 1140: "" 1141: "mnegf %1,%0") 1142: 1143: (define_insn "negsi2" 1144: [(set (match_operand:SI 0 "general_operand" "=g") 1145: (neg:SI (match_operand:SI 1 "general_operand" "g")))] 1146: "" 1147: "mnegl %1,%0") 1148: 1149: (define_insn "neghi2" 1150: [(set (match_operand:HI 0 "general_operand" "=g") 1151: (neg:HI (match_operand:HI 1 "general_operand" "g")))] 1152: "" 1153: "mnegw %1,%0") 1154: 1155: (define_insn "negqi2" 1156: [(set (match_operand:QI 0 "general_operand" "=g") 1157: (neg:QI (match_operand:QI 1 "general_operand" "g")))] 1158: "" 1159: "mnegb %1,%0") 1160: 1161: (define_insn "one_cmplsi2" 1162: [(set (match_operand:SI 0 "general_operand" "=g") 1163: (not:SI (match_operand:SI 1 "general_operand" "g")))] 1164: "" 1165: "mcoml %1,%0") 1166: 1167: (define_insn "one_cmplhi2" 1168: [(set (match_operand:HI 0 "general_operand" "=g") 1169: (not:HI (match_operand:HI 1 "general_operand" "g")))] 1170: "" 1171: "mcomw %1,%0") 1172: 1173: (define_insn "one_cmplqi2" 1174: [(set (match_operand:QI 0 "general_operand" "=g") 1175: (not:QI (match_operand:QI 1 "general_operand" "g")))] 1176: "" 1177: "mcomb %1,%0") 1178: 1179: ;; Arithmetic right shift on the vax works by negating the shift count, 1180: ;; then emitting a right shift with the shift count negated. This means 1181: ;; that all actual shift counts in the RTL will be positive. This 1182: ;; prevents converting shifts to ZERO_EXTRACTs with negative positions, 1183: ;; which isn't valid. 1184: (define_expand "ashrsi3" 1185: [(set (match_operand:SI 0 "general_operand" "=g") 1186: (ashiftrt:SI (match_operand:SI 1 "general_operand" "g") 1187: (match_operand:QI 2 "general_operand" "g")))] 1188: "" 1189: " 1190: { 1191: if (GET_CODE (operands[2]) != CONST_INT) 1192: operands[2] = gen_rtx (NEG, QImode, negate_rtx (QImode, operands[2])); 1193: }") 1194: 1195: (define_insn "" 1196: [(set (match_operand:SI 0 "general_operand" "=g") 1197: (ashiftrt:SI (match_operand:SI 1 "general_operand" "g") 1198: (match_operand:QI 2 "const_int_operand" "n")))] 1199: "" 1200: "ashl $%n2,%1,%0") 1201: 1202: (define_insn "" 1203: [(set (match_operand:SI 0 "general_operand" "=g") 1204: (ashiftrt:SI (match_operand:SI 1 "general_operand" "g") 1205: (neg:QI (match_operand:QI 2 "general_operand" "g"))))] 1206: "" 1207: "ashl %2,%1,%0") 1208: 1209: (define_insn "ashlsi3" 1210: [(set (match_operand:SI 0 "general_operand" "=g") 1211: (ashift:SI (match_operand:SI 1 "general_operand" "g") 1212: (match_operand:QI 2 "general_operand" "g")))] 1213: "" 1214: "* 1215: { 1216: if (operands[2] == const1_rtx && rtx_equal_p (operands[0], operands[1])) 1217: return \"addl2 %0,%0\"; 1218: if (GET_CODE (operands[1]) == REG 1219: && GET_CODE (operands[2]) == CONST_INT) 1220: { 1221: int i = INTVAL (operands[2]); 1222: if (i == 1) 1223: return \"addl3 %1,%1,%0\"; 1224: if (i == 2) 1225: return \"moval 0[%1],%0\"; 1226: if (i == 3) 1227: return \"movad 0[%1],%0\"; 1228: } 1229: return \"ashl %2,%1,%0\"; 1230: }") 1231: 1232: ;; Arithmetic right shift on the vax works by negating the shift count. 1233: (define_expand "ashrdi3" 1234: [(set (match_operand:DI 0 "general_operand" "=g") 1235: (ashiftrt:DI (match_operand:DI 1 "general_operand" "g") 1236: (match_operand:QI 2 "general_operand" "g")))] 1237: "" 1238: " 1239: { 1240: operands[2] = gen_rtx (NEG, QImode, negate_rtx (QImode, operands[2])); 1241: }") 1242: 1243: (define_insn "ashldi3" 1244: [(set (match_operand:DI 0 "general_operand" "=g") 1245: (ashift:DI (match_operand:DI 1 "general_operand" "g") 1246: (match_operand:QI 2 "general_operand" "g")))] 1247: "" 1248: "ashq %2,%1,%0") 1249: 1250: (define_insn "" 1251: [(set (match_operand:DI 0 "general_operand" "=g") 1252: (ashiftrt:DI (match_operand:DI 1 "general_operand" "g") 1253: (neg:QI (match_operand:QI 2 "general_operand" "g"))))] 1254: "" 1255: "ashq %2,%1,%0") 1256: 1.1.1.2 root 1257: ;; We used to have expand_shift handle logical right shifts by using extzv, 1258: ;; but this make it very difficult to do lshrdi3. Since the VAX is the 1259: ;; only machine with this kludge, it's better to just do this with a 1260: ;; define_expand and remove that case from expand_shift. 1261: 1262: (define_expand "lshrsi3" 1263: [(set (match_dup 3) 1264: (minus:QI (const_int 32) 1265: (match_dup 4))) 1266: (set (match_operand:SI 0 "general_operand" "=g") 1267: (zero_extract:SI (match_operand:SI 1 "register_operand" "r") 1268: (match_dup 3) 1269: (match_operand:SI 2 "register_operand" "g")))] 1270: "" 1271: " 1272: { 1273: operands[3] = gen_reg_rtx (QImode); 1274: operands[4] = gen_lowpart (QImode, operands[2]); 1275: }") 1276: 1.1 root 1277: ;; Rotate right on the vax works by negating the shift count. 1278: (define_expand "rotrsi3" 1279: [(set (match_operand:SI 0 "general_operand" "=g") 1280: (rotatert:SI (match_operand:SI 1 "general_operand" "g") 1281: (match_operand:QI 2 "general_operand" "g")))] 1282: "" 1283: " 1284: { 1285: if (GET_CODE (operands[2]) != CONST_INT) 1286: operands[2] = gen_rtx (NEG, QImode, negate_rtx (QImode, operands[2])); 1287: }") 1288: 1289: (define_insn "rotlsi3" 1290: [(set (match_operand:SI 0 "general_operand" "=g") 1291: (rotate:SI (match_operand:SI 1 "general_operand" "g") 1292: (match_operand:QI 2 "general_operand" "g")))] 1293: "" 1294: "rotl %2,%1,%0") 1295: 1296: (define_insn "" 1297: [(set (match_operand:SI 0 "general_operand" "=g") 1298: (rotatert:SI (match_operand:SI 1 "general_operand" "g") 1299: (match_operand:QI 2 "const_int_operand" "n")))] 1300: "" 1301: "rotl $%R2,%1,%0") 1302: 1303: (define_insn "" 1304: [(set (match_operand:SI 0 "general_operand" "=g") 1305: (rotatert:SI (match_operand:SI 1 "general_operand" "g") 1306: (neg:QI (match_operand:QI 2 "general_operand" "g"))))] 1307: "" 1308: "rotl %2,%1,%0") 1309: 1310: ;This insn is probably slower than a multiply and an add. 1311: ;(define_insn "" 1312: ; [(set (match_operand:SI 0 "general_operand" "=g") 1313: ; (mult:SI (plus:SI (match_operand:SI 1 "general_operand" "g") 1314: ; (match_operand:SI 2 "general_operand" "g")) 1315: ; (match_operand:SI 3 "general_operand" "g")))] 1316: ; "" 1317: ; "index %1,$0x80000000,$0x7fffffff,%3,%2,%0") 1318: 1319: ;; Special cases of bit-field insns which we should 1320: ;; recognize in preference to the general case. 1321: ;; These handle aligned 8-bit and 16-bit fields, 1322: ;; which can usually be done with move instructions. 1323: 1324: (define_insn "" 1.1.1.2 root 1325: [(set (zero_extract:SI (match_operand:SI 0 "nonimmediate_operand" "+ro") 1.1 root 1326: (match_operand:QI 1 "const_int_operand" "n") 1327: (match_operand:SI 2 "const_int_operand" "n")) 1328: (match_operand:SI 3 "general_operand" "g"))] 1329: "(INTVAL (operands[1]) == 8 || INTVAL (operands[1]) == 16) 1330: && INTVAL (operands[2]) % INTVAL (operands[1]) == 0 1331: && (GET_CODE (operands[0]) == REG 1332: || ! mode_dependent_address_p (XEXP (operands[0], 0)))" 1333: "* 1334: { 1335: if (REG_P (operands[0])) 1336: { 1337: if (INTVAL (operands[2]) != 0) 1338: return \"insv %3,%2,%1,%0\"; 1339: } 1340: else 1341: operands[0] 1342: = adj_offsettable_operand (operands[0], INTVAL (operands[2]) / 8); 1343: 1344: if (INTVAL (operands[1]) == 8) 1345: return \"movb %3,%0\"; 1346: return \"movw %3,%0\"; 1347: }") 1348: 1349: (define_insn "" 1350: [(set (match_operand:SI 0 "general_operand" "=&g") 1.1.1.2 root 1351: (zero_extract:SI (match_operand:SI 1 "nonimmediate_operand" "ro") 1.1 root 1352: (match_operand:QI 2 "const_int_operand" "n") 1353: (match_operand:SI 3 "const_int_operand" "n")))] 1354: "(INTVAL (operands[2]) == 8 || INTVAL (operands[2]) == 16) 1355: && INTVAL (operands[3]) % INTVAL (operands[2]) == 0 1356: && (GET_CODE (operands[1]) == REG 1357: || ! mode_dependent_address_p (XEXP (operands[1], 0)))" 1358: "* 1359: { 1360: if (REG_P (operands[1])) 1361: { 1362: if (INTVAL (operands[3]) != 0) 1363: return \"extzv %3,%2,%1,%0\"; 1364: } 1365: else 1366: operands[1] 1367: = adj_offsettable_operand (operands[1], INTVAL (operands[3]) / 8); 1368: 1369: if (INTVAL (operands[2]) == 8) 1370: return \"movzbl %1,%0\"; 1371: return \"movzwl %1,%0\"; 1372: }") 1373: 1374: (define_insn "" 1375: [(set (match_operand:SI 0 "general_operand" "=g") 1.1.1.2 root 1376: (sign_extract:SI (match_operand:SI 1 "nonimmediate_operand" "ro") 1.1 root 1377: (match_operand:QI 2 "const_int_operand" "n") 1378: (match_operand:SI 3 "const_int_operand" "n")))] 1379: "(INTVAL (operands[2]) == 8 || INTVAL (operands[2]) == 16) 1380: && INTVAL (operands[3]) % INTVAL (operands[2]) == 0 1381: && (GET_CODE (operands[1]) == REG 1382: || ! mode_dependent_address_p (XEXP (operands[1], 0)))" 1383: "* 1384: { 1385: if (REG_P (operands[1])) 1386: { 1387: if (INTVAL (operands[3]) != 0) 1388: return \"extv %3,%2,%1,%0\"; 1389: } 1390: else 1391: operands[1] 1392: = adj_offsettable_operand (operands[1], INTVAL (operands[3]) / 8); 1393: 1394: if (INTVAL (operands[2]) == 8) 1395: return \"cvtbl %1,%0\"; 1396: return \"cvtwl %1,%0\"; 1397: }") 1398: 1399: ;; Register-only SImode cases of bit-field insns. 1400: 1401: (define_insn "" 1402: [(set (cc0) 1403: (compare 1404: (sign_extract:SI (match_operand:SI 0 "nonmemory_operand" "r") 1405: (match_operand:QI 1 "general_operand" "g") 1406: (match_operand:SI 2 "general_operand" "g")) 1407: (match_operand:SI 3 "general_operand" "g")))] 1408: "" 1409: "cmpv %2,%1,%0,%3") 1410: 1411: (define_insn "" 1412: [(set (cc0) 1413: (compare 1.1.1.2 root 1414: (zero_extract:SI (match_operand:SI 0 "register_operand" "r") 1.1 root 1415: (match_operand:QI 1 "general_operand" "g") 1416: (match_operand:SI 2 "general_operand" "g")) 1417: (match_operand:SI 3 "general_operand" "g")))] 1418: "" 1419: "cmpzv %2,%1,%0,%3") 1420: 1421: ;; When the field position and size are constant and the destination 1422: ;; is a register, extv and extzv are much slower than a rotate followed 1.1.1.3 ! root 1423: ;; by a bicl or sign extension. Because we might end up choosing ext[z]v ! 1424: ;; anyway, we can't allow immediate values for the primary source operand. 1.1 root 1425: 1426: (define_insn "" 1427: [(set (match_operand:SI 0 "general_operand" "=g") 1.1.1.3 ! root 1428: (sign_extract:SI (match_operand:SI 1 "nonimmediate_operand" "ro") 1.1 root 1429: (match_operand:QI 2 "general_operand" "g") 1430: (match_operand:SI 3 "general_operand" "g")))] 1431: "" 1432: "* 1433: { 1434: if (GET_CODE (operands[3]) != CONST_INT || GET_CODE (operands[2]) != CONST_INT 1435: || GET_CODE (operands[0]) != REG 1436: || (INTVAL (operands[2]) != 8 && INTVAL (operands[2]) != 16)) 1437: return \"extv %3,%2,%1,%0\"; 1438: if (INTVAL (operands[2]) == 8) 1439: return \"rotl %R3,%1,%0\;cvtbl %0,%0\"; 1440: return \"rotl %R3,%1,%0\;cvtwl %0,%0\"; 1441: }") 1442: 1443: (define_insn "" 1444: [(set (match_operand:SI 0 "general_operand" "=g") 1.1.1.3 ! root 1445: (zero_extract:SI (match_operand:SI 1 "nonimmediate_operand" "ro") 1.1 root 1446: (match_operand:QI 2 "general_operand" "g") 1447: (match_operand:SI 3 "general_operand" "g")))] 1448: "" 1449: "* 1450: { 1451: if (GET_CODE (operands[3]) != CONST_INT || GET_CODE (operands[2]) != CONST_INT 1452: || GET_CODE (operands[0]) != REG) 1453: return \"extzv %3,%2,%1,%0\"; 1454: if (INTVAL (operands[2]) == 8) 1455: return \"rotl %R3,%1,%0\;movzbl %0,%0\"; 1456: if (INTVAL (operands[2]) == 16) 1457: return \"rotl %R3,%1,%0\;movzwl %0,%0\"; 1458: if (INTVAL (operands[3]) & 31) 1459: return \"rotl %R3,%1,%0\;bicl2 %M2,%0\"; 1460: if (rtx_equal_p (operands[0], operands[1])) 1461: return \"bicl2 %M2,%0\"; 1462: return \"bicl3 %M2,%1,%0\"; 1463: }") 1464: 1465: ;; Non-register cases. 1466: ;; nonimmediate_operand is used to make sure that mode-ambiguous cases 1467: ;; don't match these (and therefore match the cases above instead). 1468: 1469: (define_insn "" 1470: [(set (cc0) 1471: (compare 1472: (sign_extract:SI (match_operand:QI 0 "nonimmediate_operand" "rm") 1473: (match_operand:QI 1 "general_operand" "g") 1474: (match_operand:SI 2 "general_operand" "g")) 1475: (match_operand:SI 3 "general_operand" "g")))] 1476: "" 1477: "cmpv %2,%1,%0,%3") 1478: 1479: (define_insn "" 1480: [(set (cc0) 1481: (compare 1482: (zero_extract:SI (match_operand:QI 0 "nonimmediate_operand" "rm") 1483: (match_operand:QI 1 "general_operand" "g") 1484: (match_operand:SI 2 "general_operand" "g")) 1485: (match_operand:SI 3 "general_operand" "g")))] 1486: "" 1487: "cmpzv %2,%1,%0,%3") 1488: 1489: (define_insn "extv" 1490: [(set (match_operand:SI 0 "general_operand" "=g") 1491: (sign_extract:SI (match_operand:QI 1 "nonimmediate_operand" "rm") 1492: (match_operand:QI 2 "general_operand" "g") 1493: (match_operand:SI 3 "general_operand" "g")))] 1494: "" 1495: "* 1496: { 1497: if (GET_CODE (operands[0]) != REG || GET_CODE (operands[2]) != CONST_INT 1498: || GET_CODE (operands[3]) != CONST_INT 1499: || (INTVAL (operands[2]) != 8 && INTVAL (operands[2]) != 16) 1.1.1.2 root 1500: || INTVAL (operands[2]) + INTVAL (operands[3]) > 32 1.1 root 1501: || side_effects_p (operands[1]) 1502: || (GET_CODE (operands[1]) == MEM 1503: && mode_dependent_address_p (XEXP (operands[1], 0)))) 1504: return \"extv %3,%2,%1,%0\"; 1505: if (INTVAL (operands[2]) == 8) 1506: return \"rotl %R3,%1,%0\;cvtbl %0,%0\"; 1507: return \"rotl %R3,%1,%0\;cvtwl %0,%0\"; 1508: }") 1509: 1510: (define_insn "extzv" 1511: [(set (match_operand:SI 0 "general_operand" "=g") 1512: (zero_extract:SI (match_operand:QI 1 "nonimmediate_operand" "rm") 1513: (match_operand:QI 2 "general_operand" "g") 1514: (match_operand:SI 3 "general_operand" "g")))] 1515: "" 1516: "* 1517: { 1518: if (GET_CODE (operands[0]) != REG || GET_CODE (operands[2]) != CONST_INT 1519: || GET_CODE (operands[3]) != CONST_INT 1.1.1.2 root 1520: || INTVAL (operands[2]) + INTVAL (operands[3]) > 32 1.1 root 1521: || side_effects_p (operands[1]) 1522: || (GET_CODE (operands[1]) == MEM 1523: && mode_dependent_address_p (XEXP (operands[1], 0)))) 1524: return \"extzv %3,%2,%1,%0\"; 1525: if (INTVAL (operands[2]) == 8) 1526: return \"rotl %R3,%1,%0\;movzbl %0,%0\"; 1527: if (INTVAL (operands[2]) == 16) 1528: return \"rotl %R3,%1,%0\;movzwl %0,%0\"; 1529: return \"rotl %R3,%1,%0\;bicl2 %M2,%0\"; 1530: }") 1531: 1532: (define_insn "insv" 1.1.1.2 root 1533: [(set (zero_extract:SI (match_operand:QI 0 "nonimmediate_operand" "+g") 1.1 root 1534: (match_operand:QI 1 "general_operand" "g") 1535: (match_operand:SI 2 "general_operand" "g")) 1536: (match_operand:SI 3 "general_operand" "g"))] 1537: "" 1538: "insv %3,%2,%1,%0") 1539: 1540: (define_insn "" 1.1.1.2 root 1541: [(set (zero_extract:SI (match_operand:SI 0 "nonimmediate_operand" "+r") 1.1 root 1542: (match_operand:QI 1 "general_operand" "g") 1543: (match_operand:SI 2 "general_operand" "g")) 1544: (match_operand:SI 3 "general_operand" "g"))] 1545: "" 1546: "insv %3,%2,%1,%0") 1547: 1548: (define_insn "jump" 1549: [(set (pc) 1550: (label_ref (match_operand 0 "" "")))] 1551: "" 1552: "jbr %l0") 1553: 1554: (define_insn "beq" 1555: [(set (pc) 1556: (if_then_else (eq (cc0) 1557: (const_int 0)) 1558: (label_ref (match_operand 0 "" "")) 1559: (pc)))] 1560: "" 1561: "jeql %l0") 1562: 1563: (define_insn "bne" 1564: [(set (pc) 1565: (if_then_else (ne (cc0) 1566: (const_int 0)) 1567: (label_ref (match_operand 0 "" "")) 1568: (pc)))] 1569: "" 1570: "jneq %l0") 1571: 1572: (define_insn "bgt" 1573: [(set (pc) 1574: (if_then_else (gt (cc0) 1575: (const_int 0)) 1576: (label_ref (match_operand 0 "" "")) 1577: (pc)))] 1578: "" 1579: "jgtr %l0") 1580: 1581: (define_insn "bgtu" 1582: [(set (pc) 1583: (if_then_else (gtu (cc0) 1584: (const_int 0)) 1585: (label_ref (match_operand 0 "" "")) 1586: (pc)))] 1587: "" 1588: "jgtru %l0") 1589: 1590: (define_insn "blt" 1591: [(set (pc) 1592: (if_then_else (lt (cc0) 1593: (const_int 0)) 1594: (label_ref (match_operand 0 "" "")) 1595: (pc)))] 1596: "" 1597: "jlss %l0") 1598: 1599: (define_insn "bltu" 1600: [(set (pc) 1601: (if_then_else (ltu (cc0) 1602: (const_int 0)) 1603: (label_ref (match_operand 0 "" "")) 1604: (pc)))] 1605: "" 1606: "jlssu %l0") 1607: 1608: (define_insn "bge" 1609: [(set (pc) 1610: (if_then_else (ge (cc0) 1611: (const_int 0)) 1612: (label_ref (match_operand 0 "" "")) 1613: (pc)))] 1614: "" 1615: "jgeq %l0") 1616: 1617: (define_insn "bgeu" 1618: [(set (pc) 1619: (if_then_else (geu (cc0) 1620: (const_int 0)) 1621: (label_ref (match_operand 0 "" "")) 1622: (pc)))] 1623: "" 1624: "jgequ %l0") 1625: 1626: (define_insn "ble" 1627: [(set (pc) 1628: (if_then_else (le (cc0) 1629: (const_int 0)) 1630: (label_ref (match_operand 0 "" "")) 1631: (pc)))] 1632: "" 1633: "jleq %l0") 1634: 1635: (define_insn "bleu" 1636: [(set (pc) 1637: (if_then_else (leu (cc0) 1638: (const_int 0)) 1639: (label_ref (match_operand 0 "" "")) 1640: (pc)))] 1641: "" 1642: "jlequ %l0") 1643: 1644: ;; Recognize reversed jumps. 1645: (define_insn "" 1646: [(set (pc) 1647: (if_then_else (match_operator 0 "comparison_operator" 1648: [(cc0) 1649: (const_int 0)]) 1650: (pc) 1651: (label_ref (match_operand 1 "" ""))))] 1652: "" 1653: "j%C0 %l1") ; %C0 negates condition 1654: 1655: ;; Recognize jbs, jlbs, jbc and jlbc instructions. Note that the operand 1656: ;; of jlbs and jlbc insns are SImode in the hardware. However, if it is 1657: ;; memory, we use QImode in the insn. So we can't use those instructions 1658: ;; for mode-dependent addresses. 1659: 1660: (define_insn "" 1661: [(set (pc) 1662: (if_then_else 1663: (ne (zero_extract:SI (match_operand:QI 0 "nonimmediate_operand" "rQ,g") 1664: (const_int 1) 1665: (match_operand:SI 1 "general_operand" "I,g")) 1666: (const_int 0)) 1667: (label_ref (match_operand 2 "" "")) 1668: (pc)))] 1669: "" 1670: "@ 1671: jlbs %0,%l2 1672: jbs %1,%0,%l2") 1673: 1674: (define_insn "" 1675: [(set (pc) 1676: (if_then_else 1677: (eq (zero_extract:SI (match_operand:QI 0 "nonimmediate_operand" "rQ,g") 1678: (const_int 1) 1679: (match_operand:SI 1 "general_operand" "I,g")) 1680: (const_int 0)) 1681: (label_ref (match_operand 2 "" "")) 1682: (pc)))] 1683: "" 1684: "@ 1685: jlbc %0,%l2 1686: jbc %1,%0,%l2") 1687: 1688: (define_insn "" 1689: [(set (pc) 1690: (if_then_else 1691: (ne (zero_extract:SI (match_operand:SI 0 "register_operand" "r,r") 1692: (const_int 1) 1693: (match_operand:SI 1 "general_operand" "I,g")) 1694: (const_int 0)) 1695: (label_ref (match_operand 2 "" "")) 1696: (pc)))] 1697: "" 1698: "@ 1699: jlbs %0,%l2 1700: jbs %1,%0,%l2") 1701: 1702: (define_insn "" 1703: [(set (pc) 1704: (if_then_else 1705: (eq (zero_extract:SI (match_operand:SI 0 "register_operand" "r,r") 1706: (const_int 1) 1707: (match_operand:SI 1 "general_operand" "I,g")) 1708: (const_int 0)) 1709: (label_ref (match_operand 2 "" "")) 1710: (pc)))] 1711: "" 1712: "@ 1713: jlbc %0,%l2 1714: jbc %1,%0,%l2") 1715: 1716: ;; Subtract-and-jump and Add-and-jump insns. 1717: ;; These are not used when output is for the Unix assembler 1718: ;; because it does not know how to modify them to reach far. 1719: 1720: ;; Normal sob insns. 1721: 1722: (define_insn "" 1723: [(set (pc) 1724: (if_then_else 1725: (gt (plus:SI (match_operand:SI 0 "general_operand" "+g") 1726: (const_int -1)) 1727: (const_int 0)) 1728: (label_ref (match_operand 1 "" "")) 1729: (pc))) 1730: (set (match_dup 0) 1731: (plus:SI (match_dup 0) 1732: (const_int -1)))] 1733: "!TARGET_UNIX_ASM" 1734: "jsobgtr %0,%l1") 1735: 1736: (define_insn "" 1737: [(set (pc) 1738: (if_then_else 1739: (ge (plus:SI (match_operand:SI 0 "general_operand" "+g") 1740: (const_int -1)) 1741: (const_int 0)) 1742: (label_ref (match_operand 1 "" "")) 1743: (pc))) 1744: (set (match_dup 0) 1745: (plus:SI (match_dup 0) 1746: (const_int -1)))] 1747: "!TARGET_UNIX_ASM" 1748: "jsobgeq %0,%l1") 1749: 1750: ;; Normal aob insns. Define a version for when operands[1] is a constant. 1751: (define_insn "" 1752: [(set (pc) 1753: (if_then_else 1754: (lt (plus:SI (match_operand:SI 0 "general_operand" "+g") 1755: (const_int 1)) 1756: (match_operand:SI 1 "general_operand" "g")) 1757: (label_ref (match_operand 2 "" "")) 1758: (pc))) 1759: (set (match_dup 0) 1760: (plus:SI (match_dup 0) 1761: (const_int 1)))] 1762: "!TARGET_UNIX_ASM" 1763: "jaoblss %1,%0,%l2") 1764: 1765: (define_insn "" 1766: [(set (pc) 1767: (if_then_else 1768: (lt (match_operand:SI 0 "general_operand" "+g") 1769: (match_operand:SI 1 "general_operand" "g")) 1770: (label_ref (match_operand 2 "" "")) 1771: (pc))) 1772: (set (match_dup 0) 1773: (plus:SI (match_dup 0) 1774: (const_int 1)))] 1775: "!TARGET_UNIX_ASM && GET_CODE (operands[1]) == CONST_INT" 1776: "jaoblss %P1,%0,%l2") 1777: 1778: (define_insn "" 1779: [(set (pc) 1780: (if_then_else 1781: (le (plus:SI (match_operand:SI 0 "general_operand" "+g") 1782: (const_int 1)) 1783: (match_operand:SI 1 "general_operand" "g")) 1784: (label_ref (match_operand 2 "" "")) 1785: (pc))) 1786: (set (match_dup 0) 1787: (plus:SI (match_dup 0) 1788: (const_int 1)))] 1789: "!TARGET_UNIX_ASM" 1790: "jaobleq %1,%0,%l2") 1791: 1792: (define_insn "" 1793: [(set (pc) 1794: (if_then_else 1795: (le (match_operand:SI 0 "general_operand" "+g") 1796: (match_operand:SI 1 "general_operand" "g")) 1797: (label_ref (match_operand 2 "" "")) 1798: (pc))) 1799: (set (match_dup 0) 1800: (plus:SI (match_dup 0) 1801: (const_int 1)))] 1802: "!TARGET_UNIX_ASM && GET_CODE (operands[1]) == CONST_INT" 1803: "jaobleq %P1,%0,%l2") 1804: 1805: ;; Something like a sob insn, but compares against -1. 1806: ;; This finds `while (foo--)' which was changed to `while (--foo != -1)'. 1807: 1808: (define_insn "" 1809: [(set (pc) 1810: (if_then_else 1811: (ne (match_operand:SI 0 "general_operand" "g") 1812: (const_int 0)) 1813: (label_ref (match_operand 1 "" "")) 1814: (pc))) 1815: (set (match_dup 0) 1816: (plus:SI (match_dup 0) 1817: (const_int -1)))] 1818: "" 1819: "decl %0\;jgequ %l1") 1820: 1821: ;; Note that operand 1 is total size of args, in bytes, 1822: ;; and what the call insn wants is the number of words. 1823: (define_insn "call_pop" 1824: [(call (match_operand:QI 0 "memory_operand" "m") 1825: (match_operand:QI 1 "general_operand" "g")) 1826: (set (reg:SI 14) (plus:SI (reg:SI 14) 1827: (match_operand:SI 3 "immediate_operand" "i")))] 1828: "" 1829: "* 1830: if (GET_CODE (operands[1]) != CONST_INT || INTVAL (operands[1]) > 255 * 4) 1831: /* Vax `calls' really uses only one byte of #args, so pop explicitly. */ 1832: return \"calls $0,%0\;addl2 %1,sp\"; 1833: operands[1] = gen_rtx (CONST_INT, VOIDmode, (INTVAL (operands[1]) + 3)/ 4); 1834: return \"calls %1,%0\"; 1835: ") 1836: 1837: (define_insn "call_value_pop" 1838: [(set (match_operand 0 "" "=g") 1839: (call (match_operand:QI 1 "memory_operand" "m") 1840: (match_operand:QI 2 "general_operand" "g"))) 1841: (set (reg:SI 14) (plus:SI (reg:SI 14) 1842: (match_operand:SI 4 "immediate_operand" "i")))] 1843: "" 1844: "* 1845: if (GET_CODE (operands[2]) != CONST_INT || INTVAL (operands[2]) > 255 * 4) 1846: /* Vax `calls' really uses only one byte of #args, so pop explicitly. */ 1847: return \"calls $0,%1\;addl2 %2,sp\"; 1848: operands[2] = gen_rtx (CONST_INT, VOIDmode, (INTVAL (operands[2]) + 3)/ 4); 1849: return \"calls %2,%1\"; 1850: ") 1851: 1852: ;; Define another set of these for the case of functions with no 1853: ;; operands. In that case, combine may simplify the adjustment of sp. 1854: (define_insn "" 1855: [(call (match_operand:QI 0 "memory_operand" "m") 1856: (match_operand:QI 1 "general_operand" "g")) 1857: (set (reg:SI 14) (reg:SI 14))] 1858: "" 1859: "* 1860: if (GET_CODE (operands[1]) != CONST_INT || INTVAL (operands[1]) > 255 * 4) 1861: /* Vax `calls' really uses only one byte of #args, so pop explicitly. */ 1862: return \"calls $0,%0\;addl2 %1,sp\"; 1863: operands[1] = gen_rtx (CONST_INT, VOIDmode, (INTVAL (operands[1]) + 3)/ 4); 1864: return \"calls %1,%0\"; 1865: ") 1866: 1867: (define_insn "" 1868: [(set (match_operand 0 "" "=g") 1869: (call (match_operand:QI 1 "memory_operand" "m") 1870: (match_operand:QI 2 "general_operand" "g"))) 1871: (set (reg:SI 14) (reg:SI 14))] 1872: "" 1873: "* 1874: if (GET_CODE (operands[2]) != CONST_INT || INTVAL (operands[2]) > 255 * 4) 1875: /* Vax `calls' really uses only one byte of #args, so pop explicitly. */ 1876: return \"calls $0,%1\;addl2 %2,sp\"; 1877: operands[2] = gen_rtx (CONST_INT, VOIDmode, (INTVAL (operands[2]) + 3)/ 4); 1878: return \"calls %2,%1\"; 1879: ") 1880: 1881: ;; Call subroutine returning any type. 1882: 1883: (define_expand "untyped_call" 1884: [(parallel [(call (match_operand 0 "" "") 1885: (const_int 0)) 1886: (match_operand 1 "" "") 1887: (match_operand 2 "" "")])] 1888: "" 1889: " 1890: { 1891: int i; 1892: 1893: emit_call_insn (gen_call_pop (operands[0], const0_rtx, NULL, const0_rtx)); 1894: 1895: for (i = 0; i < XVECLEN (operands[2], 0); i++) 1896: { 1897: rtx set = XVECEXP (operands[2], 0, i); 1898: emit_move_insn (SET_DEST (set), SET_SRC (set)); 1899: } 1900: 1901: /* The optimizer does not know that the call sets the function value 1902: registers we stored in the result block. We avoid problems by 1903: claiming that all hard registers are used and clobbered at this 1904: point. */ 1905: emit_insn (gen_blockage ()); 1906: 1907: DONE; 1908: }") 1909: 1910: ;; UNSPEC_VOLATILE is considered to use and clobber all hard registers and 1911: ;; all of memory. This blocks insns from being moved across this point. 1912: 1913: (define_insn "blockage" 1914: [(unspec_volatile [(const_int 0)] 0)] 1915: "" 1916: "") 1917: 1918: (define_insn "return" 1919: [(return)] 1920: "" 1921: "ret") 1922: 1923: (define_insn "nop" 1924: [(const_int 0)] 1925: "" 1926: "nop") 1927: 1928: ;; This had a wider constraint once, and it had trouble. 1929: ;; If you are tempted to try `g', please don't--it's not worth 1930: ;; the risk we will reopen the same bug. 1931: (define_insn "indirect_jump" 1932: [(set (pc) (match_operand:SI 0 "general_operand" "r"))] 1933: "" 1934: "jmp (%0)") 1935: 1936: ;; This is here to accept 5 arguments (as passed by expand_end_case) 1937: ;; and pass the first 4 along to the casesi1 pattern that really does the work. 1938: (define_expand "casesi" 1939: [(set (pc) 1940: (if_then_else (leu (minus:SI (match_operand:SI 0 "general_operand" "g") 1941: (match_operand:SI 1 "general_operand" "g")) 1942: (match_operand:SI 2 "general_operand" "g")) 1943: (plus:SI (sign_extend:SI 1944: (mem:HI 1945: (plus:SI (pc) 1946: (mult:SI (minus:SI (match_dup 0) 1947: (match_dup 1)) 1948: (const_int 2))))) 1949: (label_ref:SI (match_operand 3 "" ""))) 1950: (pc))) 1951: (match_operand 4 "" "")] 1952: "" 1953: " 1954: emit_insn (gen_casesi1 (operands[0], operands[1], operands[2], operands[3])); 1955: DONE; 1956: ") 1957: 1958: (define_insn "casesi1" 1959: [(set (pc) 1960: (if_then_else (leu (minus:SI (match_operand:SI 0 "general_operand" "g") 1961: (match_operand:SI 1 "general_operand" "g")) 1962: (match_operand:SI 2 "general_operand" "g")) 1963: (plus:SI (sign_extend:SI 1964: (mem:HI 1965: (plus:SI (pc) 1966: (mult:SI (minus:SI (match_dup 0) 1967: (match_dup 1)) 1968: (const_int 2))))) 1969: (label_ref:SI (match_operand 3 "" ""))) 1970: (pc)))] 1971: "" 1972: "casel %0,%1,%2") 1973: 1974: ;; This used to arise from the preceding by simplification 1975: ;; if operand 1 is zero. Perhaps it is no longer necessary. 1976: (define_insn "" 1977: [(set (pc) 1978: (if_then_else (leu (match_operand:SI 0 "general_operand" "g") 1979: (match_operand:SI 1 "general_operand" "g")) 1980: (plus:SI (sign_extend:SI 1981: (mem:HI 1982: (plus:SI (pc) 1983: (mult:SI (minus:SI (match_dup 0) 1984: (const_int 0)) 1985: (const_int 2))))) 1986: (label_ref:SI (match_operand 3 "" ""))) 1987: (pc)))] 1988: "" 1989: "casel %0,$0,%1") 1990: 1991: ;;- load or push effective address 1992: ;; These come after the move and add/sub patterns 1993: ;; because we don't want pushl $1 turned into pushad 1. 1994: ;; or addl3 r1,r2,r3 turned into movab 0(r1)[r2],r3. 1995: 1996: ;; It does not work to use constraints to distinguish pushes from moves, 1997: ;; because < matches any autodecrement, not just a push. 1998: 1999: (define_insn "" 2000: [(set (match_operand:SI 0 "general_operand" "=g") 2001: (match_operand:QI 1 "address_operand" "p"))] 2002: "" 2003: "* 2004: { 2005: if (push_operand (operands[0], SImode)) 2006: return \"pushab %a1\"; 2007: else 2008: return \"movab %a1,%0\"; 2009: }") 2010: 2011: (define_insn "" 2012: [(set (match_operand:SI 0 "general_operand" "=g") 2013: (match_operand:HI 1 "address_operand" "p"))] 2014: "" 2015: "* 2016: { 2017: if (push_operand (operands[0], SImode)) 2018: return \"pushaw %a1\"; 2019: else 2020: return \"movaw %a1,%0\"; 2021: }") 2022: 2023: (define_insn "" 2024: [(set (match_operand:SI 0 "general_operand" "=g") 2025: (match_operand:SI 1 "address_operand" "p"))] 2026: "" 2027: "* 2028: { 2029: if (push_operand (operands[0], SImode)) 2030: return \"pushal %a1\"; 2031: else 2032: return \"moval %a1,%0\"; 2033: }") 2034: 2035: (define_insn "" 2036: [(set (match_operand:SI 0 "general_operand" "=g") 2037: (match_operand:DI 1 "address_operand" "p"))] 2038: "" 2039: "* 2040: { 2041: if (push_operand (operands[0], SImode)) 2042: return \"pushaq %a1\"; 2043: else 2044: return \"movaq %a1,%0\"; 2045: }") 2046: 2047: (define_insn "" 2048: [(set (match_operand:SI 0 "general_operand" "=g") 2049: (match_operand:SF 1 "address_operand" "p"))] 2050: "" 2051: "* 2052: { 2053: if (push_operand (operands[0], SImode)) 2054: return \"pushaf %a1\"; 2055: else 2056: return \"movaf %a1,%0\"; 2057: }") 2058: 2059: (define_insn "" 2060: [(set (match_operand:SI 0 "general_operand" "=g") 2061: (match_operand:DF 1 "address_operand" "p"))] 2062: "" 2063: "* 2064: { 2065: if (push_operand (operands[0], SImode)) 2066: return \"pushad %a1\"; 2067: else 2068: return \"movad %a1,%0\"; 2069: }") 2070: 2071: ;; These used to be peepholes, but it is more straightforward to do them 2072: ;; as single insns. However, we must force the output to be a register 2073: ;; if it is not an offsettable address so that we know that we can assign 2074: ;; to it twice. 2075: 2076: ;; If we had a good way of evaluating the relative costs, these could be 2077: ;; machine-independent. 2078: 2079: ;; Optimize extzv ...,z; andl2 ...,z 2080: ;; or ashl ...,z; andl2 ...,z 2081: ;; with other operands constant. This is what the combiner converts the 2082: ;; above sequences to before attempting to recognize the new insn. 2083: 2084: (define_insn "" 2085: [(set (match_operand:SI 0 "general_operand" "=ro") 2086: (and:SI (ashiftrt:SI (match_operand:SI 1 "general_operand" "g") 2087: (match_operand:QI 2 "const_int_operand" "n")) 2088: (match_operand:SI 3 "const_int_operand" "n")))] 2089: "(INTVAL (operands[3]) & ~((1 << (32 - INTVAL (operands[2]))) - 1)) == 0" 2090: "* 2091: { 2092: unsigned long mask1 = INTVAL (operands[3]); 2093: unsigned long mask2 = (1 << (32 - INTVAL (operands[2]))) - 1; 2094: 2095: if ((mask1 & mask2) != mask1) 2096: operands[3] = gen_rtx (CONST_INT, VOIDmode, mask1 & mask2); 2097: 2098: return \"rotl %R2,%1,%0\;bicl2 %N3,%0\"; 2099: }") 2100: 2101: ;; left-shift and mask 2102: ;; The only case where `ashl' is better is if the mask only turns off 2103: ;; bits that the ashl would anyways, in which case it should have been 2104: ;; optimized away. 2105: 2106: (define_insn "" 2107: [(set (match_operand:SI 0 "general_operand" "=ro") 2108: (and:SI (ashift:SI (match_operand:SI 1 "general_operand" "g") 2109: (match_operand:QI 2 "const_int_operand" "n")) 2110: (match_operand:SI 3 "const_int_operand" "n")))] 2111: "" 2112: "* 2113: { 2114: operands[3] = gen_rtx (CONST_INT, VOIDmode, 2115: INTVAL (operands[3]) & ~((1 << INTVAL (operands[2])) - 1)); 2116: return \"rotl %2,%1,%0\;bicl2 %N3,%0\"; 2117: }")
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.