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