|
|
1.1 ! root 1: ; BUGS: ! 2: ;; Insert no-op between an insn with memory read-write operands ! 3: ;; following by a scale-indexing operation. ! 4: ;; The Sequent assembler does not allow addresses to be used ! 5: ;; except in insns which explicitly compute an effective address. ! 6: ;; I.e., one cannot say "cmpd _p,@_x" ! 7: ;; Implement unsigned multiplication?? ! 8: ! 9: ;;- Machine description for GNU compiler ! 10: ;;- ns32000 Version ! 11: ;; Copyright (C) 1988 Free Software Foundation, Inc. ! 12: ;; Contributed by Michael Tiemann ([email protected]) ! 13: ! 14: ;; This file is part of GNU CC. ! 15: ! 16: ;; GNU CC is free software; you can redistribute it and/or modify ! 17: ;; it under the terms of the GNU General Public License as published by ! 18: ;; the Free Software Foundation; either version 2, or (at your option) ! 19: ;; any later version. ! 20: ! 21: ;; GNU CC is distributed in the hope that it will be useful, ! 22: ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ! 23: ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ! 24: ;; GNU General Public License for more details. ! 25: ! 26: ;; You should have received a copy of the GNU General Public License ! 27: ;; along with GNU CC; see the file COPYING. If not, write to ! 28: ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. ! 29: ! 30: ! 31: ;;- Instruction patterns. When multiple patterns apply, ! 32: ;;- the first one in the file is chosen. ! 33: ;;- ! 34: ;;- See file "rtl.def" for documentation on define_insn, match_*, et. al. ! 35: ;;- ! 36: ;;- cpp macro #define NOTICE_UPDATE_CC in file tm.h handles condition code ! 37: ;;- updates for most instructions. ! 38: ! 39: ;; We don't want to allow a constant operand for test insns because ! 40: ;; (set (cc0) (const_int foo)) has no mode information. Such insns will ! 41: ;; be folded while optimizing anyway. ! 42: ! 43: (define_insn "tstsi" ! 44: [(set (cc0) ! 45: (match_operand:SI 0 "nonimmediate_operand" "rm"))] ! 46: "" ! 47: "* ! 48: { cc_status.flags |= CC_REVERSED; ! 49: operands[1] = const0_rtx; ! 50: return \"cmpqd %1,%0\"; }") ! 51: ! 52: (define_insn "tsthi" ! 53: [(set (cc0) ! 54: (match_operand:HI 0 "nonimmediate_operand" "g"))] ! 55: "" ! 56: "* ! 57: { cc_status.flags |= CC_REVERSED; ! 58: operands[1] = const0_rtx; ! 59: return \"cmpqw %1,%0\"; }") ! 60: ! 61: (define_insn "tstqi" ! 62: [(set (cc0) ! 63: (match_operand:QI 0 "nonimmediate_operand" "g"))] ! 64: "" ! 65: "* ! 66: { cc_status.flags |= CC_REVERSED; ! 67: operands[1] = const0_rtx; ! 68: return \"cmpqb %1,%0\"; }") ! 69: ! 70: (define_insn "tstdf" ! 71: [(set (cc0) ! 72: (match_operand:DF 0 "general_operand" "fmF"))] ! 73: "TARGET_32081" ! 74: "* ! 75: { cc_status.flags |= CC_REVERSED; ! 76: operands[1] = CONST0_RTX (DFmode); ! 77: return \"cmpl %1,%0\"; }") ! 78: ! 79: (define_insn "tstsf" ! 80: [(set (cc0) ! 81: (match_operand:SF 0 "general_operand" "fmF"))] ! 82: "TARGET_32081" ! 83: "* ! 84: { cc_status.flags |= CC_REVERSED; ! 85: operands[1] = CONST0_RTX (SFmode); ! 86: return \"cmpf %1,%0\"; }") ! 87: ! 88: (define_insn "cmpsi" ! 89: [(set (cc0) ! 90: (compare (match_operand:SI 0 "nonimmediate_operand" "rmn") ! 91: (match_operand:SI 1 "general_operand" "rmn")))] ! 92: "" ! 93: "* ! 94: { ! 95: if (GET_CODE (operands[1]) == CONST_INT) ! 96: { ! 97: int i = INTVAL (operands[1]); ! 98: if (i <= 7 && i >= -8) ! 99: { ! 100: cc_status.flags |= CC_REVERSED; ! 101: return \"cmpqd %1,%0\"; ! 102: } ! 103: } ! 104: cc_status.flags &= ~CC_REVERSED; ! 105: if (GET_CODE (operands[0]) == CONST_INT) ! 106: { ! 107: int i = INTVAL (operands[0]); ! 108: if (i <= 7 && i >= -8) ! 109: return \"cmpqd %0,%1\"; ! 110: } ! 111: return \"cmpd %0,%1\"; ! 112: }") ! 113: ! 114: (define_insn "cmphi" ! 115: [(set (cc0) ! 116: (compare (match_operand:HI 0 "nonimmediate_operand" "g") ! 117: (match_operand:HI 1 "general_operand" "g")))] ! 118: "" ! 119: "* ! 120: { ! 121: if (GET_CODE (operands[1]) == CONST_INT) ! 122: { ! 123: short i = INTVAL (operands[1]); ! 124: if (i <= 7 && i >= -8) ! 125: { ! 126: cc_status.flags |= CC_REVERSED; ! 127: if (INTVAL (operands[1]) > 7) ! 128: operands[1] = gen_rtx(CONST_INT, VOIDmode, i); ! 129: return \"cmpqw %1,%0\"; ! 130: } ! 131: } ! 132: cc_status.flags &= ~CC_REVERSED; ! 133: if (GET_CODE (operands[0]) == CONST_INT) ! 134: { ! 135: short i = INTVAL (operands[0]); ! 136: if (i <= 7 && i >= -8) ! 137: { ! 138: if (INTVAL (operands[0]) > 7) ! 139: operands[0] = gen_rtx(CONST_INT, VOIDmode, i); ! 140: return \"cmpqw %0,%1\"; ! 141: } ! 142: } ! 143: return \"cmpw %0,%1\"; ! 144: }") ! 145: ! 146: (define_insn "cmpqi" ! 147: [(set (cc0) ! 148: (compare (match_operand:QI 0 "nonimmediate_operand" "g") ! 149: (match_operand:QI 1 "general_operand" "g")))] ! 150: "" ! 151: "* ! 152: { ! 153: if (GET_CODE (operands[1]) == CONST_INT) ! 154: { ! 155: char i = INTVAL (operands[1]); ! 156: if (i <= 7 && i >= -8) ! 157: { ! 158: cc_status.flags |= CC_REVERSED; ! 159: if (INTVAL (operands[1]) > 7) ! 160: operands[1] = gen_rtx(CONST_INT, VOIDmode, i); ! 161: return \"cmpqb %1,%0\"; ! 162: } ! 163: } ! 164: cc_status.flags &= ~CC_REVERSED; ! 165: if (GET_CODE (operands[0]) == CONST_INT) ! 166: { ! 167: char i = INTVAL (operands[0]); ! 168: if (i <= 7 && i >= -8) ! 169: { ! 170: if (INTVAL (operands[0]) > 7) ! 171: operands[0] = gen_rtx(CONST_INT, VOIDmode, i); ! 172: return \"cmpqb %0,%1\"; ! 173: } ! 174: } ! 175: return \"cmpb %0,%1\"; ! 176: }") ! 177: ! 178: (define_insn "cmpdf" ! 179: [(set (cc0) ! 180: (compare (match_operand:DF 0 "general_operand" "fmF") ! 181: (match_operand:DF 1 "general_operand" "fmF")))] ! 182: "TARGET_32081" ! 183: "cmpl %0,%1") ! 184: ! 185: (define_insn "cmpsf" ! 186: [(set (cc0) ! 187: (compare (match_operand:SF 0 "general_operand" "fmF") ! 188: (match_operand:SF 1 "general_operand" "fmF")))] ! 189: "TARGET_32081" ! 190: "cmpf %0,%1") ! 191: ! 192: (define_insn "movdf" ! 193: [(set (match_operand:DF 0 "general_operand" "=fg<") ! 194: (match_operand:DF 1 "general_operand" "fFg"))] ! 195: "" ! 196: "* ! 197: { ! 198: if (FP_REG_P (operands[0])) ! 199: { ! 200: if (FP_REG_P (operands[1]) || GET_CODE (operands[1]) == CONST_DOUBLE) ! 201: return \"movl %1,%0\"; ! 202: if (REG_P (operands[1])) ! 203: { ! 204: rtx xoperands[2]; ! 205: xoperands[1] = gen_rtx (REG, SImode, REGNO (operands[1]) + 1); ! 206: output_asm_insn (\"movd %1,tos\", xoperands); ! 207: output_asm_insn (\"movd %1,tos\", operands); ! 208: return \"movl tos,%0\"; ! 209: } ! 210: return \"movl %1,%0\"; ! 211: } ! 212: else if (FP_REG_P (operands[1])) ! 213: { ! 214: if (REG_P (operands[0])) ! 215: { ! 216: output_asm_insn (\"movl %1,tos\;movd tos,%0\", operands); ! 217: operands[0] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1); ! 218: return \"movd tos,%0\"; ! 219: } ! 220: else ! 221: return \"movl %1,%0\"; ! 222: } ! 223: return output_move_double (operands); ! 224: }") ! 225: ! 226: (define_insn "movsf" ! 227: [(set (match_operand:SF 0 "general_operand" "=fg<") ! 228: (match_operand:SF 1 "general_operand" "fFg"))] ! 229: "" ! 230: "* ! 231: { ! 232: if (FP_REG_P (operands[0])) ! 233: { ! 234: if (GET_CODE (operands[1]) == REG && REGNO (operands[1]) < 8) ! 235: return \"movd %1,tos\;movf tos,%0\"; ! 236: else ! 237: return \"movf %1,%0\"; ! 238: } ! 239: else if (FP_REG_P (operands[1])) ! 240: { ! 241: if (REG_P (operands[0])) ! 242: return \"movf %1,tos\;movd tos,%0\"; ! 243: return \"movf %1,%0\"; ! 244: } ! 245: #if 0 /* Someone suggested this for the Sequent. Is it needed? */ ! 246: else if (GET_CODE (operands[1]) == CONST_DOUBLE) ! 247: return \"movf %1,%0\"; ! 248: #endif ! 249: /* There was a #if 0 around this, but that was erroneous ! 250: for many machines -- rms. */ ! 251: #ifndef MOVD_FLOAT_OK ! 252: /* GAS understands floating constants in ordinary movd instructions ! 253: but other assemblers might object. */ ! 254: else if (GET_CODE (operands[1]) == CONST_DOUBLE) ! 255: { ! 256: union {int i[2]; float f; double d;} convrt; ! 257: convrt.i[0] = CONST_DOUBLE_LOW (operands[1]); ! 258: convrt.i[1] = CONST_DOUBLE_HIGH (operands[1]); ! 259: convrt.f = convrt.d; ! 260: ! 261: /* Is there a better machine-independent way to to this? */ ! 262: operands[1] = gen_rtx (CONST_INT, VOIDmode, convrt.i[0]); ! 263: return \"movd %1,%0\"; ! 264: } ! 265: #endif ! 266: else return \"movd %1,%0\"; ! 267: }") ! 268: ! 269: (define_insn "" ! 270: [(set (match_operand:TI 0 "memory_operand" "=m") ! 271: (match_operand:TI 1 "memory_operand" "m"))] ! 272: "" ! 273: "movmd %1,%0,4") ! 274: ! 275: (define_insn "movdi" ! 276: [(set (match_operand:DI 0 "general_operand" "=g<,*f,g") ! 277: (match_operand:DI 1 "general_operand" "gF,g,*f"))] ! 278: "" ! 279: "* ! 280: { ! 281: if (FP_REG_P (operands[0])) ! 282: { ! 283: if (FP_REG_P (operands[1]) || GET_CODE (operands[1]) == CONST_DOUBLE) ! 284: return \"movl %1,%0\"; ! 285: if (REG_P (operands[1])) ! 286: { ! 287: rtx xoperands[2]; ! 288: xoperands[1] = gen_rtx (REG, SImode, REGNO (operands[1]) + 1); ! 289: output_asm_insn (\"movd %1,tos\", xoperands); ! 290: output_asm_insn (\"movd %1,tos\", operands); ! 291: return \"movl tos,%0\"; ! 292: } ! 293: return \"movl %1,%0\"; ! 294: } ! 295: else if (FP_REG_P (operands[1])) ! 296: { ! 297: if (REG_P (operands[0])) ! 298: { ! 299: output_asm_insn (\"movl %1,tos\;movd tos,%0\", operands); ! 300: operands[0] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1); ! 301: return \"movd tos,%0\"; ! 302: } ! 303: else ! 304: return \"movl %1,%0\"; ! 305: } ! 306: return output_move_double (operands); ! 307: }") ! 308: ! 309: ;; This special case must precede movsi. ! 310: (define_insn "" ! 311: [(set (reg:SI 17) ! 312: (match_operand:SI 0 "general_operand" "rmn"))] ! 313: "" ! 314: "lprd sp,%0") ! 315: ! 316: (define_insn "movsi" ! 317: [(set (match_operand:SI 0 "general_operand" "=g<,g<,*f,g,x") ! 318: (match_operand:SI 1 "general_operand" "g,?xy,g,*f,rmn"))] ! 319: "" ! 320: "* ! 321: { ! 322: if (FP_REG_P (operands[0])) ! 323: { ! 324: if (GET_CODE (operands[1]) == REG && REGNO (operands[1]) < 8) ! 325: return \"movd %1,tos\;movf tos,%0\"; ! 326: else ! 327: return \"movf %1,%0\"; ! 328: } ! 329: else if (FP_REG_P (operands[1])) ! 330: { ! 331: if (REG_P (operands[0])) ! 332: return \"movf %1,tos\;movd tos,%0\"; ! 333: return \"movf %1,%0\"; ! 334: } ! 335: if (GET_CODE (operands[0]) == REG ! 336: && REGNO (operands[0]) == FRAME_POINTER_REGNUM) ! 337: return \"lprd fp,%1\"; ! 338: if (GET_CODE (operands[1]) == CONST_DOUBLE) ! 339: operands[1] ! 340: = gen_rtx (CONST_INT, VOIDmode, CONST_DOUBLE_LOW (operands[1])); ! 341: if (GET_CODE (operands[1]) == CONST_INT) ! 342: { ! 343: int i = INTVAL (operands[1]); ! 344: if (i <= 7 && i >= -8) ! 345: return \"movqd %1,%0\"; ! 346: if (i < 0x4000 && i >= -0x4000 && ! TARGET_32532) ! 347: #if defined (GNX_V3) || defined (UTEK_ASM) ! 348: return \"addr %c1,%0\"; ! 349: #else ! 350: return \"addr @%c1,%0\"; ! 351: #endif ! 352: return \"movd %1,%0\"; ! 353: } ! 354: else if (GET_CODE (operands[1]) == REG) ! 355: { ! 356: if (REGNO (operands[1]) < 16) ! 357: return \"movd %1,%0\"; ! 358: else if (REGNO (operands[1]) == FRAME_POINTER_REGNUM) ! 359: { ! 360: if (GET_CODE(operands[0]) == REG) ! 361: return \"sprd fp,%0\"; ! 362: else ! 363: return \"addr 0(fp),%0\" ; ! 364: } ! 365: else if (REGNO (operands[1]) == STACK_POINTER_REGNUM) ! 366: { ! 367: if (GET_CODE(operands[0]) == REG) ! 368: return \"sprd sp,%0\"; ! 369: else ! 370: return \"addr 0(sp),%0\" ; ! 371: } ! 372: else abort (); ! 373: } ! 374: else if (GET_CODE (operands[1]) == MEM) ! 375: return \"movd %1,%0\"; ! 376: /* Check if this effective address can be ! 377: calculated faster by pulling it apart. */ ! 378: if (REG_P (operands[0]) ! 379: && GET_CODE (operands[1]) == MULT ! 380: && GET_CODE (XEXP (operands[1], 1)) == CONST_INT ! 381: && (INTVAL (XEXP (operands[1], 1)) == 2 ! 382: || INTVAL (XEXP (operands[1], 1)) == 4)) ! 383: { ! 384: rtx xoperands[3]; ! 385: xoperands[0] = operands[0]; ! 386: xoperands[1] = XEXP (operands[1], 0); ! 387: xoperands[2] = gen_rtx (CONST_INT, VOIDmode, INTVAL (XEXP (operands[1], 1)) >> 1); ! 388: return output_shift_insn (xoperands); ! 389: } ! 390: return \"addr %a1,%0\"; ! 391: }") ! 392: ! 393: (define_insn "movhi" ! 394: [(set (match_operand:HI 0 "general_operand" "=g<,*f,g") ! 395: (match_operand:HI 1 "general_operand" "g,g,*f"))] ! 396: "" ! 397: "* ! 398: { ! 399: if (GET_CODE (operands[1]) == CONST_INT) ! 400: { ! 401: short i = INTVAL (operands[1]); ! 402: if (i <= 7 && i >= -8) ! 403: { ! 404: if (INTVAL (operands[1]) > 7) ! 405: operands[1] = ! 406: gen_rtx (CONST_INT, VOIDmode, i); ! 407: return \"movqw %1,%0\"; ! 408: } ! 409: return \"movw %1,%0\"; ! 410: } ! 411: else if (FP_REG_P (operands[0])) ! 412: { ! 413: if (GET_CODE (operands[1]) == REG && REGNO (operands[1]) < 8) ! 414: return \"movwf %1,tos\;movf tos,%0\"; ! 415: else ! 416: return \"movwf %1,%0\"; ! 417: } ! 418: else if (FP_REG_P (operands[1])) ! 419: { ! 420: if (REG_P (operands[0])) ! 421: return \"movf %1,tos\;movd tos,%0\"; ! 422: return \"movf %1,%0\"; ! 423: } ! 424: else ! 425: return \"movw %1,%0\"; ! 426: }") ! 427: ! 428: (define_insn "movstricthi" ! 429: [(set (strict_low_part (match_operand:HI 0 "general_operand" "+r")) ! 430: (match_operand:HI 1 "general_operand" "g"))] ! 431: "" ! 432: "* ! 433: { ! 434: if (GET_CODE (operands[1]) == CONST_INT ! 435: && INTVAL(operands[1]) <= 7 && INTVAL(operands[1]) >= -8) ! 436: return \"movqw %1,%0\"; ! 437: return \"movw %1,%0\"; ! 438: }") ! 439: ! 440: (define_insn "movqi" ! 441: [(set (match_operand:QI 0 "general_operand" "=g<,*f,g") ! 442: (match_operand:QI 1 "general_operand" "g,g,*f"))] ! 443: "" ! 444: "* ! 445: { if (GET_CODE (operands[1]) == CONST_INT) ! 446: { ! 447: char char_val = (char)INTVAL (operands[1]); ! 448: if (char_val <= 7 && char_val >= -8) ! 449: { ! 450: if (INTVAL (operands[1]) > 7) ! 451: operands[1] = ! 452: gen_rtx (CONST_INT, VOIDmode, char_val); ! 453: return \"movqb %1,%0\"; ! 454: } ! 455: return \"movb %1,%0\"; ! 456: } ! 457: else if (FP_REG_P (operands[0])) ! 458: { ! 459: if (GET_CODE (operands[1]) == REG && REGNO (operands[1]) < 8) ! 460: return \"movbf %1,tos\;movf tos,%0\"; ! 461: else ! 462: return \"movbf %1,%0\"; ! 463: } ! 464: else if (FP_REG_P (operands[1])) ! 465: { ! 466: if (REG_P (operands[0])) ! 467: return \"movf %1,tos\;movd tos,%0\"; ! 468: return \"movf %1,%0\"; ! 469: } ! 470: else ! 471: return \"movb %1,%0\"; ! 472: }") ! 473: ! 474: (define_insn "movstrictqi" ! 475: [(set (strict_low_part (match_operand:QI 0 "general_operand" "+r")) ! 476: (match_operand:QI 1 "general_operand" "g"))] ! 477: "" ! 478: "* ! 479: { ! 480: if (GET_CODE (operands[1]) == CONST_INT ! 481: && INTVAL(operands[1]) < 8 && INTVAL(operands[1]) > -9) ! 482: return \"movqb %1,%0\"; ! 483: return \"movb %1,%0\"; ! 484: }") ! 485: ! 486: ;; This is here to accept 4 arguments and pass the first 3 along ! 487: ;; to the movstrsi1 pattern that really does the work. ! 488: (define_expand "movstrsi" ! 489: [(set (match_operand:BLK 0 "general_operand" "=g") ! 490: (match_operand:BLK 1 "general_operand" "g")) ! 491: (use (match_operand:SI 2 "general_operand" "rmn")) ! 492: (match_operand 3 "" "")] ! 493: "" ! 494: " ! 495: emit_insn (gen_movstrsi1 (operands[0], operands[1], operands[2])); ! 496: DONE; ! 497: ") ! 498: ! 499: ;; The definition of this insn does not really explain what it does, ! 500: ;; but it should suffice ! 501: ;; that anything generated as this insn will be recognized as one ! 502: ;; and that it won't successfully combine with anything. ! 503: (define_insn "movstrsi1" ! 504: [(set (match_operand:BLK 0 "general_operand" "=g") ! 505: (match_operand:BLK 1 "general_operand" "g")) ! 506: (use (match_operand:SI 2 "general_operand" "rmn")) ! 507: (clobber (reg:SI 0)) ! 508: (clobber (reg:SI 1)) ! 509: (clobber (reg:SI 2))] ! 510: "" ! 511: "* ! 512: { ! 513: if (GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM) ! 514: abort (); ! 515: operands[0] = XEXP (operands[0], 0); ! 516: operands[1] = XEXP (operands[1], 0); ! 517: if (GET_CODE (operands[0]) == MEM) ! 518: if (GET_CODE (operands[1]) == MEM) ! 519: output_asm_insn (\"movd %0,r2\;movd %1,r1\", operands); ! 520: else ! 521: output_asm_insn (\"movd %0,r2\;addr %a1,r1\", operands); ! 522: else if (GET_CODE (operands[1]) == MEM) ! 523: output_asm_insn (\"addr %a0,r2\;movd %1,r1\", operands); ! 524: else ! 525: output_asm_insn (\"addr %a0,r2\;addr %a1,r1\", operands); ! 526: ! 527: #ifdef UTEK_ASM ! 528: if (GET_CODE (operands[2]) == CONST_INT && (INTVAL (operands[2]) & 0x3) == 0) ! 529: { ! 530: operands[2] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[2]) >> 2); ! 531: if ((unsigned) INTVAL (operands[2]) <= 7) ! 532: return \"movqd %2,r0\;movsd $0\"; ! 533: else ! 534: return \"movd %2,r0\;movsd $0\"; ! 535: } ! 536: else ! 537: { ! 538: return \"movd %2,r0\;movsb $0\"; ! 539: } ! 540: #else ! 541: if (GET_CODE (operands[2]) == CONST_INT && (INTVAL (operands[2]) & 0x3) == 0) ! 542: { ! 543: operands[2] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[2]) >> 2); ! 544: if ((unsigned) INTVAL (operands[2]) <= 7) ! 545: return \"movqd %2,r0\;movsd\"; ! 546: else ! 547: return \"movd %2,r0\;movsd\"; ! 548: } ! 549: else ! 550: { ! 551: return \"movd %2,r0\;movsb\"; ! 552: } ! 553: #endif ! 554: }") ! 555: ! 556: ;; Extension and truncation insns. ! 557: ;; Those for integer source operand ! 558: ;; are ordered widest source type first. ! 559: ! 560: (define_insn "truncsiqi2" ! 561: [(set (match_operand:QI 0 "general_operand" "=g<") ! 562: (truncate:QI (match_operand:SI 1 "nonimmediate_operand" "rmn")))] ! 563: "" ! 564: "movb %1,%0") ! 565: ! 566: (define_insn "truncsihi2" ! 567: [(set (match_operand:HI 0 "general_operand" "=g<") ! 568: (truncate:HI (match_operand:SI 1 "nonimmediate_operand" "rmn")))] ! 569: "" ! 570: "movw %1,%0") ! 571: ! 572: (define_insn "trunchiqi2" ! 573: [(set (match_operand:QI 0 "general_operand" "=g<") ! 574: (truncate:QI (match_operand:HI 1 "nonimmediate_operand" "g")))] ! 575: "" ! 576: "movb %1,%0") ! 577: ! 578: (define_insn "extendhisi2" ! 579: [(set (match_operand:SI 0 "general_operand" "=g<") ! 580: (sign_extend:SI (match_operand:HI 1 "nonimmediate_operand" "g")))] ! 581: "" ! 582: "movxwd %1,%0") ! 583: ! 584: (define_insn "extendqihi2" ! 585: [(set (match_operand:HI 0 "general_operand" "=g<") ! 586: (sign_extend:HI (match_operand:QI 1 "nonimmediate_operand" "g")))] ! 587: "" ! 588: "movxbw %1,%0") ! 589: ! 590: (define_insn "extendqisi2" ! 591: [(set (match_operand:SI 0 "general_operand" "=g<") ! 592: (sign_extend:SI (match_operand:QI 1 "nonimmediate_operand" "g")))] ! 593: "" ! 594: "movxbd %1,%0") ! 595: ! 596: (define_insn "extendsfdf2" ! 597: [(set (match_operand:DF 0 "general_operand" "=fm<") ! 598: (float_extend:DF (match_operand:SF 1 "general_operand" "fmF")))] ! 599: "TARGET_32081" ! 600: "movfl %1,%0") ! 601: ! 602: (define_insn "truncdfsf2" ! 603: [(set (match_operand:SF 0 "general_operand" "=fm<") ! 604: (float_truncate:SF (match_operand:DF 1 "general_operand" "fmF")))] ! 605: "TARGET_32081" ! 606: "movlf %1,%0") ! 607: ! 608: (define_insn "zero_extendhisi2" ! 609: [(set (match_operand:SI 0 "general_operand" "=g<") ! 610: (zero_extend:SI (match_operand:HI 1 "nonimmediate_operand" "g")))] ! 611: "" ! 612: "movzwd %1,%0") ! 613: ! 614: (define_insn "zero_extendqihi2" ! 615: [(set (match_operand:HI 0 "general_operand" "=g<") ! 616: (zero_extend:HI (match_operand:QI 1 "nonimmediate_operand" "g")))] ! 617: "" ! 618: "movzbw %1,%0") ! 619: ! 620: (define_insn "zero_extendqisi2" ! 621: [(set (match_operand:SI 0 "general_operand" "=g<") ! 622: (zero_extend:SI (match_operand:QI 1 "nonimmediate_operand" "g")))] ! 623: "" ! 624: "movzbd %1,%0") ! 625: ! 626: ;; Fix-to-float conversion insns. ! 627: ;; Note that the ones that start with SImode come first. ! 628: ;; That is so that an operand that is a CONST_INT ! 629: ;; (and therefore lacks a specific machine mode). ! 630: ;; will be recognized as SImode (which is always valid) ! 631: ;; rather than as QImode or HImode. ! 632: ! 633: ;; Rumor has it that the National part does not correctly convert ! 634: ;; constant ints to floats. This conversion is therefore disabled. ! 635: ;; A register must be used to perform the conversion. ! 636: ! 637: (define_insn "floatsisf2" ! 638: [(set (match_operand:SF 0 "general_operand" "=fm<") ! 639: (float:SF (match_operand:SI 1 "general_operand" "rm")))] ! 640: "TARGET_32081" ! 641: "movdf %1,%0") ! 642: ! 643: (define_insn "floatsidf2" ! 644: [(set (match_operand:DF 0 "general_operand" "=fm<") ! 645: (float:DF (match_operand:SI 1 "general_operand" "rm")))] ! 646: "TARGET_32081" ! 647: "movdl %1,%0") ! 648: ! 649: (define_insn "floathisf2" ! 650: [(set (match_operand:SF 0 "general_operand" "=fm<") ! 651: (float:SF (match_operand:HI 1 "general_operand" "rm")))] ! 652: "TARGET_32081" ! 653: "movwf %1,%0") ! 654: ! 655: (define_insn "floathidf2" ! 656: [(set (match_operand:DF 0 "general_operand" "=fm<") ! 657: (float:DF (match_operand:HI 1 "general_operand" "rm")))] ! 658: "TARGET_32081" ! 659: "movwl %1,%0") ! 660: ! 661: (define_insn "floatqisf2" ! 662: [(set (match_operand:SF 0 "general_operand" "=fm<") ! 663: (float:SF (match_operand:QI 1 "general_operand" "rm")))] ! 664: "TARGET_32081" ! 665: "movbf %1,%0") ! 666: ! 667: ; Some assemblers warn that this insn doesn't work. ! 668: ; Maybe they know something we don't. ! 669: ;(define_insn "floatqidf2" ! 670: ; [(set (match_operand:DF 0 "general_operand" "=fm<") ! 671: ; (float:DF (match_operand:QI 1 "general_operand" "rm")))] ! 672: ; "TARGET_32081" ! 673: ; "movbl %1,%0") ! 674: ! 675: ;; Float-to-fix conversion insns. ! 676: ;; The sequent compiler always generates "trunc" insns. ! 677: ! 678: (define_insn "fixsfqi2" ! 679: [(set (match_operand:QI 0 "general_operand" "=g<") ! 680: (fix:QI (fix:SF (match_operand:SF 1 "general_operand" "fm"))))] ! 681: "TARGET_32081" ! 682: "truncfb %1,%0") ! 683: ! 684: (define_insn "fixsfhi2" ! 685: [(set (match_operand:HI 0 "general_operand" "=g<") ! 686: (fix:HI (fix:SF (match_operand:SF 1 "general_operand" "fm"))))] ! 687: "TARGET_32081" ! 688: "truncfw %1,%0") ! 689: ! 690: (define_insn "fixsfsi2" ! 691: [(set (match_operand:SI 0 "general_operand" "=g<") ! 692: (fix:SI (fix:SF (match_operand:SF 1 "general_operand" "fm"))))] ! 693: "TARGET_32081" ! 694: "truncfd %1,%0") ! 695: ! 696: (define_insn "fixdfqi2" ! 697: [(set (match_operand:QI 0 "general_operand" "=g<") ! 698: (fix:QI (fix:DF (match_operand:DF 1 "general_operand" "fm"))))] ! 699: "TARGET_32081" ! 700: "trunclb %1,%0") ! 701: ! 702: (define_insn "fixdfhi2" ! 703: [(set (match_operand:HI 0 "general_operand" "=g<") ! 704: (fix:HI (fix:DF (match_operand:DF 1 "general_operand" "fm"))))] ! 705: "TARGET_32081" ! 706: "trunclw %1,%0") ! 707: ! 708: (define_insn "fixdfsi2" ! 709: [(set (match_operand:SI 0 "general_operand" "=g<") ! 710: (fix:SI (fix:DF (match_operand:DF 1 "general_operand" "fm"))))] ! 711: "TARGET_32081" ! 712: "truncld %1,%0") ! 713: ! 714: ;; Unsigned ! 715: ! 716: (define_insn "fixunssfqi2" ! 717: [(set (match_operand:QI 0 "general_operand" "=g<") ! 718: (unsigned_fix:QI (fix:SF (match_operand:SF 1 "general_operand" "fm"))))] ! 719: "TARGET_32081" ! 720: "truncfb %1,%0") ! 721: ! 722: (define_insn "fixunssfhi2" ! 723: [(set (match_operand:HI 0 "general_operand" "=g<") ! 724: (unsigned_fix:HI (fix:SF (match_operand:SF 1 "general_operand" "fm"))))] ! 725: "TARGET_32081" ! 726: "truncfw %1,%0") ! 727: ! 728: (define_insn "fixunssfsi2" ! 729: [(set (match_operand:SI 0 "general_operand" "=g<") ! 730: (unsigned_fix:SI (fix:SF (match_operand:SF 1 "general_operand" "fm"))))] ! 731: "TARGET_32081" ! 732: "truncfd %1,%0") ! 733: ! 734: (define_insn "fixunsdfqi2" ! 735: [(set (match_operand:QI 0 "general_operand" "=g<") ! 736: (unsigned_fix:QI (fix:DF (match_operand:DF 1 "general_operand" "fm"))))] ! 737: "TARGET_32081" ! 738: "trunclb %1,%0") ! 739: ! 740: (define_insn "fixunsdfhi2" ! 741: [(set (match_operand:HI 0 "general_operand" "=g<") ! 742: (unsigned_fix:HI (fix:DF (match_operand:DF 1 "general_operand" "fm"))))] ! 743: "TARGET_32081" ! 744: "trunclw %1,%0") ! 745: ! 746: (define_insn "fixunsdfsi2" ! 747: [(set (match_operand:SI 0 "general_operand" "=g<") ! 748: (unsigned_fix:SI (fix:DF (match_operand:DF 1 "general_operand" "fm"))))] ! 749: "TARGET_32081" ! 750: "truncld %1,%0") ! 751: ! 752: ;;; These are not yet used by GCC ! 753: (define_insn "fix_truncsfqi2" ! 754: [(set (match_operand:QI 0 "general_operand" "=g<") ! 755: (fix:QI (match_operand:SF 1 "general_operand" "fm")))] ! 756: "TARGET_32081" ! 757: "truncfb %1,%0") ! 758: ! 759: (define_insn "fix_truncsfhi2" ! 760: [(set (match_operand:HI 0 "general_operand" "=g<") ! 761: (fix:HI (match_operand:SF 1 "general_operand" "fm")))] ! 762: "TARGET_32081" ! 763: "truncfw %1,%0") ! 764: ! 765: (define_insn "fix_truncsfsi2" ! 766: [(set (match_operand:SI 0 "general_operand" "=g<") ! 767: (fix:SI (match_operand:SF 1 "general_operand" "fm")))] ! 768: "TARGET_32081" ! 769: "truncfd %1,%0") ! 770: ! 771: (define_insn "fix_truncdfqi2" ! 772: [(set (match_operand:QI 0 "general_operand" "=g<") ! 773: (fix:QI (match_operand:DF 1 "general_operand" "fm")))] ! 774: "TARGET_32081" ! 775: "trunclb %1,%0") ! 776: ! 777: (define_insn "fix_truncdfhi2" ! 778: [(set (match_operand:HI 0 "general_operand" "=g<") ! 779: (fix:HI (match_operand:DF 1 "general_operand" "fm")))] ! 780: "TARGET_32081" ! 781: "trunclw %1,%0") ! 782: ! 783: (define_insn "fix_truncdfsi2" ! 784: [(set (match_operand:SI 0 "general_operand" "=g<") ! 785: (fix:SI (match_operand:DF 1 "general_operand" "fm")))] ! 786: "TARGET_32081" ! 787: "truncld %1,%0") ! 788: ! 789: ;;- All kinds of add instructions. ! 790: ! 791: (define_insn "adddf3" ! 792: [(set (match_operand:DF 0 "general_operand" "=fm") ! 793: (plus:DF (match_operand:DF 1 "general_operand" "%0") ! 794: (match_operand:DF 2 "general_operand" "fmF")))] ! 795: "TARGET_32081" ! 796: "addl %2,%0") ! 797: ! 798: ! 799: (define_insn "addsf3" ! 800: [(set (match_operand:SF 0 "general_operand" "=fm") ! 801: (plus:SF (match_operand:SF 1 "general_operand" "%0") ! 802: (match_operand:SF 2 "general_operand" "fmF")))] ! 803: "TARGET_32081" ! 804: "addf %2,%0") ! 805: ! 806: (define_insn "" ! 807: [(set (reg:SI 17) ! 808: (plus:SI (reg:SI 17) ! 809: (match_operand:SI 0 "immediate_operand" "i")))] ! 810: "GET_CODE (operands[0]) == CONST_INT" ! 811: "* ! 812: { ! 813: #ifndef SEQUENT_ADJUST_STACK ! 814: if (TARGET_32532) ! 815: if (INTVAL (operands[0]) == 8) ! 816: return \"cmpd tos,tos\"; ! 817: if (TARGET_32532 || TARGET_32332) ! 818: if (INTVAL (operands[0]) == 4) ! 819: return \"cmpqd %$0,tos\"; ! 820: #endif ! 821: if (! TARGET_32532) ! 822: { ! 823: if (INTVAL (operands[0]) < 64 && INTVAL (operands[0]) > -64) ! 824: return \"adjspb %$%n0\"; ! 825: else if (INTVAL (operands[0]) < 8192 && INTVAL (operands[0]) >= -8192) ! 826: return \"adjspw %$%n0\"; ! 827: } ! 828: return \"adjspd %$%n0\"; ! 829: }") ! 830: ! 831: (define_insn "" ! 832: [(set (match_operand:SI 0 "general_operand" "=g<") ! 833: (plus:SI (reg:SI 16) ! 834: (match_operand:SI 1 "immediate_operand" "i")))] ! 835: "GET_CODE (operands[1]) == CONST_INT" ! 836: "addr %c1(fp),%0") ! 837: ! 838: (define_insn "" ! 839: [(set (match_operand:SI 0 "general_operand" "=g<") ! 840: (plus:SI (reg:SI 17) ! 841: (match_operand:SI 1 "immediate_operand" "i")))] ! 842: "GET_CODE (operands[1]) == CONST_INT" ! 843: "addr %c1(sp),%0") ! 844: ! 845: (define_insn "addsi3" ! 846: [(set (match_operand:SI 0 "general_operand" "=g,=g&<") ! 847: (plus:SI (match_operand:SI 1 "general_operand" "%0,r") ! 848: (match_operand:SI 2 "general_operand" "rmn,n")))] ! 849: "" ! 850: "* ! 851: { ! 852: if (which_alternative == 1) ! 853: { ! 854: int i = INTVAL (operands[2]); ! 855: if (NS32K_DISPLACEMENT_P (i)) ! 856: return \"addr %c2(%1),%0\"; ! 857: else ! 858: return \"movd %1,%0\;addd %2,%0\"; ! 859: } ! 860: if (GET_CODE (operands[2]) == CONST_INT) ! 861: { ! 862: int i = INTVAL (operands[2]); ! 863: ! 864: if (i <= 7 && i >= -8) ! 865: return \"addqd %2,%0\"; ! 866: else if (GET_CODE (operands[0]) == REG ! 867: && i < 0x4000 && i >= -0x4000 && ! TARGET_32532) ! 868: return \"addr %c2(%0),%0\"; ! 869: } ! 870: return \"addd %2,%0\"; ! 871: }") ! 872: ! 873: (define_insn "addhi3" ! 874: [(set (match_operand:HI 0 "general_operand" "=g") ! 875: (plus:HI (match_operand:HI 1 "general_operand" "%0") ! 876: (match_operand:HI 2 "general_operand" "g")))] ! 877: "" ! 878: "* ! 879: { if (GET_CODE (operands[2]) == CONST_INT) ! 880: { ! 881: int i = INTVAL (operands[2]); ! 882: if (i <= 7 && i >= -8) ! 883: return \"addqw %2,%0\"; ! 884: } ! 885: return \"addw %2,%0\"; ! 886: }") ! 887: ! 888: (define_insn "" ! 889: [(set (strict_low_part (match_operand:HI 0 "general_operand" "=r")) ! 890: (plus:HI (match_operand:HI 1 "general_operand" "0") ! 891: (match_operand:HI 2 "general_operand" "g")))] ! 892: "" ! 893: "* ! 894: { ! 895: if (GET_CODE (operands[1]) == CONST_INT ! 896: && INTVAL (operands[1]) >-9 && INTVAL(operands[1]) < 8) ! 897: return \"addqw %2,%0\"; ! 898: return \"addw %2,%0\"; ! 899: }") ! 900: ! 901: (define_insn "addqi3" ! 902: [(set (match_operand:QI 0 "general_operand" "=g") ! 903: (plus:QI (match_operand:QI 1 "general_operand" "%0") ! 904: (match_operand:QI 2 "general_operand" "g")))] ! 905: "" ! 906: "* ! 907: { if (GET_CODE (operands[2]) == CONST_INT) ! 908: { ! 909: int i = INTVAL (operands[2]); ! 910: if (i <= 7 && i >= -8) ! 911: return \"addqb %2,%0\"; ! 912: } ! 913: return \"addb %2,%0\"; ! 914: }") ! 915: ! 916: (define_insn "" ! 917: [(set (strict_low_part (match_operand:QI 0 "general_operand" "=r")) ! 918: (plus:QI (match_operand:QI 1 "general_operand" "0") ! 919: (match_operand:QI 2 "general_operand" "g")))] ! 920: "" ! 921: "* ! 922: { ! 923: if (GET_CODE (operands[1]) == CONST_INT ! 924: && INTVAL (operands[1]) >-9 && INTVAL(operands[1]) < 8) ! 925: return \"addqb %2,%0\"; ! 926: return \"addb %2,%0\"; ! 927: }") ! 928: ! 929: ;;- All kinds of subtract instructions. ! 930: ! 931: (define_insn "subdf3" ! 932: [(set (match_operand:DF 0 "general_operand" "=fm") ! 933: (minus:DF (match_operand:DF 1 "general_operand" "0") ! 934: (match_operand:DF 2 "general_operand" "fmF")))] ! 935: "TARGET_32081" ! 936: "subl %2,%0") ! 937: ! 938: (define_insn "subsf3" ! 939: [(set (match_operand:SF 0 "general_operand" "=fm") ! 940: (minus:SF (match_operand:SF 1 "general_operand" "0") ! 941: (match_operand:SF 2 "general_operand" "fmF")))] ! 942: "TARGET_32081" ! 943: "subf %2,%0") ! 944: ! 945: (define_insn "" ! 946: [(set (reg:SI 17) ! 947: (minus:SI (reg:SI 17) ! 948: (match_operand:SI 0 "immediate_operand" "i")))] ! 949: "GET_CODE (operands[0]) == CONST_INT" ! 950: "* ! 951: { ! 952: if (GET_CODE(operands[0]) == CONST_INT && INTVAL(operands[0]) < 64 ! 953: && INTVAL(operands[0]) > -64 && ! TARGET_32532) ! 954: return \"adjspb %$%0\"; ! 955: return \"adjspd %$%0\"; ! 956: }") ! 957: ! 958: (define_insn "subsi3" ! 959: [(set (match_operand:SI 0 "general_operand" "=g") ! 960: (minus:SI (match_operand:SI 1 "general_operand" "0") ! 961: (match_operand:SI 2 "general_operand" "rmn")))] ! 962: "" ! 963: "* ! 964: { if (GET_CODE (operands[2]) == CONST_INT) ! 965: { ! 966: int i = INTVAL (operands[2]); ! 967: ! 968: if (i <= 8 && i >= -7) ! 969: return \"addqd %$%n2,%0\"; ! 970: } ! 971: return \"subd %2,%0\"; ! 972: }") ! 973: ! 974: (define_insn "subhi3" ! 975: [(set (match_operand:HI 0 "general_operand" "=g") ! 976: (minus:HI (match_operand:HI 1 "general_operand" "0") ! 977: (match_operand:HI 2 "general_operand" "g")))] ! 978: "" ! 979: "* ! 980: { if (GET_CODE (operands[2]) == CONST_INT) ! 981: { ! 982: int i = INTVAL (operands[2]); ! 983: ! 984: if (i <= 8 && i >= -7) ! 985: return \"addqw %$%n2,%0\"; ! 986: } ! 987: return \"subw %2,%0\"; ! 988: }") ! 989: ! 990: (define_insn "" ! 991: [(set (strict_low_part (match_operand:HI 0 "general_operand" "=r")) ! 992: (minus:HI (match_operand:HI 1 "general_operand" "0") ! 993: (match_operand:HI 2 "general_operand" "g")))] ! 994: "" ! 995: "* ! 996: { ! 997: if (GET_CODE (operands[1]) == CONST_INT ! 998: && INTVAL (operands[1]) >-8 && INTVAL(operands[1]) < 9) ! 999: return \"addqw %$%n2,%0\"; ! 1000: return \"subw %2,%0\"; ! 1001: }") ! 1002: ! 1003: (define_insn "subqi3" ! 1004: [(set (match_operand:QI 0 "general_operand" "=g") ! 1005: (minus:QI (match_operand:QI 1 "general_operand" "0") ! 1006: (match_operand:QI 2 "general_operand" "g")))] ! 1007: "" ! 1008: "* ! 1009: { if (GET_CODE (operands[2]) == CONST_INT) ! 1010: { ! 1011: int i = INTVAL (operands[2]); ! 1012: ! 1013: if (i <= 8 && i >= -7) ! 1014: return \"addqb %$%n2,%0\"; ! 1015: } ! 1016: return \"subb %2,%0\"; ! 1017: }") ! 1018: ! 1019: (define_insn "" ! 1020: [(set (strict_low_part (match_operand:QI 0 "general_operand" "=r")) ! 1021: (minus:QI (match_operand:QI 1 "general_operand" "0") ! 1022: (match_operand:QI 2 "general_operand" "g")))] ! 1023: "" ! 1024: "* ! 1025: { ! 1026: if (GET_CODE (operands[1]) == CONST_INT ! 1027: && INTVAL (operands[1]) >-8 && INTVAL(operands[1]) < 9) ! 1028: return \"addqb %$%n2,%0\"; ! 1029: return \"subb %2,%0\"; ! 1030: }") ! 1031: ! 1032: ;;- Multiply instructions. ! 1033: ! 1034: (define_insn "muldf3" ! 1035: [(set (match_operand:DF 0 "general_operand" "=fm") ! 1036: (mult:DF (match_operand:DF 1 "general_operand" "%0") ! 1037: (match_operand:DF 2 "general_operand" "fmF")))] ! 1038: "TARGET_32081" ! 1039: "mull %2,%0") ! 1040: ! 1041: (define_insn "mulsf3" ! 1042: [(set (match_operand:SF 0 "general_operand" "=fm") ! 1043: (mult:SF (match_operand:SF 1 "general_operand" "%0") ! 1044: (match_operand:SF 2 "general_operand" "fmF")))] ! 1045: "TARGET_32081" ! 1046: "mulf %2,%0") ! 1047: ! 1048: (define_insn "mulsi3" ! 1049: [(set (match_operand:SI 0 "general_operand" "=g") ! 1050: (mult:SI (match_operand:SI 1 "general_operand" "%0") ! 1051: (match_operand:SI 2 "general_operand" "rmn")))] ! 1052: "" ! 1053: "muld %2,%0") ! 1054: ! 1055: (define_insn "mulhi3" ! 1056: [(set (match_operand:HI 0 "general_operand" "=g") ! 1057: (mult:HI (match_operand:HI 1 "general_operand" "%0") ! 1058: (match_operand:HI 2 "general_operand" "g")))] ! 1059: "" ! 1060: "mulw %2,%0") ! 1061: ! 1062: (define_insn "mulqi3" ! 1063: [(set (match_operand:QI 0 "general_operand" "=g") ! 1064: (mult:QI (match_operand:QI 1 "general_operand" "%0") ! 1065: (match_operand:QI 2 "general_operand" "g")))] ! 1066: "" ! 1067: "mulb %2,%0") ! 1068: ! 1069: (define_insn "umulsidi3" ! 1070: [(set (match_operand:DI 0 "general_operand" "=g") ! 1071: (mult:DI (zero_extend:DI ! 1072: (match_operand:SI 1 "nonimmediate_operand" "0")) ! 1073: (zero_extend:DI ! 1074: (match_operand:SI 2 "nonimmediate_operand" "rmn"))))] ! 1075: "" ! 1076: "meid %2,%0") ! 1077: ! 1078: ;;- Divide instructions. ! 1079: ! 1080: (define_insn "divdf3" ! 1081: [(set (match_operand:DF 0 "general_operand" "=fm") ! 1082: (div:DF (match_operand:DF 1 "general_operand" "0") ! 1083: (match_operand:DF 2 "general_operand" "fmF")))] ! 1084: "TARGET_32081" ! 1085: "divl %2,%0") ! 1086: ! 1087: (define_insn "divsf3" ! 1088: [(set (match_operand:SF 0 "general_operand" "=fm") ! 1089: (div:SF (match_operand:SF 1 "general_operand" "0") ! 1090: (match_operand:SF 2 "general_operand" "fmF")))] ! 1091: "TARGET_32081" ! 1092: "divf %2,%0") ! 1093: ! 1094: (define_insn "divsi3" ! 1095: [(set (match_operand:SI 0 "general_operand" "=g") ! 1096: (div:SI (match_operand:SI 1 "general_operand" "0") ! 1097: (match_operand:SI 2 "general_operand" "rmn")))] ! 1098: "" ! 1099: "quod %2,%0") ! 1100: ! 1101: (define_insn "divhi3" ! 1102: [(set (match_operand:HI 0 "general_operand" "=g") ! 1103: (div:HI (match_operand:HI 1 "general_operand" "0") ! 1104: (match_operand:HI 2 "general_operand" "g")))] ! 1105: "" ! 1106: "quow %2,%0") ! 1107: ! 1108: (define_insn "divqi3" ! 1109: [(set (match_operand:QI 0 "general_operand" "=g") ! 1110: (div:QI (match_operand:QI 1 "general_operand" "0") ! 1111: (match_operand:QI 2 "general_operand" "g")))] ! 1112: "" ! 1113: "quob %2,%0") ! 1114: ! 1115: (define_insn "udivsi3" ! 1116: [(set (match_operand:SI 0 "register_operand" "=r") ! 1117: (udiv:SI (subreg:SI (match_operand:DI 1 "reg_or_mem_operand" "0") 0) ! 1118: (match_operand:SI 2 "general_operand" "rmn")))] ! 1119: "" ! 1120: "* ! 1121: { ! 1122: operands[1] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1); ! 1123: return \"deid %2,%0\;movd %1,%0\"; ! 1124: }") ! 1125: ! 1126: (define_insn "udivhi3" ! 1127: [(set (match_operand:HI 0 "register_operand" "=r") ! 1128: (udiv:HI (subreg:HI (match_operand:DI 1 "reg_or_mem_operand" "0") 0) ! 1129: (match_operand:HI 2 "general_operand" "g")))] ! 1130: "" ! 1131: "* ! 1132: { ! 1133: operands[1] = gen_rtx (REG, HImode, REGNO (operands[0]) + 1); ! 1134: return \"deiw %2,%0\;movw %1,%0\"; ! 1135: }") ! 1136: ! 1137: (define_insn "udivqi3" ! 1138: [(set (match_operand:QI 0 "register_operand" "=r") ! 1139: (udiv:QI (subreg:QI (match_operand:DI 1 "reg_or_mem_operand" "0") 0) ! 1140: (match_operand:QI 2 "general_operand" "g")))] ! 1141: "" ! 1142: "* ! 1143: { ! 1144: operands[1] = gen_rtx (REG, QImode, REGNO (operands[0]) + 1); ! 1145: return \"deib %2,%0\;movb %1,%0\"; ! 1146: }") ! 1147: ! 1148: ;; Remainder instructions. ! 1149: ! 1150: (define_insn "modsi3" ! 1151: [(set (match_operand:SI 0 "general_operand" "=g") ! 1152: (mod:SI (match_operand:SI 1 "general_operand" "0") ! 1153: (match_operand:SI 2 "general_operand" "rmn")))] ! 1154: "" ! 1155: "remd %2,%0") ! 1156: ! 1157: (define_insn "modhi3" ! 1158: [(set (match_operand:HI 0 "general_operand" "=g") ! 1159: (mod:HI (match_operand:HI 1 "general_operand" "0") ! 1160: (match_operand:HI 2 "general_operand" "g")))] ! 1161: "" ! 1162: "remw %2,%0") ! 1163: ! 1164: (define_insn "modqi3" ! 1165: [(set (match_operand:QI 0 "general_operand" "=g") ! 1166: (mod:QI (match_operand:QI 1 "general_operand" "0") ! 1167: (match_operand:QI 2 "general_operand" "g")))] ! 1168: "" ! 1169: "remb %2,%0") ! 1170: ! 1171: (define_insn "umodsi3" ! 1172: [(set (match_operand:SI 0 "register_operand" "=r") ! 1173: (umod:SI (subreg:SI (match_operand:DI 1 "reg_or_mem_operand" "0") 0) ! 1174: (match_operand:SI 2 "general_operand" "rmn")))] ! 1175: "" ! 1176: "deid %2,%0") ! 1177: ! 1178: (define_insn "umodhi3" ! 1179: [(set (match_operand:HI 0 "register_operand" "=r") ! 1180: (umod:HI (subreg:HI (match_operand:DI 1 "reg_or_mem_operand" "0") 0) ! 1181: (match_operand:HI 2 "general_operand" "g")))] ! 1182: "" ! 1183: "deiw %2,%0") ! 1184: ! 1185: (define_insn "umodqi3" ! 1186: [(set (match_operand:QI 0 "register_operand" "=r") ! 1187: (umod:QI (subreg:QI (match_operand:DI 1 "reg_or_mem_operand" "0") 0) ! 1188: (match_operand:QI 2 "general_operand" "g")))] ! 1189: "" ! 1190: "deib %2,%0") ! 1191: ! 1192: ; This isn't be usable in its current form. ! 1193: ;(define_insn "udivmoddisi4" ! 1194: ; [(set (subreg:SI (match_operand:DI 0 "general_operand" "=r") 1) ! 1195: ; (udiv:SI (match_operand:DI 1 "general_operand" "0") ! 1196: ; (match_operand:SI 2 "general_operand" "rmn"))) ! 1197: ; (set (subreg:SI (match_dup 0) 0) ! 1198: ; (umod:SI (match_dup 1) (match_dup 2)))] ! 1199: ; "" ! 1200: ; "deid %2,%0") ! 1201: ! 1202: ;;- Logical Instructions: AND ! 1203: ! 1204: (define_insn "andsi3" ! 1205: [(set (match_operand:SI 0 "general_operand" "=g") ! 1206: (and:SI (match_operand:SI 1 "general_operand" "%0") ! 1207: (match_operand:SI 2 "general_operand" "rmn")))] ! 1208: "" ! 1209: "* ! 1210: { ! 1211: if (GET_CODE (operands[2]) == CONST_INT) ! 1212: { ! 1213: if ((INTVAL (operands[2]) | 0xff) == 0xffffffff) ! 1214: { ! 1215: if (INTVAL (operands[2]) == 0xffffff00) ! 1216: return \"movqb %$0,%0\"; ! 1217: else ! 1218: { ! 1219: operands[2] = gen_rtx (CONST_INT, VOIDmode, ! 1220: INTVAL (operands[2]) & 0xff); ! 1221: return \"andb %2,%0\"; ! 1222: } ! 1223: } ! 1224: if ((INTVAL (operands[2]) | 0xffff) == 0xffffffff) ! 1225: { ! 1226: if (INTVAL (operands[2]) == 0xffff0000) ! 1227: return \"movqw %$0,%0\"; ! 1228: else ! 1229: { ! 1230: operands[2] = gen_rtx (CONST_INT, VOIDmode, ! 1231: INTVAL (operands[2]) & 0xffff); ! 1232: return \"andw %2,%0\"; ! 1233: } ! 1234: } ! 1235: } ! 1236: return \"andd %2,%0\"; ! 1237: }") ! 1238: ! 1239: (define_insn "andhi3" ! 1240: [(set (match_operand:HI 0 "general_operand" "=g") ! 1241: (and:HI (match_operand:HI 1 "general_operand" "%0") ! 1242: (match_operand:HI 2 "general_operand" "g")))] ! 1243: "" ! 1244: "* ! 1245: { ! 1246: if (GET_CODE (operands[2]) == CONST_INT ! 1247: && (INTVAL (operands[2]) | 0xff) == 0xffffffff) ! 1248: { ! 1249: if (INTVAL (operands[2]) == 0xffffff00) ! 1250: return \"movqb %$0,%0\"; ! 1251: else ! 1252: { ! 1253: operands[2] = gen_rtx (CONST_INT, VOIDmode, ! 1254: INTVAL (operands[2]) & 0xff); ! 1255: return \"andb %2,%0\"; ! 1256: } ! 1257: } ! 1258: return \"andw %2,%0\"; ! 1259: }") ! 1260: ! 1261: (define_insn "andqi3" ! 1262: [(set (match_operand:QI 0 "general_operand" "=g") ! 1263: (and:QI (match_operand:QI 1 "general_operand" "%0") ! 1264: (match_operand:QI 2 "general_operand" "g")))] ! 1265: "" ! 1266: "andb %2,%0") ! 1267: ! 1268: (define_insn "" ! 1269: [(set (match_operand:SI 0 "general_operand" "=g") ! 1270: (and:SI (not:SI (match_operand:SI 1 "general_operand" "rmn")) ! 1271: (match_operand:SI 2 "general_operand" "0")))] ! 1272: "" ! 1273: "bicd %1,%0") ! 1274: ! 1275: (define_insn "" ! 1276: [(set (match_operand:HI 0 "general_operand" "=g") ! 1277: (and:HI (not:HI (match_operand:HI 1 "general_operand" "g")) ! 1278: (match_operand:HI 2 "general_operand" "0")))] ! 1279: "" ! 1280: "bicw %1,%0") ! 1281: ! 1282: (define_insn "" ! 1283: [(set (match_operand:QI 0 "general_operand" "=g") ! 1284: (and:QI (not:QI (match_operand:QI 1 "general_operand" "g")) ! 1285: (match_operand:QI 2 "general_operand" "0")))] ! 1286: "" ! 1287: "bicb %1,%0") ! 1288: ! 1289: ;;- Bit set instructions. ! 1290: ! 1291: (define_insn "iorsi3" ! 1292: [(set (match_operand:SI 0 "general_operand" "=g") ! 1293: (ior:SI (match_operand:SI 1 "general_operand" "%0") ! 1294: (match_operand:SI 2 "general_operand" "rmn")))] ! 1295: "" ! 1296: "* ! 1297: { ! 1298: if (GET_CODE (operands[2]) == CONST_INT) { ! 1299: if ((INTVAL (operands[2]) & 0xffffff00) == 0) ! 1300: return \"orb %2,%0\"; ! 1301: if ((INTVAL (operands[2]) & 0xffff0000) == 0) ! 1302: return \"orw %2,%0\"; ! 1303: } ! 1304: return \"ord %2,%0\"; ! 1305: }") ! 1306: ! 1307: (define_insn "iorhi3" ! 1308: [(set (match_operand:HI 0 "general_operand" "=g") ! 1309: (ior:HI (match_operand:HI 1 "general_operand" "%0") ! 1310: (match_operand:HI 2 "general_operand" "g")))] ! 1311: "" ! 1312: "* ! 1313: { ! 1314: if (GET_CODE(operands[2]) == CONST_INT && ! 1315: (INTVAL(operands[2]) & 0xffffff00) == 0) ! 1316: return \"orb %2,%0\"; ! 1317: return \"orw %2,%0\"; ! 1318: }") ! 1319: ! 1320: (define_insn "iorqi3" ! 1321: [(set (match_operand:QI 0 "general_operand" "=g") ! 1322: (ior:QI (match_operand:QI 1 "general_operand" "%0") ! 1323: (match_operand:QI 2 "general_operand" "g")))] ! 1324: "" ! 1325: "orb %2,%0") ! 1326: ! 1327: ;;- xor instructions. ! 1328: ! 1329: (define_insn "xorsi3" ! 1330: [(set (match_operand:SI 0 "general_operand" "=g") ! 1331: (xor:SI (match_operand:SI 1 "general_operand" "%0") ! 1332: (match_operand:SI 2 "general_operand" "rmn")))] ! 1333: "" ! 1334: "* ! 1335: { ! 1336: if (GET_CODE (operands[2]) == CONST_INT) { ! 1337: if ((INTVAL (operands[2]) & 0xffffff00) == 0) ! 1338: return \"xorb %2,%0\"; ! 1339: if ((INTVAL (operands[2]) & 0xffff0000) == 0) ! 1340: return \"xorw %2,%0\"; ! 1341: } ! 1342: return \"xord %2,%0\"; ! 1343: }") ! 1344: ! 1345: (define_insn "xorhi3" ! 1346: [(set (match_operand:HI 0 "general_operand" "=g") ! 1347: (xor:HI (match_operand:HI 1 "general_operand" "%0") ! 1348: (match_operand:HI 2 "general_operand" "g")))] ! 1349: "" ! 1350: "* ! 1351: { ! 1352: if (GET_CODE(operands[2]) == CONST_INT && ! 1353: (INTVAL(operands[2]) & 0xffffff00) == 0) ! 1354: return \"xorb %2,%0\"; ! 1355: return \"xorw %2,%0\"; ! 1356: }") ! 1357: ! 1358: (define_insn "xorqi3" ! 1359: [(set (match_operand:QI 0 "general_operand" "=g") ! 1360: (xor:QI (match_operand:QI 1 "general_operand" "%0") ! 1361: (match_operand:QI 2 "general_operand" "g")))] ! 1362: "" ! 1363: "xorb %2,%0") ! 1364: ! 1365: (define_insn "negdf2" ! 1366: [(set (match_operand:DF 0 "general_operand" "=fm<") ! 1367: (neg:DF (match_operand:DF 1 "general_operand" "fmF")))] ! 1368: "TARGET_32081" ! 1369: "negl %1,%0") ! 1370: ! 1371: (define_insn "negsf2" ! 1372: [(set (match_operand:SF 0 "general_operand" "=fm<") ! 1373: (neg:SF (match_operand:SF 1 "general_operand" "fmF")))] ! 1374: "TARGET_32081" ! 1375: "negf %1,%0") ! 1376: ! 1377: (define_insn "negsi2" ! 1378: [(set (match_operand:SI 0 "general_operand" "=g<") ! 1379: (neg:SI (match_operand:SI 1 "general_operand" "rmn")))] ! 1380: "" ! 1381: "negd %1,%0") ! 1382: ! 1383: (define_insn "neghi2" ! 1384: [(set (match_operand:HI 0 "general_operand" "=g<") ! 1385: (neg:HI (match_operand:HI 1 "general_operand" "g")))] ! 1386: "" ! 1387: "negw %1,%0") ! 1388: ! 1389: (define_insn "negqi2" ! 1390: [(set (match_operand:QI 0 "general_operand" "=g<") ! 1391: (neg:QI (match_operand:QI 1 "general_operand" "g")))] ! 1392: "" ! 1393: "negb %1,%0") ! 1394: ! 1395: (define_insn "one_cmplsi2" ! 1396: [(set (match_operand:SI 0 "general_operand" "=g<") ! 1397: (not:SI (match_operand:SI 1 "general_operand" "rmn")))] ! 1398: "" ! 1399: "comd %1,%0") ! 1400: ! 1401: (define_insn "one_cmplhi2" ! 1402: [(set (match_operand:HI 0 "general_operand" "=g<") ! 1403: (not:HI (match_operand:HI 1 "general_operand" "g")))] ! 1404: "" ! 1405: "comw %1,%0") ! 1406: ! 1407: (define_insn "one_cmplqi2" ! 1408: [(set (match_operand:QI 0 "general_operand" "=g<") ! 1409: (not:QI (match_operand:QI 1 "general_operand" "g")))] ! 1410: "" ! 1411: "comb %1,%0") ! 1412: ! 1413: ;; arithmetic left and right shift operations ! 1414: ;; on the 32532 we will always use lshd for arithmetic left shifts, ! 1415: ;; because it is three times faster. Broken programs which ! 1416: ;; use negative shift counts are probably broken differently ! 1417: ;; than elsewhere. ! 1418: ! 1419: ;; alternative 0 never matches on the 32532 ! 1420: (define_insn "ashlsi3" ! 1421: [(set (match_operand:SI 0 "general_operand" "=g,g") ! 1422: (ashift:SI (match_operand:SI 1 "general_operand" "r,0") ! 1423: (match_operand:SI 2 "general_operand" "I,rmn")))] ! 1424: "" ! 1425: "* ! 1426: { if (TARGET_32532) ! 1427: return \"lshd %2,%0\"; ! 1428: else ! 1429: return output_shift_insn (operands); ! 1430: }") ! 1431: ! 1432: (define_insn "ashlhi3" ! 1433: [(set (match_operand:HI 0 "general_operand" "=g") ! 1434: (ashift:HI (match_operand:HI 1 "general_operand" "0") ! 1435: (match_operand:SI 2 "general_operand" "rmn")))] ! 1436: "" ! 1437: "* ! 1438: { if (GET_CODE (operands[2]) == CONST_INT) ! 1439: { ! 1440: if (INTVAL (operands[2]) == 1) ! 1441: return \"addw %0,%0\"; ! 1442: else if (INTVAL (operands[2]) == 2 && !TARGET_32532) ! 1443: return \"addw %0,%0\;addw %0,%0\"; ! 1444: } ! 1445: if (TARGET_32532) ! 1446: return \"lshw %2,%0\"; ! 1447: else ! 1448: return \"ashw %2,%0\"; ! 1449: }") ! 1450: ! 1451: (define_insn "ashlqi3" ! 1452: [(set (match_operand:QI 0 "general_operand" "=g") ! 1453: (ashift:QI (match_operand:QI 1 "general_operand" "0") ! 1454: (match_operand:SI 2 "general_operand" "rmn")))] ! 1455: "" ! 1456: "* ! 1457: { if (GET_CODE (operands[2]) == CONST_INT) ! 1458: { ! 1459: if (INTVAL (operands[2]) == 1) ! 1460: return \"addb %0,%0\"; ! 1461: else if (INTVAL (operands[2]) == 2 && !TARGET_32532) ! 1462: return \"addb %0,%0\;addb %0,%0\"; ! 1463: } ! 1464: if (TARGET_32532) ! 1465: return \"lshb %2,%0\"; ! 1466: else ! 1467: return \"ashb %2,%0\"; ! 1468: }") ! 1469: ! 1470: ;; Arithmetic right shift on the 32k works by negating the shift count. ! 1471: (define_expand "ashrsi3" ! 1472: [(set (match_operand:SI 0 "general_operand" "=g") ! 1473: (ashiftrt:SI (match_operand:SI 1 "general_operand" "g") ! 1474: (match_operand:SI 2 "general_operand" "g")))] ! 1475: "" ! 1476: " ! 1477: { ! 1478: if (GET_CODE (operands[2]) != CONST_INT) ! 1479: operands[2] = gen_rtx (NEG, SImode, negate_rtx (SImode, operands[2])); ! 1480: }") ! 1481: ! 1482: (define_insn "" ! 1483: [(set (match_operand:SI 0 "general_operand" "=g") ! 1484: (ashiftrt:SI (match_operand:SI 1 "general_operand" "0") ! 1485: (match_operand:SI 2 "immediate_operand" "i")))] ! 1486: "" ! 1487: "ashd %$%n2,%0") ! 1488: ! 1489: (define_insn "" ! 1490: [(set (match_operand:SI 0 "general_operand" "=g") ! 1491: (ashiftrt:SI (match_operand:SI 1 "general_operand" "0") ! 1492: (neg:SI (match_operand:SI 2 "general_operand" "r"))))] ! 1493: "" ! 1494: "ashd %2,%0") ! 1495: ! 1496: (define_expand "ashrhi3" ! 1497: [(set (match_operand:HI 0 "general_operand" "=g") ! 1498: (ashiftrt:HI (match_operand:HI 1 "general_operand" "g") ! 1499: (match_operand:SI 2 "general_operand" "g")))] ! 1500: "" ! 1501: " ! 1502: { ! 1503: if (GET_CODE (operands[2]) != CONST_INT) ! 1504: operands[2] = gen_rtx (NEG, SImode, negate_rtx (SImode, operands[2])); ! 1505: }") ! 1506: ! 1507: (define_insn "" ! 1508: [(set (match_operand:HI 0 "general_operand" "=g") ! 1509: (ashiftrt:HI (match_operand:HI 1 "general_operand" "0") ! 1510: (match_operand:SI 2 "immediate_operand" "i")))] ! 1511: "" ! 1512: "ashw %$%n2,%0") ! 1513: ! 1514: (define_insn "" ! 1515: [(set (match_operand:HI 0 "general_operand" "=g") ! 1516: (ashiftrt:HI (match_operand:HI 1 "general_operand" "0") ! 1517: (neg:SI (match_operand:SI 2 "general_operand" "r"))))] ! 1518: "" ! 1519: "ashw %2,%0") ! 1520: ! 1521: (define_expand "ashrqi3" ! 1522: [(set (match_operand:QI 0 "general_operand" "=g") ! 1523: (ashiftrt:QI (match_operand:QI 1 "general_operand" "g") ! 1524: (match_operand:SI 2 "general_operand" "g")))] ! 1525: "" ! 1526: " ! 1527: { ! 1528: if (GET_CODE (operands[2]) != CONST_INT) ! 1529: operands[2] = gen_rtx (NEG, SImode, negate_rtx (SImode, operands[2])); ! 1530: }") ! 1531: ! 1532: (define_insn "" ! 1533: [(set (match_operand:QI 0 "general_operand" "=g") ! 1534: (ashiftrt:QI (match_operand:QI 1 "general_operand" "0") ! 1535: (match_operand:SI 2 "immediate_operand" "i")))] ! 1536: "" ! 1537: "ashb %$%n2,%0") ! 1538: ! 1539: (define_insn "" ! 1540: [(set (match_operand:QI 0 "general_operand" "=g") ! 1541: (ashiftrt:QI (match_operand:QI 1 "general_operand" "0") ! 1542: (neg:SI (match_operand:SI 2 "general_operand" "r"))))] ! 1543: "" ! 1544: "ashb %2,%0") ! 1545: ! 1546: ;; logical shift instructions ! 1547: ! 1548: (define_insn "lshlsi3" ! 1549: [(set (match_operand:SI 0 "general_operand" "=g") ! 1550: (lshift:SI (match_operand:SI 1 "general_operand" "0") ! 1551: (match_operand:SI 2 "general_operand" "rmn")))] ! 1552: "" ! 1553: "lshd %2,%0") ! 1554: ! 1555: (define_insn "lshlhi3" ! 1556: [(set (match_operand:HI 0 "general_operand" "=g") ! 1557: (lshift:HI (match_operand:HI 1 "general_operand" "0") ! 1558: (match_operand:SI 2 "general_operand" "rmn")))] ! 1559: "" ! 1560: "lshw %2,%0") ! 1561: ! 1562: (define_insn "lshlqi3" ! 1563: [(set (match_operand:QI 0 "general_operand" "=g") ! 1564: (lshift:QI (match_operand:QI 1 "general_operand" "0") ! 1565: (match_operand:SI 2 "general_operand" "rmn")))] ! 1566: "" ! 1567: "lshb %2,%0") ! 1568: ! 1569: ;; Logical right shift on the 32k works by negating the shift count. ! 1570: (define_expand "lshrsi3" ! 1571: [(set (match_operand:SI 0 "general_operand" "=g") ! 1572: (lshiftrt:SI (match_operand:SI 1 "general_operand" "g") ! 1573: (match_operand:SI 2 "general_operand" "g")))] ! 1574: "" ! 1575: " ! 1576: { ! 1577: if (GET_CODE (operands[2]) != CONST_INT) ! 1578: operands[2] = gen_rtx (NEG, SImode, negate_rtx (SImode, operands[2])); ! 1579: }") ! 1580: ! 1581: (define_insn "" ! 1582: [(set (match_operand:SI 0 "general_operand" "=g") ! 1583: (lshiftrt:SI (match_operand:SI 1 "general_operand" "0") ! 1584: (match_operand:SI 2 "immediate_operand" "i")))] ! 1585: "" ! 1586: "lshd %$%n2,%0") ! 1587: ! 1588: (define_insn "" ! 1589: [(set (match_operand:SI 0 "general_operand" "=g") ! 1590: (lshiftrt:SI (match_operand:SI 1 "general_operand" "0") ! 1591: (neg:SI (match_operand:SI 2 "general_operand" "r"))))] ! 1592: "" ! 1593: "lshd %2,%0") ! 1594: ! 1595: (define_expand "lshrhi3" ! 1596: [(set (match_operand:HI 0 "general_operand" "=g") ! 1597: (lshiftrt:HI (match_operand:HI 1 "general_operand" "g") ! 1598: (match_operand:SI 2 "general_operand" "g")))] ! 1599: "" ! 1600: " ! 1601: { ! 1602: if (GET_CODE (operands[2]) != CONST_INT) ! 1603: operands[2] = gen_rtx (NEG, SImode, negate_rtx (SImode, operands[2])); ! 1604: }") ! 1605: ! 1606: (define_insn "" ! 1607: [(set (match_operand:HI 0 "general_operand" "=g") ! 1608: (lshiftrt:HI (match_operand:HI 1 "general_operand" "0") ! 1609: (match_operand:SI 2 "immediate_operand" "i")))] ! 1610: "" ! 1611: "lshw %$%n2,%0") ! 1612: ! 1613: (define_insn "" ! 1614: [(set (match_operand:HI 0 "general_operand" "=g") ! 1615: (lshiftrt:HI (match_operand:HI 1 "general_operand" "0") ! 1616: (neg:SI (match_operand:SI 2 "general_operand" "r"))))] ! 1617: "" ! 1618: "lshw %2,%0") ! 1619: ! 1620: (define_expand "lshrqi3" ! 1621: [(set (match_operand:QI 0 "general_operand" "=g") ! 1622: (lshiftrt:QI (match_operand:QI 1 "general_operand" "g") ! 1623: (match_operand:SI 2 "general_operand" "g")))] ! 1624: "" ! 1625: " ! 1626: { ! 1627: if (GET_CODE (operands[2]) != CONST_INT) ! 1628: operands[2] = gen_rtx (NEG, SImode, negate_rtx (SImode, operands[2])); ! 1629: }") ! 1630: ! 1631: (define_insn "" ! 1632: [(set (match_operand:QI 0 "general_operand" "=g") ! 1633: (lshiftrt:QI (match_operand:QI 1 "general_operand" "0") ! 1634: (match_operand:SI 2 "immediate_operand" "i")))] ! 1635: "" ! 1636: "lshb %$%n2,%0") ! 1637: ! 1638: (define_insn "" ! 1639: [(set (match_operand:QI 0 "general_operand" "=g") ! 1640: (lshiftrt:QI (match_operand:QI 1 "general_operand" "0") ! 1641: (neg:SI (match_operand:SI 2 "general_operand" "r"))))] ! 1642: "" ! 1643: "lshb %2,%0") ! 1644: ! 1645: ;; Rotate instructions ! 1646: ! 1647: (define_insn "rotlsi3" ! 1648: [(set (match_operand:SI 0 "general_operand" "=g") ! 1649: (rotate:SI (match_operand:SI 1 "general_operand" "0") ! 1650: (match_operand:SI 2 "general_operand" "rmn")))] ! 1651: "" ! 1652: "rotd %2,%0") ! 1653: ! 1654: (define_insn "rotlhi3" ! 1655: [(set (match_operand:HI 0 "general_operand" "=g") ! 1656: (rotate:HI (match_operand:HI 1 "general_operand" "0") ! 1657: (match_operand:SI 2 "general_operand" "rmn")))] ! 1658: "" ! 1659: "rotw %2,%0") ! 1660: ! 1661: (define_insn "rotlqi3" ! 1662: [(set (match_operand:QI 0 "general_operand" "=g") ! 1663: (rotate:QI (match_operand:QI 1 "general_operand" "0") ! 1664: (match_operand:SI 2 "general_operand" "rmn")))] ! 1665: "" ! 1666: "rotb %2,%0") ! 1667: ! 1668: ;; Right rotate on the 32k works by negating the shift count. ! 1669: (define_expand "rotrsi3" ! 1670: [(set (match_operand:SI 0 "general_operand" "=g") ! 1671: (rotatert:SI (match_operand:SI 1 "general_operand" "g") ! 1672: (match_operand:SI 2 "general_operand" "g")))] ! 1673: "" ! 1674: " ! 1675: { ! 1676: if (GET_CODE (operands[2]) != CONST_INT) ! 1677: operands[2] = gen_rtx (NEG, SImode, negate_rtx (SImode, operands[2])); ! 1678: }") ! 1679: ! 1680: (define_insn "" ! 1681: [(set (match_operand:SI 0 "general_operand" "=g") ! 1682: (rotatert:SI (match_operand:SI 1 "general_operand" "0") ! 1683: (match_operand:SI 2 "immediate_operand" "i")))] ! 1684: "" ! 1685: "rotd %$%n2,%0") ! 1686: ! 1687: (define_insn "" ! 1688: [(set (match_operand:SI 0 "general_operand" "=g") ! 1689: (rotatert:SI (match_operand:SI 1 "general_operand" "0") ! 1690: (neg:SI (match_operand:SI 2 "general_operand" "r"))))] ! 1691: "" ! 1692: "rotd %2,%0") ! 1693: ! 1694: (define_expand "rotrhi3" ! 1695: [(set (match_operand:HI 0 "general_operand" "=g") ! 1696: (rotatert:HI (match_operand:HI 1 "general_operand" "g") ! 1697: (match_operand:SI 2 "general_operand" "g")))] ! 1698: "" ! 1699: " ! 1700: { ! 1701: if (GET_CODE (operands[2]) != CONST_INT) ! 1702: operands[2] = gen_rtx (NEG, SImode, negate_rtx (SImode, operands[2])); ! 1703: }") ! 1704: ! 1705: (define_insn "" ! 1706: [(set (match_operand:HI 0 "general_operand" "=g") ! 1707: (rotatert:HI (match_operand:HI 1 "general_operand" "0") ! 1708: (match_operand:SI 2 "immediate_operand" "i")))] ! 1709: "" ! 1710: "rotw %$%n2,%0") ! 1711: ! 1712: (define_insn "" ! 1713: [(set (match_operand:HI 0 "general_operand" "=g") ! 1714: (rotatert:HI (match_operand:HI 1 "general_operand" "0") ! 1715: (neg:SI (match_operand:SI 2 "general_operand" "r"))))] ! 1716: "" ! 1717: "rotw %2,%0") ! 1718: ! 1719: (define_expand "rotrqi3" ! 1720: [(set (match_operand:QI 0 "general_operand" "=g") ! 1721: (rotatert:QI (match_operand:QI 1 "general_operand" "g") ! 1722: (match_operand:SI 2 "general_operand" "g")))] ! 1723: "" ! 1724: " ! 1725: { ! 1726: if (GET_CODE (operands[2]) != CONST_INT) ! 1727: operands[2] = gen_rtx (NEG, SImode, negate_rtx (SImode, operands[2])); ! 1728: }") ! 1729: ! 1730: (define_insn "" ! 1731: [(set (match_operand:QI 0 "general_operand" "=g") ! 1732: (rotatert:QI (match_operand:QI 1 "general_operand" "0") ! 1733: (match_operand:SI 2 "immediate_operand" "i")))] ! 1734: "" ! 1735: "rotb %$%n2,%0") ! 1736: ! 1737: (define_insn "" ! 1738: [(set (match_operand:QI 0 "general_operand" "=g") ! 1739: (rotatert:QI (match_operand:QI 1 "general_operand" "0") ! 1740: (neg:SI (match_operand:SI 2 "general_operand" "r"))))] ! 1741: "" ! 1742: "rotb %2,%0") ! 1743: ! 1744: ;;- load or push effective address ! 1745: ;; These come after the move, add, and multiply patterns ! 1746: ;; because we don't want pushl $1 turned into pushad 1. ! 1747: ! 1748: (define_insn "" ! 1749: [(set (match_operand:SI 0 "general_operand" "=g<") ! 1750: (match_operand:QI 1 "address_operand" "p"))] ! 1751: "" ! 1752: "* ! 1753: { ! 1754: if (REG_P (operands[0]) ! 1755: && GET_CODE (operands[1]) == MULT ! 1756: && GET_CODE (XEXP (operands[1], 1)) == CONST_INT ! 1757: && (INTVAL (XEXP (operands[1], 1)) == 2 ! 1758: || INTVAL (XEXP (operands[1], 1)) == 4)) ! 1759: { ! 1760: rtx xoperands[3]; ! 1761: xoperands[0] = operands[0]; ! 1762: xoperands[1] = XEXP (operands[1], 0); ! 1763: xoperands[2] = gen_rtx (CONST_INT, VOIDmode, INTVAL (XEXP (operands[1], 1)) >> 1); ! 1764: return output_shift_insn (xoperands); ! 1765: } ! 1766: return \"addr %a1,%0\"; ! 1767: }") ! 1768: ! 1769: ;;; Index insns. These are about the same speed as multiply-add counterparts. ! 1770: ;;; but slower then using power-of-2 shifts if we can use them ! 1771: ; ! 1772: ;(define_insn "" ! 1773: ; [(set (match_operand:SI 0 "register_operand" "=r") ! 1774: ; (plus:SI (match_operand:SI 1 "general_operand" "rmn") ! 1775: ; (mult:SI (match_operand:SI 2 "register_operand" "0") ! 1776: ; (plus:SI (match_operand:SI 3 "general_operand" "rmn") (const_int 1)))))] ! 1777: ; "GET_CODE (operands[3]) != CONST_INT || INTVAL (operands[3]) > 8" ! 1778: ; "indexd %0,%3,%1") ! 1779: ; ! 1780: ;(define_insn "" ! 1781: ; [(set (match_operand:SI 0 "register_operand" "=r") ! 1782: ; (plus:SI (mult:SI (match_operand:SI 1 "register_operand" "0") ! 1783: ; (plus:SI (match_operand:SI 2 "general_operand" "rmn") (const_int 1))) ! 1784: ; (match_operand:SI 3 "general_operand" "rmn")))] ! 1785: ; "GET_CODE (operands[2]) != CONST_INT || INTVAL (operands[2]) > 8" ! 1786: ; "indexd %0,%2,%3") ! 1787: ! 1788: ;; Set, Clear, and Invert bit ! 1789: ! 1790: (define_insn "" ! 1791: [(set (zero_extract:SI (match_operand:SI 0 "general_operand" "+g") ! 1792: (const_int 1) ! 1793: (match_operand:SI 1 "general_operand" "rmn")) ! 1794: (const_int 1))] ! 1795: "" ! 1796: "sbitd %1,%0") ! 1797: ! 1798: (define_insn "" ! 1799: [(set (zero_extract:SI (match_operand:SI 0 "general_operand" "+g") ! 1800: (const_int 1) ! 1801: (match_operand:SI 1 "general_operand" "rmn")) ! 1802: (const_int 0))] ! 1803: "" ! 1804: "cbitd %1,%0") ! 1805: ! 1806: (define_insn "" ! 1807: [(set (match_operand:SI 0 "general_operand" "+g") ! 1808: (xor:SI (ashift:SI (const_int 1) ! 1809: (match_operand:SI 1 "general_operand" "rmn")) ! 1810: (match_dup 0)))] ! 1811: "" ! 1812: "ibitd %1,%0") ! 1813: ! 1814: (define_insn "" ! 1815: [(set (match_operand:QI 0 "general_operand" "=g") ! 1816: (xor:QI (subreg:QI ! 1817: (ashift:SI (const_int 1) ! 1818: (match_operand:QI 1 "general_operand" "rmn")) 0) ! 1819: (match_dup 0)))] ! 1820: "" ! 1821: "ibitb %1,%0") ! 1822: ! 1823: ;; Recognize jbs and jbc instructions. ! 1824: ! 1825: (define_insn "" ! 1826: [(set (cc0) ! 1827: (zero_extract (match_operand:SI 0 "general_operand" "rm") ! 1828: (const_int 1) ! 1829: (match_operand:SI 1 "general_operand" "g")))] ! 1830: "" ! 1831: "* ! 1832: { cc_status.flags = CC_Z_IN_F; ! 1833: return \"tbitd %1,%0\"; ! 1834: }") ! 1835: ! 1836: ;; extract(base, width, offset) ! 1837: ;; Signed bitfield extraction is not supported in hardware on the ! 1838: ;; NS 32032. It is therefore better to let GCC figure out a ! 1839: ;; good strategy for generating the proper instruction sequence ! 1840: ;; and represent it as rtl. ! 1841: ! 1842: ;; Optimize the case of extracting a byte or word from a register. ! 1843: ;; Otherwise we must load a register with the offset of the ! 1844: ;; chunk we want, and perform an extract insn (each of which ! 1845: ;; is very expensive). Since we use the stack to do our bit-twiddling ! 1846: ;; we cannot use it for a destination. Perhaps things are fast ! 1847: ;; enough on the 32532 that such hacks are not needed. ! 1848: ! 1849: (define_insn "" ! 1850: [(set (match_operand:SI 0 "general_operand" "=ro") ! 1851: (zero_extract:SI (match_operand:SI 1 "register_operand" "r") ! 1852: (match_operand:SI 2 "const_int_operand" "i") ! 1853: (match_operand:SI 3 "const_int_operand" "i")))] ! 1854: "(INTVAL (operands[2]) == 8 || INTVAL (operands[2]) == 16) ! 1855: && (INTVAL (operands[3]) == 8 || INTVAL (operands[3]) == 16 || INTVAL (operands[3]) == 24)" ! 1856: "* ! 1857: { ! 1858: output_asm_insn (\"movd %1,tos\", operands); ! 1859: if (INTVAL (operands[2]) == 16) ! 1860: { ! 1861: if (INTVAL (operands[3]) == 8) ! 1862: output_asm_insn (\"movzwd 1(sp),%0\", operands); ! 1863: else ! 1864: output_asm_insn (\"movzwd 2(sp),%0\", operands); ! 1865: } ! 1866: else ! 1867: { ! 1868: if (INTVAL (operands[3]) == 8) ! 1869: output_asm_insn (\"movzbd 1(sp),%0\", operands); ! 1870: else if (INTVAL (operands[3]) == 16) ! 1871: output_asm_insn (\"movzbd 2(sp),%0\", operands); ! 1872: else ! 1873: output_asm_insn (\"movzbd 3(sp),%0\", operands); ! 1874: } ! 1875: if (TARGET_32532 || TARGET_32332) ! 1876: return \"cmpqd %$0,tos\"; ! 1877: else ! 1878: return \"adjspb %$-4\"; ! 1879: }") ! 1880: ! 1881: (define_insn "" ! 1882: [(set (match_operand:SI 0 "general_operand" "=g<") ! 1883: (zero_extract:SI (match_operand:SI 1 "register_operand" "g") ! 1884: (match_operand:SI 2 "const_int_operand" "i") ! 1885: (match_operand:SI 3 "general_operand" "rK")))] ! 1886: "" ! 1887: "* ! 1888: { if (GET_CODE (operands[3]) == CONST_INT) ! 1889: return \"extsd %1,%0,%3,%2\"; ! 1890: else return \"extd %3,%1,%0,%2\"; ! 1891: }") ! 1892: ! 1893: (define_insn "extzv" ! 1894: [(set (match_operand:SI 0 "general_operand" "=g<") ! 1895: (zero_extract:SI (match_operand:QI 1 "general_operand" "g") ! 1896: (match_operand:SI 2 "const_int_operand" "i") ! 1897: (match_operand:SI 3 "general_operand" "rK")))] ! 1898: "" ! 1899: "* ! 1900: { if (GET_CODE (operands[3]) == CONST_INT) ! 1901: return \"extsd %1,%0,%3,%2\"; ! 1902: else return \"extd %3,%1,%0,%2\"; ! 1903: }") ! 1904: ! 1905: (define_insn "" ! 1906: [(set (zero_extract:SI (match_operand:SI 0 "memory_operand" "+o") ! 1907: (match_operand:SI 1 "const_int_operand" "i") ! 1908: (match_operand:SI 2 "general_operand" "rn")) ! 1909: (match_operand:SI 3 "general_operand" "rm"))] ! 1910: "" ! 1911: "* ! 1912: { if (GET_CODE (operands[2]) == CONST_INT) ! 1913: { ! 1914: if (INTVAL (operands[2]) >= 8) ! 1915: { ! 1916: operands[0] = adj_offsettable_operand (operands[0], ! 1917: INTVAL (operands[2]) / 8); ! 1918: operands[2] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[2]) % 8); ! 1919: } ! 1920: if (INTVAL (operands[1]) <= 8) ! 1921: return \"inssb %3,%0,%2,%1\"; ! 1922: else if (INTVAL (operands[1]) <= 16) ! 1923: return \"inssw %3,%0,%2,%1\"; ! 1924: else ! 1925: return \"inssd %3,%0,%2,%1\"; ! 1926: } ! 1927: return \"insd %2,%3,%0,%1\"; ! 1928: }") ! 1929: ! 1930: (define_insn "" ! 1931: [(set (zero_extract:SI (match_operand:SI 0 "register_operand" "+r") ! 1932: (match_operand:SI 1 "const_int_operand" "i") ! 1933: (match_operand:SI 2 "general_operand" "rK")) ! 1934: (match_operand:SI 3 "general_operand" "rm"))] ! 1935: "" ! 1936: "* ! 1937: { if (GET_CODE (operands[2]) == CONST_INT) ! 1938: if (INTVAL (operands[1]) <= 8) ! 1939: return \"inssb %3,%0,%2,%1\"; ! 1940: else if (INTVAL (operands[1]) <= 16) ! 1941: return \"inssw %3,%0,%2,%1\"; ! 1942: else ! 1943: return \"inssd %3,%0,%2,%1\"; ! 1944: return \"insd %2,%3,%0,%1\"; ! 1945: }") ! 1946: ! 1947: (define_insn "insv" ! 1948: [(set (zero_extract:SI (match_operand:QI 0 "general_operand" "+g") ! 1949: (match_operand:SI 1 "const_int_operand" "i") ! 1950: (match_operand:SI 2 "general_operand" "rK")) ! 1951: (match_operand:SI 3 "general_operand" "rm"))] ! 1952: "" ! 1953: "* ! 1954: { if (GET_CODE (operands[2]) == CONST_INT) ! 1955: if (INTVAL (operands[1]) <= 8) ! 1956: return \"inssb %3,%0,%2,%1\"; ! 1957: else if (INTVAL (operands[1]) <= 16) ! 1958: return \"inssw %3,%0,%2,%1\"; ! 1959: else ! 1960: return \"inssd %3,%0,%2,%1\"; ! 1961: return \"insd %2,%3,%0,%1\"; ! 1962: }") ! 1963: ! 1964: ! 1965: (define_insn "jump" ! 1966: [(set (pc) ! 1967: (label_ref (match_operand 0 "" "")))] ! 1968: "" ! 1969: "br %l0") ! 1970: ! 1971: (define_insn "beq" ! 1972: [(set (pc) ! 1973: (if_then_else (eq (cc0) ! 1974: (const_int 0)) ! 1975: (label_ref (match_operand 0 "" "")) ! 1976: (pc)))] ! 1977: "" ! 1978: "* ! 1979: { if (cc_prev_status.flags & CC_Z_IN_F) ! 1980: return \"bfc %l0\"; ! 1981: else if (cc_prev_status.flags & CC_Z_IN_NOT_F) ! 1982: return \"bfs %l0\"; ! 1983: else return \"beq %l0\"; ! 1984: }") ! 1985: ! 1986: (define_insn "bne" ! 1987: [(set (pc) ! 1988: (if_then_else (ne (cc0) ! 1989: (const_int 0)) ! 1990: (label_ref (match_operand 0 "" "")) ! 1991: (pc)))] ! 1992: "" ! 1993: "* ! 1994: { if (cc_prev_status.flags & CC_Z_IN_F) ! 1995: return \"bfs %l0\"; ! 1996: else if (cc_prev_status.flags & CC_Z_IN_NOT_F) ! 1997: return \"bfc %l0\"; ! 1998: else return \"bne %l0\"; ! 1999: }") ! 2000: ! 2001: (define_insn "bgt" ! 2002: [(set (pc) ! 2003: (if_then_else (gt (cc0) ! 2004: (const_int 0)) ! 2005: (label_ref (match_operand 0 "" "")) ! 2006: (pc)))] ! 2007: "" ! 2008: "bgt %l0") ! 2009: ! 2010: (define_insn "bgtu" ! 2011: [(set (pc) ! 2012: (if_then_else (gtu (cc0) ! 2013: (const_int 0)) ! 2014: (label_ref (match_operand 0 "" "")) ! 2015: (pc)))] ! 2016: "" ! 2017: "bhi %l0") ! 2018: ! 2019: (define_insn "blt" ! 2020: [(set (pc) ! 2021: (if_then_else (lt (cc0) ! 2022: (const_int 0)) ! 2023: (label_ref (match_operand 0 "" "")) ! 2024: (pc)))] ! 2025: "" ! 2026: "blt %l0") ! 2027: ! 2028: (define_insn "bltu" ! 2029: [(set (pc) ! 2030: (if_then_else (ltu (cc0) ! 2031: (const_int 0)) ! 2032: (label_ref (match_operand 0 "" "")) ! 2033: (pc)))] ! 2034: "" ! 2035: "blo %l0") ! 2036: ! 2037: (define_insn "bge" ! 2038: [(set (pc) ! 2039: (if_then_else (ge (cc0) ! 2040: (const_int 0)) ! 2041: (label_ref (match_operand 0 "" "")) ! 2042: (pc)))] ! 2043: "" ! 2044: "bge %l0") ! 2045: ! 2046: (define_insn "bgeu" ! 2047: [(set (pc) ! 2048: (if_then_else (geu (cc0) ! 2049: (const_int 0)) ! 2050: (label_ref (match_operand 0 "" "")) ! 2051: (pc)))] ! 2052: "" ! 2053: "bhs %l0") ! 2054: ! 2055: (define_insn "ble" ! 2056: [(set (pc) ! 2057: (if_then_else (le (cc0) ! 2058: (const_int 0)) ! 2059: (label_ref (match_operand 0 "" "")) ! 2060: (pc)))] ! 2061: "" ! 2062: "ble %l0") ! 2063: ! 2064: (define_insn "bleu" ! 2065: [(set (pc) ! 2066: (if_then_else (leu (cc0) ! 2067: (const_int 0)) ! 2068: (label_ref (match_operand 0 "" "")) ! 2069: (pc)))] ! 2070: "" ! 2071: "bls %l0") ! 2072: ! 2073: (define_insn "" ! 2074: [(set (pc) ! 2075: (if_then_else (eq (cc0) ! 2076: (const_int 0)) ! 2077: (pc) ! 2078: (label_ref (match_operand 0 "" ""))))] ! 2079: "" ! 2080: "* ! 2081: { if (cc_prev_status.flags & CC_Z_IN_F) ! 2082: return \"bfs %l0\"; ! 2083: else if (cc_prev_status.flags & CC_Z_IN_NOT_F) ! 2084: return \"bfc %l0\"; ! 2085: else return \"bne %l0\"; ! 2086: }") ! 2087: ! 2088: (define_insn "" ! 2089: [(set (pc) ! 2090: (if_then_else (ne (cc0) ! 2091: (const_int 0)) ! 2092: (pc) ! 2093: (label_ref (match_operand 0 "" ""))))] ! 2094: "" ! 2095: "* ! 2096: { if (cc_prev_status.flags & CC_Z_IN_F) ! 2097: return \"bfc %l0\"; ! 2098: else if (cc_prev_status.flags & CC_Z_IN_NOT_F) ! 2099: return \"bfs %l0\"; ! 2100: else return \"beq %l0\"; ! 2101: }") ! 2102: ! 2103: (define_insn "" ! 2104: [(set (pc) ! 2105: (if_then_else (gt (cc0) ! 2106: (const_int 0)) ! 2107: (pc) ! 2108: (label_ref (match_operand 0 "" ""))))] ! 2109: "" ! 2110: "ble %l0") ! 2111: ! 2112: (define_insn "" ! 2113: [(set (pc) ! 2114: (if_then_else (gtu (cc0) ! 2115: (const_int 0)) ! 2116: (pc) ! 2117: (label_ref (match_operand 0 "" ""))))] ! 2118: "" ! 2119: "bls %l0") ! 2120: ! 2121: (define_insn "" ! 2122: [(set (pc) ! 2123: (if_then_else (lt (cc0) ! 2124: (const_int 0)) ! 2125: (pc) ! 2126: (label_ref (match_operand 0 "" ""))))] ! 2127: "" ! 2128: "bge %l0") ! 2129: ! 2130: (define_insn "" ! 2131: [(set (pc) ! 2132: (if_then_else (ltu (cc0) ! 2133: (const_int 0)) ! 2134: (pc) ! 2135: (label_ref (match_operand 0 "" ""))))] ! 2136: "" ! 2137: "bhs %l0") ! 2138: ! 2139: (define_insn "" ! 2140: [(set (pc) ! 2141: (if_then_else (ge (cc0) ! 2142: (const_int 0)) ! 2143: (pc) ! 2144: (label_ref (match_operand 0 "" ""))))] ! 2145: "" ! 2146: "blt %l0") ! 2147: ! 2148: (define_insn "" ! 2149: [(set (pc) ! 2150: (if_then_else (geu (cc0) ! 2151: (const_int 0)) ! 2152: (pc) ! 2153: (label_ref (match_operand 0 "" ""))))] ! 2154: "" ! 2155: "blo %l0") ! 2156: ! 2157: (define_insn "" ! 2158: [(set (pc) ! 2159: (if_then_else (le (cc0) ! 2160: (const_int 0)) ! 2161: (pc) ! 2162: (label_ref (match_operand 0 "" ""))))] ! 2163: "" ! 2164: "bgt %l0") ! 2165: ! 2166: (define_insn "" ! 2167: [(set (pc) ! 2168: (if_then_else (leu (cc0) ! 2169: (const_int 0)) ! 2170: (pc) ! 2171: (label_ref (match_operand 0 "" ""))))] ! 2172: "" ! 2173: "bhi %l0") ! 2174: ! 2175: ;; Subtract-and-jump and Add-and-jump insns. ! 2176: ;; These can actually be used for adding numbers in the range -8 to 7 ! 2177: ! 2178: (define_insn "" ! 2179: [(set (pc) ! 2180: (if_then_else ! 2181: (ne (match_operand:SI 0 "general_operand" "+g") ! 2182: (match_operand:SI 1 "const_int_operand" "i")) ! 2183: (label_ref (match_operand 2 "" "")) ! 2184: (pc))) ! 2185: (set (match_dup 0) ! 2186: (minus:SI (match_dup 0) ! 2187: (match_dup 1)))] ! 2188: "INTVAL (operands[1]) > -8 && INTVAL (operands[1]) <= 8" ! 2189: "acbd %$%n1,%0,%l2") ! 2190: ! 2191: (define_insn "" ! 2192: [(set (pc) ! 2193: (if_then_else ! 2194: (ne (match_operand:SI 0 "general_operand" "+g") ! 2195: (match_operand:SI 1 "const_int_operand" "i")) ! 2196: (label_ref (match_operand 2 "" "")) ! 2197: (pc))) ! 2198: (set (match_dup 0) ! 2199: (plus:SI (match_dup 0) ! 2200: (match_operand:SI 3 "const_int_operand" "i")))] ! 2201: "INTVAL (operands[1]) == - INTVAL (operands[3]) ! 2202: && INTVAL (operands[3]) >= -8 && INTVAL (operands[3]) < 8" ! 2203: "acbd %3,%0,%l2") ! 2204: ! 2205: (define_insn "call" ! 2206: [(call (match_operand:QI 0 "memory_operand" "m") ! 2207: (match_operand:QI 1 "general_operand" "g"))] ! 2208: "" ! 2209: "* ! 2210: { ! 2211: #ifndef JSR_ALWAYS ! 2212: if (GET_CODE (operands[0]) == MEM) ! 2213: { ! 2214: rtx temp = XEXP (operands[0], 0); ! 2215: if (CONSTANT_ADDRESS_P (temp)) ! 2216: { ! 2217: #ifdef ENCORE_ASM ! 2218: return \"bsr %?%0\"; ! 2219: #else ! 2220: #ifdef CALL_MEMREF_IMPLICIT ! 2221: operands[0] = temp; ! 2222: return \"bsr %0\"; ! 2223: #else ! 2224: #ifdef GNX_V3 ! 2225: return \"bsr %0\"; ! 2226: #else ! 2227: return \"bsr %?%a0\"; ! 2228: #endif ! 2229: #endif ! 2230: #endif ! 2231: } ! 2232: if (GET_CODE (XEXP (operands[0], 0)) == REG) ! 2233: #if defined (GNX_V3) || defined (CALL_MEMREF_IMPLICIT) ! 2234: return \"jsr %0\"; ! 2235: #else ! 2236: return \"jsr %a0\"; ! 2237: #endif ! 2238: } ! 2239: #endif /* not JSR_ALWAYS */ ! 2240: return \"jsr %0\"; ! 2241: }") ! 2242: ! 2243: (define_insn "call_value" ! 2244: [(set (match_operand 0 "" "=rf") ! 2245: (call (match_operand:QI 1 "memory_operand" "m") ! 2246: (match_operand:QI 2 "general_operand" "g")))] ! 2247: "" ! 2248: "* ! 2249: { ! 2250: #ifndef JSR_ALWAYS ! 2251: if (GET_CODE (operands[1]) == MEM) ! 2252: { ! 2253: rtx temp = XEXP (operands[1], 0); ! 2254: if (CONSTANT_ADDRESS_P (temp)) ! 2255: { ! 2256: #ifdef ENCORE_ASM ! 2257: return \"bsr %?%1\"; ! 2258: #else ! 2259: #ifdef CALL_MEMREF_IMPLICIT ! 2260: operands[1] = temp; ! 2261: return \"bsr %1\"; ! 2262: #else ! 2263: #ifdef GNX_V3 ! 2264: return \"bsr %1\"; ! 2265: #else ! 2266: return \"bsr %?%a1\"; ! 2267: #endif ! 2268: #endif ! 2269: #endif ! 2270: } ! 2271: if (GET_CODE (XEXP (operands[1], 0)) == REG) ! 2272: #if defined (GNX_V3) || defined (CALL_MEMREF_IMPLICIT) ! 2273: return \"jsr %1\"; ! 2274: #else ! 2275: return \"jsr %a1\"; ! 2276: #endif ! 2277: } ! 2278: #endif /* not JSR_ALWAYS */ ! 2279: return \"jsr %1\"; ! 2280: }") ! 2281: ! 2282: ;; Call subroutine returning any type. ! 2283: ! 2284: (define_expand "untyped_call" ! 2285: [(parallel [(call (match_operand 0 "" "") ! 2286: (const_int 0)) ! 2287: (match_operand 1 "" "") ! 2288: (match_operand 2 "" "")])] ! 2289: "" ! 2290: " ! 2291: { ! 2292: int i; ! 2293: ! 2294: emit_call_insn (gen_call (operands[0], const0_rtx, NULL, const0_rtx)); ! 2295: ! 2296: for (i = 0; i < XVECLEN (operands[2], 0); i++) ! 2297: { ! 2298: rtx set = XVECEXP (operands[2], 0, i); ! 2299: emit_move_insn (SET_DEST (set), SET_SRC (set)); ! 2300: } ! 2301: ! 2302: /* The optimizer does not know that the call sets the function value ! 2303: registers we stored in the result block. We avoid problems by ! 2304: claiming that all hard registers are used and clobbered at this ! 2305: point. */ ! 2306: emit_insn (gen_blockage ()); ! 2307: ! 2308: DONE; ! 2309: }") ! 2310: ! 2311: ;; UNSPEC_VOLATILE is considered to use and clobber all hard registers and ! 2312: ;; all of memory. This blocks insns from being moved across this point. ! 2313: ! 2314: (define_insn "blockage" ! 2315: [(unspec_volatile [(const_int 0)] 0)] ! 2316: "" ! 2317: "") ! 2318: ! 2319: (define_insn "return" ! 2320: [(return)] ! 2321: "0" ! 2322: "ret 0") ! 2323: ! 2324: (define_insn "abssf2" ! 2325: [(set (match_operand:SF 0 "general_operand" "=fm<") ! 2326: (abs:SF (match_operand:SF 1 "general_operand" "fmF")))] ! 2327: "TARGET_32081" ! 2328: "absf %1,%0") ! 2329: ! 2330: (define_insn "absdf2" ! 2331: [(set (match_operand:DF 0 "general_operand" "=fm<") ! 2332: (abs:DF (match_operand:DF 1 "general_operand" "fmF")))] ! 2333: "TARGET_32081" ! 2334: "absl %1,%0") ! 2335: ! 2336: (define_insn "abssi2" ! 2337: [(set (match_operand:SI 0 "general_operand" "=g<") ! 2338: (abs:SI (match_operand:SI 1 "general_operand" "rmn")))] ! 2339: "" ! 2340: "absd %1,%0") ! 2341: ! 2342: (define_insn "abshi2" ! 2343: [(set (match_operand:HI 0 "general_operand" "=g<") ! 2344: (abs:HI (match_operand:HI 1 "general_operand" "g")))] ! 2345: "" ! 2346: "absw %1,%0") ! 2347: ! 2348: (define_insn "absqi2" ! 2349: [(set (match_operand:QI 0 "general_operand" "=g<") ! 2350: (abs:QI (match_operand:QI 1 "general_operand" "g")))] ! 2351: "" ! 2352: "absb %1,%0") ! 2353: ! 2354: (define_insn "nop" ! 2355: [(const_int 0)] ! 2356: "" ! 2357: "nop") ! 2358: ! 2359: (define_insn "indirect_jump" ! 2360: [(set (pc) (match_operand:SI 0 "register_operand" "r"))] ! 2361: "" ! 2362: "jump %0") ! 2363: ! 2364: (define_insn "tablejump" ! 2365: [(set (pc) ! 2366: (plus:SI (pc) (match_operand:SI 0 "general_operand" "g"))) ! 2367: (use (label_ref (match_operand 1 "" "")))] ! 2368: "" ! 2369: "* ! 2370: { ! 2371: ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, \"LI\", ! 2372: CODE_LABEL_NUMBER (operands[1])); ! 2373: return \"cased %0\"; ! 2374: }") ! 2375: ! 2376: ;; Scondi instructions ! 2377: (define_insn "seq" ! 2378: [(set (match_operand:SI 0 "general_operand" "=g<") ! 2379: (eq:SI (cc0) (const_int 0)))] ! 2380: "" ! 2381: "* ! 2382: { if (cc_prev_status.flags & CC_Z_IN_F) ! 2383: return \"sfcd %0\"; ! 2384: else if (cc_prev_status.flags & CC_Z_IN_NOT_F) ! 2385: return \"sfsd %0\"; ! 2386: else return \"seqd %0\"; ! 2387: }") ! 2388: ! 2389: (define_insn "" ! 2390: [(set (match_operand:HI 0 "general_operand" "=g<") ! 2391: (eq:HI (cc0) (const_int 0)))] ! 2392: "" ! 2393: "* ! 2394: { if (cc_prev_status.flags & CC_Z_IN_F) ! 2395: return \"sfcw %0\"; ! 2396: else if (cc_prev_status.flags & CC_Z_IN_NOT_F) ! 2397: return \"sfsw %0\"; ! 2398: else return \"seqw %0\"; ! 2399: }") ! 2400: ! 2401: (define_insn "" ! 2402: [(set (match_operand:QI 0 "general_operand" "=g<") ! 2403: (eq:QI (cc0) (const_int 0)))] ! 2404: "" ! 2405: "* ! 2406: { if (cc_prev_status.flags & CC_Z_IN_F) ! 2407: return \"sfcb %0\"; ! 2408: else if (cc_prev_status.flags & CC_Z_IN_NOT_F) ! 2409: return \"sfsb %0\"; ! 2410: else return \"seqb %0\"; ! 2411: }") ! 2412: ! 2413: (define_insn "sne" ! 2414: [(set (match_operand:SI 0 "general_operand" "=g<") ! 2415: (ne:SI (cc0) (const_int 0)))] ! 2416: "" ! 2417: "* ! 2418: { if (cc_prev_status.flags & CC_Z_IN_F) ! 2419: return \"sfsd %0\"; ! 2420: else if (cc_prev_status.flags & CC_Z_IN_NOT_F) ! 2421: return \"sfcd %0\"; ! 2422: else return \"sned %0\"; ! 2423: }") ! 2424: ! 2425: (define_insn "" ! 2426: [(set (match_operand:HI 0 "general_operand" "=g<") ! 2427: (ne:HI (cc0) (const_int 0)))] ! 2428: "" ! 2429: "* ! 2430: { if (cc_prev_status.flags & CC_Z_IN_F) ! 2431: return \"sfsw %0\"; ! 2432: else if (cc_prev_status.flags & CC_Z_IN_NOT_F) ! 2433: return \"sfcw %0\"; ! 2434: else return \"snew %0\"; ! 2435: }") ! 2436: ! 2437: (define_insn "" ! 2438: [(set (match_operand:QI 0 "general_operand" "=g<") ! 2439: (ne:QI (cc0) (const_int 0)))] ! 2440: "" ! 2441: "* ! 2442: { if (cc_prev_status.flags & CC_Z_IN_F) ! 2443: return \"sfsb %0\"; ! 2444: else if (cc_prev_status.flags & CC_Z_IN_NOT_F) ! 2445: return \"sfcb %0\"; ! 2446: else return \"sneb %0\"; ! 2447: }") ! 2448: ! 2449: (define_insn "sgt" ! 2450: [(set (match_operand:SI 0 "general_operand" "=g<") ! 2451: (gt:SI (cc0) (const_int 0)))] ! 2452: "" ! 2453: "sgtd %0") ! 2454: ! 2455: (define_insn "" ! 2456: [(set (match_operand:HI 0 "general_operand" "=g<") ! 2457: (gt:HI (cc0) (const_int 0)))] ! 2458: "" ! 2459: "sgtw %0") ! 2460: ! 2461: (define_insn "" ! 2462: [(set (match_operand:QI 0 "general_operand" "=g<") ! 2463: (gt:QI (cc0) (const_int 0)))] ! 2464: "" ! 2465: "sgtb %0") ! 2466: ! 2467: (define_insn "sgtu" ! 2468: [(set (match_operand:SI 0 "general_operand" "=g<") ! 2469: (gtu:SI (cc0) (const_int 0)))] ! 2470: "" ! 2471: "shid %0") ! 2472: ! 2473: (define_insn "" ! 2474: [(set (match_operand:HI 0 "general_operand" "=g<") ! 2475: (gtu:HI (cc0) (const_int 0)))] ! 2476: "" ! 2477: "shiw %0") ! 2478: ! 2479: (define_insn "" ! 2480: [(set (match_operand:QI 0 "general_operand" "=g<") ! 2481: (gtu:QI (cc0) (const_int 0)))] ! 2482: "" ! 2483: "shib %0") ! 2484: ! 2485: (define_insn "slt" ! 2486: [(set (match_operand:SI 0 "general_operand" "=g<") ! 2487: (lt:SI (cc0) (const_int 0)))] ! 2488: "" ! 2489: "sltd %0") ! 2490: ! 2491: (define_insn "" ! 2492: [(set (match_operand:HI 0 "general_operand" "=g<") ! 2493: (lt:HI (cc0) (const_int 0)))] ! 2494: "" ! 2495: "sltw %0") ! 2496: ! 2497: (define_insn "" ! 2498: [(set (match_operand:QI 0 "general_operand" "=g<") ! 2499: (lt:QI (cc0) (const_int 0)))] ! 2500: "" ! 2501: "sltb %0") ! 2502: ! 2503: (define_insn "sltu" ! 2504: [(set (match_operand:SI 0 "general_operand" "=g<") ! 2505: (ltu:SI (cc0) (const_int 0)))] ! 2506: "" ! 2507: "slod %0") ! 2508: ! 2509: (define_insn "" ! 2510: [(set (match_operand:HI 0 "general_operand" "=g<") ! 2511: (ltu:HI (cc0) (const_int 0)))] ! 2512: "" ! 2513: "slow %0") ! 2514: ! 2515: (define_insn "" ! 2516: [(set (match_operand:QI 0 "general_operand" "=g<") ! 2517: (ltu:QI (cc0) (const_int 0)))] ! 2518: "" ! 2519: "slob %0") ! 2520: ! 2521: (define_insn "sge" ! 2522: [(set (match_operand:SI 0 "general_operand" "=g<") ! 2523: (ge:SI (cc0) (const_int 0)))] ! 2524: "" ! 2525: "sged %0") ! 2526: ! 2527: (define_insn "" ! 2528: [(set (match_operand:HI 0 "general_operand" "=g<") ! 2529: (ge:HI (cc0) (const_int 0)))] ! 2530: "" ! 2531: "sgew %0") ! 2532: ! 2533: (define_insn "" ! 2534: [(set (match_operand:QI 0 "general_operand" "=g<") ! 2535: (ge:QI (cc0) (const_int 0)))] ! 2536: "" ! 2537: "sgeb %0") ! 2538: ! 2539: (define_insn "sgeu" ! 2540: [(set (match_operand:SI 0 "general_operand" "=g<") ! 2541: (geu:SI (cc0) (const_int 0)))] ! 2542: "" ! 2543: "shsd %0") ! 2544: ! 2545: (define_insn "" ! 2546: [(set (match_operand:HI 0 "general_operand" "=g<") ! 2547: (geu:HI (cc0) (const_int 0)))] ! 2548: "" ! 2549: "shsw %0") ! 2550: ! 2551: (define_insn "" ! 2552: [(set (match_operand:QI 0 "general_operand" "=g<") ! 2553: (geu:QI (cc0) (const_int 0)))] ! 2554: "" ! 2555: "shsb %0") ! 2556: ! 2557: (define_insn "sle" ! 2558: [(set (match_operand:SI 0 "general_operand" "=g<") ! 2559: (le:SI (cc0) (const_int 0)))] ! 2560: "" ! 2561: "sled %0") ! 2562: ! 2563: (define_insn "" ! 2564: [(set (match_operand:HI 0 "general_operand" "=g<") ! 2565: (le:HI (cc0) (const_int 0)))] ! 2566: "" ! 2567: "slew %0") ! 2568: ! 2569: (define_insn "" ! 2570: [(set (match_operand:QI 0 "general_operand" "=g<") ! 2571: (le:QI (cc0) (const_int 0)))] ! 2572: "" ! 2573: "sleb %0") ! 2574: ! 2575: (define_insn "sleu" ! 2576: [(set (match_operand:SI 0 "general_operand" "=g<") ! 2577: (leu:SI (cc0) (const_int 0)))] ! 2578: "" ! 2579: "slsd %0") ! 2580: ! 2581: (define_insn "" ! 2582: [(set (match_operand:HI 0 "general_operand" "=g<") ! 2583: (leu:HI (cc0) (const_int 0)))] ! 2584: "" ! 2585: "slsw %0") ! 2586: ! 2587: (define_insn "" ! 2588: [(set (match_operand:QI 0 "general_operand" "=g<") ! 2589: (leu:QI (cc0) (const_int 0)))] ! 2590: "" ! 2591: "slsb %0") ! 2592: ! 2593: ;; Speed up stack adjust followed by a fullword fixedpoint push. ! 2594: ! 2595: (define_peephole ! 2596: [(set (reg:SI 17) (plus:SI (reg:SI 17) (const_int 4))) ! 2597: (set (match_operand:SI 0 "push_operand" "=m") ! 2598: (match_operand:SI 1 "general_operand" "g"))] ! 2599: "! reg_mentioned_p (stack_pointer_rtx, operands[1])" ! 2600: "* ! 2601: { ! 2602: return \"movd %1,0(sp)\"; ! 2603: }") ! 2604: ! 2605: ;; Speed up stack adjust followed by two fullword fixedpoint pushes. ! 2606: ! 2607: (define_peephole ! 2608: [(set (reg:SI 17) (plus:SI (reg:SI 17) (const_int 8))) ! 2609: (set (match_operand:SI 0 "push_operand" "=m") ! 2610: (match_operand:SI 1 "general_operand" "g")) ! 2611: (set (match_operand:SI 2 "push_operand" "=m") ! 2612: (match_operand:SI 3 "general_operand" "g"))] ! 2613: "! reg_mentioned_p (stack_pointer_rtx, operands[1]) ! 2614: && ! reg_mentioned_p (stack_pointer_rtx, operands[3])" ! 2615: "* ! 2616: { ! 2617: return \"movd %1,4(sp); movd %3,0(sp)\"; ! 2618: }") ! 2619:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.