|
|
1.1 ! root 1: ;;- Machine description for IBM RISC System 6000 (POWER) for GNU C compiler ! 2: ;; Copyright (C) 1990, 1991 Free Software Foundation, Inc. ! 3: ;; Contributed by Richard Kenner ([email protected]) ! 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: ;;- See file "rtl.def" for documentation on define_insn, match_*, et. al. ! 22: ! 23: ;; Define an insn type attribute. This is used in function unit delay ! 24: ;; computations. ! 25: (define_attr "type" "load,integer,fp,compare,delayed_compare,fpcompare" ! 26: (const_string "integer")) ! 27: ! 28: ;; Memory delivers its result in two cycles. ! 29: (define_function_unit "memory" 1 0 (eq_attr "type" "load") 2 0) ! 30: ! 31: ;; We consider floating-point insns to deliver their result in two cycles ! 32: ;; to try to intersperse integer and FP operations. ! 33: (define_function_unit "fp" 1 0 (eq_attr "type" "fp,fpcompare") 2 0) ! 34: ! 35: ;; Most integer comparisons are ready in four cycles (a stall of three). ! 36: (define_function_unit "compare" 1 0 (eq_attr "type" "compare") 4 0) ! 37: ! 38: ;; Some integer comparisons aren't ready for five cycles (a stall of four). ! 39: (define_function_unit "compare" 1 0 (eq_attr "type" "delayed_compare") 5 0) ! 40: ! 41: ;; Floating-point comparisons take eight cycles. ! 42: (define_function_unit "compare" 1 0 (eq_attr "type" "fpcompare") 8 0) ! 43: ! 44: ;; Start with fixed-point load and store insns. Here we put only the more ! 45: ;; complex forms. Basic data transfer is done later. ! 46: ! 47: (define_expand "zero_extendqisi2" ! 48: [(set (match_operand:SI 0 "gen_reg_operand" "") ! 49: (zero_extend:SI (match_operand:QI 1 "gen_reg_operand" "")))] ! 50: "" ! 51: "") ! 52: ! 53: (define_insn "" ! 54: [(set (match_operand:SI 0 "gen_reg_operand" "=r,r") ! 55: (zero_extend:SI (match_operand:QI 1 "reg_or_mem_operand" "m,r")))] ! 56: "" ! 57: "@ ! 58: lbz%U1%X1 %0,%1 ! 59: rlinm %0,%1,0,24,31" ! 60: [(set_attr "type" "load,*")]) ! 61: ! 62: (define_insn "" ! 63: [(set (match_operand:CC 0 "cc_reg_operand" "=x") ! 64: (compare:CC (zero_extend:SI (match_operand:QI 1 "gen_reg_operand" "r")) ! 65: (const_int 0))) ! 66: (clobber (match_scratch:SI 2 "=r"))] ! 67: "" ! 68: "andil. %2,%1,255" ! 69: [(set_attr "type" "compare")]) ! 70: ! 71: (define_insn "" ! 72: [(set (match_operand:CC 2 "cc_reg_operand" "=x") ! 73: (compare:CC (zero_extend:SI (match_operand:QI 1 "gen_reg_operand" "r")) ! 74: (const_int 0))) ! 75: (set (match_operand:SI 0 "gen_reg_operand" "=r") ! 76: (zero_extend:SI (match_dup 1)))] ! 77: "" ! 78: "andil. %0,%1,255" ! 79: [(set_attr "type" "compare")]) ! 80: ! 81: (define_expand "zero_extendqihi2" ! 82: [(set (match_operand:HI 0 "gen_reg_operand" "") ! 83: (zero_extend:HI (match_operand:QI 1 "gen_reg_operand" "")))] ! 84: "" ! 85: "") ! 86: ! 87: (define_insn "" ! 88: [(set (match_operand:HI 0 "gen_reg_operand" "=r,r") ! 89: (zero_extend:HI (match_operand:QI 1 "reg_or_mem_operand" "m,r")))] ! 90: "" ! 91: "@ ! 92: lbz%U1%X1 %0,%1 ! 93: rlinm %0,%1,0,24,31" ! 94: [(set_attr "type" "load,*")]) ! 95: ! 96: (define_expand "zero_extendhisi2" ! 97: [(set (match_operand:SI 0 "gen_reg_operand" "r") ! 98: (zero_extend:SI (match_operand:HI 1 "gen_reg_operand" "")))] ! 99: "" ! 100: "") ! 101: ! 102: (define_insn "" ! 103: [(set (match_operand:SI 0 "gen_reg_operand" "=r,r") ! 104: (zero_extend:SI (match_operand:HI 1 "reg_or_mem_operand" "m,r")))] ! 105: "" ! 106: "@ ! 107: lhz%U1%X1 %0,%1 ! 108: rlinm %0,%1,0,16,31" ! 109: [(set_attr "type" "load,*")]) ! 110: ! 111: (define_insn "" ! 112: [(set (match_operand:CC 0 "cc_reg_operand" "=x") ! 113: (compare:CC (zero_extend:SI (match_operand:HI 1 "gen_reg_operand" "r")) ! 114: (const_int 0))) ! 115: (clobber (match_scratch:SI 2 "=r"))] ! 116: "" ! 117: "andil. %2,%1,65535" ! 118: [(set_attr "type" "compare")]) ! 119: ! 120: (define_insn "" ! 121: [(set (match_operand:CC 2 "cc_reg_operand" "=x") ! 122: (compare:CC (zero_extend:SI (match_operand:HI 1 "gen_reg_operand" "r")) ! 123: (const_int 0))) ! 124: (set (match_operand:SI 0 "gen_reg_operand" "=r") ! 125: (zero_extend:SI (match_dup 1)))] ! 126: "" ! 127: "andil. %0,%1,65535" ! 128: [(set_attr "type" "compare")]) ! 129: ! 130: (define_expand "extendhisi2" ! 131: [(set (match_operand:SI 0 "gen_reg_operand" "") ! 132: (sign_extend:SI (match_operand:HI 1 "gen_reg_operand" "")))] ! 133: "" ! 134: "") ! 135: ! 136: (define_insn "" ! 137: [(set (match_operand:SI 0 "gen_reg_operand" "=r,r") ! 138: (sign_extend:SI (match_operand:HI 1 "reg_or_mem_operand" "m,r")))] ! 139: "" ! 140: "@ ! 141: lha%U1%X1 %0,%1 ! 142: exts %0,%1" ! 143: [(set_attr "type" "load,*")]) ! 144: ! 145: (define_insn "" ! 146: [(set (match_operand:CC 0 "cc_reg_operand" "=x") ! 147: (compare:CC (sign_extend:SI (match_operand:HI 1 "gen_reg_operand" "r")) ! 148: (const_int 0))) ! 149: (clobber (match_scratch:SI 2 "=r"))] ! 150: "" ! 151: "exts. %2,%1" ! 152: [(set_attr "type" "compare")]) ! 153: ! 154: (define_insn "" ! 155: [(set (match_operand:CC 2 "cc_reg_operand" "=x") ! 156: (compare:CC (sign_extend:SI (match_operand:HI 1 "gen_reg_operand" "r")) ! 157: (const_int 0))) ! 158: (set (match_operand:SI 0 "gen_reg_operand" "=r") ! 159: (sign_extend:SI (match_dup 1)))] ! 160: "" ! 161: "exts. %0,%1" ! 162: [(set_attr "type" "compare")]) ! 163: ! 164: ;; Fixed-point arithmetic insns. ! 165: (define_insn "" ! 166: [(set (match_operand:SI 0 "gen_reg_operand" "=r,r") ! 167: (plus:SI (match_operand:SI 1 "gen_reg_operand" "%r,b") ! 168: (match_operand:SI 2 "add_operand" "rI,J")))] ! 169: "" ! 170: "@ ! 171: a%I2 %0,%1,%2 ! 172: cau %0,%1,%u2") ! 173: ! 174: (define_insn "" ! 175: [(set (match_operand:CC 0 "cc_reg_operand" "=x") ! 176: (compare:CC (plus:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 177: (match_operand:SI 2 "reg_or_short_operand" "rI")) ! 178: (const_int 0))) ! 179: (clobber (match_scratch:SI 3 "=r"))] ! 180: "" ! 181: "a%I2. %3,%1,%2" ! 182: [(set_attr "type" "compare")]) ! 183: ! 184: (define_insn "" ! 185: [(set (match_operand:CC 3 "cc_reg_operand" "=x") ! 186: (compare:CC (plus:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 187: (match_operand:SI 2 "reg_or_short_operand" "rI")) ! 188: (const_int 0))) ! 189: (set (match_operand:SI 0 "gen_reg_operand" "=r") ! 190: (plus:SI (match_dup 1) (match_dup 2)))] ! 191: "" ! 192: "a%I2. %0,%1,%2" ! 193: [(set_attr "type" "compare")]) ! 194: ! 195: (define_expand "addsi3" ! 196: [(set (match_operand:SI 0 "gen_reg_operand" "") ! 197: (plus:SI (match_operand:SI 1 "gen_reg_operand" "") ! 198: (match_operand:SI 2 "reg_or_cint_operand" "")))] ! 199: "" ! 200: " ! 201: { ! 202: if (GET_CODE (operands[2]) == CONST_INT ! 203: && (unsigned) (INTVAL (operands[2]) + 0x8000) >= 0x10000 ! 204: && (INTVAL (operands[2]) & 0xffff) != 0) ! 205: { ! 206: int low = INTVAL (operands[2]) & 0xffff; ! 207: int high = (unsigned) INTVAL (operands[2]) >> 16; ! 208: ! 209: if (low & 0x8000) ! 210: high++, low |= 0xffff0000; ! 211: ! 212: emit_insn (gen_addsi3 (operands[0], operands[1], ! 213: gen_rtx (CONST_INT, VOIDmode, high << 16))); ! 214: operands[1] = operands[0]; ! 215: operands[2] = gen_rtx (CONST_INT, VOIDmode, low); ! 216: } ! 217: }") ! 218: ! 219: (define_insn "one_cmplsi2" ! 220: [(set (match_operand:SI 0 "gen_reg_operand" "=r") ! 221: (not:SI (match_operand:SI 1 "gen_reg_operand" "r")))] ! 222: "" ! 223: "sfi %0,%1,-1") ! 224: ! 225: (define_insn "" ! 226: [(set (match_operand:SI 0 "gen_reg_operand" "=r,r") ! 227: (minus:SI (match_operand:SI 1 "reg_or_short_operand" "r,I") ! 228: (match_operand:SI 2 "gen_reg_operand" "r,r")))] ! 229: "" ! 230: "@ ! 231: sf %0,%2,%1 ! 232: sfi %0,%2,%1") ! 233: ! 234: (define_insn "" ! 235: [(set (match_operand:CC 0 "cc_reg_operand" "=x") ! 236: (compare:CC (minus:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 237: (match_operand:SI 2 "gen_reg_operand" "r")) ! 238: (const_int 0))) ! 239: (clobber (match_scratch:SI 3 "=r"))] ! 240: "" ! 241: "sf. %3,%2,%1" ! 242: [(set_attr "type" "compare")]) ! 243: ! 244: (define_insn "" ! 245: [(set (match_operand:CC 3 "cc_reg_operand" "=x") ! 246: (compare:CC (minus:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 247: (match_operand:SI 2 "gen_reg_operand" "r")) ! 248: (const_int 0))) ! 249: (set (match_operand:SI 0 "gen_reg_operand" "=r") ! 250: (minus:SI (match_dup 1) (match_dup 2)))] ! 251: "" ! 252: "sf. %0,%2,%1" ! 253: [(set_attr "type" "compare")]) ! 254: ! 255: (define_expand "subsi3" ! 256: [(set (match_operand:SI 0 "gen_reg_operand" "") ! 257: (minus:SI (match_operand:SI 1 "reg_or_short_operand" "") ! 258: (match_operand:SI 2 "reg_or_cint_operand" "")))] ! 259: "" ! 260: " ! 261: { ! 262: if (GET_CODE (operands[2]) == CONST_INT) ! 263: { ! 264: emit_insn (gen_addsi3 (operands[0], operands[1], ! 265: negate_rtx (SImode, operands[2]))); ! 266: DONE; ! 267: } ! 268: else ! 269: operands[2] = force_reg (SImode, operands[2]); ! 270: }") ! 271: ! 272: ;; For SMIN, SMAX, UMIN, and UMAX, we use DEFINE_EXPAND's that involve a doz[i] ! 273: ;; instruction and some auxiliary computations. Then we just have a single ! 274: ;; DEFINE_INSN for doz[i]. ! 275: ! 276: (define_expand "sminsi3" ! 277: [(set (match_dup 3) ! 278: (if_then_else:SI (gt:SI (match_operand:SI 1 "gen_reg_operand" "") ! 279: (match_operand:SI 2 "reg_or_short_operand" "")) ! 280: (const_int 0) ! 281: (minus:SI (match_dup 2) (match_dup 1)))) ! 282: (set (match_operand:SI 0 "gen_reg_operand" "") ! 283: (minus:SI (match_dup 2) (match_dup 3)))] ! 284: "" ! 285: " ! 286: { operands[3] = gen_reg_rtx (SImode); }") ! 287: ! 288: (define_expand "smaxsi3" ! 289: [(set (match_dup 3) ! 290: (if_then_else:SI (gt:SI (match_operand:SI 1 "gen_reg_operand" "") ! 291: (match_operand:SI 2 "reg_or_short_operand" "")) ! 292: (const_int 0) ! 293: (minus:SI (match_dup 2) (match_dup 1)))) ! 294: (set (match_operand:SI 0 "gen_reg_operand" "") ! 295: (plus:SI (match_dup 3) (match_dup 1)))] ! 296: "" ! 297: " ! 298: { operands[3] = gen_reg_rtx (SImode); }") ! 299: ! 300: (define_expand "uminsi3" ! 301: [(set (match_dup 3) (xor:SI (match_operand:SI 1 "gen_reg_operand" "") ! 302: (const_int -2147483648))) ! 303: (set (match_dup 4) (xor:SI (match_operand:SI 2 "gen_reg_operand" "") ! 304: (const_int -2147483648))) ! 305: (set (match_dup 3) (if_then_else:SI (gt (match_dup 3) (match_dup 4)) ! 306: (const_int 0) ! 307: (minus:SI (match_dup 4) (match_dup 3)))) ! 308: (set (match_operand:SI 0 "gen_reg_operand" "") ! 309: (minus:SI (match_dup 2) (match_dup 3)))] ! 310: "" ! 311: " ! 312: { operands[3] = gen_reg_rtx (SImode); operands[4] = gen_reg_rtx (SImode); }") ! 313: ! 314: (define_expand "umaxsi3" ! 315: [(set (match_dup 3) (xor:SI (match_operand:SI 1 "gen_reg_operand" "") ! 316: (const_int -2147483648))) ! 317: (set (match_dup 4) (xor:SI (match_operand:SI 2 "gen_reg_operand" "") ! 318: (const_int -2147483648))) ! 319: (set (match_dup 3) (if_then_else:SI (gt (match_dup 3) (match_dup 4)) ! 320: (const_int 0) ! 321: (minus:SI (match_dup 4) (match_dup 3)))) ! 322: (set (match_operand:SI 0 "gen_reg_operand" "") ! 323: (plus:SI (match_dup 3) (match_dup 1)))] ! 324: "" ! 325: " ! 326: { operands[3] = gen_reg_rtx (SImode); operands[4] = gen_reg_rtx (SImode); }") ! 327: ! 328: (define_insn "" ! 329: [(set (match_operand:SI 0 "gen_reg_operand" "=r") ! 330: (if_then_else:SI (gt (match_operand:SI 1 "gen_reg_operand" "r") ! 331: (match_operand:SI 2 "reg_or_short_operand" "r")) ! 332: (const_int 0) ! 333: (minus:SI (match_dup 2) (match_dup 1))))] ! 334: "" ! 335: "doz%I2 %0,%1,%2") ! 336: ! 337: (define_insn "" ! 338: [(set (match_operand:CC 0 "cc_reg_operand" "=x") ! 339: (compare:CC ! 340: (if_then_else:SI (gt (match_operand:SI 1 "gen_reg_operand" "r") ! 341: (match_operand:SI 2 "reg_or_short_operand" "r")) ! 342: (const_int 0) ! 343: (minus:SI (match_dup 2) (match_dup 1))) ! 344: (const_int 0))) ! 345: (clobber (match_scratch:SI 3 "=r"))] ! 346: "" ! 347: "doz%I2. %3,%1,%2" ! 348: [(set_attr "type" "delayed_compare")]) ! 349: ! 350: (define_insn "" ! 351: [(set (match_operand:CC 3 "cc_reg_operand" "=x") ! 352: (compare:CC ! 353: (if_then_else:SI (gt (match_operand:SI 1 "gen_reg_operand" "r") ! 354: (match_operand:SI 2 "reg_or_short_operand" "r")) ! 355: (const_int 0) ! 356: (minus:SI (match_dup 2) (match_dup 1))) ! 357: (const_int 0))) ! 358: (set (match_operand:SI 0 "gen_reg_operand" "=r") ! 359: (if_then_else:SI (gt (match_dup 1) (match_dup 2)) ! 360: (const_int 0) ! 361: (minus:SI (match_dup 2) (match_dup 1))))] ! 362: "" ! 363: "doz%I2. %0,%1,%2" ! 364: [(set_attr "type" "delayed_compare")]) ! 365: ! 366: ;; We don't need abs with condition code because such comparisons should ! 367: ;; never be done. ! 368: (define_insn "abssi2" ! 369: [(set (match_operand:SI 0 "gen_reg_operand" "=r") ! 370: (abs:SI (match_operand:SI 1 "gen_reg_operand" "r")))] ! 371: "" ! 372: "abs %0,%1") ! 373: ! 374: (define_insn "" ! 375: [(set (match_operand:SI 0 "gen_reg_operand" "=r") ! 376: (neg:SI (abs:SI (match_operand:SI 1 "gen_reg_operand" "r"))))] ! 377: "" ! 378: "nabs %0,%1") ! 379: ! 380: (define_insn "negsi2" ! 381: [(set (match_operand:SI 0 "gen_reg_operand" "=r") ! 382: (neg:SI (match_operand:SI 1 "gen_reg_operand" "r")))] ! 383: "" ! 384: "neg %0,%1") ! 385: ! 386: (define_insn "" ! 387: [(set (match_operand:CC 0 "cc_reg_operand" "=x") ! 388: (compare:CC (neg:SI (match_operand:SI 1 "gen_reg_operand" "r")) ! 389: (const_int 0))) ! 390: (clobber (match_scratch:SI 2 "=r"))] ! 391: "" ! 392: "neg. %2,%1" ! 393: [(set_attr "type" "compare")]) ! 394: ! 395: (define_insn "" ! 396: [(set (match_operand:CC 2 "cc_reg_operand" "=x") ! 397: (compare:CC (neg:SI (match_operand:SI 1 "gen_reg_operand" "r")) ! 398: (const_int 0))) ! 399: (set (match_operand:SI 0 "gen_reg_operand" "=r") ! 400: (neg:SI (match_dup 1)))] ! 401: "" ! 402: "neg. %0,%1" ! 403: [(set_attr "type" "compare")]) ! 404: ! 405: (define_insn "ffssi2" ! 406: [(set (match_operand:SI 0 "register_operand" "=&r") ! 407: (ffs:SI (match_operand:SI 1 "register_operand" "r")))] ! 408: "" ! 409: "neg %0,%1\;and %0,%0,%1\;cntlz %0,%0\;sfi %0,%0,32") ! 410: ! 411: ;; There is no need for (set (condition) (compare (ffs) 0)) because that ! 412: ;; can be simplified to an ordinary comparison. A parallel set and compare ! 413: ;; might be used, so include it. ! 414: ! 415: (define_insn "" ! 416: [(set (match_operand:CC 2 "cc_reg_operand" "=x") ! 417: (compare:CC (ffs:SI (match_operand:SI 1 "register_operand" "r")) ! 418: (const_int 0))) ! 419: (set (match_operand:SI 0 "register_operand" "=&r") ! 420: (ffs:SI (match_dup 1)))] ! 421: "" ! 422: "neg %0,%1\;and %0,%0,%1\;cntlz %0,%0\;sfi. %0,%0,32" ! 423: [(set_attr "type" "compare")]) ! 424: ! 425: (define_insn "mulsi3" ! 426: [(set (match_operand:SI 0 "gen_reg_operand" "=r,r") ! 427: (mult:SI (match_operand:SI 1 "gen_reg_operand" "%r,r") ! 428: (match_operand:SI 2 "reg_or_short_operand" "r,I"))) ! 429: (clobber (match_scratch:SI 3 "=q,q"))] ! 430: "" ! 431: "@ ! 432: muls %0,%1,%2 ! 433: muli %0,%1,%2") ! 434: ! 435: (define_insn "" ! 436: [(set (match_operand:CC 0 "cc_reg_operand" "=x") ! 437: (compare:CC (mult:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 438: (match_operand:SI 2 "gen_reg_operand" "r")) ! 439: (const_int 0))) ! 440: (clobber (match_scratch:SI 3 "=r")) ! 441: (clobber (match_scratch:SI 4 "=q"))] ! 442: "" ! 443: "muls. %3,%1,%2" ! 444: [(set_attr "type" "delayed_compare")]) ! 445: ! 446: (define_insn "" ! 447: [(set (match_operand:CC 3 "cc_reg_operand" "=x") ! 448: (compare:CC (mult:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 449: (match_operand:SI 2 "gen_reg_operand" "r")) ! 450: (const_int 0))) ! 451: (set (match_operand:SI 0 "gen_reg_operand" "=r") ! 452: (mult:SI (match_dup 1) (match_dup 2))) ! 453: (clobber (match_scratch:SI 4 "=q"))] ! 454: "" ! 455: "muls. %0,%1,%2" ! 456: [(set_attr "type" "delayed_compare")]) ! 457: ! 458: ;; Operand 1 is divided by operand 2; quotient goes to operand ! 459: ;; 0 and remainder to operand 3. ! 460: ;; ??? At some point, see what, if anything, we can do about if (x % y == 0). ! 461: ! 462: (define_insn "divmodsi4" ! 463: [(set (match_operand:SI 0 "gen_reg_operand" "=r") ! 464: (div:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 465: (match_operand:SI 2 "gen_reg_operand" "r"))) ! 466: (set (match_operand:SI 3 "gen_reg_operand" "=q") ! 467: (mod:SI (match_dup 1) (match_dup 2)))] ! 468: "" ! 469: "divs %0,%1,%2") ! 470: ! 471: ;; For powers of two we can do srai/aze for divide and then adjust for ! 472: ;; modulus. If it isn't a power of two, FAIL so divmodsi4 will be used. ! 473: (define_expand "divsi3" ! 474: [(set (match_operand:SI 0 "gen_reg_operand" "") ! 475: (div:SI (match_operand:SI 1 "gen_reg_operand" "") ! 476: (match_operand:SI 2 "reg_or_cint_operand" "")))] ! 477: "" ! 478: " ! 479: { ! 480: if (GET_CODE (operands[2]) != CONST_INT ! 481: || exact_log2 (INTVAL (operands[2])) < 0) ! 482: FAIL; ! 483: }") ! 484: ! 485: (define_expand "modsi3" ! 486: [(set (match_dup 3) ! 487: (div:SI (match_operand:SI 1 "gen_reg_operand" "") ! 488: (match_operand:SI 2 "reg_or_cint_operand" ""))) ! 489: (parallel [(set (match_dup 4) (ashift:SI (match_dup 3) (match_dup 5))) ! 490: (clobber (scratch:SI))]) ! 491: (set (match_operand:SI 0 "gen_reg_operand" "") ! 492: (minus:SI (match_dup 1) (match_dup 4)))] ! 493: "" ! 494: " ! 495: { ! 496: int i = exact_log2 (INTVAL (operands[2])); ! 497: ! 498: if (GET_CODE (operands[2]) != CONST_INT || i < 0) ! 499: FAIL; ! 500: ! 501: operands[3] = gen_reg_rtx (SImode); ! 502: operands[4] = gen_reg_rtx (SImode); ! 503: operands[5] = gen_rtx (CONST_INT, VOIDmode, i); ! 504: }") ! 505: ! 506: (define_insn "" ! 507: [(set (match_operand:SI 0 "gen_reg_operand" "=r") ! 508: (div:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 509: (match_operand:SI 2 "const_int_operand" "N")))] ! 510: "exact_log2 (INTVAL (operands[2])) >= 0" ! 511: "srai %0,%1,%p2\;aze %0,%0") ! 512: ! 513: (define_insn "" ! 514: [(set (match_operand:CC 0 "cc_reg_operand" "=x") ! 515: (div:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 516: (match_operand:SI 2 "const_int_operand" "N"))) ! 517: (clobber (match_scratch:SI 3 "=r"))] ! 518: "exact_log2 (INTVAL (operands[2])) >= 0" ! 519: "srai %3,%1,%p2\;aze. %3,%3" ! 520: [(set_attr "type" "compare")]) ! 521: ! 522: (define_insn "" ! 523: [(set (match_operand:CC 3 "cc_reg_operand" "=x") ! 524: (div:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 525: (match_operand:SI 2 "const_int_operand" "N"))) ! 526: (set (match_operand:SI 0 "gen_reg_operand" "=r") ! 527: (div:SI (match_dup 1) (match_dup 2)))] ! 528: "exact_log2 (INTVAL (operands[2])) >= 0" ! 529: "srai %0,%1,%p2\;aze. %0,%0" ! 530: [(set_attr "type" "compare")]) ! 531: ! 532: (define_insn "" ! 533: [(set (match_operand:SI 0 "gen_reg_operand" "=r") ! 534: (udiv:SI ! 535: (plus:DI (lshift:DI ! 536: (zero_extend:DI (match_operand:SI 1 "gen_reg_operand" "r")) ! 537: (const_int 32)) ! 538: (zero_extend:DI (match_operand:SI 2 "register_operand" "*q"))) ! 539: (match_operand:SI 3 "gen_reg_operand" "r"))) ! 540: (set (match_operand:SI 4 "register_operand" "=*q") ! 541: (umod:SI ! 542: (plus:DI (lshift:DI ! 543: (zero_extend:DI (match_dup 1)) (const_int 32)) ! 544: (zero_extend:DI (match_dup 2))) ! 545: (match_dup 3)))] ! 546: ! 547: "" ! 548: "div %0,%1,%3") ! 549: ! 550: ;; To do unsigned divide we handle the cases of the divisor looking like a ! 551: ;; negative number. If it is a constant that is less than 2**31, we don't ! 552: ;; have to worry about the branches. So make a few subroutines here. ! 553: ;; ! 554: ;; First comes the normal case. ! 555: (define_expand "udivmodsi4_normal" ! 556: [(set (match_dup 4) (const_int 0)) ! 557: (parallel [(set (match_operand:SI 0 "" "") ! 558: (udiv:SI (plus:DI (lshift:DI (zero_extend:DI (match_dup 4)) ! 559: (const_int 32)) ! 560: (zero_extend:DI (match_operand:SI 1 "" ""))) ! 561: (match_operand:SI 2 "" ""))) ! 562: (set (match_operand:SI 3 "" "") ! 563: (umod:SI (plus:DI (lshift:DI (zero_extend:DI (match_dup 4)) ! 564: (const_int 32)) ! 565: (zero_extend:DI (match_dup 1))) ! 566: (match_dup 2)))])] ! 567: "" ! 568: " ! 569: { operands[4] = gen_reg_rtx (SImode); }") ! 570: ! 571: ;; This handles the branches. ! 572: (define_expand "udivmodsi4_tests" ! 573: [(set (match_operand:SI 0 "" "") (const_int 0)) ! 574: (set (match_operand:SI 3 "" "") (match_operand:SI 1 "" "")) ! 575: (set (match_dup 5) (compare:CCUNS (match_dup 1) (match_operand:SI 2 "" ""))) ! 576: (set (pc) (if_then_else (ltu (match_dup 5) (const_int 0)) ! 577: (label_ref (match_operand:SI 4 "" "")) (pc))) ! 578: (set (match_dup 0) (const_int 1)) ! 579: (set (match_dup 3) (minus:SI (match_dup 1) (match_dup 2))) ! 580: (set (match_dup 6) (compare:CC (match_dup 2) (const_int 0))) ! 581: (set (pc) (if_then_else (lt (match_dup 6) (const_int 0)) ! 582: (label_ref (match_dup 4)) (pc)))] ! 583: "" ! 584: " ! 585: { operands[5] = gen_reg_rtx (CCUNSmode); ! 586: operands[6] = gen_reg_rtx (CCmode); ! 587: }") ! 588: ! 589: (define_expand "udivmodsi4" ! 590: [(parallel [(set (match_operand:SI 0 "gen_reg_operand" "") ! 591: (udiv:SI (match_operand:SI 1 "gen_reg_operand" "") ! 592: (match_operand:SI 2 "reg_or_cint_operand" ""))) ! 593: (set (match_operand:SI 3 "gen_reg_operand" "") ! 594: (umod:SI (match_dup 1) (match_dup 2)))])] ! 595: "" ! 596: " ! 597: { ! 598: rtx label = 0; ! 599: ! 600: if (GET_CODE (operands[2]) != CONST_INT || INTVAL (operands[2]) < 0) ! 601: { ! 602: operands[2] = force_reg (SImode, operands[2]); ! 603: label = gen_label_rtx (); ! 604: emit (gen_udivmodsi4_tests (operands[0], operands[1], operands[2], ! 605: operands[3], label)); ! 606: } ! 607: else ! 608: operands[2] = force_reg (SImode, operands[2]); ! 609: ! 610: emit (gen_udivmodsi4_normal (operands[0], operands[1], operands[2], ! 611: operands[3])); ! 612: if (label) ! 613: emit_label (label); ! 614: ! 615: DONE; ! 616: }") ! 617: ! 618: (define_insn "andsi3" ! 619: [(set (match_operand:SI 0 "gen_reg_operand" "=r,r,r,r") ! 620: (and:SI (match_operand:SI 1 "gen_reg_operand" "%r,r,r,r") ! 621: (match_operand:SI 2 "and_operand" "?r,L,K,J"))) ! 622: (clobber (match_scratch:CC 3 "=X,X,x,x"))] ! 623: "" ! 624: "@ ! 625: and %0,%1,%2 ! 626: rlinm %0,%1,0,%m2,%M2 ! 627: andil. %0,%1,%b2 ! 628: andiu. %0,%1,%u2") ! 629: ! 630: (define_insn "" ! 631: [(set (match_operand:CC 0 "cc_reg_operand" "=x,x,x,x") ! 632: (compare:CC (and:SI (match_operand:SI 1 "gen_reg_operand" "%r,r,r,r") ! 633: (match_operand:SI 2 "and_operand" "r,K,J,L")) ! 634: (const_int 0))) ! 635: (clobber (match_scratch:SI 3 "=r,r,r,r"))] ! 636: "" ! 637: "@ ! 638: and. %3,%1,%2 ! 639: andil. %3,%1,%b2 ! 640: andiu. %3,%1,%u2 ! 641: rlinm. %3,%1,0,%m2,%M2" ! 642: [(set_attr "type" "compare,compare,compare,delayed_compare")]) ! 643: ! 644: (define_insn "" ! 645: [(set (match_operand:CC 3 "cc_reg_operand" "=x,x,x,x") ! 646: (compare:CC (and:SI (match_operand:SI 1 "gen_reg_operand" "%r,r,r,r") ! 647: (match_operand:SI 2 "and_operand" "r,K,J,L")) ! 648: (const_int 0))) ! 649: (set (match_operand:SI 0 "gen_reg_operand" "=r,r,r,r") ! 650: (and:SI (match_dup 1) (match_dup 2)))] ! 651: "" ! 652: "@ ! 653: and. %0,%1,%2 ! 654: andil. %0,%1,%b2 ! 655: andiu. %0,%1,%u2 ! 656: rlinm. %0,%1,0,%m2,%M2" ! 657: [(set_attr "type" "compare,compare,compare,delayed_compare")]) ! 658: ! 659: (define_insn "" ! 660: [(set (match_operand:SI 0 "gen_reg_operand" "=r,r,r") ! 661: (ior:SI (match_operand:SI 1 "gen_reg_operand" "%r,r,r") ! 662: (match_operand:SI 2 "logical_operand" "r,K,J")))] ! 663: "" ! 664: "@ ! 665: or %0,%1,%2 ! 666: oril %0,%1,%b2 ! 667: oriu %0,%1,%u2") ! 668: ! 669: (define_insn "" ! 670: [(set (match_operand:CC 0 "cc_reg_operand" "=x") ! 671: (compare:CC (ior:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 672: (match_operand:SI 2 "gen_reg_operand" "r")) ! 673: (const_int 0))) ! 674: (clobber (match_scratch:SI 3 "=r"))] ! 675: "" ! 676: "or. %3,%1,%2" ! 677: [(set_attr "type" "compare")]) ! 678: ! 679: (define_insn "" ! 680: [(set (match_operand:CC 3 "cc_reg_operand" "=x") ! 681: (compare:CC (ior:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 682: (match_operand:SI 2 "gen_reg_operand" "r")) ! 683: (const_int 0))) ! 684: (set (match_operand:SI 0 "gen_reg_operand" "=r") ! 685: (ior:SI (match_dup 1) (match_dup 2)))] ! 686: "" ! 687: "or. %0,%1,%2" ! 688: [(set_attr "type" "compare")]) ! 689: ! 690: (define_expand "iorsi3" ! 691: [(set (match_operand:SI 0 "gen_reg_operand" "") ! 692: (ior:SI (match_operand:SI 1 "gen_reg_operand" "") ! 693: (match_operand:SI 2 "reg_or_cint_operand" "")))] ! 694: "" ! 695: " ! 696: { ! 697: if (GET_CODE (operands[2]) == CONST_INT ! 698: && ! logical_operand (operands[2], SImode)) ! 699: { ! 700: emit_insn (gen_iorsi3 (operands[0], operands[1], ! 701: gen_rtx (CONST_INT, VOIDmode, ! 702: INTVAL (operands[2]) & 0xffff0000))); ! 703: operands[1] = operands[0]; ! 704: operands[2] = gen_rtx (CONST_INT, VOIDmode, ! 705: INTVAL (operands[2]) & 0xffff); ! 706: } ! 707: }") ! 708: ! 709: (define_insn "" ! 710: [(set (match_operand:SI 0 "gen_reg_operand" "=r,r,r") ! 711: (xor:SI (match_operand:SI 1 "gen_reg_operand" "%r,r,r") ! 712: (match_operand:SI 2 "logical_operand" "r,K,J")))] ! 713: "" ! 714: "@ ! 715: xor %0,%1,%2 ! 716: xoril %0,%1,%b2 ! 717: xoriu %0,%1,%u2") ! 718: ! 719: (define_insn "" ! 720: [(set (match_operand:CC 0 "cc_reg_operand" "=x") ! 721: (compare:CC (xor:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 722: (match_operand:SI 2 "gen_reg_operand" "r")) ! 723: (const_int 0))) ! 724: (clobber (match_scratch:SI 3 "=r"))] ! 725: "" ! 726: "xor. %3,%1,%2" ! 727: [(set_attr "type" "compare")]) ! 728: ! 729: (define_insn "" ! 730: [(set (match_operand:CC 3 "cc_reg_operand" "=x") ! 731: (compare:CC (xor:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 732: (match_operand:SI 2 "gen_reg_operand" "r")) ! 733: (const_int 0))) ! 734: (set (match_operand:SI 0 "gen_reg_operand" "=r") ! 735: (xor:SI (match_dup 1) (match_dup 2)))] ! 736: "" ! 737: "xor. %0,%1,%2" ! 738: [(set_attr "type" "compare")]) ! 739: ! 740: (define_expand "xorsi3" ! 741: [(set (match_operand:SI 0 "gen_reg_operand" "") ! 742: (xor:SI (match_operand:SI 1 "gen_reg_operand" "") ! 743: (match_operand:SI 2 "reg_or_cint_operand" "")))] ! 744: "" ! 745: " ! 746: { ! 747: if (GET_CODE (operands[2]) == CONST_INT ! 748: && ! logical_operand (operands[2], SImode)) ! 749: { ! 750: emit_insn (gen_xorsi3 (operands[0], operands[1], ! 751: gen_rtx (CONST_INT, VOIDmode, ! 752: INTVAL (operands[2]) & 0xffff0000))); ! 753: operands[1] = operands[0]; ! 754: operands[2] = gen_rtx (CONST_INT, VOIDmode, ! 755: INTVAL (operands[2]) & 0xffff); ! 756: } ! 757: }") ! 758: ! 759: (define_insn "" ! 760: [(set (match_operand:SI 0 "gen_reg_operand" "=r") ! 761: (not:SI (xor:SI (match_operand:SI 1 "gen_reg_operand" "%r") ! 762: (match_operand:SI 2 "gen_reg_operand" "r"))))] ! 763: "" ! 764: "eqv %0,%1,%2") ! 765: ! 766: (define_insn "" ! 767: [(set (match_operand:CC 0 "cc_reg_operand" "=x") ! 768: (compare:CC (not:SI (xor:SI (match_operand:SI 1 "gen_reg_operand" "%r") ! 769: (match_operand:SI 2 "gen_reg_operand" "r"))) ! 770: (const_int 0))) ! 771: (clobber (match_scratch:SI 3 "=r"))] ! 772: "" ! 773: "eqv. %3,%1,%2" ! 774: [(set_attr "type" "compare")]) ! 775: ! 776: (define_insn "" ! 777: [(set (match_operand:CC 3 "cc_reg_operand" "=x") ! 778: (compare:CC (not:SI (xor:SI (match_operand:SI 1 "gen_reg_operand" "%r") ! 779: (match_operand:SI 2 "gen_reg_operand" "r"))) ! 780: (const_int 0))) ! 781: (set (match_operand:SI 0 "gen_reg_operand" "=r") ! 782: (not:SI (xor:SI (match_dup 1) (match_dup 2))))] ! 783: "" ! 784: "eqv. %0,%1,%2" ! 785: [(set_attr "type" "compare")]) ! 786: ! 787: (define_insn "" ! 788: [(set (match_operand:SI 0 "gen_reg_operand" "=r") ! 789: (and:SI (not:SI (match_operand:SI 1 "gen_reg_operand" "r")) ! 790: (match_operand:SI 2 "gen_reg_operand" "r")))] ! 791: "" ! 792: "andc %0,%2,%1") ! 793: ! 794: (define_insn "" ! 795: [(set (match_operand:CC 0 "cc_reg_operand" "=x") ! 796: (compare:CC (and:SI (not:SI (match_operand:SI 1 "gen_reg_operand" "r")) ! 797: (match_operand:SI 2 "gen_reg_operand" "r")) ! 798: (const_int 0))) ! 799: (clobber (match_scratch:SI 3 "=r"))] ! 800: "" ! 801: "andc. %3,%2,%1" ! 802: [(set_attr "type" "compare")]) ! 803: ! 804: (define_insn "" ! 805: [(set (match_operand:CC 3 "cc_reg_operand" "=x") ! 806: (compare:CC (and:SI (not:SI (match_operand:SI 1 "gen_reg_operand" "r")) ! 807: (match_operand:SI 2 "gen_reg_operand" "r")) ! 808: (const_int 0))) ! 809: (set (match_operand:SI 0 "gen_reg_operand" "=r") ! 810: (and:SI (not:SI (match_dup 1)) (match_dup 2)))] ! 811: "" ! 812: "andc. %0,%2,%1" ! 813: [(set_attr "type" "compare")]) ! 814: ! 815: (define_insn "" ! 816: [(set (match_operand:SI 0 "gen_reg_operand" "=r") ! 817: (ior:SI (not:SI (match_operand:SI 1 "gen_reg_operand" "r")) ! 818: (match_operand:SI 2 "gen_reg_operand" "r")))] ! 819: "" ! 820: "orc %0,%2,%1") ! 821: ! 822: (define_insn "" ! 823: [(set (match_operand:CC 0 "cc_reg_operand" "=x") ! 824: (compare:CC (ior:SI (not:SI (match_operand:SI 1 "gen_reg_operand" "r")) ! 825: (match_operand:SI 2 "gen_reg_operand" "r")) ! 826: (const_int 0))) ! 827: (clobber (match_scratch:SI 3 "=r"))] ! 828: "" ! 829: "orc. %3,%2,%1" ! 830: [(set_attr "type" "compare")]) ! 831: ! 832: (define_insn "" ! 833: [(set (match_operand:CC 3 "cc_reg_operand" "=x") ! 834: (compare:CC (ior:SI (not:SI (match_operand:SI 1 "gen_reg_operand" "r")) ! 835: (match_operand:SI 2 "gen_reg_operand" "r")) ! 836: (const_int 0))) ! 837: (set (match_operand:SI 0 "gen_reg_operand" "=r") ! 838: (ior:SI (not:SI (match_dup 1)) (match_dup 2)))] ! 839: "" ! 840: "orc. %0,%2,%1" ! 841: [(set_attr "type" "compare")]) ! 842: ! 843: (define_insn "" ! 844: [(set (match_operand:SI 0 "gen_reg_operand" "=r") ! 845: (ior:SI (not:SI (match_operand:SI 1 "gen_reg_operand" "r")) ! 846: (not:SI (match_operand:SI 2 "gen_reg_operand" "r"))))] ! 847: "" ! 848: "nand %0,%1,%2") ! 849: ! 850: (define_insn "" ! 851: [(set (match_operand:CC 0 "cc_reg_operand" "=x") ! 852: (compare:CC (ior:SI (not:SI (match_operand:SI 1 "gen_reg_operand" "r")) ! 853: (not:SI (match_operand:SI 2 "gen_reg_operand" "r"))) ! 854: (const_int 0))) ! 855: (clobber (match_scratch:SI 3 "=r"))] ! 856: "" ! 857: "nand. %3,%1,%2" ! 858: [(set_attr "type" "compare")]) ! 859: ! 860: (define_insn "" ! 861: [(set (match_operand:CC 3 "cc_reg_operand" "=x") ! 862: (compare:CC (ior:SI (not:SI (match_operand:SI 1 "gen_reg_operand" "r")) ! 863: (not:SI (match_operand:SI 2 "gen_reg_operand" "r"))) ! 864: (const_int 0))) ! 865: (set (match_operand:SI 0 "gen_reg_operand" "=r") ! 866: (ior:SI (not:SI (match_dup 1)) (not:SI (match_dup 2))))] ! 867: "" ! 868: "nand. %0,%1,%2" ! 869: [(set_attr "type" "compare")]) ! 870: ! 871: (define_insn "" ! 872: [(set (match_operand:SI 0 "gen_reg_operand" "=r") ! 873: (and:SI (not:SI (match_operand:SI 1 "gen_reg_operand" "r")) ! 874: (not:SI (match_operand:SI 2 "gen_reg_operand" "r"))))] ! 875: "" ! 876: "nor %0,%1,%2") ! 877: ! 878: (define_insn "" ! 879: [(set (match_operand:CC 0 "cc_reg_operand" "=x") ! 880: (compare:CC (and:SI (not:SI (match_operand:SI 1 "gen_reg_operand" "r")) ! 881: (not:SI (match_operand:SI 2 "gen_reg_operand" "r"))) ! 882: (const_int 0))) ! 883: (clobber (match_scratch:SI 3 "=r"))] ! 884: "" ! 885: "nor. %3,%1,%2" ! 886: [(set_attr "type" "compare")]) ! 887: ! 888: (define_insn "" ! 889: [(set (match_operand:CC 3 "cc_reg_operand" "=x") ! 890: (compare:CC (and:SI (not:SI (match_operand:SI 1 "gen_reg_operand" "r")) ! 891: (not:SI (match_operand:SI 2 "gen_reg_operand" "r"))) ! 892: (const_int 0))) ! 893: (set (match_operand:SI 0 "gen_reg_operand" "=r") ! 894: (and:SI (not:SI (match_dup 1)) (not:SI (match_dup 2))))] ! 895: "" ! 896: "nor. %0,%1,%2" ! 897: [(set_attr "type" "compare")]) ! 898: ! 899: ;; maskir insn. We need four forms because things might be in arbitrary ! 900: ;; orders. Don't define forms that only set CR fields because these ! 901: ;; would modify an input register. ! 902: ! 903: (define_insn "" ! 904: [(set (match_operand:SI 0 "gen_reg_operand" "=r") ! 905: (ior:SI (and:SI (not:SI (match_operand:SI 1 "gen_reg_operand" "r")) ! 906: (match_operand:SI 2 "gen_reg_operand" "0")) ! 907: (and:SI (match_dup 1) ! 908: (match_operand:SI 3 "gen_reg_operand" "r"))))] ! 909: "" ! 910: "maskir %0,%3,%1") ! 911: ! 912: (define_insn "" ! 913: [(set (match_operand:SI 0 "register_operand" "=r") ! 914: (ior:SI (and:SI (not:SI (match_operand:SI 1 "gen_reg_operand" "r")) ! 915: (match_operand:SI 2 "gen_reg_operand" "0")) ! 916: (and:SI (match_operand:SI 3 "gen_reg_operand" "r") ! 917: (match_dup 1))))] ! 918: "" ! 919: "maskir %0,%3,%1") ! 920: ! 921: (define_insn "" ! 922: [(set (match_operand:SI 0 "gen_reg_operand" "=r") ! 923: (ior:SI (and:SI (match_dup 1) ! 924: (match_operand:SI 3 "gen_reg_operand" "r")) ! 925: (and:SI (not:SI (match_operand:SI 1 "gen_reg_operand" "r")) ! 926: (match_operand:SI 2 "gen_reg_operand" "0"))))] ! 927: "" ! 928: "maskir %0,%3,%1") ! 929: ! 930: (define_insn "" ! 931: [(set (match_operand:SI 0 "gen_reg_operand" "=r") ! 932: (ior:SI (and:SI (match_operand:SI 3 "gen_reg_operand" "r") ! 933: (match_dup 1)) ! 934: (and:SI (not:SI (match_operand:SI 1 "gen_reg_operand" "r")) ! 935: (match_operand:SI 2 "gen_reg_operand" "0"))))] ! 936: "" ! 937: "maskir %0,%3,%1") ! 938: ! 939: (define_insn "" ! 940: [(set (match_operand:CC 4 "cc_reg_operand" "=x") ! 941: (compare:CC ! 942: (ior:SI (and:SI (not:SI (match_operand:SI 1 "gen_reg_operand" "r")) ! 943: (match_operand:SI 2 "gen_reg_operand" "0")) ! 944: (and:SI (match_dup 1) ! 945: (match_operand:SI 3 "gen_reg_operand" "r"))) ! 946: (const_int 0))) ! 947: (set (match_operand:SI 0 "gen_reg_operand" "=r") ! 948: (ior:SI (and:SI (not:SI (match_dup 1)) (match_dup 2)) ! 949: (and:SI (match_dup 1) (match_dup 3))))] ! 950: "" ! 951: "maskir. %0,%3,%1" ! 952: [(set_attr "type" "compare")]) ! 953: ! 954: (define_insn "" ! 955: [(set (match_operand:CC 4 "cc_reg_operand" "=x") ! 956: (compare:CC ! 957: (ior:SI (and:SI (not:SI (match_operand:SI 1 "gen_reg_operand" "r")) ! 958: (match_operand:SI 2 "gen_reg_operand" "0")) ! 959: (and:SI (match_operand:SI 3 "gen_reg_operand" "r") ! 960: (match_dup 1))) ! 961: (const_int 0))) ! 962: (set (match_operand:SI 0 "register_operand" "=r") ! 963: (ior:SI (and:SI (not:SI (match_dup 1)) (match_dup 2)) ! 964: (and:SI (match_dup 3) (match_dup 1))))] ! 965: "" ! 966: "maskir. %0,%3,%1" ! 967: [(set_attr "type" "compare")]) ! 968: ! 969: (define_insn "" ! 970: [(set (match_operand:CC 4 "cc_reg_operand" "=x") ! 971: (compare:CC ! 972: (ior:SI (and:SI (match_dup 1) ! 973: (match_operand:SI 3 "gen_reg_operand" "r")) ! 974: (and:SI (not:SI (match_operand:SI 1 "gen_reg_operand" "r")) ! 975: (match_operand:SI 2 "gen_reg_operand" "0"))) ! 976: (const_int 0))) ! 977: (set (match_operand:SI 0 "gen_reg_operand" "=r") ! 978: (ior:SI (and:SI (match_dup 1) (match_dup 3)) ! 979: (and:SI (not:SI (match_dup 1)) (match_dup 2))))] ! 980: "" ! 981: "maskir. %0,%3,%1" ! 982: [(set_attr "type" "compare")]) ! 983: ! 984: (define_insn "" ! 985: [(set (match_operand:CC 4 "cc_reg_operand" "=x") ! 986: (compare:CC ! 987: (ior:SI (and:SI (match_operand:SI 3 "gen_reg_operand" "r") ! 988: (match_dup 1)) ! 989: (and:SI (not:SI (match_operand:SI 1 "gen_reg_operand" "r")) ! 990: (match_operand:SI 2 "gen_reg_operand" "0"))) ! 991: (const_int 0))) ! 992: (set (match_operand:SI 0 "gen_reg_operand" "=r") ! 993: (ior:SI (and:SI (match_dup 3) (match_dup 1)) ! 994: (and:SI (not:SI (match_dup 1)) (match_dup 2))))] ! 995: "" ! 996: "maskir. %0,%3,%1" ! 997: [(set_attr "type" "compare")]) ! 998: ! 999: ;; Rotate and shift insns, in all their variants. These support shifts, ! 1000: ;; field inserts and extracts, and various combinations thereof. ! 1001: (define_insn "insv" ! 1002: [(set (zero_extract:SI (match_operand:SI 0 "gen_reg_operand" "+r") ! 1003: (match_operand:SI 1 "const_int_operand" "i") ! 1004: (match_operand:SI 2 "const_int_operand" "i")) ! 1005: (match_operand:SI 3 "gen_reg_operand" "r"))] ! 1006: "" ! 1007: "* ! 1008: { ! 1009: int start = INTVAL (operands[2]) & 31; ! 1010: int size = INTVAL (operands[1]) & 31; ! 1011: ! 1012: operands[4] = gen_rtx (CONST_INT, VOIDmode, 32 - start - size); ! 1013: operands[1] = gen_rtx (CONST_INT, VOIDmode, start + size - 1); ! 1014: return \"rlimi %0,%3,%4,%h2,%h1\"; ! 1015: }") ! 1016: ! 1017: (define_insn "extzv" ! 1018: [(set (match_operand:SI 0 "gen_reg_operand" "=r") ! 1019: (zero_extract:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 1020: (match_operand:SI 2 "const_int_operand" "i") ! 1021: (match_operand:SI 3 "const_int_operand" "i")))] ! 1022: "" ! 1023: "* ! 1024: { ! 1025: int start = INTVAL (operands[3]) & 31; ! 1026: int size = INTVAL (operands[2]) & 31; ! 1027: ! 1028: if (start + size >= 32) ! 1029: operands[3] = const0_rtx; ! 1030: else ! 1031: operands[3] = gen_rtx (CONST_INT, VOIDmode, start + size); ! 1032: return \"rlinm %0,%1,%3,%s2,31\"; ! 1033: }") ! 1034: ! 1035: (define_insn "" ! 1036: [(set (match_operand:CC 0 "cc_reg_operand" "=x") ! 1037: (compare:CC (zero_extract:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 1038: (match_operand:SI 2 "const_int_operand" "i") ! 1039: (match_operand:SI 3 "const_int_operand" "i")) ! 1040: (const_int 0))) ! 1041: (clobber (match_scratch:SI 4 "=r"))] ! 1042: "" ! 1043: "* ! 1044: { ! 1045: int start = INTVAL (operands[3]) & 31; ! 1046: int size = INTVAL (operands[2]) & 31; ! 1047: ! 1048: if (start + size >= 32) ! 1049: operands[3] = const0_rtx; ! 1050: else ! 1051: operands[3] = gen_rtx (CONST_INT, VOIDmode, start + size); ! 1052: return \"rlinm. %4,%1,%3,%s2,31\"; ! 1053: }" ! 1054: [(set_attr "type" "compare")]) ! 1055: ! 1056: (define_insn "" ! 1057: [(set (match_operand:CC 4 "cc_reg_operand" "=x") ! 1058: (compare:CC (zero_extract:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 1059: (match_operand:SI 2 "const_int_operand" "i") ! 1060: (match_operand:SI 3 "const_int_operand" "i")) ! 1061: (const_int 0))) ! 1062: (set (match_operand:SI 0 "gen_reg_operand" "=r") ! 1063: (zero_extract:SI (match_dup 1) (match_dup 2) (match_dup 3)))] ! 1064: "" ! 1065: "* ! 1066: { ! 1067: int start = INTVAL (operands[3]) & 31; ! 1068: int size = INTVAL (operands[2]) & 31; ! 1069: ! 1070: if (start + size >= 32) ! 1071: operands[3] = const0_rtx; ! 1072: else ! 1073: operands[3] = gen_rtx (CONST_INT, VOIDmode, start + size); ! 1074: return \"rlinm. %0,%1,%3,%s2,31\"; ! 1075: }" ! 1076: [(set_attr "type" "delayed_compare")]) ! 1077: ! 1078: (define_insn "rotlsi3" ! 1079: [(set (match_operand:SI 0 "gen_reg_operand" "=r") ! 1080: (rotate:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 1081: (match_operand:SI 2 "reg_or_cint_operand" "ri")))] ! 1082: "" ! 1083: "rl%I2nm %0,%1,%h2,0,31") ! 1084: ! 1085: (define_insn "" ! 1086: [(set (match_operand:CC 0 "cc_reg_operand" "=x") ! 1087: (compare:CC (rotate:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 1088: (match_operand:SI 2 "reg_or_cint_operand" "ri")) ! 1089: (const_int 0))) ! 1090: (clobber (match_scratch:SI 3 "=r"))] ! 1091: "" ! 1092: "rl%I2nm. %3,%1,%h2,0,31" ! 1093: [(set_attr "type" "delayed_compare")]) ! 1094: ! 1095: (define_insn "" ! 1096: [(set (match_operand:CC 3 "cc_reg_operand" "=x") ! 1097: (compare:CC (rotate:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 1098: (match_operand:SI 2 "reg_or_cint_operand" "ri")) ! 1099: (const_int 0))) ! 1100: (set (match_operand:SI 0 "gen_reg_operand" "=r") ! 1101: (rotate:SI (match_dup 1) (match_dup 2)))] ! 1102: "" ! 1103: "rl%I2nm. %0,%1,%h2,0,31" ! 1104: [(set_attr "type" "delayed_compare")]) ! 1105: ! 1106: (define_insn "" ! 1107: [(set (match_operand:SI 0 "gen_reg_operand" "=r") ! 1108: (and:SI (rotate:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 1109: (match_operand:SI 2 "reg_or_cint_operand" "ri")) ! 1110: (match_operand:SI 3 "mask_operand" "L")))] ! 1111: "" ! 1112: "rl%I2nm %0,%1,%h2,%m3,%M3") ! 1113: ! 1114: (define_insn "" ! 1115: [(set (match_operand:CC 0 "cc_reg_operand" "=x") ! 1116: (compare:CC (and:SI ! 1117: (rotate:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 1118: (match_operand:SI 2 "reg_or_cint_operand" "ri")) ! 1119: (match_operand:SI 3 "mask_operand" "L")) ! 1120: (const_int 0))) ! 1121: (clobber (match_scratch:SI 4 "=r"))] ! 1122: "" ! 1123: "rl%I2nm. %4,%1,%h2,%m3,%M3" ! 1124: [(set_attr "type" "delayed_compare")]) ! 1125: ! 1126: (define_insn "" ! 1127: [(set (match_operand:CC 4 "cc_reg_operand" "=x") ! 1128: (compare:CC (and:SI ! 1129: (rotate:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 1130: (match_operand:SI 2 "reg_or_cint_operand" "ri")) ! 1131: (match_operand:SI 3 "mask_operand" "L")) ! 1132: (const_int 0))) ! 1133: (set (match_operand:SI 0 "gen_reg_operand" "=r") ! 1134: (and:SI (rotate:SI (match_dup 1) (match_dup 2)) (match_dup 3)))] ! 1135: "" ! 1136: "rl%I2nm. %0,%1,%h2,%m3,%M3" ! 1137: [(set_attr "type" "delayed_compare")]) ! 1138: ! 1139: (define_insn "" ! 1140: [(set (match_operand:SI 0 "gen_reg_operand" "=r") ! 1141: (zero_extend:SI ! 1142: (subreg:QI ! 1143: (rotate:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 1144: (match_operand:SI 2 "reg_or_cint_operand" "ri")) 0)))] ! 1145: "" ! 1146: "rl%I2nm %0,%1,%h2,24,31") ! 1147: ! 1148: (define_insn "" ! 1149: [(set (match_operand:CC 0 "cc_reg_operand" "=x") ! 1150: (compare:CC (zero_extend:SI ! 1151: (subreg:QI ! 1152: (rotate:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 1153: (match_operand:SI 2 "reg_or_cint_operand" "ri")) 0)) ! 1154: (const_int 0))) ! 1155: (clobber (match_scratch:SI 3 "=r"))] ! 1156: "" ! 1157: "rl%I2nm. %3,%1,%h2,24,31" ! 1158: [(set_attr "type" "delayed_compare")]) ! 1159: ! 1160: (define_insn "" ! 1161: [(set (match_operand:CC 3 "cc_reg_operand" "=x") ! 1162: (compare:CC (zero_extend:SI ! 1163: (subreg:QI ! 1164: (rotate:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 1165: (match_operand:SI 2 "reg_or_cint_operand" "ri")) 0)) ! 1166: (const_int 0))) ! 1167: (set (match_operand:SI 0 "gen_reg_operand" "=r") ! 1168: (zero_extend:SI (subreg:QI (rotate:SI (match_dup 1) (match_dup 2)) 0)))] ! 1169: "" ! 1170: "rl%I2nm. %0,%1,%h2,24,31" ! 1171: [(set_attr "type" "delayed_compare")]) ! 1172: ! 1173: (define_insn "" ! 1174: [(set (match_operand:SI 0 "gen_reg_operand" "=r") ! 1175: (zero_extend:SI ! 1176: (subreg:HI ! 1177: (rotate:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 1178: (match_operand:SI 2 "reg_or_cint_operand" "ri")) 0)))] ! 1179: "" ! 1180: "rl%I2nm %0,%1,%h2,16,31") ! 1181: ! 1182: (define_insn "" ! 1183: [(set (match_operand:CC 0 "cc_reg_operand" "=x") ! 1184: (compare:CC (zero_extend:SI ! 1185: (subreg:HI ! 1186: (rotate:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 1187: (match_operand:SI 2 "reg_or_cint_operand" "ri")) 0)) ! 1188: (const_int 0))) ! 1189: (clobber (match_scratch:SI 3 "=r"))] ! 1190: "" ! 1191: "rl%I2nm. %3,%1,%h2,16,31" ! 1192: [(set_attr "type" "delayed_compare")]) ! 1193: ! 1194: (define_insn "" ! 1195: [(set (match_operand:CC 3 "cc_reg_operand" "=x") ! 1196: (compare:CC (zero_extend:SI ! 1197: (subreg:HI ! 1198: (rotate:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 1199: (match_operand:SI 2 "reg_or_cint_operand" "ri")) 0)) ! 1200: (const_int 0))) ! 1201: (set (match_operand:SI 0 "gen_reg_operand" "=r") ! 1202: (zero_extend:SI (subreg:HI (rotate:SI (match_dup 1) (match_dup 2)) 0)))] ! 1203: "" ! 1204: "rl%I2nm. %0,%1,%h2,16,31" ! 1205: [(set_attr "type" "delayed_compare")]) ! 1206: ! 1207: ;; Note that we use "sle." instead of "sl." so that we can set ! 1208: ;; SHIFT_COUNT_TRUNCATED. ! 1209: ! 1210: (define_insn "ashlsi3" ! 1211: [(set (match_operand:SI 0 "gen_reg_operand" "=r,r") ! 1212: (ashift:SI (match_operand:SI 1 "gen_reg_operand" "r,r") ! 1213: (match_operand:SI 2 "reg_or_cint_operand" "r,i"))) ! 1214: (clobber (match_scratch:SI 3 "=q,X"))] ! 1215: "" ! 1216: "@ ! 1217: sle %0,%1,%2 ! 1218: sli %0,%1,%h2") ! 1219: ! 1220: (define_insn "" ! 1221: [(set (match_operand:CC 0 "cc_reg_operand" "=x,x") ! 1222: (compare:CC (ashift:SI (match_operand:SI 1 "gen_reg_operand" "r,r") ! 1223: (match_operand:SI 2 "reg_or_cint_operand" "r,i")) ! 1224: (const_int 0))) ! 1225: (clobber (match_scratch:SI 3 "=r,r")) ! 1226: (clobber (match_scratch:SI 4 "=q,X"))] ! 1227: "" ! 1228: "@ ! 1229: sle. %3,%1,%2 ! 1230: sli. %3,%1,%h2" ! 1231: [(set_attr "type" "delayed_compare")]) ! 1232: ! 1233: (define_insn "" ! 1234: [(set (match_operand:CC 3 "cc_reg_operand" "=x,x") ! 1235: (compare:CC (ashift:SI (match_operand:SI 1 "gen_reg_operand" "r,r") ! 1236: (match_operand:SI 2 "reg_or_cint_operand" "r,i")) ! 1237: (const_int 0))) ! 1238: (set (match_operand:SI 0 "gen_reg_operand" "=r,r") ! 1239: (ashift:SI (match_dup 1) (match_dup 2))) ! 1240: (clobber (match_scratch:SI 4 "=q,X"))] ! 1241: "" ! 1242: "@ ! 1243: sle. %0,%1,%2 ! 1244: sli. %0,%1,%h2" ! 1245: [(set_attr "type" "delayed_compare")]) ! 1246: ! 1247: (define_insn "" ! 1248: [(set (match_operand:SI 0 "gen_reg_operand" "=r") ! 1249: (and:SI (ashift:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 1250: (match_operand:SI 2 "const_int_operand" "i")) ! 1251: (match_operand:SI 3 "mask_operand" "L")))] ! 1252: "includes_lshift_p (operands[2], operands[3])" ! 1253: "rlinm %0,%h1,%h2,%m3,%M3") ! 1254: ! 1255: (define_insn "" ! 1256: [(set (match_operand:CC 0 "cc_reg_operand" "=x") ! 1257: (compare:CC ! 1258: (and:SI (ashift:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 1259: (match_operand:SI 2 "const_int_operand" "i")) ! 1260: (match_operand:SI 3 "mask_operand" "L")) ! 1261: (const_int 0))) ! 1262: (clobber (match_scratch:SI 4 "=r"))] ! 1263: "includes_lshift_p (operands[2], operands[3])" ! 1264: "rlinm. %4,%h1,%h2,%m3,%M3" ! 1265: [(set_attr "type" "delayed_compare")]) ! 1266: ! 1267: (define_insn "" ! 1268: [(set (match_operand:CC 4 "cc_reg_operand" "=x") ! 1269: (compare:CC ! 1270: (and:SI (ashift:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 1271: (match_operand:SI 2 "const_int_operand" "i")) ! 1272: (match_operand:SI 3 "mask_operand" "L")) ! 1273: (const_int 0))) ! 1274: (set (match_operand:SI 0 "gen_reg_operand" "=r") ! 1275: (and:SI (ashift:SI (match_dup 1) (match_dup 2)) (match_dup 3)))] ! 1276: "includes_lshift_p (operands[2], operands[3])" ! 1277: "rlinm. %0,%h1,%h2,%m3,%M3" ! 1278: [(set_attr "type" "delayed_compare")]) ! 1279: ! 1280: (define_insn "lshrsi3" ! 1281: [(set (match_operand:SI 0 "gen_reg_operand" "=r,r") ! 1282: (lshiftrt:SI (match_operand:SI 1 "gen_reg_operand" "r,r") ! 1283: (match_operand:SI 2 "reg_or_cint_operand" "r,i"))) ! 1284: (clobber (match_scratch:SI 3 "=q,X"))] ! 1285: "" ! 1286: "@ ! 1287: sre %0,%1,%2 ! 1288: sri %0,%1,%h2") ! 1289: ! 1290: (define_insn "" ! 1291: [(set (match_operand:CC 0 "cc_reg_operand" "=x,x") ! 1292: (compare:CC (lshiftrt:SI (match_operand:SI 1 "gen_reg_operand" "r,r") ! 1293: (match_operand:SI 2 "reg_or_cint_operand" "r,i")) ! 1294: (const_int 0))) ! 1295: (clobber (match_scratch:SI 3 "=r,r")) ! 1296: (clobber (match_scratch:SI 4 "=q,X"))] ! 1297: "" ! 1298: "@ ! 1299: sre. %3,%1,%2 ! 1300: sri. %3,%1,%h2" ! 1301: [(set_attr "type" "delayed_compare")]) ! 1302: ! 1303: (define_insn "" ! 1304: [(set (match_operand:CC 3 "cc_reg_operand" "=x,x") ! 1305: (compare:CC (lshiftrt:SI (match_operand:SI 1 "gen_reg_operand" "r,r") ! 1306: (match_operand:SI 2 "reg_or_cint_operand" "r,i")) ! 1307: (const_int 0))) ! 1308: (set (match_operand:SI 0 "gen_reg_operand" "=r,r") ! 1309: (lshiftrt:SI (match_dup 1) (match_dup 2))) ! 1310: (clobber (match_scratch:SI 4 "=q,X"))] ! 1311: "" ! 1312: "@ ! 1313: sre. %0,%1,%2 ! 1314: sri. %0,%1,%h2" ! 1315: [(set_attr "type" "delayed_compare")]) ! 1316: ! 1317: (define_insn "" ! 1318: [(set (match_operand:SI 0 "gen_reg_operand" "=r") ! 1319: (and:SI (lshiftrt:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 1320: (match_operand:SI 2 "const_int_operand" "i")) ! 1321: (match_operand:SI 3 "mask_operand" "L")))] ! 1322: "includes_rshift_p (operands[2], operands[3])" ! 1323: "rlinm %0,%1,%s2,%m3,%M3") ! 1324: ! 1325: (define_insn "" ! 1326: [(set (match_operand:CC 0 "cc_reg_operand" "=x") ! 1327: (compare:CC ! 1328: (and:SI (lshiftrt:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 1329: (match_operand:SI 2 "const_int_operand" "i")) ! 1330: (match_operand:SI 3 "mask_operand" "L")) ! 1331: (const_int 0))) ! 1332: (clobber (match_scratch:SI 4 "=r"))] ! 1333: "includes_rshift_p (operands[2], operands[3])" ! 1334: "rlinm. %4,%1,%s2,%m3,%M3" ! 1335: [(set_attr "type" "delayed_compare")]) ! 1336: ! 1337: (define_insn "" ! 1338: [(set (match_operand:CC 4 "cc_reg_operand" "=x") ! 1339: (compare:CC ! 1340: (and:SI (lshiftrt:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 1341: (match_operand:SI 2 "const_int_operand" "i")) ! 1342: (match_operand:SI 3 "mask_operand" "L")) ! 1343: (const_int 0))) ! 1344: (set (match_operand:SI 0 "gen_reg_operand" "=r") ! 1345: (and:SI (lshiftrt:SI (match_dup 1) (match_dup 2)) (match_dup 3)))] ! 1346: "includes_rshift_p (operands[2], operands[3])" ! 1347: "rlinm. %0,%1,%s2,%m3,%M3" ! 1348: [(set_attr "type" "delayed_compare")]) ! 1349: ! 1350: (define_insn "" ! 1351: [(set (match_operand:SI 0 "gen_reg_operand" "=r") ! 1352: (zero_extend:SI ! 1353: (subreg:QI ! 1354: (lshiftrt:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 1355: (match_operand:SI 2 "const_int_operand" "i")) 0)))] ! 1356: "includes_rshift_p (operands[2], gen_rtx (CONST_INT, VOIDmode, 255))" ! 1357: "rlinm %0,%1,%s2,24,31") ! 1358: ! 1359: (define_insn "" ! 1360: [(set (match_operand:CC 0 "cc_reg_operand" "=x") ! 1361: (compare:CC ! 1362: (zero_extend:SI ! 1363: (subreg:QI ! 1364: (lshiftrt:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 1365: (match_operand:SI 2 "const_int_operand" "i")) 0)) ! 1366: (const_int 0))) ! 1367: (clobber (match_scratch:SI 3 "=r"))] ! 1368: "includes_rshift_p (operands[2], gen_rtx (CONST_INT, VOIDmode, 255))" ! 1369: "rlinm. %3,%1,%s2,24,31" ! 1370: [(set_attr "type" "delayed_compare")]) ! 1371: ! 1372: (define_insn "" ! 1373: [(set (match_operand:CC 3 "cc_reg_operand" "=x") ! 1374: (compare:CC ! 1375: (zero_extend:SI ! 1376: (subreg:QI ! 1377: (lshiftrt:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 1378: (match_operand:SI 2 "const_int_operand" "i")) 0)) ! 1379: (const_int 0))) ! 1380: (set (match_operand:SI 0 "gen_reg_operand" "=r") ! 1381: (zero_extend:SI (subreg:QI (lshiftrt:SI (match_dup 1) (match_dup 2)) 0)))] ! 1382: "includes_rshift_p (operands[2], gen_rtx (CONST_INT, VOIDmode, 255))" ! 1383: "rlinm. %0,%1,%s2,24,31" ! 1384: [(set_attr "type" "delayed_compare")]) ! 1385: ! 1386: (define_insn "" ! 1387: [(set (match_operand:SI 0 "gen_reg_operand" "=r") ! 1388: (zero_extend:SI ! 1389: (subreg:HI ! 1390: (lshiftrt:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 1391: (match_operand:SI 2 "const_int_operand" "i")) 0)))] ! 1392: "includes_rshift_p (operands[2], gen_rtx (CONST_INT, VOIDmode, 65535))" ! 1393: "rlinm %0,%1,%s2,16,31") ! 1394: ! 1395: (define_insn "" ! 1396: [(set (match_operand:CC 0 "cc_reg_operand" "=x") ! 1397: (compare:CC ! 1398: (zero_extend:SI ! 1399: (subreg:HI ! 1400: (lshiftrt:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 1401: (match_operand:SI 2 "const_int_operand" "i")) 0)) ! 1402: (const_int 0))) ! 1403: (clobber (match_scratch:SI 3 "=r"))] ! 1404: "includes_rshift_p (operands[2], gen_rtx (CONST_INT, VOIDmode, 65535))" ! 1405: "rlinm. %3,%1,%s2,16,31" ! 1406: [(set_attr "type" "delayed_compare")]) ! 1407: ! 1408: (define_insn "" ! 1409: [(set (match_operand:CC 3 "cc_reg_operand" "=x") ! 1410: (compare:CC ! 1411: (zero_extend:SI ! 1412: (subreg:HI ! 1413: (lshiftrt:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 1414: (match_operand:SI 2 "const_int_operand" "i")) 0)) ! 1415: (const_int 0))) ! 1416: (set (match_operand:SI 0 "gen_reg_operand" "=r") ! 1417: (zero_extend:SI (subreg:HI (lshiftrt:SI (match_dup 1) (match_dup 2)) 0)))] ! 1418: "includes_rshift_p (operands[2], gen_rtx (CONST_INT, VOIDmode, 65535))" ! 1419: "rlinm. %0,%1,%s2,16,31" ! 1420: [(set_attr "type" "delayed_compare")]) ! 1421: ! 1422: (define_insn "" ! 1423: [(set (zero_extract:SI (match_operand:SI 0 "gen_reg_operand" "+r") ! 1424: (const_int 1) ! 1425: (match_operand:SI 1 "gen_reg_operand" "r")) ! 1426: (ashiftrt:SI (match_operand:SI 2 "gen_reg_operand" "r") ! 1427: (const_int 31)))] ! 1428: "" ! 1429: "rrib %0,%1,%2") ! 1430: ! 1431: (define_insn "" ! 1432: [(set (zero_extract:SI (match_operand:SI 0 "gen_reg_operand" "+r") ! 1433: (const_int 1) ! 1434: (match_operand:SI 1 "gen_reg_operand" "r")) ! 1435: (lshiftrt:SI (match_operand:SI 2 "gen_reg_operand" "r") ! 1436: (const_int 31)))] ! 1437: "" ! 1438: "rrib %0,%1,%2") ! 1439: ! 1440: (define_insn "" ! 1441: [(set (zero_extract:SI (match_operand:SI 0 "gen_reg_operand" "+r") ! 1442: (const_int 1) ! 1443: (match_operand:SI 1 "gen_reg_operand" "r")) ! 1444: (zero_extract:SI (match_operand:SI 2 "gen_reg_operand" "r") ! 1445: (const_int 1) ! 1446: (const_int 0)))] ! 1447: "" ! 1448: "rrib %0,%1,%2") ! 1449: ! 1450: (define_insn "ashrsi3" ! 1451: [(set (match_operand:SI 0 "gen_reg_operand" "=r,r") ! 1452: (ashiftrt:SI (match_operand:SI 1 "gen_reg_operand" "r,r") ! 1453: (match_operand:SI 2 "reg_or_cint_operand" "r,i"))) ! 1454: (clobber (match_scratch:SI 3 "=q,X"))] ! 1455: "" ! 1456: "@ ! 1457: srea %0,%1,%2 ! 1458: srai %0,%1,%h2") ! 1459: ! 1460: (define_insn "" ! 1461: [(set (match_operand:CC 0 "cc_reg_operand" "=x,x") ! 1462: (compare:CC (ashiftrt:SI (match_operand:SI 1 "gen_reg_operand" "r,r") ! 1463: (match_operand:SI 2 "reg_or_cint_operand" "r,i")) ! 1464: (const_int 0))) ! 1465: (clobber (match_scratch:SI 3 "=r,r")) ! 1466: (clobber (match_scratch:SI 4 "=q,X"))] ! 1467: "" ! 1468: "@ ! 1469: srea. %3,%1,%2 ! 1470: srai. %3,%1,%h2" ! 1471: [(set_attr "type" "delayed_compare")]) ! 1472: ! 1473: (define_insn "" ! 1474: [(set (match_operand:CC 3 "cc_reg_operand" "=x,x") ! 1475: (compare:CC (ashiftrt:SI (match_operand:SI 1 "gen_reg_operand" "r,r") ! 1476: (match_operand:SI 2 "reg_or_cint_operand" "r,i")) ! 1477: (const_int 0))) ! 1478: (set (match_operand:SI 0 "gen_reg_operand" "=r,r") ! 1479: (ashiftrt:SI (match_dup 1) (match_dup 2))) ! 1480: (clobber (match_scratch:SI 4 "=q,X"))] ! 1481: "" ! 1482: "@ ! 1483: srea. %0,%1,%2 ! 1484: srai. %0,%1,%h2" ! 1485: [(set_attr "type" "delayed_compare")]) ! 1486: ! 1487: (define_expand "extendqisi2" ! 1488: [(parallel [(set (match_dup 2) ! 1489: (ashift:SI (match_operand:QI 1 "gen_reg_operand" "") ! 1490: (const_int 24))) ! 1491: (clobber (scratch:SI))]) ! 1492: (parallel [(set (match_operand:SI 0 "gen_reg_operand" "") ! 1493: (ashiftrt:SI (match_dup 2) ! 1494: (const_int 24))) ! 1495: (clobber (scratch:SI))])] ! 1496: "" ! 1497: " ! 1498: { operands[1] = gen_lowpart (SImode, operands[1]); ! 1499: operands[2] = gen_reg_rtx (SImode); }") ! 1500: ! 1501: (define_expand "extendqihi2" ! 1502: [(parallel [(set (match_dup 2) ! 1503: (ashift:SI (match_operand:QI 1 "gen_reg_operand" "") ! 1504: (const_int 24))) ! 1505: (clobber (scratch:SI))]) ! 1506: (parallel [(set (match_operand:HI 0 "gen_reg_operand" "") ! 1507: (ashiftrt:SI (match_dup 2) ! 1508: (const_int 24))) ! 1509: (clobber (scratch:SI))])] ! 1510: "" ! 1511: " ! 1512: { operands[0] = gen_lowpart (SImode, operands[0]); ! 1513: operands[1] = gen_lowpart (SImode, operands[1]); ! 1514: operands[2] = gen_reg_rtx (SImode); }") ! 1515: ! 1516: ;; Floating-point insns, excluding normal data motion. ! 1517: ;; ! 1518: ;; We pretend that we have both SFmode and DFmode insns, while, in fact, ! 1519: ;; all fp insns are actually done in double. The only conversions we will ! 1520: ;; do will be when storing to memory. In that case, we will use the "frsp" ! 1521: ;; instruction before storing. ! 1522: ;; ! 1523: ;; Note that when we store into a single-precision memory location, we need to ! 1524: ;; use the frsp insn first. If the register being stored isn't dead, we ! 1525: ;; need a scratch register for the frsp. But this is difficult when the store ! 1526: ;; is done by reload. It is not incorrect to do the frsp on the register in ! 1527: ;; this case, we just lose precision that we would have otherwise gotten but ! 1528: ;; is not guaranteed. Perhaps this should be tightened up at some point. ! 1529: ! 1530: (define_insn "extendsfdf2" ! 1531: [(set (match_operand:DF 0 "gen_reg_operand" "=f") ! 1532: (float_extend:DF (match_operand:SF 1 "gen_reg_operand" "f")))] ! 1533: "" ! 1534: "* ! 1535: { ! 1536: if (REGNO (operands[0]) == REGNO (operands[1])) ! 1537: return \"\"; ! 1538: else ! 1539: return \"fmr %0,%1\"; ! 1540: }" ! 1541: [(set_attr "type" "fp")]) ! 1542: ! 1543: (define_insn "truncdfsf2" ! 1544: [(set (match_operand:SF 0 "gen_reg_operand" "=f") ! 1545: (float_truncate:SF (match_operand:DF 1 "gen_reg_operand" "f")))] ! 1546: "" ! 1547: "* ! 1548: { ! 1549: if (REGNO (operands[0]) == REGNO (operands[1])) ! 1550: return \"\"; ! 1551: else ! 1552: return \"fmr %0,%1\"; ! 1553: }" ! 1554: [(set_attr "type" "fp")]) ! 1555: ! 1556: (define_insn "negsf2" ! 1557: [(set (match_operand:SF 0 "gen_reg_operand" "=f") ! 1558: (neg:SF (match_operand:SF 1 "gen_reg_operand" "f")))] ! 1559: "" ! 1560: "fneg %0,%1" ! 1561: [(set_attr "type" "fp")]) ! 1562: ! 1563: (define_insn "abssf2" ! 1564: [(set (match_operand:SF 0 "gen_reg_operand" "=f") ! 1565: (abs:SF (match_operand:SF 1 "gen_reg_operand" "f")))] ! 1566: "" ! 1567: "fabs %0,%1" ! 1568: [(set_attr "type" "fp")]) ! 1569: ! 1570: (define_insn "" ! 1571: [(set (match_operand:SF 0 "gen_reg_operand" "=f") ! 1572: (neg:SF (abs:SF (match_operand:SF 1 "gen_reg_operand" "f"))))] ! 1573: "" ! 1574: "fnabs %0,%1" ! 1575: [(set_attr "type" "fp")]) ! 1576: ! 1577: (define_insn "addsf3" ! 1578: [(set (match_operand:SF 0 "gen_reg_operand" "=f") ! 1579: (plus:SF (match_operand:SF 1 "gen_reg_operand" "%f") ! 1580: (match_operand:SF 2 "gen_reg_operand" "f")))] ! 1581: "" ! 1582: "fa %0,%1,%2" ! 1583: [(set_attr "type" "fp")]) ! 1584: ! 1585: (define_insn "subsf3" ! 1586: [(set (match_operand:SF 0 "gen_reg_operand" "=f") ! 1587: (minus:SF (match_operand:SF 1 "gen_reg_operand" "f") ! 1588: (match_operand:SF 2 "gen_reg_operand" "f")))] ! 1589: "" ! 1590: "fs %0,%1,%2" ! 1591: [(set_attr "type" "fp")]) ! 1592: ! 1593: (define_insn "mulsf3" ! 1594: [(set (match_operand:SF 0 "gen_reg_operand" "=f") ! 1595: (mult:SF (match_operand:SF 1 "gen_reg_operand" "%f") ! 1596: (match_operand:SF 2 "gen_reg_operand" "f")))] ! 1597: "" ! 1598: "fm %0,%1,%2" ! 1599: [(set_attr "type" "fp")]) ! 1600: ! 1601: (define_insn "divsf3" ! 1602: [(set (match_operand:SF 0 "gen_reg_operand" "=f") ! 1603: (div:SF (match_operand:SF 1 "gen_reg_operand" "f") ! 1604: (match_operand:SF 2 "gen_reg_operand" "f")))] ! 1605: "" ! 1606: "fd %0,%1,%2" ! 1607: [(set_attr "type" "fp")]) ! 1608: ! 1609: (define_insn "" ! 1610: [(set (match_operand:SF 0 "gen_reg_operand" "=f") ! 1611: (plus:SF (mult:SF (match_operand:SF 1 "gen_reg_operand" "%f") ! 1612: (match_operand:SF 2 "gen_reg_operand" "f")) ! 1613: (match_operand:SF 3 "gen_reg_operand" "f")))] ! 1614: "" ! 1615: "fma %0,%1,%2,%3" ! 1616: [(set_attr "type" "fp")]) ! 1617: ! 1618: (define_insn "" ! 1619: [(set (match_operand:SF 0 "gen_reg_operand" "=f") ! 1620: (minus:SF (mult:SF (match_operand:SF 1 "gen_reg_operand" "%f") ! 1621: (match_operand:SF 2 "gen_reg_operand" "f")) ! 1622: (match_operand:SF 3 "gen_reg_operand" "f")))] ! 1623: "" ! 1624: "fms %0,%1,%2,%3" ! 1625: [(set_attr "type" "fp")]) ! 1626: ! 1627: (define_insn "" ! 1628: [(set (match_operand:SF 0 "gen_reg_operand" "=f") ! 1629: (neg:SF (plus:SF (mult:SF (match_operand:SF 1 "gen_reg_operand" "%f") ! 1630: (match_operand:SF 2 "gen_reg_operand" "f")) ! 1631: (match_operand:SF 3 "gen_reg_operand" "f"))))] ! 1632: "" ! 1633: "fnma %0,%1,%2,%3" ! 1634: [(set_attr "type" "fp")]) ! 1635: ! 1636: (define_insn "" ! 1637: [(set (match_operand:SF 0 "gen_reg_operand" "=f") ! 1638: (neg:SF (minus:SF (mult:SF (match_operand:SF 1 "gen_reg_operand" "%f") ! 1639: (match_operand:SF 2 "gen_reg_operand" "f")) ! 1640: (match_operand:SF 3 "gen_reg_operand" "f"))))] ! 1641: "" ! 1642: "fnms %0,%1,%2,%3" ! 1643: [(set_attr "type" "fp")]) ! 1644: ! 1645: (define_insn "negdf2" ! 1646: [(set (match_operand:DF 0 "gen_reg_operand" "=f") ! 1647: (neg:DF (match_operand:DF 1 "gen_reg_operand" "f")))] ! 1648: "" ! 1649: "fneg %0,%1" ! 1650: [(set_attr "type" "fp")]) ! 1651: ! 1652: (define_insn "absdf2" ! 1653: [(set (match_operand:DF 0 "gen_reg_operand" "=f") ! 1654: (abs:DF (match_operand:DF 1 "gen_reg_operand" "f")))] ! 1655: "" ! 1656: "fabs %0,%1" ! 1657: [(set_attr "type" "fp")]) ! 1658: ! 1659: (define_insn "" ! 1660: [(set (match_operand:DF 0 "gen_reg_operand" "=f") ! 1661: (neg:DF (abs:DF (match_operand:DF 1 "gen_reg_operand" "f"))))] ! 1662: "" ! 1663: "fnabs %0,%1" ! 1664: [(set_attr "type" "fp")]) ! 1665: ! 1666: (define_insn "adddf3" ! 1667: [(set (match_operand:DF 0 "gen_reg_operand" "=f") ! 1668: (plus:DF (match_operand:DF 1 "gen_reg_operand" "%f") ! 1669: (match_operand:DF 2 "gen_reg_operand" "f")))] ! 1670: "" ! 1671: "fa %0,%1,%2" ! 1672: [(set_attr "type" "fp")]) ! 1673: ! 1674: (define_insn "subdf3" ! 1675: [(set (match_operand:DF 0 "gen_reg_operand" "=f") ! 1676: (minus:DF (match_operand:DF 1 "gen_reg_operand" "f") ! 1677: (match_operand:DF 2 "gen_reg_operand" "f")))] ! 1678: "" ! 1679: "fs %0,%1,%2" ! 1680: [(set_attr "type" "fp")]) ! 1681: ! 1682: (define_insn "muldf3" ! 1683: [(set (match_operand:DF 0 "gen_reg_operand" "=f") ! 1684: (mult:DF (match_operand:DF 1 "gen_reg_operand" "%f") ! 1685: (match_operand:DF 2 "gen_reg_operand" "f")))] ! 1686: "" ! 1687: "fm %0,%1,%2" ! 1688: [(set_attr "type" "fp")]) ! 1689: ! 1690: (define_insn "divdf3" ! 1691: [(set (match_operand:DF 0 "gen_reg_operand" "=f") ! 1692: (div:DF (match_operand:DF 1 "gen_reg_operand" "f") ! 1693: (match_operand:DF 2 "gen_reg_operand" "f")))] ! 1694: "" ! 1695: "fd %0,%1,%2" ! 1696: [(set_attr "type" "fp")]) ! 1697: ! 1698: (define_insn "" ! 1699: [(set (match_operand:DF 0 "gen_reg_operand" "=f") ! 1700: (plus:DF (mult:DF (match_operand:DF 1 "gen_reg_operand" "%f") ! 1701: (match_operand:DF 2 "gen_reg_operand" "f")) ! 1702: (match_operand:DF 3 "gen_reg_operand" "f")))] ! 1703: "" ! 1704: "fma %0,%1,%2,%3" ! 1705: [(set_attr "type" "fp")]) ! 1706: ! 1707: (define_insn "" ! 1708: [(set (match_operand:DF 0 "gen_reg_operand" "=f") ! 1709: (minus:DF (mult:DF (match_operand:DF 1 "gen_reg_operand" "%f") ! 1710: (match_operand:DF 2 "gen_reg_operand" "f")) ! 1711: (match_operand:DF 3 "gen_reg_operand" "f")))] ! 1712: "" ! 1713: "fms %0,%1,%2,%3" ! 1714: [(set_attr "type" "fp")]) ! 1715: ! 1716: (define_insn "" ! 1717: [(set (match_operand:DF 0 "gen_reg_operand" "=f") ! 1718: (neg:DF (plus:DF (mult:DF (match_operand:DF 1 "gen_reg_operand" "%f") ! 1719: (match_operand:DF 2 "gen_reg_operand" "f")) ! 1720: (match_operand:DF 3 "gen_reg_operand" "f"))))] ! 1721: "" ! 1722: "fnma %0,%1,%2,%3" ! 1723: [(set_attr "type" "fp")]) ! 1724: ! 1725: (define_insn "" ! 1726: [(set (match_operand:DF 0 "gen_reg_operand" "=f") ! 1727: (neg:DF (minus:DF (mult:DF (match_operand:DF 1 "gen_reg_operand" "%f") ! 1728: (match_operand:DF 2 "gen_reg_operand" "f")) ! 1729: (match_operand:DF 3 "gen_reg_operand" "f"))))] ! 1730: "" ! 1731: "fnms %0,%1,%2,%3" ! 1732: [(set_attr "type" "fp")]) ! 1733: ! 1734: ;; Conversions to and from floating-point. ! 1735: (define_expand "floatsidf2" ! 1736: [(set (match_dup 2) ! 1737: (plus:DI (zero_extend:DI ! 1738: (xor:SI (match_operand:SI 1 "gen_reg_operand" "") ! 1739: (match_dup 3))) ! 1740: (match_dup 4))) ! 1741: (set (match_operand:DF 0 "gen_reg_operand" "") ! 1742: (minus:DF (subreg:DF (match_dup 2) 0) ! 1743: (match_dup 5)))] ! 1744: "" ! 1745: " ! 1746: { ! 1747: #if HOST_BITS_PER_INT != BITS_PER_WORD ! 1748: /* Maybe someone can figure out how to do this in that case. I don't ! 1749: want to right now. */ ! 1750: abort (); ! 1751: #endif ! 1752: ! 1753: operands[2] = gen_reg_rtx (DImode); ! 1754: operands[3] = gen_rtx (CONST_INT, VOIDmode, 0x80000000); ! 1755: operands[4] = immed_double_const (0, 0x43300000, DImode); ! 1756: operands[5] = force_reg (DFmode, immed_double_const (0x43300000, ! 1757: 0x80000000, DFmode)); ! 1758: }") ! 1759: ! 1760: (define_expand "floatunssidf2" ! 1761: [(set (match_dup 2) ! 1762: (plus:DI (zero_extend:DI (match_operand:SI 1 "gen_reg_operand" "")) ! 1763: (match_dup 3))) ! 1764: (set (match_operand:DF 0 "gen_reg_operand" "") ! 1765: (minus:DF (subreg:DF (match_dup 2) 0) ! 1766: (match_dup 4)))] ! 1767: "" ! 1768: " ! 1769: { ! 1770: #if HOST_BITS_PER_INT != BITS_PER_WORD ! 1771: /* Maybe someone can figure out how to do this in that case. I don't ! 1772: want to right now. */ ! 1773: abort (); ! 1774: #endif ! 1775: ! 1776: operands[2] = gen_reg_rtx (DImode); ! 1777: operands[3] = immed_double_const (0, 0x43300000, DImode); ! 1778: operands[4] = force_reg (DFmode, immed_double_const (0x43300000, 0, DFmode)); ! 1779: }") ! 1780: ! 1781: ;; For the above two cases, we always split. ! 1782: (define_split ! 1783: [(set (match_operand:DI 0 "gen_reg_operand" "") ! 1784: (plus:DI (zero_extend:DI ! 1785: (xor:SI (match_operand:SI 1 "gen_reg_operand" "") ! 1786: (match_operand:SI 2 "logical_operand" ""))) ! 1787: (match_operand:DI 3 "immediate_operand" "")))] ! 1788: "reload_completed && HOST_BITS_PER_INT == BITS_PER_WORD ! 1789: && GET_CODE (operands[3]) == CONST_DOUBLE ! 1790: && CONST_DOUBLE_LOW (operands[3]) == 0" ! 1791: [(set (match_dup 6) (xor:SI (match_dup 1) (match_dup 2))) ! 1792: (set (match_dup 4) (match_dup 5))] ! 1793: " ! 1794: { operands[4] = operand_subword (operands[0], 0, 0, DImode); ! 1795: operands[5] = operand_subword (operands[3], 0, 0, DImode); ! 1796: operands[6] = operand_subword (operands[0], 1, 0, DImode); ! 1797: }") ! 1798: ! 1799: (define_insn "" ! 1800: [(set (match_operand:DI 0 "gen_reg_operand" "=r") ! 1801: (plus:DI (zero_extend:DI ! 1802: (xor:SI (match_operand:SI 1 "gen_reg_operand" "%r") ! 1803: (match_operand:SI 2 "logical_operand" "rKJ"))) ! 1804: (match_operand:DI 3 "immediate_operand" "n")))] ! 1805: "HOST_BITS_PER_INT == BITS_PER_WORD ! 1806: && GET_CODE (operands[3]) == CONST_DOUBLE ! 1807: && CONST_DOUBLE_LOW (operands[3]) == 0" ! 1808: "#") ! 1809: ! 1810: (define_split ! 1811: [(set (match_operand:DI 0 "gen_reg_operand" "=") ! 1812: (plus:DI (zero_extend:DI (match_operand:SI 1 "gen_reg_operand" "")) ! 1813: (match_operand:DI 2 "immediate_operand" "")))] ! 1814: "reload_completed && HOST_BITS_PER_INT == BITS_PER_WORD ! 1815: && GET_CODE (operands[2]) == CONST_DOUBLE ! 1816: && CONST_DOUBLE_LOW (operands[2]) == 0" ! 1817: [(set (match_dup 3) (match_dup 4)) ! 1818: (set (match_dup 5) (match_dup 1))] ! 1819: " ! 1820: { operands[3] = operand_subword (operands[0], 0, 0, DImode); ! 1821: operands[4] = operand_subword (operands[2], 0, 0, DImode); ! 1822: operands[5] = operand_subword (operands[0], 1, 0, DImode); ! 1823: ! 1824: if (rtx_equal_p (operands[1], operands[5])) ! 1825: { ! 1826: emit_move_insn (operands[3], operands[4]); ! 1827: DONE; ! 1828: } ! 1829: }") ! 1830: ! 1831: (define_insn "" ! 1832: [(set (match_operand:DI 0 "gen_reg_operand" "=r") ! 1833: (plus:DI (zero_extend:DI (match_operand:SI 1 "gen_reg_operand" "r")) ! 1834: (match_operand:DI 2 "immediate_operand" "n")))] ! 1835: "HOST_BITS_PER_INT == BITS_PER_WORD ! 1836: && GET_CODE (operands[2]) == CONST_DOUBLE ! 1837: && CONST_DOUBLE_LOW (operands[2]) == 0" ! 1838: "#") ! 1839: ! 1840: (define_expand "fix_truncdfsi2" ! 1841: [(set (match_operand:SI 0 "gen_reg_operand" "") ! 1842: (fix:DF (match_operand:DF 1 "gen_reg_operand" "")))] ! 1843: "" ! 1844: " ! 1845: { ! 1846: emit_insn (gen_trunc_call (operands[0], operands[1], ! 1847: gen_rtx (SYMBOL_REF, Pmode, \"itrunc\"))); ! 1848: DONE; ! 1849: }") ! 1850: ! 1851: (define_expand "fixuns_truncdfsi2" ! 1852: [(set (match_operand:SI 0 "gen_reg_operand" "") ! 1853: (unsigned_fix:DF (match_operand:DF 1 "gen_reg_operand" "")))] ! 1854: "" ! 1855: " ! 1856: { ! 1857: emit_insn (gen_trunc_call (operands[0], operands[1], ! 1858: gen_rtx (SYMBOL_REF, Pmode, \"uitrunc\"))); ! 1859: DONE; ! 1860: }") ! 1861: ! 1862: ! 1863: (define_expand "trunc_call" ! 1864: [(parallel [(set (match_operand:SI 0 "" "") ! 1865: (fix:DF (match_operand:DF 1 "" ""))) ! 1866: (use (match_operand:SI 2 "" ""))])] ! 1867: "" ! 1868: " ! 1869: { ! 1870: rtx insns = gen_trunc_call_rtl (operands[0], operands[1], operands[2]); ! 1871: rtx first = XVECEXP (insns, 0, 0); ! 1872: rtx last = XVECEXP (insns, 0, XVECLEN (insns, 0) - 1); ! 1873: ! 1874: REG_NOTES (first) = gen_rtx (INSN_LIST, REG_LIBCALL, last, ! 1875: REG_NOTES (first)); ! 1876: REG_NOTES (last) = gen_rtx (INSN_LIST, REG_RETVAL, first, REG_NOTES (last)); ! 1877: ! 1878: emit_insn (insns); ! 1879: DONE; ! 1880: }") ! 1881: ! 1882: (define_expand "trunc_call_rtl" ! 1883: [(set (reg:DF 33) (match_operand:DF 1 "gen_reg_operand" "")) ! 1884: (use (reg:DF 33)) ! 1885: (parallel [(set (reg:SI 3) ! 1886: (call (mem:SI (match_operand 2 "" "")) (const_int 0))) ! 1887: (clobber (scratch:SI))]) ! 1888: (set (match_operand:SI 0 "gen_reg_operand" "") ! 1889: (reg:SI 3))] ! 1890: "" ! 1891: " ! 1892: { ! 1893: rs6000_trunc_used = 1; ! 1894: }") ! 1895: ! 1896: ;; Define the DImode operations that can be done in a small number ! 1897: ;; of instructions. ! 1898: (define_insn "adddi3" ! 1899: [(set (match_operand:DI 0 "gen_reg_operand" "=r") ! 1900: (plus:DI (match_operand:DI 1 "gen_reg_operand" "%r") ! 1901: (match_operand:DI 2 "gen_reg_operand" "r")))] ! 1902: "" ! 1903: "a %L0,%L1,%L2\;ae %0,%1,%2") ! 1904: ! 1905: (define_insn "subdi3" ! 1906: [(set (match_operand:DI 0 "gen_reg_operand" "=r") ! 1907: (minus:DI (match_operand:DI 1 "gen_reg_operand" "r") ! 1908: (match_operand:DI 2 "gen_reg_operand" "r")))] ! 1909: "" ! 1910: "sf %L0,%L2,%L1\;sfe %0,%2,%1") ! 1911: ! 1912: (define_insn "negdi3" ! 1913: [(set (match_operand:DI 0 "gen_reg_operand" "=r") ! 1914: (neg:DI (match_operand:DI 1 "gen_reg_operand" "r")))] ! 1915: "" ! 1916: "sfi %L0,%L1,0\;sfze %0,%1") ! 1917: ! 1918: (define_insn "mulsidi3" ! 1919: [(set (match_operand:DI 0 "gen_reg_operand" "=r") ! 1920: (mult:DI (sign_extend:DI (match_operand:SI 1 "gen_reg_operand" "r")) ! 1921: (sign_extend:DI (match_operand:SI 2 "gen_reg_operand" "r")))) ! 1922: (clobber (match_scratch:SI 3 "=q"))] ! 1923: "" ! 1924: "mul %0,%1,%2\;mfmq %L0") ! 1925: ! 1926: ;; If operands 0 and 2 are in the same register, we have a problem. But ! 1927: ;; operands 0 and 1 (the usual case) can be in the same register. That's ! 1928: ;; why we have the strange constraints below. ! 1929: (define_insn "ashldi3" ! 1930: [(set (match_operand:DI 0 "gen_reg_operand" "=r,r,r,&r") ! 1931: (ashift:DI (match_operand:DI 1 "gen_reg_operand" "r,r,0,r") ! 1932: (match_operand:SI 2 "reg_or_cint_operand" "M,i,r,r"))) ! 1933: (clobber (match_scratch:SI 3 "=X,q,q,q"))] ! 1934: "" ! 1935: "@ ! 1936: sli %0,%L1,%h2\;cal %L0,0(0) ! 1937: sl%I2q %L0,%L1,%h2\;sll%I2q %0,%1,%h2 ! 1938: sl%I2q %L0,%L1,%h2\;sll%I2q %0,%1,%h2 ! 1939: sl%I2q %L0,%L1,%h2\;sll%I2q %0,%1,%h2 ") ! 1940: ! 1941: (define_insn "lshrdi3" ! 1942: [(set (match_operand:DI 0 "gen_reg_operand" "=r,r,r,&r") ! 1943: (lshiftrt:DI (match_operand:DI 1 "gen_reg_operand" "r,r,0,r") ! 1944: (match_operand:SI 2 "reg_or_cint_operand" "M,i,r,r"))) ! 1945: (clobber (match_scratch:SI 3 "=X,q,q,q"))] ! 1946: "" ! 1947: "@ ! 1948: cal %0,0(0)\;sri %L0,%1,%h2 ! 1949: sr%I2q %L0,%L1,%2\;srl%I2q %0,%1,%2 ! 1950: sr%I2q %L0,%L1,%2\;srl%I2q %0,%1,%2 ! 1951: sr%I2q %L0,%L1,%2\;srl%I2q %0,%1,%2 ") ! 1952: ! 1953: ;; Shift by a variable amount is too complex to be worth open-coding. We ! 1954: ;; just handle shifts by constants. ! 1955: ! 1956: (define_expand "ashrdi3" ! 1957: [(parallel [(set (match_operand:DI 0 "gen_reg_operand" "=") ! 1958: (ashiftrt:DI (match_operand:DI 1 "gen_reg_operand" "") ! 1959: (match_operand:SI 2 "general_operand" ""))) ! 1960: (clobber (match_scratch:SI 3 ""))])] ! 1961: "" ! 1962: " ! 1963: { if (GET_CODE (operands[2]) != CONST_INT) ! 1964: FAIL; ! 1965: }") ! 1966: ! 1967: (define_insn "" ! 1968: [(set (match_operand:DI 0 "gen_reg_operand" "=r,r") ! 1969: (ashiftrt:DI (match_operand:DI 1 "gen_reg_operand" "r,r") ! 1970: (match_operand:SI 2 "const_int_operand" "M,i"))) ! 1971: (clobber (match_scratch:SI 3 "=X,q"))] ! 1972: "" ! 1973: "@ ! 1974: srai %0,%1,31\;srai %L0,%1,%h2 ! 1975: sraiq %L0,%L1,%2\;srlq %0,%1,%2") ! 1976: ! 1977: ;; Now define ways of moving data around. ! 1978: ;; ! 1979: ;; For SI, we special-case integers that can't be loaded in one insn. We ! 1980: ;; do the load 16-bits at a time. We could do this by loading from memory, ! 1981: ;; and this is even supposed to be faster, but it is simpler not to get ! 1982: ;; integers in the TOC. ! 1983: (define_expand "movsi" ! 1984: [(set (match_operand:SI 0 "general_operand" "") ! 1985: (match_operand:SI 1 "any_operand" ""))] ! 1986: "" ! 1987: " ! 1988: { ! 1989: if (GET_CODE (operands[0]) != REG) ! 1990: operands[1] = force_reg (SImode, operands[1]); ! 1991: ! 1992: if (CONSTANT_P (operands[1]) && GET_CODE (operands[1]) != CONST_INT) ! 1993: operands[1] = force_const_mem (SImode, operands[1]); ! 1994: ! 1995: if (GET_CODE (operands[1]) == CONST_INT ! 1996: && (unsigned) (INTVAL (operands[1]) + 0x8000) >= 0x10000 ! 1997: && (INTVAL (operands[1]) & 0xffff) != 0) ! 1998: { ! 1999: emit_move_insn (operands[0], ! 2000: gen_rtx (CONST_INT, VOIDmode, ! 2001: INTVAL (operands[1]) & 0xffff0000)); ! 2002: emit_insn (gen_iorsi3 (operands[0], operands[0], ! 2003: gen_rtx (CONST_INT, VOIDmode, ! 2004: INTVAL (operands[1]) & 0xffff))); ! 2005: DONE; ! 2006: } ! 2007: }") ! 2008: ! 2009: (define_insn "" ! 2010: [(set (match_operand:SI 0 "nonimmediate_operand" "=r,r,m,r,r,r,*h") ! 2011: (match_operand:SI 1 "input_operand" "r,m,r,I,J,*h,r"))] ! 2012: "gen_reg_operand (operands[0], SImode) ! 2013: || gen_reg_operand (operands[1], SImode)" ! 2014: "@ ! 2015: ai %0,%1,0 ! 2016: l%U1%X1 %0,%1 ! 2017: st%U0%X0 %1,%0 ! 2018: cal %0,%1(0) ! 2019: cau %0,0,%u1 ! 2020: mf%1 %0 ! 2021: mt%0 %1" ! 2022: [(set_attr "type" "*,load,*,*,*,*,*")]) ! 2023: ! 2024: (define_insn "" ! 2025: [(set (match_operand:CC 2 "cc_reg_operand" "=x") ! 2026: (compare:CC (match_operand:SI 1 "gen_reg_operand" "r") ! 2027: (const_int 0))) ! 2028: (set (match_operand:SI 0 "gen_reg_operand" "=r") (match_dup 1))] ! 2029: "" ! 2030: "ai. %0,%1,0" ! 2031: [(set_attr "type" "compare")]) ! 2032: ! 2033: (define_expand "movhi" ! 2034: [(set (match_operand:HI 0 "general_operand" "") ! 2035: (match_operand:HI 1 "any_operand" ""))] ! 2036: "" ! 2037: " ! 2038: { ! 2039: if (GET_CODE (operands[0]) != REG) ! 2040: operands[1] = force_reg (HImode, operands[1]); ! 2041: ! 2042: if (CONSTANT_P (operands[1]) && GET_CODE (operands[1]) != CONST_INT) ! 2043: operands[1] = force_const_mem (HImode, operands[1]); ! 2044: }") ! 2045: ! 2046: (define_insn "" ! 2047: [(set (match_operand:HI 0 "nonimmediate_operand" "=r,r,m,r,r,*h") ! 2048: (match_operand:HI 1 "input_operand" "r,m,r,i,*h,r"))] ! 2049: "gen_reg_operand (operands[0], HImode) ! 2050: || gen_reg_operand (operands[1], HImode)" ! 2051: "@ ! 2052: oril %0,%1,0 ! 2053: lhz%U1%X1 %0,%1 ! 2054: sth%U0%X0 %1,%0 ! 2055: cal %0,%w1(0) ! 2056: mf%1 %0 ! 2057: mt%0 %1" ! 2058: [(set_attr "type" "*,load,*,*,*,*")]) ! 2059: ! 2060: (define_expand "movqi" ! 2061: [(set (match_operand:QI 0 "general_operand" "") ! 2062: (match_operand:QI 1 "any_operand" ""))] ! 2063: "" ! 2064: " ! 2065: { ! 2066: if (GET_CODE (operands[0]) != REG) ! 2067: operands[1] = force_reg (QImode, operands[1]); ! 2068: ! 2069: if (CONSTANT_P (operands[1]) && GET_CODE (operands[1]) != CONST_INT) ! 2070: operands[1] = force_const_mem (QImode, operands[1]); ! 2071: }") ! 2072: ! 2073: (define_insn "" ! 2074: [(set (match_operand:QI 0 "nonimmediate_operand" "=r,r,m,r,r,*h") ! 2075: (match_operand:QI 1 "input_operand" "r,m,r,i,*h,r"))] ! 2076: "gen_reg_operand (operands[0], QImode) ! 2077: || gen_reg_operand (operands[1], QImode)" ! 2078: "@ ! 2079: oril %0,%1,0 ! 2080: lbz%U1%X1 %0,%1 ! 2081: stb%U0%X0 %1,%0 ! 2082: cal %0,%1(0) ! 2083: mf%1 %0 ! 2084: mt%0 %1" ! 2085: [(set_attr "type" "*,load,*,*,*,*")]) ! 2086: ! 2087: ;; Here is how to move condition codes around. When we store CC data in ! 2088: ;; an integer register or memory, we store just the high-order 4 bits. ! 2089: ;; This lets us not shift in the most common case of CR0. ! 2090: (define_expand "movcc" ! 2091: [(set (match_operand:CC 0 "nonimmediate_operand" "") ! 2092: (match_operand:CC 1 "nonimmediate_operand" ""))] ! 2093: "" ! 2094: "") ! 2095: ! 2096: (define_insn "" ! 2097: [(set (match_operand:CC 0 "nonimmediate_operand" "=y,x,y,r,r,r,r,m") ! 2098: (match_operand:CC 1 "nonimmediate_operand" "y,r,r,x,y,r,m,r"))] ! 2099: "register_operand (operands[0], CCmode) ! 2100: || register_operand (operands[1], CCmode)" ! 2101: "@ ! 2102: mcrf %0,%1 ! 2103: mtcrf 128,%1 ! 2104: rlinm %1,%1,%F0,0,31\;mtcrf %R0,%1\;rlinm %1,%1,%f0,0,31 ! 2105: mfcr %0 ! 2106: mfcr %0\;rlinm %0,%0,%f1,0,3 ! 2107: ai %0,%1,0 ! 2108: l%U1%X1 %0,%1 ! 2109: st%U0%U1 %1,%0" ! 2110: [(set_attr "type" "*,*,*,compare,*,*,load,*")]) ! 2111: ! 2112: ;; For floating-point, we normally deal with the floating-point registers. ! 2113: ;; The sole exception is that parameter passing can produce floating-point ! 2114: ;; values in fixed-point registers. Unless the value is a simple constant ! 2115: ;; or already in memory, we deal with this by allocating memory and copying ! 2116: ;; the value explicitly via that memory location. ! 2117: (define_expand "movsf" ! 2118: [(set (match_operand:SF 0 "nonimmediate_operand" "") ! 2119: (match_operand:SF 1 "any_operand" ""))] ! 2120: "" ! 2121: " ! 2122: { ! 2123: /* If we are called from reload, we might be getting a SUBREG of a hard ! 2124: reg. So expand it. */ ! 2125: if (GET_CODE (operands[0]) == SUBREG ! 2126: && GET_CODE (SUBREG_REG (operands[0])) == REG ! 2127: && REGNO (SUBREG_REG (operands[0])) < FIRST_PSEUDO_REGISTER) ! 2128: operands[0] = alter_subreg (operands[0]); ! 2129: if (GET_CODE (operands[1]) == SUBREG ! 2130: && GET_CODE (SUBREG_REG (operands[1])) == REG ! 2131: && REGNO (SUBREG_REG (operands[1])) < FIRST_PSEUDO_REGISTER) ! 2132: operands[1] = alter_subreg (operands[1]); ! 2133: ! 2134: /* If we are being called from reload, it is possible that operands[1] ! 2135: is a hard non-fp register. So handle those cases. */ ! 2136: if (reload_in_progress && GET_CODE (operands[1]) == REG ! 2137: && REGNO (operands[1]) < 32) ! 2138: { ! 2139: rtx stack_slot; ! 2140: ! 2141: /* Remember that we only see a pseudo here if it didn't get a hard ! 2142: register, so it is memory. */ ! 2143: if (GET_CODE (operands[0]) == MEM ! 2144: || (GET_CODE (operands[0]) == REG ! 2145: && (REGNO (operands[0]) < 32 ! 2146: || REGNO (operands[0]) >= FIRST_PSEUDO_REGISTER)) ! 2147: || (GET_CODE (operands[0]) == REG && REGNO (operands[0]) < 32)) ! 2148: { ! 2149: emit_move_insn (operand_subword (operands[0], 0, 0, SFmode), ! 2150: operand_subword (operands[1], 0, 0, SFmode)); ! 2151: DONE; ! 2152: } ! 2153: ! 2154: stack_slot = gen_rtx (MEM, SFmode, plus_constant (stack_pointer_rtx, 4)); ! 2155: emit_move_insn (stack_slot, operands[1]); ! 2156: emit_move_insn (operands[0], stack_slot); ! 2157: DONE; ! 2158: } ! 2159: ! 2160: if (GET_CODE (operands[0]) == MEM) ! 2161: operands[1] = force_reg (SFmode, operands[1]); ! 2162: ! 2163: if (GET_CODE (operands[0]) == REG && REGNO (operands[0]) < 32) ! 2164: { ! 2165: rtx stack_slot; ! 2166: ! 2167: if (GET_CODE (operands[1]) == MEM ! 2168: #if HOST_FLOAT_FORMAT == TARGET_FLOAT_FORMAT && ! defined(REAL_IS_NOT_DOUBLE) ! 2169: || GET_CODE (operands[1]) == CONST_DOUBLE ! 2170: #endif ! 2171: || (GET_CODE (operands[1]) == REG && REGNO (operands[1]) < 32) ! 2172: || (reload_in_progress && GET_CODE (operands[1]) == REG ! 2173: && REGNO (operands[1]) >= FIRST_PSEUDO_REGISTER)) ! 2174: { ! 2175: emit_move_insn (operand_subword (operands[0], 0, 0, SFmode), ! 2176: operand_subword (operands[1], 0, 0, SFmode)); ! 2177: DONE; ! 2178: } ! 2179: ! 2180: if (reload_in_progress) ! 2181: stack_slot = gen_rtx (MEM, SFmode, ! 2182: plus_constant (stack_pointer_rtx, 4)); ! 2183: else ! 2184: stack_slot = assign_stack_temp (SFmode, 4, 0); ! 2185: emit_move_insn (stack_slot, operands[1]); ! 2186: emit_move_insn (operands[0], stack_slot); ! 2187: DONE; ! 2188: } ! 2189: ! 2190: if (CONSTANT_P (operands[1])) ! 2191: { ! 2192: operands[1] = force_const_mem (SFmode, operands[1]); ! 2193: if (! memory_address_p (SFmode, XEXP (operands[1], 0)) ! 2194: && ! reload_in_progress) ! 2195: operands[1] = change_address (operands[1], SFmode, ! 2196: XEXP (operands[1], 0)); ! 2197: } ! 2198: }") ! 2199: ! 2200: (define_insn "" ! 2201: [(set (match_operand:SF 0 "gen_reg_operand" "=r,r") ! 2202: (match_operand:SF 1 "mem_or_easy_const_operand" "G,m"))] ! 2203: "REGNO (operands[0]) <= 31" ! 2204: "@ ! 2205: # ! 2206: l%U1%X1 %0,%1" ! 2207: [(set_attr "type" "*,load")]) ! 2208: ! 2209: (define_split ! 2210: [(set (match_operand:SF 0 "gen_reg_operand" "") ! 2211: (match_operand:SF 1 "easy_fp_constant" ""))] ! 2212: "reload_completed && REGNO (operands[0]) <= 31" ! 2213: [(set (match_dup 2) (match_dup 3))] ! 2214: " ! 2215: { operands[2] = operand_subword (operands[0], 0, 0, SFmode); ! 2216: operands[3] = operand_subword (operands[1], 0, 0, SFmode); }") ! 2217: ! 2218: (define_insn "" ! 2219: [(set (match_operand:SF 0 "fp_reg_or_mem_operand" "=f,f,m") ! 2220: (match_operand:SF 1 "input_operand" "f,m,f"))] ! 2221: "gen_reg_operand (operands[0], SFmode) ! 2222: || gen_reg_operand (operands[1], SFmode)" ! 2223: "@ ! 2224: fmr %0,%1 ! 2225: lfs%U1%X1 %0,%1 ! 2226: frsp %1,%1\;stfs%U0%X0 %1,%0" ! 2227: [(set_attr "type" "fp,load,*")]) ! 2228: ! 2229: (define_expand "movdf" ! 2230: [(set (match_operand:DF 0 "nonimmediate_operand" "") ! 2231: (match_operand:DF 1 "any_operand" ""))] ! 2232: "" ! 2233: " ! 2234: { ! 2235: /* If we are called from reload, we might be getting a SUBREG of a hard ! 2236: reg. So expand it. */ ! 2237: if (GET_CODE (operands[0]) == SUBREG ! 2238: && GET_CODE (SUBREG_REG (operands[0])) == REG ! 2239: && REGNO (SUBREG_REG (operands[0])) < FIRST_PSEUDO_REGISTER) ! 2240: operands[0] = alter_subreg (operands[0]); ! 2241: if (GET_CODE (operands[1]) == SUBREG ! 2242: && GET_CODE (SUBREG_REG (operands[1])) == REG ! 2243: && REGNO (SUBREG_REG (operands[1])) < FIRST_PSEUDO_REGISTER) ! 2244: operands[1] = alter_subreg (operands[1]); ! 2245: ! 2246: /* If we are being called from reload, it is possible that operands[1] ! 2247: is a hard non-fp register. So handle those cases. */ ! 2248: if (reload_in_progress && GET_CODE (operands[1]) == REG ! 2249: && REGNO (operands[1]) < 32) ! 2250: { ! 2251: rtx stack_slot; ! 2252: ! 2253: /* Remember that we only see a pseudo here if it didn't get a hard ! 2254: register, so it is memory. */ ! 2255: if (GET_CODE (operands[0]) == MEM ! 2256: || (GET_CODE (operands[0]) == REG ! 2257: && (REGNO (operands[0]) < 32 ! 2258: || REGNO (operands[0]) >= FIRST_PSEUDO_REGISTER))) ! 2259: { ! 2260: emit_move_insn (operand_subword (operands[0], 0, 0, DFmode), ! 2261: operand_subword (operands[1], 0, 0, DFmode)); ! 2262: emit_move_insn (operand_subword (operands[0], 1, 0, DFmode), ! 2263: operand_subword (operands[1], 1, 0, DFmode)); ! 2264: DONE; ! 2265: } ! 2266: ! 2267: stack_slot = gen_rtx (MEM, DFmode, plus_constant (stack_pointer_rtx, 8)); ! 2268: emit_move_insn (stack_slot, operands[1]); ! 2269: emit_move_insn (operands[0], stack_slot); ! 2270: DONE; ! 2271: } ! 2272: ! 2273: if (GET_CODE (operands[0]) == MEM) ! 2274: { ! 2275: if (GET_CODE (operands[1]) == MEM) ! 2276: { ! 2277: emit_move_insn (operand_subword (operands[0], 0, 0, DFmode), ! 2278: operand_subword (operands[1], 0, 0, DFmode)); ! 2279: emit_move_insn (operand_subword (operands[0], 1, 0, DFmode), ! 2280: operand_subword (operands[1], 1, 0, DFmode)); ! 2281: DONE; ! 2282: } ! 2283: ! 2284: operands[1] = force_reg (DFmode, operands[1]); ! 2285: } ! 2286: ! 2287: if (GET_CODE (operands[0]) == REG && REGNO (operands[0]) < 32) ! 2288: { ! 2289: rtx stack_slot; ! 2290: ! 2291: if (GET_CODE (operands[1]) == MEM ! 2292: #if HOST_FLOAT_FORMAT == TARGET_FLOAT_FORMAT && ! defined(REAL_IS_NOT_DOUBLE) ! 2293: || GET_CODE (operands[1]) == CONST_DOUBLE ! 2294: #endif ! 2295: || (GET_CODE (operands[1]) == REG && REGNO (operands[1]) < 32) ! 2296: || (reload_in_progress && GET_CODE (operands[1]) == REG ! 2297: && REGNO (operands[1]) >= FIRST_PSEUDO_REGISTER)) ! 2298: { ! 2299: emit_move_insn (operand_subword (operands[0], 0, 0, DFmode), ! 2300: operand_subword (operands[1], 0, 0, DFmode)); ! 2301: emit_move_insn (operand_subword (operands[0], 1, 0, DFmode), ! 2302: operand_subword (operands[1], 1, 0, DFmode)); ! 2303: DONE; ! 2304: } ! 2305: ! 2306: if (reload_in_progress) ! 2307: stack_slot = gen_rtx (MEM, DFmode, ! 2308: plus_constant (stack_pointer_rtx, 8)); ! 2309: else ! 2310: stack_slot = assign_stack_temp (DFmode, 8, 0); ! 2311: emit_move_insn (stack_slot, operands[1]); ! 2312: emit_move_insn (operands[0], stack_slot); ! 2313: DONE; ! 2314: } ! 2315: ! 2316: if (CONSTANT_P (operands[1])) ! 2317: { ! 2318: operands[1] = force_const_mem (DFmode, operands[1]); ! 2319: if (! memory_address_p (DFmode, XEXP (operands[1], 0)) ! 2320: && ! reload_in_progress) ! 2321: operands[1] = change_address (operands[1], DFmode, ! 2322: XEXP (operands[1], 0)); ! 2323: } ! 2324: }") ! 2325: ! 2326: (define_insn "" ! 2327: [(set (match_operand:DF 0 "gen_reg_operand" "=r,r") ! 2328: (match_operand:DF 1 "mem_or_easy_const_operand" "G,m"))] ! 2329: "REGNO (operands[0]) <= 31" ! 2330: "@ ! 2331: # ! 2332: l %0,%1\;l %L0,%L1" ! 2333: [(set_attr "type" "*,load")]) ! 2334: ! 2335: (define_split ! 2336: [(set (match_operand:DF 0 "gen_reg_operand" "") ! 2337: (match_operand:DF 1 "easy_fp_constant" ""))] ! 2338: "reload_completed && REGNO (operands[0]) <= 31" ! 2339: [(set (match_dup 2) (match_dup 3)) ! 2340: (set (match_dup 4) (match_dup 5))] ! 2341: " ! 2342: { operands[2] = operand_subword (operands[0], 0, 0, DFmode); ! 2343: operands[3] = operand_subword (operands[1], 0, 0, DFmode); ! 2344: operands[4] = operand_subword (operands[0], 1, 0, DFmode); ! 2345: operands[5] = operand_subword (operands[1], 1, 0, DFmode); }") ! 2346: ! 2347: (define_insn "" ! 2348: [(set (match_operand:DF 0 "fp_reg_or_mem_operand" "=f,f,m") ! 2349: (match_operand:DF 1 "fp_reg_or_mem_operand" "f,m,f"))] ! 2350: "gen_reg_operand (operands[0], DFmode) ! 2351: || gen_reg_operand (operands[1], DFmode)" ! 2352: "@ ! 2353: fmr %0,%1 ! 2354: lfd%U1%X1 %0,%1 ! 2355: stfd%U0%X0 %1,%0" ! 2356: [(set_attr "type" "fp,load,*")]) ! 2357: ! 2358: ;; Next come the multi-word integer load and store and the load and store ! 2359: ;; multiple insns. ! 2360: (define_expand "movdi" ! 2361: [(set (match_operand:DI 0 "general_operand" "") ! 2362: (match_operand:DI 1 "general_operand" ""))] ! 2363: "" ! 2364: " ! 2365: { ! 2366: if (GET_CODE (operands[0]) == MEM) ! 2367: operands[1] = force_reg (DImode, operands[1]); ! 2368: ! 2369: else if (GET_CODE (operands[1]) == CONST_DOUBLE ! 2370: || GET_CODE (operands[1]) == CONST_INT) ! 2371: { ! 2372: emit_move_insn (operand_subword (operands[0], 0, 0, DImode), ! 2373: operand_subword (operands[1], 0, 0, DImode)); ! 2374: emit_move_insn (operand_subword (operands[0], 1, 0, DImode), ! 2375: operand_subword (operands[1], 1, 0, DImode)); ! 2376: DONE; ! 2377: } ! 2378: }") ! 2379: ! 2380: (define_insn "" ! 2381: [(set (match_operand:DI 0 "nonimmediate_operand" "=r,r,m") ! 2382: (match_operand:DI 1 "input_operand" "r,m,r"))] ! 2383: "gen_reg_operand (operands[0], DImode) ! 2384: || gen_reg_operand (operands[1], DImode)" ! 2385: "* ! 2386: { ! 2387: switch (which_alternative) ! 2388: { ! 2389: case 0: ! 2390: /* We normally copy the low-numbered register first. However, if ! 2391: the first register operand 0 is the same as the second register of ! 2392: operand 1, we must copy in the opposite order. */ ! 2393: if (REGNO (operands[0]) == REGNO (operands[1]) + 1) ! 2394: return \"oril %L0,%L1,0\;oril %0,%1,0\"; ! 2395: else ! 2396: return \"oril %0,%1,0\;oril %L0,%L1,0\"; ! 2397: case 1: ! 2398: /* If the low-address word is used in the address, we must load it ! 2399: last. Otherwise, load it first. Note that we cannot have ! 2400: auto-increment in that case since the address register is known to be ! 2401: dead. */ ! 2402: if (refers_to_regno_p (REGNO (operands[0]), REGNO (operands[0]) + 1, ! 2403: operands [1], 0)) ! 2404: return \"l %L0,%L1\;l %0,%1\"; ! 2405: else ! 2406: return \"l%U1 %0,%1\;l %L0,%L1\"; ! 2407: case 2: ! 2408: return \"st%U0 %1,%0\;st %L1,%L0\"; ! 2409: } ! 2410: }" ! 2411: [(set_attr "type" "*,load,*")]) ! 2412: ! 2413: ;; TImode is similar, except that we usually want to compute the address into ! 2414: ;; a register and use lsi/stsi (the exception is during reload). MQ is also ! 2415: ;; clobbered in stsi, so we need a SCRATCH for it. ! 2416: (define_expand "movti" ! 2417: [(parallel [(set (match_operand:TI 0 "general_operand" "") ! 2418: (match_operand:TI 1 "general_operand" "")) ! 2419: (clobber (scratch:SI))])] ! 2420: "" ! 2421: " ! 2422: { ! 2423: if (GET_CODE (operands[0]) == MEM) ! 2424: operands[1] = force_reg (TImode, operands[1]); ! 2425: ! 2426: if (GET_CODE (operands[0]) == MEM ! 2427: && GET_CODE (XEXP (operands[0], 0)) != REG ! 2428: && ! reload_in_progress) ! 2429: operands[0] = change_address (operands[0], TImode, ! 2430: copy_addr_to_reg (XEXP (operands[0], 0))); ! 2431: ! 2432: if (GET_CODE (operands[1]) == MEM ! 2433: && GET_CODE (XEXP (operands[1], 0)) != REG ! 2434: && ! reload_in_progress) ! 2435: operands[1] = change_address (operands[1], TImode, ! 2436: copy_addr_to_reg (XEXP (operands[1], 0))); ! 2437: }") ! 2438: ! 2439: ;; We say that MQ is clobbered in the last alternative because the first ! 2440: ;; alternative would never get used otherwise since it would need a reload ! 2441: ;; while the 2nd alternative would not. We put memory cases first so they ! 2442: ;; are preferred. Otherwise, we'd try to reload the output instead of ! 2443: ;; giving the SCRATCH mq. ! 2444: (define_insn "" ! 2445: [(set (match_operand:TI 0 "reg_or_mem_operand" "=Q,m,r,r,r") ! 2446: (match_operand:TI 1 "reg_or_mem_operand" "r,r,r,Q,m")) ! 2447: (clobber (match_scratch:SI 2 "=q,q#X,X,X,X"))] ! 2448: "gen_reg_operand (operands[0], TImode) ! 2449: || gen_reg_operand (operands[1], TImode)" ! 2450: "* ! 2451: { ! 2452: switch (which_alternative) ! 2453: { ! 2454: case 0: ! 2455: return \"stsi %1,%P0,16\"; ! 2456: ! 2457: case 1: ! 2458: return \"st%U0 %1,%0\;st %L1,%L0\;st %Y1,%Y0\;st %Z1,%Z0\"; ! 2459: ! 2460: case 2: ! 2461: /* Normally copy registers with lowest numbered register copied first. ! 2462: But copy in the other order if the first register of the output ! 2463: is the second, third, or fourth register in the input. */ ! 2464: if (REGNO (operands[0]) >= REGNO (operands[1]) + 1 ! 2465: && REGNO (operands[0]) <= REGNO (operands[1]) + 3) ! 2466: return \"oril %Z0,%Z1,0\;oril %Y0,%Y1,0\;oril %L0,%L1,0\;oril %0,%1,0\"; ! 2467: else ! 2468: return \"oril %0,%1,0\;oril %L0,%L1,0\;oril %Y0,%Y1,0\;oril %Z0,%Z1,0\"; ! 2469: case 3: ! 2470: /* If the address is not used in the output, we can use lsi. Otherwise, ! 2471: fall through to generating four loads. */ ! 2472: if (! reg_overlap_mentioned_p (operands[0], operands[1])) ! 2473: return \"lsi %0,%P1,16\"; ! 2474: /* ... fall through ... */ ! 2475: case 4: ! 2476: /* If the address register is the same as the register for the lowest- ! 2477: addressed word, load it last. Similarly for the next two words. ! 2478: Otherwise load lowest address to highest. */ ! 2479: if (refers_to_regno_p (REGNO (operands[0]), REGNO (operands[0]) + 1, ! 2480: operands[1], 0)) ! 2481: return \"l %L0,%L1\;l %Y0,%Y1\;l %Z0,%Z1\;l %0,%1\"; ! 2482: else if (refers_to_regno_p (REGNO (operands[0]) + 1, ! 2483: REGNO (operands[0]) + 2, operands[1], 0)) ! 2484: return \"l %0,%1\;l %Y0,%Y1\;l %Z0,%Z1\;l %L0,%L1\"; ! 2485: else if (refers_to_regno_p (REGNO (operands[0]) + 2, ! 2486: REGNO (operands[0]) + 3, operands[1], 0)) ! 2487: return \"l %0,%1\;l %L0,%L1\;l %Z0,%Z1\;l %Y0,%Y1\"; ! 2488: else ! 2489: return \"l%U1 %0,%1\;l %L0,%L1\;l %Y0,%Y1\;l %Z0,%Z1\"; ! 2490: } ! 2491: }" ! 2492: [(set_attr "type" "*,load,load,*,*")]) ! 2493: ! 2494: (define_expand "load_multiple" ! 2495: [(match_parallel 3 "" [(set (match_operand:SI 0 "" "") ! 2496: (match_operand:SI 1 "" "")) ! 2497: (use (match_operand:SI 2 "" ""))])] ! 2498: "" ! 2499: " ! 2500: { ! 2501: int regno; ! 2502: int count; ! 2503: rtx from; ! 2504: int i; ! 2505: ! 2506: /* Support only loading a constant number of fixed-point registers from ! 2507: memory and only bother with this if more than two; the machine ! 2508: doesn't support more than eight. */ ! 2509: if (GET_CODE (operands[2]) != CONST_INT ! 2510: || INTVAL (operands[2]) <= 2 ! 2511: || INTVAL (operands[2]) > 8 ! 2512: || GET_CODE (operands[1]) != MEM ! 2513: || GET_CODE (operands[0]) != REG ! 2514: || REGNO (operands[0]) >= 32) ! 2515: FAIL; ! 2516: ! 2517: count = INTVAL (operands[2]); ! 2518: regno = REGNO (operands[0]); ! 2519: ! 2520: operands[3] = gen_rtx (PARALLEL, VOIDmode, rtvec_alloc (count)); ! 2521: from = force_reg (SImode, XEXP (operands[1], 0)); ! 2522: ! 2523: for (i = 0; i < count; i++) ! 2524: XVECEXP (operands[3], 0, i) ! 2525: = gen_rtx (SET, VOIDmode, gen_rtx (REG, SImode, regno + i), ! 2526: gen_rtx (MEM, SImode, plus_constant (from, i * 4))); ! 2527: }") ! 2528: ! 2529: (define_insn "" ! 2530: [(match_parallel 0 "load_multiple_operation" ! 2531: [(set (match_operand:SI 1 "gen_reg_operand" "=r") ! 2532: (match_operand:SI 2 "indirect_operand" "Q"))])] ! 2533: "" ! 2534: "* ! 2535: { ! 2536: /* We have to handle the case where the pseudo used to contain the address ! 2537: is assigned to one of the output registers. In that case, do the ! 2538: lsi, but then load the correct value. This is a bit of a mess, but is ! 2539: the best we can do. */ ! 2540: static char result[100]; ! 2541: char newload[40]; ! 2542: int i; ! 2543: ! 2544: strcpy (result, \"lsi %1,%P2,%N0\"); ! 2545: for (i = 0; i < XVECLEN (operands[0], 0); i++) ! 2546: if (refers_to_regno_p (REGNO (operands[1]) + i, ! 2547: REGNO (operands[1]) + i + 1, operands[2], 0)) ! 2548: { ! 2549: sprintf (newload, \"\;l %d,%d(%d)\", ! 2550: REGNO (operands[1]) + i, ! 2551: i * 4, REGNO (XEXP (operands[2], 0))); ! 2552: strcat (result, newload); ! 2553: } ! 2554: ! 2555: return result; ! 2556: }" ! 2557: [(set_attr "type" "load")]) ! 2558: ! 2559: (define_expand "store_multiple" ! 2560: [(match_parallel 3 "" [(set (match_operand:SI 0 "" "") ! 2561: (match_operand:SI 1 "" "")) ! 2562: (clobber (scratch:SI)) ! 2563: (use (match_operand:SI 2 "" ""))])] ! 2564: "" ! 2565: " ! 2566: { ! 2567: int regno; ! 2568: int count; ! 2569: rtx to; ! 2570: int i; ! 2571: ! 2572: /* Support only storing a constant number of fixed-point registers to ! 2573: memory and only bother with this if more than two; the machine ! 2574: doesn't support more than eight. */ ! 2575: if (GET_CODE (operands[2]) != CONST_INT ! 2576: || INTVAL (operands[2]) <= 2 ! 2577: || INTVAL (operands[2]) > 8 ! 2578: || GET_CODE (operands[0]) != MEM ! 2579: || GET_CODE (operands[1]) != REG ! 2580: || REGNO (operands[1]) >= 32) ! 2581: FAIL; ! 2582: ! 2583: count = INTVAL (operands[2]); ! 2584: regno = REGNO (operands[1]); ! 2585: ! 2586: operands[3] = gen_rtx (PARALLEL, VOIDmode, rtvec_alloc (count + 1)); ! 2587: to = force_reg (SImode, XEXP (operands[0], 0)); ! 2588: ! 2589: XVECEXP (operands[3], 0, 0) ! 2590: = gen_rtx (SET, VOIDmode, gen_rtx (MEM, SImode, to), operands[1]); ! 2591: XVECEXP (operands[3], 0, 1) = gen_rtx (CLOBBER, VOIDmode, ! 2592: gen_rtx (SCRATCH, SImode)); ! 2593: ! 2594: for (i = 1; i < count; i++) ! 2595: XVECEXP (operands[3], 0, i + 1) ! 2596: = gen_rtx (SET, VOIDmode, ! 2597: gen_rtx (MEM, SImode, plus_constant (to, i * 4)), ! 2598: gen_rtx (REG, SImode, regno + i)); ! 2599: }") ! 2600: ! 2601: (define_insn "" ! 2602: [(match_parallel 0 "store_multiple_operation" ! 2603: [(set (match_operand:SI 1 "indirect_operand" "=Q") ! 2604: (match_operand:SI 2 "gen_reg_operand" "r")) ! 2605: (clobber (match_scratch:SI 3 "=q"))])] ! 2606: "" ! 2607: "stsi %2,%P1,%O0") ! 2608: ! 2609: ;; Define insns that do load or store with update. Some of these we can ! 2610: ;; get by using pre-decrement or pre-increment, but the hardware can also ! 2611: ;; do cases where the increment is not the size of the object. ! 2612: ;; ! 2613: ;; In all these cases, we use operands 0 and 1 for the register being ! 2614: ;; incremented because those are the operands that local-alloc will ! 2615: ;; tie and these are the pair most likely to be tieable (and the ones ! 2616: ;; that will benefit the most). ! 2617: ! 2618: (define_insn "" ! 2619: [(set (match_operand:SI 3 "gen_reg_operand" "=r,r") ! 2620: (mem:SI (plus:SI (match_operand:SI 1 "gen_reg_operand" "0,0") ! 2621: (match_operand:SI 2 "reg_or_short_operand" "r,I")))) ! 2622: (set (match_operand:SI 0 "gen_reg_operand" "=b,b") ! 2623: (plus:SI (match_dup 1) (match_dup 2)))] ! 2624: "" ! 2625: "@ ! 2626: lux %3,%1,%2 ! 2627: lu %3,%2(%1)" ! 2628: [(set_attr "type" "load,load")]) ! 2629: ! 2630: (define_insn "" ! 2631: [(set (mem:SI (plus:SI (match_operand:SI 1 "gen_reg_operand" "0,0") ! 2632: (match_operand:SI 2 "reg_or_short_operand" "r,I"))) ! 2633: (match_operand:SI 3 "gen_reg_operand" "r,r")) ! 2634: (set (match_operand:SI 0 "gen_reg_operand" "=b,b") ! 2635: (plus:SI (match_dup 1) (match_dup 2)))] ! 2636: "" ! 2637: "@ ! 2638: stux %3,%1,%2 ! 2639: stu %3,%2(%1)") ! 2640: ! 2641: (define_insn "" ! 2642: [(set (match_operand:HI 3 "gen_reg_operand" "=r,r") ! 2643: (mem:HI (plus:SI (match_operand:SI 1 "gen_reg_operand" "0,0") ! 2644: (match_operand:SI 2 "reg_or_short_operand" "r,I")))) ! 2645: (set (match_operand:SI 0 "gen_reg_operand" "=b,b") ! 2646: (plus:SI (match_dup 1) (match_dup 2)))] ! 2647: "" ! 2648: "@ ! 2649: lhzux %3,%1,%2 ! 2650: lhzu %3,%2(%1)" ! 2651: [(set_attr "type" "load,load")]) ! 2652: ! 2653: (define_insn "" ! 2654: [(set (match_operand:SI 3 "gen_reg_operand" "=r,r") ! 2655: (zero_extend:SI ! 2656: (mem:HI (plus:SI (match_operand:SI 1 "gen_reg_operand" "0,0") ! 2657: (match_operand:SI 2 "reg_or_short_operand" "r,I"))))) ! 2658: (set (match_operand:SI 0 "gen_reg_operand" "=b,b") ! 2659: (plus:SI (match_dup 1) (match_dup 2)))] ! 2660: "" ! 2661: "@ ! 2662: lhzux %3,%1,%2 ! 2663: lhzu %3,%2(%1)" ! 2664: [(set_attr "type" "load,load")]) ! 2665: ! 2666: (define_insn "" ! 2667: [(set (match_operand:SI 3 "gen_reg_operand" "=r,r") ! 2668: (sign_extend:SI ! 2669: (mem:HI (plus:SI (match_operand:SI 1 "gen_reg_operand" "0,0") ! 2670: (match_operand:SI 2 "reg_or_short_operand" "r,I"))))) ! 2671: (set (match_operand:SI 0 "gen_reg_operand" "=b,b") ! 2672: (plus:SI (match_dup 1) (match_dup 2)))] ! 2673: "" ! 2674: "@ ! 2675: lhaux %3,%1,%2 ! 2676: lhau %3,%2(%1)" ! 2677: [(set_attr "type" "load,load")]) ! 2678: ! 2679: (define_insn "" ! 2680: [(set (mem:HI (plus:SI (match_operand:SI 1 "gen_reg_operand" "0,0") ! 2681: (match_operand:SI 2 "reg_or_short_operand" "r,I"))) ! 2682: (match_operand:HI 3 "gen_reg_operand" "r,r")) ! 2683: (set (match_operand:SI 0 "gen_reg_operand" "=b,b") ! 2684: (plus:SI (match_dup 1) (match_dup 2)))] ! 2685: "" ! 2686: "@ ! 2687: sthux %3,%1,%2 ! 2688: sthu %3,%2(%1)" ! 2689: [(set_attr "type" "load,load")]) ! 2690: ! 2691: (define_insn "" ! 2692: [(set (match_operand:QI 3 "gen_reg_operand" "=r,r") ! 2693: (mem:QI (plus:SI (match_operand:SI 1 "gen_reg_operand" "0,0") ! 2694: (match_operand:SI 2 "reg_or_short_operand" "r,I")))) ! 2695: (set (match_operand:SI 0 "gen_reg_operand" "=b,b") ! 2696: (plus:SI (match_dup 1) (match_dup 2)))] ! 2697: "" ! 2698: "@ ! 2699: lbzux %3,%1,%2 ! 2700: lbzu %3,%2(%1)" ! 2701: [(set_attr "type" "load,load")]) ! 2702: ! 2703: (define_insn "" ! 2704: [(set (match_operand:SI 3 "gen_reg_operand" "=r,r") ! 2705: (zero_extend:SI ! 2706: (mem:QI (plus:SI (match_operand:SI 1 "gen_reg_operand" "0,0") ! 2707: (match_operand:SI 2 "reg_or_short_operand" "r,I"))))) ! 2708: (set (match_operand:SI 0 "gen_reg_operand" "=b,b") ! 2709: (plus:SI (match_dup 1) (match_dup 2)))] ! 2710: "" ! 2711: "@ ! 2712: lbzux %3,%1,%2 ! 2713: lbzu %3,%2(%1)" ! 2714: [(set_attr "type" "load,load")]) ! 2715: ! 2716: (define_insn "" ! 2717: [(set (mem:QI (plus:SI (match_operand:SI 1 "gen_reg_operand" "0,0") ! 2718: (match_operand:SI 2 "reg_or_short_operand" "r,I"))) ! 2719: (match_operand:QI 3 "gen_reg_operand" "r,r")) ! 2720: (set (match_operand:SI 0 "gen_reg_operand" "=b,b") ! 2721: (plus:SI (match_dup 1) (match_dup 2)))] ! 2722: "" ! 2723: "@ ! 2724: stbux %3,%1,%2 ! 2725: stbu %3,%2(%1)") ! 2726: ! 2727: (define_insn "" ! 2728: [(set (match_operand:SF 3 "gen_reg_operand" "=f,f") ! 2729: (mem:SI (plus:SI (match_operand:SI 1 "gen_reg_operand" "0,0") ! 2730: (match_operand:SI 2 "reg_or_short_operand" "r,I")))) ! 2731: (set (match_operand:SI 0 "gen_reg_operand" "=b,b") ! 2732: (plus:SI (match_dup 1) (match_dup 2)))] ! 2733: "" ! 2734: "@ ! 2735: lfsux %3,%1,%2 ! 2736: lfsu %3,%2(%1)" ! 2737: [(set_attr "type" "load,load")]) ! 2738: ! 2739: (define_insn "" ! 2740: [(set (mem:SF (plus:SI (match_operand:SI 1 "gen_reg_operand" "0,0") ! 2741: (match_operand:SI 2 "reg_or_short_operand" "r,I"))) ! 2742: (match_operand:SF 3 "gen_reg_operand" "f,f")) ! 2743: (set (match_operand:SI 0 "gen_reg_operand" "=b,b") ! 2744: (plus:SI (match_dup 1) (match_dup 2)))] ! 2745: "" ! 2746: "@ ! 2747: frsp %3,%3\;stfsux %3,%1,%2 ! 2748: frsp %3,%3\;stfsu %3,%2(%1)") ! 2749: ! 2750: (define_insn "" ! 2751: [(set (match_operand:DF 3 "gen_reg_operand" "=f,f") ! 2752: (mem:DF (plus:SI (match_operand:SI 1 "gen_reg_operand" "0,0") ! 2753: (match_operand:SI 2 "reg_or_short_operand" "r,I")))) ! 2754: (set (match_operand:SI 0 "gen_reg_operand" "=b,b") ! 2755: (plus:SI (match_dup 1) (match_dup 2)))] ! 2756: "" ! 2757: "@ ! 2758: lfdux %3,%1,%2 ! 2759: lfdu %3,%2(%1)" ! 2760: [(set_attr "type" "load,load")]) ! 2761: ! 2762: (define_insn "" ! 2763: [(set (mem:DF (plus:SI (match_operand:SI 1 "gen_reg_operand" "0,0") ! 2764: (match_operand:SI 2 "reg_or_short_operand" "r,I"))) ! 2765: (match_operand:DF 3 "gen_reg_operand" "f,f")) ! 2766: (set (match_operand:SI 0 "gen_reg_operand" "=b,b") ! 2767: (plus:SI (match_dup 1) (match_dup 2)))] ! 2768: "" ! 2769: "@ ! 2770: stfdux %3,%1,%2 ! 2771: stfdu %3,%2(%1)") ! 2772: ! 2773: ;; Next come insns related to the calling sequence. ! 2774: ;; ! 2775: ;; First, an insn to allocate new stack space for dynamic use (e.g., alloca). ! 2776: ;; We move the back-chain and decremement the stack pointer. This is slightly ! 2777: ;; less efficient than it needs to be for long constants, but that case ! 2778: ;; should be rare. ! 2779: ! 2780: (define_expand "allocate_stack" ! 2781: [(set (reg:SI 1) ! 2782: (minus:SI (reg:SI 1) (match_operand:SI 0 "reg_or_cint_operand" "")))] ! 2783: "" ! 2784: " ! 2785: { rtx chain = gen_reg_rtx (SImode); ! 2786: rtx stack_bot = gen_rtx (MEM, Pmode, stack_pointer_rtx); ! 2787: ! 2788: emit_move_insn (chain, stack_bot); ! 2789: emit_insn (gen_subsi3 (stack_pointer_rtx, stack_pointer_rtx, operands[0])); ! 2790: emit_move_insn (stack_bot, chain); ! 2791: DONE; ! 2792: }") ! 2793: ! 2794: ;; A function pointer is a pointer to a data area whose first word contains ! 2795: ;; the actual address of the function, whose second word contains a pointer ! 2796: ;; to its TOC, and whose third word contains a value to place in the static ! 2797: ;; chain register (r11). Note that if we load the static chain, our ! 2798: ;; "trampoline" need not have any executable code. ! 2799: ;; ! 2800: ;; operands[0] is an SImode pseudo in which we place the address of the ! 2801: ;; function. ! 2802: ;; operands[1] is the address of data area of the function to call ! 2803: ! 2804: (define_expand "call_via_ptr" ! 2805: [(set (match_operand:SI 0 "gen_reg_operand" "") ! 2806: (mem:SI (match_operand:SI 1 "gen_reg_operand" ""))) ! 2807: (set (mem:SI (plus:SI (reg:SI 1) (const_int 20))) ! 2808: (reg:SI 2)) ! 2809: (set (reg:SI 2) ! 2810: (mem:SI (plus:SI (match_dup 1) ! 2811: (const_int 4)))) ! 2812: (set (reg:SI 11) ! 2813: (mem:SI (plus:SI (match_dup 1) ! 2814: (const_int 8)))) ! 2815: (use (reg:SI 2)) ! 2816: (use (reg:SI 11))] ! 2817: "" ! 2818: "") ! 2819: ! 2820: (define_expand "call" ! 2821: [(parallel [(call (mem:SI (match_operand:SI 0 "address_operand" "")) ! 2822: (match_operand 1 "" "")) ! 2823: (clobber (scratch:SI))])] ! 2824: "" ! 2825: " ! 2826: { ! 2827: if (GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != CONST_INT) ! 2828: abort (); ! 2829: ! 2830: operands[0] = XEXP (operands[0], 0); ! 2831: if (GET_CODE (operands[0]) != SYMBOL_REF) ! 2832: { ! 2833: rtx temp = gen_reg_rtx (SImode); ! 2834: ! 2835: emit_insn (gen_call_via_ptr (temp, force_reg (SImode, operands[0]))); ! 2836: operands[0] = temp; ! 2837: } ! 2838: }") ! 2839: ! 2840: (define_expand "call_value" ! 2841: [(parallel [(set (match_operand 0 "" "") ! 2842: (call (mem:SI (match_operand:SI 1 "address_operand" "")) ! 2843: (match_operand 2 "" ""))) ! 2844: (clobber (scratch:SI))])] ! 2845: "" ! 2846: " ! 2847: { ! 2848: if (GET_CODE (operands[1]) != MEM || GET_CODE (operands[2]) != CONST_INT) ! 2849: abort (); ! 2850: ! 2851: operands[1] = XEXP (operands[1], 0); ! 2852: if (GET_CODE (operands[1]) != SYMBOL_REF) ! 2853: { ! 2854: rtx temp = gen_reg_rtx (SImode); ! 2855: ! 2856: emit_insn (gen_call_via_ptr (temp, force_reg (SImode, operands[1]))); ! 2857: operands[1] = temp; ! 2858: } ! 2859: }") ! 2860: ! 2861: (define_insn "" ! 2862: [(call (mem:SI (match_operand:SI 0 "call_operand" "l,s")) ! 2863: (match_operand 1 "" "fg,fg")) ! 2864: (clobber (match_scratch:SI 3 "=l,l"))] ! 2865: "" ! 2866: "@ ! 2867: brl\;l 2,20(1) ! 2868: bl %z0\;cror 15,15,15") ! 2869: ! 2870: (define_insn "" ! 2871: [(set (match_operand 0 "" "fg,fg") ! 2872: (call (mem:SI (match_operand:SI 1 "call_operand" "l,s")) ! 2873: (match_operand 2 "" "fg,fg"))) ! 2874: (clobber (match_scratch:SI 3 "=l,l"))] ! 2875: "" ! 2876: "@ ! 2877: brl\;l 2,20(1) ! 2878: bl %z1\;cror 15,15,15") ! 2879: ! 2880: ;; Compare insns are next. Note that the RS/6000 has two types of compares, ! 2881: ;; signed & unsigned, and one type of branch. ! 2882: ;; ! 2883: ;; Start with the DEFINE_EXPANDs to generate the rtl for compares, scc ! 2884: ;; insns, and branches. We store the operands of compares until we see ! 2885: ;; how it is used. ! 2886: (define_expand "cmpsi" ! 2887: [(set (cc0) ! 2888: (compare (match_operand:SI 0 "gen_reg_operand" "") ! 2889: (match_operand:SI 1 "reg_or_short_operand" "")))] ! 2890: "" ! 2891: " ! 2892: { ! 2893: /* Take care of the possibility that operands[1] might be negative but ! 2894: this might be a logical operation. That insn doesn't exist. */ ! 2895: if (GET_CODE (operands[1]) == CONST_INT ! 2896: && INTVAL (operands[1]) < 0) ! 2897: operands[1] = force_reg (SImode, operands[1]); ! 2898: ! 2899: rs6000_compare_op0 = operands[0]; ! 2900: rs6000_compare_op1 = operands[1]; ! 2901: rs6000_compare_fp_p = 0; ! 2902: DONE; ! 2903: }") ! 2904: ! 2905: (define_expand "cmpsf" ! 2906: [(set (cc0) (compare (match_operand:SF 0 "gen_reg_operand" "") ! 2907: (match_operand:SF 1 "gen_reg_operand" "")))] ! 2908: "" ! 2909: " ! 2910: { ! 2911: rs6000_compare_op0 = operands[0]; ! 2912: rs6000_compare_op1 = operands[1]; ! 2913: rs6000_compare_fp_p = 1; ! 2914: DONE; ! 2915: }") ! 2916: ! 2917: (define_expand "cmpdf" ! 2918: [(set (cc0) (compare (match_operand:DF 0 "gen_reg_operand" "") ! 2919: (match_operand:DF 1 "gen_reg_operand" "")))] ! 2920: "" ! 2921: " ! 2922: { ! 2923: rs6000_compare_op0 = operands[0]; ! 2924: rs6000_compare_op1 = operands[1]; ! 2925: rs6000_compare_fp_p = 1; ! 2926: DONE; ! 2927: }") ! 2928: ! 2929: (define_expand "beq" ! 2930: [(set (match_dup 2) (match_dup 1)) ! 2931: (set (pc) ! 2932: (if_then_else (eq (match_dup 2) ! 2933: (const_int 0)) ! 2934: (label_ref (match_operand 0 "" "")) ! 2935: (pc)))] ! 2936: "" ! 2937: " ! 2938: { enum machine_mode mode = rs6000_compare_fp_p ? CCFPmode : CCmode; ! 2939: operands[1] = gen_rtx (COMPARE, mode, ! 2940: rs6000_compare_op0, rs6000_compare_op1); ! 2941: operands[2] = gen_reg_rtx (mode); ! 2942: }") ! 2943: ! 2944: (define_expand "bne" ! 2945: [(set (match_dup 2) (match_dup 1)) ! 2946: (set (pc) ! 2947: (if_then_else (ne (match_dup 2) ! 2948: (const_int 0)) ! 2949: (label_ref (match_operand 0 "" "")) ! 2950: (pc)))] ! 2951: "" ! 2952: " ! 2953: { enum machine_mode mode = rs6000_compare_fp_p ? CCFPmode : CCmode; ! 2954: operands[1] = gen_rtx (COMPARE, mode, ! 2955: rs6000_compare_op0, rs6000_compare_op1); ! 2956: operands[2] = gen_reg_rtx (mode); ! 2957: }") ! 2958: ! 2959: (define_expand "blt" ! 2960: [(set (match_dup 2) (match_dup 1)) ! 2961: (set (pc) ! 2962: (if_then_else (lt (match_dup 2) ! 2963: (const_int 0)) ! 2964: (label_ref (match_operand 0 "" "")) ! 2965: (pc)))] ! 2966: "" ! 2967: " ! 2968: { enum machine_mode mode = rs6000_compare_fp_p ? CCFPmode : CCmode; ! 2969: operands[1] = gen_rtx (COMPARE, mode, ! 2970: rs6000_compare_op0, rs6000_compare_op1); ! 2971: operands[2] = gen_reg_rtx (mode); ! 2972: }") ! 2973: ! 2974: (define_expand "bgt" ! 2975: [(set (match_dup 2) (match_dup 1)) ! 2976: (set (pc) ! 2977: (if_then_else (gt (match_dup 2) ! 2978: (const_int 0)) ! 2979: (label_ref (match_operand 0 "" "")) ! 2980: (pc)))] ! 2981: "" ! 2982: " ! 2983: { enum machine_mode mode = rs6000_compare_fp_p ? CCFPmode : CCmode; ! 2984: operands[1] = gen_rtx (COMPARE, mode, ! 2985: rs6000_compare_op0, rs6000_compare_op1); ! 2986: operands[2] = gen_reg_rtx (mode); ! 2987: }") ! 2988: ! 2989: (define_expand "ble" ! 2990: [(set (match_dup 2) (match_dup 1)) ! 2991: (set (pc) ! 2992: (if_then_else (le (match_dup 2) ! 2993: (const_int 0)) ! 2994: (label_ref (match_operand 0 "" "")) ! 2995: (pc)))] ! 2996: "" ! 2997: " ! 2998: { enum machine_mode mode = rs6000_compare_fp_p ? CCFPmode : CCmode; ! 2999: operands[1] = gen_rtx (COMPARE, mode, ! 3000: rs6000_compare_op0, rs6000_compare_op1); ! 3001: operands[2] = gen_reg_rtx (mode); ! 3002: }") ! 3003: ! 3004: (define_expand "bge" ! 3005: [(set (match_dup 2) (match_dup 1)) ! 3006: (set (pc) ! 3007: (if_then_else (ge (match_dup 2) ! 3008: (const_int 0)) ! 3009: (label_ref (match_operand 0 "" "")) ! 3010: (pc)))] ! 3011: "" ! 3012: " ! 3013: { enum machine_mode mode = rs6000_compare_fp_p ? CCFPmode : CCmode; ! 3014: operands[1] = gen_rtx (COMPARE, mode, ! 3015: rs6000_compare_op0, rs6000_compare_op1); ! 3016: operands[2] = gen_reg_rtx (mode); ! 3017: }") ! 3018: ! 3019: (define_expand "bgtu" ! 3020: [(set (match_dup 2) (match_dup 1)) ! 3021: (set (pc) ! 3022: (if_then_else (gtu (match_dup 2) ! 3023: (const_int 0)) ! 3024: (label_ref (match_operand 0 "" "")) ! 3025: (pc)))] ! 3026: "" ! 3027: " ! 3028: { operands[1] = gen_rtx (COMPARE, CCUNSmode, ! 3029: rs6000_compare_op0, rs6000_compare_op1); ! 3030: operands[2] = gen_reg_rtx (CCUNSmode); ! 3031: }") ! 3032: ! 3033: (define_expand "bltu" ! 3034: [(set (match_dup 2) (match_dup 1)) ! 3035: (set (pc) ! 3036: (if_then_else (ltu (match_dup 2) ! 3037: (const_int 0)) ! 3038: (label_ref (match_operand 0 "" "")) ! 3039: (pc)))] ! 3040: "" ! 3041: " ! 3042: { operands[1] = gen_rtx (COMPARE, CCUNSmode, ! 3043: rs6000_compare_op0, rs6000_compare_op1); ! 3044: operands[2] = gen_reg_rtx (CCUNSmode); ! 3045: }") ! 3046: ! 3047: (define_expand "bgeu" ! 3048: [(set (match_dup 2) (match_dup 1)) ! 3049: (set (pc) ! 3050: (if_then_else (geu (match_dup 2) ! 3051: (const_int 0)) ! 3052: (label_ref (match_operand 0 "" "")) ! 3053: (pc)))] ! 3054: "" ! 3055: " ! 3056: { operands[1] = gen_rtx (COMPARE, CCUNSmode, ! 3057: rs6000_compare_op0, rs6000_compare_op1); ! 3058: operands[2] = gen_reg_rtx (CCUNSmode); ! 3059: }") ! 3060: ! 3061: (define_expand "bleu" ! 3062: [(set (match_dup 2) (match_dup 1)) ! 3063: (set (pc) ! 3064: (if_then_else (leu (match_dup 2) ! 3065: (const_int 0)) ! 3066: (label_ref (match_operand 0 "" "")) ! 3067: (pc)))] ! 3068: "" ! 3069: " ! 3070: { operands[1] = gen_rtx (COMPARE, CCUNSmode, ! 3071: rs6000_compare_op0, rs6000_compare_op1); ! 3072: operands[2] = gen_reg_rtx (CCUNSmode); ! 3073: }") ! 3074: ! 3075: ;; For SNE, we would prefer that the xor/abs sequence be used for integers. ! 3076: ;; For SEQ, likewise, except that comparisons with zero should be done ! 3077: ;; with an scc insns. However, due to the order that combine see the ! 3078: ;; resulting insns, we must, in fact, allow SEQ for integers. Fail in ! 3079: ;; the cases we don't want to handle. ! 3080: (define_expand "seq" ! 3081: [(set (match_dup 2) (match_dup 1)) ! 3082: (set (match_operand:SI 0 "gen_reg_operand" "") ! 3083: (eq:SI (match_dup 2) (const_int 0)))] ! 3084: "" ! 3085: " ! 3086: { enum machine_mode mode = rs6000_compare_fp_p ? CCFPmode : CCmode; ! 3087: operands[1] = gen_rtx (COMPARE, mode, ! 3088: rs6000_compare_op0, rs6000_compare_op1); ! 3089: operands[2] = gen_reg_rtx (mode); ! 3090: }") ! 3091: ! 3092: (define_expand "sne" ! 3093: [(set (match_dup 2) (match_dup 1)) ! 3094: (set (match_operand:SI 0 "gen_reg_operand" "") ! 3095: (ne:SI (match_dup 2) (const_int 0)))] ! 3096: "" ! 3097: " ! 3098: { if (! rs6000_compare_fp_p) ! 3099: FAIL; ! 3100: ! 3101: operands[1] = gen_rtx (COMPARE, CCFPmode, ! 3102: rs6000_compare_op0, rs6000_compare_op1); ! 3103: operands[2] = gen_reg_rtx (CCFPmode); ! 3104: }") ! 3105: ! 3106: ;; A > 0 is best done using the portable sequence, so fail in that case. ! 3107: (define_expand "sgt" ! 3108: [(set (match_dup 2) (match_dup 1)) ! 3109: (set (match_operand:SI 0 "gen_reg_operand" "") ! 3110: (gt:SI (match_dup 2) (const_int 0)))] ! 3111: "" ! 3112: " ! 3113: { enum machine_mode mode = rs6000_compare_fp_p ? CCFPmode : CCmode; ! 3114: ! 3115: if (! rs6000_compare_fp_p && rs6000_compare_op1 == const0_rtx) ! 3116: FAIL; ! 3117: ! 3118: operands[1] = gen_rtx (COMPARE, mode, ! 3119: rs6000_compare_op0, rs6000_compare_op1); ! 3120: operands[2] = gen_reg_rtx (mode); ! 3121: }") ! 3122: ! 3123: ;; A < 0 is best done in the portable way for A an integer. ! 3124: (define_expand "slt" ! 3125: [(set (match_dup 2) (match_dup 1)) ! 3126: (set (match_operand:SI 0 "gen_reg_operand" "") ! 3127: (lt:SI (match_dup 2) (const_int 0)))] ! 3128: "" ! 3129: " ! 3130: { enum machine_mode mode = rs6000_compare_fp_p ? CCFPmode : CCmode; ! 3131: ! 3132: if (! rs6000_compare_fp_p && rs6000_compare_op1 == const0_rtx) ! 3133: FAIL; ! 3134: ! 3135: operands[1] = gen_rtx (COMPARE, mode, ! 3136: rs6000_compare_op0, rs6000_compare_op1); ! 3137: operands[2] = gen_reg_rtx (mode); ! 3138: }") ! 3139: ! 3140: (define_expand "sge" ! 3141: [(set (match_dup 2) (match_dup 1)) ! 3142: (set (match_operand:SI 0 "gen_reg_operand" "") ! 3143: (ge:SI (match_dup 2) (const_int 0)))] ! 3144: "" ! 3145: " ! 3146: { enum machine_mode mode = rs6000_compare_fp_p ? CCFPmode : CCmode; ! 3147: operands[1] = gen_rtx (COMPARE, mode, ! 3148: rs6000_compare_op0, rs6000_compare_op1); ! 3149: operands[2] = gen_reg_rtx (mode); ! 3150: }") ! 3151: ! 3152: ;; A <= 0 is best done the portable way for A an integer. ! 3153: (define_expand "sle" ! 3154: [(set (match_dup 2) (match_dup 1)) ! 3155: (set (match_operand:SI 0 "gen_reg_operand" "") ! 3156: (le:SI (match_dup 2) (const_int 0)))] ! 3157: "" ! 3158: " ! 3159: { enum machine_mode mode = rs6000_compare_fp_p ? CCFPmode : CCmode; ! 3160: ! 3161: if (! rs6000_compare_fp_p && rs6000_compare_op1 == const0_rtx) ! 3162: FAIL; ! 3163: ! 3164: operands[1] = gen_rtx (COMPARE, mode, ! 3165: rs6000_compare_op0, rs6000_compare_op1); ! 3166: operands[2] = gen_reg_rtx (mode); ! 3167: }") ! 3168: ! 3169: (define_expand "sgtu" ! 3170: [(set (match_dup 2) (match_dup 1)) ! 3171: (set (match_operand:SI 0 "gen_reg_operand" "") ! 3172: (gtu:SI (match_dup 2) (const_int 0)))] ! 3173: "" ! 3174: " ! 3175: { operands[1] = gen_rtx (COMPARE, CCUNSmode, ! 3176: rs6000_compare_op0, rs6000_compare_op1); ! 3177: operands[2] = gen_reg_rtx (CCUNSmode); ! 3178: }") ! 3179: ! 3180: (define_expand "sltu" ! 3181: [(set (match_dup 2) (match_dup 1)) ! 3182: (set (match_operand:SI 0 "gen_reg_operand" "") ! 3183: (ltu:SI (match_dup 2) (const_int 0)))] ! 3184: "" ! 3185: " ! 3186: { operands[1] = gen_rtx (COMPARE, CCUNSmode, ! 3187: rs6000_compare_op0, rs6000_compare_op1); ! 3188: operands[2] = gen_reg_rtx (CCUNSmode); ! 3189: }") ! 3190: ! 3191: (define_expand "sgeu" ! 3192: [(set (match_dup 2) (match_dup 1)) ! 3193: (set (match_operand:SI 0 "gen_reg_operand" "") ! 3194: (geu:SI (match_dup 2) (const_int 0)))] ! 3195: "" ! 3196: " ! 3197: { operands[1] = gen_rtx (COMPARE, CCUNSmode, ! 3198: rs6000_compare_op0, rs6000_compare_op1); ! 3199: operands[2] = gen_reg_rtx (CCUNSmode); ! 3200: }") ! 3201: ! 3202: (define_expand "sleu" ! 3203: [(set (match_dup 2) (match_dup 1)) ! 3204: (set (match_operand:SI 0 "gen_reg_operand" "") ! 3205: (leu:SI (match_dup 2) (const_int 0)))] ! 3206: "" ! 3207: " ! 3208: { operands[1] = gen_rtx (COMPARE, CCUNSmode, ! 3209: rs6000_compare_op0, rs6000_compare_op1); ! 3210: operands[2] = gen_reg_rtx (CCUNSmode); ! 3211: }") ! 3212: ! 3213: ;; Here are the actual compare insns. ! 3214: (define_insn "" ! 3215: [(set (match_operand:CC 0 "cc_reg_operand" "=y") ! 3216: (compare:CC (match_operand:SI 1 "gen_reg_operand" "r") ! 3217: (match_operand:SI 2 "reg_or_short_operand" "rI")))] ! 3218: "" ! 3219: "cmp%I2 %0,%1,%2" ! 3220: [(set_attr "type" "compare")]) ! 3221: ! 3222: (define_insn "" ! 3223: [(set (match_operand:CCUNS 0 "cc_reg_operand" "=y") ! 3224: (compare:CCUNS (match_operand:SI 1 "gen_reg_operand" "r") ! 3225: (match_operand:SI 2 "reg_or_u_short_operand" "rI")))] ! 3226: "" ! 3227: "cmpl%I2 %0,%1,%W2" ! 3228: [(set_attr "type" "compare")]) ! 3229: ! 3230: ;; The following two insns don't exist as single insns, but if we provide ! 3231: ;; them, we can swap an add and compare, which will enable us to overlap more ! 3232: ;; of the required delay between a compare and branch. We generate code for ! 3233: ;; them by splitting. ! 3234: ! 3235: (define_insn "" ! 3236: [(set (match_operand:CC 3 "cc_reg_operand" "=y") ! 3237: (compare:CC (match_operand:SI 1 "gen_reg_operand" "r") ! 3238: (match_operand:SI 2 "short_cint_operand" "i"))) ! 3239: (set (match_operand:SI 0 "gen_reg_operand" "=r") ! 3240: (plus:SI (match_dup 1) (match_operand:SI 4 "short_cint_operand" "i")))] ! 3241: "" ! 3242: "#") ! 3243: ! 3244: (define_insn "" ! 3245: [(set (match_operand:CCUNS 3 "cc_reg_operand" "=y") ! 3246: (compare:CCUNS (match_operand:SI 1 "gen_reg_operand" "r") ! 3247: (match_operand:SI 2 "u_short_cint_operand" "i"))) ! 3248: (set (match_operand:SI 0 "gen_reg_operand" "=r") ! 3249: (plus:SI (match_dup 1) (match_operand:SI 4 "short_cint_operand" "i")))] ! 3250: "" ! 3251: "#") ! 3252: ! 3253: (define_split ! 3254: [(set (match_operand:CC 3 "cc_reg_operand" "") ! 3255: (compare:CC (match_operand:SI 1 "gen_reg_operand" "") ! 3256: (match_operand:SI 2 "short_cint_operand" ""))) ! 3257: (set (match_operand:SI 0 "gen_reg_operand" "") ! 3258: (plus:SI (match_dup 1) (match_operand:SI 4 "short_cint_operand" "")))] ! 3259: "" ! 3260: [(set (match_dup 3) (compare:CC (match_dup 1) (match_dup 2))) ! 3261: (set (match_dup 0) (plus:SI (match_dup 1) (match_dup 4)))]) ! 3262: ! 3263: (define_split ! 3264: [(set (match_operand:CCUNS 3 "cc_reg_operand" "") ! 3265: (compare:CCUNS (match_operand:SI 1 "gen_reg_operand" "") ! 3266: (match_operand:SI 2 "u_short_cint_operand" ""))) ! 3267: (set (match_operand:SI 0 "gen_reg_operand" "") ! 3268: (plus:SI (match_dup 1) (match_operand:SI 4 "short_cint_operand" "")))] ! 3269: "" ! 3270: [(set (match_dup 3) (compare:CCUNS (match_dup 1) (match_dup 2))) ! 3271: (set (match_dup 0) (plus:SI (match_dup 1) (match_dup 4)))]) ! 3272: ! 3273: (define_insn "" ! 3274: [(set (match_operand:CCFP 0 "cc_reg_operand" "=y") ! 3275: (compare:CCFP (match_operand:SF 1 "gen_reg_operand" "f") ! 3276: (match_operand:SF 2 "gen_reg_operand" "f")))] ! 3277: "" ! 3278: "fcmpu %0,%1,%2" ! 3279: [(set_attr "type" "fpcompare")]) ! 3280: ! 3281: (define_insn "" ! 3282: [(set (match_operand:CCFP 0 "cc_reg_operand" "=y") ! 3283: (compare:CCFP (match_operand:DF 1 "gen_reg_operand" "f") ! 3284: (match_operand:DF 2 "gen_reg_operand" "f")))] ! 3285: "" ! 3286: "fcmpu %0,%1,%2" ! 3287: [(set_attr "type" "fpcompare")]) ! 3288: ! 3289: ;; Now we have the scc insns. We can do some combinations because of the ! 3290: ;; way the machine works. ! 3291: ;; ! 3292: ;; Note that this is probably faster if we can put an insn between the ! 3293: ;; mfcr and rlinm, but this is tricky. Let's leave it for now. ! 3294: (define_insn "" ! 3295: [(set (match_operand:SI 0 "gen_reg_operand" "=r") ! 3296: (match_operator:SI 1 "scc_comparison_operator" ! 3297: [(match_operand 2 "cc_reg_operand" "y") ! 3298: (const_int 0)]))] ! 3299: "" ! 3300: "%D1mfcr %0\;rlinm %0,%0,%J1,31,31") ! 3301: ! 3302: (define_insn "" ! 3303: [(set (match_operand:CC 0 "cc_reg_operand" "=x") ! 3304: (compare:CC (match_operator:SI 1 "scc_comparison_operator" ! 3305: [(match_operand 2 "cc_reg_operand" "y") ! 3306: (const_int 0)]) ! 3307: (const_int 0))) ! 3308: (set (match_operand:SI 3 "gen_reg_operand" "=r") ! 3309: (match_op_dup 1 [(match_dup 2) (const_int 0)]))] ! 3310: "" ! 3311: "%D1mfcr %3\;rlinm. %3,%3,%J1,30,31" ! 3312: [(set_attr "type" "delayed_compare")]) ! 3313: ! 3314: (define_insn "" ! 3315: [(set (match_operand:SI 0 "gen_reg_operand" "=r") ! 3316: (ashift:SI (match_operator:SI 1 "scc_comparison_operator" ! 3317: [(match_operand 2 "cc_reg_operand" "y") ! 3318: (const_int 0)]) ! 3319: (match_operand:SI 3 "const_int_operand" "n")))] ! 3320: "" ! 3321: "* ! 3322: { ! 3323: int is_bit = ccr_bit (operands[1], 1); ! 3324: int put_bit = 31 - (INTVAL (operands[3]) & 31); ! 3325: int count; ! 3326: ! 3327: if (is_bit >= put_bit) ! 3328: count = is_bit - put_bit; ! 3329: else ! 3330: count = 32 - (put_bit - is_bit); ! 3331: ! 3332: operands[4] = gen_rtx (CONST_INT, VOIDmode, count); ! 3333: operands[5] = gen_rtx (CONST_INT, VOIDmode, put_bit); ! 3334: ! 3335: return \"%D1mfcr %0\;rlinm %0,%0,%4,%5,%5\"; ! 3336: }") ! 3337: ! 3338: (define_insn "" ! 3339: [(set (match_operand:CC 0 "cc_reg_operand" "=x") ! 3340: (compare:CC ! 3341: (ashift:SI (match_operator:SI 1 "scc_comparison_operator" ! 3342: [(match_operand 2 "cc_reg_operand" "y") ! 3343: (const_int 0)]) ! 3344: (match_operand:SI 3 "const_int_operand" "n")) ! 3345: (const_int 0))) ! 3346: (set (match_operand:SI 4 "gen_reg_operand" "=r") ! 3347: (ashift:SI (match_op_dup 1 [(match_dup 2) (const_int 0)]) ! 3348: (match_dup 3)))] ! 3349: "" ! 3350: "* ! 3351: { ! 3352: int is_bit = ccr_bit (operands[1], 1); ! 3353: int put_bit = 31 - (INTVAL (operands[3]) & 31); ! 3354: int count; ! 3355: ! 3356: if (is_bit >= put_bit) ! 3357: count = is_bit - put_bit; ! 3358: else ! 3359: count = 32 - (put_bit - is_bit); ! 3360: ! 3361: operands[5] = gen_rtx (CONST_INT, VOIDmode, count); ! 3362: operands[6] = gen_rtx (CONST_INT, VOIDmode, put_bit); ! 3363: ! 3364: return \"%D1mfcr %4\;rlinm. %4,%4,%5,%6,%6\"; ! 3365: }" ! 3366: [(set_attr "type" "delayed_compare")]) ! 3367: ! 3368: ;; There are some scc insns that can be done directly, without a compare. ! 3369: ;; These are faster because they don't involve the communications between ! 3370: ;; the FXU and branch units. In fact, we will be replacing all of the ! 3371: ;; integer scc insns here or in the portable methods in emit_store_flag. ! 3372: ;; ! 3373: ;; Also support (neg (scc ..)) since that construct is used to replace ! 3374: ;; branches, (plus (scc ..) ..) since that construct is common and ! 3375: ;; takes no more insns than scc, and (and (neg (scc ..)) ..) in the ! 3376: ;; cases where it is no more expensive than (neg (scc ..)). ! 3377: ! 3378: ;; Have reload force a constant into a register for the simple insns that ! 3379: ;; otherwise won't accept constants. We do this because it is faster than ! 3380: ;; the cmp/mfcr sequence we would otherwise generate. ! 3381: ! 3382: (define_insn "" ! 3383: [(set (match_operand:SI 0 "gen_reg_operand" "=r,r,r,r,r") ! 3384: (eq:SI (match_operand:SI 1 "gen_reg_operand" "%r,r,r,r,r") ! 3385: (match_operand:SI 2 "reg_or_cint_operand" "r,O,K,J,I"))) ! 3386: (clobber (match_scratch:SI 3 "=r,&r,r,r,r"))] ! 3387: "" ! 3388: "@ ! 3389: xor %0,%1,%2\;sfi %3,%0,0\;ae %0,%3,%0 ! 3390: sfi %3,%1,0\;ae %0,%3,%1 ! 3391: xoril %0,%1,%b2\;sfi %3,%0,0\;ae %0,%3,%0 ! 3392: xoriu %0,%1,%u2\;sfi %3,%0,0\;ae %0,%3,%0 ! 3393: sfi %0,%1,%2\;sfi %3,%0,0\;ae %0,%3,%0") ! 3394: ! 3395: (define_insn "" ! 3396: [(set (match_operand:CC 4 "cc_reg_operand" "=x,x,x,x,x") ! 3397: (compare:CC ! 3398: (eq:SI (match_operand:SI 1 "gen_reg_operand" "%r,r,r,r,r") ! 3399: (match_operand:SI 2 "reg_or_cint_operand" "r,O,K,J,I")) ! 3400: (const_int 0))) ! 3401: (set (match_operand:SI 0 "gen_reg_operand" "=r,r,r,r,r") ! 3402: (eq:SI (match_dup 1) (match_dup 2))) ! 3403: (clobber (match_scratch:SI 3 "=r,&r,r,r,r"))] ! 3404: "" ! 3405: "@ ! 3406: xor %0,%1,%2\;sfi %3,%0,0\;ae. %0,%3,%0 ! 3407: sfi %3,%1,0\;ae. %0,%3,%1 ! 3408: xoril %0,%1,%b2\;sfi %3,%0,0\;ae. %0,%3,%0 ! 3409: xoriu %0,%1,%u2\;sfi %3,%0,0\;ae. %0,%3,%0 ! 3410: sfi %0,%1,%2\;sfi %3,%0,0\;ae. %0,%3,%0" ! 3411: [(set_attr "type" "compare")]) ! 3412: ! 3413: (define_insn "" ! 3414: [(set (match_operand:SI 0 "gen_reg_operand" "=r,r,r,r,r") ! 3415: (plus:SI (eq:SI (match_operand:SI 1 "gen_reg_operand" "%r,r,r,r,r") ! 3416: (match_operand:SI 2 "reg_or_cint_operand" "r,O,K,J,I")) ! 3417: (match_operand:SI 3 "gen_reg_operand" "r,r,r,r,r"))) ! 3418: (clobber (match_scratch:SI 4 "=&r,&r,&r,&r,&r"))] ! 3419: "" ! 3420: "@ ! 3421: xor %4,%1,%2\;sfi %4,%4,0\;aze %0,%3 ! 3422: sfi %4,%1,0\;aze %0,%3 ! 3423: xoril %4,%1,%b2\;sfi %4,%4,0\;aze %0,%3 ! 3424: xoriu %4,%1,%u2\;sfi %4,%4,0\;aze %0,%3 ! 3425: sfi %4,%1,%2\;sfi %4,%4,0\;aze %0,%3") ! 3426: ! 3427: (define_insn "" ! 3428: [(set (match_operand:CC 0 "cc_reg_operand" "=x,x,x,x,x") ! 3429: (compare:CC ! 3430: (plus:SI ! 3431: (eq:SI (match_operand:SI 1 "gen_reg_operand" "%r,r,r,r,r") ! 3432: (match_operand:SI 2 "reg_or_cint_operand" "r,O,K,J,I")) ! 3433: (match_operand:SI 3 "gen_reg_operand" "r,r,r,r,r")) ! 3434: (const_int 0))) ! 3435: (clobber (match_scratch:SI 4 "=&r,&r,&r,&r,&r"))] ! 3436: "" ! 3437: "@ ! 3438: xor %4,%1,%2\;sfi %4,%4,0\;aze. %4,%3 ! 3439: sfi %4,%1,0\;aze. %0,%3 ! 3440: xoril %4,%1,%b2\;sfi %4,%4,0\;aze. %4,%3 ! 3441: xoriu %4,%1,%u2\;sfi %4,%4,0\;aze. %4,%3 ! 3442: sfi %4,%1,%2\;sfi %4,%4,0\;aze. %4,%3" ! 3443: [(set_attr "type" "compare")]) ! 3444: ! 3445: (define_insn "" ! 3446: [(set (match_operand:CC 5 "cc_reg_operand" "=x,x,x,x,x") ! 3447: (compare:CC ! 3448: (plus:SI ! 3449: (eq:SI (match_operand:SI 1 "gen_reg_operand" "%r,r,r,r,r") ! 3450: (match_operand:SI 2 "reg_or_cint_operand" "r,O,K,J,I")) ! 3451: (match_operand:SI 3 "gen_reg_operand" "r,r,r,r,r")) ! 3452: (const_int 0))) ! 3453: (set (match_operand:SI 0 "gen_reg_operand" "=r,r,r,r,r") ! 3454: (plus:SI (eq:SI (match_dup 1) (match_dup 2)) (match_dup 3))) ! 3455: (clobber (match_scratch:SI 4 "=&r,&r,&r,&r,&r"))] ! 3456: "" ! 3457: "@ ! 3458: xor %4,%1,%2\;sfi %4,%4,0\;aze. %0,%3 ! 3459: sfi %4,%1,0\;aze. %4,%3 ! 3460: xoril %4,%1,%b2\;sfi %4,%4,0\;aze. %0,%3 ! 3461: xoriu %4,%1,%u2\;sfi %4,%4,0\;aze. %0,%3 ! 3462: sfi %4,%1,%2\;sfi %4,%4,0\;aze. %0,%3" ! 3463: [(set_attr "type" "compare")]) ! 3464: ! 3465: (define_insn "" ! 3466: [(set (match_operand:SI 0 "gen_reg_operand" "=r,r,r,r,r") ! 3467: (neg:SI (eq:SI (match_operand:SI 1 "gen_reg_operand" "r,r,r,r,r") ! 3468: (match_operand:SI 2 "reg_or_cint_operand" "r,O,K,J,I"))))] ! 3469: "" ! 3470: "@ ! 3471: xor %0,%1,%2\;ai %0,%0,-1\;sfe %0,%0,%0 ! 3472: ai %0,%1,-1\;sfe %0,%0,%0 ! 3473: xoril %0,%1,%b2\;ai %0,%0,-1\;sfe %0,%0,%0 ! 3474: xoriu %0,%1,%u2\;ai %0,%0,-1\;sfe %0,%0,%0 ! 3475: sfi %0,%1,%2\;ai %0,%0,-1\;sfe %0,%0,%0") ! 3476: ! 3477: ;; This is what (plus (ne X (const_int 0)) Y) looks like. ! 3478: (define_insn "" ! 3479: [(set (match_operand:SI 0 "gen_reg_operand" "=r") ! 3480: (plus:SI (lshiftrt:SI ! 3481: (neg:SI (abs:SI (match_operand:SI 1 "gen_reg_operand" "r"))) ! 3482: (const_int 31)) ! 3483: (match_operand:SI 2 "gen_reg_operand" "r"))) ! 3484: (clobber (match_scratch:SI 3 "=&r"))] ! 3485: "" ! 3486: "ai %3,%1,-1\;aze %0,%2") ! 3487: ! 3488: (define_insn "" ! 3489: [(set (match_operand:CC 0 "cc_reg_operand" "=x") ! 3490: (compare:CC ! 3491: (plus:SI (lshiftrt:SI ! 3492: (neg:SI (abs:SI (match_operand:SI 1 "gen_reg_operand" "r"))) ! 3493: (const_int 31)) ! 3494: (match_operand:SI 2 "gen_reg_operand" "r")) ! 3495: (const_int 0))) ! 3496: (clobber (match_scratch:SI 3 "=&r"))] ! 3497: "" ! 3498: "ai %3,%1,-1\;aze. %3,%2" ! 3499: [(set_attr "type" "compare")]) ! 3500: ! 3501: (define_insn "" ! 3502: [(set (match_operand:CC 4 "cc_reg_operand" "=x") ! 3503: (compare:CC ! 3504: (plus:SI (lshiftrt:SI ! 3505: (neg:SI (abs:SI (match_operand:SI 1 "gen_reg_operand" "r"))) ! 3506: (const_int 31)) ! 3507: (match_operand:SI 2 "gen_reg_operand" "r")) ! 3508: (const_int 0))) ! 3509: (set (match_operand:SI 0 "gen_reg_operand" "=r") ! 3510: (plus:SI (lshiftrt:SI (neg:SI (abs:SI (match_dup 1))) (const_int 31)) ! 3511: (match_dup 2))) ! 3512: (clobber (match_scratch:SI 3 "=&r"))] ! 3513: "" ! 3514: "ai %3,%1,-1\;aze. %0,%2" ! 3515: [(set_attr "type" "compare")]) ! 3516: ! 3517: (define_insn "" ! 3518: [(set (match_operand:SI 0 "gen_reg_operand" "=r,r") ! 3519: (le:SI (match_operand:SI 1 "gen_reg_operand" "r,r") ! 3520: (match_operand:SI 2 "reg_or_short_operand" "r,O"))) ! 3521: (clobber (match_scratch:SI 3 "=r,X"))] ! 3522: "" ! 3523: "@ ! 3524: doz %3,%2,%1\;sfi %0,%3,0\;ae %0,%0,%3 ! 3525: ai %0,%1,-1\;aze %0,%0\;sri %0,%0,31") ! 3526: ! 3527: (define_insn "" ! 3528: [(set (match_operand:CC 4 "cc_reg_operand" "=x,x") ! 3529: (compare:CC ! 3530: (le:SI (match_operand:SI 1 "gen_reg_operand" "r,r") ! 3531: (match_operand:SI 2 "reg_or_short_operand" "r,O")) ! 3532: (const_int 0))) ! 3533: (set (match_operand:SI 0 "gen_reg_operand" "=r,r") ! 3534: (le:SI (match_dup 1) (match_dup 2))) ! 3535: (clobber (match_scratch:SI 3 "=r,X"))] ! 3536: "" ! 3537: "@ ! 3538: doz %3,%2,%1\;sfi %0,%3,0\;ae. %0,%0,%3 ! 3539: ai %0,%1,-1\;aze %0,%0\;sri. %0,%0,31" ! 3540: [(set_attr "type" "delayed_compare,compare")]) ! 3541: ! 3542: (define_insn "" ! 3543: [(set (match_operand:SI 0 "gen_reg_operand" "=r,r") ! 3544: (plus:SI (le:SI (match_operand:SI 1 "gen_reg_operand" "r,r") ! 3545: (match_operand:SI 2 "reg_or_short_operand" "r,O")) ! 3546: (match_operand:SI 3 "gen_reg_operand" "r,r"))) ! 3547: (clobber (match_scratch:SI 4 "=&r,&r"))] ! 3548: "" ! 3549: "@ ! 3550: doz %4,%2,%1\;sfi %4,%4,0\;aze %0,%3 ! 3551: srai %4,%1,31\;sf %4,%1,%4\;aze %0,%3") ! 3552: ! 3553: (define_insn "" ! 3554: [(set (match_operand:CC 0 "cc_reg_operand" "=x,x") ! 3555: (compare:CC ! 3556: (plus:SI (le:SI (match_operand:SI 1 "gen_reg_operand" "r,r") ! 3557: (match_operand:SI 2 "reg_or_short_operand" "r,O")) ! 3558: (match_operand:SI 3 "gen_reg_operand" "r,r")) ! 3559: (const_int 0))) ! 3560: (clobber (match_scratch:SI 4 "=&r,&r"))] ! 3561: "" ! 3562: "@ ! 3563: doz %4,%2,%1\;sfi %4,%4,0\;aze. %4,%3 ! 3564: srai %4,%1,31\;sf %4,%1,%4\;aze. %4,%3" ! 3565: [(set_attr "type" "compare")]) ! 3566: ! 3567: (define_insn "" ! 3568: [(set (match_operand:CC 5 "cc_reg_operand" "=x,x") ! 3569: (compare:CC ! 3570: (plus:SI (le:SI (match_operand:SI 1 "gen_reg_operand" "r,r") ! 3571: (match_operand:SI 2 "reg_or_short_operand" "r,O")) ! 3572: (match_operand:SI 3 "gen_reg_operand" "r,r")) ! 3573: (const_int 0))) ! 3574: (set (match_operand:SI 0 "gen_reg_operand" "=r,r") ! 3575: (plus:SI (le:SI (match_dup 1) (match_dup 2)) (match_dup 3))) ! 3576: (clobber (match_scratch:SI 4 "=&r,&r"))] ! 3577: "" ! 3578: "@ ! 3579: doz %4,%2,%1\;sfi %4,%4,0\;aze. %0,%3 ! 3580: srai %4,%1,31\;sf %4,%1,%4\;aze. %0,%3" ! 3581: [(set_attr "type" "compare")]) ! 3582: ! 3583: (define_insn "" ! 3584: [(set (match_operand:SI 0 "gen_reg_operand" "=r,r") ! 3585: (neg:SI (le:SI (match_operand:SI 1 "gen_reg_operand" "r,r") ! 3586: (match_operand:SI 2 "reg_or_short_operand" "r,O"))))] ! 3587: "" ! 3588: "@ ! 3589: doz %0,%2,%1\;ai %0,%0,-1\;sfe %0,%0,%0 ! 3590: ai %0,%1,-1\;aze %0,%0\;srai %0,%0,31") ! 3591: ! 3592: (define_insn "" ! 3593: [(set (match_operand:SI 0 "gen_reg_operand" "=r") ! 3594: (leu:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 3595: (match_operand:SI 2 "reg_or_short_operand" "rI")))] ! 3596: "" ! 3597: "sf%I2 %0,%1,%2\;cal %0,0(0)\;ae %0,%0,%0") ! 3598: ! 3599: (define_insn "" ! 3600: [(set (match_operand:CC 3 "cc_reg_operand" "=x") ! 3601: (compare:CC ! 3602: (leu:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 3603: (match_operand:SI 2 "reg_or_short_operand" "rI")) ! 3604: (const_int 0))) ! 3605: (set (match_operand:SI 0 "gen_reg_operand" "=r") ! 3606: (leu:SI (match_dup 1) (match_dup 2)))] ! 3607: "" ! 3608: "sf%I2 %0,%1,%2\;cal %0,0(0)\;ae. %0,%0,%0" ! 3609: [(set_attr "type" "compare")]) ! 3610: ! 3611: (define_insn "" ! 3612: [(set (match_operand:SI 0 "gen_reg_operand" "=r") ! 3613: (plus:SI (leu:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 3614: (match_operand:SI 2 "reg_or_short_operand" "rI")) ! 3615: (match_operand:SI 3 "gen_reg_operand" "r"))) ! 3616: (clobber (match_scratch:SI 4 "=&r"))] ! 3617: "" ! 3618: "sf%I2 %4,%1,%2\;aze %0,%3") ! 3619: ! 3620: (define_insn "" ! 3621: [(set (match_operand:CC 0 "cc_reg_operand" "=x") ! 3622: (compare:CC ! 3623: (plus:SI (leu:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 3624: (match_operand:SI 2 "reg_or_short_operand" "rI")) ! 3625: (match_operand:SI 3 "gen_reg_operand" "r")) ! 3626: (const_int 0))) ! 3627: (clobber (match_scratch:SI 4 "=&r"))] ! 3628: "" ! 3629: "sf%I2 %4,%1,%2\;aze. %4,%3" ! 3630: [(set_attr "type" "compare")]) ! 3631: ! 3632: (define_insn "" ! 3633: [(set (match_operand:CC 5 "cc_reg_operand" "=x") ! 3634: (compare:CC ! 3635: (plus:SI (leu:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 3636: (match_operand:SI 2 "reg_or_short_operand" "rI")) ! 3637: (match_operand:SI 3 "gen_reg_operand" "r")) ! 3638: (const_int 0))) ! 3639: (set (match_operand:SI 0 "gen_reg_operand" "=r") ! 3640: (plus:SI (leu:SI (match_dup 1) (match_dup 2)) (match_dup 3))) ! 3641: (clobber (match_scratch:SI 4 "=&r"))] ! 3642: "" ! 3643: "sf%I2 %4,%1,%2\;aze. %0,%3" ! 3644: [(set_attr "type" "compare")]) ! 3645: ! 3646: (define_insn "" ! 3647: [(set (match_operand:SI 0 "gen_reg_operand" "=r") ! 3648: (neg:SI (leu:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 3649: (match_operand:SI 2 "reg_or_short_operand" "rI"))))] ! 3650: "" ! 3651: "sf%I2 %0,%1,%2\;sfe %0,%0,%0\;nand %0,%0,%0") ! 3652: ! 3653: (define_insn "" ! 3654: [(set (match_operand:SI 0 "gen_reg_operand" "=r") ! 3655: (and:SI (neg:SI ! 3656: (leu:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 3657: (match_operand:SI 2 "reg_or_short_operand" "rI"))) ! 3658: (match_operand:SI 3 "gen_reg_operand" "r"))) ! 3659: (clobber (match_scratch:SI 4 "=&r"))] ! 3660: "" ! 3661: "sf%I2 %4,%1,%2\;sfe %4,%4,%4\;andc %0,%3,%4") ! 3662: ! 3663: (define_insn "" ! 3664: [(set (match_operand:CC 0 "cc_reg_operand" "=x") ! 3665: (compare:CC ! 3666: (and:SI (neg:SI ! 3667: (leu:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 3668: (match_operand:SI 2 "reg_or_short_operand" "rI"))) ! 3669: (match_operand:SI 3 "gen_reg_operand" "r")) ! 3670: (const_int 0))) ! 3671: (clobber (match_scratch:SI 4 "=&r"))] ! 3672: "" ! 3673: "sf%I2 %4,%1,%2\;sfe %4,%4,%4\;andc. %4,%3,%4" ! 3674: [(set_attr "type" "compare")]) ! 3675: ! 3676: (define_insn "" ! 3677: [(set (match_operand:CC 5 "cc_reg_operand" "=x") ! 3678: (compare:CC ! 3679: (and:SI (neg:SI ! 3680: (leu:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 3681: (match_operand:SI 2 "reg_or_short_operand" "rI"))) ! 3682: (match_operand:SI 3 "gen_reg_operand" "r")) ! 3683: (const_int 0))) ! 3684: (set (match_operand:SI 0 "gen_reg_operand" "=r") ! 3685: (and:SI (neg:SI (leu:SI (match_dup 1) (match_dup 2))) (match_dup 3))) ! 3686: (clobber (match_scratch:SI 4 "=&r"))] ! 3687: "" ! 3688: "sf%I2 %4,%1,%2\;sfe %4,%4,%4\;andc. %0,%3,%4" ! 3689: [(set_attr "type" "compare")]) ! 3690: ! 3691: (define_insn "" ! 3692: [(set (match_operand:SI 0 "gen_reg_operand" "=r") ! 3693: (lt:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 3694: (match_operand:SI 2 "reg_or_short_operand" "rI")))] ! 3695: "" ! 3696: "doz%I2 %0,%1,%2\;nabs %0,%0\;sri %0,%0,31") ! 3697: ! 3698: (define_insn "" ! 3699: [(set (match_operand:SI 3 "cc_reg_operand" "=x") ! 3700: (compare:CC ! 3701: (lt:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 3702: (match_operand:SI 2 "reg_or_short_operand" "rI")) ! 3703: (const_int 0))) ! 3704: (set (match_operand:SI 0 "gen_reg_operand" "=r") ! 3705: (lt:SI (match_dup 1) (match_dup 2)))] ! 3706: "" ! 3707: "doz%I2 %0,%1,%2\;nabs %0,%0\;sri. %0,%0,31" ! 3708: [(set_attr "type" "delayed_compare")]) ! 3709: ! 3710: (define_insn "" ! 3711: [(set (match_operand:SI 0 "gen_reg_operand" "=r") ! 3712: (plus:SI (lt:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 3713: (match_operand:SI 2 "reg_or_short_operand" "rI")) ! 3714: (match_operand:SI 3 "gen_reg_operand" "r"))) ! 3715: (clobber (match_scratch:SI 4 "=&r"))] ! 3716: "" ! 3717: "doz%I2 %4,%1,%2\;ai %4,%4,-1\;aze %0,%3") ! 3718: ! 3719: (define_insn "" ! 3720: [(set (match_operand:SI 0 "cc_reg_operand" "=x") ! 3721: (compare:CC ! 3722: (plus:SI (lt:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 3723: (match_operand:SI 2 "reg_or_short_operand" "rI")) ! 3724: (match_operand:SI 3 "gen_reg_operand" "r")) ! 3725: (const_int 0))) ! 3726: (clobber (match_scratch:SI 4 "=&r"))] ! 3727: "" ! 3728: "doz%I2 %4,%1,%2\;ai %4,%4,-1\;aze. %4,%3" ! 3729: [(set_attr "type" "compare")]) ! 3730: ! 3731: (define_insn "" ! 3732: [(set (match_operand:SI 5 "cc_reg_operand" "=x") ! 3733: (compare:CC ! 3734: (plus:SI (lt:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 3735: (match_operand:SI 2 "reg_or_short_operand" "rI")) ! 3736: (match_operand:SI 3 "gen_reg_operand" "r")) ! 3737: (const_int 0))) ! 3738: (set (match_operand:SI 0 "gen_reg_operand" "=r") ! 3739: (plus:SI (lt:SI (match_dup 1) (match_dup 2)) (match_dup 3))) ! 3740: (clobber (match_scratch:SI 4 "=&r"))] ! 3741: "" ! 3742: "doz%I2 %4,%1,%2\;ai %4,%4,-1\;aze. %0,%3" ! 3743: [(set_attr "type" "compare")]) ! 3744: ! 3745: (define_insn "" ! 3746: [(set (match_operand:SI 0 "gen_reg_operand" "=r") ! 3747: (neg:SI (lt:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 3748: (match_operand:SI 2 "reg_or_short_operand" "rI"))))] ! 3749: "" ! 3750: "doz%I2 %0,%1,%2\;nabs %0,%0\;srai %0,%0,31") ! 3751: ! 3752: (define_insn "" ! 3753: [(set (match_operand:SI 0 "gen_reg_operand" "=r,r") ! 3754: (ltu:SI (match_operand:SI 1 "gen_reg_operand" "r,r") ! 3755: (match_operand:SI 2 "reg_or_neg_short_operand" "r,P")))] ! 3756: "" ! 3757: "@ ! 3758: sf %0,%2,%1\;sfe %0,%0,%0\;neg %0,%0 ! 3759: ai %0,%1,%n2\;sfe %0,%0,%0\;neg %0,%0") ! 3760: ! 3761: (define_insn "" ! 3762: [(set (match_operand:CC 3 "cc_reg_operand" "=x,x") ! 3763: (compare:CC ! 3764: (ltu:SI (match_operand:SI 1 "gen_reg_operand" "r,r") ! 3765: (match_operand:SI 2 "reg_or_neg_short_operand" "r,P")) ! 3766: (const_int 0))) ! 3767: (set (match_operand:SI 0 "gen_reg_operand" "=r,r") ! 3768: (ltu:SI (match_dup 1) (match_dup 2)))] ! 3769: "" ! 3770: "@ ! 3771: sf %0,%2,%1\;sfe %0,%0,%0\;neg. %0,%0 ! 3772: ai %0,%1,%n2\;sfe %0,%0,%0\;neg. %0,%0" ! 3773: [(set_attr "type" "compare")]) ! 3774: ! 3775: (define_insn "" ! 3776: [(set (match_operand:SI 0 "gen_reg_operand" "=r,r,r,r") ! 3777: (plus:SI (ltu:SI (match_operand:SI 1 "gen_reg_operand" "r,r,r,r") ! 3778: (match_operand:SI 2 "reg_or_neg_short_operand" "r,r,P,P")) ! 3779: (match_operand:SI 3 "reg_or_short_operand" "r,I,r,I"))) ! 3780: (clobber (match_scratch:SI 4 "=&r,r,&r,r"))] ! 3781: "" ! 3782: "@ ! 3783: sf %4,%2,%1\;sfe %4,%4,%4\;sf%I3 %0,%4,%3 ! 3784: sf %4,%2,%1\;sfe %4,%4,%4\;sf%I3 %0,%4,%3 ! 3785: ai %4,%1,%n2\;sfe %4,%4,%4\;sf%I3 %0,%4,%3 ! 3786: ai %4,%1,%n2\;sfe %4,%4,%4\;sf%I3 %0,%4,%3") ! 3787: ! 3788: (define_insn "" ! 3789: [(set (match_operand:CC 0 "cc_reg_operand" "=x,x,x,x") ! 3790: (compare:CC ! 3791: (plus:SI (ltu:SI (match_operand:SI 1 "gen_reg_operand" "r,r,r,r") ! 3792: (match_operand:SI 2 "reg_or_neg_short_operand" "r,r,P,P")) ! 3793: (match_operand:SI 3 "reg_or_short_operand" "r,I,r,I")) ! 3794: (const_int 0))) ! 3795: (clobber (match_scratch:SI 4 "=&r,r,&r,r"))] ! 3796: "" ! 3797: "@ ! 3798: sf %4,%2,%1\;sfe %4,%4,%4\;sf%I3. %4,%4,%3 ! 3799: sf %4,%2,%1\;sfe %4,%4,%4\;sf%I3. %4,%4,%3 ! 3800: ai %4,%1,%n2\;sfe %4,%4,%4\;sf%I3. %4,%4,%3 ! 3801: ai %4,%1,%n2\;sfe %4,%4,%4\;sf%I3. %4,%4,%3" ! 3802: [(set_attr "type" "compare")]) ! 3803: ! 3804: (define_insn "" ! 3805: [(set (match_operand:CC 5 "cc_reg_operand" "=x,x,x,x") ! 3806: (compare:CC ! 3807: (plus:SI (ltu:SI (match_operand:SI 1 "gen_reg_operand" "r,r,r,r") ! 3808: (match_operand:SI 2 "reg_or_neg_short_operand" "r,r,P,P")) ! 3809: (match_operand:SI 3 "reg_or_short_operand" "r,I,r,I")) ! 3810: (const_int 0))) ! 3811: (set (match_operand:SI 0 "gen_reg_operand" "=r,r,r,r") ! 3812: (plus:SI (ltu:SI (match_dup 1) (match_dup 2)) (match_dup 3))) ! 3813: (clobber (match_scratch:SI 4 "=&r,r,&r,r"))] ! 3814: "" ! 3815: "@ ! 3816: sf %4,%2,%1\;sfe %4,%4,%4\;sf%I3. %0,%4,%3 ! 3817: sf %4,%2,%1\;sfe %4,%4,%4\;sf%I3. %0,%4,%3 ! 3818: ai %4,%1,%n2\;sfe %4,%4,%4\;sf%I3. %0,%4,%3 ! 3819: ai %4,%1,%n2\;sfe %4,%4,%4\;sf%I3. %0,%4,%3" ! 3820: [(set_attr "type" "compare")]) ! 3821: ! 3822: (define_insn "" ! 3823: [(set (match_operand:SI 0 "gen_reg_operand" "=r,r") ! 3824: (neg:SI (ltu:SI (match_operand:SI 1 "gen_reg_operand" "r,r") ! 3825: (match_operand:SI 2 "reg_or_neg_short_operand" "r,P"))))] ! 3826: "" ! 3827: "@ ! 3828: sf %0,%2,%1\;sfe %0,%0,%0 ! 3829: ai %0,%1,%n2\;sfe %0,%0,%0") ! 3830: ! 3831: (define_insn "" ! 3832: [(set (match_operand:SI 0 "gen_reg_operand" "=r") ! 3833: (ge:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 3834: (match_operand:SI 2 "reg_or_short_operand" "rI"))) ! 3835: (clobber (match_scratch:SI 3 "=r"))] ! 3836: "" ! 3837: "doz%I2 %3,%1,%2\;sfi %0,%3,0\;ae %0,%0,%3") ! 3838: ! 3839: (define_insn "" ! 3840: [(set (match_operand:CC 4 "cc_reg_operand" "=x") ! 3841: (compare:CC ! 3842: (ge:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 3843: (match_operand:SI 2 "reg_or_short_operand" "rI")) ! 3844: (const_int 0))) ! 3845: (set (match_operand:SI 0 "gen_reg_operand" "=r") ! 3846: (ge:SI (match_dup 1) (match_dup 2))) ! 3847: (clobber (match_scratch:SI 3 "=r"))] ! 3848: "" ! 3849: "doz%I2 %3,%1,%2\;sfi %0,%3,0\;ae. %0,%0,%3" ! 3850: [(set_attr "type" "compare")]) ! 3851: ! 3852: (define_insn "" ! 3853: [(set (match_operand:SI 0 "gen_reg_operand" "=r") ! 3854: (plus:SI (ge:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 3855: (match_operand:SI 2 "reg_or_short_operand" "rI")) ! 3856: (match_operand:SI 3 "gen_reg_operand" "r"))) ! 3857: (clobber (match_scratch:SI 4 "=&r"))] ! 3858: "" ! 3859: "doz%I2 %4,%1,%2\;sfi %4,%4,0\;aze %0,%3") ! 3860: ! 3861: (define_insn "" ! 3862: [(set (match_operand:CC 0 "cc_reg_operand" "=x") ! 3863: (compare:CC ! 3864: (plus:SI (ge:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 3865: (match_operand:SI 2 "reg_or_short_operand" "rI")) ! 3866: (match_operand:SI 3 "gen_reg_operand" "r")) ! 3867: (const_int 0))) ! 3868: (clobber (match_scratch:SI 4 "=&r"))] ! 3869: "" ! 3870: "doz%I2 %4,%1,%2\;sfi %4,%4,0\;aze. %4,%3" ! 3871: [(set_attr "type" "compare")]) ! 3872: ! 3873: (define_insn "" ! 3874: [(set (match_operand:CC 5 "cc_reg_operand" "=x") ! 3875: (compare:CC ! 3876: (plus:SI (ge:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 3877: (match_operand:SI 2 "reg_or_short_operand" "rI")) ! 3878: (match_operand:SI 3 "gen_reg_operand" "r")) ! 3879: (const_int 0))) ! 3880: (set (match_operand:SI 0 "gen_reg_operand" "=r") ! 3881: (plus:SI (ge:SI (match_dup 1) (match_dup 2)) (match_dup 3))) ! 3882: (clobber (match_scratch:SI 4 "=&r"))] ! 3883: "" ! 3884: "doz%I2 %4,%1,%2\;sfi %4,%4,0\;aze. %0,%3" ! 3885: [(set_attr "type" "compare")]) ! 3886: ! 3887: (define_insn "" ! 3888: [(set (match_operand:SI 0 "gen_reg_operand" "=r") ! 3889: (neg:SI (ge:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 3890: (match_operand:SI 2 "reg_or_short_operand" "rI"))))] ! 3891: "" ! 3892: "doz%I2 %0,%1,%2\;ai %0,%0,-1\;sfe %0,%0,%0") ! 3893: ! 3894: ;; This is (and (neg (ge X (const_int 0))) Y). ! 3895: (define_insn "" ! 3896: [(set (match_operand:SI 0 "gen_reg_operand" "=r") ! 3897: (and:SI (neg:SI ! 3898: (lshiftrt:SI ! 3899: (not:SI (match_operand:SI 1 "gen_reg_operand" "r")) ! 3900: (const_int 31))) ! 3901: (match_operand:SI 2 "gen_reg_operand" "r"))) ! 3902: (clobber (match_scratch:SI 3 "=&r"))] ! 3903: "" ! 3904: "srai %3,%1,31\;andc %0,%2,%3") ! 3905: ! 3906: (define_insn "" ! 3907: [(set (match_operand:CC 0 "cc_reg_operand" "=x") ! 3908: (compare:CC ! 3909: (and:SI (neg:SI ! 3910: (lshiftrt:SI ! 3911: (not:SI (match_operand:SI 1 "gen_reg_operand" "r")) ! 3912: (const_int 31))) ! 3913: (match_operand:SI 2 "gen_reg_operand" "r")) ! 3914: (const_int 0))) ! 3915: (clobber (match_scratch:SI 3 "=&r"))] ! 3916: "" ! 3917: "srai %3,%1,31\;andc. %3,%2,%3" ! 3918: [(set_attr "type" "compare")]) ! 3919: ! 3920: (define_insn "" ! 3921: [(set (match_operand:CC 4 "cc_reg_operand" "=x") ! 3922: (compare:CC ! 3923: (and:SI (neg:SI ! 3924: (lshiftrt:SI ! 3925: (not:SI (match_operand:SI 1 "gen_reg_operand" "r")) ! 3926: (const_int 31))) ! 3927: (match_operand:SI 2 "gen_reg_operand" "r")) ! 3928: (const_int 0))) ! 3929: (set (match_operand:SI 0 "gen_reg_operand" "=r") ! 3930: (and:SI (neg:SI (lshiftrt:SI (not:SI (match_dup 1)) ! 3931: (const_int 31))) ! 3932: (match_dup 2))) ! 3933: (clobber (match_scratch:SI 3 "=&r"))] ! 3934: "" ! 3935: "srai %3,%1,31\;andc. %0,%2,%3" ! 3936: [(set_attr "type" "compare")]) ! 3937: ! 3938: (define_insn "" ! 3939: [(set (match_operand:SI 0 "gen_reg_operand" "=r,r") ! 3940: (geu:SI (match_operand:SI 1 "gen_reg_operand" "r,r") ! 3941: (match_operand:SI 2 "reg_or_neg_short_operand" "r,P")))] ! 3942: "" ! 3943: "@ ! 3944: sf %0,%2,%1\;cal %0,0(0)\;ae %0,%0,%0 ! 3945: ai %0,%1,%n2\;cal %0,0(0)\;ae %0,%0,%0") ! 3946: ! 3947: (define_insn "" ! 3948: [(set (match_operand:CC 3 "cc_reg_operand" "=x,x") ! 3949: (compare:CC ! 3950: (geu:SI (match_operand:SI 1 "gen_reg_operand" "r,r") ! 3951: (match_operand:SI 2 "reg_or_neg_short_operand" "r,P")) ! 3952: (const_int 0))) ! 3953: (set (match_operand:SI 0 "gen_reg_operand" "=r,r") ! 3954: (geu:SI (match_dup 1) (match_dup 2)))] ! 3955: "" ! 3956: "@ ! 3957: sf %0,%2,%1\;cal %0,0(0)\;ae. %0,%0,%0 ! 3958: ai %0,%1,%n2\;cal %0,0(0)\;ae. %0,%0,%0" ! 3959: [(set_attr "type" "compare")]) ! 3960: ! 3961: (define_insn "" ! 3962: [(set (match_operand:SI 0 "gen_reg_operand" "=r,r") ! 3963: (plus:SI (geu:SI (match_operand:SI 1 "gen_reg_operand" "r,r") ! 3964: (match_operand:SI 2 "reg_or_neg_short_operand" "r,P")) ! 3965: (match_operand:SI 3 "gen_reg_operand" "r,r"))) ! 3966: (clobber (match_scratch:SI 4 "=&r,&r"))] ! 3967: "" ! 3968: "@ ! 3969: sf %4,%2,%1\;aze %0,%3 ! 3970: ai %4,%1,%n2\;aze %0,%3") ! 3971: ! 3972: (define_insn "" ! 3973: [(set (match_operand:CC 0 "cc_reg_operand" "=x,x") ! 3974: (compare:CC ! 3975: (plus:SI (geu:SI (match_operand:SI 1 "gen_reg_operand" "r,r") ! 3976: (match_operand:SI 2 "reg_or_neg_short_operand" "r,P")) ! 3977: (match_operand:SI 3 "gen_reg_operand" "r,r")) ! 3978: (const_int 0))) ! 3979: (clobber (match_scratch:SI 4 "=&r,&r"))] ! 3980: "" ! 3981: "@ ! 3982: sf %4,%2,%1\;aze. %4,%3 ! 3983: ai %4,%1,%n2\;aze. %4,%3" ! 3984: [(set_attr "type" "compare")]) ! 3985: ! 3986: (define_insn "" ! 3987: [(set (match_operand:CC 5 "cc_reg_operand" "=x,x") ! 3988: (compare:CC ! 3989: (plus:SI (geu:SI (match_operand:SI 1 "gen_reg_operand" "r,r") ! 3990: (match_operand:SI 2 "reg_or_neg_short_operand" "r,P")) ! 3991: (match_operand:SI 3 "gen_reg_operand" "r,r")) ! 3992: (const_int 0))) ! 3993: (set (match_operand:SI 0 "gen_reg_operand" "=r,r") ! 3994: (plus:SI (geu:SI (match_dup 1) (match_dup 2)) (match_dup 3))) ! 3995: (clobber (match_scratch:SI 4 "=&r,&r"))] ! 3996: "" ! 3997: "@ ! 3998: sf %4,%2,%1\;aze. %0,%3 ! 3999: ai %4,%1,%n2\;aze. %4,%3" ! 4000: [(set_attr "type" "compare")]) ! 4001: ! 4002: (define_insn "" ! 4003: [(set (match_operand:SI 0 "gen_reg_operand" "=r,r") ! 4004: (neg:SI (geu:SI (match_operand:SI 1 "gen_reg_operand" "r,r") ! 4005: (match_operand:SI 2 "reg_or_short_operand" "r,I"))))] ! 4006: "" ! 4007: "@ ! 4008: sf %0,%2,%1\;sfe %0,%0,%0\;nand %0,%0,%0 ! 4009: sfi %0,%1,-1\;a%I2 %0,%0,%2\;sfe %0,%0,%0") ! 4010: ! 4011: (define_insn "" ! 4012: [(set (match_operand:SI 0 "gen_reg_operand" "=r,r") ! 4013: (and:SI (neg:SI ! 4014: (geu:SI (match_operand:SI 1 "gen_reg_operand" "r,r") ! 4015: (match_operand:SI 2 "reg_or_neg_short_operand" "r,P"))) ! 4016: (match_operand:SI 3 "gen_reg_operand" "r,r"))) ! 4017: (clobber (match_scratch:SI 4 "=&r,&r"))] ! 4018: "" ! 4019: "@ ! 4020: sf %4,%2,%1\;sfe %4,%4,%4\;andc %0,%3,%4 ! 4021: ai %4,%1,%n2\;sfe %4,%4,%4\;andc %0,%3,%4") ! 4022: ! 4023: (define_insn "" ! 4024: [(set (match_operand:CC 0 "cc_reg_operand" "=x,x") ! 4025: (compare:CC ! 4026: (and:SI (neg:SI ! 4027: (geu:SI (match_operand:SI 1 "gen_reg_operand" "r,r") ! 4028: (match_operand:SI 2 "reg_or_neg_short_operand" "r,P"))) ! 4029: (match_operand:SI 3 "gen_reg_operand" "r,r")) ! 4030: (const_int 0))) ! 4031: (clobber (match_scratch:SI 4 "=&r,&r"))] ! 4032: "" ! 4033: "@ ! 4034: sf %4,%2,%1\;sfe %4,%4,%4\;andc. %4,%3,%4 ! 4035: ai %4,%1,%n2\;sfe %4,%4,%4\;andc. %4,%3,%4" ! 4036: [(set_attr "type" "compare")]) ! 4037: ! 4038: (define_insn "" ! 4039: [(set (match_operand:CC 5 "cc_reg_operand" "=x,x") ! 4040: (compare:CC ! 4041: (and:SI (neg:SI ! 4042: (geu:SI (match_operand:SI 1 "gen_reg_operand" "r,r") ! 4043: (match_operand:SI 2 "reg_or_neg_short_operand" "r,P"))) ! 4044: (match_operand:SI 3 "gen_reg_operand" "r,r")) ! 4045: (const_int 0))) ! 4046: (set (match_operand:SI 0 "gen_reg_operand" "=r,r") ! 4047: (and:SI (neg:SI (geu:SI (match_dup 1) (match_dup 2))) (match_dup 3))) ! 4048: (clobber (match_scratch:SI 4 "=&r,&r"))] ! 4049: "" ! 4050: "@ ! 4051: sf %4,%2,%1\;sfe %4,%4,%4\;andc. %0,%3,%4 ! 4052: ai %4,%1,%n2\;sfe %4,%4,%4\;andc. %0,%3,%4" ! 4053: [(set_attr "type" "compare")]) ! 4054: ! 4055: (define_insn "" ! 4056: [(set (match_operand:SI 0 "gen_reg_operand" "=r") ! 4057: (gt:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 4058: (const_int 0)))] ! 4059: "" ! 4060: "sfi %0,%1,0\;ame %0,%0\;sri %0,%0,31") ! 4061: ! 4062: (define_insn "" ! 4063: [(set (match_operand:CC 2 "cc_reg_operand" "=x") ! 4064: (compare:CC ! 4065: (gt:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 4066: (const_int 0)) ! 4067: (const_int 0))) ! 4068: (set (match_operand:SI 0 "gen_reg_operand" "=r") ! 4069: (gt:SI (match_dup 1) (const_int 0)))] ! 4070: "" ! 4071: "sfi %0,%1,0\;ame %0,%0\;sri. %0,%0,31" ! 4072: [(set_attr "type" "delayed_compare")]) ! 4073: ! 4074: (define_insn "" ! 4075: [(set (match_operand:SI 0 "gen_reg_operand" "=r") ! 4076: (gt:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 4077: (match_operand:SI 2 "reg_or_short_operand" "r")))] ! 4078: "" ! 4079: "doz %0,%2,%1\;nabs %0,%0\;sri %0,%0,31") ! 4080: ! 4081: (define_insn "" ! 4082: [(set (match_operand:CC 3 "cc_reg_operand" "=x") ! 4083: (compare:CC ! 4084: (gt:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 4085: (match_operand:SI 2 "reg_or_short_operand" "r")) ! 4086: (const_int 0))) ! 4087: (set (match_operand:SI 0 "gen_reg_operand" "=r") ! 4088: (gt:SI (match_dup 1) (match_dup 2)))] ! 4089: "" ! 4090: "doz %0,%2,%1\;nabs %0,%0\;sri. %0,%0,31" ! 4091: [(set_attr "type" "delayed_compare")]) ! 4092: ! 4093: (define_insn "" ! 4094: [(set (match_operand:SI 0 "gen_reg_operand" "=r") ! 4095: (plus:SI (gt:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 4096: (const_int 0)) ! 4097: (match_operand:SI 2 "gen_reg_operand" "r"))) ! 4098: (clobber (match_scratch:SI 3 "=&r"))] ! 4099: "" ! 4100: "a %3,%1,%1\;sfe %3,%1,%3\;aze %0,%2") ! 4101: ! 4102: (define_insn "" ! 4103: [(set (match_operand:CC 0 "cc_reg_operand" "=x") ! 4104: (compare:CC ! 4105: (plus:SI (gt:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 4106: (const_int 0)) ! 4107: (match_operand:SI 2 "gen_reg_operand" "r")) ! 4108: (const_int 0))) ! 4109: (clobber (match_scratch:SI 3 "=&r"))] ! 4110: "" ! 4111: "a %3,%1,%1\;sfe %3,%1,%3\;aze. %0,%2" ! 4112: [(set_attr "type" "compare")]) ! 4113: ! 4114: (define_insn "" ! 4115: [(set (match_operand:CC 4 "cc_reg_operand" "=x") ! 4116: (compare:CC ! 4117: (plus:SI (gt:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 4118: (const_int 0)) ! 4119: (match_operand:SI 2 "gen_reg_operand" "r")) ! 4120: (const_int 0))) ! 4121: (set (match_operand:SI 0 "gen_reg_operand" "=r") ! 4122: (plus:SI (gt:SI (match_dup 1) (const_int 0)) (match_dup 2))) ! 4123: (clobber (match_scratch:SI 3 "=&r"))] ! 4124: "" ! 4125: "a %3,%1,%1\;sfe %3,%1,%3\;aze. %3,%2" ! 4126: [(set_attr "type" "compare")]) ! 4127: ! 4128: (define_insn "" ! 4129: [(set (match_operand:SI 0 "gen_reg_operand" "=r") ! 4130: (plus:SI (gt:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 4131: (match_operand:SI 2 "reg_or_short_operand" "r")) ! 4132: (match_operand:SI 3 "gen_reg_operand" "r"))) ! 4133: (clobber (match_scratch:SI 4 "=&r"))] ! 4134: "" ! 4135: "doz %4,%2,%1\;ai %4,%4,-1\;aze %0,%3") ! 4136: ! 4137: (define_insn "" ! 4138: [(set (match_operand:CC 0 "cc_reg_operand" "=x") ! 4139: (compare:CC ! 4140: (plus:SI (gt:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 4141: (match_operand:SI 2 "reg_or_short_operand" "r")) ! 4142: (match_operand:SI 3 "gen_reg_operand" "r")) ! 4143: (const_int 0))) ! 4144: (clobber (match_scratch:SI 4 "=&r"))] ! 4145: "" ! 4146: "doz %4,%2,%1\;ai %4,%4,-1\;aze. %4,%3" ! 4147: [(set_attr "type" "compare")]) ! 4148: ! 4149: (define_insn "" ! 4150: [(set (match_operand:CC 5 "cc_reg_operand" "=x") ! 4151: (compare:CC ! 4152: (plus:SI (gt:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 4153: (match_operand:SI 2 "reg_or_short_operand" "r")) ! 4154: (match_operand:SI 3 "gen_reg_operand" "r")) ! 4155: (const_int 0))) ! 4156: (set (match_operand:SI 0 "gen_reg_operand" "=r") ! 4157: (plus:SI (gt:SI (match_dup 1) (match_dup 2)) (match_dup 3))) ! 4158: (clobber (match_scratch:SI 4 "=&r"))] ! 4159: "" ! 4160: "doz %4,%2,%1\;ai %4,%4,-1\;aze. %0,%3" ! 4161: [(set_attr "type" "compare")]) ! 4162: ! 4163: (define_insn "" ! 4164: [(set (match_operand:SI 0 "gen_reg_operand" "=r") ! 4165: (neg:SI (gt:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 4166: (const_int 0))))] ! 4167: "" ! 4168: "sfi %0,%1,0\;ame %0,%0\;srai %0,%0,31") ! 4169: ! 4170: (define_insn "" ! 4171: [(set (match_operand:SI 0 "gen_reg_operand" "=r") ! 4172: (neg:SI (gt:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 4173: (match_operand:SI 2 "reg_or_short_operand" "r"))))] ! 4174: "" ! 4175: "doz %0,%2,%1\;nabs %0,%0\;srai %0,%0,31") ! 4176: ! 4177: (define_insn "" ! 4178: [(set (match_operand:SI 0 "gen_reg_operand" "=r") ! 4179: (gtu:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 4180: (match_operand:SI 2 "reg_or_short_operand" "rI")))] ! 4181: "" ! 4182: "sf%I2 %0,%1,%2\;sfe %0,%0,%0\;neg %0,%0") ! 4183: ! 4184: (define_insn "" ! 4185: [(set (match_operand:CC 3 "cc_reg_operand" "=x") ! 4186: (compare:CC ! 4187: (gtu:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 4188: (match_operand:SI 2 "reg_or_short_operand" "rI")) ! 4189: (const_int 0))) ! 4190: (set (match_operand:SI 0 "gen_reg_operand" "=r") ! 4191: (gtu:SI (match_dup 1) (match_dup 2)))] ! 4192: "" ! 4193: "sf%I2 %0,%1,%2\;sfe %0,%0,%0\;neg. %0,%0" ! 4194: [(set_attr "type" "compare")]) ! 4195: ! 4196: (define_insn "" ! 4197: [(set (match_operand:SI 0 "gen_reg_operand" "=r,r") ! 4198: (plus:SI (gtu:SI (match_operand:SI 1 "gen_reg_operand" "r,r") ! 4199: (match_operand:SI 2 "reg_or_short_operand" "rI,rI")) ! 4200: (match_operand:SI 3 "reg_or_short_operand" "r,I"))) ! 4201: (clobber (match_scratch:SI 4 "=&r,&r"))] ! 4202: "" ! 4203: "sf%I2 %4,%1,%2\;sfe %4,%4,%4\;sf%I3 %0,%4,%3") ! 4204: ! 4205: (define_insn "" ! 4206: [(set (match_operand:CC 0 "cc_reg_operand" "=x,x") ! 4207: (compare:CC ! 4208: (plus:SI (gtu:SI (match_operand:SI 1 "gen_reg_operand" "r,r") ! 4209: (match_operand:SI 2 "reg_or_short_operand" "rI,rI")) ! 4210: (match_operand:SI 3 "reg_or_short_operand" "r,I")) ! 4211: (const_int 0))) ! 4212: (clobber (match_scratch:SI 4 "=&r,&r"))] ! 4213: "" ! 4214: "sf%I2 %4,%1,%2\;sfe %4,%4,%4\;sf%I3. %4,%4,%3" ! 4215: [(set_attr "type" "compare")]) ! 4216: ! 4217: (define_insn "" ! 4218: [(set (match_operand:CC 5 "cc_reg_operand" "=x,x") ! 4219: (compare:CC ! 4220: (plus:SI (gtu:SI (match_operand:SI 1 "gen_reg_operand" "r,r") ! 4221: (match_operand:SI 2 "reg_or_short_operand" "rI,rI")) ! 4222: (match_operand:SI 3 "reg_or_short_operand" "r,I")) ! 4223: (const_int 0))) ! 4224: (set (match_operand:SI 0 "gen_reg_operand" "=r,r") ! 4225: (plus:SI (gtu:SI (match_dup 1) (match_dup 2)) (match_dup 3))) ! 4226: (clobber (match_scratch:SI 4 "=&r,&r"))] ! 4227: "" ! 4228: "sf%I2 %4,%1,%2\;sfe %4,%4,%4\;sf%I3. %0,%4,%3" ! 4229: [(set_attr "type" "compare")]) ! 4230: ! 4231: (define_insn "" ! 4232: [(set (match_operand:SI 0 "gen_reg_operand" "=r") ! 4233: (neg:SI (gtu:SI (match_operand:SI 1 "gen_reg_operand" "r") ! 4234: (match_operand:SI 2 "reg_or_short_operand" "rI"))))] ! 4235: "" ! 4236: "sf%I2 %0,%1,%2\;sfe %0,%0,%0") ! 4237: ! 4238: ;; Define both directions of branch and return. If we need a reload ! 4239: ;; register, we'd rather use CR0 since it is much easier to copy a ! 4240: ;; register CC value to there. ! 4241: ! 4242: (define_insn "" ! 4243: [(set (pc) ! 4244: (if_then_else (match_operator 1 "branch_comparison_operator" ! 4245: [(match_operand 2 ! 4246: "cc_reg_operand" "x,?y") ! 4247: (const_int 0)]) ! 4248: (label_ref (match_operand 0 "" "")) ! 4249: (pc)))] ! 4250: "" ! 4251: "%C1bc %t1,%j1,%0") ! 4252: ! 4253: (define_insn "" ! 4254: [(set (pc) ! 4255: (if_then_else (match_operator 0 "branch_comparison_operator" ! 4256: [(match_operand 1 ! 4257: "cc_reg_operand" "x,?y") ! 4258: (const_int 0)]) ! 4259: (return) ! 4260: (pc)))] ! 4261: "direct_return ()" ! 4262: "%C0bcr %t0,%j0") ! 4263: ! 4264: (define_insn "" ! 4265: [(set (pc) ! 4266: (if_then_else (match_operator 1 "branch_comparison_operator" ! 4267: [(match_operand 2 ! 4268: "cc_reg_operand" "x,?y") ! 4269: (const_int 0)]) ! 4270: (pc) ! 4271: (label_ref (match_operand 0 "" ""))))] ! 4272: "" ! 4273: "%C1bc %T1,%j1,%0") ! 4274: ! 4275: (define_insn "" ! 4276: [(set (pc) ! 4277: (if_then_else (match_operator 0 "branch_comparison_operator" ! 4278: [(match_operand 1 ! 4279: "cc_reg_operand" "x,?y") ! 4280: (const_int 0)]) ! 4281: (pc) ! 4282: (return)))] ! 4283: "direct_return ()" ! 4284: "%C0bcr %T0,%j0") ! 4285: ! 4286: ;; Unconditional branch and return. ! 4287: ! 4288: (define_insn "jump" ! 4289: [(set (pc) ! 4290: (label_ref (match_operand 0 "" "")))] ! 4291: "" ! 4292: "b %l0") ! 4293: ! 4294: (define_insn "return" ! 4295: [(return)] ! 4296: "direct_return ()" ! 4297: "br") ! 4298: ! 4299: (define_insn "indirect_jump" ! 4300: [(set (pc) (match_operand:SI 0 "register_operand" "c,l"))] ! 4301: "" ! 4302: "@ ! 4303: bctr ! 4304: br") ! 4305: ! 4306: ;; Table jump for switch statements: ! 4307: (define_expand "tablejump" ! 4308: [(set (match_dup 3) ! 4309: (plus:SI (match_operand:SI 0 "" "") ! 4310: (match_dup 2))) ! 4311: (parallel [(set (pc) (match_dup 3)) ! 4312: (use (label_ref (match_operand 1 "" "")))])] ! 4313: "" ! 4314: " ! 4315: { operands[0] = force_reg (SImode, operands[0]); ! 4316: operands[2] = force_reg (SImode, gen_rtx (LABEL_REF, VOIDmode, operands[1])); ! 4317: operands[3] = gen_reg_rtx (SImode); ! 4318: }") ! 4319: ! 4320: (define_insn "" ! 4321: [(set (pc) ! 4322: (match_operand:SI 0 "register_operand" "c,r")) ! 4323: (use (label_ref (match_operand 1 "" "")))] ! 4324: "" ! 4325: "@ ! 4326: bctr ! 4327: br") ! 4328: ! 4329: (define_insn "nop" ! 4330: [(const_int 0)] ! 4331: "" ! 4332: "cror 0,0,0") ! 4333: ! 4334: ;; Define the subtract-one-and-jump insns. ! 4335: ;; We need to be able to do this for any operand, including MEM, or we ! 4336: ;; will cause reload to blow up since we don't allow output reloads on ! 4337: ;; JUMP_INSNs. ! 4338: (define_insn "" ! 4339: [(set (pc) ! 4340: (if_then_else (ne (match_operand:SI 1 "register_operand" "0,*r,*r") ! 4341: (const_int 1)) ! 4342: (label_ref (match_operand 2 "" "")) ! 4343: (pc))) ! 4344: (set (match_operand:SI 0 "register_operand" "=c,*r,m*q*c*l") ! 4345: (plus:SI (match_dup 1) (const_int -1))) ! 4346: (clobber (match_scratch:CC 3 "=X,&x,&x")) ! 4347: (clobber (match_scratch:SI 4 "=X,X,r"))] ! 4348: "" ! 4349: "@ ! 4350: bdn %l2 ! 4351: # ! 4352: #") ! 4353: ! 4354: ;; Similar, but we can use GE since we have a REG_NOTES. ! 4355: (define_insn "" ! 4356: [(set (pc) ! 4357: (if_then_else (ge (match_operand:SI 1 "register_operand" "0,*r,*r") ! 4358: (const_int 0)) ! 4359: (label_ref (match_operand 2 "" "")) ! 4360: (pc))) ! 4361: (set (match_operand:SI 0 "register_operand" "=c,*r,m*q*c*l") ! 4362: (plus:SI (match_dup 1) (const_int -1))) ! 4363: (clobber (match_scratch:CC 3 "=X,&x,&X")) ! 4364: (clobber (match_scratch:SI 4 "=X,X,r"))] ! 4365: "find_reg_note (insn, REG_NONNEG, 0)" ! 4366: "@ ! 4367: bdn %l2 ! 4368: # ! 4369: #") ! 4370: ! 4371: (define_insn "" ! 4372: [(set (pc) ! 4373: (if_then_else (eq (match_operand:SI 1 "register_operand" "0,*r,*r") ! 4374: (const_int 1)) ! 4375: (label_ref (match_operand 2 "" "")) ! 4376: (pc))) ! 4377: (set (match_operand:SI 0 "register_operand" "=c,*r,m*q*c*l") ! 4378: (plus:SI (match_dup 1) (const_int -1))) ! 4379: (clobber (match_scratch:CC 3 "=X,&x,&x")) ! 4380: (clobber (match_scratch:SI 4 "=X,X,r"))] ! 4381: "" ! 4382: "@ ! 4383: bdz %l2 ! 4384: # ! 4385: #") ! 4386: ! 4387: (define_split ! 4388: [(set (pc) ! 4389: (if_then_else (match_operator 2 "comparison_operator" ! 4390: [(match_operand:SI 1 "gen_reg_operand" "") ! 4391: (const_int 1)]) ! 4392: (match_operand 5 "" "") ! 4393: (match_operand 6 "" ""))) ! 4394: (set (match_operand:SI 0 "gen_reg_operand" "") ! 4395: (plus:SI (match_dup 1) (const_int -1))) ! 4396: (clobber (match_scratch:CC 3 "")) ! 4397: (clobber (match_scratch:SI 4 ""))] ! 4398: "reload_completed" ! 4399: [(parallel [(set (match_dup 3) ! 4400: (compare:CC (plus:SI (match_dup 1) (const_int -1)) ! 4401: (const_int 0))) ! 4402: (set (match_dup 0) (plus:SI (match_dup 1) (const_int -1)))]) ! 4403: (set (pc) (if_then_else (match_dup 7) (match_dup 5) (match_dup 6)))] ! 4404: " ! 4405: { operands[7] = gen_rtx (GET_CODE (operands[2]), VOIDmode, operands[3], ! 4406: const0_rtx); }") ! 4407: ! 4408: (define_split ! 4409: [(set (pc) ! 4410: (if_then_else (match_operator 2 "comparison_operator" ! 4411: [(match_operand:SI 1 "gen_reg_operand" "") ! 4412: (const_int 1)]) ! 4413: (match_operand 5 "" "") ! 4414: (match_operand 6 "" ""))) ! 4415: (set (match_operand:SI 0 "general_operand" "") ! 4416: (plus:SI (match_dup 1) (const_int -1))) ! 4417: (clobber (match_scratch:CC 3 "")) ! 4418: (clobber (match_scratch:SI 4 ""))] ! 4419: "reload_completed && ! gen_reg_operand (operands[0], SImode)" ! 4420: [(parallel [(set (match_dup 3) ! 4421: (compare:CC (plus:SI (match_dup 1) (const_int -1)) ! 4422: (const_int 0))) ! 4423: (set (match_dup 4) (plus:SI (match_dup 1) (const_int -1)))]) ! 4424: (set (match_dup 0) (match_dup 4)) ! 4425: (set (pc) (if_then_else (match_dup 7) (match_dup 5) (match_dup 6)))] ! 4426: " ! 4427: { operands[7] = gen_rtx (GET_CODE (operands[2]), VOIDmode, operands[3], ! 4428: const0_rtx); }") ! 4429: ! 4430: ;;- Local variables: ! 4431: ;;- mode:emacs-lisp ! 4432: ;;- comment-start: ";;- " ! 4433: ;;- eval: (set-syntax-table (copy-sequence (syntax-table))) ! 4434: ;;- eval: (modify-syntax-entry ?[ "(]") ! 4435: ;;- eval: (modify-syntax-entry ?] ")[") ! 4436: ;;- eval: (modify-syntax-entry ?{ "(}") ! 4437: ;;- eval: (modify-syntax-entry ?} "){") ! 4438: ;;- End:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.