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