|
|
1.1 ! root 1: ;; GNU C machine description for Pyramid 90x, 9000, MIServer Series ! 2: ;; Copyright (C) 1989, 1990 Free Software Foundation, Inc. ! 3: ! 4: ;; This file is part of GNU CC. ! 5: ! 6: ;; GNU CC is free software; you can redistribute it and/or modify ! 7: ;; it under the terms of the GNU General Public License as published by ! 8: ;; the Free Software Foundation; either version 2, or (at your option) ! 9: ;; any later version. ! 10: ! 11: ;; GNU CC is distributed in the hope that it will be useful, ! 12: ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ! 13: ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ! 14: ;; GNU General Public License for more details. ! 15: ! 16: ;; You should have received a copy of the GNU General Public License ! 17: ;; along with GNU CC; see the file COPYING. If not, write to ! 18: ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. ! 19: ! 20: ;; Instruction patterns. When multiple patterns apply, ! 21: ;; the first one in the file is chosen. ! 22: ;; ! 23: ;; See file "rtl.def" for documentation on define_insn, match_*, et. al. ! 24: ;; ! 25: ;; cpp macro #define NOTICE_UPDATE_CC in file tm.h handles condition code ! 26: ;; updates for most instructions. ! 27: ! 28: ;; * Try using define_insn instead of some peepholes in more places. ! 29: ;; * Set REG_NOTES:REG_EQUIV for cvt[bh]w loads. This would make the ! 30: ;; backward scan in sign_extend needless. ! 31: ;; * Match (pc) (label_ref) case in peephole patterns. ! 32: ;; * Should optimize ! 33: ;; "cmpX op1,op2; b{eq,ne} LY; ucmpX op1.op2; b{lt,le,gt,ge} LZ" ! 34: ;; to ! 35: ;; "ucmpX op1,op2; b{eq,ne} LY; b{lt,le,gt,ge} LZ" ! 36: ;; by pre-scanning insn and running notice_update_cc for them. ! 37: ;; * Is it necessary to do copy_rtx in the test and compare patterns? ! 38: ;; * Fix true frame pointer omission. ! 39: ;; * Make the jump tables contain branches, not addresses! This would ! 40: ;; save us one instruction. ! 41: ;; * Could the compilcated scheme for compares be simplyfied, if we had ! 42: ;; no named cmpqi or cmphi patterns, and instead anonymous patterns for ! 43: ;; the less-than-word compare cases pyr can handle??? ! 44: ;; * The jump insn seems to accept more than just IR addressing. Would ! 45: ;; we win by telling GCC? Or can we use movw into the global reg which ! 46: ;; is a synonym for pc? ! 47: ;; * More DImode patterns. ! 48: ;; * Scan backwards in "zero_extendhisi2", "zero_extendqisi2" to find out ! 49: ;; if the extension can be omitted. ! 50: ;; * "divmodsi" with Pyramid "ediv" insn. Is it possible in rtl?? ! 51: ;; * Would "rcsp tmpreg; u?cmp[bh] op1_regdispl(tmpreg),op2" win in ! 52: ;; comparison with the two extensions and single test generated now? ! 53: ;; The rcsp insn could be expanded, and moved out of loops by the ! 54: ;; optimizer, making 1 (64 bit) insn of 3 (32 bit) insns in loops. ! 55: ;; The rcsp insn could be followed by an add insn, making non-displacement ! 56: ;; IR addressing sufficient. ! 57: ! 58: ;______________________________________________________________________ ! 59: ; ! 60: ; Test and Compare Patterns. ! 61: ;______________________________________________________________________ ! 62: ! 63: ; The argument for the rather complicated test and compare expansion ! 64: ; scheme, is the irregular pyramid instructions for these operations. ! 65: ; 1) Pyramid has different signed and unsigned compares. 2) HImode ! 66: ; and QImode integers are memory-memory and immediate-memory only. 3) ! 67: ; Unsigned HImode compares doesn't exist. 4) Only certain ! 68: ; combinations of addresses are allowed for memory-memory compares. ! 69: ; Whenever necessary, in order to fulfill these addressing ! 70: ; constraints, the compare operands are swapped. ! 71: ! 72: (define_expand "tstsi" ! 73: [(set (cc0) ! 74: (match_operand:SI 0 "general_operand" ""))] ! 75: "" "operands[0] = force_reg (SImode, operands[0]);") ! 76: ! 77: (define_insn "" ! 78: [(set (cc0) ! 79: (compare (match_operand:SI 0 "memory_operand" "m") ! 80: (match_operand:SI 1 "memory_operand" "m")))] ! 81: "weird_memory_memory (operands[0], operands[1])" ! 82: "* ! 83: { ! 84: rtx br_insn = NEXT_INSN (insn); ! 85: RTX_CODE br_code; ! 86: ! 87: if (GET_CODE (br_insn) != JUMP_INSN) ! 88: abort(); ! 89: br_code = GET_CODE (XEXP (XEXP (PATTERN (br_insn), 1), 0)); ! 90: ! 91: weird_memory_memory (operands[0], operands[1]); ! 92: ! 93: if (swap_operands) ! 94: { ! 95: cc_status.flags = CC_REVERSED; ! 96: if (TRULY_UNSIGNED_COMPARE_P (br_code)) ! 97: { ! 98: cc_status.mdep = CC_VALID_FOR_UNSIGNED; ! 99: return \"ucmpw %0,%1\"; ! 100: } ! 101: return \"cmpw %0,%1\"; ! 102: } ! 103: ! 104: if (TRULY_UNSIGNED_COMPARE_P (br_code)) ! 105: { ! 106: cc_status.mdep = CC_VALID_FOR_UNSIGNED; ! 107: return \"ucmpw %1,%0\"; ! 108: } ! 109: return \"cmpw %1,%0\"; ! 110: }") ! 111: ! 112: (define_insn "cmpsi" ! 113: [(set (cc0) ! 114: (compare (match_operand:SI 0 "nonimmediate_operand" "r,g") ! 115: (match_operand:SI 1 "general_operand" "g,r")))] ! 116: "" ! 117: "* ! 118: { ! 119: rtx br_insn = NEXT_INSN (insn); ! 120: RTX_CODE br_code; ! 121: ! 122: if (GET_CODE (br_insn) != JUMP_INSN) ! 123: abort(); ! 124: br_code = GET_CODE (XEXP (XEXP (PATTERN (br_insn), 1), 0)); ! 125: ! 126: if (which_alternative != 0) ! 127: { ! 128: cc_status.flags = CC_REVERSED; ! 129: if (TRULY_UNSIGNED_COMPARE_P (br_code)) ! 130: { ! 131: cc_status.mdep = CC_VALID_FOR_UNSIGNED; ! 132: return \"ucmpw %0,%1\"; ! 133: } ! 134: return \"cmpw %0,%1\"; ! 135: } ! 136: ! 137: if (TRULY_UNSIGNED_COMPARE_P (br_code)) ! 138: { ! 139: cc_status.mdep = CC_VALID_FOR_UNSIGNED; ! 140: return \"ucmpw %1,%0\"; ! 141: } ! 142: return \"cmpw %1,%0\"; ! 143: }") ! 144: ! 145: (define_insn "" ! 146: [(set (cc0) ! 147: (match_operand:SI 0 "nonimmediate_operand" "r"))] ! 148: "" ! 149: "* ! 150: { ! 151: #if 0 ! 152: cc_status.flags |= CC_NO_OVERFLOW; ! 153: return \"cmpw $0,%0\"; ! 154: #endif ! 155: rtx br_insn = NEXT_INSN (insn); ! 156: RTX_CODE br_code; ! 157: ! 158: if (GET_CODE (br_insn) != JUMP_INSN) ! 159: abort(); ! 160: br_code = GET_CODE (XEXP (XEXP (PATTERN (br_insn), 1), 0)); ! 161: ! 162: if (TRULY_UNSIGNED_COMPARE_P (br_code)) ! 163: { ! 164: cc_status.mdep = CC_VALID_FOR_UNSIGNED; ! 165: return \"ucmpw $0,%0\"; ! 166: } ! 167: return \"mtstw %0,%0\"; ! 168: }") ! 169: ! 170: (define_expand "cmphi" ! 171: [(set (cc0) ! 172: (compare (match_operand:HI 0 "nonimmediate_operand" "") ! 173: (match_operand:HI 1 "general_operand" "")))] ! 174: "" ! 175: " ! 176: { ! 177: extern rtx test_op0, test_op1; extern enum machine_mode test_mode; ! 178: test_op0 = copy_rtx (operands[0]); ! 179: test_op1 = copy_rtx (operands[1]); ! 180: test_mode = HImode; ! 181: DONE; ! 182: }") ! 183: ! 184: (define_expand "tsthi" ! 185: [(set (cc0) ! 186: (match_operand:HI 0 "nonimmediate_operand" ""))] ! 187: "" ! 188: " ! 189: { ! 190: extern rtx test_op0; extern enum machine_mode test_mode; ! 191: test_op0 = copy_rtx (operands[0]); ! 192: test_mode = HImode; ! 193: DONE; ! 194: }") ! 195: ! 196: (define_insn "" ! 197: [(set (cc0) ! 198: (compare (match_operand:HI 0 "memory_operand" "m") ! 199: (match_operand:HI 1 "memory_operand" "m")))] ! 200: "weird_memory_memory (operands[0], operands[1])" ! 201: "* ! 202: { ! 203: rtx br_insn = NEXT_INSN (insn); ! 204: ! 205: if (GET_CODE (br_insn) != JUMP_INSN) ! 206: abort(); ! 207: ! 208: weird_memory_memory (operands[0], operands[1]); ! 209: ! 210: if (swap_operands) ! 211: { ! 212: cc_status.flags = CC_REVERSED; ! 213: return \"cmph %0,%1\"; ! 214: } ! 215: ! 216: return \"cmph %1,%0\"; ! 217: }") ! 218: ! 219: (define_insn "" ! 220: [(set (cc0) ! 221: (compare (match_operand:HI 0 "nonimmediate_operand" "r,m") ! 222: (match_operand:HI 1 "nonimmediate_operand" "m,r")))] ! 223: "(GET_CODE (operands[0]) != GET_CODE (operands[1]))" ! 224: "* ! 225: { ! 226: rtx br_insn = NEXT_INSN (insn); ! 227: ! 228: if (GET_CODE (br_insn) != JUMP_INSN) ! 229: abort(); ! 230: ! 231: if (which_alternative != 0) ! 232: { ! 233: cc_status.flags = CC_REVERSED; ! 234: return \"cmph %0,%1\"; ! 235: } ! 236: ! 237: return \"cmph %1,%0\"; ! 238: }") ! 239: ! 240: (define_expand "cmpqi" ! 241: [(set (cc0) ! 242: (compare (match_operand:QI 0 "nonimmediate_operand" "") ! 243: (match_operand:QI 1 "general_operand" "")))] ! 244: "" ! 245: " ! 246: { ! 247: extern rtx test_op0, test_op1; extern enum machine_mode test_mode; ! 248: test_op0 = copy_rtx (operands[0]); ! 249: test_op1 = copy_rtx (operands[1]); ! 250: test_mode = QImode; ! 251: DONE; ! 252: }") ! 253: ! 254: (define_expand "tstqi" ! 255: [(set (cc0) ! 256: (match_operand:QI 0 "nonimmediate_operand" ""))] ! 257: "" ! 258: " ! 259: { ! 260: extern rtx test_op0; extern enum machine_mode test_mode; ! 261: test_op0 = copy_rtx (operands[0]); ! 262: test_mode = QImode; ! 263: DONE; ! 264: }") ! 265: ! 266: (define_insn "" ! 267: [(set (cc0) ! 268: (compare (match_operand:QI 0 "memory_operand" "m") ! 269: (match_operand:QI 1 "memory_operand" "m")))] ! 270: "weird_memory_memory (operands[0], operands[1])" ! 271: "* ! 272: { ! 273: rtx br_insn = NEXT_INSN (insn); ! 274: RTX_CODE br_code; ! 275: ! 276: if (GET_CODE (br_insn) != JUMP_INSN) ! 277: abort(); ! 278: br_code = GET_CODE (XEXP (XEXP (PATTERN (br_insn), 1), 0)); ! 279: ! 280: weird_memory_memory (operands[0], operands[1]); ! 281: ! 282: if (swap_operands) ! 283: { ! 284: cc_status.flags = CC_REVERSED; ! 285: if (TRULY_UNSIGNED_COMPARE_P (br_code)) ! 286: { ! 287: cc_status.mdep = CC_VALID_FOR_UNSIGNED; ! 288: return \"ucmpb %0,%1\"; ! 289: } ! 290: return \"cmpb %0,%1\"; ! 291: } ! 292: ! 293: if (TRULY_UNSIGNED_COMPARE_P (br_code)) ! 294: { ! 295: cc_status.mdep = CC_VALID_FOR_UNSIGNED; ! 296: return \"ucmpb %1,%0\"; ! 297: } ! 298: return \"cmpb %1,%0\"; ! 299: }") ! 300: ! 301: (define_insn "" ! 302: [(set (cc0) ! 303: (compare (match_operand:QI 0 "nonimmediate_operand" "r,m") ! 304: (match_operand:QI 1 "nonimmediate_operand" "m,r")))] ! 305: "(GET_CODE (operands[0]) != GET_CODE (operands[1]))" ! 306: "* ! 307: { ! 308: rtx br_insn = NEXT_INSN (insn); ! 309: RTX_CODE br_code; ! 310: ! 311: if (GET_CODE (br_insn) != JUMP_INSN) ! 312: abort(); ! 313: br_code = GET_CODE (XEXP (XEXP (PATTERN (br_insn), 1), 0)); ! 314: ! 315: if (which_alternative != 0) ! 316: { ! 317: cc_status.flags = CC_REVERSED; ! 318: if (TRULY_UNSIGNED_COMPARE_P (br_code)) ! 319: { ! 320: cc_status.mdep = CC_VALID_FOR_UNSIGNED; ! 321: return \"ucmpb %0,%1\"; ! 322: } ! 323: return \"cmpb %0,%1\"; ! 324: } ! 325: ! 326: if (TRULY_UNSIGNED_COMPARE_P (br_code)) ! 327: { ! 328: cc_status.mdep = CC_VALID_FOR_UNSIGNED; ! 329: return \"ucmpb %1,%0\"; ! 330: } ! 331: return \"cmpb %1,%0\"; ! 332: }") ! 333: ! 334: (define_expand "bgt" ! 335: [(set (pc) (if_then_else (gt (cc0) (const_int 0)) ! 336: (label_ref (match_operand 0 "" "")) (pc)))] ! 337: "" "extend_and_branch (SIGN_EXTEND);") ! 338: ! 339: (define_expand "blt" ! 340: [(set (pc) (if_then_else (lt (cc0) (const_int 0)) ! 341: (label_ref (match_operand 0 "" "")) (pc)))] ! 342: "" "extend_and_branch (SIGN_EXTEND);") ! 343: ! 344: (define_expand "bge" ! 345: [(set (pc) (if_then_else (ge (cc0) (const_int 0)) ! 346: (label_ref (match_operand 0 "" "")) (pc)))] ! 347: "" "extend_and_branch (SIGN_EXTEND);") ! 348: ! 349: (define_expand "ble" ! 350: [(set (pc) (if_then_else (le (cc0) (const_int 0)) ! 351: (label_ref (match_operand 0 "" "")) (pc)))] ! 352: "" "extend_and_branch (SIGN_EXTEND);") ! 353: ! 354: (define_expand "beq" ! 355: [(set (pc) (if_then_else (eq (cc0) (const_int 0)) ! 356: (label_ref (match_operand 0 "" "")) (pc)))] ! 357: "" "extend_and_branch (SIGN_EXTEND);") ! 358: ! 359: (define_expand "bne" ! 360: [(set (pc) (if_then_else (ne (cc0) (const_int 0)) ! 361: (label_ref (match_operand 0 "" "")) (pc)))] ! 362: "" "extend_and_branch (SIGN_EXTEND);") ! 363: ! 364: (define_expand "bgtu" ! 365: [(set (pc) (if_then_else (gtu (cc0) (const_int 0)) ! 366: (label_ref (match_operand 0 "" "")) (pc)))] ! 367: "" "extend_and_branch (ZERO_EXTEND);") ! 368: ! 369: (define_expand "bltu" ! 370: [(set (pc) (if_then_else (ltu (cc0) (const_int 0)) ! 371: (label_ref (match_operand 0 "" "")) (pc)))] ! 372: "" "extend_and_branch (ZERO_EXTEND);") ! 373: ! 374: (define_expand "bgeu" ! 375: [(set (pc) (if_then_else (geu (cc0) (const_int 0)) ! 376: (label_ref (match_operand 0 "" "")) (pc)))] ! 377: "" "extend_and_branch (ZERO_EXTEND);") ! 378: ! 379: (define_expand "bleu" ! 380: [(set (pc) (if_then_else (leu (cc0) (const_int 0)) ! 381: (label_ref (match_operand 0 "" "")) (pc)))] ! 382: "" "extend_and_branch (ZERO_EXTEND);") ! 383: ! 384: (define_insn "cmpdf" ! 385: [(set (cc0) ! 386: (compare (match_operand:DF 0 "register_operand" "r") ! 387: (match_operand:DF 1 "register_operand" "r")))] ! 388: "" ! 389: "cmpd %1,%0") ! 390: ! 391: (define_insn "cmpsf" ! 392: [(set (cc0) ! 393: (compare (match_operand:SF 0 "register_operand" "r") ! 394: (match_operand:SF 1 "register_operand" "r")))] ! 395: "" ! 396: "cmpf %1,%0") ! 397: ! 398: (define_insn "tstdf" ! 399: [(set (cc0) ! 400: (match_operand:DF 0 "register_operand" "r"))] ! 401: "" ! 402: "mtstd %0,%0") ! 403: ! 404: (define_insn "tstsf" ! 405: [(set (cc0) ! 406: (match_operand:SF 0 "register_operand" "r"))] ! 407: "" ! 408: "mtstf %0,%0") ! 409: ! 410: ;______________________________________________________________________ ! 411: ; ! 412: ; Fixed-point Arithmetic. ! 413: ;______________________________________________________________________ ! 414: ! 415: (define_insn "addsi3" ! 416: [(set (match_operand:SI 0 "register_operand" "=r,!r") ! 417: (plus:SI (match_operand:SI 1 "general_operand" "%0,r") ! 418: (match_operand:SI 2 "general_operand" "g,rJ")))] ! 419: "" ! 420: "* ! 421: { ! 422: if (which_alternative == 0) ! 423: return (GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) == 32 ! 424: ? \"subw %n2,%0\" : \"addw %2,%0\"); ! 425: else ! 426: { ! 427: forget_cc_if_dependent (operands[0]); ! 428: return \"mova %a2[%1*1],%0\"; ! 429: } ! 430: }") ! 431: ! 432: (define_insn "subsi3" ! 433: [(set (match_operand:SI 0 "register_operand" "=r,r") ! 434: (minus:SI (match_operand:SI 1 "general_operand" "0,g") ! 435: (match_operand:SI 2 "general_operand" "g,0")))] ! 436: "" ! 437: "* return (which_alternative == 0) ? \"subw %2,%0\" : \"rsubw %1,%0\";") ! 438: ! 439: (define_insn "mulsi3" ! 440: [(set (match_operand:SI 0 "register_operand" "=r") ! 441: (mult:SI (match_operand:SI 1 "general_operand" "%0") ! 442: (match_operand:SI 2 "general_operand" "g")))] ! 443: "" ! 444: "mulw %2,%0") ! 445: ! 446: (define_insn "divsi3" ! 447: [(set (match_operand:SI 0 "register_operand" "=r,r") ! 448: (div:SI (match_operand:SI 1 "general_operand" "0,g") ! 449: (match_operand:SI 2 "general_operand" "g,0")))] ! 450: "" ! 451: "* return (which_alternative == 0) ? \"divw %2,%0\" : \"rdivw %1,%0\";") ! 452: ! 453: (define_insn "udivsi3" ! 454: [(set (match_operand:SI 0 "register_operand" "=r") ! 455: (udiv:SI (match_operand:SI 1 "register_operand" "0") ! 456: (match_operand:SI 2 "general_operand" "g")))] ! 457: "" ! 458: "udivw %2,%0") ! 459: ! 460: (define_insn "modsi3" ! 461: [(set (match_operand:SI 0 "register_operand" "=r") ! 462: (mod:SI (match_operand:SI 1 "register_operand" "0") ! 463: (match_operand:SI 2 "general_operand" "g")))] ! 464: "" ! 465: "modw %2,%0") ! 466: ! 467: (define_insn "umodsi3" ! 468: [(set (match_operand:SI 0 "register_operand" "=r") ! 469: (umod:SI (match_operand:SI 1 "register_operand" "0") ! 470: (match_operand:SI 2 "general_operand" "g")))] ! 471: "" ! 472: "umodw %2,%0") ! 473: ! 474: (define_insn "negsi2" ! 475: [(set (match_operand:SI 0 "register_operand" "=r") ! 476: (neg:SI (match_operand:SI 1 "nonimmediate_operand" "rm")))] ! 477: "" ! 478: "mnegw %1,%0") ! 479: ! 480: (define_insn "one_cmplsi2" ! 481: [(set (match_operand:SI 0 "register_operand" "=r") ! 482: (not:SI (match_operand:SI 1 "nonimmediate_operand" "rm")))] ! 483: "" ! 484: "mcomw %1,%0") ! 485: ! 486: (define_insn "abssi2" ! 487: [(set (match_operand:SI 0 "register_operand" "=r") ! 488: (abs:SI (match_operand:SI 1 "nonimmediate_operand" "rm")))] ! 489: "" ! 490: "mabsw %1,%0") ! 491: ! 492: ;______________________________________________________________________ ! 493: ; ! 494: ; Floating-point Arithmetic. ! 495: ;______________________________________________________________________ ! 496: ! 497: (define_insn "adddf3" ! 498: [(set (match_operand:DF 0 "register_operand" "=r") ! 499: (plus:DF (match_operand:DF 1 "register_operand" "%0") ! 500: (match_operand:DF 2 "register_operand" "r")))] ! 501: "" ! 502: "addd %2,%0") ! 503: ! 504: (define_insn "addsf3" ! 505: [(set (match_operand:SF 0 "register_operand" "=r") ! 506: (plus:SF (match_operand:SF 1 "register_operand" "%0") ! 507: (match_operand:SF 2 "register_operand" "r")))] ! 508: "" ! 509: "addf %2,%0") ! 510: ! 511: (define_insn "subdf3" ! 512: [(set (match_operand:DF 0 "register_operand" "=r") ! 513: (minus:DF (match_operand:DF 1 "register_operand" "0") ! 514: (match_operand:DF 2 "register_operand" "r")))] ! 515: "" ! 516: "subd %2,%0") ! 517: ! 518: (define_insn "subsf3" ! 519: [(set (match_operand:SF 0 "register_operand" "=r") ! 520: (minus:SF (match_operand:SF 1 "register_operand" "0") ! 521: (match_operand:SF 2 "register_operand" "r")))] ! 522: "" ! 523: "subf %2,%0") ! 524: ! 525: (define_insn "muldf3" ! 526: [(set (match_operand:DF 0 "register_operand" "=r") ! 527: (mult:DF (match_operand:DF 1 "register_operand" "%0") ! 528: (match_operand:DF 2 "register_operand" "r")))] ! 529: "" ! 530: "muld %2,%0") ! 531: ! 532: (define_insn "mulsf3" ! 533: [(set (match_operand:SF 0 "register_operand" "=r") ! 534: (mult:SF (match_operand:SF 1 "register_operand" "%0") ! 535: (match_operand:SF 2 "register_operand" "r")))] ! 536: "" ! 537: "mulf %2,%0") ! 538: ! 539: (define_insn "divdf3" ! 540: [(set (match_operand:DF 0 "register_operand" "=r") ! 541: (div:DF (match_operand:DF 1 "register_operand" "0") ! 542: (match_operand:DF 2 "register_operand" "r")))] ! 543: "" ! 544: "divd %2,%0") ! 545: ! 546: (define_insn "divsf3" ! 547: [(set (match_operand:SF 0 "register_operand" "=r") ! 548: (div:SF (match_operand:SF 1 "register_operand" "0") ! 549: (match_operand:SF 2 "register_operand" "r")))] ! 550: "" ! 551: "divf %2,%0") ! 552: ! 553: (define_insn "negdf2" ! 554: [(set (match_operand:DF 0 "register_operand" "=r") ! 555: (neg:DF (match_operand:DF 1 "register_operand" "r")))] ! 556: "" ! 557: "mnegd %1,%0") ! 558: ! 559: (define_insn "negsf2" ! 560: [(set (match_operand:SF 0 "register_operand" "=r") ! 561: (neg:SF (match_operand:SF 1 "register_operand" "r")))] ! 562: "" ! 563: "mnegf %1,%0") ! 564: ! 565: (define_insn "absdf2" ! 566: [(set (match_operand:DF 0 "register_operand" "=r") ! 567: (abs:DF (match_operand:DF 1 "register_operand" "r")))] ! 568: "" ! 569: "mabsd %1,%0") ! 570: ! 571: (define_insn "abssf2" ! 572: [(set (match_operand:SF 0 "register_operand" "=r") ! 573: (abs:SF (match_operand:SF 1 "register_operand" "r")))] ! 574: "" ! 575: "mabsf %1,%0") ! 576: ! 577: ;______________________________________________________________________ ! 578: ; ! 579: ; Logical and Shift Instructions. ! 580: ;______________________________________________________________________ ! 581: ! 582: (define_insn "" ! 583: [(set (cc0) ! 584: (and:SI (match_operand:SI 0 "general_operand" "%r") ! 585: (match_operand:SI 1 "general_operand" "g")))] ! 586: "" ! 587: "* ! 588: { ! 589: cc_status.flags |= CC_NO_OVERFLOW; ! 590: return \"bitw %1,%0\"; ! 591: }") ! 592: ! 593: (define_insn "andsi3" ! 594: [(set (match_operand:SI 0 "register_operand" "=r,r") ! 595: (and:SI (match_operand:SI 1 "general_operand" "%0,r") ! 596: (match_operand:SI 2 "general_operand" "g,K")))] ! 597: "" ! 598: "* ! 599: { ! 600: if (which_alternative == 0) ! 601: return \"andw %2,%0\"; ! 602: ! 603: cc_status.flags = CC_NOT_NEGATIVE; ! 604: return (INTVAL (operands[2]) == 255 ! 605: ? \"movzbw %1,%0\" : \"movzhw %1,%0\"); ! 606: }") ! 607: ! 608: (define_insn "" ! 609: [(set (match_operand:SI 0 "register_operand" "=r") ! 610: (and:SI (not:SI (match_operand:SI 1 "general_operand" "g")) ! 611: (match_operand:SI 2 "register_operand" "0")))] ! 612: "" ! 613: "bicw %1,%0") ! 614: ! 615: (define_insn "iorsi3" ! 616: [(set (match_operand:SI 0 "register_operand" "=r") ! 617: (ior:SI (match_operand:SI 1 "general_operand" "%0") ! 618: (match_operand:SI 2 "general_operand" "g")))] ! 619: "" ! 620: "orw %2,%0") ! 621: ! 622: (define_insn "xorsi3" ! 623: [(set (match_operand:SI 0 "register_operand" "=r") ! 624: (xor:SI (match_operand:SI 1 "general_operand" "%0") ! 625: (match_operand:SI 2 "general_operand" "g")))] ! 626: "" ! 627: "xorw %2,%0") ! 628: ! 629: ; The arithmetic left shift instructions work strangely on pyramids. ! 630: ; They fail to modify the sign bit. Therefore, use logic shifts. ! 631: ! 632: (define_insn "ashlsi3" ! 633: [(set (match_operand:SI 0 "register_operand" "=r") ! 634: (ashift:SI (match_operand:SI 1 "register_operand" "0") ! 635: (match_operand:SI 2 "general_operand" "rnm")))] ! 636: "" ! 637: "* return output_shift (\"lshlw %2,%0\", operands[2], 32); ") ! 638: ! 639: (define_insn "ashrsi3" ! 640: [(set (match_operand:SI 0 "register_operand" "=r") ! 641: (ashiftrt:SI (match_operand:SI 1 "register_operand" "0") ! 642: (match_operand:SI 2 "general_operand" "rnm")))] ! 643: "" ! 644: "* return output_shift (\"ashrw %2,%0\", operands[2], 32); ") ! 645: ! 646: (define_insn "ashrdi3" ! 647: [(set (match_operand:DI 0 "register_operand" "=r") ! 648: (ashiftrt:DI (match_operand:DI 1 "register_operand" "0") ! 649: (match_operand:SI 2 "general_operand" "rnm")))] ! 650: "" ! 651: "* return output_shift (\"ashrl %2,%0\", operands[2], 64); ") ! 652: ! 653: (define_insn "lshrsi3" ! 654: [(set (match_operand:SI 0 "register_operand" "=r") ! 655: (lshiftrt:SI (match_operand:SI 1 "register_operand" "0") ! 656: (match_operand:SI 2 "general_operand" "rnm")))] ! 657: "" ! 658: "* return output_shift (\"lshrw %2,%0\", operands[2], 32); ") ! 659: ! 660: (define_insn "rotlsi3" ! 661: [(set (match_operand:SI 0 "register_operand" "=r") ! 662: (rotate:SI (match_operand:SI 1 "register_operand" "0") ! 663: (match_operand:SI 2 "general_operand" "rnm")))] ! 664: "" ! 665: "* return output_shift (\"rotlw %2,%0\", operands[2], 32); ") ! 666: ! 667: (define_insn "rotrsi3" ! 668: [(set (match_operand:SI 0 "register_operand" "=r") ! 669: (rotatert:SI (match_operand:SI 1 "register_operand" "0") ! 670: (match_operand:SI 2 "general_operand" "rnm")))] ! 671: "" ! 672: "* return output_shift (\"rotrw %2,%0\", operands[2], 32); ") ! 673: ! 674: ;______________________________________________________________________ ! 675: ; ! 676: ; Fixed and Floating Moves. ! 677: ;______________________________________________________________________ ! 678: ! 679: ;; If the destination is a memory operand, indexed source operands are ! 680: ;; disallowed. Big DImode constants are always loaded into a reg pair, ! 681: ;; although offsetable memory addresses really could be dealt with. ! 682: ! 683: (define_insn "" ! 684: [(set (match_operand:DI 0 "memory_operand" "=m") ! 685: (match_operand:DI 1 "nonindexed_operand" "gF"))] ! 686: "(GET_CODE (operands[1]) == CONST_DOUBLE ! 687: ? ((CONST_DOUBLE_HIGH (operands[1]) == 0 ! 688: && CONST_DOUBLE_LOW (operands[1]) >= 0) ! 689: || (CONST_DOUBLE_HIGH (operands[1]) == -1 ! 690: && CONST_DOUBLE_LOW (operands[1]) < 0)) ! 691: : 1)" ! 692: "* ! 693: { ! 694: if (GET_CODE (operands[1]) == CONST_DOUBLE) ! 695: operands[1] = gen_rtx (CONST_INT, VOIDmode, ! 696: CONST_DOUBLE_LOW (operands[1])); ! 697: return \"movl %1,%0\"; ! 698: }") ! 699: ! 700: ;; Force the destination to a register, so all source operands are allowed. ! 701: ! 702: (define_insn "movdi" ! 703: [(set (match_operand:DI 0 "general_operand" "=r") ! 704: (match_operand:DI 1 "general_operand" "gF"))] ! 705: "" ! 706: "* return output_move_double (operands); ") ! 707: ! 708: ;; If the destination is a memory address, indexed source operands are ! 709: ;; disallowed. ! 710: ! 711: (define_insn "" ! 712: [(set (match_operand:SI 0 "memory_operand" "=m") ! 713: (match_operand:SI 1 "nonindexed_operand" "g"))] ! 714: "" ! 715: "movw %1,%0") ! 716: ! 717: ;; Force the destination to a register, so all source operands are allowed. ! 718: ! 719: (define_insn "movsi" ! 720: [(set (match_operand:SI 0 "general_operand" "=r") ! 721: (match_operand:SI 1 "general_operand" "g"))] ! 722: "" ! 723: "movw %1,%0") ! 724: ! 725: ;; If the destination is a memory address, indexed source operands are ! 726: ;; disallowed. ! 727: ! 728: (define_insn "" ! 729: [(set (match_operand:HI 0 "memory_operand" "=m") ! 730: (match_operand:HI 1 "nonindexed_operand" "g"))] ! 731: "" ! 732: "* ! 733: { ! 734: if (REG_P (operands[1])) ! 735: return \"cvtwh %1,%0\"; /* reg -> mem */ ! 736: else ! 737: return \"movh %1,%0\"; /* mem imm -> mem */ ! 738: }") ! 739: ! 740: ;; Force the destination to a register, so all source operands are allowed. ! 741: ! 742: (define_insn "movhi" ! 743: [(set (match_operand:HI 0 "general_operand" "=r") ! 744: (match_operand:HI 1 "general_operand" "g"))] ! 745: "" ! 746: "* ! 747: { ! 748: if (GET_CODE (operands[1]) != MEM) ! 749: return \"movw %1,%0\"; /* reg imm -> reg */ ! 750: return \"cvthw %1,%0\"; /* mem -> reg */ ! 751: }") ! 752: ! 753: ;; If the destination is a memory address, indexed source operands are ! 754: ;; disallowed. ! 755: ! 756: (define_insn "" ! 757: [(set (match_operand:QI 0 "memory_operand" "=m") ! 758: (match_operand:QI 1 "nonindexed_operand" "g"))] ! 759: "" ! 760: "* ! 761: { ! 762: if (REG_P (operands[1])) ! 763: return \"cvtwb %1,%0\"; /* reg -> mem */ ! 764: else ! 765: return \"movb %1,%0\"; /* mem imm -> mem */ ! 766: }") ! 767: ! 768: ;; Force the destination to a register, so all source operands are allowed. ! 769: ! 770: (define_insn "movqi" ! 771: [(set (match_operand:QI 0 "general_operand" "=r") ! 772: (match_operand:QI 1 "general_operand" "g"))] ! 773: "" ! 774: "* ! 775: { ! 776: if (GET_CODE (operands[1]) != MEM) ! 777: return \"movw %1,%0\"; /* reg imm -> reg */ ! 778: return \"cvtbw %1,%0\"; /* mem -> reg */ ! 779: }") ! 780: ! 781: ;; If the destination is a memory address, indexed source operands are ! 782: ;; disallowed. ! 783: ! 784: (define_insn "" ! 785: [(set (match_operand:DF 0 "memory_operand" "=m") ! 786: (match_operand:DF 1 "nonindexed_operand" "g"))] ! 787: "GET_CODE (operands[1]) != CONST_DOUBLE" ! 788: "movl %1,%0") ! 789: ! 790: ;; Force the destination to a register, so all source operands are allowed. ! 791: ! 792: (define_insn "movdf" ! 793: [(set (match_operand:DF 0 "general_operand" "=r") ! 794: (match_operand:DF 1 "general_operand" "gF"))] ! 795: "" ! 796: "* return output_move_double (operands); ") ! 797: ! 798: ;; If the destination is a memory address, indexed source operands are ! 799: ;; disallowed. ! 800: ! 801: (define_insn "" ! 802: [(set (match_operand:SF 0 "memory_operand" "=m") ! 803: (match_operand:SF 1 "nonindexed_operand" "g"))] ! 804: "" ! 805: "movw %1,%0") ! 806: ! 807: ;; Force the destination to a register, so all source operands are allowed. ! 808: ! 809: (define_insn "movsf" ! 810: [(set (match_operand:SF 0 "general_operand" "=r") ! 811: (match_operand:SF 1 "general_operand" "g"))] ! 812: "" ! 813: "movw %1,%0") ! 814: ! 815: (define_insn "" ! 816: [(set (match_operand:SI 0 "register_operand" "=r") ! 817: (match_operand:QI 1 "address_operand" "p"))] ! 818: "" ! 819: "* ! 820: { ! 821: forget_cc_if_dependent (operands[0]); ! 822: return \"mova %a1,%0\"; ! 823: }") ! 824: ! 825: ;______________________________________________________________________ ! 826: ; ! 827: ; Conversion patterns. ! 828: ;______________________________________________________________________ ! 829: ! 830: ;; The trunc patterns are used only when non compile-time constants are used. ! 831: ! 832: (define_insn "truncsiqi2" ! 833: [(set (match_operand:QI 0 "register_operand" "=r") ! 834: (truncate:QI (match_operand:SI 1 "nonimmediate_operand" "rm")))] ! 835: "" ! 836: "* ! 837: { ! 838: if (REG_P (operands[0]) && REG_P (operands[1]) ! 839: && REGNO (operands[0]) == REGNO (operands[1])) ! 840: { ! 841: cc_status = cc_prev_status; ! 842: return \"\"; ! 843: } ! 844: forget_cc_if_dependent (operands[0]); ! 845: return \"movw %1,%0\"; ! 846: }") ! 847: ! 848: (define_insn "truncsihi2" ! 849: [(set (match_operand:HI 0 "register_operand" "=r") ! 850: (truncate:HI (match_operand:SI 1 "nonimmediate_operand" "rm")))] ! 851: "" ! 852: "* ! 853: { ! 854: if (REG_P (operands[0]) && REG_P (operands[1]) ! 855: && REGNO (operands[0]) == REGNO (operands[1])) ! 856: { ! 857: cc_status = cc_prev_status; ! 858: return \"\"; ! 859: } ! 860: forget_cc_if_dependent (operands[0]); ! 861: return \"movw %1,%0\"; ! 862: }") ! 863: ! 864: (define_insn "extendhisi2" ! 865: [(set (match_operand:SI 0 "general_operand" "=r,m") ! 866: (sign_extend:SI (match_operand:HI 1 "nonimmediate_operand" "rm,r")))] ! 867: "" ! 868: "* ! 869: { ! 870: extern int optimize; ! 871: if (optimize && REG_P (operands[0]) && REG_P (operands[1]) ! 872: && REGNO (operands[0]) == REGNO (operands[1]) ! 873: && already_sign_extended (insn, HImode, operands[0])) ! 874: { ! 875: cc_status = cc_prev_status; ! 876: return \"\"; ! 877: } ! 878: return \"cvthw %1,%0\"; ! 879: }") ! 880: ! 881: (define_insn "extendqisi2" ! 882: [(set (match_operand:SI 0 "general_operand" "=r,m") ! 883: (sign_extend:SI (match_operand:QI 1 "nonimmediate_operand" "rm,r")))] ! 884: "" ! 885: "* ! 886: { ! 887: extern int optimize; ! 888: if (optimize && REG_P (operands[0]) && REG_P (operands[1]) ! 889: && REGNO (operands[0]) == REGNO (operands[1]) ! 890: && already_sign_extended (insn, QImode, operands[0])) ! 891: { ! 892: cc_status = cc_prev_status; ! 893: return \"\"; ! 894: } ! 895: return \"cvtbw %1,%0\"; ! 896: }") ! 897: ! 898: ; Pyramid doesn't have insns *called* "cvtbh" or "movzbh". ! 899: ; But we can cvtbw/movzbw into a register, where there is no distinction ! 900: ; between words and halfwords. ! 901: ! 902: (define_insn "extendqihi2" ! 903: [(set (match_operand:HI 0 "register_operand" "=r") ! 904: (sign_extend:HI (match_operand:QI 1 "nonimmediate_operand" "rm")))] ! 905: "" ! 906: "cvtbw %1,%0") ! 907: ! 908: (define_insn "zero_extendhisi2" ! 909: [(set (match_operand:SI 0 "register_operand" "=r") ! 910: (zero_extend:SI (match_operand:HI 1 "nonimmediate_operand" "rm")))] ! 911: "" ! 912: "* ! 913: { ! 914: cc_status.flags = CC_NOT_NEGATIVE; ! 915: return \"movzhw %1,%0\"; ! 916: }") ! 917: ! 918: (define_insn "zero_extendqisi2" ! 919: [(set (match_operand:SI 0 "register_operand" "=r") ! 920: (zero_extend:SI (match_operand:QI 1 "nonimmediate_operand" "rm")))] ! 921: "" ! 922: "* ! 923: { ! 924: cc_status.flags = CC_NOT_NEGATIVE; ! 925: return \"movzbw %1,%0\"; ! 926: }") ! 927: ! 928: (define_insn "zero_extendqihi2" ! 929: [(set (match_operand:HI 0 "register_operand" "=r") ! 930: (zero_extend:HI (match_operand:QI 1 "nonimmediate_operand" "rm")))] ! 931: "" ! 932: "* ! 933: { ! 934: cc_status.flags = CC_NOT_NEGATIVE; ! 935: return \"movzbw %1,%0\"; ! 936: }") ! 937: ! 938: (define_insn "extendsfdf2" ! 939: [(set (match_operand:DF 0 "general_operand" "=&r,m") ! 940: (float_extend:DF (match_operand:SF 1 "nonimmediate_operand" "rm,r")))] ! 941: "" ! 942: "cvtfd %1,%0") ! 943: ! 944: (define_insn "truncdfsf2" ! 945: [(set (match_operand:SF 0 "general_operand" "=&r,m") ! 946: (float_truncate:SF (match_operand:DF 1 "nonimmediate_operand" "rm,r")))] ! 947: "" ! 948: "cvtdf %1,%0") ! 949: ! 950: (define_insn "floatsisf2" ! 951: [(set (match_operand:SF 0 "general_operand" "=&r,m") ! 952: (float:SF (match_operand:SI 1 "nonimmediate_operand" "rm,r")))] ! 953: "" ! 954: "cvtwf %1,%0") ! 955: ! 956: (define_insn "floatsidf2" ! 957: [(set (match_operand:DF 0 "general_operand" "=&r,m") ! 958: (float:DF (match_operand:SI 1 "nonimmediate_operand" "rm,r")))] ! 959: "" ! 960: "cvtwd %1,%0") ! 961: ! 962: (define_insn "fix_truncsfsi2" ! 963: [(set (match_operand:SI 0 "general_operand" "=&r,m") ! 964: (fix:SI (fix:SF (match_operand:SF 1 "nonimmediate_operand" "rm,r"))))] ! 965: "" ! 966: "cvtfw %1,%0") ! 967: ! 968: (define_insn "fix_truncdfsi2" ! 969: [(set (match_operand:SI 0 "general_operand" "=&r,m") ! 970: (fix:SI (fix:DF (match_operand:DF 1 "nonimmediate_operand" "rm,r"))))] ! 971: "" ! 972: "cvtdw %1,%0") ! 973: ! 974: ;______________________________________________________________________ ! 975: ; ! 976: ; Flow Control Patterns. ! 977: ;______________________________________________________________________ ! 978: ! 979: ;; Prefer "br" to "jump" for unconditional jumps, since it's faster. ! 980: ;; (The assembler can manage with out-of-range branches.) ! 981: ! 982: (define_insn "jump" ! 983: [(set (pc) ! 984: (label_ref (match_operand 0 "" "")))] ! 985: "" ! 986: "br %l0") ! 987: ! 988: (define_insn "" ! 989: [(set (pc) ! 990: (if_then_else (match_operator 0 "relop" [(cc0) (const_int 0)]) ! 991: (label_ref (match_operand 1 "" "")) ! 992: (pc)))] ! 993: "" ! 994: "* ! 995: { ! 996: extern int optimize; ! 997: if (optimize) ! 998: switch (GET_CODE (operands[0])) ! 999: { ! 1000: case EQ: case NE: ! 1001: break; ! 1002: case LT: case LE: case GE: case GT: ! 1003: if (cc_prev_status.mdep == CC_VALID_FOR_UNSIGNED) ! 1004: return 0; ! 1005: break; ! 1006: case LTU: case LEU: case GEU: case GTU: ! 1007: if (cc_prev_status.mdep != CC_VALID_FOR_UNSIGNED) ! 1008: return 0; ! 1009: break; ! 1010: } ! 1011: ! 1012: return \"b%N0 %l1\"; ! 1013: }") ! 1014: ! 1015: (define_insn "" ! 1016: [(set (pc) ! 1017: (if_then_else (match_operator 0 "relop" [(cc0) (const_int 0)]) ! 1018: (pc) ! 1019: (label_ref (match_operand 1 "" ""))))] ! 1020: "" ! 1021: "* ! 1022: { ! 1023: extern int optimize; ! 1024: if (optimize) ! 1025: switch (GET_CODE (operands[0])) ! 1026: { ! 1027: case EQ: case NE: ! 1028: break; ! 1029: case LT: case LE: case GE: case GT: ! 1030: if (cc_prev_status.mdep == CC_VALID_FOR_UNSIGNED) ! 1031: return 0; ! 1032: break; ! 1033: case LTU: case LEU: case GEU: case GTU: ! 1034: if (cc_prev_status.mdep != CC_VALID_FOR_UNSIGNED) ! 1035: return 0; ! 1036: break; ! 1037: } ! 1038: ! 1039: return \"b%C0 %l1\"; ! 1040: }") ! 1041: ! 1042: (define_insn "call" ! 1043: [(call (match_operand:QI 0 "memory_operand" "m") ! 1044: (match_operand:SI 1 "immediate_operand" "n"))] ! 1045: "" ! 1046: "call %0") ! 1047: ! 1048: (define_insn "call_value" ! 1049: [(set (match_operand 0 "" "=r") ! 1050: (call (match_operand:QI 1 "memory_operand" "m") ! 1051: (match_operand:SI 2 "immediate_operand" "n")))] ! 1052: ;; Operand 2 not really used on Pyramid architecture. ! 1053: "" ! 1054: "call %1") ! 1055: ! 1056: (define_insn "return" ! 1057: [(return)] ! 1058: "" ! 1059: "* ! 1060: { ! 1061: if (get_frame_size () + current_function_pretend_args_size ! 1062: + current_function_args_size != 0 ! 1063: || current_function_calls_alloca) ! 1064: { ! 1065: int dealloc_size = current_function_pretend_args_size; ! 1066: if (current_function_pops_args) ! 1067: dealloc_size += current_function_args_size; ! 1068: operands[0] = gen_rtx (CONST_INT, VOIDmode, dealloc_size); ! 1069: return \"retd %0\"; ! 1070: } ! 1071: else ! 1072: return \"ret\"; ! 1073: }") ! 1074: ! 1075: (define_insn "tablejump" ! 1076: [(set (pc) (match_operand:SI 0 "register_operand" "r")) ! 1077: (use (label_ref (match_operand 1 "" "")))] ! 1078: "" ! 1079: "jump (%0)") ! 1080: ! 1081: (define_insn "nop" ! 1082: [(const_int 0)] ! 1083: "" ! 1084: "movw gr0,gr0 # nop") ! 1085: ! 1086: ;______________________________________________________________________ ! 1087: ; ! 1088: ; Peep-hole Optimization Patterns. ! 1089: ;______________________________________________________________________ ! 1090: ! 1091: ;; Optimize fullword move followed by a test of the moved value. ! 1092: ! 1093: (define_peephole ! 1094: [(set (match_operand:SI 0 "register_operand" "=r") ! 1095: (match_operand:SI 1 "nonimmediate_operand" "rm")) ! 1096: (set (cc0) (match_operand:SI 2 "nonimmediate_operand" "rm"))] ! 1097: "rtx_equal_p (operands[2], operands[0]) ! 1098: || rtx_equal_p (operands[2], operands[1])" ! 1099: "* ! 1100: cc_status.flags |= CC_NO_OVERFLOW; ! 1101: return \"mtstw %1,%0\"; ! 1102: ") ! 1103: ! 1104: ;; Same for HI and QI mode move-test as well. ! 1105: ! 1106: (define_peephole ! 1107: [(set (match_operand:HI 0 "register_operand" "=r") ! 1108: (match_operand:HI 1 "nonimmediate_operand" "rm")) ! 1109: (set (match_operand:SI 2 "register_operand" "=r") ! 1110: (sign_extend:SI (match_operand:HI 3 "nonimmediate_operand" "rm"))) ! 1111: (set (cc0) (match_dup 2))] ! 1112: "dead_or_set_p (insn, operands[2]) ! 1113: && (rtx_equal_p (operands[3], operands[0]) ! 1114: || rtx_equal_p (operands[3], operands[1]))" ! 1115: "* ! 1116: cc_status.flags |= CC_NO_OVERFLOW; ! 1117: return \"cvthw %1,%0\"; ! 1118: ") ! 1119: ! 1120: (define_peephole ! 1121: [(set (match_operand:QI 0 "register_operand" "=r") ! 1122: (match_operand:QI 1 "nonimmediate_operand" "rm")) ! 1123: (set (match_operand:SI 2 "register_operand" "=r") ! 1124: (sign_extend:SI (match_operand:QI 3 "nonimmediate_operand" "rm"))) ! 1125: (set (cc0) (match_dup 2))] ! 1126: "dead_or_set_p (insn, operands[2]) ! 1127: && (rtx_equal_p (operands[3], operands[0]) ! 1128: || rtx_equal_p (operands[3], operands[1]))" ! 1129: "* ! 1130: cc_status.flags |= CC_NO_OVERFLOW; ! 1131: return \"cvtbw %1,%0\"; ! 1132: ") ! 1133: ! 1134: ;; Optimize loops with an incremented/decremented variable. ! 1135: ! 1136: (define_peephole ! 1137: [(set (match_operand:SI 0 "register_operand" "=r") ! 1138: (plus:SI (match_dup 0) ! 1139: (const_int -1))) ! 1140: (set (cc0) ! 1141: (compare (match_operand:SI 1 "register_operand" "r") ! 1142: (match_operand:SI 2 "nonmemory_operand" "ri"))) ! 1143: (set (pc) ! 1144: (if_then_else (match_operator:SI 3 "signed_comparison" ! 1145: [(cc0) (const_int 0)]) ! 1146: (label_ref (match_operand 4 "" "")) ! 1147: (pc)))] ! 1148: "(GET_CODE (operands[2]) == CONST_INT ! 1149: ? (unsigned)INTVAL (operands[2]) + 32 >= 64 ! 1150: : 1) && (rtx_equal_p (operands[0], operands[1]) ! 1151: || rtx_equal_p (operands[0], operands[2]))" ! 1152: "* ! 1153: if (rtx_equal_p (operands[0], operands[1])) ! 1154: { ! 1155: output_asm_insn (\"dcmpw %2,%0\", operands); ! 1156: return \"b%N3 %l4\"; ! 1157: } ! 1158: else ! 1159: { ! 1160: output_asm_insn (\"dcmpw %1,%0\", operands); ! 1161: return \"b%R3 %l4\"; ! 1162: } ! 1163: ") ! 1164: ! 1165: (define_peephole ! 1166: [(set (match_operand:SI 0 "register_operand" "=r") ! 1167: (plus:SI (match_dup 0) ! 1168: (const_int 1))) ! 1169: (set (cc0) ! 1170: (compare (match_operand:SI 1 "register_operand" "r") ! 1171: (match_operand:SI 2 "nonmemory_operand" "ri"))) ! 1172: (set (pc) ! 1173: (if_then_else (match_operator:SI 3 "signed_comparison" ! 1174: [(cc0) (const_int 0)]) ! 1175: (label_ref (match_operand 4 "" "")) ! 1176: (pc)))] ! 1177: "(GET_CODE (operands[2]) == CONST_INT ! 1178: ? (unsigned)INTVAL (operands[2]) + 32 >= 64 ! 1179: : 1) && (rtx_equal_p (operands[0], operands[1]) ! 1180: || rtx_equal_p (operands[0], operands[2]))" ! 1181: "* ! 1182: if (rtx_equal_p (operands[0], operands[1])) ! 1183: { ! 1184: output_asm_insn (\"icmpw %2,%0\", operands); ! 1185: return \"b%N3 %l4\"; ! 1186: } ! 1187: else ! 1188: { ! 1189: output_asm_insn (\"icmpw %1,%0\", operands); ! 1190: return \"b%R3 %l4\"; ! 1191: } ! 1192: ") ! 1193: ! 1194: ;; Combine two word moves with consecutive operands into one long move. ! 1195: ;; Also combines immediate moves, if the high-order destination operand ! 1196: ;; is loaded with 0 or -1 and the low-order destination operand is loaded ! 1197: ;; with a constant with the same sign. ! 1198: ! 1199: (define_peephole ! 1200: [(set (match_operand:SI 0 "general_operand" "=g") ! 1201: (match_operand:SI 1 "general_operand" "g")) ! 1202: (set (match_operand:SI 2 "general_operand" "=g") ! 1203: (match_operand:SI 3 "general_operand" "g"))] ! 1204: "movdi_possible (operands)" ! 1205: "* ! 1206: output_asm_insn (\"# COMBINE movw %1,%0\", operands); ! 1207: output_asm_insn (\"# COMBINE movw %3,%2\", operands); ! 1208: movdi_possible (operands); ! 1209: if (CONSTANT_P (operands[1])) ! 1210: return (swap_operands) ? \"movl %3,%0\" : \"movl %1,%2\"; ! 1211: ! 1212: return (swap_operands) ? \"movl %1,%0\" : \"movl %3,%2\"; ! 1213: ") ! 1214: ! 1215: ;; Optimize certain tests after memory stores. ! 1216: ! 1217: (define_peephole ! 1218: [(set (match_operand 0 "memory_operand" "=m") ! 1219: (match_operand 1 "register_operand" "r")) ! 1220: (set (match_operand:SI 2 "register_operand" "=r") ! 1221: (sign_extend:SI (match_dup 1))) ! 1222: (set (cc0) ! 1223: (match_dup 2))] ! 1224: "dead_or_set_p (insn, operands[2])" ! 1225: "* ! 1226: cc_status.flags |= CC_NO_OVERFLOW; ! 1227: if (GET_MODE (operands[0]) == QImode) ! 1228: return \"cvtwb %1,%0\"; ! 1229: else ! 1230: return \"cvtwh %1,%0\"; ! 1231: ") ! 1232: ! 1233: ;______________________________________________________________________ ! 1234: ; ! 1235: ; DImode Patterns. ! 1236: ;______________________________________________________________________ ! 1237: ! 1238: (define_expand "extendsidi2" ! 1239: [(set (subreg:SI (match_operand:DI 0 "register_operand" "=r") 1) ! 1240: (match_operand:SI 1 "general_operand" "g")) ! 1241: (set (subreg:SI (match_dup 0) 0) ! 1242: (subreg:SI (match_dup 0) 1)) ! 1243: (set (subreg:SI (match_dup 0) 0) ! 1244: (ashiftrt:SI (subreg:SI (match_dup 0) 0) ! 1245: (const_int 31)))] ! 1246: "" ! 1247: "") ! 1248: ! 1249: (define_insn "adddi3" ! 1250: [(set (match_operand:DI 0 "register_operand" "=r") ! 1251: (plus:DI (match_operand:DI 1 "nonmemory_operand" "%0") ! 1252: (match_operand:DI 2 "nonmemory_operand" "rF")))] ! 1253: "" ! 1254: "* ! 1255: { ! 1256: rtx xoperands[2]; ! 1257: CC_STATUS_INIT; ! 1258: xoperands[0] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1); ! 1259: if (REG_P (operands[2])) ! 1260: xoperands[1] = gen_rtx (REG, SImode, REGNO (operands[2]) + 1); ! 1261: else ! 1262: { ! 1263: xoperands[1] = gen_rtx (CONST_INT, VOIDmode, ! 1264: CONST_DOUBLE_LOW (operands[2])); ! 1265: operands[2] = gen_rtx (CONST_INT, VOIDmode, ! 1266: CONST_DOUBLE_HIGH (operands[2])); ! 1267: } ! 1268: output_asm_insn (\"addw %1,%0\", xoperands); ! 1269: return \"addwc %2,%0\"; ! 1270: }") ! 1271: ! 1272: (define_insn "subdi3" ! 1273: [(set (match_operand:DI 0 "register_operand" "=r") ! 1274: (minus:DI (match_operand:DI 1 "register_operand" "0") ! 1275: (match_operand:DI 2 "nonmemory_operand" "rF")))] ! 1276: "" ! 1277: "* ! 1278: { ! 1279: rtx xoperands[2]; ! 1280: CC_STATUS_INIT; ! 1281: xoperands[0] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1); ! 1282: if (REG_P (operands[2])) ! 1283: xoperands[1] = gen_rtx (REG, SImode, REGNO (operands[2]) + 1); ! 1284: else ! 1285: { ! 1286: xoperands[1] = gen_rtx (CONST_INT, VOIDmode, ! 1287: CONST_DOUBLE_LOW (operands[2])); ! 1288: operands[2] = gen_rtx (CONST_INT, VOIDmode, ! 1289: CONST_DOUBLE_HIGH (operands[2])); ! 1290: } ! 1291: output_asm_insn (\"subw %1,%0\", xoperands); ! 1292: return \"subwb %2,%0\"; ! 1293: }") ! 1294: ! 1295: (define_insn "iordi3" ! 1296: [(set (match_operand:DI 0 "register_operand" "=r") ! 1297: (ior:DI (match_operand:DI 1 "nonmemory_operand" "%0") ! 1298: (match_operand:DI 2 "nonmemory_operand" "rF")))] ! 1299: "" ! 1300: "* ! 1301: { ! 1302: rtx xoperands[2]; ! 1303: CC_STATUS_INIT; ! 1304: xoperands[0] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1); ! 1305: if (REG_P (operands[2])) ! 1306: xoperands[1] = gen_rtx (REG, SImode, REGNO (operands[2]) + 1); ! 1307: else ! 1308: { ! 1309: xoperands[1] = gen_rtx (CONST_INT, VOIDmode, ! 1310: CONST_DOUBLE_LOW (operands[2])); ! 1311: operands[2] = gen_rtx (CONST_INT, VOIDmode, ! 1312: CONST_DOUBLE_HIGH (operands[2])); ! 1313: } ! 1314: output_asm_insn (\"orw %1,%0\", xoperands); ! 1315: return \"orw %2,%0\"; ! 1316: }") ! 1317: ! 1318: (define_insn "anddi3" ! 1319: [(set (match_operand:DI 0 "register_operand" "=r") ! 1320: (and:DI (match_operand:DI 1 "nonmemory_operand" "%0") ! 1321: (match_operand:DI 2 "nonmemory_operand" "rF")))] ! 1322: "" ! 1323: "* ! 1324: { ! 1325: rtx xoperands[2]; ! 1326: CC_STATUS_INIT; ! 1327: xoperands[0] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1); ! 1328: if (REG_P (operands[2])) ! 1329: xoperands[1] = gen_rtx (REG, SImode, REGNO (operands[2]) + 1); ! 1330: else ! 1331: { ! 1332: xoperands[1] = gen_rtx (CONST_INT, VOIDmode, ! 1333: CONST_DOUBLE_LOW (operands[2])); ! 1334: operands[2] = gen_rtx (CONST_INT, VOIDmode, ! 1335: CONST_DOUBLE_HIGH (operands[2])); ! 1336: } ! 1337: output_asm_insn (\"andw %1,%0\", xoperands); ! 1338: return \"andw %2,%0\"; ! 1339: }") ! 1340: ! 1341: (define_insn "xordi3" ! 1342: [(set (match_operand:DI 0 "register_operand" "=r") ! 1343: (xor:DI (match_operand:DI 1 "nonmemory_operand" "%0") ! 1344: (match_operand:DI 2 "nonmemory_operand" "rF")))] ! 1345: "" ! 1346: "* ! 1347: { ! 1348: rtx xoperands[2]; ! 1349: CC_STATUS_INIT; ! 1350: xoperands[0] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1); ! 1351: if (REG_P (operands[2])) ! 1352: xoperands[1] = gen_rtx (REG, SImode, REGNO (operands[2]) + 1); ! 1353: else ! 1354: { ! 1355: xoperands[1] = gen_rtx (CONST_INT, VOIDmode, ! 1356: CONST_DOUBLE_LOW (operands[2])); ! 1357: operands[2] = gen_rtx (CONST_INT, VOIDmode, ! 1358: CONST_DOUBLE_HIGH (operands[2])); ! 1359: } ! 1360: output_asm_insn (\"xorw %1,%0\", xoperands); ! 1361: return \"xorw %2,%0\"; ! 1362: }") ! 1363: ! 1364: ;;- Local variables: ! 1365: ;;- mode:emacs-lisp ! 1366: ;;- comment-start: ";;- " ! 1367: ;;- eval: (set-syntax-table (copy-sequence (syntax-table))) ! 1368: ;;- eval: (modify-syntax-entry ?] ")[") ! 1369: ;;- eval: (modify-syntax-entry ?{ "(}") ! 1370: ;;- eval: (modify-syntax-entry ?} "){") ! 1371: ;;- End: ! 1372:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.