|
|
1.1 ! root 1: ;; Mips.md Naive version of Machine Description for MIPS ! 2: ;; Contributed by A. Lichnewsky, [email protected] ! 3: ;; Copyright (C) 1989 Free Software Foundation, Inc. ! 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 1, 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: ;; ! 22: ;;------------------------------------------------------------------------ ! 23: ;; ! 24: ! 25: ;; ! 26: ;; .................... ! 27: ;; ! 28: ;; Peephole Optimizations for ! 29: ;; ! 30: ;; ARITHMETIC ! 31: ;; ! 32: ;; .................... ! 33: ;; ! 34: ;;- The following peepholes are ! 35: ;;- motivated by the fact that ! 36: ;;- stack movement result in some ! 37: ;;- cases in embarrassing sequences ! 38: ;;- of addiu SP,SP,int ! 39: ;;- addiu SP,SP,other_int ! 40: ! 41: ;;- -------------------- ! 42: ;;- REMARK: this would be done better ! 43: ;;- by analysis of dependencies in ! 44: ;;- basic blocks, prior to REG ALLOC, ! 45: ;;- and simplification of trees: ! 46: ;;- (+ (+ REG const) const) ! 47: ;;- -> (+ REG newconst) ! 48: ;;- -------------------- ! 49: (define_peephole ! 50: [(set (match_operand:SI 0 "general_operand" "=r") ! 51: (plus:SI (match_operand:SI 1 "general_operand" "r") ! 52: (match_operand:SI 2 "general_operand" "IJ"))) ! 53: (set (match_operand:SI 3 "general_operand" "=r") ! 54: (plus:SI (match_dup 0) ! 55: (match_operand:SI 4 "general_operand" "IJ")))] ! 56: " /* DATA FLOW SEMANTICS*/ ! 57: (((REGNO (operands[0])) == (REGNO (operands[3]))) ! 58: || ! 59: dead_or_set_p (insn, operands[0])) ! 60: && ! 61: ( /* CONSTRAINTS */ ! 62: (GET_CODE (operands[2]) == CONST_INT) ! 63: && ((CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'I')) ! 64: ||(CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'J'))) ! 65: && (GET_CODE (operands[4]) == CONST_INT) ! 66: && ((CONST_OK_FOR_LETTER_P (INTVAL (operands[4]), 'I')) ! 67: ||(CONST_OK_FOR_LETTER_P (INTVAL (operands[4]), 'J')))) ! 68: " ! 69: "* ! 70: { ! 71: rtx ops[3]; ! 72: int i; ! 73: i = INTVAL (operands[2]) + INTVAL (operands[4]); ! 74: if (i == 0) ! 75: { ! 76: if ((REGNO (operands[3])) == (REGNO (operands[1]))) ! 77: { ! 78: if ((REGNO (operands[0])) == (REGNO (operands[3]))) ! 79: return \"\\t\\t# NULL %0 <- %1 + %2; %3 <- %0 + %4\"; ! 80: else ! 81: return \"\\t\\t# NULL %0 <- %1 + %2; %3 <- %0 + %4 and dead %0\"; ! 82: } ! 83: else ! 84: return \"add%:\\t%3,%1,$0\\t# %0 <- %1 + %2; %3 <- %0 + %4 and dead %0\"; ! 85: } ! 86: else ! 87: { ! 88: ops[0] = operands[3]; ! 89: ops[1] = operands[1]; ! 90: ops[2] = gen_rtx (CONST_INT, VOIDmode, i); ! 91: output_asm_insn (\"addi%:\\t%0,%1,%2\\t# simplification of:\", ops); ! 92: return \"\\t\\t\\t# %0 <- %1 + %2; %3 <- %0 + %4 and dead %0\"; ! 93: } ! 94: }") ! 95: ! 96: ! 97: ! 98: ! 99: (define_peephole ! 100: [(set (match_operand:SI 0 "general_operand" "=r") ! 101: (plus:SI (match_operand:SI 1 "general_operand" "r") ! 102: (match_operand:SI 2 "general_operand" "IJ"))) ! 103: (set (match_operand:SI 3 "general_operand" "=r") ! 104: (minus:SI (match_dup 0) ! 105: (match_operand:SI 4 "general_operand" "IJ")))] ! 106: "(((REGNO (operands[0])) == (REGNO (operands[3]))) ! 107: || ! 108: dead_or_set_p (insn, operands[0])) ! 109: && ! 110: ( /* CONSTRAINTS */ ! 111: (GET_CODE (operands[2]) == CONST_INT) ! 112: && ((CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'I')) ! 113: ||(CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'J'))) ! 114: && (GET_CODE (operands[4]) == CONST_INT) ! 115: && ((CONST_OK_FOR_LETTER_P (INTVAL (operands[4]), 'I')) ! 116: ||(CONST_OK_FOR_LETTER_P (INTVAL (operands[4]), 'J')))) ! 117: " ! 118: "* ! 119: { ! 120: rtx ops[3]; ! 121: int i; ! 122: i = INTVAL (operands[2]) - INTVAL (operands[4]); ! 123: if (i == 0) ! 124: { ! 125: if ((REGNO (operands[3])) == (REGNO (operands[1]))) ! 126: { ! 127: if ((REGNO (operands[0])) == (REGNO (operands[3]))) ! 128: return \"\\t\\t# NULL %0 <- %1 + %2; %3 <- %0 - %4\"; ! 129: else ! 130: return \"\\t\\t# NULL %0 <- %1 + %2; %3 <- %0 - %4 and dead %0\"; ! 131: } ! 132: else ! 133: return \"add%:\\t%3,%1,$0\\t# %0 <- %1 + %2; %3 <- %0 - %4 and dead %0\"; ! 134: } ! 135: else ! 136: { ! 137: ops[0] = operands[3]; ! 138: ops[1] = operands[1]; ! 139: ops[2] = gen_rtx (CONST_INT, VOIDmode, i); ! 140: output_asm_insn (\"addi%:\\t%0,%1,%2\\t# simplification of:\", ops); ! 141: return \"\\t\\t\\t# %0 <- %1 + %2; %3 <- %0 - %4 and dead %0\"; ! 142: } ! 143: }") ! 144: ! 145: ! 146: (define_peephole ! 147: [(set (match_operand:SI 0 "general_operand" "=r") ! 148: (minus:SI (match_operand:SI 1 "general_operand" "r") ! 149: (match_operand:SI 2 "general_operand" "IJ"))) ! 150: (set (match_operand:SI 3 "general_operand" "=r") ! 151: (plus:SI (match_dup 0) ! 152: (match_operand:SI 4 "general_operand" "IJ")))] ! 153: "(((REGNO (operands[0])) == (REGNO (operands[3]))) ! 154: || ! 155: dead_or_set_p (insn, operands[0])) ! 156: && ! 157: ( /* CONSTRAINTS */ ! 158: (GET_CODE (operands[2]) == CONST_INT) ! 159: && ((CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'I')) ! 160: ||(CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'J'))) ! 161: && (GET_CODE (operands[4]) == CONST_INT) ! 162: && ((CONST_OK_FOR_LETTER_P (INTVAL (operands[4]), 'I')) ! 163: ||(CONST_OK_FOR_LETTER_P (INTVAL (operands[4]), 'J')))) ! 164: " ! 165: "* ! 166: { ! 167: rtx ops[3]; ! 168: int i; ! 169: i = (- INTVAL (operands[2])) + INTVAL (operands[4]); ! 170: if (i == 0) ! 171: { ! 172: if ((REGNO (operands[3])) == (REGNO (operands[1]))) ! 173: { ! 174: if ((REGNO (operands[0])) == (REGNO (operands[3]))) ! 175: return \"\\t\\t# NULL %0 <- %1 - %2; %3 <- %0 + %4\"; ! 176: else ! 177: return \"\\t\\t# NULL %0 <- %1 - %2; %3 <- %0 + %4 and dead %0\"; ! 178: } ! 179: else ! 180: return \"add%:\\t%3,%1,$0\\t# %0 <- %1 - %2; %3 <- %0 + %4 and dead %0\"; ! 181: } ! 182: else ! 183: { ! 184: ops[0] = operands[3]; ! 185: ops[1] = operands[1]; ! 186: ops[2] = gen_rtx (CONST_INT, VOIDmode, i); ! 187: output_asm_insn (\"addi%:\\t%0,%1,%2\\t# simplification of:\", ops); ! 188: return \"\\t\\t\\t# %0 <- %1 - %2; %3 <- %0 + %4 and dead %0\"; ! 189: } ! 190: }") ! 191: ! 192: ! 193: ! 194: ! 195: (define_peephole ! 196: [(set (match_operand:SI 0 "general_operand" "=r") ! 197: (minus:SI (match_operand:SI 1 "general_operand" "r") ! 198: (match_operand:SI 2 "general_operand" "IJ"))) ! 199: (set (match_operand:SI 3 "general_operand" "=r") ! 200: (minus:SI (match_dup 0) ! 201: (match_operand:SI 4 "general_operand" "IJ")))] ! 202: "((REGNO (operands[0]) == REGNO (operands[3]) ! 203: || dead_or_set_p (insn, operands[0])) ! 204: && ! 205: (GET_CODE (operands[2]) == CONST_INT ! 206: && (CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'I') ! 207: || CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'J')) ! 208: && GET_CODE (operands[4]) == CONST_INT ! 209: && (CONST_OK_FOR_LETTER_P (INTVAL (operands[4]), 'I') ! 210: || CONST_OK_FOR_LETTER_P (INTVAL (operands[4]), 'J'))))" ! 211: "* ! 212: { ! 213: rtx ops[3]; ! 214: int i = - (INTVAL (operands[2]) + INTVAL (operands[4])); ! 215: ! 216: if (i == 0) ! 217: { ! 218: if (REGNO (operands[3]) == REGNO (operands[1])) ! 219: { ! 220: if (REGNO (operands[0]) == REGNO (operands[3])) ! 221: return \"\\t\\t# NULL %0 <- %1 - %2; %3 <- %0 - %4\"; ! 222: else ! 223: return \"\\t\\t# NULL %0 <- %1 - %2; %3 <- %0 - %4 and dead %0\"; ! 224: } ! 225: else ! 226: return \"add%:\\t%3,%1,$0\\t# %0 <- %1 - %2; %3 <- %0 - %4 and dead %0\"; ! 227: } ! 228: else ! 229: { ! 230: ops[0] = operands[3]; ! 231: ops[1] = operands[1]; ! 232: ops[2] = gen_rtx (CONST_INT, VOIDmode, i); ! 233: output_asm_insn (\"addi%:\\t%0,%1,%2\\t# simplification of:\", ops); ! 234: return \"\\t\\t\\t# %0 <- %1 - %2; %3 <- %0 - %4 and dead %0\"; ! 235: } ! 236: }") ! 237: ! 238: ! 239: ;; ! 240: ;; .................... ! 241: ;; ! 242: ;; ARITHMETIC ! 243: ;; ! 244: ;; .................... ! 245: ;; ! 246: ! 247: (define_insn "adddf3" ! 248: [(set (match_operand:DF 0 "general_operand" "=f") ! 249: (plus:DF (match_operand:DF 1 "general_operand" "%f") ! 250: (match_operand:DF 2 "general_operand" "f")))] ! 251: "" ! 252: "add.d\\t%0,%1,%2") ! 253: ! 254: (define_insn "addsf3" ! 255: [(set (match_operand:SF 0 "general_operand" "=f") ! 256: (plus:SF (match_operand:SF 1 "general_operand" "%f") ! 257: (match_operand:SF 2 "general_operand" "f")))] ! 258: "" ! 259: "add.s\\t%0,%1,%2") ! 260: ! 261: (define_insn "addsi3" ! 262: [(set (match_operand:SI 0 "register_operand" "=r") ! 263: (plus:SI (match_operand:SI 1 "register_operand" "%r") ! 264: (match_operand:SI 2 "general_operand" "rIJ")))] ! 265: "" ! 266: "* ! 267: { ! 268: if (GET_CODE (operands[2]) == CONST_INT) ! 269: { ! 270: if (CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'I')) ! 271: return \"addi%:\\t%0,%1,%x2\\t#addsi3\\t%1,%d2 -> %0\"; ! 272: else if (CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'J')) ! 273: return \"add%:\\t%0,%1,$0\\t#addsi3\\t%1,%2 -> %0\"; ! 274: else abort_with_insn (insn, \"Constant does not fit descriptor\"); ! 275: } ! 276: else ! 277: return \"add%:\\t%0,%1,%2\\t#addsi3\\t%1,%2 -> %0\"; ! 278: }") ! 279: ! 280: (define_insn "addhi3" ! 281: [(set (match_operand:HI 0 "general_operand" "=r") ! 282: (plus:HI (match_operand:HI 1 "general_operand" "%r") ! 283: (match_operand:HI 2 "general_operand" "rIJ")))] ! 284: "" ! 285: "* ! 286: { ! 287: if (GET_CODE (operands[2]) == CONST_INT) ! 288: { ! 289: if (CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'I')) ! 290: return \"addi%:\\t%0,%1,%x2\\t#addhi3\\t%1,%d2 -> %0\"; ! 291: else if (CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'J')) ! 292: return \"add%:\\t%0,%1,$0\\t#addhi3\\t%1,%2 -> %0\"; ! 293: else abort_with_insn (insn, \"Constant does not fit descriptor\"); ! 294: } ! 295: else ! 296: return \"add%:\\t%0,%1,%2\\t#addhi3 %1,%2 -> %0\"; ! 297: ! 298: }") ! 299: ! 300: (define_insn "addqi3" ! 301: [(set (match_operand:QI 0 "general_operand" "=r") ! 302: (plus:QI (match_operand:QI 1 "general_operand" "%r") ! 303: (match_operand:QI 2 "general_operand" "rIJ")))] ! 304: "" ! 305: "* ! 306: { ! 307: if (GET_CODE (operands[2]) == CONST_INT) ! 308: { ! 309: if (CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'I')) ! 310: return \"addi%:\\t%0,%1,%x2\\t#addqi3\\t%1,%d2 -> %0\"; ! 311: else if (CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'J')) ! 312: return \"add%:\\t%0,%1,$0\\t#addqi3\\t%1,%2 -> %0\"; ! 313: else abort_with_insn (insn, \"Constant does not fit descriptor\"); ! 314: } ! 315: else ! 316: return \"add%:\\t%0,%1,%2\\t#addqi3 %1,%2 -> %0\"; ! 317: }") ! 318: ! 319: ;;- All kinds of subtract instructions. ! 320: ! 321: (define_insn "subdf3" ! 322: [(set (match_operand:DF 0 "general_operand" "=f") ! 323: (minus:DF (match_operand:DF 1 "general_operand" "f") ! 324: (match_operand:DF 2 "general_operand" "f")))] ! 325: "" ! 326: "sub.d\\t%0,%1,%2") ! 327: ! 328: (define_insn "subsf3" ! 329: [(set (match_operand:SF 0 "general_operand" "=f") ! 330: (minus:SF (match_operand:SF 1 "general_operand" "f") ! 331: (match_operand:SF 2 "general_operand" "f")))] ! 332: "" ! 333: "sub.s\\t%0,%1,%2") ! 334: ! 335: (define_insn "subsi3" ! 336: [(set (match_operand:SI 0 "general_operand" "=r") ! 337: (minus:SI (match_operand:SI 1 "general_operand" "r") ! 338: (match_operand:SI 2 "general_operand" "rIJ")))] ! 339: "" ! 340: "* ! 341: { ! 342: if (GET_CODE (operands[2]) == CONST_INT) ! 343: { ! 344: if (CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'I')) ! 345: { ! 346: rtx ops[4]; ! 347: ops[0] = operands[0]; ! 348: ops[1] = operands[1]; ! 349: ops[3] = operands[2]; ! 350: ops[2] = gen_rtx (CONST_INT, VOIDmode, -INTVAL (operands[2])); ! 351: output_asm_insn (\"addi%:\\t%0,%1,%x2\\t#subsi3\\t%1,%d3 -> %0\", ! 352: ops); ! 353: return \"\"; ! 354: } ! 355: else if (CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'J')) ! 356: return \"sub%:\\t%0,%1,$0\\t#subsi3\\t%1,%2 -> %0\"; ! 357: else abort_with_insn (insn, \"Constant does not fit descriptor\"); ! 358: } ! 359: else ! 360: return \"sub%:\\t%0,%1,%2\\t#subsi3 %1,%2 -> %0\"; ! 361: }") ! 362: ! 363: (define_insn "subhi3" ! 364: [(set (match_operand:HI 0 "general_operand" "=r") ! 365: (minus:HI (match_operand:HI 1 "general_operand" "r") ! 366: (match_operand:HI 2 "general_operand" "r")))] ! 367: "" ! 368: "* ! 369: { ! 370: if (GET_CODE (operands[2]) == CONST_INT) ! 371: { ! 372: if (CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'I')) ! 373: { ! 374: rtx ops[4]; ! 375: ops[0] = operands[0]; ! 376: ops[1] = operands[1]; ! 377: ops[3] = operands[2]; ! 378: ops[2] = gen_rtx (CONST_INT, VOIDmode, -INTVAL (operands[2])); ! 379: output_asm_insn (\"addi%:\\t%0,%1,%x2\\t#subhi3\\t%1,%d3 -> %0\" ! 380: , ops); ! 381: return \"\"; ! 382: } ! 383: else if (CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'J')) ! 384: return \"sub%:\\t%0,%1,$0\\t#subhi3\\t%1,%2 -> %0\"; ! 385: else abort_with_insn (insn, \"Constant does not fit descriptor\"); ! 386: } ! 387: else ! 388: return \"sub%:\\t%0,%1,%2\\t#subhi3 %1,%2 -> %0\"; ! 389: }") ! 390: ! 391: (define_insn "subqi3" ! 392: [(set (match_operand:QI 0 "general_operand" "=r") ! 393: (minus:QI (match_operand:QI 1 "general_operand" "r") ! 394: (match_operand:QI 2 "general_operand" "r")))] ! 395: "" ! 396: "* ! 397: { ! 398: if (GET_CODE (operands[2]) == CONST_INT) ! 399: { ! 400: if (CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'I')) ! 401: { ! 402: rtx ops[4]; ! 403: ops[0] = operands[0]; ! 404: ops[1] = operands[1]; ! 405: ops[3] = operands[2]; ! 406: ops[2] = gen_rtx (CONST_INT, VOIDmode, -INTVAL (operands[2])); ! 407: output_asm_insn (\"addi%:\\t%0,%1,%x2\\t#subqi3\\t%1,%d3 -> %0\" ! 408: , ops); ! 409: return \"\"; ! 410: } ! 411: else if (CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'J')) ! 412: return \"sub%:\\t%0,%1,$0\\t#subqi3\\t%1,%2 -> %0\"; ! 413: else abort_with_insn (insn, \"Constant does not fit descriptor\"); ! 414: } ! 415: else ! 416: return \"sub%:\\t%0,%1,%2\\t#subqi3 %1,%2 -> %0\"; ! 417: }") ! 418: ! 419: ;;- Multiply instructions. ! 420: ! 421: (define_insn "muldf3" ! 422: [(set (match_operand:DF 0 "general_operand" "=f") ! 423: (mult:DF (match_operand:DF 1 "general_operand" "%f") ! 424: (match_operand:DF 2 "general_operand" "f")))] ! 425: "" ! 426: "mul.d\\t%0,%1,%2") ! 427: ! 428: (define_insn "mulsf3" ! 429: [(set (match_operand:SF 0 "general_operand" "=f") ! 430: (mult:SF (match_operand:SF 1 "general_operand" "%f") ! 431: (match_operand:SF 2 "general_operand" "f")))] ! 432: "" ! 433: "mul.s\\t%0,%1,%2") ! 434: ! 435: (define_insn "mulsi3" ! 436: [(set (match_operand:SI 0 "general_operand" "=r") ! 437: (mult:SI (match_operand:SI 1 "general_operand" "%r") ! 438: (match_operand:SI 2 "general_operand" "r")))] ! 439: "" ! 440: "mul\\t%0,%1,%2\\t#mulsi3 %1,%2 -> %0") ! 441: ! 442: (define_insn "mulhi3" ! 443: [(set (match_operand:HI 0 "general_operand" "=r") ! 444: (mult:HI (match_operand:HI 1 "general_operand" "%r") ! 445: (match_operand:HI 2 "general_operand" "r")))] ! 446: "" ! 447: "mul\\t%0,%1,%2\\t#mulhi3 %1,%2 -> %0") ! 448: ! 449: (define_insn "mulqi3" ! 450: [(set (match_operand:QI 0 "general_operand" "=r") ! 451: (mult:QI (match_operand:QI 1 "general_operand" "%r") ! 452: (match_operand:QI 2 "general_operand" "r")))] ! 453: "" ! 454: "mul\\t%0,%1,%2\\t#mulhi3 %1,%2 -> %0") ! 455: ! 456: ;;- Divide instructions. ! 457: ! 458: (define_insn "divdf3" ! 459: [(set (match_operand:DF 0 "general_operand" "=f") ! 460: (div:DF (match_operand:DF 1 "general_operand" "f") ! 461: (match_operand:DF 2 "general_operand" "f")))] ! 462: "" ! 463: "div.d\\t%0,\\t%1,%2") ! 464: ! 465: (define_insn "divsf3" ! 466: [(set (match_operand:SF 0 "general_operand" "=f") ! 467: (div:SF (match_operand:SF 1 "general_operand" "f") ! 468: (match_operand:SF 2 "general_operand" "f")))] ! 469: "" ! 470: "div.s\\t%0,%1,%2") ! 471: ! 472: (define_insn "divsi3" ! 473: [(set (match_operand:SI 0 "general_operand" "=r") ! 474: (div:SI (match_operand:SI 1 "general_operand" "r") ! 475: (match_operand:SI 2 "general_operand" "r")))] ! 476: "" ! 477: "div\\t%0,%1,%2\\t#divsi3 %1,%2 -> %0") ! 478: ! 479: (define_insn "divhi3" ! 480: [(set (match_operand:HI 0 "general_operand" "=r") ! 481: (div:HI (match_operand:HI 1 "general_operand" "r") ! 482: (match_operand:HI 2 "general_operand" "r")))] ! 483: "" ! 484: "div\\t%0,%1,%2\\t#divhi3 %1,%2 -> %0") ! 485: ! 486: (define_insn "divqi3" ! 487: [(set (match_operand:QI 0 "general_operand" "=r") ! 488: (div:QI (match_operand:QI 1 "general_operand" "r") ! 489: (match_operand:QI 2 "general_operand" "r")))] ! 490: "" ! 491: "div\\t%0,%1,%2\\t#divqi3 %1,%2 -> %0") ! 492: ! 493: ;; ! 494: ;; .................... ! 495: ;; ! 496: ;; LOGICAL ! 497: ;; ! 498: ;; .................... ! 499: ;; ! 500: ! 501: (define_insn "anddi3" ! 502: [(set (match_operand:DI 0 "general_operand" "=r") ! 503: (and:DI (match_operand:DI 1 "general_operand" "%r") ! 504: (match_operand:DI 2 "general_operand" "r")))] ! 505: "" ! 506: "* ! 507: { ! 508: rtx xops[3]; ! 509: if ((REGNO (operands[0]) != (REGNO (operands[1]) +1)) ! 510: && ! 511: (REGNO (operands[0]) != (REGNO (operands[2]) +1))) ! 512: { ! 513: /* TAKE CARE OF OVERLAPS */ ! 514: xops[0] = gen_rtx (REG, SImode, REGNO (operands[0])); ! 515: xops[1] = gen_rtx (REG, SImode, REGNO (operands[1])); ! 516: xops[2] = gen_rtx (REG, SImode, REGNO (operands[2])); ! 517: output_asm_insn (\"and\\t%0,%1,%2\\t#anddi %1,%2 -> %0\", xops); ! 518: xops[0] = gen_rtx (REG, SImode, REGNO (xops[0])+1); ! 519: xops[1] = gen_rtx (REG, SImode, REGNO (xops[1])+1); ! 520: xops[2] = gen_rtx (REG, SImode, REGNO (xops[2])+1); ! 521: output_asm_insn (\"and\\t%0,%1,%2\\t#anddi %1,%2 -> %0\", xops); ! 522: } ! 523: else ! 524: abort (); ! 525: return \"\"; ! 526: }") ! 527: ! 528: (define_insn "andsi3" ! 529: [(set (match_operand:SI 0 "general_operand" "=r,&r") ! 530: (and:SI (match_operand:SI 1 "general_operand" "%r,r") ! 531: (match_operand:SI 2 "general_operand" "rJ,I")))] ! 532: "" ! 533: "* ! 534: { ! 535: rtx xops[3]; ! 536: if (GET_CODE (operands[2]) == CONST_INT) ! 537: { ! 538: if (CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'I')) ! 539: if (INTVAL (operands[2]) >= 0) ! 540: { ! 541: return \"andi\\t%0,%1,%x2\\t#andsi3\\t%1,%d2 -> %0\"; ! 542: } ! 543: else ! 544: { ! 545: xops[0] = operands[0]; ! 546: xops[1] = operands[1];; ! 547: xops[2] = gen_rtx (CONST_INT, VOIDmode, ! 548: (INTVAL (operands[2]))>>16); ! 549: output_asm_insn (\"lui\\t%0,%x2\\t#load higher part (andsi3)\", ! 550: xops); ! 551: xops[2] = gen_rtx (CONST_INT, VOIDmode, ! 552: 0xffff & (INTVAL (operands[2]))); ! 553: output_asm_insn (\"addi%:\\t%0,$0,%x2\\t#load lower part (andsi3)\", ! 554: xops); ! 555: output_asm_insn (\"and\\t%0,%0,%1\\t#andsi3\", xops); ! 556: return \"\"; ! 557: } ! 558: else if (CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'J')) ! 559: return \"and\\t%0,%1,$0\\t#andsi3\\t%1,%2 -> %0\"; ! 560: else return \"ERROR op2 not zero \\t#andsi3\\t%1,%2 -> %0\"; ! 561: } ! 562: else ! 563: return \"and\\t%0,%1,%2\\t#andsi3\\t%1,%2 -> %0\"; ! 564: }") ! 565: ! 566: (define_insn "andhi3" ! 567: [(set (match_operand:HI 0 "general_operand" "=r") ! 568: (and:HI (match_operand:HI 1 "general_operand" "%r") ! 569: (match_operand:HI 2 "general_operand" "r")))] ! 570: "" ! 571: "and\\t%0,%1,%2\\t#andhi3 %1,%2 -> %0") ! 572: ! 573: (define_insn "andqi3" ! 574: [(set (match_operand:QI 0 "general_operand" "=r") ! 575: (and:QI (match_operand:QI 1 "general_operand" "%r") ! 576: (match_operand:QI 2 "general_operand" "r")))] ! 577: "" ! 578: "and\\t%0,%1,%2\\t#andqi3 %1,%2 -> %0") ! 579: ! 580: (define_insn "iordi3" ! 581: [(set (match_operand:DI 0 "general_operand" "=r") ! 582: (ior:DI (match_operand:DI 1 "general_operand" "%r") ! 583: (match_operand:DI 2 "general_operand" "r")))] ! 584: "" ! 585: "* ! 586: { ! 587: rtx xops[3]; ! 588: if ((REGNO (operands[0]) != (REGNO (operands[1]) +1)) ! 589: && ! 590: (REGNO (operands[0]) != (REGNO (operands[2]) +1))) ! 591: { ! 592: /* TAKE CARE OF OVERLAPS */ ! 593: xops[0] = gen_rtx (REG, SImode, REGNO (operands[0])); ! 594: xops[1] = gen_rtx (REG, SImode, REGNO (operands[1])); ! 595: xops[2] = gen_rtx (REG, SImode, REGNO (operands[2])); ! 596: output_asm_insn (\"or\\t%0,%1,%2\\t#iordi3 %1,%2 -> %0\", xops); ! 597: xops[0] = gen_rtx (REG, SImode, REGNO (xops[0])+1); ! 598: xops[1] = gen_rtx (REG, SImode, REGNO (xops[1])+1); ! 599: xops[2] = gen_rtx (REG, SImode, REGNO (xops[2])+1); ! 600: output_asm_insn (\"or\\t%0,%1,%2\\t#iordi3 %1,%2 -> %0\", xops); ! 601: } ! 602: else ! 603: abort (); ! 604: return \"\"; ! 605: }") ! 606: ! 607: (define_insn "iorsi3" ! 608: [(set (match_operand:SI 0 "general_operand" "=r") ! 609: (ior:SI (match_operand:SI 1 "general_operand" "%r") ! 610: (match_operand:SI 2 "general_operand" "rIJ")))] ! 611: "" ! 612: "* ! 613: { ! 614: if (GET_CODE (operands[2]) == CONST_INT) ! 615: { ! 616: if (CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'I')) ! 617: { ! 618: return \"ori\\t%0,%1,%x2\\t#iorsi3\\t%1,%d2 -> %0\"; ! 619: } ! 620: else if (CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'J')) ! 621: return \"or\\t%0,%1,$0\\t#iorsi3\\t%1,%2 -> %0\"; ! 622: else return \"ERROR op2 not zero \\t#iorsi3\\t%1,%2 -> %0\"; ! 623: } ! 624: else ! 625: return \"or\\t%0,%1,%2\\t#iorsi3\\t%1,%2 -> %0\"; ! 626: }") ! 627: ! 628: (define_insn "iorhi3" ! 629: [(set (match_operand:HI 0 "general_operand" "=r") ! 630: (ior:HI (match_operand:HI 1 "general_operand" "%r") ! 631: (match_operand:HI 2 "general_operand" "r")))] ! 632: "" ! 633: "or\\t%0,%1,%2\\t#iorhi3 %1,%2 -> %0") ! 634: ! 635: (define_insn "iorqi3" ! 636: [(set (match_operand:QI 0 "general_operand" "=r") ! 637: (ior:QI (match_operand:QI 1 "general_operand" "%r") ! 638: (match_operand:QI 2 "general_operand" "r")))] ! 639: "" ! 640: "or\\t%0,%1,%2\\t#iorqi3 %1,%2 -> %0") ! 641: ! 642: (define_insn "xordi3" ! 643: [(set (match_operand:DI 0 "general_operand" "=r") ! 644: (xor:DI (match_operand:DI 1 "general_operand" "r") ! 645: (match_operand:DI 2 "general_operand" "r")))] ! 646: "" ! 647: "* ! 648: { ! 649: rtx xops[3]; ! 650: if ((REGNO (operands[0]) != (REGNO (operands[1]) +1)) ! 651: && ! 652: (REGNO (operands[0]) != (REGNO (operands[2]) +1))) ! 653: { ! 654: /* TAKE CARE OF OVERLAPS */ ! 655: xops[0] = gen_rtx (REG, SImode, REGNO (operands[0])); ! 656: xops[1] = gen_rtx (REG, SImode, REGNO (operands[1])); ! 657: xops[2] = gen_rtx (REG, SImode, REGNO (operands[2])); ! 658: output_asm_insn (\"xor\\t%0,%1,%2\\t#xordi3 %1,%2 -> %0\", xops); ! 659: xops[0] = gen_rtx (REG, SImode, REGNO (xops[0])+1); ! 660: xops[1] = gen_rtx (REG, SImode, REGNO (xops[1])+1); ! 661: xops[2] = gen_rtx (REG, SImode, REGNO (xops[2])+1); ! 662: output_asm_insn (\"xor\\t%0,%1,%2\\t#xordi3 %1,%2 -> %0\", xops); ! 663: } ! 664: else ! 665: abort (); ! 666: return \"\"; ! 667: }") ! 668: ! 669: (define_insn "xorsi3" ! 670: [(set (match_operand:SI 0 "general_operand" "=r") ! 671: (xor:SI (match_operand:SI 1 "general_operand" "%r") ! 672: (match_operand:SI 2 "general_operand" "rIJ")))] ! 673: "" ! 674: "* ! 675: { ! 676: if (GET_CODE (operands[2]) == CONST_INT) ! 677: { ! 678: if (CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'I')) ! 679: { ! 680: return \"xori\\t%0,%1,%x2\\t#xorsi3\\t%1,%d2 -> %0\"; ! 681: } ! 682: else if (CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'J')) ! 683: return \"xor\\t%0,%1,$0\\t#xorsi3\\t%1,%2 -> %0\"; ! 684: else return \"ERROR op2 not zero \\t#xorsi3\\t%1,%2 -> %0\"; ! 685: } ! 686: else ! 687: return \"xor\\t%0,%1,%2\\t#xorsi3\\t%1,%2 -> %0\"; ! 688: }") ! 689: ! 690: (define_insn "xorhi3" ! 691: [(set (match_operand:HI 0 "general_operand" "=r") ! 692: (xor:HI (match_operand:HI 1 "general_operand" "%r") ! 693: (match_operand:HI 2 "general_operand" "r")))] ! 694: "" ! 695: "xor\\t%0,%1,%2\\t#xorhi3 %1,%2 -> %0") ! 696: ! 697: (define_insn "xorqi3" ! 698: [(set (match_operand:QI 0 "general_operand" "=r") ! 699: (xor:QI (match_operand:QI 1 "general_operand" "%r") ! 700: (match_operand:QI 2 "general_operand" "r")))] ! 701: "" ! 702: "xor\\t%0,%1,%2\\t#xorqi3 %1,%2 -> %0") ! 703: ! 704: ;; ! 705: ;; .................... ! 706: ;; ! 707: ;; TRUNCATION ! 708: ;; ! 709: ;; .................... ! 710: ! 711: ;; Extension and truncation insns. ! 712: ;; Those for integer source operand ! 713: ;; are ordered widest source type first. ! 714: ! 715: ! 716: (define_insn "truncsiqi2" ! 717: [(set (match_operand:QI 0 "general_operand" "=r") ! 718: (truncate:QI (match_operand:SI 1 "general_operand" "r")))] ! 719: "" ! 720: "andi\\t%0,%1,0xff\\t#truncsiqi2\\t %1 -> %0") ! 721: ! 722: (define_insn "truncsihi2" ! 723: [(set (match_operand:HI 0 "general_operand" "=r") ! 724: (truncate:HI (match_operand:SI 1 "general_operand" "r")))] ! 725: "" ! 726: "* ! 727: output_asm_insn (\"sll\\t%0,%1,0x10\\t#truncsihi2\\t %1 -> %0\", ! 728: operands); ! 729: return \"sra\\t%0,%0,0x10\\t#truncsihi2\\t %1 -> %0\"; ! 730: ") ! 731: ! 732: (define_insn "trunchiqi2" ! 733: [(set (match_operand:QI 0 "general_operand" "=r") ! 734: (truncate:QI (match_operand:HI 1 "general_operand" "r")))] ! 735: "" ! 736: "andi\\t%0,%1,0xff\\t#trunchiqi2\\t %1 -> %0") ! 737: ! 738: (define_insn "truncdfsf2" ! 739: [(set (match_operand:SF 0 "general_operand" "=f") ! 740: (float_truncate:SF (match_operand:DF 1 "general_operand" "f")))] ! 741: "" ! 742: "cvt.s.d\\t%0,%1\\t#truncdfsf2\\t %1 -> %0") ! 743: ! 744: ;; ! 745: ;; .................... ! 746: ;; ! 747: ;; ZERO EXTENSION ! 748: ;; ! 749: ;; .................... ! 750: ! 751: ;; Extension insns. ! 752: ;; Those for integer source operand ! 753: ;; are ordered widest source type first. ! 754: ! 755: ! 756: ! 757: (define_insn "zero_extendhisi2" ! 758: [(set (match_operand:SI 0 "general_operand" "=r,r") ! 759: (zero_extend:SI (match_operand:HI 1 "general_operand" "r,m")))] ! 760: "" ! 761: "* ! 762: { ! 763: if (which_alternative == 0) ! 764: { ! 765: output_asm_insn (\"sll\\t%0,%1,0x10\\t#zero_extendhisi2\\t %1 -> %0\", ! 766: operands); ! 767: return \"srl\\t%0,%0,0x10\\t#zero_extendhisi2\\t %1 -> %0\"; ! 768: } ! 769: else ! 770: return \"lhu\\t%0,%1\\t#zero extendhisi2 %1 -> %0\"; ! 771: }") ! 772: ! 773: (define_insn "zero_extendqihi2" ! 774: [(set (match_operand:HI 0 "general_operand" "=r") ! 775: (zero_extend:HI (match_operand:QI 1 "general_operand" "r")))] ! 776: "" ! 777: "* ! 778: output_asm_insn (\"sll\\t%0,%1,0x18\\t#zero_extendqihi2\\t %1 -> %0\", ! 779: operands); ! 780: return \"srl\\t%0,%0,0x18\\t#zero_extendqihi2\\t %1 -> %0\"; ! 781: ") ! 782: ! 783: ! 784: (define_insn "zero_extendqisi2" ! 785: [(set (match_operand:SI 0 "general_operand" "=r,r") ! 786: (zero_extend:SI (match_operand:QI 1 "general_operand" "r,m")))] ! 787: "" ! 788: "* ! 789: { ! 790: if (which_alternative == 0) ! 791: { ! 792: return \"andi\\t%0,%1,0xff\\t#zero_extendqisi2\\t %1 -> %0\"; ! 793: } ! 794: else ! 795: return \"lbu\\t%0,%1\\t#zero extendqisi2 %1 -> %0\"; ! 796: }") ! 797: ! 798: ! 799: ;; ! 800: ;; .................... ! 801: ;; ! 802: ;; SIGN EXTENSION ! 803: ;; ! 804: ;; .................... ! 805: ! 806: ;; Extension insns. ! 807: ;; Those for integer source operand ! 808: ;; are ordered widest source type first. ! 809: ! 810: ! 811: ! 812: (define_insn "extendhisi2" ! 813: [(set (match_operand:SI 0 "general_operand" "=r,r") ! 814: (sign_extend:SI (match_operand:HI 1 "general_operand" "r,m")))] ! 815: "" ! 816: "* ! 817: { ! 818: if (which_alternative == 0) ! 819: { ! 820: output_asm_insn (\"sll\\t%0,%1,0x10\\t#sign extendhisi2\\t %1 -> %0\", ! 821: operands); ! 822: return \"sra\\t%0,%0,0x10\\t#sign extendhisi2\\t %1 -> %0\"; ! 823: } ! 824: else ! 825: return \"lh\\t%0,%1\\t#sign extendhisi2 %1 -> %0\"; ! 826: }") ! 827: ! 828: (define_insn "extendqihi2" ! 829: [(set (match_operand:HI 0 "general_operand" "=r") ! 830: (sign_extend:HI (match_operand:QI 1 "general_operand" "r")))] ! 831: "" ! 832: "* ! 833: output_asm_insn (\"sll\\t%0,%1,0x18\\t#sign extendqihi2\\t %1 -> %0\", ! 834: operands); ! 835: return \"sra\\t%0,%0,0x18\\t#sign extendqihi2\\t %1 -> %0\"; ! 836: ") ! 837: ! 838: ! 839: (define_insn "extendqisi2" ! 840: [(set (match_operand:SI 0 "general_operand" "=r,r") ! 841: (sign_extend:SI (match_operand:QI 1 "general_operand" "r,m")))] ! 842: "" ! 843: "* ! 844: { ! 845: if (which_alternative == 0) ! 846: { ! 847: output_asm_insn (\"sll\\t%0,%1,0x18\\t#sign extendqisi2\\t %1 -> %0\", ! 848: operands); ! 849: return \"sra\\t%0,%0,0x18\\t#sign extendqisi2\\t %1 -> %0\"; ! 850: } ! 851: else ! 852: return \"lb\\t%0,%1\\t#sign extendqisi2 %1 -> %0\"; ! 853: }") ! 854: ! 855: ! 856: (define_insn "extendsfdf2" ! 857: [(set (match_operand:DF 0 "general_operand" "=f") ! 858: (float_extend:DF (match_operand:SF 1 "general_operand" "f")))] ! 859: "" ! 860: "cvt.d.s\\t%0,%1\\t#extendsfdf2\\t %1 -> %0") ! 861: ! 862: ! 863: ;; ! 864: ;; .................... ! 865: ;; ! 866: ;; CONVERSIONS ! 867: ;; ! 868: ;; .................... ! 869: ! 870: ! 871: (define_insn "fix_truncdfsi2" ! 872: [(set (match_operand:SI 0 "general_operand" "=r") ! 873: (fix:SI (fix:DF (match_operand:DF 1 "general_operand" "f")))) ! 874: (clobber (reg:DF 44))] ! 875: "" ! 876: "trunc.w.d\\t$f12,%1,%0\\t#fix_truncdfsi2\\t%1 -> %0\;mfc1\\t%0,$f12\\t#fix_truncdfsi2\\t%1 -> %0") ! 877: ! 878: ! 879: (define_insn "fix_truncsfsi2" ! 880: [(set (match_operand:SI 0 "general_operand" "=r") ! 881: (fix:SI (fix:SF (match_operand:SF 1 "general_operand" "f")))) ! 882: (clobber (reg:DF 44))] ! 883: "" ! 884: "trunc.w.s\\t$f12,%1,%0\\t#fix_truncsfsi2\\t%1 -> %0\;mfc1\\t%0,$f12\\t#fix_truncsfsi2\\t%1 -> %0") ! 885: ! 886: (define_insn "floatsidf2" ! 887: [(set (match_operand:DF 0 "general_operand" "=f") ! 888: (float:DF (match_operand:SI 1 "general_operand" "r")))] ! 889: "" ! 890: "mtc1\\t%1,%0\\t#floatsidf2\\t%1 -> %0\;cvt.d.w\\t%0,%0\\t#floatsidf2\\t%1 -> %0") ! 891: ! 892: ! 893: (define_insn "floatsisf2" ! 894: [(set (match_operand:SF 0 "general_operand" "=f") ! 895: (float:SF (match_operand:SI 1 "general_operand" "r")))] ! 896: "" ! 897: "mtc1\\t%1,%0\\t#floatsisf2\\t%1 -> %0\;cvt.s.w\\t%0,%0\\t#floatsisf2\\t%1 -> %0") ! 898: ! 899: ;;- Wild things used when ! 900: ;;- unions make double and int ! 901: ;;- overlap. ! 902: ;;- ! 903: ;;- This must be supported ! 904: ;;- since corresponding code ! 905: ;;- gets generated ! 906: ! 907: (define_insn "" ! 908: [(set (subreg:DF (match_operand:DI 0 "register_operand" "=ry") 0) ! 909: (match_operand:DF 1 "register_operand" "rf")) ! 910: (clobber (match_operand 2 "register_operand" "rf"))] ! 911: "" ! 912: "* ! 913: { ! 914: rtx xops[2]; ! 915: xops[0] = gen_rtx (REG, SImode, REGNO (operands[0])); ! 916: #ifndef DECSTATION ! 917: xops[1] = gen_rtx (REG, DFmode, REGNO (operands[1])+1); ! 918: #else ! 919: xops[1] = gen_rtx (REG, DFmode, REGNO (operands[1])); ! 920: #endif ! 921: output_asm_insn (\"mfc1\\t%0,%1\\t# %1 -> (subreg:DF %0 0) \\t likely Union\" ! 922: , xops); ! 923: xops[0] = gen_rtx (REG, SImode, REGNO (operands[0])+1); ! 924: #ifndef DECSTATION ! 925: xops[1] = gen_rtx (REG, DFmode, REGNO (operands[1])); ! 926: #else ! 927: xops[1] = gen_rtx (REG, DFmode, REGNO (operands[1])+1); ! 928: #endif ! 929: output_asm_insn (\"mfc1\\t%0,%1\\t# %1 -> (subreg:DF %0 0) \" ! 930: , xops); ! 931: return (\"\"); ! 932: }") ! 933: ! 934: ! 935: ! 936: (define_insn "" ! 937: [(set (subreg:DF (match_operand:DI 0 "register_operand" "=ry") 0) ! 938: (match_operand:DF 1 "register_operand" "rf"))] ! 939: "" ! 940: "* ! 941: { ! 942: rtx xops[2]; ! 943: xops[0] = gen_rtx (REG, SImode, REGNO (operands[0])); ! 944: #ifndef DECSTATION ! 945: xops[1] = gen_rtx (REG, DFmode, REGNO (operands[1])+1); ! 946: #else ! 947: xops[1] = gen_rtx (REG, DFmode, REGNO (operands[1])); ! 948: #endif ! 949: output_asm_insn (\"mfc1\\t%0,%1\\t# %1 -> (subreg:DF %0 0) \\t likely Union\" ! 950: , xops); ! 951: xops[0] = gen_rtx (REG, SImode, REGNO (operands[0])+1); ! 952: #ifndef DECSTATION ! 953: xops[1] = gen_rtx (REG, DFmode, REGNO (operands[1])); ! 954: #else ! 955: xops[1] = gen_rtx (REG, DFmode, REGNO (operands[1])+1); ! 956: #endif ! 957: output_asm_insn (\"mfc1\\t%0,%1\\t# %1 -> (subreg:DF %0 0) \" ! 958: ,xops); ! 959: return (\"\"); ! 960: }") ! 961: ! 962: ! 963: ! 964: (define_insn "" ! 965: [(set (match_operand:DF 0 "register_operand" "=rf") ! 966: (subreg:DF (match_operand:DI 1 "register_operand" "ry") 0)) ! 967: (clobber (match_operand 2 "register_operand" "rf"))] ! 968: "" ! 969: "* ! 970: { ! 971: rtx xops[2]; ! 972: xops[0] = gen_rtx (REG, DFmode, REGNO (operands[0])); ! 973: #ifndef DECSTATION ! 974: xops[1] = gen_rtx (REG, SImode, REGNO (operands[1])+1); ! 975: #else ! 976: xops[1] = gen_rtx (REG, SImode, REGNO (operands[1])); ! 977: #endif ! 978: output_asm_insn (\"mtc1\\t%1,%0\\t# (subreg:DF %1) -> %0 \\t\" ! 979: , xops); ! 980: xops[0] = gen_rtx (REG, DFmode, REGNO (operands[0])+1); ! 981: #ifndef DECSTATION ! 982: xops[1] = gen_rtx (REG, SImode, REGNO (operands[1])); ! 983: #else ! 984: xops[1] = gen_rtx (REG, SImode, REGNO (operands[1])+1); ! 985: #endif ! 986: output_asm_insn (\"mtc1\\t%1,%0\\t# (subreg:DF %1) -> %0 \\t\" ! 987: , xops); ! 988: return (\"\"); ! 989: }") ! 990: ! 991: ! 992: ! 993: (define_insn "" ! 994: [(set (match_operand:DF 0 "register_operand" "=rf") ! 995: (subreg:DF (match_operand:DI 1 "register_operand" "ry") 0))] ! 996: "" ! 997: "* ! 998: { ! 999: rtx xops[2]; ! 1000: xops[0] = gen_rtx (REG, DFmode, REGNO (operands[0])); ! 1001: #ifndef DECSTATION ! 1002: xops[1] = gen_rtx (REG, SImode, REGNO (operands[1])+1); ! 1003: #else ! 1004: xops[1] = gen_rtx (REG, SImode, REGNO (operands[1])); ! 1005: #endif ! 1006: output_asm_insn (\"mtc1\\t%1,%0\\t# (subreg:DF %1) -> %0 \\t\" ! 1007: , xops); ! 1008: xops[0] = gen_rtx (REG, DFmode, REGNO (operands[0])+1); ! 1009: #ifndef DECSTATION ! 1010: xops[1] = gen_rtx (REG, SImode, REGNO (operands[1])); ! 1011: #else ! 1012: xops[1] = gen_rtx (REG, SImode, REGNO (operands[1])+1); ! 1013: #endif ! 1014: output_asm_insn (\"mtc1\\t%1,%0\\t# (subreg:DF %1) -> %0 \\t\" ! 1015: , xops); ! 1016: ! 1017: return (\"\"); ! 1018: }") ! 1019: ! 1020: ;; ! 1021: ;; .................... ! 1022: ;; ! 1023: ;; MOVES ! 1024: ;; ! 1025: ;; and ! 1026: ;; ! 1027: ;; LOADS AND STORES ! 1028: ;; ! 1029: ;; .................... ! 1030: ! 1031: (define_insn "movdi" ! 1032: [(set (match_operand:DI 0 "general_operand" "=r,*r,*m") ! 1033: (match_operand:DI 1 "general_operand" "r,*miF,*r"))] ! 1034: "" ! 1035: "* ! 1036: { ! 1037: extern rtx change_address (); ! 1038: extern rtx plus_constant (); ! 1039: ! 1040: if (which_alternative == 0) ! 1041: { ! 1042: rtx xops[2]; ! 1043: if (REGNO (operands[0]) != (REGNO (operands[1]) +1)) ! 1044: { ! 1045: /* TAKE CARE OF OVERLAPS */ ! 1046: xops[0] = gen_rtx (REG, SImode, REGNO (operands[0])); ! 1047: xops[1] = gen_rtx (REG, SImode, REGNO (operands[1])); ! 1048: output_asm_insn (\"add%:\\t%0,$0,%1\\t#movdi %1 -> %0\", xops); ! 1049: xops[0] = gen_rtx (REG, SImode, REGNO (xops[0])+1); ! 1050: xops[1] = gen_rtx (REG, SImode, REGNO (xops[1])+1); ! 1051: output_asm_insn (\"add%:\\t%0,$0,%1\\t#movdi %1 -> %0\", xops); ! 1052: } ! 1053: else ! 1054: { ! 1055: /* TAKE CARE OF OVERLAPS */ ! 1056: xops[0] = gen_rtx (REG, SImode, REGNO (operands[0])+1); ! 1057: xops[1] = gen_rtx (REG, SImode, REGNO (operands[1])+1); ! 1058: output_asm_insn (\"add%:\\t%0,$0,%1\\t#movdi %1 -> %0\", xops); ! 1059: xops[0] = gen_rtx (REG, SImode, REGNO (xops[0])-1); ! 1060: xops[1] = gen_rtx (REG, SImode, REGNO (xops[1])-1); ! 1061: output_asm_insn (\"add%:\\t%0,$0,%1\\t#movdi %1 -> %0\", xops); ! 1062: } ! 1063: return \"\"; ! 1064: } ! 1065: else if (which_alternative == 1) ! 1066: { ! 1067: /* No overlap here */ ! 1068: rtx xops[2]; ! 1069: xops[0] = gen_rtx (REG, SImode, REGNO (operands[0])); ! 1070: if (GET_CODE (operands[1]) == MEM) ! 1071: { ! 1072: xops[1] = gen_rtx (MEM, SImode, XEXP (operands[1], 0)); ! 1073: output_asm_insn (\"lw\\t%0,%1\\t#movdi %1 (mem) -> %0\", xops); ! 1074: } ! 1075: else if (CONSTANT_P (operands[1])) ! 1076: { ! 1077: #ifdef WORDS_BIG_ENDIAN ! 1078: xops[1] = const0_rtx; ! 1079: #else ! 1080: xops[1] = operands[1]; ! 1081: #endif ! 1082: output_load_immediate (xops); ! 1083: } ! 1084: else if (GET_CODE (operands[1]) == CONST_DOUBLE) ! 1085: { ! 1086: xops[1] = gen_rtx (CONST_INT, VOIDmode, ! 1087: CONST_DOUBLE_LOW (operands[1])); ! 1088: output_load_immediate (xops); ! 1089: } ! 1090: else ! 1091: abort (); ! 1092: xops[0] = gen_rtx (REG, SImode, REGNO (operands[0])+1); ! 1093: if (offsettable_memref_p (operands[1])) ! 1094: { ! 1095: xops[1] = adj_offsettable_operand (gen_rtx (MEM, SImode, ! 1096: XEXP (operands[1], 0)), ! 1097: 4); ! 1098: output_asm_insn (\"lw\\t%0,%1\\t#movdi %1(mem) -> %0\", xops); ! 1099: } ! 1100: else if (GET_CODE (operands[1]) == MEM) ! 1101: { ! 1102: abort (); ! 1103: output_asm_insn (\"lw\\t%0,%1\\t#movdi %1(mem) -> %0\", xops); ! 1104: } ! 1105: else if (CONSTANT_P (operands[1])) ! 1106: { ! 1107: #ifdef WORDS_BIG_ENDIAN ! 1108: xops[1] = operands[1]; ! 1109: #else ! 1110: xops[1] = const0_rtx; ! 1111: #endif ! 1112: output_load_immediate (xops); ! 1113: } ! 1114: else if (GET_CODE (operands[1]) == CONST_DOUBLE) ! 1115: { ! 1116: xops[1] = gen_rtx (CONST_INT, VOIDmode, ! 1117: CONST_DOUBLE_HIGH (operands[1])); ! 1118: output_load_immediate (xops); ! 1119: } ! 1120: else abort (); ! 1121: return \"\"; ! 1122: } ! 1123: else ! 1124: { ! 1125: /* No overlap here */ ! 1126: rtx xops[2]; ! 1127: xops[1] = gen_rtx (REG, SImode, REGNO (operands[1])); ! 1128: if (GET_CODE (operands[0]) == MEM) ! 1129: xops[0] = gen_rtx (MEM, SImode, XEXP (operands[0], 0)); ! 1130: else abort (); ! 1131: output_asm_insn (\"sw\\t%1,%0\\t#movdi %1 -> %0(mem)\", xops); ! 1132: xops[1] = gen_rtx (REG, SImode, REGNO (operands[1])+1); ! 1133: if (offsettable_memref_p (operands[0])) ! 1134: { ! 1135: xops[0] = adj_offsettable_operand (gen_rtx (MEM, SImode, ! 1136: XEXP (operands[0], 0)), ! 1137: 4); ! 1138: output_asm_insn (\"sw\\t%1,%0\\t#movdi %1 -> %0 (mem)\", xops); ! 1139: } ! 1140: else if (GET_CODE (operands[0]) == MEM) ! 1141: { ! 1142: abort (); ! 1143: output_asm_insn (\"sw\\t%1,%0\\t#movdi %1(mem) -> %0\", xops); ! 1144: } ! 1145: else abort (); ! 1146: return \"\"; ! 1147: } ! 1148: }") ! 1149: ! 1150: (define_insn "movsi" ! 1151: [(set (match_operand:SI 0 "general_operand" "=r,r,m,r,r,m,*r") ! 1152: (match_operand:SI 1 "general_operand" "r,m,r,i,J,J,*p"))] ! 1153: "" ! 1154: "* ! 1155: { ! 1156: if (which_alternative >= 4) ! 1157: { ! 1158: if (which_alternative == 4) ! 1159: return \"add%:\\t%0,$0,$0\\t#movsi\\t%1 == 0 -> %0\"; ! 1160: else if (which_alternative == 5) ! 1161: return \"sw\\t$0,%0\\t#movsi\\t%1 == 0 -> %0\"; ! 1162: else if (which_alternative == 6) ! 1163: { ! 1164: rtx xops[4]; ! 1165: register rtx addr; ! 1166: xops[0] = operands[0]; ! 1167: addr = operands[1]; ! 1168: if ((GET_CODE (addr) == PLUS) ! 1169: && (GET_CODE (XEXP (addr, 0)) == REG)) ! 1170: { ! 1171: xops[1] = XEXP (addr, 0); ! 1172: xops[2] = XEXP (addr, 1); ! 1173: xops[3] = addr; ! 1174: output_asm_insn (\"addiu\\t%0,%1,%2\\t#movsi (*p)\\t%a3 -> %0\", xops); ! 1175: return \"\"; ! 1176: } ! 1177: else abort (); ! 1178: } ! 1179: } ! 1180: else if ((GET_CODE (operands[0]) == REG) && (GET_CODE (operands[1]) == REG)) ! 1181: return \"add%:\\t%0,$0,%1\\t#movsi\\t%1 -> %0 \"; ! 1182: else if (GET_CODE (operands[0]) == REG ! 1183: && ! 1184: GET_CODE (operands[1]) == CONST_INT) ! 1185: { ! 1186: output_load_immediate (operands); ! 1187: return \"\"; ! 1188: } ! 1189: else if (GET_CODE (operands[0]) == REG) ! 1190: { ! 1191: if (GET_CODE (operands[1]) == SYMBOL_REF ! 1192: || GET_CODE (operands[1]) == LABEL_REF) ! 1193: return \"la\\t%0,%a1\\t#movsi %a1 -> %0\"; ! 1194: else if (GET_CODE (operands[1]) == CONST) ! 1195: return \"la\\t%0,%a1\\t#movsi %a1(AExp) -> %0\"; ! 1196: else ! 1197: return \"lw\\t%0,%1\\t#movsi %1 -> %0\"; ! 1198: } ! 1199: else ! 1200: return \"sw\\t%1,%0\\t#movsi %1 -> %0\"; ! 1201: }") ! 1202: ! 1203: (define_insn "" ! 1204: [(set (match_operand:SI 0 "register_operand" "=*r") ! 1205: (match_operand:SI 1 "address_operand" "*p"))] ! 1206: "FIXED_FRAME_PTR_REL_P (operands[1])" ! 1207: "* ! 1208: { ! 1209: rtx xops[4]; ! 1210: register rtx addr; ! 1211: xops[0] = operands[0]; ! 1212: addr = operands[1]; ! 1213: if (GET_CODE (addr) == PLUS ! 1214: && GET_CODE (XEXP (addr, 0)) == REG) ! 1215: { ! 1216: xops[1] = XEXP (addr, 0); ! 1217: xops[2] = XEXP (addr, 1); ! 1218: xops[3] = addr; ! 1219: output_asm_insn (\"addiu\\t%0,%1,%2\\t#movsi (*p)\\t%a3 -> %0\", xops); ! 1220: return \"\"; ! 1221: } ! 1222: else ! 1223: abort (); ! 1224: }") ! 1225: ! 1226: (define_insn "movhi" ! 1227: [(set (match_operand:HI 0 "general_operand" "=r,r,m,r,r,m") ! 1228: (match_operand:HI 1 "general_operand" "r,m,r,i,J,J"))] ! 1229: "" ! 1230: "* ! 1231: { ! 1232: if (which_alternative == 4) ! 1233: return \"add%:\\t%0,$0,$0\\t#movhi\\t%1 == 0 -> %0\"; ! 1234: else if (which_alternative == 5) ! 1235: return \"sh\\t$0,%0\\t#movhi\\t%1 == 0 -> %0\"; ! 1236: else if (GET_CODE (operands[0]) == REG && GET_CODE (operands[1]) == REG) ! 1237: return \"add%:\\t%0,$0,%1\\t#move.h %1 -> %0 \"; ! 1238: else if (GET_CODE (operands[0]) == REG ! 1239: && GET_CODE (operands[1]) == CONST_INT) ! 1240: return \"addi%:\\t%0,$0,%x1\\t# movhi %1 -> %0\"; ! 1241: else if (GET_CODE (operands[0]) == REG) ! 1242: return \"lh\\t%0,%1\\t#movhi %1 -> %0\"; ! 1243: else ! 1244: return \"sh\\t%1,%0\\t#movhi %1 -> %0\"; ! 1245: }") ! 1246: ! 1247: (define_insn "movqi" ! 1248: [(set (match_operand:QI 0 "general_operand" "=r,r,m,r,r,m") ! 1249: (match_operand:QI 1 "general_operand" "r,m,r,i,J,J"))] ! 1250: "" ! 1251: "* ! 1252: { ! 1253: if (which_alternative == 4) ! 1254: return \"add%:\\t%0,$0,$0\\t#movqi\\t%1 == 0 -> %0\"; ! 1255: else if (which_alternative == 5) ! 1256: return \"sb\\t$0,%0\\t#movqi\\t%1 == 0 -> %0\"; ! 1257: else if (GET_CODE (operands[0]) == REG && GET_CODE (operands[1]) == REG) ! 1258: return \"add%:\\t%0,$0,%1\\t#move.b %1 -> %0 \"; ! 1259: ! 1260: if ((GET_CODE (operands[0]) == REG ) ! 1261: && ! 1262: (GET_CODE (operands[1]) == CONST_INT)) ! 1263: return \"addi%:\\t%0,$0,%x1\\t# movqi %1 -> %0\"; ! 1264: ! 1265: /* Should say that I am not padding high order ! 1266: ** bits correctly ! 1267: */ ! 1268: else if (GET_CODE (operands[0]) == REG) ! 1269: return \"lb\\t%0,%1\\t#movqi %1 -> %0\"; ! 1270: else ! 1271: return \"sb\\t%1,%0\\t#movqi %1 -> %0\"; ! 1272: }") ! 1273: ! 1274: (define_insn "movsf" ! 1275: [(set (match_operand:SF 0 "general_operand" "=f,f,m,f") ! 1276: (match_operand:SF 1 "general_operand" "f,m,f,F")) ! 1277: (clobber (reg:SI 24))] ! 1278: "" ! 1279: "* ! 1280: { ! 1281: if (GET_CODE (operands[0]) == REG && GET_CODE (operands[1]) == REG) ! 1282: return \"mov.s %0,%1\\t#movsf %1 -> %0 \"; ! 1283: ! 1284: if (GET_CODE (operands[0]) == REG ! 1285: && GET_CODE (operands[1]) == CONST_DOUBLE) ! 1286: { ! 1287: rtx xops[3]; ! 1288: xops[0] = operands[0]; ! 1289: xops[1] = gen_rtx (CONST_INT, VOIDmode, ! 1290: (XINT (operands[1], 0))>>16); ! 1291: xops[2] = gen_rtx (CONST_INT, VOIDmode, ! 1292: XINT (operands[1], 0)); ! 1293: output_asm_insn (\"lui\\t$24,%x1\\t#move high part of %2\", xops); ! 1294: xops[1] = gen_rtx (CONST_INT, VOIDmode, ! 1295: (XINT (operands[1], 0)) & 0xff); ! 1296: output_asm_insn (\"ori\\t$24,%x1\\t#move low part of %2\", xops); ! 1297: output_asm_insn (\"mtc1\\t$24,%0\", xops); ! 1298: ! 1299: xops[0] = gen_rtx (REG, SFmode, REGNO (xops[0])+1); ! 1300: xops[1] = gen_rtx (CONST_INT, VOIDmode, ! 1301: (XINT (operands[1], 1))>>16); ! 1302: xops[2] = gen_rtx (CONST_INT, VOIDmode, ! 1303: XINT (operands[1], 1)); ! 1304: output_asm_insn (\"lui\\t$24,%x1\\t#move high part of %2\", xops); ! 1305: xops[1] = gen_rtx (CONST_INT, VOIDmode, ! 1306: (XINT (operands[1], 1)) & 0xff); ! 1307: output_asm_insn (\"ori\\t$24,%x1\\t#move low part of %2\", xops); ! 1308: ! 1309: output_asm_insn (\"mtc1\\t$24,%0\", xops); ! 1310: return \"cvt.s.d\\t %0,%0 \"; ! 1311: } ! 1312: /* Should say that I am not padding high order ! 1313: ** bits correctly ! 1314: */ ! 1315: else if (GET_CODE (operands[0]) == REG) ! 1316: return \"l.s\\t %0,%1\\t#movsf %1 -> %0\"; ! 1317: else ! 1318: return \"s.s\\t %1,%0\\t#movsf %1 -> %0\"; ! 1319: }") ! 1320: ! 1321: ;; --- ! 1322: ! 1323: (define_insn "movdf" ! 1324: [(set (match_operand:DF 0 "general_operand" "=f,f,m,f,*f,*y") ! 1325: (match_operand:DF 1 "general_operand" "f,m,f,F,*y,*f")) ! 1326: (clobber (reg:SI 24))] ! 1327: "" ! 1328: "* ! 1329: { ! 1330: if (which_alternative > 3) ! 1331: { ! 1332: rtx xops[2]; ! 1333: ! 1334: if (REGNO (operands[1]) == 6) ! 1335: { ! 1336: xops[0] = gen_rtx (REG, DFmode, REGNO (operands[0])); ! 1337: #ifndef DECSTATION ! 1338: xops[1] = gen_rtx (REG, SImode, REGNO (operands[1])+1); ! 1339: #else ! 1340: xops[1] = gen_rtx (REG, SImode, REGNO (operands[1])); ! 1341: #endif ! 1342: output_asm_insn (\"mtc1\\t%1,%0\\t# %1 -> %0 \\tcalling sequence trick\" ! 1343: , xops); ! 1344: xops[0] = gen_rtx (REG, DFmode, REGNO (operands[0])+1); ! 1345: #ifndef DECSTATION ! 1346: xops[1] = gen_rtx (REG, SImode, REGNO (operands[1])); ! 1347: #else ! 1348: xops[1] = gen_rtx (REG, SImode, REGNO (operands[1])+1); ! 1349: #endif ! 1350: output_asm_insn (\"mtc1\\t%1,%0\\t# %1 -> %0 \\tcalling sequence trick\" ! 1351: , xops); ! 1352: return (\"\"); ! 1353: } ! 1354: else if (REGNO (operands[0]) == 6) ! 1355: { ! 1356: xops[0] = gen_rtx (REG, SImode, REGNO (operands[0])); ! 1357: #ifndef DECSTATION ! 1358: xops[1] = gen_rtx (REG, DFmode, REGNO (operands[1])+1); ! 1359: #else ! 1360: xops[1] = gen_rtx (REG, SImode, REGNO (operands[1])); ! 1361: #endif ! 1362: output_asm_insn (\"mfc1\\t%0,%1\\t# %1 -> %0 \\tcalling sequence trick\" ! 1363: , xops); ! 1364: xops[0] = gen_rtx (REG, SImode, REGNO (operands[0])+1); ! 1365: #ifndef DECSTATION ! 1366: xops[1] = gen_rtx (REG, DFmode, REGNO (operands[1])); ! 1367: #else ! 1368: xops[1] = gen_rtx (REG, SImode, REGNO (operands[1])+1); ! 1369: #endif ! 1370: output_asm_insn (\"mfc1\\t%0,%1\\t# %1 -> %0 \\tcalling sequence trick\" ! 1371: , xops); ! 1372: return (\"\"); ! 1373: } ! 1374: else ! 1375: abort_with_insn (insn, ! 1376: \"Matched *y constraint and register number wrong\"); ! 1377: } ! 1378: else ! 1379: { ! 1380: if (GET_CODE (operands[0]) == REG && GET_CODE (operands[1]) == REG) ! 1381: return \"mov.d\\t%0,%1\\t#movdf %1 -> %0 \"; ! 1382: ! 1383: if (GET_CODE (operands[0]) == REG ! 1384: && GET_CODE (operands[1]) == CONST_DOUBLE) ! 1385: { ! 1386: rtx xops[3]; ! 1387: xops[0] = operands[0]; ! 1388: xops[1] = gen_rtx (CONST_INT, VOIDmode, ! 1389: (XINT (operands[1], 0))>>16); ! 1390: xops[2] = gen_rtx (CONST_INT, VOIDmode, ! 1391: XINT (operands[1], 0)); ! 1392: output_asm_insn (\"lui\\t$24,%x1\\t#move high part of %2\", xops); ! 1393: xops[1] = gen_rtx (CONST_INT, VOIDmode, ! 1394: (XINT (operands[1], 0)) & 0xff); ! 1395: output_asm_insn (\"ori\\t$24,%x1\\t#move low part of %2\", xops); ! 1396: output_asm_insn (\"mtc1\\t%0,$24\", xops); ! 1397: ! 1398: xops[0] = gen_rtx (REG, SFmode, REGNO (xops[0])+1); ! 1399: xops[1] = gen_rtx (CONST_INT, VOIDmode, ! 1400: (XINT (operands[1], 1))>>16); ! 1401: xops[2] = gen_rtx (CONST_INT, VOIDmode, ! 1402: XINT (operands[1], 1)); ! 1403: output_asm_insn (\"lui\\t$24,%x1\\t#move high part of %2\", xops); ! 1404: xops[1] = gen_rtx (CONST_INT, VOIDmode, ! 1405: (XINT (operands[1], 1)) & 0xff); ! 1406: output_asm_insn (\"ori\\t$24,%x1\\t#move low part of %2\", xops); ! 1407: ! 1408: output_asm_insn (\"mtc1\\t%0,$24\", xops); ! 1409: return \"# \"; ! 1410: ! 1411: } ! 1412: else if (GET_CODE (operands[0]) == REG) ! 1413: return \"l.d\\t %0,%1\\t#movdf %1 -> %0\"; ! 1414: else ! 1415: return \"s.d\\t %1,%0\\t#movdf %1 -> %0\"; ! 1416: } ! 1417: }") ! 1418: ! 1419: (define_insn "" ! 1420: [(set (match_operand:SF 0 "general_operand" "=f,f,m") ! 1421: (match_operand:SF 1 "general_operand" "f,m,f"))] ! 1422: "" ! 1423: "* ! 1424: { ! 1425: if (GET_CODE (operands[0]) == REG && GET_CODE (operands[1]) == REG) ! 1426: return \"mov.s %0,%1\\t#movsf %1 -> %0 \"; ! 1427: ! 1428: if (GET_CODE (operands[0]) == REG) ! 1429: return \"l.s\\t %0,%1\\t#movsf %1 -> %0\"; ! 1430: else ! 1431: return \"s.s\\t %1,%0\\t#movsf %1 -> %0\"; ! 1432: }") ! 1433: ! 1434: ;; --- ! 1435: ! 1436: (define_insn "" ! 1437: [(set (match_operand:DF 0 "general_operand" "=f,f,m,*f,*y") ! 1438: (match_operand:DF 1 "general_operand" "f,m,f,*y,*f"))] ! 1439: "" ! 1440: "* ! 1441: { ! 1442: if (which_alternative > 2) ! 1443: { ! 1444: rtx xops[2]; ! 1445: if (REGNO (operands[1]) == 6) ! 1446: { ! 1447: xops[0] = gen_rtx (REG, DFmode, REGNO (operands[0])); ! 1448: #ifndef DECSTATION ! 1449: xops[1] = gen_rtx (REG, SImode, REGNO (operands[1])+1); ! 1450: #else ! 1451: xops[1] = gen_rtx (REG, SImode, REGNO (operands[1])); ! 1452: #endif ! 1453: output_asm_insn (\"mtc1\\t%1,%0\\t# %1 -> %0 \\tcalling sequence trick\" ! 1454: , xops); ! 1455: xops[0] = gen_rtx (REG, DFmode, REGNO (operands[0])+1); ! 1456: #ifndef DECSTATION ! 1457: xops[1] = gen_rtx (REG, SImode, REGNO (operands[1])); ! 1458: #else ! 1459: xops[1] = gen_rtx (REG, SImode, REGNO (operands[1])+1); ! 1460: #endif ! 1461: output_asm_insn (\"mtc1\\t%1,%0\\t# %1 -> %0 \\tcalling sequence trick\" ! 1462: , xops); ! 1463: return (\"\"); ! 1464: } ! 1465: else if (REGNO (operands[0]) == 6) ! 1466: { ! 1467: xops[0] = gen_rtx (REG, SImode, REGNO (operands[0])); ! 1468: #ifndef DECSTATION ! 1469: xops[1] = gen_rtx (REG, DFmode, REGNO (operands[1])+1); ! 1470: #else ! 1471: xops[1] = gen_rtx (REG, SImode, REGNO (operands[1])); ! 1472: #endif ! 1473: output_asm_insn (\"mfc1\\t%0,%1\\t# %1 -> %0 \\tcalling sequence trick\" ! 1474: , xops); ! 1475: xops[0] = gen_rtx (REG, SImode, REGNO (operands[0])+1); ! 1476: #ifndef DECSTATION ! 1477: xops[1] = gen_rtx (REG, DFmode, REGNO (operands[1])); ! 1478: #else ! 1479: xops[1] = gen_rtx (REG, SImode, REGNO (operands[1])+1); ! 1480: #endif ! 1481: output_asm_insn (\"mfc1\\t%0,%1\\t# %1 -> %0 \\tcalling sequence trick\" ! 1482: , xops); ! 1483: return (\"\"); ! 1484: } ! 1485: else ! 1486: abort_with_insn (insn, ! 1487: \"Matched *y constraint and register number wrong\"); ! 1488: } ! 1489: else ! 1490: { ! 1491: if ((GET_CODE (operands[0]) == REG) && (GET_CODE (operands[1]) == REG)) ! 1492: return \"mov.d\\t%0,%1\\t#movdf %1 -> %0 \"; ! 1493: ! 1494: if (GET_CODE (operands[0]) == REG) ! 1495: return \"l.d\\t %0,%1\\t#movdf %1 -> %0\"; ! 1496: else ! 1497: return \"s.d\\t %1,%0\\t#movdf %1 -> %0\"; ! 1498: } ! 1499: }") ! 1500: ! 1501: (define_insn "" ! 1502: [(set (match_operand:SI 0 "general_operand" "=r") ! 1503: (match_operand:QI 1 "general_operand" "r"))] ! 1504: "" ! 1505: "andi\\t%0,%1,0xff\\t#Wild zero_extendqisi2\\t %1 -> %0") ! 1506: ! 1507: ! 1508: ! 1509: ! 1510: ;; ! 1511: ;; .................... ! 1512: ;; ! 1513: ;; OTHER ARITHMETIC AND SHIFT ! 1514: ;; ! 1515: ;; .................... ! 1516: ! 1517: (define_insn "ashlqi3" ! 1518: [(set (match_operand:QI 0 "general_operand" "=r") ! 1519: (ashift:QI (match_operand:QI 1 "general_operand" "r") ! 1520: (match_operand:SI 2 "arith32_operand" "ri")))] ! 1521: "" ! 1522: "* ! 1523: { ! 1524: if (GET_CODE (operands[2]) == CONST_INT) ! 1525: { ! 1526: operands[2] = gen_rtx (CONST_INT, VOIDmode, (XINT (operands[2], 0))& 0x1f); ! 1527: output_asm_insn (\"sll\\t%0,%1,%2\\t#ashlqi3\\t (%1<<%2) -> %0\", operands); ! 1528: } ! 1529: else ! 1530: output_asm_insn (\"sll\\t%0,%1,%2\\t#ashlqi3\\t (%1<<%2) -> %0 (asm syntax)\", ! 1531: operands); ! 1532: return \"andi\\t%0,%0,0xff\\t#ashlqi3\"; ! 1533: }") ! 1534: ! 1535: ! 1536: ! 1537: (define_insn "ashlhi3" ! 1538: [(set (match_operand:HI 0 "general_operand" "=r") ! 1539: (ashift:HI (match_operand:HI 1 "general_operand" "r") ! 1540: (match_operand:SI 2 "arith32_operand" "ri")))] ! 1541: "" ! 1542: "* ! 1543: { ! 1544: if (GET_CODE (operands[2]) == CONST_INT) ! 1545: { ! 1546: operands[2] = gen_rtx (CONST_INT, VOIDmode, (XINT (operands[2], 0))& 0x1f); ! 1547: output_asm_insn (\"sll\\t%0,%1,%2\\t#ashlhi3\\t (%1<<%2) -> %0\", ! 1548: operands); ! 1549: } ! 1550: else ! 1551: output_asm_insn (\"sll\\t%0,%1,%2\\t#ashlhi3\\t (%1<<%2) -> %0 (asm syntax)\", ! 1552: operands); ! 1553: return \"sll\\t%0,%0,0x10\;sra\\t%0,%0,0x10\\t#ashlhi3\"; ! 1554: }") ! 1555: ! 1556: ! 1557: ! 1558: (define_insn "ashlsi3" ! 1559: [(set (match_operand:SI 0 "general_operand" "=r") ! 1560: (ashift:SI (match_operand:SI 1 "general_operand" "r") ! 1561: (match_operand:SI 2 "arith32_operand" "ri")))] ! 1562: "" ! 1563: "* ! 1564: { ! 1565: if (GET_CODE (operands[2]) == CONST_INT) ! 1566: { ! 1567: operands[2] = gen_rtx (CONST_INT, VOIDmode, (XINT (operands[2], 0))& 0x1f); ! 1568: return \"sll\\t%0,%1,%2\\t#ashlsi3\\t (%1<<%2) -> %0\"; ! 1569: } ! 1570: return \"sll\\t%0,%1,%2\\t#ashlsi3\\t (%1<<%2) -> %0 (asm syntax)\"; ! 1571: }") ! 1572: ! 1573: ! 1574: ! 1575: (define_insn "ashrsi3" ! 1576: [(set (match_operand:SI 0 "general_operand" "=r") ! 1577: (ashiftrt:SI (match_operand:SI 1 "general_operand" "r") ! 1578: (match_operand:SI 2 "arith32_operand" "ri")))] ! 1579: "" ! 1580: "* ! 1581: { ! 1582: if (GET_CODE (operands[2]) == CONST_INT) ! 1583: { ! 1584: operands[2] = gen_rtx (CONST_INT, VOIDmode, (XINT (operands[2], 0))& 0x1f); ! 1585: return \"sra\\t%0,%1,%2\\t#ashrsi3\\t (%1>>%2) -> %0\"; ! 1586: } ! 1587: return \"sra\\t%0,%1,%2\\t#ashrsi3\\t (%1>>%2) -> %0 (asm syntax for srav)\"; ! 1588: }") ! 1589: ! 1590: ! 1591: ! 1592: (define_insn "lshrsi3" ! 1593: [(set (match_operand:SI 0 "general_operand" "=r") ! 1594: (lshiftrt:SI (match_operand:SI 1 "general_operand" "r") ! 1595: (match_operand:SI 2 "arith32_operand" "rn")))] ! 1596: "" ! 1597: "* ! 1598: { ! 1599: if (GET_CODE (operands[2]) == CONST_INT) ! 1600: { ! 1601: operands[2] = gen_rtx (CONST_INT, VOIDmode, (XINT (operands[2], 0))& 0x1f); ! 1602: return \"srl\\t%0,%1,%2\\t#lshrsi3\\t (%1>>%2) -> %0\"; ! 1603: } ! 1604: return \"srl\\t%0,%1,%2\\t#lshrsi3\\t (%1>>%2) -> %0 (asm syntax)\"; ! 1605: }") ! 1606: ! 1607: ! 1608: ! 1609: ! 1610: (define_insn "negsi2" ! 1611: [(set (match_operand:SI 0 "general_operand" "=r") ! 1612: (neg:SI (match_operand:SI 1 "arith_operand" "r")))] ! 1613: "" ! 1614: "sub%:\\t%0,$0,%1\\t#negsi2") ! 1615: ! 1616: ! 1617: (define_insn "negdf2" ! 1618: [(set (match_operand:DF 0 "general_operand" "=f") ! 1619: (neg:DF (match_operand:DF 1 "general_operand" "f")))] ! 1620: "" ! 1621: "neg.d\\t%0,%1\\t#negdf2") ! 1622: ! 1623: ! 1624: ! 1625: (define_insn "negsf2" ! 1626: ! 1627: [(set (match_operand:SF 0 "general_operand" "=f") ! 1628: (neg:SF (match_operand:SF 1 "general_operand" "f")))] ! 1629: "" ! 1630: "neg.s\\t%0,%1\\t#negsf2") ! 1631: ! 1632: ! 1633: (define_insn "one_cmplsi2" ! 1634: [(set (match_operand:SI 0 "general_operand" "=r") ! 1635: (not:SI (match_operand:SI 1 "arith_operand" "r")))] ! 1636: "" ! 1637: "nor\\t%0,$0,%1\\t#one_cmplsi2") ! 1638: ! 1639: ! 1640: ! 1641: (define_insn "one_cmplhi2" ! 1642: [(set (match_operand:HI 0 "general_operand" "=r") ! 1643: (not:HI (match_operand:HI 1 "arith_operand" "r")))] ! 1644: "" ! 1645: "nor\\t%0,$0,%1\\t#one_cmplhi2") ! 1646: ! 1647: ! 1648: ! 1649: (define_insn "one_cmplqi2" ! 1650: [(set (match_operand:QI 0 "general_operand" "=r") ! 1651: (not:QI (match_operand:QI 1 "arith_operand" "r")))] ! 1652: "" ! 1653: "nor\\t%0,$0,%1\\t#one_cmplqi2") ! 1654: ! 1655: ;; ! 1656: ;; .................... ! 1657: ;; ! 1658: ;; BRANCHES ! 1659: ;; ! 1660: ;; .................... ! 1661: ! 1662: ! 1663: ;;- MERGED CMPSI + BEQ ! 1664: (define_peephole ! 1665: [(set (cc0) ! 1666: (compare (match_operand:SI 0 "general_operand" "r") ! 1667: (match_operand:SI 1 "general_operand" "r"))) ! 1668: (set (pc) ! 1669: (if_then_else (eq (cc0) ! 1670: (const_int 0)) ! 1671: (label_ref (match_operand 2 "" "")) ! 1672: (pc)))] ! 1673: "" ! 1674: "beq \\t%0,%1,%l2\\t#beq MIPS primitive insn") ! 1675: ! 1676: ;;- MERGED CMPSI + INV BEQ ! 1677: (define_peephole ! 1678: [(set (cc0) ! 1679: (compare (match_operand:SI 0 "general_operand" "r") ! 1680: (match_operand:SI 1 "general_operand" "r"))) ! 1681: (set (pc) ! 1682: (if_then_else (ne (cc0) ! 1683: (const_int 0)) ! 1684: (pc) ! 1685: (label_ref (match_operand 2 "" ""))))] ! 1686: "" ! 1687: "beq \\t%0,%1,%l2\\t#beq inverted primitive insn") ! 1688: ;;- MERGED CMPSI + BNE ! 1689: (define_peephole ! 1690: [(set (cc0) ! 1691: (compare (match_operand:SI 0 "general_operand" "r") ! 1692: (match_operand:SI 1 "general_operand" "r"))) ! 1693: (set (pc) ! 1694: (if_then_else (ne (cc0) ! 1695: (const_int 0)) ! 1696: (label_ref (match_operand 2 "" "")) ! 1697: (pc)))] ! 1698: "" ! 1699: "bne \\t%0,%1,%l2\\t#bne MIPS primitive insn") ! 1700: ! 1701: ;;- MERGED CMPSI + INV BNE ! 1702: (define_peephole ! 1703: [(set (cc0) ! 1704: (compare (match_operand:SI 0 "general_operand" "r") ! 1705: (match_operand:SI 1 "general_operand" "r"))) ! 1706: (set (pc) ! 1707: (if_then_else (eq (cc0) ! 1708: (const_int 0)) ! 1709: (pc) ! 1710: (label_ref (match_operand 2 "" ""))))] ! 1711: "" ! 1712: "bne \\t%0,%1,%l2\\t#bne inverted primitive insn") ! 1713: ! 1714: ;;- MERGED CMPSI + BGT ! 1715: (define_peephole ! 1716: [(set (cc0) ! 1717: (compare (match_operand:SI 0 "general_operand" "r") ! 1718: (match_operand:SI 1 "general_operand" "r"))) ! 1719: (set (pc) ! 1720: (if_then_else (gt (cc0) ! 1721: (const_int 0)) ! 1722: (label_ref (match_operand 2 "" "")) ! 1723: (pc)))] ! 1724: "" ! 1725: "bgt \\t%0,%1,%l2\\t#bgt MIPS composite insn") ! 1726: ! 1727: ;;- MERGED CMPSI + INV BGT ! 1728: (define_peephole ! 1729: [(set (cc0) ! 1730: (compare (match_operand:SI 0 "general_operand" "r") ! 1731: (match_operand:SI 1 "general_operand" "r"))) ! 1732: (set (pc) ! 1733: (if_then_else (le (cc0) ! 1734: (const_int 0)) ! 1735: (pc) ! 1736: (label_ref (match_operand 2 "" ""))))] ! 1737: "" ! 1738: "bgt \\t%0,%1,%l2\\t#bgt inverted composite insn") ! 1739: ;;- MERGED CMPSI + BLT ! 1740: (define_peephole ! 1741: [(set (cc0) ! 1742: (compare (match_operand:SI 0 "general_operand" "r") ! 1743: (match_operand:SI 1 "general_operand" "r"))) ! 1744: (set (pc) ! 1745: (if_then_else (lt (cc0) ! 1746: (const_int 0)) ! 1747: (label_ref (match_operand 2 "" "")) ! 1748: (pc)))] ! 1749: "" ! 1750: "blt \\t%0,%1,%l2\\t#blt MIPS composite insn") ! 1751: ! 1752: ;;- MERGED CMPSI + INV BLT ! 1753: (define_peephole ! 1754: [(set (cc0) ! 1755: (compare (match_operand:SI 0 "general_operand" "r") ! 1756: (match_operand:SI 1 "general_operand" "r"))) ! 1757: (set (pc) ! 1758: (if_then_else (ge (cc0) ! 1759: (const_int 0)) ! 1760: (pc) ! 1761: (label_ref (match_operand 2 "" ""))))] ! 1762: "" ! 1763: "blt \\t%0,%1,%l2\\t#blt inverted composite insn") ! 1764: ;;- MERGED CMPSI + BGE ! 1765: (define_peephole ! 1766: [(set (cc0) ! 1767: (compare (match_operand:SI 0 "general_operand" "r") ! 1768: (match_operand:SI 1 "general_operand" "r"))) ! 1769: (set (pc) ! 1770: (if_then_else (ge (cc0) ! 1771: (const_int 0)) ! 1772: (label_ref (match_operand 2 "" "")) ! 1773: (pc)))] ! 1774: "" ! 1775: "bge \\t%0,%1,%l2\\t#bge composite insn") ! 1776: ! 1777: ;;- MERGED CMPSI + INV BGE ! 1778: (define_peephole ! 1779: [(set (cc0) ! 1780: (compare (match_operand:SI 0 "general_operand" "r") ! 1781: (match_operand:SI 1 "general_operand" "r"))) ! 1782: (set (pc) ! 1783: (if_then_else (lt (cc0) ! 1784: (const_int 0)) ! 1785: (pc) ! 1786: (label_ref (match_operand 2 "" ""))))] ! 1787: "" ! 1788: "bge \\t%0,%1,%l2\\t#bge inverted composite insn") ! 1789: ;;- MERGED CMPSI + BLE ! 1790: (define_peephole ! 1791: [(set (cc0) ! 1792: (compare (match_operand:SI 0 "general_operand" "r") ! 1793: (match_operand:SI 1 "general_operand" "r"))) ! 1794: (set (pc) ! 1795: (if_then_else (le (cc0) ! 1796: (const_int 0)) ! 1797: (label_ref (match_operand 2 "" "")) ! 1798: (pc)))] ! 1799: "" ! 1800: "ble \\t%0,%1,%l2\\t#ble composite insn") ! 1801: ! 1802: ;;- MERGED CMPSI + INV BLE ! 1803: (define_peephole ! 1804: [(set (cc0) ! 1805: (compare (match_operand:SI 0 "general_operand" "r") ! 1806: (match_operand:SI 1 "general_operand" "r"))) ! 1807: (set (pc) ! 1808: (if_then_else (gt (cc0) ! 1809: (const_int 0)) ! 1810: (pc) ! 1811: (label_ref (match_operand 2 "" ""))))] ! 1812: "" ! 1813: "ble \\t%0,%1,%l2\\t#ble inverted composite insn") ! 1814: ! 1815: ! 1816: ;;- MERGED CMPSI + BGT ! 1817: (define_peephole ! 1818: [(set (cc0) ! 1819: (compare (match_operand:SI 0 "general_operand" "r") ! 1820: (match_operand:SI 1 "general_operand" "r"))) ! 1821: (set (pc) ! 1822: (if_then_else (gtu (cc0) ! 1823: (const_int 0)) ! 1824: (label_ref (match_operand 2 "" "")) ! 1825: (pc)))] ! 1826: "" ! 1827: "bgtu \\t%0,%1,%l2\\t#bgtu MIPS composite insn") ! 1828: ! 1829: ;;- MERGED CMPSI + INV BGT ! 1830: (define_peephole ! 1831: [(set (cc0) ! 1832: (compare (match_operand:SI 0 "general_operand" "r") ! 1833: (match_operand:SI 1 "general_operand" "r"))) ! 1834: (set (pc) ! 1835: (if_then_else (leu (cc0) ! 1836: (const_int 0)) ! 1837: (pc) ! 1838: (label_ref (match_operand 2 "" ""))))] ! 1839: "" ! 1840: "bgtu \\t%0,%1,%l2\\t#bgtu inverted composite insn") ! 1841: ;;- MERGED CMPSI + INV BLTU ! 1842: (define_peephole ! 1843: [(set (cc0) ! 1844: (compare (match_operand:SI 0 "general_operand" "r") ! 1845: (match_operand:SI 1 "general_operand" "r"))) ! 1846: (set (pc) ! 1847: (if_then_else (geu (cc0) ! 1848: (const_int 0)) ! 1849: (pc) ! 1850: (label_ref (match_operand 2 "" ""))))] ! 1851: "" ! 1852: "bltu \\t%0,%1,%l2\\t#blt inverted composite insn") ! 1853: ;;- MERGED CMPSI + BGEU ! 1854: (define_peephole ! 1855: [(set (cc0) ! 1856: (compare (match_operand:SI 0 "general_operand" "r") ! 1857: (match_operand:SI 1 "general_operand" "r"))) ! 1858: (set (pc) ! 1859: (if_then_else (geu (cc0) ! 1860: (const_int 0)) ! 1861: (label_ref (match_operand 2 "" "")) ! 1862: (pc)))] ! 1863: "" ! 1864: "bgeu \\t%0,%1,%l2\\t#bgeu composite insn") ! 1865: ! 1866: ;;- MERGED CMPSI + INV BGEU ! 1867: (define_peephole ! 1868: [(set (cc0) ! 1869: (compare (match_operand:SI 0 "general_operand" "r") ! 1870: (match_operand:SI 1 "general_operand" "r"))) ! 1871: (set (pc) ! 1872: (if_then_else (ltu (cc0) ! 1873: (const_int 0)) ! 1874: (pc) ! 1875: (label_ref (match_operand 2 "" ""))))] ! 1876: "" ! 1877: "bgeu \\t%0,%1,%l2\\t#bgeu inverted composite insn") ! 1878: ;;- MERGED CMPSI + BLE ! 1879: (define_peephole ! 1880: [(set (cc0) ! 1881: (compare (match_operand:SI 0 "general_operand" "r") ! 1882: (match_operand:SI 1 "general_operand" "r"))) ! 1883: (set (pc) ! 1884: (if_then_else (leu (cc0) ! 1885: (const_int 0)) ! 1886: (label_ref (match_operand 2 "" "")) ! 1887: (pc)))] ! 1888: "" ! 1889: "bleu \\t%0,%1,%l2\\t#bleu composite insn") ! 1890: ! 1891: ;;- MERGED CMPSI + INV BLE ! 1892: (define_peephole ! 1893: [(set (cc0) ! 1894: (compare (match_operand:SI 0 "general_operand" "r") ! 1895: (match_operand:SI 1 "general_operand" "r"))) ! 1896: (set (pc) ! 1897: (if_then_else (gtu (cc0) ! 1898: (const_int 0)) ! 1899: (pc) ! 1900: (label_ref (match_operand 2 "" ""))))] ! 1901: "" ! 1902: "bleu \\t%0,%1,%l2\\t#bleu inverted composite insn") ! 1903: ;;- MERGED CMPSI + BLTU ! 1904: (define_peephole ! 1905: [(set (cc0) ! 1906: (compare (match_operand:SI 0 "general_operand" "r") ! 1907: (match_operand:SI 1 "general_operand" "r"))) ! 1908: (set (pc) ! 1909: (if_then_else (ltu (cc0) ! 1910: (const_int 0)) ! 1911: (label_ref (match_operand 2 "" "")) ! 1912: (pc)))] ! 1913: "" ! 1914: "bltu \\t%0,%1,%l2\\t#bltu MIPS composite insn") ! 1915: ! 1916: ;;- MERGED CMPSI + INV BLTU ! 1917: (define_peephole ! 1918: [(set (cc0) ! 1919: (compare (match_operand:SI 0 "general_operand" "r") ! 1920: (match_operand:SI 1 "general_operand" "r"))) ! 1921: (set (pc) ! 1922: (if_then_else (geu (cc0) ! 1923: (const_int 0)) ! 1924: (pc) ! 1925: (label_ref (match_operand 2 "" ""))))] ! 1926: "" ! 1927: "bltu \\t%0,%1,%l2\\t#bltu inverted composite insn") ! 1928: ! 1929: ;;- FLOATING POINT CASES ! 1930: ;;- -------------------- ! 1931: ! 1932: ;;- MERGED CMPSF + BEQ ! 1933: (define_peephole ! 1934: [(set (cc0) ! 1935: (compare (match_operand:SF 0 "general_operand" "f") ! 1936: (match_operand:SF 1 "general_operand" "f"))) ! 1937: (set (pc) ! 1938: (if_then_else (eq (cc0) ! 1939: (const_int 0)) ! 1940: (label_ref (match_operand 2 "" "")) ! 1941: (pc)))] ! 1942: "" ! 1943: "c.eq.s\\t%0,%1\\t# Merged CMPSF + BEQ \;bc1t\\t%l2\\t# Merged CMPSF + BEQ ") ! 1944: ! 1945: ;;- MERGED CMPSF + INV BEQ ! 1946: ! 1947: (define_peephole ! 1948: [(set (cc0) ! 1949: (compare (match_operand:SF 0 "general_operand" "f") ! 1950: (match_operand:SF 1 "general_operand" "f"))) ! 1951: (set (pc) ! 1952: (if_then_else (ne (cc0) ! 1953: (const_int 0)) ! 1954: (pc) ! 1955: (label_ref (match_operand 2 "" ""))))] ! 1956: "" ! 1957: "c.eq.s\\t%0,%1\\t# Merged CMPSF + BEQ \;bc1t\\t%l2\\t# Merged CMPSF + BEQ ") ! 1958: ! 1959: ;;- MERGED CMPSF + BNE ! 1960: ! 1961: (define_peephole ! 1962: [(set (cc0) ! 1963: (compare (match_operand:SF 0 "general_operand" "f") ! 1964: (match_operand:SF 1 "general_operand" "f"))) ! 1965: (set (pc) ! 1966: (if_then_else (ne (cc0) ! 1967: (const_int 0)) ! 1968: (label_ref (match_operand 2 "" "")) ! 1969: (pc)))] ! 1970: "" ! 1971: "c.eq.s\\t%0,%1\\t# Merged CMPSF + BNE \;bc1f\\t%l2\\t# Merged CMPSF + BNE ") ! 1972: ! 1973: ;;- MERGED CMPSF + INV BNE ! 1974: (define_peephole ! 1975: [(set (cc0) ! 1976: (compare (match_operand:SF 0 "general_operand" "f") ! 1977: (match_operand:SF 1 "general_operand" "f"))) ! 1978: (set (pc) ! 1979: (if_then_else (eq (cc0) ! 1980: (const_int 0)) ! 1981: (pc) ! 1982: (label_ref (match_operand 2 "" ""))))] ! 1983: "" ! 1984: "c.eq.s\\t%0,%1\\t# Merged CMPSF + I.BNE \;bc1f\\t%l2\\t# Merged CMPSF +I.BNE ") ! 1985: ! 1986: ;;- MERGED CMPSF + BGT ! 1987: (define_peephole ! 1988: [(set (cc0) ! 1989: (compare (match_operand:SF 0 "general_operand" "f") ! 1990: (match_operand:SF 1 "general_operand" "f"))) ! 1991: (set (pc) ! 1992: (if_then_else (gt (cc0) ! 1993: (const_int 0)) ! 1994: (label_ref (match_operand 2 "" "")) ! 1995: (pc)))] ! 1996: "" ! 1997: "c.le.s\\t%0,%1\\t# Merged CMPSF + BGT \;bc1f\\t%l2\\t# Merged CMPSF + BGT ") ! 1998: ! 1999: ;;- MERGED CMPSF + INV BGT ! 2000: (define_peephole ! 2001: [(set (cc0) ! 2002: (compare (match_operand:SF 0 "general_operand" "f") ! 2003: (match_operand:SF 1 "general_operand" "f"))) ! 2004: (set (pc) ! 2005: (if_then_else (le (cc0) ! 2006: (const_int 0)) ! 2007: (pc) ! 2008: (label_ref (match_operand 2 "" ""))))] ! 2009: "" ! 2010: "c.le.s\\t%0,%1\\t# Merged CMPSF + I.BGT \;bc1f\\t%l2\\t# Merged CMPSF +I. BGT ") ! 2011: ! 2012: ;;- MERGED CMPSF + BLT ! 2013: (define_peephole ! 2014: [(set (cc0) ! 2015: (compare (match_operand:SF 0 "general_operand" "f") ! 2016: (match_operand:SF 1 "general_operand" "f"))) ! 2017: (set (pc) ! 2018: (if_then_else (lt (cc0) ! 2019: (const_int 0)) ! 2020: (label_ref (match_operand 2 "" "")) ! 2021: (pc)))] ! 2022: "" ! 2023: "c.lt.s\\t%0,%1\\t# Merged CMPSF + BLT \;bc1t\\t%l2\\t# Merged CMPSF + BLT ") ! 2024: ! 2025: ;;- MERGED CMPSF + INV BLT ! 2026: (define_peephole ! 2027: [(set (cc0) ! 2028: (compare (match_operand:SF 0 "general_operand" "f") ! 2029: (match_operand:SF 1 "general_operand" "f"))) ! 2030: (set (pc) ! 2031: (if_then_else (ge (cc0) ! 2032: (const_int 0)) ! 2033: (pc) ! 2034: (label_ref (match_operand 2 "" ""))))] ! 2035: "" ! 2036: "c.lt.s\\t%0,%1\\t# Merged CMPSF + I.BLT \;bc1t\\t%l2\\t# Merged CMPSF + I.BLT ") ! 2037: ! 2038: ;;- MERGED CMPSF + BGE ! 2039: (define_peephole ! 2040: [(set (cc0) ! 2041: (compare (match_operand:SF 0 "general_operand" "f") ! 2042: (match_operand:SF 1 "general_operand" "f"))) ! 2043: (set (pc) ! 2044: (if_then_else (ge (cc0) ! 2045: (const_int 0)) ! 2046: (label_ref (match_operand 2 "" "")) ! 2047: (pc)))] ! 2048: "" ! 2049: "c.lt.s\\t%0,%1\\t# Merged CMPSF + BGE \;bc1f\\t%l2\\t# Merged CMPSF + BGE") ! 2050: ! 2051: ;;- MERGED CMPSF + INV BGE ! 2052: (define_peephole ! 2053: [(set (cc0) ! 2054: (compare (match_operand:SF 0 "general_operand" "f") ! 2055: (match_operand:SF 1 "general_operand" "f"))) ! 2056: (set (pc) ! 2057: (if_then_else (lt (cc0) ! 2058: (const_int 0)) ! 2059: (pc) ! 2060: (label_ref (match_operand 2 "" ""))))] ! 2061: "" ! 2062: "c.lt.s\\t%0,%1\\t# Merged CMPSF +INV BGE \;bc1f\\t%l2\\t# Merged CMPSF +INV BGE ") ! 2063: ;;- MERGED CMPSF + BLE ! 2064: (define_peephole ! 2065: [(set (cc0) ! 2066: (compare (match_operand:SF 0 "general_operand" "f") ! 2067: (match_operand:SF 1 "general_operand" "f"))) ! 2068: (set (pc) ! 2069: (if_then_else (le (cc0) ! 2070: (const_int 0)) ! 2071: (label_ref (match_operand 2 "" "")) ! 2072: (pc)))] ! 2073: "" ! 2074: "c.le.s\\t%0,%1\\t# Merged CMPSF + BLE \;bc1t\\t%l2\\t# Merged CMPSF + BLE ") ! 2075: ! 2076: ;;- MERGED CMPSF + INV BLE ! 2077: (define_peephole ! 2078: [(set (cc0) ! 2079: (compare (match_operand:SF 0 "general_operand" "f") ! 2080: (match_operand:SF 1 "general_operand" "f"))) ! 2081: (set (pc) ! 2082: (if_then_else (gt (cc0) ! 2083: (const_int 0)) ! 2084: (pc) ! 2085: (label_ref (match_operand 2 "" ""))))] ! 2086: "" ! 2087: "c.le.s\\t%0,%1\\t# Merged CMPSF + INV BLE \;bc1t\\t%l2\\t# Merged CMPSF +I. BLE") ! 2088: ! 2089: ;;- DOUBLE FLOATING POINT CASES ! 2090: ;;- -------------------- ! 2091: ! 2092: ;;- MERGED CMPDF + BEQ ! 2093: ! 2094: (define_peephole ! 2095: [(set (cc0) ! 2096: (compare (match_operand:DF 0 "general_operand" "f") ! 2097: (match_operand:DF 1 "general_operand" "f"))) ! 2098: (set (pc) ! 2099: (if_then_else (eq (cc0) ! 2100: (const_int 0)) ! 2101: (label_ref (match_operand 2 "" "")) ! 2102: (pc)))] ! 2103: "" ! 2104: "c.eq.d\\t%0,%1\\t# Merged CMPDF + BEQ \;bc1t\\t%l2\\t# Merged CMPDF + BEQ ") ! 2105: ! 2106: ;;- MERGED CMPDF + INV BEQ ! 2107: ! 2108: (define_peephole ! 2109: [(set (cc0) ! 2110: (compare (match_operand:DF 0 "general_operand" "f") ! 2111: (match_operand:DF 1 "general_operand" "f"))) ! 2112: (set (pc) ! 2113: (if_then_else (ne (cc0) ! 2114: (const_int 0)) ! 2115: (pc) ! 2116: (label_ref (match_operand 2 "" ""))))] ! 2117: "" ! 2118: "c.eq.d\\t%0,%1\\t# Merged CMPDF + I.BEQ \;bc1t\\t%l2\\t# Merged CMPDF +I. BEQ ") ! 2119: ! 2120: ;;- MERGED CMPDF + BNE ! 2121: ! 2122: (define_peephole ! 2123: [(set (cc0) ! 2124: (compare (match_operand:DF 0 "general_operand" "f") ! 2125: (match_operand:DF 1 "general_operand" "f"))) ! 2126: (set (pc) ! 2127: (if_then_else (ne (cc0) ! 2128: (const_int 0)) ! 2129: (label_ref (match_operand 2 "" "")) ! 2130: (pc)))] ! 2131: "" ! 2132: "c.eq.d\\t%0,%1\\t# Merged CMPDF + BNE \;bc1f\\t%l2\\t# Merged CMPDF + BNE ") ! 2133: ! 2134: ;;- MERGED CMPDF + INV BNE ! 2135: (define_peephole ! 2136: [(set (cc0) ! 2137: (compare (match_operand:DF 0 "general_operand" "f") ! 2138: (match_operand:DF 1 "general_operand" "f"))) ! 2139: (set (pc) ! 2140: (if_then_else (eq (cc0) ! 2141: (const_int 0)) ! 2142: (pc) ! 2143: (label_ref (match_operand 2 "" ""))))] ! 2144: "" ! 2145: "c.eq.d\\t%0,%1\\t# Merged CMPDF +I. BNE \;bc1f\\t%l2\\t# Merged CMPDF +I BNE") ! 2146: ! 2147: ;;- MERGED CMPDF + BGT ! 2148: (define_peephole ! 2149: [(set (cc0) ! 2150: (compare (match_operand:DF 0 "general_operand" "f") ! 2151: (match_operand:DF 1 "general_operand" "f"))) ! 2152: (set (pc) ! 2153: (if_then_else (gt (cc0) ! 2154: (const_int 0)) ! 2155: (label_ref (match_operand 2 "" "")) ! 2156: (pc)))] ! 2157: "" ! 2158: "c.le.d\\t%0,%1\\t# Merged CMPDF + BGT \;bc1f\\t%l2\\t# Merged CMPDF + BGT ") ! 2159: ! 2160: ;;- MERGED CMPDF + INV BGT ! 2161: (define_peephole ! 2162: [(set (cc0) ! 2163: (compare (match_operand:DF 0 "general_operand" "f") ! 2164: (match_operand:DF 1 "general_operand" "f"))) ! 2165: (set (pc) ! 2166: (if_then_else (le (cc0) ! 2167: (const_int 0)) ! 2168: (pc) ! 2169: (label_ref (match_operand 2 "" ""))))] ! 2170: "" ! 2171: "c.le.d\\t%0,%1\\t# Merged CMPDF + I. BGT \;bc1f\\t%l2\\t# Merged CMPDF + I. BGT ") ! 2172: ! 2173: ;;- MERGED CMPDF + BLT ! 2174: (define_peephole ! 2175: [(set (cc0) ! 2176: (compare (match_operand:DF 0 "general_operand" "f") ! 2177: (match_operand:DF 1 "general_operand" "f"))) ! 2178: (set (pc) ! 2179: (if_then_else (lt (cc0) ! 2180: (const_int 0)) ! 2181: (label_ref (match_operand 2 "" "")) ! 2182: (pc)))] ! 2183: "" ! 2184: "c.lt.d\\t%0,%1\\t# Merged CMPDF + BLT \;bc1t\\t%l2\\t# Merged CMPDF + BLT ") ! 2185: ! 2186: ;;- MERGED CMPDF + INV BLT ! 2187: (define_peephole ! 2188: [(set (cc0) ! 2189: (compare (match_operand:DF 0 "general_operand" "f") ! 2190: (match_operand:DF 1 "general_operand" "f"))) ! 2191: (set (pc) ! 2192: (if_then_else (ge (cc0) ! 2193: (const_int 0)) ! 2194: (pc) ! 2195: (label_ref (match_operand 2 "" ""))))] ! 2196: "" ! 2197: "c.lt.d\\t%0,%1\\t# Merged CMPDF + I.BLT \;bc1t\\t%l2\\t# Merged CMPDF + I.BLT") ! 2198: ! 2199: ;;- MERGED CMPDF + BGE ! 2200: (define_peephole ! 2201: [(set (cc0) ! 2202: (compare (match_operand:DF 0 "general_operand" "f") ! 2203: (match_operand:DF 1 "general_operand" "f"))) ! 2204: (set (pc) ! 2205: (if_then_else (ge (cc0) ! 2206: (const_int 0)) ! 2207: (label_ref (match_operand 2 "" "")) ! 2208: (pc)))] ! 2209: "" ! 2210: "c.lt.d\\t%0,%1\\t# Merged CMPDF + BGE \;bc1f\\t%l2\\t# Merged CMPDF + BGE") ! 2211: ! 2212: ;;- MERGED CMPDF + INV BGE ! 2213: (define_peephole ! 2214: [(set (cc0) ! 2215: (compare (match_operand:DF 0 "general_operand" "f") ! 2216: (match_operand:DF 1 "general_operand" "f"))) ! 2217: (set (pc) ! 2218: (if_then_else (lt (cc0) ! 2219: (const_int 0)) ! 2220: (pc) ! 2221: (label_ref (match_operand 2 "" ""))))] ! 2222: "" ! 2223: "c.lt.d\\t%0,%1\\t# Merged CMPDF +I. BGE \;bc1f\\t%l2\\t# Merged CMPDF +I. BGE") ! 2224: ;;- MERGED CMPDF + BLE ! 2225: (define_peephole ! 2226: [(set (cc0) ! 2227: (compare (match_operand:DF 0 "general_operand" "f") ! 2228: (match_operand:DF 1 "general_operand" "f"))) ! 2229: (set (pc) ! 2230: (if_then_else (le (cc0) ! 2231: (const_int 0)) ! 2232: (label_ref (match_operand 2 "" "")) ! 2233: (pc)))] ! 2234: "" ! 2235: "c.le.d\\t%0,%1\\t# Merged CMPDF + BLE \;bc1t\\t%l2\\t# Merged CMPDF + BLE ") ! 2236: ! 2237: ;;- MERGED CMPDF + INV BLE ! 2238: (define_peephole ! 2239: [(set (cc0) ! 2240: (compare (match_operand:DF 0 "general_operand" "f") ! 2241: (match_operand:DF 1 "general_operand" "f"))) ! 2242: (set (pc) ! 2243: (if_then_else (gt (cc0) ! 2244: (const_int 0)) ! 2245: (pc) ! 2246: (label_ref (match_operand 2 "" ""))))] ! 2247: "" ! 2248: "c.le.d\\t%0,%1\\t# Merged CMPDF +I. BLE \;bc1t\\t%l2\\t# Merged CMPDF + I.BLE ") ! 2249: ! 2250: ! 2251: ! 2252: ! 2253: ;; ! 2254: ;; .................... ! 2255: ;; ! 2256: ;; COMPARISONS ! 2257: ;; ! 2258: ;; .................... ! 2259: ! 2260: ;;- Order is significant here ! 2261: ;;- because there are untyped ! 2262: ;;- comparisons generated by ! 2263: ;;- the optimizer ! 2264: ;;- (set (cc0) ! 2265: ;;- (compare (const_int 2) ! 2266: ;;- (const_int 1))) ! 2267: ! 2268: (define_insn "cmpsi" ! 2269: [(set (cc0) ! 2270: (compare (match_operand:SI 0 "register_operand" "r") ! 2271: (match_operand:SI 1 "register_operand" "r")))] ! 2272: "" ! 2273: "* ! 2274: compare_collect (SImode, operands[0], operands[1]); ! 2275: return \" #\\tcmpsi\\t%0,%1\"; ! 2276: ") ! 2277: ! 2278: ;; These patterns are hopelessly invalid, because ! 2279: ;; comparing subword values properly requires extending them. ! 2280: ! 2281: ;; (define_insn "cmphi" ! 2282: ;; [(set (cc0) ! 2283: ;; (compare (match_operand:HI 0 "general_operand" "r") ! 2284: ;; (match_operand:HI 1 "general_operand" "r")))] ! 2285: ;; "" ! 2286: ;; "* ! 2287: ;; compare_collect (HImode, operands[0], operands[1]); ! 2288: ;; return \" #\\tcmphi\\t%0,%1\"; ! 2289: ;; ") ! 2290: ;; ! 2291: ;; (define_insn "cmpqi" ! 2292: ;; [(set (cc0) ! 2293: ;; (compare (match_operand:QI 0 "general_operand" "r") ! 2294: ;; (match_operand:QI 1 "general_operand" "r")))] ! 2295: ;; "" ! 2296: ;; "* ! 2297: ;; compare_collect (QImode, operands[0], operands[1]); ! 2298: ;; return \" #\\tcmpqi\\t%0,%1\"; ! 2299: ;; ") ! 2300: ! 2301: (define_insn "cmpdf" ! 2302: [(set (cc0) ! 2303: (compare (match_operand:DF 0 "register_operand" "f") ! 2304: (match_operand:DF 1 "register_operand" "f")))] ! 2305: "" ! 2306: "* ! 2307: compare_collect (DFmode, operands[0], operands[1]); ! 2308: return \" #\\tcmpdf\\t%0,%1\" ; ! 2309: ") ! 2310: ! 2311: (define_insn "cmpsf" ! 2312: [(set (cc0) ! 2313: (compare (match_operand:SF 0 "register_operand" "f") ! 2314: (match_operand:SF 1 "register_operand" "f")))] ! 2315: "" ! 2316: "* ! 2317: compare_collect (SFmode, operands[0], operands[1]); ! 2318: return \" #\\tcmpsf\\t%0,%1\" ; ! 2319: ") ! 2320: ! 2321: (define_insn "" ! 2322: [(set (cc0) ! 2323: (match_operand:QI 0 "general_operand" "r"))] ! 2324: "" ! 2325: "* ! 2326: compare_collect (QImode, operands[0], gen_rtx (REG, QImode, 0)); ! 2327: return \" #\\t (set (cc0)\\t%0)\"; ! 2328: ") ! 2329: ! 2330: (define_insn "" ! 2331: [(set (cc0) ! 2332: (match_operand:HI 0 "general_operand" "r"))] ! 2333: "" ! 2334: "* ! 2335: compare_collect (HImode, operands[0], gen_rtx (REG, HImode, 0)); ! 2336: return \" #\\t (set (cc0)\\t%0)\"; ! 2337: ") ! 2338: ! 2339: (define_insn "" ! 2340: [(set (cc0) ! 2341: (match_operand:SI 0 "general_operand" "r"))] ! 2342: "" ! 2343: "* ! 2344: compare_collect (SImode, operands[0], gen_rtx (REG, SImode, 0)); ! 2345: return \" #\\t (set (cc0)\\t%0)\"; ! 2346: ") ! 2347: ! 2348: ;; ! 2349: ;; .................... ! 2350: ;; ! 2351: ;; BRANCHES ! 2352: ;; ! 2353: ;; .................... ! 2354: ! 2355: (define_insn "jump" ! 2356: [(set (pc) ! 2357: (label_ref (match_operand 0 "" "")))] ! 2358: "" ! 2359: "* ! 2360: { ! 2361: if (GET_CODE (operands[0]) == REG) ! 2362: return \"j\\t%%0\\t#jump %l0 (jr not asm syntax)\"; ! 2363: else ! 2364: return \"j\\t%l0\\t#jump %l0\"; ! 2365: }") ! 2366: ! 2367: ! 2368: (define_insn "beq" ! 2369: [(set (pc) ! 2370: (if_then_else (eq (cc0) ! 2371: (const_int 0)) ! 2372: (label_ref (match_operand 0 "" "")) ! 2373: (pc)))] ! 2374: "" ! 2375: "* ! 2376: { ! 2377: rtx br_ops[3]; ! 2378: enum machine_mode mode; ! 2379: compare_restore (br_ops, &mode, insn); ! 2380: br_ops[2] = operands[0]; ! 2381: if (mode == DFmode) ! 2382: { ! 2383: output_asm_insn (\"c.eq.d\\t%0,%1\\t#beq\", br_ops); ! 2384: output_asm_insn (\"bc1t\\t%2\\t#beq\", br_ops); ! 2385: } ! 2386: else if (mode == SFmode) ! 2387: { ! 2388: output_asm_insn (\"c.eq.s\\t%0,%1\\t#beq\", br_ops); ! 2389: output_asm_insn (\"bc1t\\t%2\\t#beq\", br_ops); ! 2390: } ! 2391: else ! 2392: { ! 2393: output_asm_insn (\"beq\\t%0,%1,%2\\t#beq\", br_ops); ! 2394: } ! 2395: return \"\"; ! 2396: } ! 2397: ") ! 2398: ! 2399: (define_insn "bne" ! 2400: [(set (pc) ! 2401: (if_then_else (ne (cc0) ! 2402: (const_int 0)) ! 2403: (label_ref (match_operand 0 "" "")) ! 2404: (pc)))] ! 2405: "" ! 2406: "* ! 2407: { ! 2408: rtx br_ops[3]; ! 2409: enum machine_mode mode; ! 2410: compare_restore (br_ops, &mode, insn); ! 2411: br_ops[2] = operands[0]; ! 2412: if (mode == DFmode) ! 2413: { ! 2414: output_asm_insn (\"c.eq.d\\t%0,%1\\t#bne\", br_ops); ! 2415: output_asm_insn (\"bc1f\\t%2\\t#bne\", br_ops); ! 2416: } ! 2417: else if (mode == SFmode) ! 2418: { ! 2419: output_asm_insn (\"c.eq.s\\t%0,%1\\t#bne\", br_ops); ! 2420: output_asm_insn (\"bc1f\\t%2\\t#bne\", br_ops); ! 2421: } ! 2422: else ! 2423: { ! 2424: output_asm_insn (\"bne\\t%0,%1,%2\\t#bne\", br_ops); ! 2425: } ! 2426: return \"\"; ! 2427: } ! 2428: ! 2429: ") ! 2430: ! 2431: (define_insn "bgt" ! 2432: [(set (pc) ! 2433: (if_then_else (gt (cc0) ! 2434: (const_int 0)) ! 2435: (label_ref (match_operand 0 "" "")) ! 2436: (pc)))] ! 2437: "" ! 2438: "* ! 2439: { ! 2440: rtx br_ops[3]; ! 2441: enum machine_mode mode; ! 2442: compare_restore (br_ops, &mode, insn); ! 2443: br_ops[2] = operands[0]; ! 2444: if (mode == DFmode) ! 2445: { ! 2446: output_asm_insn (\"c.le.d\\t%0,%1\\t#bgt branch %0 > %1\", br_ops); ! 2447: output_asm_insn (\"bc1f\\t%2\\t#bgt\", br_ops); ! 2448: } ! 2449: else if (mode == SFmode) ! 2450: { ! 2451: output_asm_insn (\"c.le.s\\t%0,%1\\t#bgt branch %0 > %1\", br_ops); ! 2452: output_asm_insn (\"bc1f\\t%2\\t#bgt\", br_ops); ! 2453: } ! 2454: else ! 2455: { ! 2456: output_asm_insn (\"bgt\\t%0,%1,%2\\t#bgt\", br_ops); ! 2457: } ! 2458: return \"\"; ! 2459: } ! 2460: ! 2461: ") ! 2462: ! 2463: (define_insn "blt" ! 2464: [(set (pc) ! 2465: (if_then_else (lt (cc0) ! 2466: (const_int 0)) ! 2467: (label_ref (match_operand 0 "" "")) ! 2468: (pc)))] ! 2469: "" ! 2470: "* ! 2471: { ! 2472: rtx br_ops[3]; ! 2473: enum machine_mode mode; ! 2474: compare_restore (br_ops, &mode, insn); ! 2475: br_ops[2] = operands[0]; ! 2476: if (mode == DFmode) ! 2477: { ! 2478: output_asm_insn (\"c.lt.d\\t%0,%1\\t#blt\", br_ops); ! 2479: output_asm_insn (\"bc1t\\t%2\\t#blt\", br_ops); ! 2480: } ! 2481: else if (mode == SFmode) ! 2482: { ! 2483: output_asm_insn (\"c.lt.s\\t%0,%1\\t#blt\", br_ops); ! 2484: output_asm_insn (\"bc1t\\t%2\\t#blt\", br_ops); ! 2485: } ! 2486: else ! 2487: { ! 2488: output_asm_insn (\"blt\\t%0,%1,%2\\t#blt\", br_ops); ! 2489: } ! 2490: return \" #\\tblt \\t%l0\\t#blt\"; ! 2491: } ! 2492: ") ! 2493: ! 2494: (define_insn "bgtu" ! 2495: [(set (pc) ! 2496: (if_then_else (gtu (cc0) ! 2497: (const_int 0)) ! 2498: (label_ref (match_operand 0 "" "")) ! 2499: (pc)))] ! 2500: "" ! 2501: "* ! 2502: { ! 2503: rtx br_ops[3]; ! 2504: enum machine_mode mode; ! 2505: compare_restore (br_ops, &mode, insn); ! 2506: br_ops[2] = operands[0]; ! 2507: if (mode == DFmode) ! 2508: { ! 2509: output_asm_insn (\"c.le.d\\t%0,%1\\t#bgtu\", br_ops); ! 2510: output_asm_insn (\"bc1f\\t%2\\t#bgtu\", br_ops); ! 2511: } ! 2512: else if (mode == SFmode) ! 2513: { ! 2514: output_asm_insn (\"c.le.s\\t%0,%1\\t#bgtu\", br_ops); ! 2515: output_asm_insn (\"bc1f\\t%2\\t#bgtu\", br_ops); ! 2516: } ! 2517: else ! 2518: { ! 2519: output_asm_insn (\"bgtu\\t%0,%1,%2\\t#bgtu\", br_ops); ! 2520: } ! 2521: return \" #\\tbgtu \\t%l0\\t#bgtu\"; ! 2522: } ! 2523: ! 2524: ") ! 2525: ! 2526: (define_insn "bltu" ! 2527: [(set (pc) ! 2528: (if_then_else (ltu (cc0) ! 2529: (const_int 0)) ! 2530: (label_ref (match_operand 0 "" "")) ! 2531: (pc)))] ! 2532: "" ! 2533: "* ! 2534: { ! 2535: rtx br_ops[3]; ! 2536: enum machine_mode mode; ! 2537: compare_restore (br_ops, &mode, insn); ! 2538: br_ops[2] = operands[0]; ! 2539: if (mode == DFmode) ! 2540: { ! 2541: output_asm_insn (\"c.lt.d\\t%0,%1\\t#bltu\", br_ops); ! 2542: output_asm_insn (\"bc1t\\t%2\\t#bltu\", br_ops); ! 2543: } ! 2544: else if (mode == SFmode) ! 2545: { ! 2546: output_asm_insn (\"c.lt.s\\t%0,%1\\t#bltu\", br_ops); ! 2547: output_asm_insn (\"bc1t\\t%2\\t#bltu\", br_ops); ! 2548: } ! 2549: else ! 2550: { ! 2551: output_asm_insn (\"bltu\\t%0,%1,%2\\t#bltu\", br_ops); ! 2552: } ! 2553: return \"\"; ! 2554: } ! 2555: ") ! 2556: ! 2557: (define_insn "bge" ! 2558: [(set (pc) ! 2559: (if_then_else (ge (cc0) ! 2560: (const_int 0)) ! 2561: (label_ref (match_operand 0 "" "")) ! 2562: (pc)))] ! 2563: "" ! 2564: "* ! 2565: { ! 2566: rtx br_ops[3]; ! 2567: enum machine_mode mode; ! 2568: compare_restore (br_ops, &mode, insn); ! 2569: br_ops[2] = operands[0]; ! 2570: if (mode == DFmode) ! 2571: { ! 2572: output_asm_insn (\"c.lt.d\\t%0,%1\\t#bge\", br_ops); ! 2573: output_asm_insn (\"bc1f\\t%2\\t#bge\", br_ops); ! 2574: } ! 2575: else if (mode == SFmode) ! 2576: { ! 2577: output_asm_insn (\"c.lt.s\\t%0,%1\\t#bge\", br_ops); ! 2578: output_asm_insn (\"bc1f\\t%2\\t#bge\", br_ops); ! 2579: } ! 2580: else ! 2581: { ! 2582: output_asm_insn (\"bge\\t%0,%1,%2\\t#bge\", br_ops); ! 2583: } ! 2584: return \"\"; ! 2585: } ! 2586: ") ! 2587: ! 2588: (define_insn "bgeu" ! 2589: [(set (pc) ! 2590: (if_then_else (geu (cc0) ! 2591: (const_int 0)) ! 2592: (label_ref (match_operand 0 "" "")) ! 2593: (pc)))] ! 2594: "" ! 2595: "* ! 2596: { ! 2597: rtx br_ops[3]; ! 2598: enum machine_mode mode; ! 2599: compare_restore (br_ops, &mode, insn); ! 2600: br_ops[2] = operands[0]; ! 2601: if (mode == DFmode) ! 2602: { ! 2603: output_asm_insn (\"c.lt.d\\t%0,%1\\t#bgeu\", br_ops); ! 2604: output_asm_insn (\"bc1f\\t%2\\t#bgeu\", br_ops); ! 2605: } ! 2606: else if (mode == SFmode) ! 2607: { ! 2608: output_asm_insn (\"c.lt.s\\t%0,%1\\t#bgeu\", br_ops); ! 2609: output_asm_insn (\"bc1f\\t%2\\t#bgeu\", br_ops); ! 2610: } ! 2611: else ! 2612: { ! 2613: output_asm_insn (\"bgeu\\t%0,%1,%2\\t#bgeu\", br_ops); ! 2614: } ! 2615: return \"\"; ! 2616: } ! 2617: ") ! 2618: ! 2619: (define_insn "ble" ! 2620: [(set (pc) ! 2621: (if_then_else (le (cc0) ! 2622: (const_int 0)) ! 2623: (label_ref (match_operand 0 "" "")) ! 2624: (pc)))] ! 2625: "" ! 2626: "* ! 2627: { ! 2628: rtx br_ops[3]; ! 2629: enum machine_mode mode; ! 2630: compare_restore (br_ops, &mode, insn); ! 2631: br_ops[2] = operands[0]; ! 2632: if (mode == DFmode) ! 2633: { ! 2634: output_asm_insn (\"c.le.d\\t%0,%1\\t#ble\", br_ops); ! 2635: output_asm_insn (\"bc1t\\t%2\\t#ble\", br_ops); ! 2636: } ! 2637: else if (mode == SFmode) ! 2638: { ! 2639: output_asm_insn (\"c.le.s\\t%0,%1\\t#ble\", br_ops); ! 2640: output_asm_insn (\"bc1t\\t%2\\t#ble\", br_ops); ! 2641: } ! 2642: else ! 2643: { ! 2644: output_asm_insn (\"ble\\t%0,%1,%2\\t#ble\", br_ops); ! 2645: } ! 2646: return \"\"; ! 2647: } ! 2648: ") ! 2649: ! 2650: (define_insn "bleu" ! 2651: [(set (pc) ! 2652: (if_then_else (leu (cc0) ! 2653: (const_int 0)) ! 2654: (label_ref (match_operand 0 "" "")) ! 2655: (pc)))] ! 2656: "" ! 2657: "* ! 2658: { ! 2659: rtx br_ops[3]; ! 2660: enum machine_mode mode; ! 2661: compare_restore (br_ops, &mode, insn); ! 2662: br_ops[2] = operands[0]; ! 2663: if (mode == DFmode) ! 2664: { ! 2665: output_asm_insn (\"c.le.d\\t%0,%1\\t#ble\", br_ops); ! 2666: output_asm_insn (\"bc1t\\t%2\\t#ble\", br_ops); ! 2667: } ! 2668: else if (mode == SFmode) ! 2669: { ! 2670: output_asm_insn (\"c.le.s\\t%0,%1\\t#ble\", br_ops); ! 2671: output_asm_insn (\"bc1t\\t%2\\t#ble\", br_ops); ! 2672: } ! 2673: else ! 2674: { ! 2675: output_asm_insn (\"bleu\\t%0,%1,%2\\t#bleu\", br_ops); ! 2676: } ! 2677: return \" #\\tbleu \\t%l0\\t#bleu\"; ! 2678: } ! 2679: ") ! 2680: ! 2681: (define_insn "" ! 2682: [(set (pc) ! 2683: (if_then_else (ne (cc0) ! 2684: (const_int 0)) ! 2685: (pc) ! 2686: (label_ref (match_operand 0 "" ""))))] ! 2687: "" ! 2688: "* ! 2689: { ! 2690: rtx br_ops[3]; ! 2691: enum machine_mode mode; ! 2692: compare_restore (br_ops, &mode, insn); ! 2693: br_ops[2] = operands[0]; ! 2694: if (mode == DFmode) ! 2695: { ! 2696: output_asm_insn (\"c.eq.d\\t%0,%1\\t#beq\", br_ops); ! 2697: output_asm_insn (\"bc1t\\t%2\\t#beq\", br_ops); ! 2698: } ! 2699: else if (mode == SFmode) ! 2700: { ! 2701: output_asm_insn (\"c.eq.s\\t%0,%1\\t#beq\", br_ops); ! 2702: output_asm_insn (\"bc1t\\t%2\\t#beq\", br_ops); ! 2703: } ! 2704: else ! 2705: { ! 2706: output_asm_insn (\"beq\\t%0,%1,%2\\t#beq Inv.\", br_ops); ! 2707: } ! 2708: return \"\"; ! 2709: } ! 2710: ") ! 2711: ! 2712: (define_insn "" ! 2713: [(set (pc) ! 2714: (if_then_else (eq (cc0) ! 2715: (const_int 0)) ! 2716: (pc) ! 2717: (label_ref (match_operand 0 "" ""))))] ! 2718: "" ! 2719: "* ! 2720: { ! 2721: rtx br_ops[3]; ! 2722: enum machine_mode mode; ! 2723: compare_restore (br_ops, &mode, insn); ! 2724: br_ops[2] = operands[0]; ! 2725: if (mode == DFmode) ! 2726: { ! 2727: output_asm_insn (\"c.eq.d\\t%0,%1\\t#bne\", br_ops); ! 2728: output_asm_insn (\"bc1f\\t%2\\t#bne\", br_ops); ! 2729: } ! 2730: else if (mode == SFmode) ! 2731: { ! 2732: output_asm_insn (\"c.eq.s\\t%0,%1\\t#bne\", br_ops); ! 2733: output_asm_insn (\"bc1f\\t%2\\t#beq\", br_ops); ! 2734: } ! 2735: else ! 2736: { ! 2737: output_asm_insn (\"bne\\t%0,%1,%2\\t#bne Inv.\", br_ops); ! 2738: } ! 2739: return \"\"; ! 2740: } ! 2741: ! 2742: ") ! 2743: ! 2744: (define_insn "" ! 2745: [(set (pc) ! 2746: (if_then_else (le (cc0) ! 2747: (const_int 0)) ! 2748: (pc) ! 2749: (label_ref (match_operand 0 "" ""))))] ! 2750: "" ! 2751: "* ! 2752: { ! 2753: rtx br_ops[3]; ! 2754: enum machine_mode mode; ! 2755: compare_restore (br_ops, &mode, insn); ! 2756: br_ops[2] = operands[0]; ! 2757: if (mode == DFmode) ! 2758: { ! 2759: output_asm_insn (\"c.le.d\\t%0,%1\\t#bgt\", br_ops); ! 2760: output_asm_insn (\"bc1f\\t%2\\t#beq\", br_ops); ! 2761: } ! 2762: else if (mode == SFmode) ! 2763: { ! 2764: output_asm_insn (\"c.le.s\\t%0,%1\\t#bgt\", br_ops); ! 2765: output_asm_insn (\"bc1f\\t%2\\t#beq\", br_ops); ! 2766: } ! 2767: else ! 2768: { ! 2769: output_asm_insn (\"bgt\\t%0,%1,%2\\t#bgt Inv.\", br_ops); ! 2770: } ! 2771: return \"\"; ! 2772: } ! 2773: ") ! 2774: ! 2775: (define_insn "" ! 2776: [(set (pc) ! 2777: (if_then_else (leu (cc0) ! 2778: (const_int 0)) ! 2779: (pc) ! 2780: (label_ref (match_operand 0 "" ""))))] ! 2781: "" ! 2782: "* ! 2783: { ! 2784: rtx br_ops[3]; ! 2785: enum machine_mode mode; ! 2786: compare_restore (br_ops, &mode, insn); ! 2787: br_ops[2] = operands[0]; ! 2788: if (mode == DFmode) ! 2789: { ! 2790: output_asm_insn (\"c.le.d\\t%0,%1\\t#bgt\", br_ops); ! 2791: output_asm_insn (\"bc1f\\t%2\\t#beq\", br_ops); ! 2792: } ! 2793: else if (mode == SFmode) ! 2794: { ! 2795: output_asm_insn (\"c.le.s\\t%0,%1\\t#bgt\", br_ops); ! 2796: output_asm_insn (\"bc1f\\t%2\\t#beq\", br_ops); ! 2797: } ! 2798: else ! 2799: { ! 2800: output_asm_insn (\"bgtu\\t%0,%1,%2\\t#bgtu Inv.\", br_ops); ! 2801: } ! 2802: return \" #\\tbgtu \\t%l0\\t#bgtu\"; ! 2803: } ! 2804: ") ! 2805: ! 2806: (define_insn "" ! 2807: [(set (pc) ! 2808: (if_then_else (ge (cc0) ! 2809: (const_int 0)) ! 2810: (pc) ! 2811: (label_ref (match_operand 0 "" ""))))] ! 2812: "" ! 2813: "* ! 2814: { ! 2815: rtx br_ops[3]; ! 2816: enum machine_mode mode; ! 2817: compare_restore (br_ops, &mode, insn); ! 2818: br_ops[2] = operands[0]; ! 2819: if (mode == DFmode) ! 2820: { ! 2821: output_asm_insn (\"c.lt.d\\t%0,%1\\t#blt\", br_ops); ! 2822: output_asm_insn (\"bc1t\\t%2\\t#beq\", br_ops); ! 2823: } ! 2824: else if (mode == SFmode) ! 2825: { ! 2826: output_asm_insn (\"c.lt.s\\t%0,%1\\t#blt\", br_ops); ! 2827: output_asm_insn (\"bc1t\\t%2\\t#beq\", br_ops); ! 2828: } ! 2829: else ! 2830: { ! 2831: output_asm_insn (\"blt\\t%0,%1,%2\\t#blt Inv.\", br_ops); ! 2832: } ! 2833: return \"\"; ! 2834: } ! 2835: ") ! 2836: ! 2837: (define_insn "" ! 2838: [(set (pc) ! 2839: (if_then_else (geu (cc0) ! 2840: (const_int 0)) ! 2841: (pc) ! 2842: (label_ref (match_operand 0 "" ""))))] ! 2843: "" ! 2844: "* ! 2845: { ! 2846: rtx br_ops[3]; ! 2847: enum machine_mode mode; ! 2848: compare_restore (br_ops, &mode, insn); ! 2849: br_ops[2] = operands[0]; ! 2850: if (mode == DFmode) ! 2851: { ! 2852: output_asm_insn (\"c.lt.d\\t%0,%1\\t#bltu\", br_ops); ! 2853: output_asm_insn (\"bc1t\\t%2\\t#bltu\", br_ops); ! 2854: } ! 2855: else if (mode == SFmode) ! 2856: { ! 2857: output_asm_insn (\"c.lt.s\\t%0,%1\\t#bltu\", br_ops); ! 2858: output_asm_insn (\"bc1t\\t%2\\t#bltu\", br_ops); ! 2859: } ! 2860: else ! 2861: { ! 2862: output_asm_insn (\"bltu\\t%0,%1,%2\\t#bltu Inv.\", br_ops); ! 2863: } ! 2864: return \" #\\tbltu \\t%l0\\t#bltu\"; ! 2865: } ! 2866: ") ! 2867: ! 2868: (define_insn "" ! 2869: [(set (pc) ! 2870: (if_then_else (lt (cc0) ! 2871: (const_int 0)) ! 2872: (pc) ! 2873: (label_ref (match_operand 0 "" ""))))] ! 2874: "" ! 2875: "* ! 2876: { ! 2877: rtx br_ops[3]; ! 2878: enum machine_mode mode; ! 2879: compare_restore (br_ops, &mode, insn); ! 2880: br_ops[2] = operands[0]; ! 2881: if (mode == DFmode) ! 2882: { ! 2883: output_asm_insn (\"c.lt.d\\t%0,%1\\t#bge\", br_ops); ! 2884: output_asm_insn (\"bc1f\\t%2\\t#bge (DF) Inv.\", br_ops); ! 2885: } ! 2886: else if (mode == SFmode) ! 2887: { ! 2888: output_asm_insn (\"c.lt.s\\t%0,%1\\t#bge\", br_ops); ! 2889: output_asm_insn (\"bc1f\\t%2\\t#bge (SF) Inv.\", br_ops); ! 2890: } ! 2891: else ! 2892: { ! 2893: output_asm_insn (\"bge\\t%0,%1,%2\\t#bge Inv.\", br_ops); ! 2894: } ! 2895: return \"\"; ! 2896: } ! 2897: ") ! 2898: ! 2899: (define_insn "" ! 2900: [(set (pc) ! 2901: (if_then_else (ltu (cc0) ! 2902: (const_int 0)) ! 2903: (pc) ! 2904: (label_ref (match_operand 0 "" ""))))] ! 2905: "" ! 2906: "* ! 2907: { ! 2908: rtx br_ops[3]; ! 2909: enum machine_mode mode; ! 2910: compare_restore (br_ops, &mode, insn); ! 2911: br_ops[2] = operands[0]; ! 2912: if (mode == DFmode) ! 2913: { ! 2914: output_asm_insn (\"c.lt.d\\t%0,%1\\t#bge\", br_ops); ! 2915: output_asm_insn (\"bc1f\\t%2\\t#bgeu (DF) Inv.\", br_ops); ! 2916: } ! 2917: else if (mode == SFmode) ! 2918: { ! 2919: output_asm_insn (\"c.lt.s\\t%0,%1\\t#bge\", br_ops); ! 2920: output_asm_insn (\"bc1f\\t%2\\t#bgeu (SF )Inv.\", br_ops); ! 2921: } ! 2922: else ! 2923: { ! 2924: output_asm_insn (\"bgeu\\t%0,%1,%2\\t#bgeu Inv.\", br_ops); ! 2925: } ! 2926: return \" #\\tbgeu \\t%l0\\t#bgeu\"; ! 2927: } ! 2928: ") ! 2929: ! 2930: (define_insn "" ! 2931: [(set (pc) ! 2932: (if_then_else (gt (cc0) ! 2933: (const_int 0)) ! 2934: (pc) ! 2935: (label_ref (match_operand 0 "" ""))))] ! 2936: "" ! 2937: "* ! 2938: { ! 2939: rtx br_ops[3]; ! 2940: enum machine_mode mode; ! 2941: compare_restore (br_ops, &mode, insn); ! 2942: br_ops[2] = operands[0]; ! 2943: if (mode == DFmode) ! 2944: { ! 2945: output_asm_insn (\"c.le.d\\t%0,%1\\t#ble\", br_ops); ! 2946: output_asm_insn (\"bc1t\\t%2\\t#ble\", br_ops); ! 2947: } ! 2948: else if (mode == SFmode) ! 2949: { ! 2950: output_asm_insn (\"c.le.s\\t%0,%1\\t#ble\", br_ops); ! 2951: output_asm_insn (\"bc1t\\t%2\\t#ble\", br_ops); ! 2952: } ! 2953: else ! 2954: { ! 2955: output_asm_insn (\"ble\\t%0,%1,%2\\t#ble Inv.\", br_ops); ! 2956: } ! 2957: return \"\"; ! 2958: } ! 2959: ") ! 2960: ! 2961: (define_insn "" ! 2962: [(set (pc) ! 2963: (if_then_else (gtu (cc0) ! 2964: (const_int 0)) ! 2965: (pc) ! 2966: (label_ref (match_operand 0 "" ""))))] ! 2967: "" ! 2968: "* ! 2969: { ! 2970: rtx br_ops[3]; ! 2971: enum machine_mode mode; ! 2972: compare_restore (br_ops, &mode, insn); ! 2973: br_ops[2] = operands[0]; ! 2974: if (mode == DFmode) ! 2975: { ! 2976: output_asm_insn (\"c.le.d\\t%0,%1\\t#bleu\", br_ops); ! 2977: output_asm_insn (\"bc1t\\t%2\\t#bleu\", br_ops); ! 2978: } ! 2979: else if (mode == SFmode) ! 2980: { ! 2981: output_asm_insn (\"c.le.s\\t%0,%1\\t#bleu\", br_ops); ! 2982: output_asm_insn (\"bc1t\\t%2\\t#bleu\", br_ops); ! 2983: } ! 2984: else ! 2985: { ! 2986: output_asm_insn (\"bleu\\t%0,%1,%2\\t#bleu Inv.\", br_ops); ! 2987: } ! 2988: return \"\"; ! 2989: } ! 2990: ") ! 2991: ! 2992: (define_insn "tablejump" ! 2993: [(set (pc) ! 2994: (match_operand:SI 0 "general_operand" "r")) ! 2995: (use (label_ref (match_operand 1 "" "")))] ! 2996: "" ! 2997: "j\\t%0\\t# tablejump, label %l1\\t (jr not asm syntax)") ! 2998: ! 2999: ;; ! 3000: ;; .................... ! 3001: ;; ! 3002: ;; LINKAGE ! 3003: ;; ! 3004: ;; .................... ! 3005: ! 3006: (define_insn "call" ! 3007: [(call (match_operand 0 "general_operand" "g") ! 3008: (match_operand 1 "general_operand" "g")) ! 3009: (clobber (reg:SI 31))] ! 3010: "" ! 3011: "* ! 3012: { ! 3013: if (GET_CODE (XEXP (operands[0], 0)) == SYMBOL_REF) ! 3014: return \"jal\\t%0\\t# call with %1 arguments\"; ! 3015: else ! 3016: { ! 3017: operands[0] = XEXP (operands[0], 0); ! 3018: return \"jal\\t$31,%0\\t# call with %1 arguments (reg)\"; ! 3019: } ! 3020: }" ) ! 3021: ! 3022: ! 3023: (define_expand "call_value" ! 3024: [(set (match_operand 0 "" "=rf") ! 3025: (call (match_operand:SI 1 "memory_operand" "m") ! 3026: (match_operand 2 "" "i"))) ! 3027: (clobber (reg:SI 31))] ! 3028: ;; operand 3 is next_arg_register ! 3029: "" ! 3030: " ! 3031: { ! 3032: rtx fn_rtx, nregs_rtx; ! 3033: rtvec vec; ! 3034: ! 3035: fn_rtx = operands[1]; ! 3036: ! 3037: nregs_rtx = const0_rtx; ! 3038: ! 3039: ! 3040: vec = gen_rtvec (2, ! 3041: gen_rtx (SET, VOIDmode, operands[0], ! 3042: gen_rtx (CALL, VOIDmode, fn_rtx, nregs_rtx)), ! 3043: gen_rtx (CLOBBER, VOIDmode, gen_rtx (REG, SImode, 31))); ! 3044: ! 3045: emit_call_insn (gen_rtx (PARALLEL, VOIDmode, vec)); ! 3046: DONE; ! 3047: }") ! 3048: ! 3049: ! 3050: (define_insn "" ! 3051: [(set (match_operand 0 "general_operand" "=g,f") ! 3052: (call (match_operand 1 "general_operand" "g,g") ! 3053: (match_operand 2 "general_operand" "g,g"))) ! 3054: (clobber (match_operand 3 "general_operand" "g,g"))] ! 3055: "" ! 3056: "* ! 3057: { ! 3058: if (GET_CODE (XEXP (operands[1], 0)) == SYMBOL_REF) ! 3059: return \"jal\\t%1\\t# call %1 regle 2-call (VOIDmode)\"; ! 3060: else ! 3061: { ! 3062: operands[1] = XEXP (operands[1], 0); ! 3063: return \"jal\\t$31,%1\\t# call %1 regle 2-call (VOIDmode, reg)\"; ! 3064: } ! 3065: }") ! 3066: ! 3067: (define_insn "nop" ! 3068: [(const_int 0)] ! 3069: "" ! 3070: "nop") ! 3071: ! 3072: (define_expand "probe" ! 3073: [(set (reg:SI 29) (minus:SI (reg:SI 29) (const_int 4))) ! 3074: (set (mem:SI (reg:SI 29)) (const_int 0)) ! 3075: (set (reg:SI 29) (plus:SI (reg:SI 29) (const_int 4)))] ! 3076: "" ! 3077: "") ! 3078: ! 3079: ;; ! 3080: ;;- Local variables: ! 3081: ;;- mode:emacs-lisp ! 3082: ;;- comment-start: ";;- " ! 3083: ;;- eval: (set-syntax-table (copy-sequence (syntax-table))) ! 3084: ;;- eval: (modify-syntax-entry ?[ "(]") ! 3085: ;;- eval: (modify-syntax-entry ?] ")[") ! 3086: ;;- eval: (modify-syntax-entry ?{ "(}") ! 3087: ;;- eval: (modify-syntax-entry ?} "){") ! 3088: ;;- End:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.