|
|
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.