|
|
1.1 ! root 1: ;;- Machine description for GNU compiler -- System/370 version. ! 2: ;; Copyright (C) 1989, 1993 Free Software Foundation, Inc. ! 3: ;; Contributed by Jan Stein ([email protected]). ! 4: ;; Modifed for MVS C/370 by Dave Pitts ([email protected]) ! 5: ! 6: ;; This file is part of GNU CC. ! 7: ! 8: ;; GNU CC is free software; you can redistribute it and/or modify ! 9: ;; it under the terms of the GNU General Public License as published by ! 10: ;; the Free Software Foundation; either version 2, or (at your option) ! 11: ;; any later version. ! 12: ! 13: ;; GNU CC is distributed in the hope that it will be useful, ! 14: ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ! 15: ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ! 16: ;; GNU General Public License for more details. ! 17: ! 18: ;; You should have received a copy of the GNU General Public License ! 19: ;; along with GNU CC; see the file COPYING. If not, write to ! 20: ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. ! 21: ! 22: ;;- cpp macro #define NOTICE_UPDATE_CC in file tm.h handles condition code ! 23: ;;- updates for most instructions. ! 24: ! 25: ;; ! 26: ;; Special constraints for 370 machine description: ! 27: ;; ! 28: ;; a -- Any address register from 1 to 15. ! 29: ;; d -- Any register from 0 to 15. ! 30: ;; I -- An 8-bit constant (0..255). ! 31: ;; J -- A 12-bit constant (0..4095). ! 32: ;; K -- A 16-bit constant (-32768..32767). ! 33: ;; ! 34: ;; Special formats used for outputting 370 instructions. ! 35: ;; ! 36: ;; %B -- Print a constant byte integer. ! 37: ;; %H -- Print a signed 16-bit constant. ! 38: ;; %L -- Print least significant word of a CONST_DOUBLE. ! 39: ;; %M -- Print most significant word of a CONST_DOUBLE. ! 40: ;; %N -- Print next register (second word of a DImode reg). ! 41: ;; %O -- Print the offset of a memory reference (PLUS (REG) (CONST_INT)). ! 42: ;; %R -- Print the register of a memory reference (PLUS (REG) (CONST_INT)). ! 43: ;; %X -- Print a constant byte integer in hex. ! 44: ;; ! 45: ;; We have a special contraint for pattern matching. ! 46: ;; ! 47: ;; s_operand -- Matches a valid S operand in a RS, SI or SS type instruction. ! 48: ;; ! 49: ;; r_or_s_operand -- Matches a register or a valid S operand in a RS, SI ! 50: ;; or SS type instruction or a register ! 51: ;; ! 52: ;; For MVS C/370 we use the following stack locations for: ! 53: ;; ! 54: ;; 136 - internal function result buffer ! 55: ;; 140 - numeric conversion buffer ! 56: ;; 144 - pointer to internal function result buffer ! 57: ;; 148 - start of automatic variables and function arguments ! 58: ;; ! 59: ;; To support programs larger than a page, 4096 bytes, PAGE_REGISTER points ! 60: ;; to a page origin table, all internal labels are generated to reload the ! 61: ;; BASE_REGISTER knowing what page it is on and all branch instructions go ! 62: ;; directly to the target if it is known that the target is on the current ! 63: ;; page (essentially backward references). All forward references and off ! 64: ;; page references are handled by loading the address of target into a ! 65: ;; register and branching indirectly. ! 66: ;; ! 67: ;; Some *di patterns have been commented out per advice from RMS, as gcc ! 68: ;; will generate the right things to do. ! 69: ;; ! 70: ! 71: ;; ! 72: ;;- Test instructions. ! 73: ;; ! 74: ! 75: ; ! 76: ; tstdi instruction pattern(s). ! 77: ; ! 78: ! 79: (define_insn "tstdi" ! 80: [(set (cc0) ! 81: (match_operand:DI 0 "register_operand" "d"))] ! 82: "" ! 83: "* ! 84: { ! 85: check_label_emit (); ! 86: mvs_check_page (0, 4, 0); ! 87: return \"SRDA %0,0\"; ! 88: }") ! 89: ! 90: ; ! 91: ; tstsi instruction pattern(s). ! 92: ; ! 93: ! 94: (define_insn "tstsi" ! 95: [(set (cc0) ! 96: (match_operand:SI 0 "register_operand" "d"))] ! 97: "" ! 98: "* ! 99: { ! 100: check_label_emit (); ! 101: mvs_check_page (0, 2, 0); ! 102: return \"LTR %0,%0\"; ! 103: }") ! 104: ! 105: ; ! 106: ; tsthi instruction pattern(s). ! 107: ; ! 108: ! 109: (define_insn "tsthi" ! 110: [(set (cc0) ! 111: (match_operand:HI 0 "register_operand" "d"))] ! 112: "" ! 113: "* ! 114: { ! 115: check_label_emit (); ! 116: mvs_check_page (0, 4, 2); ! 117: return \"CH %0,=H'0'\"; ! 118: }") ! 119: ! 120: ; ! 121: ; tstqi instruction pattern(s). ! 122: ; ! 123: ! 124: (define_insn "" ! 125: [(set (cc0) ! 126: (match_operand:QI 0 "r_or_s_operand" "dm"))] ! 127: "unsigned_jump_follows_p (insn)" ! 128: "* ! 129: { ! 130: check_label_emit (); ! 131: if (REG_P (operands[0])) ! 132: { ! 133: mvs_check_page (0, 4, 4); ! 134: return \"N %0,=X'000000FF'\"; ! 135: } ! 136: mvs_check_page (0, 4, 0); ! 137: return \"CLI %0,0\"; ! 138: }") ! 139: ! 140: (define_insn "tstqi" ! 141: [(set (cc0) ! 142: (match_operand:QI 0 "register_operand" "d"))] ! 143: "" ! 144: "* ! 145: { ! 146: check_label_emit (); ! 147: if (unsigned_jump_follows_p (insn)) ! 148: { ! 149: mvs_check_page (0, 4, 4); ! 150: return \"N %0,=X'000000FF'\"; ! 151: } ! 152: mvs_check_page (0, 8, 0); ! 153: return \"SLL %0,24\;SRA %0,24\"; ! 154: }") ! 155: ! 156: ; ! 157: ; tstdf instruction pattern(s). ! 158: ; ! 159: ! 160: (define_insn "tstdf" ! 161: [(set (cc0) ! 162: (match_operand:DF 0 "general_operand" "f"))] ! 163: "" ! 164: "* ! 165: { ! 166: check_label_emit (); ! 167: mvs_check_page (0, 2, 0); ! 168: return \"LTDR %0,%0\"; ! 169: }") ! 170: ! 171: ; ! 172: ; tstsf instruction pattern(s). ! 173: ; ! 174: ! 175: (define_insn "tstsf" ! 176: [(set (cc0) ! 177: (match_operand:SF 0 "general_operand" "f"))] ! 178: "" ! 179: "* ! 180: { ! 181: check_label_emit (); ! 182: mvs_check_page (0, 2, 0); ! 183: return \"LTER %0,%0\"; ! 184: }") ! 185: ! 186: ;; ! 187: ;;- Compare instructions. ! 188: ;; ! 189: ! 190: ; ! 191: ; cmpdi instruction pattern(s). ! 192: ; ! 193: ! 194: ;(define_insn "cmpdi" ! 195: ; [(set (cc0) ! 196: ; (compare (match_operand:DI 0 "register_operand" "d") ! 197: ; (match_operand:DI 1 "general_operand" "")))] ! 198: ; "" ! 199: ; "* ! 200: ;{ ! 201: ; check_label_emit (); ! 202: ; if (REG_P (operands[1])) ! 203: ; { ! 204: ; mvs_check_page (0, 8, 0); ! 205: ; if (unsigned_jump_follows_p (insn)) ! 206: ; return \"CLR %0,%1\;BNE *+6\;CLR %N0,%N1\"; ! 207: ; return \"CR %0,%1\;BNE *+6\;CLR %N0,%N1\"; ! 208: ; } ! 209: ; mvs_check_page (0, 12, 0); ! 210: ; if (unsigned_jump_follows_p (insn)) ! 211: ; return \"CL %0,%M1\;BNE *+8\;CL %N0,%L1\"; ! 212: ; return \"C %0,%M1\;BNE *+8\;CL %N0,%L1\"; ! 213: ;}") ! 214: ! 215: ; ! 216: ; cmpsi instruction pattern(s). ! 217: ; ! 218: ! 219: (define_insn "cmpsi" ! 220: [(set (cc0) ! 221: (compare (match_operand:SI 0 "register_operand" "d") ! 222: (match_operand:SI 1 "general_operand" "")))] ! 223: "" ! 224: "* ! 225: { ! 226: check_label_emit (); ! 227: if (REG_P (operands[1])) ! 228: { ! 229: mvs_check_page (0, 2, 0); ! 230: if (unsigned_jump_follows_p (insn)) ! 231: return \"CLR %0,%1\"; ! 232: return \"CR %0,%1\"; ! 233: } ! 234: if (GET_CODE (operands[1]) == CONST_INT) ! 235: { ! 236: mvs_check_page (0, 4, 4); ! 237: if (unsigned_jump_follows_p (insn)) ! 238: return \"CL %0,=F'%c1'\"; ! 239: return \"C %0,=F'%c1'\"; ! 240: } ! 241: mvs_check_page (0, 4, 0); ! 242: if (unsigned_jump_follows_p (insn)) ! 243: return \"CL %0,%1\"; ! 244: return \"C %0,%1\"; ! 245: }") ! 246: ! 247: ; ! 248: ; cmphi instruction pattern(s). ! 249: ; ! 250: ! 251: (define_insn "cmphi" ! 252: [(set (cc0) ! 253: (compare (match_operand:HI 0 "register_operand" "d") ! 254: (match_operand:HI 1 "general_operand" "")))] ! 255: "" ! 256: "* ! 257: { ! 258: check_label_emit (); ! 259: if (REG_P (operands[1])) ! 260: { ! 261: mvs_check_page (0, 8, 0); ! 262: if (unsigned_jump_follows_p (insn)) ! 263: return \"STH %1,140(,13)\;CLM %0,3,140(13)\"; ! 264: return \"STH %1,140(,13)\;CH %0,140(,13)\"; ! 265: } ! 266: if (GET_CODE (operands[1]) == CONST_INT) ! 267: { ! 268: mvs_check_page (0, 4, 2); ! 269: return \"CH %0,=H'%h1'\"; ! 270: } ! 271: mvs_check_page (0, 4, 0); ! 272: return \"CH %0,%1\"; ! 273: }") ! 274: ! 275: ; ! 276: ; cmpqi instruction pattern(s). ! 277: ; ! 278: ! 279: (define_insn "" ! 280: [(set (cc0) ! 281: (compare (match_operand:QI 0 "r_or_s_operand" "g") ! 282: (match_operand:QI 1 "r_or_s_operand" "g")))] ! 283: "unsigned_jump_follows_p (insn)" ! 284: "* ! 285: { ! 286: check_label_emit (); ! 287: if (REG_P (operands[0])) ! 288: { ! 289: if (REG_P (operands[1])) ! 290: { ! 291: mvs_check_page (0, 8, 0); ! 292: return \"STC %1,140(,13)\;CLM %0,1,140(13)\"; ! 293: } ! 294: if (GET_CODE (operands[1]) == CONST_INT) ! 295: { ! 296: mvs_check_page (0, 4, 1); ! 297: return \"CLM %0,1,=X'%X1'\"; ! 298: } ! 299: mvs_check_page (0, 4, 0); ! 300: return \"CLM %0,1,%1\"; ! 301: } ! 302: else if (GET_CODE (operands[0]) == CONST_INT) ! 303: { ! 304: cc_status.flags |= CC_REVERSED; ! 305: if (REG_P (operands[1])) ! 306: { ! 307: mvs_check_page (0, 4, 1); ! 308: return \"CLM %1,1,=X'%X0'\"; ! 309: } ! 310: mvs_check_page (0, 4, 0); ! 311: return \"CLI %1,%B0\"; ! 312: } ! 313: if (GET_CODE (operands[1]) == CONST_INT) ! 314: { ! 315: mvs_check_page (0, 4, 0); ! 316: return \"CLI %0,%B1\"; ! 317: } ! 318: if (GET_CODE (operands[1]) == MEM) ! 319: { ! 320: mvs_check_page (0, 6, 0); ! 321: return \"CLC %O0(1,%R0),%1\"; ! 322: } ! 323: cc_status.flags |= CC_REVERSED; ! 324: mvs_check_page (0, 4, 0); ! 325: return \"CLM %1,1,%0\"; ! 326: }") ! 327: ! 328: (define_insn "cmpqi" ! 329: [(set (cc0) ! 330: (compare (match_operand:QI 0 "register_operand" "d") ! 331: (match_operand:QI 1 "general_operand" "di")))] ! 332: "" ! 333: "* ! 334: { ! 335: check_label_emit (); ! 336: if (unsigned_jump_follows_p (insn)) ! 337: { ! 338: if (REG_P (operands[1])) ! 339: { ! 340: mvs_check_page (0, 4, 0); ! 341: return \"CLM %0,1,%1\"; ! 342: } ! 343: if (GET_CODE (operands[1]) == CONST_INT) ! 344: { ! 345: mvs_check_page (0, 4, 1); ! 346: return \"CLM %0,1,=X'%X1'\"; ! 347: } ! 348: mvs_check_page (0, 8, 0); ! 349: return \"STC %1,140(,13)\;CLM %0,1,140(13)\"; ! 350: } ! 351: if (REG_P (operands[1])) ! 352: { ! 353: mvs_check_page (0, 18, 0); ! 354: return \"SLL %0,24\;SRA %0,24\;SLL %1,24\;SRA %1,24\;CR %0,%1\"; ! 355: } ! 356: mvs_check_page (0, 12, 0); ! 357: return \"SLL %0,24\;SRA %0,24\;C %0,%1\"; ! 358: }") ! 359: ! 360: ; ! 361: ; cmpdf instruction pattern(s). ! 362: ; ! 363: ! 364: (define_insn "cmpdf" ! 365: [(set (cc0) ! 366: (compare (match_operand:DF 0 "general_operand" "f,mF") ! 367: (match_operand:DF 1 "general_operand" "fmF,f")))] ! 368: "" ! 369: "* ! 370: { ! 371: check_label_emit (); ! 372: if (FP_REG_P (operands[0])) ! 373: { ! 374: if (FP_REG_P (operands[1])) ! 375: { ! 376: mvs_check_page (0, 2, 0); ! 377: return \"CDR %0,%1\"; ! 378: } ! 379: mvs_check_page (0, 4, 0); ! 380: return \"CD %0,%1\"; ! 381: } ! 382: cc_status.flags |= CC_REVERSED; ! 383: mvs_check_page (0, 4, 0); ! 384: return \"CD %1,%0\"; ! 385: }") ! 386: ! 387: ; ! 388: ; cmpsf instruction pattern(s). ! 389: ; ! 390: ! 391: (define_insn "cmpsf" ! 392: [(set (cc0) ! 393: (compare (match_operand:SF 0 "general_operand" "f,mF") ! 394: (match_operand:SF 1 "general_operand" "fmF,f")))] ! 395: "" ! 396: "* ! 397: { ! 398: check_label_emit (); ! 399: if (FP_REG_P (operands[0])) ! 400: { ! 401: if (FP_REG_P (operands[1])) ! 402: { ! 403: mvs_check_page (0, 2, 0); ! 404: return \"CER %0,%1\"; ! 405: } ! 406: mvs_check_page (0, 4, 0); ! 407: return \"CE %0,%1\"; ! 408: } ! 409: cc_status.flags |= CC_REVERSED; ! 410: mvs_check_page (0, 4, 0); ! 411: return \"CE %1,%0\"; ! 412: }") ! 413: ! 414: ; ! 415: ; cmpstrsi instruction pattern(s). ! 416: ; ! 417: ! 418: (define_expand "cmpstrsi" ! 419: [(set (match_operand:SI 0 "general_operand" "") ! 420: (compare (match_operand:BLK 1 "general_operand" "") ! 421: (match_operand:BLK 2 "general_operand" ""))) ! 422: (use (match_operand:SI 3 "general_operand" "")) ! 423: (use (match_operand:SI 4 "" ""))] ! 424: "" ! 425: " ! 426: { ! 427: rtx op1, op2; ! 428: ! 429: op1 = XEXP (operands[1], 0); ! 430: if (GET_CODE (op1) == REG ! 431: || (GET_CODE (op1) == PLUS && GET_CODE (XEXP (op1, 0)) == REG ! 432: && GET_CODE (XEXP (op1, 1)) == CONST_INT ! 433: && (unsigned) INTVAL (XEXP (op1, 1)) < 4096)) ! 434: { ! 435: op1 = operands[1]; ! 436: } ! 437: else ! 438: { ! 439: op1 = gen_rtx (MEM, BLKmode, copy_to_mode_reg (SImode, op1)); ! 440: } ! 441: ! 442: op2 = XEXP (operands[2], 0); ! 443: if (GET_CODE (op2) == REG ! 444: || (GET_CODE (op2) == PLUS && GET_CODE (XEXP (op2, 0)) == REG ! 445: && GET_CODE (XEXP (op2, 1)) == CONST_INT ! 446: && (unsigned) INTVAL (XEXP (op2, 1)) < 4096)) ! 447: { ! 448: op2 = operands[2]; ! 449: } ! 450: else ! 451: { ! 452: op2 = gen_rtx (MEM, BLKmode, copy_to_mode_reg (SImode, op2)); ! 453: } ! 454: ! 455: if (GET_CODE (operands[3]) == CONST_INT && INTVAL (operands[3]) < 256) ! 456: { ! 457: emit_insn (gen_rtx (PARALLEL, VOIDmode, gen_rtvec (2, ! 458: gen_rtx (SET, VOIDmode, operands[0], ! 459: gen_rtx (COMPARE, VOIDmode, op1, op2)), ! 460: gen_rtx (USE, VOIDmode, operands[3])))); ! 461: } ! 462: else ! 463: { ! 464: rtx reg1 = gen_reg_rtx (DImode); ! 465: rtx reg2 = gen_reg_rtx (DImode); ! 466: rtx subreg = gen_rtx (SUBREG, SImode, reg1, 1); ! 467: ! 468: emit_insn (gen_rtx (SET, VOIDmode, subreg, operands[3])); ! 469: emit_insn (gen_rtx (SET, VOIDmode, gen_rtx (SUBREG, SImode, reg2, 1), ! 470: subreg)); ! 471: emit_insn (gen_rtx (PARALLEL, VOIDmode, gen_rtvec (5, ! 472: gen_rtx (SET, VOIDmode, operands[0], ! 473: gen_rtx (COMPARE, VOIDmode, op1, op2)), ! 474: gen_rtx (USE, VOIDmode, reg1), ! 475: gen_rtx (USE, VOIDmode, reg2), ! 476: gen_rtx (CLOBBER, VOIDmode, reg1), ! 477: gen_rtx (CLOBBER, VOIDmode, reg2)))); ! 478: } ! 479: DONE; ! 480: }") ! 481: ! 482: ; Compare a block that is less than 256 bytes in length. ! 483: ! 484: (define_insn "" ! 485: [(set (match_operand:SI 0 "register_operand" "d") ! 486: (compare (match_operand:BLK 1 "s_operand" "m") ! 487: (match_operand:BLK 2 "s_operand" "m"))) ! 488: (use (match_operand:QI 3 "immediate_operand" "I"))] ! 489: "((unsigned) INTVAL (operands[3]) < 256)" ! 490: "* ! 491: { ! 492: check_label_emit (); ! 493: mvs_check_page (0, 22, 0); ! 494: return \"LA %0,1\;CLC %O1(%c3,%R1),%2\;BH *+12\;BL *+6\;SLR %0,%0\;LNR %0,%0\"; ! 495: }") ! 496: ! 497: ; Compare a block that is larger than 255 bytes in length. ! 498: ! 499: (define_insn "" ! 500: [(set (match_operand:SI 0 "register_operand" "d") ! 501: (compare (match_operand:BLK 1 "general_operand" "m") ! 502: (match_operand:BLK 2 "general_operand" "m"))) ! 503: (use (match_operand:DI 3 "register_operand" "d")) ! 504: (use (match_operand:DI 4 "register_operand" "d")) ! 505: (clobber (match_dup 3)) ! 506: (clobber (match_dup 4))] ! 507: "" ! 508: "* ! 509: { ! 510: check_label_emit (); ! 511: mvs_check_page (0, 26, 0); ! 512: return \"LA %3,%1\;LA %4,%2\;LA %0,1\;CLCL %3,%4\;BH *+12\;BL *+6\;SLR %0,%0\;LNR %0,%0\"; ! 513: }") ! 514: ! 515: ;; ! 516: ;;- Move instructions. ! 517: ;; ! 518: ! 519: ; ! 520: ; movdi instruction pattern(s). ! 521: ; ! 522: ! 523: (define_insn "" ! 524: [(set (match_operand:DI 0 "r_or_s_operand" "=dm") ! 525: (match_operand:DI 1 "r_or_s_operand" "dim*fF"))] ! 526: "TARGET_CHAR_INSTRUCTIONS" ! 527: "* ! 528: { ! 529: check_label_emit (); ! 530: if (REG_P (operands[0])) ! 531: { ! 532: if (FP_REG_P (operands[1])) ! 533: { ! 534: mvs_check_page (0, 8, 0); ! 535: return \"STD %1,140(,13)\;LM %0,%N0,140(13)\"; ! 536: } ! 537: if (REG_P (operands[1])) ! 538: { ! 539: mvs_check_page (0, 4, 0); ! 540: return \"LR %0,%1\;LR %N0,%N1\"; ! 541: } ! 542: if (operands[1] == const0_rtx) ! 543: { ! 544: CC_STATUS_INIT; ! 545: mvs_check_page (0, 4, 0); ! 546: return \"SLR %0,%0\;SLR %N0,%N0\"; ! 547: } ! 548: if (GET_CODE (operands[1]) == CONST_INT ! 549: && (unsigned) INTVAL (operands[1]) < 4096) ! 550: { ! 551: CC_STATUS_INIT; ! 552: mvs_check_page (0, 6, 0); ! 553: return \"SLR %0,%0\;LA %N0,%c1\"; ! 554: } ! 555: if (GET_CODE (operands[1]) == CONST_INT) ! 556: { ! 557: CC_STATUS_SET (operands[0], operands[1]); ! 558: mvs_check_page (0, 8, 0); ! 559: return \"L %0,%1\;SRDA %0,32\"; ! 560: } ! 561: mvs_check_page (0, 4, 0); ! 562: return \"LM %0,%N0,%1\"; ! 563: } ! 564: else if (FP_REG_P (operands[1])) ! 565: { ! 566: mvs_check_page (0, 4, 0); ! 567: return \"STD %1,%0\"; ! 568: } ! 569: else if (REG_P (operands[1])) ! 570: { ! 571: mvs_check_page (0, 4, 0); ! 572: return \"STM %1,%N1,%0\"; ! 573: } ! 574: mvs_check_page (0, 6, 0); ! 575: return \"MVC %O0(8,%R0),%1\"; ! 576: }") ! 577: ! 578: (define_insn "movdi" ! 579: [(set (match_operand:DI 0 "general_operand" "=dm") ! 580: (match_operand:DI 1 "general_operand" "dim*fF"))] ! 581: "" ! 582: "* ! 583: { ! 584: check_label_emit (); ! 585: if (REG_P (operands[0])) ! 586: { ! 587: if (FP_REG_P (operands[1])) ! 588: { ! 589: mvs_check_page (0, 8, 0); ! 590: return \"STD %1,140(,13)\;LM %0,%N0,140(13)\"; ! 591: } ! 592: if (REG_P (operands[1])) ! 593: { ! 594: mvs_check_page (0, 4, 0); ! 595: return \"LR %0,%1\;LR %N0,%N1\"; ! 596: } ! 597: if (operands[1] == const0_rtx) ! 598: { ! 599: CC_STATUS_INIT; ! 600: mvs_check_page (0, 4, 0); ! 601: return \"SLR %0,%0\;SLR %N0,%N0\"; ! 602: } ! 603: if (GET_CODE (operands[1]) == CONST_INT ! 604: && (unsigned) INTVAL (operands[1]) < 4096) ! 605: { ! 606: CC_STATUS_INIT; ! 607: mvs_check_page (0, 6, 0); ! 608: return \"SLR %0,%0\;LA %N0,%c1\"; ! 609: } ! 610: if (GET_CODE (operands[1]) == CONST_INT) ! 611: { ! 612: CC_STATUS_SET (operands[0], operands[1]); ! 613: mvs_check_page (0, 8, 0); ! 614: return \"L %0,%1\;SRDA %0,32\"; ! 615: } ! 616: mvs_check_page (0, 4, 0); ! 617: return \"LM %0,%N0,%1\"; ! 618: } ! 619: else if (FP_REG_P (operands[1])) ! 620: { ! 621: mvs_check_page (0, 4, 0); ! 622: return \"STD %1,%0\"; ! 623: } ! 624: mvs_check_page (0, 4, 0); ! 625: return \"STM %1,%N1,%0\"; ! 626: }") ! 627: ! 628: ; ! 629: ; movsi instruction pattern(s). ! 630: ; ! 631: ! 632: (define_insn "" ! 633: [(set (match_operand:SI 0 "r_or_s_operand" "=dm,dm") ! 634: (match_operand:SI 1 "r_or_s_operand" "dim,*fF"))] ! 635: "TARGET_CHAR_INSTRUCTIONS" ! 636: "* ! 637: { ! 638: check_label_emit (); ! 639: if (REG_P (operands[0])) ! 640: { ! 641: if (FP_REG_P (operands[1])) ! 642: { ! 643: mvs_check_page (0, 8, 0); ! 644: return \"STE %1,140(,13)\;L %0,140(,13)\"; ! 645: } ! 646: if (REG_P (operands[1])) ! 647: { ! 648: mvs_check_page (0, 2, 0); ! 649: return \"LR %0,%1\"; ! 650: } ! 651: if (operands[1] == const0_rtx) ! 652: { ! 653: CC_STATUS_INIT; ! 654: mvs_check_page (0, 2, 0); ! 655: return \"SLR %0,%0\"; ! 656: } ! 657: if (GET_CODE (operands[1]) == CONST_INT ! 658: && (unsigned) INTVAL (operands[1]) < 4096) ! 659: { ! 660: mvs_check_page (0, 4, 0); ! 661: return \"LA %0,%c1\"; ! 662: } ! 663: mvs_check_page (0, 4, 0); ! 664: return \"L %0,%1\"; ! 665: } ! 666: else if (FP_REG_P (operands[1])) ! 667: { ! 668: mvs_check_page (0, 4, 0); ! 669: return \"STE %1,%0\"; ! 670: } ! 671: else if (REG_P (operands[1])) ! 672: { ! 673: mvs_check_page (0, 4, 0); ! 674: return \"ST %1,%0\"; ! 675: } ! 676: mvs_check_page (0, 6, 0); ! 677: return \"MVC %O0(4,%R0),%1\"; ! 678: }") ! 679: ! 680: (define_insn "movsi" ! 681: [(set (match_operand:SI 0 "general_operand" "=d,dm") ! 682: (match_operand:SI 1 "general_operand" "dimF,*fd"))] ! 683: "" ! 684: "* ! 685: { ! 686: check_label_emit (); ! 687: if (REG_P (operands[0])) ! 688: { ! 689: if (FP_REG_P (operands[1])) ! 690: { ! 691: mvs_check_page (0, 8, 0); ! 692: return \"STE %1,140(,13)\;L %0,140(,13)\"; ! 693: } ! 694: if (REG_P (operands[1])) ! 695: { ! 696: mvs_check_page (0, 2, 0); ! 697: return \"LR %0,%1\"; ! 698: } ! 699: if (operands[1] == const0_rtx) ! 700: { ! 701: CC_STATUS_INIT; ! 702: mvs_check_page (0, 2, 0); ! 703: return \"SLR %0,%0\"; ! 704: } ! 705: if (GET_CODE (operands[1]) == CONST_INT ! 706: && (unsigned) INTVAL (operands[1]) < 4096) ! 707: { ! 708: mvs_check_page (0, 4, 0); ! 709: return \"LA %0,%c1\"; ! 710: } ! 711: mvs_check_page (0, 4, 0); ! 712: return \"L %0,%1\"; ! 713: } ! 714: else if (FP_REG_P (operands[1])) ! 715: { ! 716: mvs_check_page (0, 4, 0); ! 717: return \"STE %1,%0\"; ! 718: } ! 719: mvs_check_page (0, 4, 0); ! 720: return \"ST %1,%0\"; ! 721: }") ! 722: ! 723: ;(define_expand "movsi" ! 724: ; [(set (match_operand:SI 0 "general_operand" "=d,dm") ! 725: ; (match_operand:SI 1 "general_operand" "dimF,*fd"))] ! 726: ; "" ! 727: ; " ! 728: ;{ ! 729: ; rtx op0, op1; ! 730: ; ! 731: ; op0 = operands[0]; ! 732: ; if (GET_CODE (op0) == CONST ! 733: ; && GET_CODE (XEXP (XEXP (op0, 0), 0)) == SYMBOL_REF ! 734: ; && SYMBOL_REF_FLAG (XEXP (XEXP (op0, 0), 0))) ! 735: ; { ! 736: ; op0 = gen_rtx (MEM, SImode, copy_to_mode_reg (SImode, XEXP (op0, 0))); ! 737: ; } ! 738: ; ! 739: ; op1 = operands[1]; ! 740: ; if (GET_CODE (op1) == CONST ! 741: ; && GET_CODE (XEXP (XEXP (op1, 0), 0)) == SYMBOL_REF ! 742: ; && SYMBOL_REF_FLAG (XEXP (XEXP (op1, 0), 0))) ! 743: ; { ! 744: ; op1 = gen_rtx (MEM, SImode, copy_to_mode_reg (SImode, XEXP (op1, 0))); ! 745: ; } ! 746: ; ! 747: ; emit_insn (gen_rtx (SET, VOIDmode, op0, op1)); ! 748: ; DONE; ! 749: ;}") ! 750: ! 751: ; ! 752: ; movhi instruction pattern(s). ! 753: ; ! 754: ! 755: (define_insn "" ! 756: [(set (match_operand:HI 0 "r_or_s_operand" "=g") ! 757: (match_operand:HI 1 "r_or_s_operand" "g"))] ! 758: "TARGET_CHAR_INSTRUCTIONS" ! 759: "* ! 760: { ! 761: check_label_emit (); ! 762: if (REG_P (operands[0])) ! 763: { ! 764: if (REG_P (operands[1])) ! 765: { ! 766: mvs_check_page (0, 2, 0); ! 767: return \"LR %0,%1\"; ! 768: } ! 769: if (operands[1] == const0_rtx) ! 770: { ! 771: CC_STATUS_INIT; ! 772: mvs_check_page (0, 2, 0); ! 773: return \"SLR %0,%0\"; ! 774: } ! 775: if (GET_CODE (operands[1]) == CONST_INT ! 776: && (unsigned) INTVAL (operands[1]) < 4096) ! 777: { ! 778: mvs_check_page (0, 4, 0); ! 779: return \"LA %0,%c1\"; ! 780: } ! 781: if (GET_CODE (operands[1]) == CONST_INT) ! 782: { ! 783: mvs_check_page (0, 4, 2); ! 784: return \"LH %0,=H'%h1'\"; ! 785: } ! 786: mvs_check_page (0, 4, 0); ! 787: return \"LH %0,%1\"; ! 788: } ! 789: else if (REG_P (operands[1])) ! 790: { ! 791: mvs_check_page (0, 4, 0); ! 792: return \"STH %1,%0\"; ! 793: } ! 794: if (GET_CODE (operands[1]) == CONST_INT) ! 795: { ! 796: mvs_check_page (0, 6, 0); ! 797: return \"MVC %O0(2,%R0),=H'%h1'\"; ! 798: } ! 799: mvs_check_page (0, 6, 0); ! 800: return \"MVC %O0(2,%R0),%1\"; ! 801: }") ! 802: ! 803: (define_insn "movhi" ! 804: [(set (match_operand:HI 0 "general_operand" "=d,m") ! 805: (match_operand:HI 1 "general_operand" "g,d"))] ! 806: "" ! 807: "* ! 808: { ! 809: check_label_emit (); ! 810: if (REG_P (operands[0])) ! 811: { ! 812: if (REG_P (operands[1])) ! 813: { ! 814: mvs_check_page (0, 2, 0); ! 815: return \"LR %0,%1\"; ! 816: } ! 817: if (operands[1] == const0_rtx) ! 818: { ! 819: CC_STATUS_INIT; ! 820: mvs_check_page (0, 2, 0); ! 821: return \"SLR %0,%0\"; ! 822: } ! 823: if (GET_CODE (operands[1]) == CONST_INT ! 824: && (unsigned) INTVAL (operands[1]) < 4096) ! 825: { ! 826: mvs_check_page (0, 4, 0); ! 827: return \"LA %0,%c1\"; ! 828: } ! 829: if (GET_CODE (operands[1]) == CONST_INT) ! 830: { ! 831: mvs_check_page (0, 4, 2); ! 832: return \"LH %0,=H'%h1'\"; ! 833: } ! 834: mvs_check_page (0, 4, 0); ! 835: return \"LH %0,%1\"; ! 836: } ! 837: mvs_check_page (0, 4, 0); ! 838: return \"STH %1,%0\"; ! 839: }") ! 840: ! 841: ; ! 842: ; movqi instruction pattern(s). ! 843: ; ! 844: ! 845: (define_insn "" ! 846: [(set (match_operand:QI 0 "r_or_s_operand" "=g") ! 847: (match_operand:QI 1 "r_or_s_operand" "g"))] ! 848: "TARGET_CHAR_INSTRUCTIONS" ! 849: "* ! 850: { ! 851: check_label_emit (); ! 852: if (REG_P (operands[0])) ! 853: { ! 854: if (REG_P (operands[1])) ! 855: { ! 856: mvs_check_page (0, 2, 0); ! 857: return \"LR %0,%1\"; ! 858: } ! 859: if (operands[1] == const0_rtx) ! 860: { ! 861: CC_STATUS_INIT; ! 862: mvs_check_page (0, 2, 0); ! 863: return \"SLR %0,%0\"; ! 864: } ! 865: if (GET_CODE (operands[1]) == CONST_INT) ! 866: { ! 867: if (INTVAL (operands[1]) >= 0) ! 868: { ! 869: mvs_check_page (0, 4, 0); ! 870: return \"LA %0,%c1\"; ! 871: } ! 872: mvs_check_page (0, 4, 0); ! 873: return \"L %0,=F'%c1'\"; ! 874: } ! 875: mvs_check_page (0, 4, 0); ! 876: return \"IC %0,%1\"; ! 877: } ! 878: else if (REG_P (operands[1])) ! 879: { ! 880: mvs_check_page (0, 4, 0); ! 881: return \"STC %1,%0\"; ! 882: } ! 883: else if (GET_CODE (operands[1]) == CONST_INT) ! 884: { ! 885: mvs_check_page (0, 4, 0); ! 886: return \"MVI %0,%B1\"; ! 887: } ! 888: mvs_check_page (0, 6, 0); ! 889: return \"MVC %O0(1,%R0),%1\"; ! 890: }") ! 891: ! 892: (define_insn "movqi" ! 893: [(set (match_operand:QI 0 "general_operand" "=d,m") ! 894: (match_operand:QI 1 "general_operand" "g,d"))] ! 895: "" ! 896: "* ! 897: { ! 898: check_label_emit (); ! 899: if (REG_P (operands[0])) ! 900: { ! 901: if (REG_P (operands[1])) ! 902: { ! 903: mvs_check_page (0, 2, 0); ! 904: return \"LR %0,%1\"; ! 905: } ! 906: if (operands[1] == const0_rtx) ! 907: { ! 908: CC_STATUS_INIT; ! 909: mvs_check_page (0, 2, 0); ! 910: return \"SLR %0,%0\"; ! 911: } ! 912: if (GET_CODE (operands[1]) == CONST_INT) ! 913: { ! 914: if (INTVAL (operands[1]) >= 0) ! 915: { ! 916: mvs_check_page (0, 4, 0); ! 917: return \"LA %0,%c1\"; ! 918: } ! 919: mvs_check_page (0, 4, 0); ! 920: return \"L %0,=F'%c1'\"; ! 921: } ! 922: mvs_check_page (0, 4, 0); ! 923: return \"IC %0,%1\"; ! 924: } ! 925: mvs_check_page (0, 4, 0); ! 926: return \"STC %1,%0\"; ! 927: }") ! 928: ! 929: ; ! 930: ; movestrictqi instruction pattern(s). ! 931: ; ! 932: ! 933: (define_insn "movestrictqi" ! 934: [(set (strict_low_part (match_operand:QI 0 "general_operand" "=d")) ! 935: (match_operand:QI 1 "general_operand" "g"))] ! 936: "" ! 937: "* ! 938: { ! 939: check_label_emit (); ! 940: if (REG_P (operands[1])) ! 941: { ! 942: mvs_check_page (0, 8, 0); ! 943: return \"STC %1,140(,13)\;IC %0,140(,13)\"; ! 944: } ! 945: mvs_check_page (0, 4, 0); ! 946: return \"IC %0,%1\"; ! 947: }") ! 948: ! 949: ; ! 950: ; movstricthi instruction pattern(s). ! 951: ; ! 952: ! 953: (define_insn "" ! 954: [(set (strict_low_part (match_operand:HI 0 "register_operand" "=d")) ! 955: (match_operand:HI 1 "r_or_s_operand" "g"))] ! 956: "" ! 957: "* ! 958: { ! 959: check_label_emit (); ! 960: if (REG_P (operands[1])) ! 961: { ! 962: mvs_check_page (0, 8, 0); ! 963: return \"STH %1,140(,13)\;ICM %0,3,140(13)\"; ! 964: } ! 965: else if (GET_CODE (operands[1]) == CONST_INT) ! 966: { ! 967: mvs_check_page (0, 4, 2); ! 968: return \"ICM %0,3,=H'%h1'\"; ! 969: } ! 970: mvs_check_page (0, 4, 0); ! 971: return \"ICM %0,3,%1\"; ! 972: }") ! 973: ! 974: (define_insn "movestricthi" ! 975: [(set (strict_low_part (match_operand:HI 0 "general_operand" "=dm")) ! 976: (match_operand:HI 1 "general_operand" "d"))] ! 977: "" ! 978: "* ! 979: { ! 980: check_label_emit (); ! 981: if (REG_P (operands[0])) ! 982: { ! 983: mvs_check_page (0, 8, 0); ! 984: return \"STH %1,140(,13)\;ICM %0,3,140(13)\"; ! 985: } ! 986: mvs_check_page (0, 4, 0); ! 987: return \"STH %1,%0\"; ! 988: }") ! 989: ! 990: ; ! 991: ; movdf instruction pattern(s). ! 992: ; ! 993: ! 994: (define_insn "" ! 995: [(set (match_operand:DF 0 "r_or_s_operand" "=fm,fm,*dm") ! 996: (match_operand:DF 1 "r_or_s_operand" "fmF,*dm,fmF"))] ! 997: "TARGET_CHAR_INSTRUCTIONS" ! 998: "* ! 999: { ! 1000: check_label_emit (); ! 1001: if (FP_REG_P (operands[0])) ! 1002: { ! 1003: if (FP_REG_P (operands[1])) ! 1004: { ! 1005: mvs_check_page (0, 2, 0); ! 1006: return \"LDR %0,%1\"; ! 1007: } ! 1008: if (REG_P (operands[1])) ! 1009: { ! 1010: mvs_check_page (0, 8, 0); ! 1011: return \"STM %1,%N1,140(13)\;LD %0,140(,13)\"; ! 1012: } ! 1013: if (operands[1] == const0_rtx) ! 1014: { ! 1015: CC_STATUS_SET (operands[0], operands[1]); ! 1016: mvs_check_page (0, 2, 0); ! 1017: return \"SDR %0,%0\"; ! 1018: } ! 1019: mvs_check_page (0, 4, 0); ! 1020: return \"LD %0,%1\"; ! 1021: } ! 1022: if (REG_P (operands[0])) ! 1023: { ! 1024: if (FP_REG_P (operands[1])) ! 1025: { ! 1026: mvs_check_page (0, 12, 0); ! 1027: return \"STD %1,140(,13)\;LM %0,%N0,140(13)\"; ! 1028: } ! 1029: mvs_check_page (0, 4, 0); ! 1030: return \"LM %0,%N0,%1\"; ! 1031: } ! 1032: else if (FP_REG_P (operands[1])) ! 1033: { ! 1034: mvs_check_page (0, 4, 0); ! 1035: return \"STD %1,%0\"; ! 1036: } ! 1037: else if (REG_P (operands[1])) ! 1038: { ! 1039: mvs_check_page (0, 4, 0); ! 1040: return \"STM %1,%N1,%0\"; ! 1041: } ! 1042: mvs_check_page (0, 6, 0); ! 1043: return \"MVC %O0(8,%R0),%1\"; ! 1044: }") ! 1045: ! 1046: (define_insn "movdf" ! 1047: [(set (match_operand:DF 0 "general_operand" "=f,fm,m,*d") ! 1048: (match_operand:DF 1 "general_operand" "fmF,*d,f,fmF"))] ! 1049: "" ! 1050: "* ! 1051: { ! 1052: check_label_emit (); ! 1053: if (FP_REG_P (operands[0])) ! 1054: { ! 1055: if (FP_REG_P (operands[1])) ! 1056: { ! 1057: mvs_check_page (0, 2, 0); ! 1058: return \"LDR %0,%1\"; ! 1059: } ! 1060: if (REG_P (operands[1])) ! 1061: { ! 1062: mvs_check_page (0, 8, 0); ! 1063: return \"STM %1,%N1,140(13)\;LD %0,140(,13)\"; ! 1064: } ! 1065: if (operands[1] == const0_rtx) ! 1066: { ! 1067: CC_STATUS_SET (operands[0], operands[1]); ! 1068: mvs_check_page (0, 2, 0); ! 1069: return \"SDR %0,%0\"; ! 1070: } ! 1071: mvs_check_page (0, 4, 0); ! 1072: return \"LD %0,%1\"; ! 1073: } ! 1074: else if (REG_P (operands[0])) ! 1075: { ! 1076: if (FP_REG_P (operands[1])) ! 1077: { ! 1078: mvs_check_page (0, 12, 0); ! 1079: return \"STD %1,140(,13)\;LM %0,%N0,140(13)\"; ! 1080: } ! 1081: mvs_check_page (0, 4, 0); ! 1082: return \"LM %0,%N0,%1\"; ! 1083: } ! 1084: else if (FP_REG_P (operands[1])) ! 1085: { ! 1086: mvs_check_page (0, 4, 0); ! 1087: return \"STD %1,%0\"; ! 1088: } ! 1089: mvs_check_page (0, 4, 0); ! 1090: return \"STM %1,%N1,%0\"; ! 1091: }") ! 1092: ! 1093: ; ! 1094: ; movsf instruction pattern(s). ! 1095: ; ! 1096: ! 1097: (define_insn "" ! 1098: [(set (match_operand:SF 0 "r_or_s_operand" "=fm,fm,*dm") ! 1099: (match_operand:SF 1 "r_or_s_operand" "fmF,*dm,fmF"))] ! 1100: "TARGET_CHAR_INSTRUCTIONS" ! 1101: "* ! 1102: { ! 1103: check_label_emit (); ! 1104: if (FP_REG_P (operands[0])) ! 1105: { ! 1106: if (FP_REG_P (operands[1])) ! 1107: { ! 1108: mvs_check_page (0, 2, 0); ! 1109: return \"LER %0,%1\"; ! 1110: } ! 1111: if (REG_P (operands[1])) ! 1112: { ! 1113: mvs_check_page (0, 8, 0); ! 1114: return \"ST %1,140(,13)\;LE %0,140(,13)\"; ! 1115: } ! 1116: if (operands[1] == const0_rtx) ! 1117: { ! 1118: CC_STATUS_SET (operands[0], operands[1]); ! 1119: mvs_check_page (0, 2, 0); ! 1120: return \"SER %0,%0\"; ! 1121: } ! 1122: mvs_check_page (0, 4, 0); ! 1123: return \"LE %0,%1\"; ! 1124: } ! 1125: else if (REG_P (operands[0])) ! 1126: { ! 1127: if (FP_REG_P (operands[1])) ! 1128: { ! 1129: mvs_check_page (0, 8, 0); ! 1130: return \"STE %1,140(,13)\;L %0,140(,13)\"; ! 1131: } ! 1132: mvs_check_page (0, 4, 0); ! 1133: return \"L %0,%1\"; ! 1134: } ! 1135: else if (FP_REG_P (operands[1])) ! 1136: { ! 1137: mvs_check_page (0, 4, 0); ! 1138: return \"STE %1,%0\"; ! 1139: } ! 1140: else if (REG_P (operands[1])) ! 1141: { ! 1142: mvs_check_page (0, 4, 0); ! 1143: return \"ST %1,%0\"; ! 1144: } ! 1145: mvs_check_page (0, 6, 0); ! 1146: return \"MVC %O0(4,%R0),%1\"; ! 1147: }") ! 1148: ! 1149: (define_insn "movsf" ! 1150: [(set (match_operand:SF 0 "general_operand" "=f,fm,m,*d") ! 1151: (match_operand:SF 1 "general_operand" "fmF,*d,f,fmF"))] ! 1152: "" ! 1153: "* ! 1154: { ! 1155: check_label_emit (); ! 1156: if (FP_REG_P (operands[0])) ! 1157: { ! 1158: if (FP_REG_P (operands[1])) ! 1159: { ! 1160: mvs_check_page (0, 2, 0); ! 1161: return \"LER %0,%1\"; ! 1162: } ! 1163: if (REG_P (operands[1])) ! 1164: { ! 1165: mvs_check_page (0, 8, 0); ! 1166: return \"ST %1,140(,13)\;LE %0,140(,13)\"; ! 1167: } ! 1168: if (operands[1] == const0_rtx) ! 1169: { ! 1170: CC_STATUS_SET (operands[0], operands[1]); ! 1171: mvs_check_page (0, 2, 0); ! 1172: return \"SER %0,%0\"; ! 1173: } ! 1174: mvs_check_page (0, 4, 0); ! 1175: return \"LE %0,%1\"; ! 1176: } ! 1177: else if (REG_P (operands[0])) ! 1178: { ! 1179: if (FP_REG_P (operands[1])) ! 1180: { ! 1181: mvs_check_page (0, 8, 0); ! 1182: return \"STE %1,140(,13)\;L %0,140(,13)\"; ! 1183: } ! 1184: mvs_check_page (0, 4, 0); ! 1185: return \"L %0,%1\"; ! 1186: } ! 1187: else if (FP_REG_P (operands[1])) ! 1188: { ! 1189: mvs_check_page (0, 4, 0); ! 1190: return \"STE %1,%0\"; ! 1191: } ! 1192: mvs_check_page (0, 4, 0); ! 1193: return \"ST %1,%0\"; ! 1194: }") ! 1195: ! 1196: ; ! 1197: ; movstrsi instruction pattern(s). ! 1198: ; ! 1199: ! 1200: (define_expand "movstrsi" ! 1201: [(set (match_operand:BLK 0 "general_operand" "") ! 1202: (match_operand:BLK 1 "general_operand" "")) ! 1203: (use (match_operand:SI 2 "general_operand" "")) ! 1204: (match_operand 3 "" "")] ! 1205: "" ! 1206: " ! 1207: { ! 1208: rtx op0, op1; ! 1209: ! 1210: op0 = XEXP (operands[0], 0); ! 1211: if (GET_CODE (op0) == REG ! 1212: || (GET_CODE (op0) == PLUS && GET_CODE (XEXP (op0, 0)) == REG ! 1213: && GET_CODE (XEXP (op0, 1)) == CONST_INT ! 1214: && (unsigned) INTVAL (XEXP (op0, 1)) < 4096)) ! 1215: { ! 1216: op0 = operands[0]; ! 1217: } ! 1218: else ! 1219: { ! 1220: op0 = gen_rtx (MEM, BLKmode, copy_to_mode_reg (SImode, op0)); ! 1221: } ! 1222: ! 1223: op1 = XEXP (operands[1], 0); ! 1224: if (GET_CODE (op1) == REG ! 1225: || (GET_CODE (op1) == PLUS && GET_CODE (XEXP (op1, 0)) == REG ! 1226: && GET_CODE (XEXP (op1, 1)) == CONST_INT ! 1227: && (unsigned) INTVAL (XEXP (op1, 1)) < 4096)) ! 1228: { ! 1229: op1 = operands[1]; ! 1230: } ! 1231: else ! 1232: { ! 1233: op1 = gen_rtx (MEM, BLKmode, copy_to_mode_reg (SImode, op1)); ! 1234: } ! 1235: ! 1236: if (GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) < 256) ! 1237: { ! 1238: emit_insn (gen_rtx (PARALLEL, VOIDmode, gen_rtvec (2, ! 1239: gen_rtx (SET, VOIDmode, op0, op1), ! 1240: gen_rtx (USE, VOIDmode, operands[2])))); ! 1241: } ! 1242: else ! 1243: { ! 1244: rtx reg1 = gen_reg_rtx (DImode); ! 1245: rtx reg2 = gen_reg_rtx (DImode); ! 1246: rtx subreg = gen_rtx (SUBREG, SImode, reg1, 1); ! 1247: ! 1248: emit_insn (gen_rtx (SET, VOIDmode, subreg, operands[2])); ! 1249: emit_insn (gen_rtx (SET, VOIDmode, gen_rtx (SUBREG, SImode, reg2, 1), ! 1250: subreg)); ! 1251: emit_insn (gen_rtx (PARALLEL, VOIDmode, gen_rtvec (5, ! 1252: gen_rtx (SET, VOIDmode, op0, op1), ! 1253: gen_rtx (USE, VOIDmode, reg1), ! 1254: gen_rtx (USE, VOIDmode, reg2), ! 1255: gen_rtx (CLOBBER, VOIDmode, reg1), ! 1256: gen_rtx (CLOBBER, VOIDmode, reg2)))); ! 1257: } ! 1258: DONE; ! 1259: }") ! 1260: ! 1261: ; Move a block that is less than 256 bytes in length. ! 1262: ! 1263: (define_insn "" ! 1264: [(set (match_operand:BLK 0 "s_operand" "=m") ! 1265: (match_operand:BLK 1 "s_operand" "m")) ! 1266: (use (match_operand 2 "immediate_operand" "I"))] ! 1267: "((unsigned) INTVAL (operands[2]) < 256)" ! 1268: "* ! 1269: { ! 1270: check_label_emit (); ! 1271: mvs_check_page (0, 6, 0); ! 1272: return \"MVC %O0(%c2,%R0),%1\"; ! 1273: }") ! 1274: ! 1275: ; Move a block that is larger than 255 bytes in length. ! 1276: ! 1277: (define_insn "" ! 1278: [(set (match_operand:BLK 0 "general_operand" "=m") ! 1279: (match_operand:BLK 1 "general_operand" "m")) ! 1280: (use (match_operand:DI 2 "register_operand" "d")) ! 1281: (use (match_operand:DI 3 "register_operand" "d")) ! 1282: (clobber (match_dup 2)) ! 1283: (clobber (match_dup 3))] ! 1284: "" ! 1285: "* ! 1286: { ! 1287: check_label_emit (); ! 1288: mvs_check_page (0, 10, 0); ! 1289: return \"LA %2,%0\;LA %3,%1\;MVCL %2,%3\"; ! 1290: }") ! 1291: ! 1292: ;; ! 1293: ;;- Conversion instructions. ! 1294: ;; ! 1295: ! 1296: ; ! 1297: ; extendsidi2 instruction pattern(s). ! 1298: ; ! 1299: ! 1300: (define_expand "extendsidi2" ! 1301: [(set (match_operand:DI 0 "general_operand" "") ! 1302: (sign_extend:DI (match_operand:SI 1 "general_operand" "")))] ! 1303: "" ! 1304: " ! 1305: { ! 1306: if (GET_CODE (operands[1]) != CONST_INT) ! 1307: { ! 1308: emit_insn (gen_rtx (SET, VOIDmode, ! 1309: operand_subword (operands[0], 0, 1, DImode), operands[1])); ! 1310: emit_insn (gen_rtx (SET, VOIDmode, operands[0], ! 1311: gen_rtx (ASHIFTRT, DImode, operands[0], ! 1312: gen_rtx (CONST_INT, SImode, 32)))); ! 1313: } ! 1314: else ! 1315: { ! 1316: if (INTVAL (operands[1]) < 0) ! 1317: { ! 1318: emit_insn (gen_rtx (SET, VOIDmode, ! 1319: operand_subword (operands[0], 0, 1, DImode), ! 1320: gen_rtx (CONST_INT, SImode, -1))); ! 1321: } ! 1322: else ! 1323: { ! 1324: emit_insn (gen_rtx (SET, VOIDmode, ! 1325: operand_subword (operands[0], 0, 1, DImode), ! 1326: gen_rtx (CONST_INT, SImode, 0))); ! 1327: } ! 1328: emit_insn (gen_rtx (SET, VOIDmode, gen_lowpart (SImode, operands[0]), ! 1329: operands[1])); ! 1330: } ! 1331: DONE; ! 1332: }") ! 1333: ! 1334: ; ! 1335: ; extendhisi2 instruction pattern(s). ! 1336: ; ! 1337: ! 1338: (define_insn "extendhisi2" ! 1339: [(set (match_operand:SI 0 "general_operand" "=d,m") ! 1340: (sign_extend:SI (match_operand:HI 1 "general_operand" "g,d")))] ! 1341: "" ! 1342: "* ! 1343: { ! 1344: check_label_emit (); ! 1345: if (REG_P (operands[0])) ! 1346: { ! 1347: if (REG_P (operands[1])) ! 1348: if (REGNO (operands[0]) != REGNO (operands[1])) ! 1349: { ! 1350: mvs_check_page (0, 2, 0); ! 1351: return \"LR %0,%1\;SLL %0,16\;SRA %0,16\"; ! 1352: } ! 1353: else ! 1354: return \"\"; /* Should be empty. 16-bits regs are always 32-bits. */ ! 1355: if (operands[1] == const0_rtx) ! 1356: { ! 1357: CC_STATUS_INIT; ! 1358: mvs_check_page (0, 2, 0); ! 1359: return \"SLR %0,%0\"; ! 1360: } ! 1361: if (GET_CODE (operands[1]) == CONST_INT ! 1362: && (unsigned) INTVAL (operands[1]) < 4096) ! 1363: { ! 1364: mvs_check_page (0, 4, 0); ! 1365: return \"LA %0,%c1\"; ! 1366: } ! 1367: if (GET_CODE (operands[1]) == CONST_INT) ! 1368: { ! 1369: mvs_check_page (0, 4, 2); ! 1370: return \"LH %0,=H'%h1'\"; ! 1371: } ! 1372: mvs_check_page (0, 4, 0); ! 1373: return \"LH %0,%1\"; ! 1374: } ! 1375: mvs_check_page (0, 4, 0); ! 1376: return \"SLL %0,16\;SRA %0,16\;ST %1,%0\"; ! 1377: }") ! 1378: ! 1379: ; ! 1380: ; extendqisi2 instruction pattern(s). ! 1381: ; ! 1382: ! 1383: (define_insn "extendqisi2" ! 1384: [(set (match_operand:SI 0 "general_operand" "=d") ! 1385: (sign_extend:SI (match_operand:QI 1 "general_operand" "0mi")))] ! 1386: "" ! 1387: "* ! 1388: { ! 1389: check_label_emit (); ! 1390: CC_STATUS_SET (operands[0], operands[1]); ! 1391: if (REG_P (operands[1])) ! 1392: { ! 1393: mvs_check_page (0, 8, 0); ! 1394: return \"SLL %0,24\;SRA %0,24\"; ! 1395: } ! 1396: if (s_operand (operands[1])) ! 1397: { ! 1398: mvs_check_page (0, 8, 0); ! 1399: return \"ICM %0,8,%1\;SRA %0,24\"; ! 1400: } ! 1401: mvs_check_page (0, 12, 0); ! 1402: return \"IC %0,%1\;SLL %0,24\;SRA %0,24\"; ! 1403: }") ! 1404: ! 1405: ; ! 1406: ; extendqihi2 instruction pattern(s). ! 1407: ; ! 1408: ! 1409: (define_insn "extendqihi2" ! 1410: [(set (match_operand:HI 0 "general_operand" "=d") ! 1411: (sign_extend:HI (match_operand:QI 1 "general_operand" "0m")))] ! 1412: "" ! 1413: "* ! 1414: { ! 1415: check_label_emit (); ! 1416: CC_STATUS_SET (operands[0], operands[1]); ! 1417: if (REG_P (operands[1])) ! 1418: { ! 1419: mvs_check_page (0, 8, 0); ! 1420: return \"SLL %0,24\;SRA %0,24\"; ! 1421: } ! 1422: if (s_operand (operands[1])) ! 1423: { ! 1424: mvs_check_page (0, 8, 0); ! 1425: return \"ICM %0,8,%1\;SRA %0,24\"; ! 1426: } ! 1427: mvs_check_page (0, 12, 0); ! 1428: return \"IC %0,%1\;SLL %0,24\;SRA %0,24\"; ! 1429: }") ! 1430: ! 1431: ; ! 1432: ; zero_extendsidi2 instruction pattern(s). ! 1433: ; ! 1434: ! 1435: (define_expand "zero_extendsidi2" ! 1436: [(set (match_operand:DI 0 "general_operand" "") ! 1437: (zero_extend:DI (match_operand:SI 1 "general_operand" "")))] ! 1438: "" ! 1439: " ! 1440: { ! 1441: emit_insn (gen_rtx (SET, VOIDmode, ! 1442: operand_subword (operands[0], 0, 1, DImode), operands[1])); ! 1443: emit_insn (gen_rtx (SET, VOIDmode, operands[0], ! 1444: gen_rtx (LSHIFTRT, DImode, operands[0], ! 1445: gen_rtx (CONST_INT, SImode, 32)))); ! 1446: DONE; ! 1447: }") ! 1448: ! 1449: ; ! 1450: ; zero_extendhisi2 instruction pattern(s). ! 1451: ; ! 1452: ! 1453: (define_insn "zero_extendhisi2" ! 1454: [(set (match_operand:SI 0 "general_operand" "=d") ! 1455: (zero_extend:SI (match_operand:HI 1 "general_operand" "0")))] ! 1456: "" ! 1457: "* ! 1458: { ! 1459: check_label_emit (); ! 1460: CC_STATUS_SET (operands[0], operands[1]); ! 1461: mvs_check_page (0, 4, 4); ! 1462: return \"N %1,=X'0000FFFF'\"; ! 1463: }") ! 1464: ! 1465: ; ! 1466: ; zero_extendqisi2 instruction pattern(s). ! 1467: ; ! 1468: ! 1469: (define_insn "zero_extendqisi2" ! 1470: [(set (match_operand:SI 0 "general_operand" "=d,&d") ! 1471: (zero_extend:SI (match_operand:QI 1 "general_operand" "0i,m")))] ! 1472: "" ! 1473: "* ! 1474: { ! 1475: check_label_emit (); ! 1476: if (REG_P (operands[1])) ! 1477: { ! 1478: CC_STATUS_SET (operands[0], operands[1]); ! 1479: mvs_check_page (0, 4, 4); ! 1480: return \"N %0,=X'000000FF'\"; ! 1481: } ! 1482: if (GET_CODE (operands[1]) == CONST_INT) ! 1483: { ! 1484: mvs_check_page (0, 4, 0); ! 1485: return \"LA %0,%c1\"; ! 1486: } ! 1487: CC_STATUS_INIT; ! 1488: mvs_check_page (0, 8, 0); ! 1489: return \"SLR %0,%0\;IC %0,%1\"; ! 1490: }") ! 1491: ! 1492: ; ! 1493: ; zero_extendqihi2 instruction pattern(s). ! 1494: ; ! 1495: ! 1496: (define_insn "zero_extendqihi2" ! 1497: [(set (match_operand:HI 0 "general_operand" "=d,&d") ! 1498: (zero_extend:HI (match_operand:QI 1 "general_operand" "0i,m")))] ! 1499: "" ! 1500: "* ! 1501: { ! 1502: check_label_emit (); ! 1503: if (REG_P (operands[1])) ! 1504: { ! 1505: CC_STATUS_SET (operands[0], operands[1]); ! 1506: mvs_check_page (0, 4, 4); ! 1507: return \"N %0,=X'000000FF'\"; ! 1508: } ! 1509: if (GET_CODE (operands[1]) == CONST_INT) ! 1510: { ! 1511: mvs_check_page (0, 4, 0); ! 1512: return \"LA %0,%c1\"; ! 1513: } ! 1514: CC_STATUS_INIT; ! 1515: mvs_check_page (0, 8, 0); ! 1516: return \"SLR %0,%0\;IC %0,%1\"; ! 1517: }") ! 1518: ! 1519: ; ! 1520: ; truncsihi2 instruction pattern(s). ! 1521: ; ! 1522: ! 1523: (define_insn "truncsihi2" ! 1524: [(set (match_operand:HI 0 "general_operand" "=d,m") ! 1525: (truncate:HI (match_operand:SI 1 "general_operand" "0,d")))] ! 1526: "" ! 1527: "* ! 1528: { ! 1529: check_label_emit (); ! 1530: if (REG_P (operands[0])) ! 1531: { ! 1532: CC_STATUS_SET (operands[0], operands[1]); ! 1533: mvs_check_page (0, 8, 0); ! 1534: return \"SLL %0,16\;SRA %0,16\"; ! 1535: } ! 1536: mvs_check_page (0, 4, 0); ! 1537: return \"STH %1,%0\"; ! 1538: }") ! 1539: ! 1540: ; ! 1541: ; fix_truncdfsi2 instruction pattern(s). ! 1542: ; ! 1543: ! 1544: (define_insn "fix_truncdfsi2" ! 1545: [(set (match_operand:SI 0 "general_operand" "=d") ! 1546: (fix:SI (truncate:DF (match_operand:DF 1 "general_operand" "f")))) ! 1547: (clobber (reg:DF 16))] ! 1548: "" ! 1549: "* ! 1550: { ! 1551: check_label_emit (); ! 1552: CC_STATUS_INIT; ! 1553: if (REGNO (operands[1]) == 16) ! 1554: { ! 1555: mvs_check_page (0, 12, 8); ! 1556: return \"AD 0,=XL8'4F08000000000000'\;STD 0,140(,13)\;L %0,144(,13)\"; ! 1557: } ! 1558: mvs_check_page (0, 14, 8); ! 1559: return \"LDR 0,%1\;AD 0,=XL8'4F08000000000000'\;STD 0,140(,13)\;L %0,144(,13)\"; ! 1560: }") ! 1561: ! 1562: ; ! 1563: ; floatsidf2 instruction pattern(s). ! 1564: ; ! 1565: ; Uses the float field of the TCA. ! 1566: ; ! 1567: ! 1568: (define_insn "floatsidf2" ! 1569: [(set (match_operand:DF 0 "general_operand" "=f") ! 1570: (float:DF (match_operand:SI 1 "general_operand" "d")))] ! 1571: "" ! 1572: "* ! 1573: { ! 1574: check_label_emit (); ! 1575: CC_STATUS_INIT; ! 1576: mvs_check_page (0, 16, 8); ! 1577: return \"ST %1,508(,12)\;XI 508(12),128\;LD %0,504(,12)\;SD %0,=XL8'4E00000080000000'\"; ! 1578: }") ! 1579: ! 1580: ; ! 1581: ; truncdfsf2 instruction pattern(s). ! 1582: ; ! 1583: ! 1584: (define_insn "truncdfsf2" ! 1585: [(set (match_operand:SF 0 "general_operand" "=f") ! 1586: (float_truncate:SF (match_operand:DF 1 "general_operand" "f")))] ! 1587: "" ! 1588: "* ! 1589: { ! 1590: check_label_emit (); ! 1591: mvs_check_page (0, 2, 0); ! 1592: return \"LRER %0,%1\"; ! 1593: }") ! 1594: ! 1595: ; ! 1596: ; extendsfdf2 instruction pattern(s). ! 1597: ; ! 1598: ! 1599: (define_insn "extendsfdf2" ! 1600: [(set (match_operand:DF 0 "general_operand" "=f") ! 1601: (float_extend:DF (match_operand:SF 1 "general_operand" "fmF")))] ! 1602: "" ! 1603: "* ! 1604: { ! 1605: check_label_emit (); ! 1606: CC_STATUS_SET (0, const0_rtx); ! 1607: if (FP_REG_P (operands[1])) ! 1608: { ! 1609: if (REGNO (operands[0]) == REGNO (operands[1])) ! 1610: { ! 1611: mvs_check_page (0, 10, 0); ! 1612: return \"STE %1,140(,13)\;SDR %0,%0\;LE %0,140(,13)\"; ! 1613: } ! 1614: mvs_check_page (0, 4, 0); ! 1615: return \"SDR %0,%0\;LER %0,%1\"; ! 1616: } ! 1617: mvs_check_page (0, 6, 0); ! 1618: return \"SDR %0,%0\;LE %0,%1\"; ! 1619: }") ! 1620: ! 1621: ;; ! 1622: ;;- Add instructions. ! 1623: ;; ! 1624: ! 1625: ; ! 1626: ; adddi3 instruction pattern(s). ! 1627: ; ! 1628: ! 1629: (define_expand "adddi3" ! 1630: [(set (match_operand:DI 0 "general_operand" "") ! 1631: (plus:DI (match_operand:DI 1 "general_operand" "") ! 1632: (match_operand:DI 2 "general_operand" "")))] ! 1633: "" ! 1634: " ! 1635: { ! 1636: rtx label = gen_label_rtx (); ! 1637: rtx op0_high = operand_subword (operands[0], 0, 1, DImode); ! 1638: rtx op0_low = gen_lowpart (SImode, operands[0]); ! 1639: ! 1640: emit_insn (gen_rtx (SET, VOIDmode, op0_high, ! 1641: gen_rtx (PLUS, SImode, ! 1642: operand_subword (operands[1], 0, 1, DImode), ! 1643: operand_subword (operands[2], 0, 1, DImode)))); ! 1644: emit_jump_insn (gen_rtx (PARALLEL, VOIDmode, gen_rtvec (2, ! 1645: gen_rtx (SET, VOIDmode, op0_low, ! 1646: gen_rtx (PLUS, SImode, gen_lowpart (SImode, operands[1]), ! 1647: gen_lowpart (SImode, operands[2]))), ! 1648: gen_rtx (USE, VOIDmode, gen_rtx (LABEL_REF, VOIDmode, label))))); ! 1649: emit_insn (gen_rtx (SET, VOIDmode, op0_high, ! 1650: gen_rtx (PLUS, SImode, op0_high, ! 1651: gen_rtx (CONST_INT, SImode, 1)))); ! 1652: emit_label (label); ! 1653: DONE; ! 1654: }") ! 1655: ! 1656: (define_insn "" ! 1657: [(set (match_operand:SI 0 "general_operand" "=d") ! 1658: (plus:SI (match_operand:SI 1 "general_operand" "%0") ! 1659: (match_operand:SI 2 "general_operand" "g"))) ! 1660: (use (label_ref (match_operand 3 "" "")))] ! 1661: "" ! 1662: "* ! 1663: { ! 1664: int onpage; ! 1665: ! 1666: check_label_emit (); ! 1667: onpage = mvs_check_label (CODE_LABEL_NUMBER (operands[3])); ! 1668: if (REG_P (operands[2])) ! 1669: { ! 1670: if (!onpage) ! 1671: { ! 1672: mvs_check_page (0, 8, 4); ! 1673: return \"ALR %0,%2\;L 14,=A(%l3)\;BCR 12,14\"; ! 1674: } ! 1675: if (mvs_check_page (0, 6, 0)) ! 1676: { ! 1677: mvs_check_page (0, 2, 4); ! 1678: return \"ALR %0,%2\;L 14,=A(%l3)\;BCR 12,14\"; ! 1679: } ! 1680: return \"ALR %0,%2\;BC 12,%l3\"; ! 1681: } ! 1682: if (!onpage) ! 1683: { ! 1684: mvs_check_page (0, 10, 4); ! 1685: return \"AL %0,%2\;L 14,=A(%l3)\;BCR 12,14\"; ! 1686: } ! 1687: if (mvs_check_page (0, 8 ,0)) ! 1688: { ! 1689: mvs_check_page (0, 2, 4); ! 1690: return \"AL %0,%2\;L 14,=A(%l3)\;BCR 12,14\"; ! 1691: } ! 1692: return \"AL %0,%2\;BC 12,%l3\"; ! 1693: }") ! 1694: ! 1695: ; ! 1696: ; addsi3 instruction pattern(s). ! 1697: ; ! 1698: ; The following insn is used when it is known that operand one is an address, ! 1699: ; frame, stack or argument pointer, and operand two is a constant that is ! 1700: ; small enough to fit in the displacement field. ! 1701: ; Notice that we can't allow the frame pointer to used as a normal register ! 1702: ; because of this insn. ! 1703: ; ! 1704: ! 1705: (define_insn "" ! 1706: [(set (match_operand:SI 0 "register_operand" "=d") ! 1707: (plus:SI (match_operand:SI 1 "general_operand" "%a") ! 1708: (match_operand:SI 2 "immediate_operand" "J")))] ! 1709: "((REGNO (operands[1]) == FRAME_POINTER_REGNUM || REGNO (operands[1]) == ARG_POINTER_REGNUM || REGNO (operands[1]) == STACK_POINTER_REGNUM) && (unsigned) INTVAL (operands[2]) < 4096)" ! 1710: "* ! 1711: { ! 1712: check_label_emit (); ! 1713: CC_STATUS_INIT; ! 1714: mvs_check_page (0, 4, 0); ! 1715: return \"LA %0,%c2(,%1)\"; ! 1716: }") ! 1717: ! 1718: ; This insn handles additions that are relative to the frame pointer. ! 1719: ! 1720: (define_insn "" ! 1721: [(set (match_operand:SI 0 "register_operand" "=d") ! 1722: (plus:SI (match_operand:SI 1 "register_operand" "%a") ! 1723: (match_operand:SI 2 "immediate_operand" "i")))] ! 1724: "REGNO (operands[1]) == FRAME_POINTER_REGNUM" ! 1725: "* ! 1726: { ! 1727: check_label_emit (); ! 1728: if ((unsigned) INTVAL (operands[2]) < 4096) ! 1729: { ! 1730: mvs_check_page (0, 4, 0); ! 1731: return \"LA %0,%c2(,%1)\"; ! 1732: } ! 1733: if (REGNO (operands[1]) == REGNO (operands[0])) ! 1734: { ! 1735: mvs_check_page (0, 4, 0); ! 1736: return \"A %0,%2\"; ! 1737: } ! 1738: mvs_check_page (0, 6, 0); ! 1739: return \"L %0,%2\;AR %0,%1\"; ! 1740: }") ! 1741: ! 1742: (define_insn "addsi3" ! 1743: [(set (match_operand:SI 0 "general_operand" "=d") ! 1744: (plus:SI (match_operand:SI 1 "general_operand" "%0") ! 1745: (match_operand:SI 2 "general_operand" "g")))] ! 1746: "" ! 1747: "* ! 1748: { ! 1749: check_label_emit (); ! 1750: if (REG_P (operands[2])) ! 1751: { ! 1752: mvs_check_page (0, 2, 0); ! 1753: return \"AR %0,%2\"; ! 1754: } ! 1755: if (GET_CODE (operands[2]) == CONST_INT) ! 1756: { ! 1757: if (INTVAL (operands[2]) == -1) ! 1758: { ! 1759: CC_STATUS_INIT; ! 1760: mvs_check_page (0, 2, 0); ! 1761: return \"BCTR %0,0\"; ! 1762: } ! 1763: } ! 1764: mvs_check_page (0, 4, 0); ! 1765: return \"A %0,%2\"; ! 1766: }") ! 1767: ! 1768: ; ! 1769: ; addhi3 instruction pattern(s). ! 1770: ; ! 1771: ! 1772: (define_insn "addhi3" ! 1773: [(set (match_operand:HI 0 "general_operand" "=d") ! 1774: (plus:HI (match_operand:HI 1 "general_operand" "%0") ! 1775: (match_operand:HI 2 "general_operand" "dmi")))] ! 1776: "" ! 1777: "* ! 1778: { ! 1779: check_label_emit (); ! 1780: if (REG_P (operands[2])) ! 1781: { ! 1782: mvs_check_page (0, 2, 0); ! 1783: return \"STH %2,140(,13)\;AH %0,140(,13)\"; ! 1784: } ! 1785: if (GET_CODE (operands[2]) == CONST_INT) ! 1786: { ! 1787: if (INTVAL (operands[2]) == -1) ! 1788: { ! 1789: CC_STATUS_INIT; ! 1790: mvs_check_page (0, 2, 0); ! 1791: return \"BCTR %0,0\"; ! 1792: } ! 1793: mvs_check_page (0, 4, 2); ! 1794: return \"AH %0,=H'%h2'\"; ! 1795: } ! 1796: mvs_check_page (0, 4, 0); ! 1797: return \"AH %0,%2\"; ! 1798: }") ! 1799: ! 1800: ; ! 1801: ; addqi3 instruction pattern(s). ! 1802: ; ! 1803: ! 1804: (define_insn "addqi3" ! 1805: [(set (match_operand:QI 0 "general_operand" "=d") ! 1806: (plus:QI (match_operand:QI 1 "general_operand" "%a") ! 1807: (match_operand:QI 2 "general_operand" "ai")))] ! 1808: "" ! 1809: "* ! 1810: { ! 1811: check_label_emit (); ! 1812: CC_STATUS_INIT; ! 1813: mvs_check_page (0, 4, 0); ! 1814: if (REG_P (operands[2])) ! 1815: return \"LA %0,0(%1,%2)\"; ! 1816: return \"LA %0,%B2(,%1)\"; ! 1817: }") ! 1818: ! 1819: ; ! 1820: ; adddf3 instruction pattern(s). ! 1821: ; ! 1822: ! 1823: (define_insn "adddf3" ! 1824: [(set (match_operand:DF 0 "general_operand" "=f") ! 1825: (plus:DF (match_operand:DF 1 "general_operand" "%0") ! 1826: (match_operand:DF 2 "general_operand" "fmF")))] ! 1827: "" ! 1828: "* ! 1829: { ! 1830: check_label_emit (); ! 1831: if (FP_REG_P (operands[2])) ! 1832: { ! 1833: mvs_check_page (0, 2, 0); ! 1834: return \"ADR %0,%2\"; ! 1835: } ! 1836: mvs_check_page (0, 4, 0); ! 1837: return \"AD %0,%2\"; ! 1838: }") ! 1839: ! 1840: ; ! 1841: ; addsf3 instruction pattern(s). ! 1842: ; ! 1843: ! 1844: (define_insn "addsf3" ! 1845: [(set (match_operand:SF 0 "general_operand" "=f") ! 1846: (plus:SF (match_operand:SF 1 "general_operand" "%0") ! 1847: (match_operand:SF 2 "general_operand" "fmF")))] ! 1848: "" ! 1849: "* ! 1850: { ! 1851: check_label_emit (); ! 1852: if (FP_REG_P (operands[2])) ! 1853: { ! 1854: mvs_check_page (0, 2, 0); ! 1855: return \"AER %0,%2\"; ! 1856: } ! 1857: mvs_check_page (0, 4, 0); ! 1858: return \"AE %0,%2\"; ! 1859: }") ! 1860: ! 1861: ;; ! 1862: ;;- Subtract instructions. ! 1863: ;; ! 1864: ! 1865: ; ! 1866: ; subdi3 instruction pattern(s). ! 1867: ; ! 1868: ! 1869: (define_expand "subdi3" ! 1870: [(set (match_operand:DI 0 "general_operand" "") ! 1871: (minus:DI (match_operand:DI 1 "general_operand" "") ! 1872: (match_operand:DI 2 "general_operand" "")))] ! 1873: "" ! 1874: " ! 1875: { ! 1876: rtx label = gen_label_rtx (); ! 1877: rtx op0_high = operand_subword (operands[0], 0, 1, DImode); ! 1878: rtx op0_low = gen_lowpart (SImode, operands[0]); ! 1879: ! 1880: emit_insn (gen_rtx (SET, VOIDmode, op0_high, ! 1881: gen_rtx (MINUS, SImode, ! 1882: operand_subword (operands[1], 0, 1, DImode), ! 1883: operand_subword (operands[2], 0, 1, DImode)))); ! 1884: emit_jump_insn (gen_rtx (PARALLEL, VOIDmode, gen_rtvec (2, ! 1885: gen_rtx (SET, VOIDmode, op0_low, ! 1886: gen_rtx (MINUS, SImode, ! 1887: gen_lowpart (SImode, operands[1]), ! 1888: gen_lowpart (SImode, operands[2]))), ! 1889: gen_rtx (USE, VOIDmode, ! 1890: gen_rtx (LABEL_REF, VOIDmode, label))))); ! 1891: emit_insn (gen_rtx (SET, VOIDmode, op0_high, ! 1892: gen_rtx (MINUS, SImode, op0_high, ! 1893: gen_rtx (CONST_INT, SImode, 1)))); ! 1894: emit_label (label); ! 1895: DONE; ! 1896: }") ! 1897: ! 1898: (define_insn "" ! 1899: [(set (match_operand:SI 0 "general_operand" "=d") ! 1900: (minus:SI (match_operand:SI 1 "general_operand" "0") ! 1901: (match_operand:SI 2 "general_operand" "g"))) ! 1902: (use (label_ref (match_operand 3 "" "")))] ! 1903: "" ! 1904: "* ! 1905: { ! 1906: int onpage; ! 1907: ! 1908: check_label_emit (); ! 1909: CC_STATUS_INIT; ! 1910: onpage = mvs_check_label (CODE_LABEL_NUMBER (operands[3])); ! 1911: if (REG_P (operands[2])) ! 1912: { ! 1913: if (!onpage) ! 1914: { ! 1915: mvs_check_page (0, 8, 4); ! 1916: return \"SLR %0,%2\;L 14,=A(%l3)\;BCR 12,14\"; ! 1917: } ! 1918: if (mvs_check_page (0, 6, 0)) ! 1919: { ! 1920: mvs_check_page (0, 2, 4); ! 1921: return \"SLR %0,%2\;L 14,=A(%l3)\;BCR 12,14\"; ! 1922: } ! 1923: return \"SLR %0,%2\;BC 12,%l3\"; ! 1924: } ! 1925: if (!onpage) ! 1926: { ! 1927: mvs_check_page (0, 10, 4); ! 1928: return \"SL %0,%2\;L 14,=A(%l3)\;BCR 12,14\"; ! 1929: } ! 1930: if (mvs_check_page (0, 8, 0)) ! 1931: { ! 1932: mvs_check_page (0, 2, 4); ! 1933: return \"SL %0,%2\;L 14,=A(%l3)\;BCR 12,14\"; ! 1934: } ! 1935: return \"SL %0,%2\;BC 12,%l3\"; ! 1936: }") ! 1937: ! 1938: ; ! 1939: ; subsi3 instruction pattern(s). ! 1940: ; ! 1941: ! 1942: (define_insn "subsi3" ! 1943: [(set (match_operand:SI 0 "general_operand" "=d") ! 1944: (minus:SI (match_operand:SI 1 "general_operand" "0") ! 1945: (match_operand:SI 2 "general_operand" "g")))] ! 1946: "" ! 1947: "* ! 1948: { ! 1949: check_label_emit (); ! 1950: if (REG_P (operands[2])) ! 1951: { ! 1952: mvs_check_page (0, 2, 0); ! 1953: return \"SR %0,%2\"; ! 1954: } ! 1955: if (operands[2] == const1_rtx) ! 1956: { ! 1957: CC_STATUS_INIT; ! 1958: mvs_check_page (0, 2, 0); ! 1959: return \"BCTR %0,0\"; ! 1960: } ! 1961: mvs_check_page (0, 4, 0); ! 1962: return \"S %0,%2\"; ! 1963: }") ! 1964: ! 1965: ; ! 1966: ; subhi3 instruction pattern(s). ! 1967: ; ! 1968: ! 1969: (define_insn "subhi3" ! 1970: [(set (match_operand:HI 0 "general_operand" "=d") ! 1971: (minus:HI (match_operand:HI 1 "general_operand" "0") ! 1972: (match_operand:HI 2 "general_operand" "g")))] ! 1973: "" ! 1974: "* ! 1975: { ! 1976: check_label_emit (); ! 1977: if (REG_P (operands[2])) ! 1978: { ! 1979: mvs_check_page (0, 2, 0); ! 1980: return \"STH %2,140(,13)\;SH %0,140(,13)\"; ! 1981: } ! 1982: if (operands[2] == const1_rtx) ! 1983: { ! 1984: CC_STATUS_INIT; ! 1985: mvs_check_page (0, 2, 0); ! 1986: return \"BCTR %0,0\"; ! 1987: } ! 1988: if (GET_CODE (operands[2]) == CONST_INT) ! 1989: { ! 1990: mvs_check_page (0, 4, 2); ! 1991: return \"SH %0,=H'%h2'\"; ! 1992: } ! 1993: mvs_check_page (0, 4, 0); ! 1994: return \"SH %0,%2\"; ! 1995: }") ! 1996: ! 1997: ; ! 1998: ; subqi3 instruction pattern(s). ! 1999: ; ! 2000: ! 2001: (define_expand "subqi3" ! 2002: [(set (match_operand:QI 0 "general_operand" "=d") ! 2003: (minus:QI (match_operand:QI 1 "general_operand" "%0") ! 2004: (match_operand:QI 2 "general_operand" "di")))] ! 2005: "" ! 2006: " ! 2007: { ! 2008: if (REG_P (operands[2])) ! 2009: { ! 2010: emit_insn (gen_rtx (SET, VOIDmode, operands[0], ! 2011: gen_rtx (MINUS, QImode, operands[1], operands[2]))); ! 2012: } ! 2013: else ! 2014: { ! 2015: emit_insn (gen_rtx (SET, VOIDmode, operands[0], ! 2016: gen_rtx (PLUS, QImode, operands[1], ! 2017: negate_rtx (QImode, operands[2])))); ! 2018: } ! 2019: DONE; ! 2020: }") ! 2021: ! 2022: (define_insn "" ! 2023: [(set (match_operand:QI 0 "register_operand" "=d") ! 2024: (minus:QI (match_operand:QI 1 "register_operand" "%0") ! 2025: (match_operand:QI 2 "register_operand" "d")))] ! 2026: "" ! 2027: "* ! 2028: { ! 2029: check_label_emit (); ! 2030: CC_STATUS_INIT; ! 2031: mvs_check_page (0, 2, 0); ! 2032: return \"SR %0,%2\"; ! 2033: }") ! 2034: ! 2035: ; ! 2036: ; subdf3 instruction pattern(s). ! 2037: ; ! 2038: ! 2039: (define_insn "subdf3" ! 2040: [(set (match_operand:DF 0 "general_operand" "=f") ! 2041: (minus:DF (match_operand:DF 1 "general_operand" "0") ! 2042: (match_operand:DF 2 "general_operand" "fmF")))] ! 2043: "" ! 2044: "* ! 2045: { ! 2046: check_label_emit (); ! 2047: if (FP_REG_P (operands[2])) ! 2048: { ! 2049: mvs_check_page (0, 2, 0); ! 2050: return \"SDR %0,%2\"; ! 2051: } ! 2052: mvs_check_page (0, 4, 0); ! 2053: return \"SD %0,%2\"; ! 2054: }") ! 2055: ! 2056: ; ! 2057: ; subsf3 instruction pattern(s). ! 2058: ; ! 2059: ! 2060: (define_insn "subsf3" ! 2061: [(set (match_operand:SF 0 "general_operand" "=f") ! 2062: (minus:SF (match_operand:SF 1 "general_operand" "0") ! 2063: (match_operand:SF 2 "general_operand" "fmF")))] ! 2064: "" ! 2065: "* ! 2066: { ! 2067: check_label_emit (); ! 2068: if (FP_REG_P (operands[2])) ! 2069: { ! 2070: mvs_check_page (0, 2, 0); ! 2071: return \"SER %0,%2\"; ! 2072: } ! 2073: mvs_check_page (0, 4, 0); ! 2074: return \"SE %0,%2\"; ! 2075: }") ! 2076: ! 2077: ;; ! 2078: ;;- Multiply instructions. ! 2079: ;; ! 2080: ! 2081: ; ! 2082: ; mulsi3 instruction pattern(s). ! 2083: ; ! 2084: ! 2085: (define_expand "mulsi3" ! 2086: [(set (match_operand:SI 0 "general_operand" "") ! 2087: (mult:SI (match_operand:SI 1 "general_operand" "") ! 2088: (match_operand:SI 2 "general_operand" "")))] ! 2089: "" ! 2090: " ! 2091: { ! 2092: if (GET_CODE (operands[1]) == CONST_INT ! 2093: && CONST_OK_FOR_LETTER_P (INTVAL (operands[1]), 'K')) ! 2094: { ! 2095: emit_insn (gen_rtx (SET, VOIDmode, operands[0], ! 2096: gen_rtx (MULT, SImode, operands[2], operands[1]))); ! 2097: } ! 2098: else if (GET_CODE (operands[2]) == CONST_INT ! 2099: && CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'K')) ! 2100: { ! 2101: emit_insn (gen_rtx (SET, VOIDmode, operands[0], ! 2102: gen_rtx (MULT, SImode, operands[1], operands[2]))); ! 2103: } ! 2104: else ! 2105: { ! 2106: rtx r = gen_reg_rtx (DImode); ! 2107: ! 2108: emit_insn (gen_rtx (SET, VOIDmode, ! 2109: gen_rtx (SUBREG, SImode, r, 1), operands[1])); ! 2110: emit_insn (gen_rtx (SET, VOIDmode, r, ! 2111: gen_rtx (MULT, SImode, r, operands[2]))); ! 2112: emit_insn (gen_rtx (SET, VOIDmode, operands[0], ! 2113: gen_rtx (SUBREG, SImode, r, 1))); ! 2114: } ! 2115: DONE; ! 2116: }") ! 2117: ! 2118: (define_insn "" ! 2119: [(set (match_operand:SI 0 "register_operand" "=d") ! 2120: (mult:SI (match_operand:SI 1 "general_operand" "%0") ! 2121: (match_operand:SI 2 "immediate_operand" "K")))] ! 2122: "" ! 2123: "* ! 2124: { ! 2125: check_label_emit (); ! 2126: mvs_check_page (0, 4, 0); ! 2127: return \"MH %0,%2\"; ! 2128: }") ! 2129: ! 2130: (define_insn "" ! 2131: [(set (match_operand:DI 0 "register_operand" "=d") ! 2132: (mult:SI (match_operand:DI 1 "general_operand" "%0") ! 2133: (match_operand:SI 2 "general_operand" "g")))] ! 2134: "" ! 2135: "* ! 2136: { ! 2137: check_label_emit (); ! 2138: if (REG_P (operands[2])) ! 2139: { ! 2140: mvs_check_page (0, 2, 0); ! 2141: return \"MR %0,%2\"; ! 2142: } ! 2143: mvs_check_page (0, 4, 0); ! 2144: return \"M %0,%2\"; ! 2145: }") ! 2146: ! 2147: ; ! 2148: ; muldf3 instruction pattern(s). ! 2149: ; ! 2150: ! 2151: (define_insn "muldf3" ! 2152: [(set (match_operand:DF 0 "general_operand" "=f") ! 2153: (mult:DF (match_operand:DF 1 "general_operand" "%0") ! 2154: (match_operand:DF 2 "general_operand" "fmF")))] ! 2155: "" ! 2156: "* ! 2157: { ! 2158: check_label_emit (); ! 2159: if (FP_REG_P (operands[2])) ! 2160: { ! 2161: mvs_check_page (0, 2, 0); ! 2162: return \"MDR %0,%2\"; ! 2163: } ! 2164: mvs_check_page (0, 4, 0); ! 2165: return \"MD %0,%2\"; ! 2166: }") ! 2167: ! 2168: ; ! 2169: ; mulsf3 instruction pattern(s). ! 2170: ; ! 2171: ! 2172: (define_insn "mulsf3" ! 2173: [(set (match_operand:SF 0 "general_operand" "=f") ! 2174: (mult:SF (match_operand:SF 1 "general_operand" "%0") ! 2175: (match_operand:SF 2 "general_operand" "fmF")))] ! 2176: "" ! 2177: "* ! 2178: { ! 2179: check_label_emit (); ! 2180: if (FP_REG_P (operands[2])) ! 2181: { ! 2182: mvs_check_page (0, 2, 0); ! 2183: return \"MER %0,%2\"; ! 2184: } ! 2185: mvs_check_page (0, 4, 0); ! 2186: return \"ME %0,%2\"; ! 2187: }") ! 2188: ! 2189: ;; ! 2190: ;;- Divide instructions. ! 2191: ;; ! 2192: ! 2193: ; ! 2194: ; divsi3 instruction pattern(s). ! 2195: ; ! 2196: ! 2197: (define_expand "divsi3" ! 2198: [(set (match_operand:SI 0 "general_operand" "") ! 2199: (div:SI (match_operand:SI 1 "general_operand" "") ! 2200: (match_operand:SI 2 "general_operand" "")))] ! 2201: "" ! 2202: " ! 2203: { ! 2204: rtx r = gen_reg_rtx (DImode); ! 2205: ! 2206: emit_insn (gen_extendsidi2 (r, operands[1])); ! 2207: emit_insn (gen_rtx (SET, VOIDmode, r, ! 2208: gen_rtx (DIV, SImode, r, operands[2]))); ! 2209: emit_insn (gen_rtx (SET, VOIDmode, operands[0], ! 2210: gen_rtx (SUBREG, SImode, r, 1))); ! 2211: DONE; ! 2212: }") ! 2213: ! 2214: ! 2215: ; ! 2216: ; udivsi3 instruction pattern(s). ! 2217: ; ! 2218: ! 2219: (define_expand "udivsi3" ! 2220: [(set (match_operand:SI 0 "general_operand" "") ! 2221: (udiv:SI (match_operand:SI 1 "general_operand" "") ! 2222: (match_operand:SI 2 "general_operand" "")))] ! 2223: "" ! 2224: " ! 2225: { ! 2226: rtx dr = gen_reg_rtx (DImode); ! 2227: rtx dr_0 = gen_rtx (SUBREG, SImode, dr, 0); ! 2228: rtx dr_1 = gen_rtx (SUBREG, SImode, dr, 1); ! 2229: ! 2230: ! 2231: if (GET_CODE (operands[2]) == CONST_INT) ! 2232: { ! 2233: if (INTVAL (operands[2]) > 0) ! 2234: { ! 2235: emit_insn (gen_zero_extendsidi2 (dr, operands[1])); ! 2236: emit_insn (gen_rtx (SET, VOIDmode, dr, ! 2237: gen_rtx (DIV, SImode, dr, operands[2]))); ! 2238: } ! 2239: else ! 2240: { ! 2241: rtx label1 = gen_label_rtx (); ! 2242: ! 2243: emit_insn (gen_rtx (SET, VOIDmode, dr_0, operands[1])); ! 2244: emit_insn (gen_rtx (SET, VOIDmode, dr_1, const0_rtx)); ! 2245: emit_insn (gen_cmpsi (dr_0, operands[2])); ! 2246: emit_jump_insn (gen_bltu (label1)); ! 2247: emit_insn (gen_rtx (SET, VOIDmode, dr_1, const1_rtx)); ! 2248: emit_label (label1); ! 2249: } ! 2250: } ! 2251: else ! 2252: { ! 2253: rtx label1 = gen_label_rtx (); ! 2254: rtx label2 = gen_label_rtx (); ! 2255: rtx label3 = gen_label_rtx (); ! 2256: rtx sr = gen_reg_rtx (SImode); ! 2257: ! 2258: emit_insn (gen_rtx (SET, VOIDmode, dr_0, operands[1])); ! 2259: emit_insn (gen_rtx (SET, VOIDmode, sr, operands[2])); ! 2260: emit_insn (gen_rtx (SET, VOIDmode, dr_1, const0_rtx)); ! 2261: emit_insn (gen_cmpsi (sr, dr_0)); ! 2262: emit_jump_insn (gen_bgtu (label3)); ! 2263: emit_insn (gen_cmpsi (sr, const1_rtx)); ! 2264: emit_jump_insn (gen_blt (label2)); ! 2265: emit_jump_insn (gen_beq (label1)); ! 2266: emit_insn (gen_rtx (SET, VOIDmode, dr, ! 2267: gen_rtx (LSHIFTRT, DImode, dr, ! 2268: gen_rtx (CONST_INT, SImode, 32)))); ! 2269: emit_insn (gen_rtx (SET, VOIDmode, dr, ! 2270: gen_rtx (DIV, SImode, dr, sr))); ! 2271: emit_jump_insn (gen_jump (label3)); ! 2272: emit_label (label1); ! 2273: emit_insn (gen_rtx (SET, VOIDmode, dr_1, dr_0)); ! 2274: emit_jump_insn (gen_jump (label3)); ! 2275: emit_label (label2); ! 2276: emit_insn (gen_rtx (SET, VOIDmode, dr_1, const1_rtx)); ! 2277: emit_label (label3); ! 2278: } ! 2279: emit_insn (gen_rtx (SET, VOIDmode, operands[0], dr_1)); ! 2280: ! 2281: DONE; ! 2282: }") ! 2283: ! 2284: ; This is used by divsi3 & udivsi3. ! 2285: ! 2286: (define_insn "" ! 2287: [(set (match_operand:DI 0 "register_operand" "=d") ! 2288: (div:SI (match_operand:DI 1 "register_operand" "0") ! 2289: (match_operand:SI 2 "general_operand" "")))] ! 2290: "" ! 2291: "* ! 2292: { ! 2293: check_label_emit (); ! 2294: if (REG_P (operands[2])) ! 2295: { ! 2296: mvs_check_page (0, 2, 0); ! 2297: return \"DR %0,%2\"; ! 2298: } ! 2299: mvs_check_page (0, 4, 0); ! 2300: return \"D %0,%2\"; ! 2301: }") ! 2302: ! 2303: ; ! 2304: ; divdf3 instruction pattern(s). ! 2305: ; ! 2306: ! 2307: (define_insn "divdf3" ! 2308: [(set (match_operand:DF 0 "general_operand" "=f") ! 2309: (div:DF (match_operand:DF 1 "general_operand" "0") ! 2310: (match_operand:DF 2 "general_operand" "fmF")))] ! 2311: "" ! 2312: "* ! 2313: { ! 2314: check_label_emit (); ! 2315: if (FP_REG_P (operands[2])) ! 2316: { ! 2317: mvs_check_page (0, 2, 0); ! 2318: return \"DDR %0,%2\"; ! 2319: } ! 2320: mvs_check_page (0, 4, 0); ! 2321: return \"DD %0,%2\"; ! 2322: }") ! 2323: ! 2324: ; ! 2325: ; divsf3 instruction pattern(s). ! 2326: ; ! 2327: ! 2328: (define_insn "divsf3" ! 2329: [(set (match_operand:SF 0 "general_operand" "=f") ! 2330: (div:SF (match_operand:SF 1 "general_operand" "0") ! 2331: (match_operand:SF 2 "general_operand" "fmF")))] ! 2332: "" ! 2333: "* ! 2334: { ! 2335: check_label_emit (); ! 2336: if (FP_REG_P (operands[2])) ! 2337: { ! 2338: mvs_check_page (0, 2, 0); ! 2339: return \"DER %0,%2\"; ! 2340: } ! 2341: mvs_check_page (0, 4, 0); ! 2342: return \"DE %0,%2\"; ! 2343: }") ! 2344: ! 2345: ;; ! 2346: ;;- Modulo instructions. ! 2347: ;; ! 2348: ! 2349: ; ! 2350: ; modsi3 instruction pattern(s). ! 2351: ; ! 2352: ! 2353: (define_expand "modsi3" ! 2354: [(set (match_operand:SI 0 "general_operand" "") ! 2355: (mod:SI (match_operand:SI 1 "general_operand" "") ! 2356: (match_operand:SI 2 "general_operand" "")))] ! 2357: "" ! 2358: " ! 2359: { ! 2360: rtx r = gen_reg_rtx (DImode); ! 2361: ! 2362: emit_insn (gen_extendsidi2 (r, operands[1])); ! 2363: emit_insn (gen_rtx (SET, VOIDmode, r, ! 2364: gen_rtx (MOD, SImode, r, operands[2]))); ! 2365: emit_insn (gen_rtx (SET, VOIDmode, operands[0], ! 2366: gen_rtx (SUBREG, SImode, r, 0))); ! 2367: DONE; ! 2368: }") ! 2369: ! 2370: ; ! 2371: ; umodsi3 instruction pattern(s). ! 2372: ; ! 2373: ! 2374: (define_expand "umodsi3" ! 2375: [(set (match_operand:SI 0 "general_operand" "") ! 2376: (umod:SI (match_operand:SI 1 "general_operand" "") ! 2377: (match_operand:SI 2 "general_operand" "")))] ! 2378: "" ! 2379: " ! 2380: { ! 2381: rtx dr = gen_reg_rtx (DImode); ! 2382: rtx dr_0 = gen_rtx (SUBREG, SImode, dr, 0); ! 2383: rtx dr_1 = gen_rtx (SUBREG, SImode, dr, 1); ! 2384: ! 2385: emit_insn (gen_rtx (SET, VOIDmode, dr_0, operands[1])); ! 2386: ! 2387: if (GET_CODE (operands[2]) == CONST_INT) ! 2388: { ! 2389: if (INTVAL (operands[2]) > 0) ! 2390: { ! 2391: emit_insn (gen_rtx (SET, VOIDmode, dr, ! 2392: gen_rtx (LSHIFTRT, DImode, dr, ! 2393: gen_rtx (CONST_INT, SImode, 32)))); ! 2394: emit_insn (gen_rtx (SET, VOIDmode, dr, ! 2395: gen_rtx (MOD, SImode, dr, operands[2]))); ! 2396: } ! 2397: else ! 2398: { ! 2399: rtx label1 = gen_label_rtx (); ! 2400: rtx sr = gen_reg_rtx (SImode); ! 2401: ! 2402: emit_insn (gen_rtx (SET, VOIDmode, sr, operands[2])); ! 2403: emit_insn (gen_cmpsi (dr_0, sr)); ! 2404: emit_jump_insn (gen_bltu (label1)); ! 2405: emit_insn (gen_rtx (SET, VOIDmode, sr, gen_rtx (ABS, SImode, sr))); ! 2406: emit_insn (gen_rtx (SET, VOIDmode, dr_0, ! 2407: gen_rtx (PLUS, SImode, dr_0, sr))); ! 2408: emit_label (label1); ! 2409: } ! 2410: } ! 2411: else ! 2412: { ! 2413: rtx label1 = gen_label_rtx (); ! 2414: rtx label2 = gen_label_rtx (); ! 2415: rtx label3 = gen_label_rtx (); ! 2416: rtx sr = gen_reg_rtx (SImode); ! 2417: ! 2418: emit_insn (gen_rtx (SET, VOIDmode, dr_0, operands[1])); ! 2419: emit_insn (gen_rtx (SET, VOIDmode, sr, operands[2])); ! 2420: emit_insn (gen_cmpsi (sr, dr_0)); ! 2421: emit_jump_insn (gen_bgtu (label3)); ! 2422: emit_insn (gen_cmpsi (sr, const1_rtx)); ! 2423: emit_jump_insn (gen_blt (label2)); ! 2424: emit_jump_insn (gen_beq (label1)); ! 2425: emit_insn (gen_rtx (SET, VOIDmode, dr, ! 2426: gen_rtx (LSHIFTRT, DImode, dr, ! 2427: gen_rtx (CONST_INT, SImode, 32)))); ! 2428: emit_insn (gen_rtx (SET, VOIDmode, dr, gen_rtx (MOD, SImode, dr, sr))); ! 2429: emit_jump_insn (gen_jump (label3)); ! 2430: emit_label (label1); ! 2431: emit_insn (gen_rtx (SET, VOIDmode, dr_0, const0_rtx)); ! 2432: emit_jump_insn (gen_jump (label3)); ! 2433: emit_label (label2); ! 2434: emit_insn (gen_rtx (SET, VOIDmode, dr_0, ! 2435: gen_rtx (MINUS, SImode, dr_0, sr))); ! 2436: emit_label (label3); ! 2437: ! 2438: } ! 2439: emit_insn (gen_rtx (SET, VOIDmode, operands[0], dr_0)); ! 2440: ! 2441: DONE; ! 2442: }") ! 2443: ! 2444: ; This is used by modsi3 & umodsi3. ! 2445: ! 2446: (define_insn "" ! 2447: [(set (match_operand:DI 0 "register_operand" "=d") ! 2448: (mod:SI (match_operand:DI 1 "register_operand" "0") ! 2449: (match_operand:SI 2 "general_operand" "")))] ! 2450: "" ! 2451: "* ! 2452: { ! 2453: check_label_emit (); ! 2454: if (REG_P (operands[2])) ! 2455: { ! 2456: mvs_check_page (0, 2, 0); ! 2457: return \"DR %0,%2\"; ! 2458: } ! 2459: mvs_check_page (0, 4, 0); ! 2460: return \"D %0,%2\"; ! 2461: }") ! 2462: ! 2463: ;; ! 2464: ;;- And instructions. ! 2465: ;; ! 2466: ! 2467: ; ! 2468: ; anddi3 instruction pattern(s). ! 2469: ; ! 2470: ! 2471: ;(define_expand "anddi3" ! 2472: ; [(set (match_operand:DI 0 "general_operand" "") ! 2473: ; (and:DI (match_operand:DI 1 "general_operand" "") ! 2474: ; (match_operand:DI 2 "general_operand" "")))] ! 2475: ; "" ! 2476: ; " ! 2477: ;{ ! 2478: ; rtx gen_andsi3(); ! 2479: ; ! 2480: ; emit_insn (gen_andsi3 (operand_subword (operands[0], 0, 1, DImode), ! 2481: ; operand_subword (operands[1], 0, 1, DImode), ! 2482: ; operand_subword (operands[2], 0, 1, DImode))); ! 2483: ; emit_insn (gen_andsi3 (gen_lowpart (SImode, operands[0]), ! 2484: ; gen_lowpart (SImode, operands[1]), ! 2485: ; gen_lowpart (SImode, operands[2]))); ! 2486: ; DONE; ! 2487: ;}") ! 2488: ! 2489: ; ! 2490: ; andsi3 instruction pattern(s). ! 2491: ; ! 2492: ! 2493: (define_insn "" ! 2494: [(set (match_operand:SI 0 "r_or_s_operand" "=d,m") ! 2495: (and:SI (match_operand:SI 1 "r_or_s_operand" "%0,0") ! 2496: (match_operand:SI 2 "r_or_s_operand" "g,mi")))] ! 2497: "TARGET_CHAR_INSTRUCTIONS" ! 2498: "* ! 2499: { ! 2500: check_label_emit (); ! 2501: if (REG_P (operands[2])) ! 2502: { ! 2503: mvs_check_page (0, 2, 0); ! 2504: return \"NR %0,%2\"; ! 2505: } ! 2506: if (REG_P (operands[0])) ! 2507: { ! 2508: mvs_check_page (0, 4, 0); ! 2509: return \"N %0,%2\"; ! 2510: } ! 2511: CC_STATUS_INIT; ! 2512: mvs_check_page (0, 6, 0); ! 2513: return \"NC %O0(4,%R0),%2\"; ! 2514: }") ! 2515: ! 2516: (define_insn "andsi3" ! 2517: [(set (match_operand:SI 0 "general_operand" "=d") ! 2518: (and:SI (match_operand:SI 1 "general_operand" "%0") ! 2519: (match_operand:SI 2 "general_operand" "g")))] ! 2520: "" ! 2521: "* ! 2522: { ! 2523: check_label_emit (); ! 2524: if (REG_P (operands[2])) ! 2525: { ! 2526: mvs_check_page (0, 2, 0); ! 2527: return \"NR %0,%2\"; ! 2528: } ! 2529: mvs_check_page (0, 4, 0); ! 2530: return \"N %0,%2\"; ! 2531: }") ! 2532: ! 2533: ; ! 2534: ; andhi3 instruction pattern(s). ! 2535: ; ! 2536: ! 2537: (define_insn "" ! 2538: [(set (match_operand:HI 0 "r_or_s_operand" "=d,m") ! 2539: (and:HI (match_operand:HI 1 "r_or_s_operand" "%0,0") ! 2540: (match_operand:HI 2 "r_or_s_operand" "di,mi")))] ! 2541: "TARGET_CHAR_INSTRUCTIONS" ! 2542: "* ! 2543: { ! 2544: check_label_emit (); ! 2545: if (REG_P (operands[2])) ! 2546: { ! 2547: mvs_check_page (0, 2, 0); ! 2548: return \"NR %0,%2\"; ! 2549: } ! 2550: if (REG_P (operands[0])) ! 2551: { ! 2552: mvs_check_page (0, 4, 0); ! 2553: return \"N %0,%H2\"; ! 2554: } ! 2555: CC_STATUS_INIT; ! 2556: if (GET_CODE (operands[2]) == CONST_INT) ! 2557: { ! 2558: mvs_check_page (0, 6, 2); ! 2559: return \"NC %O0(2,%R0),=H'%h2'\"; ! 2560: } ! 2561: mvs_check_page (0, 6, 0); ! 2562: return \"NC %O0(2,%R0),%2\"; ! 2563: }") ! 2564: ! 2565: (define_insn "andhi3" ! 2566: [(set (match_operand:HI 0 "general_operand" "=d") ! 2567: (and:HI (match_operand:HI 1 "general_operand" "%0") ! 2568: (match_operand:HI 2 "general_operand" "di")))] ! 2569: "" ! 2570: "* ! 2571: { ! 2572: check_label_emit (); ! 2573: if (GET_CODE (operands[2]) == CONST_INT) ! 2574: { ! 2575: mvs_check_page (0, 4, 0); ! 2576: return \"N %0,%H2\"; ! 2577: } ! 2578: mvs_check_page (0, 2, 0); ! 2579: return \"NR %0,%2\"; ! 2580: }") ! 2581: ! 2582: ; ! 2583: ; andqi3 instruction pattern(s). ! 2584: ; ! 2585: ! 2586: (define_insn "" ! 2587: [(set (match_operand:QI 0 "r_or_s_operand" "=d,m") ! 2588: (and:QI (match_operand:QI 1 "r_or_s_operand" "%0,0") ! 2589: (match_operand:QI 2 "r_or_s_operand" "di,mi")))] ! 2590: "TARGET_CHAR_INSTRUCTIONS" ! 2591: "* ! 2592: { ! 2593: check_label_emit (); ! 2594: CC_STATUS_INIT; ! 2595: if (REG_P (operands[2])) ! 2596: { ! 2597: mvs_check_page (0, 2, 0); ! 2598: return \"NR %0,%2\"; ! 2599: } ! 2600: if (REG_P (operands[0])) ! 2601: { ! 2602: mvs_check_page (0, 4, 0); ! 2603: return \"N %0,%2\"; ! 2604: } ! 2605: if (GET_CODE (operands[2]) == CONST_INT) ! 2606: { ! 2607: mvs_check_page (0, 4, 0); ! 2608: return \"NI %0,%B2\"; ! 2609: } ! 2610: mvs_check_page (0, 6, 0); ! 2611: return \"NC %O0(1,%R0),%2\"; ! 2612: }") ! 2613: ! 2614: (define_insn "andqi3" ! 2615: [(set (match_operand:QI 0 "general_operand" "=d") ! 2616: (and:QI (match_operand:QI 1 "general_operand" "%0") ! 2617: (match_operand:QI 2 "general_operand" "di")))] ! 2618: "" ! 2619: "* ! 2620: { ! 2621: check_label_emit (); ! 2622: CC_STATUS_INIT; ! 2623: if (GET_CODE (operands[2]) == CONST_INT) ! 2624: { ! 2625: mvs_check_page (0, 4, 0); ! 2626: return \"N %0,%2\"; ! 2627: } ! 2628: mvs_check_page (0, 2, 0); ! 2629: return \"NR %0,%2\"; ! 2630: }") ! 2631: ! 2632: ;; ! 2633: ;;- Bit set (inclusive or) instructions. ! 2634: ;; ! 2635: ! 2636: ; ! 2637: ; iordi3 instruction pattern(s). ! 2638: ; ! 2639: ! 2640: ;(define_expand "iordi3" ! 2641: ; [(set (match_operand:DI 0 "general_operand" "") ! 2642: ; (ior:DI (match_operand:DI 1 "general_operand" "") ! 2643: ; (match_operand:DI 2 "general_operand" "")))] ! 2644: ; "" ! 2645: ; " ! 2646: ;{ ! 2647: ; rtx gen_iorsi3(); ! 2648: ; ! 2649: ; emit_insn (gen_iorsi3 (operand_subword (operands[0], 0, 1, DImode), ! 2650: ; operand_subword (operands[1], 0, 1, DImode), ! 2651: ; operand_subword (operands[2], 0, 1, DImode))); ! 2652: ; emit_insn (gen_iorsi3 (gen_lowpart (SImode, operands[0]), ! 2653: ; gen_lowpart (SImode, operands[1]), ! 2654: ; gen_lowpart (SImode, operands[2]))); ! 2655: ; DONE; ! 2656: ;}") ! 2657: ! 2658: ; ! 2659: ; iorsi3 instruction pattern(s). ! 2660: ; ! 2661: ! 2662: (define_insn "" ! 2663: [(set (match_operand:SI 0 "r_or_s_operand" "=d,m") ! 2664: (ior:SI (match_operand:SI 1 "r_or_s_operand" "%0,0") ! 2665: (match_operand:SI 2 "r_or_s_operand" "g,mi")))] ! 2666: "TARGET_CHAR_INSTRUCTIONS" ! 2667: "* ! 2668: { ! 2669: check_label_emit (); ! 2670: if (REG_P (operands[2])) ! 2671: { ! 2672: mvs_check_page (0, 2, 0); ! 2673: return \"OR %0,%2\"; ! 2674: } ! 2675: if (REG_P (operands[0])) ! 2676: { ! 2677: mvs_check_page (0, 4, 0); ! 2678: return \"O %0,%2\"; ! 2679: } ! 2680: CC_STATUS_INIT; ! 2681: mvs_check_page (0, 6, 0); ! 2682: return \"OC %O0(4,%R0),%2\"; ! 2683: }") ! 2684: ! 2685: (define_insn "iorsi3" ! 2686: [(set (match_operand:SI 0 "general_operand" "=d") ! 2687: (ior:SI (match_operand:SI 1 "general_operand" "%0") ! 2688: (match_operand:SI 2 "general_operand" "g")))] ! 2689: "" ! 2690: "* ! 2691: { ! 2692: check_label_emit (); ! 2693: if (REG_P (operands[2])) ! 2694: { ! 2695: mvs_check_page (0, 2, 0); ! 2696: return \"OR %0,%2\"; ! 2697: } ! 2698: mvs_check_page (0, 4, 0); ! 2699: return \"O %0,%2\"; ! 2700: }") ! 2701: ! 2702: ; ! 2703: ; iorhi3 instruction pattern(s). ! 2704: ; ! 2705: ! 2706: (define_insn "" ! 2707: [(set (match_operand:HI 0 "r_or_s_operand" "=d,m") ! 2708: (ior:HI (match_operand:HI 1 "r_or_s_operand" "%0,0") ! 2709: (match_operand:HI 2 "r_or_s_operand" "di,mi")))] ! 2710: "TARGET_CHAR_INSTRUCTIONS" ! 2711: "* ! 2712: { ! 2713: check_label_emit (); ! 2714: if (REG_P (operands[2])) ! 2715: { ! 2716: mvs_check_page (0, 2, 0); ! 2717: return \"OR %0,%2\"; ! 2718: } ! 2719: if (REG_P (operands[0])) ! 2720: { ! 2721: mvs_check_page (0, 4, 0); ! 2722: return \"O %0,%H2\"; ! 2723: } ! 2724: CC_STATUS_INIT; ! 2725: if (GET_CODE (operands[2]) == CONST_INT) ! 2726: { ! 2727: mvs_check_page (0, 6, 2); ! 2728: return \"OC %O0(2,%R0),=H'%h2'\"; ! 2729: } ! 2730: mvs_check_page (0, 6, 0); ! 2731: return \"OC %O0(2,%R0),%2\"; ! 2732: }") ! 2733: ! 2734: (define_insn "iorhi3" ! 2735: [(set (match_operand:HI 0 "general_operand" "=d") ! 2736: (ior:HI (match_operand:HI 1 "general_operand" "%0") ! 2737: (match_operand:HI 2 "general_operand" "di")))] ! 2738: "" ! 2739: "* ! 2740: { ! 2741: check_label_emit (); ! 2742: if (GET_CODE (operands[2]) == CONST_INT) ! 2743: { ! 2744: mvs_check_page (0, 4, 0); ! 2745: return \"O %0,%H2\"; ! 2746: } ! 2747: mvs_check_page (0, 2, 0); ! 2748: return \"OR %0,%2\"; ! 2749: }") ! 2750: ! 2751: ; ! 2752: ; iorqi3 instruction pattern(s). ! 2753: ; ! 2754: ! 2755: (define_insn "" ! 2756: [(set (match_operand:QI 0 "r_or_s_operand" "=d,m") ! 2757: (ior:QI (match_operand:QI 1 "r_or_s_operand" "%0,0") ! 2758: (match_operand:QI 2 "r_or_s_operand" "di,mi")))] ! 2759: "TARGET_CHAR_INSTRUCTIONS" ! 2760: "* ! 2761: { ! 2762: check_label_emit (); ! 2763: CC_STATUS_INIT; ! 2764: if (REG_P (operands[2])) ! 2765: { ! 2766: mvs_check_page (0, 2, 0); ! 2767: return \"OR %0,%2\"; ! 2768: } ! 2769: if (REG_P (operands[0])) ! 2770: { ! 2771: mvs_check_page (0, 4, 0); ! 2772: return \"O %0,%2\"; ! 2773: } ! 2774: CC_STATUS_INIT; ! 2775: if (GET_CODE (operands[2]) == CONST_INT) ! 2776: { ! 2777: mvs_check_page (0, 4, 0); ! 2778: return \"OI %0,%B2\"; ! 2779: } ! 2780: mvs_check_page (0, 6, 0); ! 2781: return \"OC %O0(1,%R0),%2\"; ! 2782: }") ! 2783: ! 2784: (define_insn "iorqi3" ! 2785: [(set (match_operand:QI 0 "general_operand" "=d") ! 2786: (ior:QI (match_operand:QI 1 "general_operand" "%0") ! 2787: (match_operand:QI 2 "general_operand" "di")))] ! 2788: "" ! 2789: "* ! 2790: { ! 2791: check_label_emit (); ! 2792: CC_STATUS_INIT; ! 2793: if (GET_CODE (operands[2]) == CONST_INT) ! 2794: { ! 2795: mvs_check_page (0, 4, 0); ! 2796: return \"O %0,%2\"; ! 2797: } ! 2798: mvs_check_page (0, 2, 0); ! 2799: return \"OR %0,%2\"; ! 2800: }") ! 2801: ! 2802: ;; ! 2803: ;;- Xor instructions. ! 2804: ;; ! 2805: ! 2806: ; ! 2807: ; xordi3 instruction pattern(s). ! 2808: ; ! 2809: ! 2810: ;(define_expand "xordi3" ! 2811: ; [(set (match_operand:DI 0 "general_operand" "") ! 2812: ; (xor:DI (match_operand:DI 1 "general_operand" "") ! 2813: ; (match_operand:DI 2 "general_operand" "")))] ! 2814: ; "" ! 2815: ; " ! 2816: ;{ ! 2817: ; rtx gen_xorsi3(); ! 2818: ; ! 2819: ; emit_insn (gen_xorsi3 (operand_subword (operands[0], 0, 1, DImode), ! 2820: ; operand_subword (operands[1], 0, 1, DImode), ! 2821: ; operand_subword (operands[2], 0, 1, DImode))); ! 2822: ; emit_insn (gen_xorsi3 (gen_lowpart (SImode, operands[0]), ! 2823: ; gen_lowpart (SImode, operands[1]), ! 2824: ; gen_lowpart (SImode, operands[2]))); ! 2825: ; DONE; ! 2826: ;}") ! 2827: ! 2828: ; ! 2829: ; xorsi3 instruction pattern(s). ! 2830: ; ! 2831: ! 2832: (define_insn "" ! 2833: [(set (match_operand:SI 0 "r_or_s_operand" "=d,m") ! 2834: (xor:SI (match_operand:SI 1 "r_or_s_operand" "%0,0") ! 2835: (match_operand:SI 2 "r_or_s_operand" "g,mi")))] ! 2836: "TARGET_CHAR_INSTRUCTIONS" ! 2837: "* ! 2838: { ! 2839: check_label_emit (); ! 2840: if (REG_P (operands[2])) ! 2841: { ! 2842: mvs_check_page (0, 2, 0); ! 2843: return \"XR %0,%2\"; ! 2844: } ! 2845: if (REG_P (operands[0])) ! 2846: { ! 2847: mvs_check_page (0, 4, 0); ! 2848: return \"X %0,%2\"; ! 2849: } ! 2850: CC_STATUS_INIT; ! 2851: mvs_check_page (0, 6, 0); ! 2852: return \"XC %O0(4,%R0),%2\"; ! 2853: }") ! 2854: ! 2855: (define_insn "xorsi3" ! 2856: [(set (match_operand:SI 0 "general_operand" "=d") ! 2857: (xor:SI (match_operand:SI 1 "general_operand" "%0") ! 2858: (match_operand:SI 2 "general_operand" "g")))] ! 2859: "" ! 2860: "* ! 2861: { ! 2862: check_label_emit (); ! 2863: if (REG_P (operands[2])) ! 2864: { ! 2865: mvs_check_page (0, 2, 0); ! 2866: return \"XR %0,%2\"; ! 2867: } ! 2868: mvs_check_page (0, 4, 0); ! 2869: return \"X %0,%2\"; ! 2870: }") ! 2871: ! 2872: ; ! 2873: ; xorhi3 instruction pattern(s). ! 2874: ; ! 2875: ! 2876: (define_insn "" ! 2877: [(set (match_operand:HI 0 "r_or_s_operand" "=d,m") ! 2878: (xor:HI (match_operand:HI 1 "r_or_s_operand" "%0,0") ! 2879: (match_operand:HI 2 "r_or_s_operand" "di,mi")))] ! 2880: "TARGET_CHAR_INSTRUCTIONS" ! 2881: "* ! 2882: { ! 2883: check_label_emit (); ! 2884: if (REG_P (operands[2])) ! 2885: { ! 2886: mvs_check_page (0, 2, 0); ! 2887: return \"XR %0,%2\"; ! 2888: } ! 2889: if (REG_P (operands[0])) ! 2890: { ! 2891: mvs_check_page (0, 4, 0); ! 2892: return \"X %0,%H2\"; ! 2893: } ! 2894: CC_STATUS_INIT; ! 2895: if (GET_CODE (operands[2]) == CONST_INT) ! 2896: { ! 2897: mvs_check_page (0, 6, 2); ! 2898: return \"XC %O0(2,%R0),=H'%h2'\"; ! 2899: } ! 2900: mvs_check_page (0, 6, 0); ! 2901: return \"XC %O0(2,%R0),%2\"; ! 2902: }") ! 2903: ! 2904: (define_insn "xorhi3" ! 2905: [(set (match_operand:HI 0 "general_operand" "=d") ! 2906: (xor:HI (match_operand:HI 1 "general_operand" "%0") ! 2907: (match_operand:HI 2 "general_operand" "di")))] ! 2908: "" ! 2909: "* ! 2910: { ! 2911: check_label_emit (); ! 2912: if (GET_CODE (operands[2]) == CONST_INT) ! 2913: { ! 2914: mvs_check_page (0, 4, 0); ! 2915: return \"X %0,%2\"; ! 2916: } ! 2917: mvs_check_page (0, 2, 0); ! 2918: return \"XR %0,%2\"; ! 2919: }") ! 2920: ! 2921: ; ! 2922: ; xorqi3 instruction pattern(s). ! 2923: ; ! 2924: ! 2925: (define_insn "" ! 2926: [(set (match_operand:QI 0 "r_or_s_operand" "=d,m") ! 2927: (xor:QI (match_operand:QI 1 "r_or_s_operand" "%0,0") ! 2928: (match_operand:QI 2 "r_or_s_operand" "di,mi")))] ! 2929: "TARGET_CHAR_INSTRUCTIONS" ! 2930: "* ! 2931: { ! 2932: check_label_emit (); ! 2933: CC_STATUS_INIT; ! 2934: if (REG_P (operands[2])) ! 2935: { ! 2936: mvs_check_page (0, 2, 0); ! 2937: return \"XR %0,%2\"; ! 2938: } ! 2939: if (REG_P (operands[0])) ! 2940: { ! 2941: mvs_check_page (0, 4, 0); ! 2942: return \"X %0,%2\"; ! 2943: } ! 2944: if (GET_CODE (operands[2]) == CONST_INT) ! 2945: { ! 2946: mvs_check_page (0, 4, 0); ! 2947: return \"XI %0,%B2\"; ! 2948: } ! 2949: mvs_check_page (0, 6, 0); ! 2950: return \"XC %O0(1,%R0),%2\"; ! 2951: }") ! 2952: ! 2953: (define_insn "xorqi3" ! 2954: [(set (match_operand:QI 0 "general_operand" "=d") ! 2955: (xor:QI (match_operand:QI 1 "general_operand" "%0") ! 2956: (match_operand:QI 2 "general_operand" "di")))] ! 2957: "" ! 2958: "* ! 2959: { ! 2960: check_label_emit (); ! 2961: CC_STATUS_INIT; ! 2962: if (GET_CODE (operands[2]) == CONST_INT) ! 2963: { ! 2964: mvs_check_page (0, 4, 0); ! 2965: return \"X %0,%2\"; ! 2966: } ! 2967: mvs_check_page (0, 2, 0); ! 2968: return \"XR %0,%2\"; ! 2969: }") ! 2970: ! 2971: ;; ! 2972: ;;- Negate instructions. ! 2973: ;; ! 2974: ! 2975: ; ! 2976: ; negsi2 instruction pattern(s). ! 2977: ; ! 2978: ! 2979: (define_insn "negsi2" ! 2980: [(set (match_operand:SI 0 "general_operand" "=d") ! 2981: (neg:SI (match_operand:SI 1 "general_operand" "d")))] ! 2982: "" ! 2983: "* ! 2984: { ! 2985: check_label_emit (); ! 2986: mvs_check_page (0, 2, 0); ! 2987: return \"LCR %0,%1\"; ! 2988: }") ! 2989: ! 2990: ; ! 2991: ; neghi2 instruction pattern(s). ! 2992: ; ! 2993: ! 2994: (define_insn "neghi2" ! 2995: [(set (match_operand:HI 0 "general_operand" "=d") ! 2996: (neg:HI (match_operand:HI 1 "general_operand" "d")))] ! 2997: "" ! 2998: "* ! 2999: { ! 3000: check_label_emit (); ! 3001: mvs_check_page (0, 10, 0); ! 3002: return \"SLL %1,16\;SRA %1,16\;LCR %0,%1\"; ! 3003: }") ! 3004: ! 3005: ; ! 3006: ; negdf2 instruction pattern(s). ! 3007: ; ! 3008: ! 3009: (define_insn "negdf2" ! 3010: [(set (match_operand:DF 0 "general_operand" "=f") ! 3011: (neg:DF (match_operand:DF 1 "general_operand" "f")))] ! 3012: "" ! 3013: "* ! 3014: { ! 3015: check_label_emit (); ! 3016: mvs_check_page (0, 2, 0); ! 3017: return \"LCDR %0,%1\"; ! 3018: }") ! 3019: ! 3020: ; ! 3021: ; negsf2 instruction pattern(s). ! 3022: ; ! 3023: ! 3024: (define_insn "negsf2" ! 3025: [(set (match_operand:SF 0 "general_operand" "=f") ! 3026: (neg:SF (match_operand:SF 1 "general_operand" "f")))] ! 3027: "" ! 3028: "* ! 3029: { ! 3030: check_label_emit (); ! 3031: mvs_check_page (0, 2, 0); ! 3032: return \"LCER %0,%1\"; ! 3033: }") ! 3034: ! 3035: ;; ! 3036: ;;- Absolute value instructions. ! 3037: ;; ! 3038: ! 3039: ; ! 3040: ; abssi2 instruction pattern(s). ! 3041: ; ! 3042: ! 3043: (define_insn "abssi2" ! 3044: [(set (match_operand:SI 0 "general_operand" "=d") ! 3045: (abs:SI (match_operand:SI 1 "general_operand" "d")))] ! 3046: "" ! 3047: "* ! 3048: { ! 3049: check_label_emit (); ! 3050: mvs_check_page (0, 2, 0); ! 3051: return \"LPR %0,%1\"; ! 3052: }") ! 3053: ! 3054: ; ! 3055: ; abshi2 instruction pattern(s). ! 3056: ; ! 3057: ! 3058: (define_insn "abshi2" ! 3059: [(set (match_operand:HI 0 "general_operand" "=d") ! 3060: (abs:HI (match_operand:HI 1 "general_operand" "d")))] ! 3061: "" ! 3062: "* ! 3063: { ! 3064: check_label_emit (); ! 3065: mvs_check_page (0, 10, 0); ! 3066: return \"SLL %1,16\;SRA %1,16\;LPR %0,%1\"; ! 3067: }") ! 3068: ! 3069: ; ! 3070: ; absdf2 instruction pattern(s). ! 3071: ; ! 3072: ! 3073: (define_insn "absdf2" ! 3074: [(set (match_operand:DF 0 "general_operand" "=f") ! 3075: (abs:DF (match_operand:DF 1 "general_operand" "f")))] ! 3076: "" ! 3077: "* ! 3078: { ! 3079: check_label_emit (); ! 3080: mvs_check_page (0, 2, 0); ! 3081: return \"LPDR %0,%1\"; ! 3082: }") ! 3083: ! 3084: ; ! 3085: ; abssf2 instruction pattern(s). ! 3086: ; ! 3087: ! 3088: (define_insn "abssf2" ! 3089: [(set (match_operand:SF 0 "general_operand" "=f") ! 3090: (abs:SF (match_operand:SF 1 "general_operand" "f")))] ! 3091: "" ! 3092: "* ! 3093: { ! 3094: check_label_emit (); ! 3095: mvs_check_page (0, 2, 0); ! 3096: return \"LPER %0,%1\"; ! 3097: }") ! 3098: ! 3099: ;; ! 3100: ;;- One complement instructions. ! 3101: ;; ! 3102: ! 3103: ; ! 3104: ; one_cmpldi2 instruction pattern(s). ! 3105: ; ! 3106: ! 3107: ;(define_expand "one_cmpldi2" ! 3108: ; [(set (match_operand:DI 0 "general_operand" "") ! 3109: ; (not:DI (match_operand:DI 1 "general_operand" "")))] ! 3110: ; "" ! 3111: ; " ! 3112: ;{ ! 3113: ; rtx gen_one_cmplsi2(); ! 3114: ; ! 3115: ; emit_insn (gen_one_cmplsi2 (operand_subword (operands[0], 0, 1, DImode), ! 3116: ; operand_subword (operands[1], 0, 1, DImode))); ! 3117: ; emit_insn (gen_one_cmplsi2 (gen_lowpart (SImode, operands[0]), ! 3118: ; gen_lowpart (SImode, operands[1]))); ! 3119: ; DONE; ! 3120: ;}") ! 3121: ! 3122: ; ! 3123: ; one_cmplsi2 instruction pattern(s). ! 3124: ; ! 3125: ! 3126: (define_insn "" ! 3127: [(set (match_operand:SI 0 "r_or_s_operand" "=dm") ! 3128: (not:SI (match_operand:SI 1 "r_or_s_operand" "0")))] ! 3129: "TARGET_CHAR_INSTRUCTIONS" ! 3130: "* ! 3131: { ! 3132: check_label_emit (); ! 3133: if (REG_P (operands[0])) ! 3134: { ! 3135: mvs_check_page (0, 4, 4); ! 3136: return \"X %0,=F'-1'\"; ! 3137: } ! 3138: CC_STATUS_INIT; ! 3139: mvs_check_page (0, 6, 4); ! 3140: return \"XC %O0(4,%R0),=F'-1'\"; ! 3141: }") ! 3142: ! 3143: (define_insn "one_cmplsi2" ! 3144: [(set (match_operand:SI 0 "general_operand" "=d") ! 3145: (not:SI (match_operand:SI 1 "general_operand" "0")))] ! 3146: "" ! 3147: "* ! 3148: { ! 3149: check_label_emit (); ! 3150: mvs_check_page (0, 4, 4); ! 3151: return \"X %0,=F'-1'\"; ! 3152: }") ! 3153: ! 3154: ; ! 3155: ; one_cmplhi2 instruction pattern(s). ! 3156: ; ! 3157: ! 3158: (define_insn "" ! 3159: [(set (match_operand:HI 0 "r_or_s_operand" "=dm") ! 3160: (not:HI (match_operand:HI 1 "r_or_s_operand" "0")))] ! 3161: "TARGET_CHAR_INSTRUCTIONS" ! 3162: "* ! 3163: { ! 3164: check_label_emit (); ! 3165: if (REG_P (operands[0])) ! 3166: { ! 3167: mvs_check_page (0, 4, 4); ! 3168: return \"X %0,=F'-1'\"; ! 3169: } ! 3170: CC_STATUS_INIT; ! 3171: mvs_check_page (0, 6, 4); ! 3172: return \"XC %O0(2,%R0),=X'FFFF'\"; ! 3173: }") ! 3174: ! 3175: (define_insn "one_cmplhi2" ! 3176: [(set (match_operand:HI 0 "general_operand" "=d") ! 3177: (not:HI (match_operand:HI 1 "general_operand" "0")))] ! 3178: "" ! 3179: "* ! 3180: { ! 3181: check_label_emit (); ! 3182: mvs_check_page (0, 4, 4); ! 3183: return \"X %0,=F'-1'\"; ! 3184: }") ! 3185: ! 3186: ; ! 3187: ; one_cmplqi2 instruction pattern(s). ! 3188: ; ! 3189: ! 3190: (define_insn "" ! 3191: [(set (match_operand:QI 0 "r_or_s_operand" "=dm") ! 3192: (not:QI (match_operand:QI 1 "r_or_s_operand" "0")))] ! 3193: "TARGET_CHAR_INSTRUCTIONS" ! 3194: "* ! 3195: { ! 3196: check_label_emit (); ! 3197: CC_STATUS_INIT; ! 3198: if (REG_P (operands[0])) ! 3199: { ! 3200: mvs_check_page (0, 4, 4); ! 3201: return \"X %0,=F'-1'\"; ! 3202: } ! 3203: mvs_check_page (0, 4, 0); ! 3204: return \"XI %0,255\"; ! 3205: }") ! 3206: ! 3207: (define_insn "one_cmplqi2" ! 3208: [(set (match_operand:QI 0 "general_operand" "=d") ! 3209: (not:QI (match_operand:QI 1 "general_operand" "0")))] ! 3210: "" ! 3211: "* ! 3212: { ! 3213: check_label_emit (); ! 3214: CC_STATUS_INIT; ! 3215: mvs_check_page (0, 4, 4); ! 3216: return \"X %0,=F'-1'\"; ! 3217: }") ! 3218: ! 3219: ;; ! 3220: ;;- Arithmetic shift instructions. ! 3221: ;; ! 3222: ! 3223: ; ! 3224: ; ashldi3 instruction pattern(s). ! 3225: ; ! 3226: ! 3227: (define_insn "ashldi3" ! 3228: [(set (match_operand:DI 0 "general_operand" "=d") ! 3229: (ashift:DI (match_operand:DI 1 "general_operand" "0") ! 3230: (match_operand:SI 2 "general_operand" "Ja")))] ! 3231: "" ! 3232: "* ! 3233: { ! 3234: check_label_emit (); ! 3235: CC_STATUS_INIT; ! 3236: mvs_check_page (0, 4, 0); ! 3237: if (REG_P (operands[2])) ! 3238: return \"SLDA %0,0(%2)\"; ! 3239: return \"SLDA %0,%c2\"; ! 3240: }") ! 3241: ! 3242: ; ! 3243: ; ashrdi3 instruction pattern(s). ! 3244: ; ! 3245: ! 3246: (define_insn "ashrdi3" ! 3247: [(set (match_operand:DI 0 "register_operand" "=d") ! 3248: (ashiftrt:DI (match_operand:DI 1 "general_operand" "0") ! 3249: (match_operand:SI 2 "general_operand" "Ja")))] ! 3250: "" ! 3251: "* ! 3252: { ! 3253: check_label_emit (); ! 3254: mvs_check_page (0, 4, 0); ! 3255: if (REG_P (operands[2])) ! 3256: return \"SRDA %0,0(%2)\"; ! 3257: return \"SRDA %0,%c2\"; ! 3258: }") ! 3259: ! 3260: ; ! 3261: ; ashlsi3 instruction pattern(s). ! 3262: ; ! 3263: ! 3264: (define_insn "ashlsi3" ! 3265: [(set (match_operand:SI 0 "general_operand" "=d") ! 3266: (ashift:SI (match_operand:SI 1 "general_operand" "0") ! 3267: (match_operand:SI 2 "general_operand" "Ja")))] ! 3268: "" ! 3269: "* ! 3270: { ! 3271: check_label_emit (); ! 3272: CC_STATUS_INIT; ! 3273: mvs_check_page (0, 4, 0); ! 3274: if (REG_P (operands[2])) ! 3275: return \"SLL %0,0(%2)\"; ! 3276: return \"SLL %0,%c2\"; ! 3277: }") ! 3278: ! 3279: ; ! 3280: ; ashrsi3 instruction pattern(s). ! 3281: ; ! 3282: ! 3283: (define_insn "ashrsi3" ! 3284: [(set (match_operand:SI 0 "general_operand" "=d") ! 3285: (ashiftrt:SI (match_operand:SI 1 "general_operand" "0") ! 3286: (match_operand:SI 2 "general_operand" "Ja")))] ! 3287: "" ! 3288: "* ! 3289: { ! 3290: check_label_emit (); ! 3291: mvs_check_page (0, 4, 0); ! 3292: if (REG_P (operands[2])) ! 3293: return \"SRA %0,0(%2)\"; ! 3294: return \"SRA %0,%c2\"; ! 3295: }") ! 3296: ! 3297: ; ! 3298: ; ashlhi3 instruction pattern(s). ! 3299: ; ! 3300: ! 3301: (define_insn "ashlhi3" ! 3302: [(set (match_operand:HI 0 "general_operand" "=d") ! 3303: (ashift:HI (match_operand:HI 1 "general_operand" "0") ! 3304: (match_operand:SI 2 "general_operand" "Ja")))] ! 3305: "" ! 3306: "* ! 3307: { ! 3308: check_label_emit (); ! 3309: mvs_check_page (0, 8, 0); ! 3310: if (REG_P (operands[2])) ! 3311: return \"SLL %0,16(%2)\;SRA %0,16\"; ! 3312: return \"SLL %0,16+%c2\;SRA %0,16\"; ! 3313: }") ! 3314: ! 3315: ; ! 3316: ; ashrhi3 instruction pattern(s). ! 3317: ; ! 3318: ! 3319: (define_insn "ashrhi3" ! 3320: [(set (match_operand:HI 0 "general_operand" "=d") ! 3321: (ashiftrt:HI (match_operand:HI 1 "general_operand" "0") ! 3322: (match_operand:SI 2 "general_operand" "Ja")))] ! 3323: "" ! 3324: "* ! 3325: { ! 3326: check_label_emit (); ! 3327: mvs_check_page (0, 4, 0); ! 3328: if (REG_P (operands[2])) ! 3329: return \"SLL %0,16\;SRA %0,16(%2)\"; ! 3330: return \"SLL %0,16\;SRA %0,16+%c2\"; ! 3331: }") ! 3332: ! 3333: ; ! 3334: ; ashlqi3 instruction pattern(s). ! 3335: ; ! 3336: ! 3337: (define_insn "ashlqi3" ! 3338: [(set (match_operand:QI 0 "general_operand" "=d") ! 3339: (ashift:QI (match_operand:QI 1 "general_operand" "0") ! 3340: (match_operand:SI 2 "general_operand" "Ja")))] ! 3341: "" ! 3342: "* ! 3343: { ! 3344: check_label_emit (); ! 3345: CC_STATUS_INIT; ! 3346: mvs_check_page (0, 4, 0); ! 3347: if (REG_P (operands[2])) ! 3348: return \"SLL %0,0(%2)\"; ! 3349: return \"SLL %0,%c2\"; ! 3350: }") ! 3351: ! 3352: ; ! 3353: ; ashrqi3 instruction pattern(s). ! 3354: ; ! 3355: ! 3356: (define_insn "ashrqi3" ! 3357: [(set (match_operand:QI 0 "general_operand" "=d") ! 3358: (ashiftrt:QI (match_operand:QI 1 "general_operand" "0") ! 3359: (match_operand:SI 2 "general_operand" "Ja")))] ! 3360: "" ! 3361: "* ! 3362: { ! 3363: check_label_emit (); ! 3364: mvs_check_page (0, 8, 0); ! 3365: if (REG_P (operands[2])) ! 3366: return \"SLL %0,24\;SRA %0,24(%2)\"; ! 3367: return \"SLL %0,24\;SRA %0,24+%c2\"; ! 3368: }") ! 3369: ! 3370: ;; ! 3371: ;;- Logical shift instructions. ! 3372: ;; ! 3373: ! 3374: ; ! 3375: ; lshldi3 instruction pattern(s). ! 3376: ; ! 3377: ! 3378: (define_insn "lshldi3" ! 3379: [(set (match_operand:DI 0 "general_operand" "=d") ! 3380: (lshift:DI (match_operand:DI 1 "general_operand" "0") ! 3381: (match_operand:SI 2 "general_operand" "Ja")))] ! 3382: "" ! 3383: "* ! 3384: { ! 3385: check_label_emit (); ! 3386: mvs_check_page (0, 4, 0); ! 3387: if (REG_P (operands[2])) ! 3388: return \"SLDL %0,0(%2)\"; ! 3389: return \"SLDL %0,%c2\"; ! 3390: }") ! 3391: ! 3392: ; ! 3393: ; lshrdi3 instruction pattern(s). ! 3394: ; ! 3395: ! 3396: (define_insn "lshrdi3" ! 3397: [(set (match_operand:DI 0 "general_operand" "=d") ! 3398: (lshiftrt:DI (match_operand:DI 1 "general_operand" "0") ! 3399: (match_operand:SI 2 "general_operand" "Ja")))] ! 3400: "" ! 3401: "* ! 3402: { ! 3403: check_label_emit (); ! 3404: mvs_check_page (0, 4, 0); ! 3405: if (REG_P (operands[2])) ! 3406: return \"SRDL %0,0(%2)\"; ! 3407: return \"SRDL %0,%c2\"; ! 3408: }") ! 3409: ! 3410: ; ! 3411: ; lshlsi3 instruction pattern(s). ! 3412: ; ! 3413: ! 3414: (define_insn "lshlsi3" ! 3415: [(set (match_operand:SI 0 "general_operand" "=d") ! 3416: (lshift:SI (match_operand:SI 1 "general_operand" "0") ! 3417: (match_operand:SI 2 "general_operand" "Ja")))] ! 3418: "" ! 3419: "* ! 3420: { ! 3421: check_label_emit (); ! 3422: mvs_check_page (0, 4, 0); ! 3423: if (REG_P (operands[2])) ! 3424: return \"SLL %0,0(%2)\"; ! 3425: return \"SLL %0,%c2\"; ! 3426: }") ! 3427: ! 3428: ; ! 3429: ; lshrsi3 instruction pattern(s). ! 3430: ; ! 3431: ! 3432: (define_insn "lshrsi3" ! 3433: [(set (match_operand:SI 0 "general_operand" "=d") ! 3434: (lshiftrt:SI (match_operand:SI 1 "general_operand" "0") ! 3435: (match_operand:SI 2 "general_operand" "Ja")))] ! 3436: "" ! 3437: "* ! 3438: { ! 3439: check_label_emit (); ! 3440: mvs_check_page (0, 4, 0); ! 3441: if (REG_P (operands[2])) ! 3442: return \"SRL %0,0(%2)\"; ! 3443: return \"SRL %0,%c2\"; ! 3444: }") ! 3445: ! 3446: ; ! 3447: ; lshlhi3 instruction pattern(s). ! 3448: ; ! 3449: ! 3450: (define_insn "lshlhi3" ! 3451: [(set (match_operand:HI 0 "general_operand" "=d") ! 3452: (lshift:HI (match_operand:HI 1 "general_operand" "0") ! 3453: (match_operand:SI 2 "general_operand" "Ja")))] ! 3454: "" ! 3455: "* ! 3456: { ! 3457: check_label_emit (); ! 3458: CC_STATUS_INIT; ! 3459: mvs_check_page (0, 4, 0); ! 3460: if (REG_P (operands[2])) ! 3461: return \"SLL %0,0(%2)\"; ! 3462: return \"SLL %0,%c2\"; ! 3463: }") ! 3464: ! 3465: ; ! 3466: ; lshrhi3 instruction pattern(s). ! 3467: ; ! 3468: ! 3469: (define_insn "lshrhi3" ! 3470: [(set (match_operand:HI 0 "general_operand" "=d") ! 3471: (lshiftrt:HI (match_operand:HI 1 "general_operand" "0") ! 3472: (match_operand:SI 2 "general_operand" "Ja")))] ! 3473: "" ! 3474: "* ! 3475: { ! 3476: check_label_emit (); ! 3477: CC_STATUS_INIT; ! 3478: if (REG_P (operands[2])) ! 3479: { ! 3480: mvs_check_page (0, 8, 4); ! 3481: return \"N %0,=X'0000FFFF'\;SRL %0,0(%2)\"; ! 3482: } ! 3483: mvs_check_page (0, 8, 4); ! 3484: return \"N %0,=X'0000FFFF'\;SRL %0,%c2\"; ! 3485: }") ! 3486: ! 3487: ; ! 3488: ; lshlqi3 instruction pattern(s). ! 3489: ; ! 3490: ! 3491: (define_insn "lshlqi3" ! 3492: [(set (match_operand:QI 0 "general_operand" "=d") ! 3493: (lshift:QI (match_operand:QI 1 "general_operand" "0") ! 3494: (match_operand:SI 2 "general_operand" "Ja")))] ! 3495: "" ! 3496: "* ! 3497: { ! 3498: check_label_emit (); ! 3499: mvs_check_page (0, 4, 0); ! 3500: if (REG_P (operands[2])) ! 3501: return \"SLL %0,0(%2)\"; ! 3502: return \"SLL %0,%c2\"; ! 3503: }") ! 3504: ! 3505: ; ! 3506: ; lshrqi3 instruction pattern(s). ! 3507: ; ! 3508: ! 3509: (define_insn "lshrqi3" ! 3510: [(set (match_operand:QI 0 "general_operand" "=d") ! 3511: (lshiftrt:QI (match_operand:QI 1 "general_operand" "0") ! 3512: (match_operand:SI 2 "general_operand" "Ja")))] ! 3513: "" ! 3514: "* ! 3515: { ! 3516: check_label_emit (); ! 3517: CC_STATUS_INIT; ! 3518: mvs_check_page (0, 8, 4); ! 3519: if (REG_P (operands[2])) ! 3520: return \"N %0,=X'000000FF'\;SRL %0,0(%2)\"; ! 3521: return \"N %0,=X'000000FF'\;SRL %0,%c2\"; ! 3522: }") ! 3523: ! 3524: ;; ! 3525: ;;- Conditional jump instructions. ! 3526: ;; ! 3527: ! 3528: ; ! 3529: ; beq instruction pattern(s). ! 3530: ; ! 3531: ! 3532: (define_insn "beq" ! 3533: [(set (pc) ! 3534: (if_then_else (eq (cc0) ! 3535: (const_int 0)) ! 3536: (label_ref (match_operand 0 "" "")) ! 3537: (pc)))] ! 3538: "" ! 3539: "* ! 3540: { ! 3541: check_label_emit (); ! 3542: if (!mvs_check_label (CODE_LABEL_NUMBER (operands[0]))) ! 3543: { ! 3544: mvs_check_page (0, 6, 4); ! 3545: return \"L 14,=A(%l0)\;BER 14\"; ! 3546: } ! 3547: if (mvs_check_page (0, 4, 0)) ! 3548: { ! 3549: mvs_check_page (0, 2, 4); ! 3550: return \"L 14,=A(%l0)\;BER 14\"; ! 3551: } ! 3552: return \"BE %l0\"; ! 3553: }") ! 3554: ! 3555: ; ! 3556: ; bne instruction pattern(s). ! 3557: ; ! 3558: ! 3559: (define_insn "bne" ! 3560: [(set (pc) ! 3561: (if_then_else (ne (cc0) ! 3562: (const_int 0)) ! 3563: (label_ref (match_operand 0 "" "")) ! 3564: (pc)))] ! 3565: "" ! 3566: "* ! 3567: { ! 3568: check_label_emit (); ! 3569: if (!mvs_check_label (CODE_LABEL_NUMBER (operands[0]))) ! 3570: { ! 3571: mvs_check_page (0, 6, 4); ! 3572: return \"L 14,=A(%l0)\;BNER 14\"; ! 3573: } ! 3574: if (mvs_check_page (0, 4, 0)) ! 3575: { ! 3576: mvs_check_page (0, 2, 4); ! 3577: return \"L 14,=A(%l0)\;BNER 14\"; ! 3578: } ! 3579: return \"BNE %l0\"; ! 3580: }") ! 3581: ! 3582: ; ! 3583: ; bgt instruction pattern(s). ! 3584: ; ! 3585: ! 3586: (define_insn "bgt" ! 3587: [(set (pc) ! 3588: (if_then_else (gt (cc0) ! 3589: (const_int 0)) ! 3590: (label_ref (match_operand 0 "" "")) ! 3591: (pc)))] ! 3592: "" ! 3593: "* ! 3594: { ! 3595: check_label_emit (); ! 3596: if (!mvs_check_label (CODE_LABEL_NUMBER (operands[0]))) ! 3597: { ! 3598: mvs_check_page (0, 6, 4); ! 3599: return \"L 14,=A(%l0)\;BHR 14\"; ! 3600: } ! 3601: if (mvs_check_page (0, 4, 0)) ! 3602: { ! 3603: mvs_check_page (0, 2, 4); ! 3604: return \"L 14,=A(%l0)\;BHR 14\"; ! 3605: } ! 3606: return \"BH %l0\"; ! 3607: }") ! 3608: ! 3609: ; ! 3610: ; bgtu instruction pattern(s). ! 3611: ; ! 3612: ! 3613: (define_insn "bgtu" ! 3614: [(set (pc) ! 3615: (if_then_else (gtu (cc0) ! 3616: (const_int 0)) ! 3617: (label_ref (match_operand 0 "" "")) ! 3618: (pc)))] ! 3619: "" ! 3620: "* ! 3621: { ! 3622: check_label_emit (); ! 3623: if (!mvs_check_label (CODE_LABEL_NUMBER (operands[0]))) ! 3624: { ! 3625: mvs_check_page (0, 6, 4); ! 3626: return \"L 14,=A(%l0)\;BHR 14\"; ! 3627: } ! 3628: if (mvs_check_page (0, 4, 0)) ! 3629: { ! 3630: mvs_check_page (0, 2, 4); ! 3631: return \"L 14,=A(%l0)\;BHR 14\"; ! 3632: } ! 3633: return \"BH %l0\"; ! 3634: }") ! 3635: ! 3636: ; ! 3637: ; blt instruction pattern(s). ! 3638: ; ! 3639: ! 3640: (define_insn "blt" ! 3641: [(set (pc) ! 3642: (if_then_else (lt (cc0) ! 3643: (const_int 0)) ! 3644: (label_ref (match_operand 0 "" "")) ! 3645: (pc)))] ! 3646: "" ! 3647: "* ! 3648: { ! 3649: check_label_emit (); ! 3650: if (!mvs_check_label (CODE_LABEL_NUMBER (operands[0]))) ! 3651: { ! 3652: mvs_check_page (0, 6, 4); ! 3653: return \"L 14,=A(%l0)\;BLR 14\"; ! 3654: } ! 3655: if (mvs_check_page (0, 4, 0)) ! 3656: { ! 3657: mvs_check_page (0, 2, 4); ! 3658: return \"L 14,=A(%l0)\;BLR 14\"; ! 3659: } ! 3660: return \"BL %l0\"; ! 3661: }") ! 3662: ! 3663: ; ! 3664: ; bltu instruction pattern(s). ! 3665: ; ! 3666: ! 3667: (define_insn "bltu" ! 3668: [(set (pc) ! 3669: (if_then_else (ltu (cc0) ! 3670: (const_int 0)) ! 3671: (label_ref (match_operand 0 "" "")) ! 3672: (pc)))] ! 3673: "" ! 3674: "* ! 3675: { ! 3676: check_label_emit (); ! 3677: if (!mvs_check_label (CODE_LABEL_NUMBER (operands[0]))) ! 3678: { ! 3679: mvs_check_page (0, 6, 4); ! 3680: return \"L 14,=A(%l0)\;BLR 14\"; ! 3681: } ! 3682: if (mvs_check_page (0, 4, 0)) ! 3683: { ! 3684: mvs_check_page (0, 2, 4); ! 3685: return \"L 14,=A(%l0)\;BLR 14\"; ! 3686: } ! 3687: return \"BL %l0\"; ! 3688: }") ! 3689: ! 3690: ; ! 3691: ; bge instruction pattern(s). ! 3692: ; ! 3693: ! 3694: (define_insn "bge" ! 3695: [(set (pc) ! 3696: (if_then_else (ge (cc0) ! 3697: (const_int 0)) ! 3698: (label_ref (match_operand 0 "" "")) ! 3699: (pc)))] ! 3700: "" ! 3701: "* ! 3702: { ! 3703: check_label_emit (); ! 3704: if (!mvs_check_label (CODE_LABEL_NUMBER (operands[0]))) ! 3705: { ! 3706: mvs_check_page (0, 6, 4); ! 3707: return \"L 14,=A(%l0)\;BNLR 14\"; ! 3708: } ! 3709: if (mvs_check_page (0, 4, 0)) ! 3710: { ! 3711: mvs_check_page (0, 2, 4); ! 3712: return \"L 14,=A(%l0)\;BNLR 14\"; ! 3713: } ! 3714: return \"BNL %l0\"; ! 3715: }") ! 3716: ! 3717: ; ! 3718: ; bgeu instruction pattern(s). ! 3719: ; ! 3720: ! 3721: (define_insn "bgeu" ! 3722: [(set (pc) ! 3723: (if_then_else (geu (cc0) ! 3724: (const_int 0)) ! 3725: (label_ref (match_operand 0 "" "")) ! 3726: (pc)))] ! 3727: "" ! 3728: "* ! 3729: { ! 3730: check_label_emit (); ! 3731: if (!mvs_check_label (CODE_LABEL_NUMBER (operands[0]))) ! 3732: { ! 3733: mvs_check_page (0, 6, 4); ! 3734: return \"L 14,=A(%l0)\;BNLR 14\"; ! 3735: } ! 3736: if (mvs_check_page (0, 4, 0)) ! 3737: { ! 3738: mvs_check_page (0, 2, 4); ! 3739: return \"L 14,=A(%l0)\;BNLR 14\"; ! 3740: } ! 3741: return \"BNL %l0\"; ! 3742: }") ! 3743: ! 3744: ; ! 3745: ; ble instruction pattern(s). ! 3746: ; ! 3747: ! 3748: (define_insn "ble" ! 3749: [(set (pc) ! 3750: (if_then_else (le (cc0) ! 3751: (const_int 0)) ! 3752: (label_ref (match_operand 0 "" "")) ! 3753: (pc)))] ! 3754: "" ! 3755: "* ! 3756: { ! 3757: check_label_emit (); ! 3758: if (!mvs_check_label (CODE_LABEL_NUMBER (operands[0]))) ! 3759: { ! 3760: mvs_check_page (0, 6, 4); ! 3761: return \"L 14,=A(%l0)\;BNHR 14\"; ! 3762: } ! 3763: if (mvs_check_page (0, 4, 0)) ! 3764: { ! 3765: mvs_check_page (0, 2, 4); ! 3766: return \"L 14,=A(%l0)\;BNHR 14\"; ! 3767: } ! 3768: return \"BNH %l0\"; ! 3769: }") ! 3770: ! 3771: ; ! 3772: ; bleu instruction pattern(s). ! 3773: ; ! 3774: ! 3775: (define_insn "bleu" ! 3776: [(set (pc) ! 3777: (if_then_else (leu (cc0) ! 3778: (const_int 0)) ! 3779: (label_ref (match_operand 0 "" "")) ! 3780: (pc)))] ! 3781: "" ! 3782: "* ! 3783: { ! 3784: check_label_emit (); ! 3785: if (!mvs_check_label (CODE_LABEL_NUMBER (operands[0]))) ! 3786: { ! 3787: mvs_check_page (0, 6, 4); ! 3788: return \"L 14,=A(%l0)\;BNHR 14\"; ! 3789: } ! 3790: if (mvs_check_page (0, 4, 0)) ! 3791: { ! 3792: mvs_check_page (0, 2, 4); ! 3793: return \"L 14,=A(%l0)\;BNHR 14\"; ! 3794: } ! 3795: return \"BNH %l0\"; ! 3796: }") ! 3797: ! 3798: ;; ! 3799: ;;- Negated conditional jump instructions. ! 3800: ;; ! 3801: ! 3802: (define_insn "" ! 3803: [(set (pc) ! 3804: (if_then_else (eq (cc0) ! 3805: (const_int 0)) ! 3806: (pc) ! 3807: (label_ref (match_operand 0 "" ""))))] ! 3808: "" ! 3809: "* ! 3810: { ! 3811: check_label_emit (); ! 3812: if (!mvs_check_label (CODE_LABEL_NUMBER (operands[0]))) ! 3813: { ! 3814: mvs_check_page (0, 6, 4); ! 3815: return \"L 14,=A(%l0)\;BNER 14\"; ! 3816: } ! 3817: if (mvs_check_page (0, 4, 0)) ! 3818: { ! 3819: mvs_check_page (0, 2, 4); ! 3820: return \"L 14,=A(%l0)\;BNER 14\"; ! 3821: } ! 3822: return \"BNE %l0\"; ! 3823: }") ! 3824: ! 3825: (define_insn "" ! 3826: [(set (pc) ! 3827: (if_then_else (ne (cc0) ! 3828: (const_int 0)) ! 3829: (pc) ! 3830: (label_ref (match_operand 0 "" ""))))] ! 3831: "" ! 3832: "* ! 3833: { ! 3834: check_label_emit (); ! 3835: if (!mvs_check_label (CODE_LABEL_NUMBER (operands[0]))) ! 3836: { ! 3837: mvs_check_page (0, 6, 4); ! 3838: return \"L 14,=A(%l0)\;BER 14\"; ! 3839: } ! 3840: if (mvs_check_page (0, 4, 0)) ! 3841: { ! 3842: mvs_check_page (0, 2, 4); ! 3843: return \"L 14,=A(%l0)\;BER 14\"; ! 3844: } ! 3845: return \"BE %l0\"; ! 3846: }") ! 3847: ! 3848: (define_insn "" ! 3849: [(set (pc) ! 3850: (if_then_else (gt (cc0) ! 3851: (const_int 0)) ! 3852: (pc) ! 3853: (label_ref (match_operand 0 "" ""))))] ! 3854: "" ! 3855: "* ! 3856: { ! 3857: check_label_emit (); ! 3858: if (!mvs_check_label (CODE_LABEL_NUMBER (operands[0]))) ! 3859: { ! 3860: mvs_check_page (0, 6, 4); ! 3861: return \"L 14,=A(%l0)\;BNHR 14\"; ! 3862: } ! 3863: if (mvs_check_page (0, 4, 0)) ! 3864: { ! 3865: mvs_check_page (0, 2, 4); ! 3866: return \"L 14,=A(%l0)\;BNHR 14\"; ! 3867: } ! 3868: return \"BNH %l0\"; ! 3869: }") ! 3870: ! 3871: (define_insn "" ! 3872: [(set (pc) ! 3873: (if_then_else (gtu (cc0) ! 3874: (const_int 0)) ! 3875: (pc) ! 3876: (label_ref (match_operand 0 "" ""))))] ! 3877: "" ! 3878: "* ! 3879: { ! 3880: check_label_emit (); ! 3881: if (!mvs_check_label (CODE_LABEL_NUMBER (operands[0]))) ! 3882: { ! 3883: mvs_check_page (0, 6, 4); ! 3884: return \"L 14,=A(%l0)\;BNHR 14\"; ! 3885: } ! 3886: if (mvs_check_page (0, 4, 0)) ! 3887: { ! 3888: mvs_check_page (0, 2, 4); ! 3889: return \"L 14,=A(%l0)\;BNHR 14\"; ! 3890: } ! 3891: return \"BNH %l0\"; ! 3892: }") ! 3893: ! 3894: (define_insn "" ! 3895: [(set (pc) ! 3896: (if_then_else (lt (cc0) ! 3897: (const_int 0)) ! 3898: (pc) ! 3899: (label_ref (match_operand 0 "" ""))))] ! 3900: "" ! 3901: "* ! 3902: { ! 3903: check_label_emit (); ! 3904: if (!mvs_check_label (CODE_LABEL_NUMBER (operands[0]))) ! 3905: { ! 3906: mvs_check_page (0, 6, 4); ! 3907: return \"L 14,=A(%l0)\;BNLR 14\"; ! 3908: } ! 3909: if (mvs_check_page (0, 4, 0)) ! 3910: { ! 3911: mvs_check_page (0, 2, 4); ! 3912: return \"L 14,=A(%l0)\;BNLR 14\"; ! 3913: } ! 3914: return \"BNL %l0\"; ! 3915: }") ! 3916: ! 3917: (define_insn "" ! 3918: [(set (pc) ! 3919: (if_then_else (ltu (cc0) ! 3920: (const_int 0)) ! 3921: (pc) ! 3922: (label_ref (match_operand 0 "" ""))))] ! 3923: "" ! 3924: "* ! 3925: { ! 3926: check_label_emit (); ! 3927: if (!mvs_check_label (CODE_LABEL_NUMBER (operands[0]))) ! 3928: { ! 3929: mvs_check_page (0, 6, 4); ! 3930: return \"L 14,=A(%l0)\;BNLR 14\"; ! 3931: } ! 3932: if (mvs_check_page (0, 4, 0)) ! 3933: { ! 3934: mvs_check_page (0, 2, 4); ! 3935: return \"L 14,=A(%l0)\;BNLR 14\"; ! 3936: } ! 3937: return \"BNL %l0\"; ! 3938: }") ! 3939: ! 3940: (define_insn "" ! 3941: [(set (pc) ! 3942: (if_then_else (ge (cc0) ! 3943: (const_int 0)) ! 3944: (pc) ! 3945: (label_ref (match_operand 0 "" ""))))] ! 3946: "" ! 3947: "* ! 3948: { ! 3949: check_label_emit (); ! 3950: if (!mvs_check_label (CODE_LABEL_NUMBER (operands[0]))) ! 3951: { ! 3952: mvs_check_page (0, 6, 4); ! 3953: return \"L 14,=A(%l0)\;BLR 14\"; ! 3954: } ! 3955: if (mvs_check_page (0, 4, 0)) ! 3956: { ! 3957: mvs_check_page (0, 2, 4); ! 3958: return \"L 14,=A(%l0)\;BLR 14\"; ! 3959: } ! 3960: return \"BL %l0\"; ! 3961: }") ! 3962: ! 3963: (define_insn "" ! 3964: [(set (pc) ! 3965: (if_then_else (geu (cc0) ! 3966: (const_int 0)) ! 3967: (pc) ! 3968: (label_ref (match_operand 0 "" ""))))] ! 3969: "" ! 3970: "* ! 3971: { ! 3972: check_label_emit (); ! 3973: if (!mvs_check_label (CODE_LABEL_NUMBER (operands[0]))) ! 3974: { ! 3975: mvs_check_page (0, 6, 4); ! 3976: return \"L 14,=A(%l0)\;BLR 14\"; ! 3977: } ! 3978: if (mvs_check_page (0, 4, 0)) ! 3979: { ! 3980: mvs_check_page (0, 2, 4); ! 3981: return \"L 14,=A(%l0)\;BLR 14\"; ! 3982: } ! 3983: return \"BL %l0\"; ! 3984: }") ! 3985: ! 3986: (define_insn "" ! 3987: [(set (pc) ! 3988: (if_then_else (le (cc0) ! 3989: (const_int 0)) ! 3990: (pc) ! 3991: (label_ref (match_operand 0 "" ""))))] ! 3992: "" ! 3993: "* ! 3994: { ! 3995: check_label_emit (); ! 3996: if (!mvs_check_label (CODE_LABEL_NUMBER (operands[0]))) ! 3997: { ! 3998: mvs_check_page (0, 6, 4); ! 3999: return \"L 14,=A(%l0)\;BHR 14\"; ! 4000: } ! 4001: if (mvs_check_page (0, 4, 0)) ! 4002: { ! 4003: mvs_check_page (0, 2, 4); ! 4004: return \"L 14,=A(%l0)\;BHR 14\"; ! 4005: } ! 4006: return \"BH %l0\"; ! 4007: }") ! 4008: ! 4009: (define_insn "" ! 4010: [(set (pc) ! 4011: (if_then_else (leu (cc0) ! 4012: (const_int 0)) ! 4013: (pc) ! 4014: (label_ref (match_operand 0 "" ""))))] ! 4015: "" ! 4016: "* ! 4017: { ! 4018: check_label_emit (); ! 4019: if (!mvs_check_label (CODE_LABEL_NUMBER (operands[0]))) ! 4020: { ! 4021: mvs_check_page (0, 6, 4); ! 4022: return \"L 14,=A(%l0)\;BHR 14\"; ! 4023: } ! 4024: if (mvs_check_page (0, 4, 0)) ! 4025: { ! 4026: mvs_check_page (0, 2, 4); ! 4027: return \"L 14,=A(%l0)\;BHR 14\"; ! 4028: } ! 4029: return \"BH %l0\"; ! 4030: }") ! 4031: ! 4032: ;; ! 4033: ;;- Subtract one and jump if not zero. ! 4034: ;; ! 4035: ! 4036: (define_insn "" ! 4037: [(set (pc) ! 4038: (if_then_else ! 4039: (ne (plus:SI (match_operand:SI 0 "register_operand" "+d") ! 4040: (const_int -1)) ! 4041: (const_int 0)) ! 4042: (label_ref (match_operand 1 "" "")) ! 4043: (pc))) ! 4044: (set (match_dup 0) ! 4045: (plus:SI (match_dup 0) ! 4046: (const_int -1)))] ! 4047: "" ! 4048: "* ! 4049: { ! 4050: check_label_emit (); ! 4051: if (!mvs_check_label (CODE_LABEL_NUMBER (operands[1]))) ! 4052: { ! 4053: mvs_check_page (0, 6, 4); ! 4054: return \"L 14,=A(%l1)\;BCTR %0,14\"; ! 4055: } ! 4056: if (mvs_check_page (0, 4, 0)) ! 4057: { ! 4058: mvs_check_page (0, 2, 4); ! 4059: return \"L 14,=A(%l1)\;BCTR %0,14\"; ! 4060: } ! 4061: return \"BCT %0,%l1\"; ! 4062: }") ! 4063: ! 4064: (define_insn "" ! 4065: [(set (pc) ! 4066: (if_then_else ! 4067: (eq (plus:SI (match_operand:SI 0 "register_operand" "+d") ! 4068: (const_int -1)) ! 4069: (const_int 0)) ! 4070: (pc) ! 4071: (label_ref (match_operand 1 "" "")))) ! 4072: (set (match_dup 0) ! 4073: (plus:SI (match_dup 0) ! 4074: (const_int -1)))] ! 4075: "" ! 4076: "* ! 4077: { ! 4078: check_label_emit (); ! 4079: if (!mvs_check_label (CODE_LABEL_NUMBER (operands[1]))) ! 4080: { ! 4081: mvs_check_page (0, 6, 4); ! 4082: return \"L 14,=A(%l1)\;BCTR %0,14\"; ! 4083: } ! 4084: if (mvs_check_page (0, 4, 0)) ! 4085: { ! 4086: mvs_check_page (0, 2, 4); ! 4087: return \"L 14,=A(%l1)\;BCTR %0,14\"; ! 4088: } ! 4089: return \"BCT %0,%l1\"; ! 4090: }") ! 4091: ! 4092: ;; ! 4093: ;;- Unconditional jump instructions. ! 4094: ;; ! 4095: ! 4096: ; ! 4097: ; jump instruction pattern(s). ! 4098: ; ! 4099: ! 4100: (define_insn "jump" ! 4101: [(set (pc) ! 4102: (label_ref (match_operand 0 "" "")))] ! 4103: "" ! 4104: "* ! 4105: { ! 4106: check_label_emit (); ! 4107: if (!mvs_check_label (CODE_LABEL_NUMBER (operands[0]))) ! 4108: { ! 4109: mvs_check_page (0, 6, 4); ! 4110: return \"L 14,=A(%l0)\;BR 14\"; ! 4111: } ! 4112: if (mvs_check_page (0, 4, 0)) ! 4113: { ! 4114: mvs_check_page (0, 2, 4); ! 4115: return \"L 14,=A(%l0)\;BR 14\"; ! 4116: } ! 4117: return \"B %l0\"; ! 4118: }") ! 4119: ! 4120: ; ! 4121: ; indirect-jump instruction pattern(s). ! 4122: ; ! 4123: ! 4124: (define_insn "indirect_jump" ! 4125: [(set (pc) (match_operand:SI 0 "general_operand" "r"))] ! 4126: "(GET_CODE (operands[0]) != MEM )" ! 4127: "* ! 4128: { ! 4129: check_label_emit (); ! 4130: mvs_check_page (0, 2, 0); ! 4131: return \"BR %0\"; ! 4132: }") ! 4133: ! 4134: ; ! 4135: ; tablejump instruction pattern(s). ! 4136: ; ! 4137: ! 4138: (define_insn "tablejump" ! 4139: [(set (pc) ! 4140: (match_operand:SI 0 "general_operand" "am")) ! 4141: (use (label_ref (match_operand 1 "" "")))] ! 4142: "" ! 4143: "* ! 4144: { ! 4145: check_label_emit (); ! 4146: if (REG_P (operands[0])) ! 4147: { ! 4148: mvs_check_page (0, 6, 0); ! 4149: return \"BR %0\;DS 0F\"; ! 4150: } ! 4151: mvs_check_page (0, 10, 0); ! 4152: return \"L 14,%0\;BR 14\;DS 0F\"; ! 4153: }") ! 4154: ! 4155: ;; ! 4156: ;;- Jump to subroutine. ! 4157: ;; ! 4158: ;; For the C/370 environment the internal functions, ie. sqrt, are called with ! 4159: ;; a non-standard form. So, we must fix it here. There's no BM like IBM. ! 4160: ;; ! 4161: ! 4162: ; ! 4163: ; call instruction pattern(s). ! 4164: ; ! 4165: ! 4166: (define_insn "call" ! 4167: [(call (match_operand:QI 0 "memory_operand" "m") ! 4168: (match_operand:SI 1 "immediate_operand" "i"))] ! 4169: "" ! 4170: "* ! 4171: { ! 4172: static char temp[128]; ! 4173: int i = STACK_POINTER_OFFSET; ! 4174: ! 4175: check_label_emit (); ! 4176: if (mvs_function_check (XSTR (operands[0], 0))) ! 4177: { ! 4178: mvs_check_page (0, 22, 4); ! 4179: sprintf ( temp, \"LA 1,136(,13)\;ST 1,%d(,13)\;LA 1,%d(,13)\;L 15,%%0\;BALR 14,15\;LD 0,136(,13)\", ! 4180: i - 4, i - 4 ); ! 4181: } ! 4182: else ! 4183: { ! 4184: mvs_check_page (0, 10, 4); ! 4185: sprintf ( temp, \"LA 1,%d(,13)\;L 15,%%0\;BALR 14,15\", i ); ! 4186: } ! 4187: return temp; ! 4188: }") ! 4189: ! 4190: ; ! 4191: ; call_value instruction pattern(s). ! 4192: ; ! 4193: ! 4194: (define_insn "call_value" ! 4195: [(set (match_operand 0 "" "rf") ! 4196: (call (match_operand:QI 1 "memory_operand" "m") ! 4197: (match_operand:SI 2 "general_operand" "i")))] ! 4198: "" ! 4199: "* ! 4200: { ! 4201: static char temp[128]; ! 4202: int i = STACK_POINTER_OFFSET; ! 4203: ! 4204: check_label_emit (); ! 4205: if (mvs_function_check (XSTR (operands[1], 0))) ! 4206: { ! 4207: mvs_check_page (0, 22, 4); ! 4208: sprintf ( temp, \"LA 1,136(,13)\;ST 1,%d(,13)\;LA 1,%d(,13)\;L 15,%%1\;BALR 14,15\;LD 0,136(,13)\", ! 4209: i - 4, i - 4 ); ! 4210: } ! 4211: else ! 4212: { ! 4213: mvs_check_page (0, 10, 4); ! 4214: sprintf ( temp, \"LA 1,%d(,13)\;L 15,%%1\;BALR 14,15\", i ); ! 4215: } ! 4216: return temp; ! 4217: }") ! 4218: ! 4219: (define_insn "" ! 4220: [(call (mem:QI (match_operand:SI 0 "" "i")) ! 4221: (match_operand:SI 1 "general_operand" "g"))] ! 4222: "GET_CODE (operands[0]) == SYMBOL_REF" ! 4223: "* ! 4224: { ! 4225: static char temp[128]; ! 4226: int i = STACK_POINTER_OFFSET; ! 4227: ! 4228: check_label_emit (); ! 4229: if (mvs_function_check (XSTR (operands[0], 0))) ! 4230: { ! 4231: mvs_check_page (0, 22, 4); ! 4232: sprintf ( temp, \"LA 1,136(,13)\;ST 1,%d(,13)\;LA 1,%d(,13)\;L 15,%%0\;BALR 14,15\;LD 0,136(,13)\", ! 4233: i - 4, i - 4 ); ! 4234: } ! 4235: else ! 4236: { ! 4237: mvs_check_page (0, 10, 4); ! 4238: sprintf ( temp, \"LA 1,%d(,13)\;L 15,%%0\;BALR 14,15\", i ); ! 4239: } ! 4240: return temp; ! 4241: }") ! 4242: ! 4243: (define_insn "" ! 4244: [(set (match_operand 0 "" "rf") ! 4245: (call (mem:QI (match_operand:SI 1 "" "i")) ! 4246: (match_operand:SI 2 "general_operand" "g")))] ! 4247: "GET_CODE (operands[1]) == SYMBOL_REF" ! 4248: "* ! 4249: { ! 4250: static char temp[128]; ! 4251: int i = STACK_POINTER_OFFSET; ! 4252: ! 4253: check_label_emit (); ! 4254: if (mvs_function_check (XSTR (operands[1], 0))) ! 4255: { ! 4256: mvs_check_page (0, 22, 4); ! 4257: sprintf ( temp, \"LA 1,136(,13)\;ST 1,%d(,13)\;LA 1,%d(,13)\;L 15,%%1\;BALR 14,15\;LD 0,136(,13)\", ! 4258: i - 4, i - 4 ); ! 4259: } ! 4260: else ! 4261: { ! 4262: mvs_check_page (0, 10, 4); ! 4263: sprintf ( temp, \"LA 1,%d(,13)\;L 15,%%1\;BALR 14,15\", i ); ! 4264: } ! 4265: return temp; ! 4266: }") ! 4267: ! 4268: ! 4269: ;; ! 4270: ;;- Miscellaneous instructions. ! 4271: ;; ! 4272: ! 4273: ; ! 4274: ; nop instruction pattern(s). ! 4275: ; ! 4276: ! 4277: (define_insn "nop" ! 4278: [(const_int 0)] ! 4279: "" ! 4280: "* ! 4281: { ! 4282: check_label_emit (); ! 4283: mvs_check_page (0, 2, 0); ! 4284: return \"LR 0,0\"; ! 4285: }") ! 4286:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.