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