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