|
|
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")
1.1.1.2 ! root 531: (match_operand:SI 2 "general_operand" "rJ,K")))]
1.1 root 532: ""
533: "*
534: {
535: rtx xops[3];
536: if (GET_CODE (operands[2]) == CONST_INT)
537: {
1.1.1.2 ! root 538: if (CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'K'))
1.1 root 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")
1.1.1.2 ! root 610: (match_operand:SI 2 "general_operand" "rKJ")))]
1.1 root 611: ""
612: "*
613: {
614: if (GET_CODE (operands[2]) == CONST_INT)
615: {
1.1.1.2 ! root 616: if (CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'K'))
1.1 root 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")
1.1.1.2 ! root 672: (match_operand:SI 2 "general_operand" "rKJ")))]
1.1 root 673: ""
674: "*
675: {
676: if (GET_CODE (operands[2]) == CONST_INT)
677: {
1.1.1.2 ! root 678: if (CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'K'))
1.1 root 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"
1.1.1.2 ! root 1275: [(set (match_operand:SF 0 "general_operand" "=f,rf,m,f,!rf")
! 1276: (match_operand:SF 1 "general_operand" "f,m,rf,F,rf"))
1.1 root 1277: (clobber (reg:SI 24))]
1278: ""
1279: "*
1280: {
1281: if (GET_CODE (operands[0]) == REG && GET_CODE (operands[1]) == REG)
1.1.1.2 ! root 1282: {
! 1283: if (REGNO (operands[0]) >= 32)
! 1284: {
! 1285: if (REGNO (operands[1]) >= 32)
! 1286: return \"mov.s %0,%1\\t#movsf %1 -> %0 \";
! 1287: return \"mtc1 %1,%0\";
! 1288: }
! 1289: if (REGNO (operands[1]) >= 32)
! 1290: return \"mfc1 %0,%1\";
! 1291: return \"add%: %0,$0,%1\";
! 1292: }
1.1 root 1293:
1294: if (GET_CODE (operands[0]) == REG
1295: && GET_CODE (operands[1]) == CONST_DOUBLE)
1296: {
1297: rtx xops[3];
1298: xops[0] = operands[0];
1299: xops[1] = gen_rtx (CONST_INT, VOIDmode,
1300: (XINT (operands[1], 0))>>16);
1301: xops[2] = gen_rtx (CONST_INT, VOIDmode,
1302: XINT (operands[1], 0));
1303: output_asm_insn (\"lui\\t$24,%x1\\t#move high part of %2\", xops);
1304: xops[1] = gen_rtx (CONST_INT, VOIDmode,
1305: (XINT (operands[1], 0)) & 0xff);
1306: output_asm_insn (\"ori\\t$24,%x1\\t#move low part of %2\", xops);
1307: output_asm_insn (\"mtc1\\t$24,%0\", xops);
1308:
1309: xops[0] = gen_rtx (REG, SFmode, REGNO (xops[0])+1);
1310: xops[1] = gen_rtx (CONST_INT, VOIDmode,
1311: (XINT (operands[1], 1))>>16);
1312: xops[2] = gen_rtx (CONST_INT, VOIDmode,
1313: XINT (operands[1], 1));
1314: output_asm_insn (\"lui\\t$24,%x1\\t#move high part of %2\", xops);
1315: xops[1] = gen_rtx (CONST_INT, VOIDmode,
1316: (XINT (operands[1], 1)) & 0xff);
1317: output_asm_insn (\"ori\\t$24,%x1\\t#move low part of %2\", xops);
1318:
1319: output_asm_insn (\"mtc1\\t$24,%0\", xops);
1320: return \"cvt.s.d\\t %0,%0 \";
1321: }
1322: /* Should say that I am not padding high order
1323: ** bits correctly
1324: */
1325: else if (GET_CODE (operands[0]) == REG)
1.1.1.2 ! root 1326: {
! 1327: if (REGNO (operands[0]) < 32)
! 1328: return \"lw\\t %0,%1\\t#movsf %1 -> %0\";
! 1329: return \"l.s\\t %0,%1\\t#movsf %1 -> %0\";
! 1330: }
1.1 root 1331: else
1.1.1.2 ! root 1332: {
! 1333: if (REGNO (operands[1]) < 32)
! 1334: return \"sw\\t %1,%0\\t#movsf %1 -> %0\";
! 1335: return \"s.s\\t %1,%0\\t#movsf %1 -> %0\";
! 1336: }
1.1 root 1337: }")
1338:
1339: ;; ---
1340:
1341: (define_insn "movdf"
1342: [(set (match_operand:DF 0 "general_operand" "=f,f,m,f,*f,*y")
1343: (match_operand:DF 1 "general_operand" "f,m,f,F,*y,*f"))
1344: (clobber (reg:SI 24))]
1345: ""
1346: "*
1347: {
1348: if (which_alternative > 3)
1349: {
1350: rtx xops[2];
1351:
1352: if (REGNO (operands[1]) == 6)
1353: {
1354: xops[0] = gen_rtx (REG, DFmode, REGNO (operands[0]));
1355: #ifndef DECSTATION
1356: xops[1] = gen_rtx (REG, SImode, REGNO (operands[1])+1);
1357: #else
1358: xops[1] = gen_rtx (REG, SImode, REGNO (operands[1]));
1359: #endif
1360: output_asm_insn (\"mtc1\\t%1,%0\\t# %1 -> %0 \\tcalling sequence trick\"
1361: , xops);
1362: xops[0] = gen_rtx (REG, DFmode, REGNO (operands[0])+1);
1363: #ifndef DECSTATION
1364: xops[1] = gen_rtx (REG, SImode, REGNO (operands[1]));
1365: #else
1366: xops[1] = gen_rtx (REG, SImode, REGNO (operands[1])+1);
1367: #endif
1368: output_asm_insn (\"mtc1\\t%1,%0\\t# %1 -> %0 \\tcalling sequence trick\"
1369: , xops);
1370: return (\"\");
1371: }
1372: else if (REGNO (operands[0]) == 6)
1373: {
1374: xops[0] = gen_rtx (REG, SImode, REGNO (operands[0]));
1375: #ifndef DECSTATION
1376: xops[1] = gen_rtx (REG, DFmode, REGNO (operands[1])+1);
1377: #else
1378: xops[1] = gen_rtx (REG, SImode, REGNO (operands[1]));
1379: #endif
1380: output_asm_insn (\"mfc1\\t%0,%1\\t# %1 -> %0 \\tcalling sequence trick\"
1381: , xops);
1382: xops[0] = gen_rtx (REG, SImode, REGNO (operands[0])+1);
1383: #ifndef DECSTATION
1384: xops[1] = gen_rtx (REG, DFmode, REGNO (operands[1]));
1385: #else
1386: xops[1] = gen_rtx (REG, SImode, REGNO (operands[1])+1);
1387: #endif
1388: output_asm_insn (\"mfc1\\t%0,%1\\t# %1 -> %0 \\tcalling sequence trick\"
1389: , xops);
1390: return (\"\");
1391: }
1392: else
1393: abort_with_insn (insn,
1394: \"Matched *y constraint and register number wrong\");
1395: }
1396: else
1397: {
1398: if (GET_CODE (operands[0]) == REG && GET_CODE (operands[1]) == REG)
1399: return \"mov.d\\t%0,%1\\t#movdf %1 -> %0 \";
1400:
1401: if (GET_CODE (operands[0]) == REG
1402: && GET_CODE (operands[1]) == CONST_DOUBLE)
1403: {
1404: rtx xops[3];
1405: xops[0] = operands[0];
1406: xops[1] = gen_rtx (CONST_INT, VOIDmode,
1407: (XINT (operands[1], 0))>>16);
1408: xops[2] = gen_rtx (CONST_INT, VOIDmode,
1409: XINT (operands[1], 0));
1410: output_asm_insn (\"lui\\t$24,%x1\\t#move high part of %2\", xops);
1411: xops[1] = gen_rtx (CONST_INT, VOIDmode,
1412: (XINT (operands[1], 0)) & 0xff);
1413: output_asm_insn (\"ori\\t$24,%x1\\t#move low part of %2\", xops);
1414: output_asm_insn (\"mtc1\\t%0,$24\", xops);
1415:
1416: xops[0] = gen_rtx (REG, SFmode, REGNO (xops[0])+1);
1417: xops[1] = gen_rtx (CONST_INT, VOIDmode,
1418: (XINT (operands[1], 1))>>16);
1419: xops[2] = gen_rtx (CONST_INT, VOIDmode,
1420: XINT (operands[1], 1));
1421: output_asm_insn (\"lui\\t$24,%x1\\t#move high part of %2\", xops);
1422: xops[1] = gen_rtx (CONST_INT, VOIDmode,
1423: (XINT (operands[1], 1)) & 0xff);
1424: output_asm_insn (\"ori\\t$24,%x1\\t#move low part of %2\", xops);
1425:
1426: output_asm_insn (\"mtc1\\t%0,$24\", xops);
1427: return \"# \";
1428:
1429: }
1430: else if (GET_CODE (operands[0]) == REG)
1431: return \"l.d\\t %0,%1\\t#movdf %1 -> %0\";
1432: else
1433: return \"s.d\\t %1,%0\\t#movdf %1 -> %0\";
1434: }
1435: }")
1436:
1437: (define_insn ""
1438: [(set (match_operand:SF 0 "general_operand" "=f,f,m")
1439: (match_operand:SF 1 "general_operand" "f,m,f"))]
1440: ""
1441: "*
1442: {
1443: if (GET_CODE (operands[0]) == REG && GET_CODE (operands[1]) == REG)
1444: return \"mov.s %0,%1\\t#movsf %1 -> %0 \";
1445:
1446: if (GET_CODE (operands[0]) == REG)
1447: return \"l.s\\t %0,%1\\t#movsf %1 -> %0\";
1448: else
1449: return \"s.s\\t %1,%0\\t#movsf %1 -> %0\";
1450: }")
1451:
1452: ;; ---
1453:
1454: (define_insn ""
1455: [(set (match_operand:DF 0 "general_operand" "=f,f,m,*f,*y")
1456: (match_operand:DF 1 "general_operand" "f,m,f,*y,*f"))]
1457: ""
1458: "*
1459: {
1460: if (which_alternative > 2)
1461: {
1462: rtx xops[2];
1463: if (REGNO (operands[1]) == 6)
1464: {
1465: xops[0] = gen_rtx (REG, DFmode, REGNO (operands[0]));
1466: #ifndef DECSTATION
1467: xops[1] = gen_rtx (REG, SImode, REGNO (operands[1])+1);
1468: #else
1469: xops[1] = gen_rtx (REG, SImode, REGNO (operands[1]));
1470: #endif
1471: output_asm_insn (\"mtc1\\t%1,%0\\t# %1 -> %0 \\tcalling sequence trick\"
1472: , xops);
1473: xops[0] = gen_rtx (REG, DFmode, REGNO (operands[0])+1);
1474: #ifndef DECSTATION
1475: xops[1] = gen_rtx (REG, SImode, REGNO (operands[1]));
1476: #else
1477: xops[1] = gen_rtx (REG, SImode, REGNO (operands[1])+1);
1478: #endif
1479: output_asm_insn (\"mtc1\\t%1,%0\\t# %1 -> %0 \\tcalling sequence trick\"
1480: , xops);
1481: return (\"\");
1482: }
1483: else if (REGNO (operands[0]) == 6)
1484: {
1485: xops[0] = gen_rtx (REG, SImode, REGNO (operands[0]));
1486: #ifndef DECSTATION
1487: xops[1] = gen_rtx (REG, DFmode, REGNO (operands[1])+1);
1488: #else
1489: xops[1] = gen_rtx (REG, SImode, REGNO (operands[1]));
1490: #endif
1491: output_asm_insn (\"mfc1\\t%0,%1\\t# %1 -> %0 \\tcalling sequence trick\"
1492: , xops);
1493: xops[0] = gen_rtx (REG, SImode, REGNO (operands[0])+1);
1494: #ifndef DECSTATION
1495: xops[1] = gen_rtx (REG, DFmode, REGNO (operands[1]));
1496: #else
1497: xops[1] = gen_rtx (REG, SImode, REGNO (operands[1])+1);
1498: #endif
1499: output_asm_insn (\"mfc1\\t%0,%1\\t# %1 -> %0 \\tcalling sequence trick\"
1500: , xops);
1501: return (\"\");
1502: }
1503: else
1504: abort_with_insn (insn,
1505: \"Matched *y constraint and register number wrong\");
1506: }
1507: else
1508: {
1509: if ((GET_CODE (operands[0]) == REG) && (GET_CODE (operands[1]) == REG))
1510: return \"mov.d\\t%0,%1\\t#movdf %1 -> %0 \";
1511:
1512: if (GET_CODE (operands[0]) == REG)
1513: return \"l.d\\t %0,%1\\t#movdf %1 -> %0\";
1514: else
1515: return \"s.d\\t %1,%0\\t#movdf %1 -> %0\";
1516: }
1517: }")
1518:
1519: (define_insn ""
1520: [(set (match_operand:SI 0 "general_operand" "=r")
1521: (match_operand:QI 1 "general_operand" "r"))]
1522: ""
1523: "andi\\t%0,%1,0xff\\t#Wild zero_extendqisi2\\t %1 -> %0")
1524:
1525:
1526:
1527:
1528: ;;
1529: ;; ....................
1530: ;;
1531: ;; OTHER ARITHMETIC AND SHIFT
1532: ;;
1533: ;; ....................
1534:
1535: (define_insn "ashlqi3"
1536: [(set (match_operand:QI 0 "general_operand" "=r")
1537: (ashift:QI (match_operand:QI 1 "general_operand" "r")
1538: (match_operand:SI 2 "arith32_operand" "ri")))]
1539: ""
1540: "*
1541: {
1542: if (GET_CODE (operands[2]) == CONST_INT)
1543: {
1544: operands[2] = gen_rtx (CONST_INT, VOIDmode, (XINT (operands[2], 0))& 0x1f);
1545: output_asm_insn (\"sll\\t%0,%1,%2\\t#ashlqi3\\t (%1<<%2) -> %0\", operands);
1546: }
1547: else
1548: output_asm_insn (\"sll\\t%0,%1,%2\\t#ashlqi3\\t (%1<<%2) -> %0 (asm syntax)\",
1549: operands);
1550: return \"andi\\t%0,%0,0xff\\t#ashlqi3\";
1551: }")
1552:
1553:
1554:
1555: (define_insn "ashlhi3"
1556: [(set (match_operand:HI 0 "general_operand" "=r")
1557: (ashift:HI (match_operand:HI 1 "general_operand" "r")
1558: (match_operand:SI 2 "arith32_operand" "ri")))]
1559: ""
1560: "*
1561: {
1562: if (GET_CODE (operands[2]) == CONST_INT)
1563: {
1564: operands[2] = gen_rtx (CONST_INT, VOIDmode, (XINT (operands[2], 0))& 0x1f);
1565: output_asm_insn (\"sll\\t%0,%1,%2\\t#ashlhi3\\t (%1<<%2) -> %0\",
1566: operands);
1567: }
1568: else
1569: output_asm_insn (\"sll\\t%0,%1,%2\\t#ashlhi3\\t (%1<<%2) -> %0 (asm syntax)\",
1570: operands);
1571: return \"sll\\t%0,%0,0x10\;sra\\t%0,%0,0x10\\t#ashlhi3\";
1572: }")
1573:
1574:
1575:
1576: (define_insn "ashlsi3"
1577: [(set (match_operand:SI 0 "general_operand" "=r")
1578: (ashift:SI (match_operand:SI 1 "general_operand" "r")
1579: (match_operand:SI 2 "arith32_operand" "ri")))]
1580: ""
1581: "*
1582: {
1583: if (GET_CODE (operands[2]) == CONST_INT)
1584: {
1585: operands[2] = gen_rtx (CONST_INT, VOIDmode, (XINT (operands[2], 0))& 0x1f);
1586: return \"sll\\t%0,%1,%2\\t#ashlsi3\\t (%1<<%2) -> %0\";
1587: }
1588: return \"sll\\t%0,%1,%2\\t#ashlsi3\\t (%1<<%2) -> %0 (asm syntax)\";
1589: }")
1590:
1591:
1592:
1593: (define_insn "ashrsi3"
1594: [(set (match_operand:SI 0 "general_operand" "=r")
1595: (ashiftrt:SI (match_operand:SI 1 "general_operand" "r")
1596: (match_operand:SI 2 "arith32_operand" "ri")))]
1597: ""
1598: "*
1599: {
1600: if (GET_CODE (operands[2]) == CONST_INT)
1601: {
1602: operands[2] = gen_rtx (CONST_INT, VOIDmode, (XINT (operands[2], 0))& 0x1f);
1603: return \"sra\\t%0,%1,%2\\t#ashrsi3\\t (%1>>%2) -> %0\";
1604: }
1605: return \"sra\\t%0,%1,%2\\t#ashrsi3\\t (%1>>%2) -> %0 (asm syntax for srav)\";
1606: }")
1607:
1608:
1609:
1610: (define_insn "lshrsi3"
1611: [(set (match_operand:SI 0 "general_operand" "=r")
1612: (lshiftrt:SI (match_operand:SI 1 "general_operand" "r")
1613: (match_operand:SI 2 "arith32_operand" "rn")))]
1614: ""
1615: "*
1616: {
1617: if (GET_CODE (operands[2]) == CONST_INT)
1618: {
1619: operands[2] = gen_rtx (CONST_INT, VOIDmode, (XINT (operands[2], 0))& 0x1f);
1620: return \"srl\\t%0,%1,%2\\t#lshrsi3\\t (%1>>%2) -> %0\";
1621: }
1622: return \"srl\\t%0,%1,%2\\t#lshrsi3\\t (%1>>%2) -> %0 (asm syntax)\";
1623: }")
1624:
1625:
1626:
1627:
1628: (define_insn "negsi2"
1629: [(set (match_operand:SI 0 "general_operand" "=r")
1.1.1.2 ! root 1630: (neg:SI (match_operand:SI 1 "general_operand" "r")))]
1.1 root 1631: ""
1632: "sub%:\\t%0,$0,%1\\t#negsi2")
1633:
1634:
1635: (define_insn "negdf2"
1636: [(set (match_operand:DF 0 "general_operand" "=f")
1637: (neg:DF (match_operand:DF 1 "general_operand" "f")))]
1638: ""
1639: "neg.d\\t%0,%1\\t#negdf2")
1640:
1641:
1642:
1643: (define_insn "negsf2"
1644:
1645: [(set (match_operand:SF 0 "general_operand" "=f")
1646: (neg:SF (match_operand:SF 1 "general_operand" "f")))]
1647: ""
1648: "neg.s\\t%0,%1\\t#negsf2")
1649:
1650:
1651: (define_insn "one_cmplsi2"
1652: [(set (match_operand:SI 0 "general_operand" "=r")
1.1.1.2 ! root 1653: (not:SI (match_operand:SI 1 "general_operand" "r")))]
1.1 root 1654: ""
1655: "nor\\t%0,$0,%1\\t#one_cmplsi2")
1656:
1657:
1658:
1659: (define_insn "one_cmplhi2"
1660: [(set (match_operand:HI 0 "general_operand" "=r")
1.1.1.2 ! root 1661: (not:HI (match_operand:HI 1 "general_operand" "r")))]
1.1 root 1662: ""
1663: "nor\\t%0,$0,%1\\t#one_cmplhi2")
1664:
1665:
1666:
1667: (define_insn "one_cmplqi2"
1668: [(set (match_operand:QI 0 "general_operand" "=r")
1.1.1.2 ! root 1669: (not:QI (match_operand:QI 1 "general_operand" "r")))]
1.1 root 1670: ""
1671: "nor\\t%0,$0,%1\\t#one_cmplqi2")
1672:
1673: ;;
1674: ;; ....................
1675: ;;
1676: ;; BRANCHES
1677: ;;
1678: ;; ....................
1679:
1680:
1681: ;;- MERGED CMPSI + BEQ
1682: (define_peephole
1683: [(set (cc0)
1684: (compare (match_operand:SI 0 "general_operand" "r")
1685: (match_operand:SI 1 "general_operand" "r")))
1686: (set (pc)
1687: (if_then_else (eq (cc0)
1688: (const_int 0))
1689: (label_ref (match_operand 2 "" ""))
1690: (pc)))]
1691: ""
1692: "beq \\t%0,%1,%l2\\t#beq MIPS primitive insn")
1693:
1694: ;;- MERGED CMPSI + INV BEQ
1695: (define_peephole
1696: [(set (cc0)
1697: (compare (match_operand:SI 0 "general_operand" "r")
1698: (match_operand:SI 1 "general_operand" "r")))
1699: (set (pc)
1700: (if_then_else (ne (cc0)
1701: (const_int 0))
1702: (pc)
1703: (label_ref (match_operand 2 "" ""))))]
1704: ""
1705: "beq \\t%0,%1,%l2\\t#beq inverted primitive insn")
1706: ;;- MERGED CMPSI + BNE
1707: (define_peephole
1708: [(set (cc0)
1709: (compare (match_operand:SI 0 "general_operand" "r")
1710: (match_operand:SI 1 "general_operand" "r")))
1711: (set (pc)
1712: (if_then_else (ne (cc0)
1713: (const_int 0))
1714: (label_ref (match_operand 2 "" ""))
1715: (pc)))]
1716: ""
1717: "bne \\t%0,%1,%l2\\t#bne MIPS primitive insn")
1718:
1719: ;;- MERGED CMPSI + INV BNE
1720: (define_peephole
1721: [(set (cc0)
1722: (compare (match_operand:SI 0 "general_operand" "r")
1723: (match_operand:SI 1 "general_operand" "r")))
1724: (set (pc)
1725: (if_then_else (eq (cc0)
1726: (const_int 0))
1727: (pc)
1728: (label_ref (match_operand 2 "" ""))))]
1729: ""
1730: "bne \\t%0,%1,%l2\\t#bne inverted primitive insn")
1731:
1732: ;;- MERGED CMPSI + BGT
1733: (define_peephole
1734: [(set (cc0)
1735: (compare (match_operand:SI 0 "general_operand" "r")
1736: (match_operand:SI 1 "general_operand" "r")))
1737: (set (pc)
1738: (if_then_else (gt (cc0)
1739: (const_int 0))
1740: (label_ref (match_operand 2 "" ""))
1741: (pc)))]
1742: ""
1743: "bgt \\t%0,%1,%l2\\t#bgt MIPS composite insn")
1744:
1745: ;;- MERGED CMPSI + INV BGT
1746: (define_peephole
1747: [(set (cc0)
1748: (compare (match_operand:SI 0 "general_operand" "r")
1749: (match_operand:SI 1 "general_operand" "r")))
1750: (set (pc)
1751: (if_then_else (le (cc0)
1752: (const_int 0))
1753: (pc)
1754: (label_ref (match_operand 2 "" ""))))]
1755: ""
1756: "bgt \\t%0,%1,%l2\\t#bgt inverted composite insn")
1757: ;;- MERGED CMPSI + BLT
1758: (define_peephole
1759: [(set (cc0)
1760: (compare (match_operand:SI 0 "general_operand" "r")
1761: (match_operand:SI 1 "general_operand" "r")))
1762: (set (pc)
1763: (if_then_else (lt (cc0)
1764: (const_int 0))
1765: (label_ref (match_operand 2 "" ""))
1766: (pc)))]
1767: ""
1768: "blt \\t%0,%1,%l2\\t#blt MIPS composite insn")
1769:
1770: ;;- MERGED CMPSI + INV BLT
1771: (define_peephole
1772: [(set (cc0)
1773: (compare (match_operand:SI 0 "general_operand" "r")
1774: (match_operand:SI 1 "general_operand" "r")))
1775: (set (pc)
1776: (if_then_else (ge (cc0)
1777: (const_int 0))
1778: (pc)
1779: (label_ref (match_operand 2 "" ""))))]
1780: ""
1781: "blt \\t%0,%1,%l2\\t#blt inverted composite insn")
1782: ;;- MERGED CMPSI + BGE
1783: (define_peephole
1784: [(set (cc0)
1785: (compare (match_operand:SI 0 "general_operand" "r")
1786: (match_operand:SI 1 "general_operand" "r")))
1787: (set (pc)
1788: (if_then_else (ge (cc0)
1789: (const_int 0))
1790: (label_ref (match_operand 2 "" ""))
1791: (pc)))]
1792: ""
1793: "bge \\t%0,%1,%l2\\t#bge composite insn")
1794:
1795: ;;- MERGED CMPSI + INV BGE
1796: (define_peephole
1797: [(set (cc0)
1798: (compare (match_operand:SI 0 "general_operand" "r")
1799: (match_operand:SI 1 "general_operand" "r")))
1800: (set (pc)
1801: (if_then_else (lt (cc0)
1802: (const_int 0))
1803: (pc)
1804: (label_ref (match_operand 2 "" ""))))]
1805: ""
1806: "bge \\t%0,%1,%l2\\t#bge inverted composite insn")
1807: ;;- MERGED CMPSI + BLE
1808: (define_peephole
1809: [(set (cc0)
1810: (compare (match_operand:SI 0 "general_operand" "r")
1811: (match_operand:SI 1 "general_operand" "r")))
1812: (set (pc)
1813: (if_then_else (le (cc0)
1814: (const_int 0))
1815: (label_ref (match_operand 2 "" ""))
1816: (pc)))]
1817: ""
1818: "ble \\t%0,%1,%l2\\t#ble composite insn")
1819:
1820: ;;- MERGED CMPSI + INV BLE
1821: (define_peephole
1822: [(set (cc0)
1823: (compare (match_operand:SI 0 "general_operand" "r")
1824: (match_operand:SI 1 "general_operand" "r")))
1825: (set (pc)
1826: (if_then_else (gt (cc0)
1827: (const_int 0))
1828: (pc)
1829: (label_ref (match_operand 2 "" ""))))]
1830: ""
1831: "ble \\t%0,%1,%l2\\t#ble inverted composite insn")
1832:
1833:
1834: ;;- MERGED CMPSI + BGT
1835: (define_peephole
1836: [(set (cc0)
1837: (compare (match_operand:SI 0 "general_operand" "r")
1838: (match_operand:SI 1 "general_operand" "r")))
1839: (set (pc)
1840: (if_then_else (gtu (cc0)
1841: (const_int 0))
1842: (label_ref (match_operand 2 "" ""))
1843: (pc)))]
1844: ""
1845: "bgtu \\t%0,%1,%l2\\t#bgtu MIPS composite insn")
1846:
1847: ;;- MERGED CMPSI + INV BGT
1848: (define_peephole
1849: [(set (cc0)
1850: (compare (match_operand:SI 0 "general_operand" "r")
1851: (match_operand:SI 1 "general_operand" "r")))
1852: (set (pc)
1853: (if_then_else (leu (cc0)
1854: (const_int 0))
1855: (pc)
1856: (label_ref (match_operand 2 "" ""))))]
1857: ""
1858: "bgtu \\t%0,%1,%l2\\t#bgtu inverted composite insn")
1859: ;;- MERGED CMPSI + INV BLTU
1860: (define_peephole
1861: [(set (cc0)
1862: (compare (match_operand:SI 0 "general_operand" "r")
1863: (match_operand:SI 1 "general_operand" "r")))
1864: (set (pc)
1865: (if_then_else (geu (cc0)
1866: (const_int 0))
1867: (pc)
1868: (label_ref (match_operand 2 "" ""))))]
1869: ""
1870: "bltu \\t%0,%1,%l2\\t#blt inverted composite insn")
1871: ;;- MERGED CMPSI + BGEU
1872: (define_peephole
1873: [(set (cc0)
1874: (compare (match_operand:SI 0 "general_operand" "r")
1875: (match_operand:SI 1 "general_operand" "r")))
1876: (set (pc)
1877: (if_then_else (geu (cc0)
1878: (const_int 0))
1879: (label_ref (match_operand 2 "" ""))
1880: (pc)))]
1881: ""
1882: "bgeu \\t%0,%1,%l2\\t#bgeu composite insn")
1883:
1884: ;;- MERGED CMPSI + INV BGEU
1885: (define_peephole
1886: [(set (cc0)
1887: (compare (match_operand:SI 0 "general_operand" "r")
1888: (match_operand:SI 1 "general_operand" "r")))
1889: (set (pc)
1890: (if_then_else (ltu (cc0)
1891: (const_int 0))
1892: (pc)
1893: (label_ref (match_operand 2 "" ""))))]
1894: ""
1895: "bgeu \\t%0,%1,%l2\\t#bgeu inverted composite insn")
1896: ;;- MERGED CMPSI + BLE
1897: (define_peephole
1898: [(set (cc0)
1899: (compare (match_operand:SI 0 "general_operand" "r")
1900: (match_operand:SI 1 "general_operand" "r")))
1901: (set (pc)
1902: (if_then_else (leu (cc0)
1903: (const_int 0))
1904: (label_ref (match_operand 2 "" ""))
1905: (pc)))]
1906: ""
1907: "bleu \\t%0,%1,%l2\\t#bleu composite insn")
1908:
1909: ;;- MERGED CMPSI + INV BLE
1910: (define_peephole
1911: [(set (cc0)
1912: (compare (match_operand:SI 0 "general_operand" "r")
1913: (match_operand:SI 1 "general_operand" "r")))
1914: (set (pc)
1915: (if_then_else (gtu (cc0)
1916: (const_int 0))
1917: (pc)
1918: (label_ref (match_operand 2 "" ""))))]
1919: ""
1920: "bleu \\t%0,%1,%l2\\t#bleu inverted composite insn")
1921: ;;- MERGED CMPSI + BLTU
1922: (define_peephole
1923: [(set (cc0)
1924: (compare (match_operand:SI 0 "general_operand" "r")
1925: (match_operand:SI 1 "general_operand" "r")))
1926: (set (pc)
1927: (if_then_else (ltu (cc0)
1928: (const_int 0))
1929: (label_ref (match_operand 2 "" ""))
1930: (pc)))]
1931: ""
1932: "bltu \\t%0,%1,%l2\\t#bltu MIPS composite insn")
1933:
1934: ;;- MERGED CMPSI + INV BLTU
1935: (define_peephole
1936: [(set (cc0)
1937: (compare (match_operand:SI 0 "general_operand" "r")
1938: (match_operand:SI 1 "general_operand" "r")))
1939: (set (pc)
1940: (if_then_else (geu (cc0)
1941: (const_int 0))
1942: (pc)
1943: (label_ref (match_operand 2 "" ""))))]
1944: ""
1945: "bltu \\t%0,%1,%l2\\t#bltu inverted composite insn")
1946:
1947: ;;- FLOATING POINT CASES
1948: ;;- --------------------
1949:
1950: ;;- MERGED CMPSF + BEQ
1951: (define_peephole
1952: [(set (cc0)
1953: (compare (match_operand:SF 0 "general_operand" "f")
1954: (match_operand:SF 1 "general_operand" "f")))
1955: (set (pc)
1956: (if_then_else (eq (cc0)
1957: (const_int 0))
1958: (label_ref (match_operand 2 "" ""))
1959: (pc)))]
1960: ""
1961: "c.eq.s\\t%0,%1\\t# Merged CMPSF + BEQ \;bc1t\\t%l2\\t# Merged CMPSF + BEQ ")
1962:
1963: ;;- MERGED CMPSF + INV BEQ
1964:
1965: (define_peephole
1966: [(set (cc0)
1967: (compare (match_operand:SF 0 "general_operand" "f")
1968: (match_operand:SF 1 "general_operand" "f")))
1969: (set (pc)
1970: (if_then_else (ne (cc0)
1971: (const_int 0))
1972: (pc)
1973: (label_ref (match_operand 2 "" ""))))]
1974: ""
1975: "c.eq.s\\t%0,%1\\t# Merged CMPSF + BEQ \;bc1t\\t%l2\\t# Merged CMPSF + BEQ ")
1976:
1977: ;;- MERGED CMPSF + BNE
1978:
1979: (define_peephole
1980: [(set (cc0)
1981: (compare (match_operand:SF 0 "general_operand" "f")
1982: (match_operand:SF 1 "general_operand" "f")))
1983: (set (pc)
1984: (if_then_else (ne (cc0)
1985: (const_int 0))
1986: (label_ref (match_operand 2 "" ""))
1987: (pc)))]
1988: ""
1989: "c.eq.s\\t%0,%1\\t# Merged CMPSF + BNE \;bc1f\\t%l2\\t# Merged CMPSF + BNE ")
1990:
1991: ;;- MERGED CMPSF + INV BNE
1992: (define_peephole
1993: [(set (cc0)
1994: (compare (match_operand:SF 0 "general_operand" "f")
1995: (match_operand:SF 1 "general_operand" "f")))
1996: (set (pc)
1997: (if_then_else (eq (cc0)
1998: (const_int 0))
1999: (pc)
2000: (label_ref (match_operand 2 "" ""))))]
2001: ""
2002: "c.eq.s\\t%0,%1\\t# Merged CMPSF + I.BNE \;bc1f\\t%l2\\t# Merged CMPSF +I.BNE ")
2003:
2004: ;;- MERGED CMPSF + BGT
2005: (define_peephole
2006: [(set (cc0)
2007: (compare (match_operand:SF 0 "general_operand" "f")
2008: (match_operand:SF 1 "general_operand" "f")))
2009: (set (pc)
2010: (if_then_else (gt (cc0)
2011: (const_int 0))
2012: (label_ref (match_operand 2 "" ""))
2013: (pc)))]
2014: ""
2015: "c.le.s\\t%0,%1\\t# Merged CMPSF + BGT \;bc1f\\t%l2\\t# Merged CMPSF + BGT ")
2016:
2017: ;;- MERGED CMPSF + INV BGT
2018: (define_peephole
2019: [(set (cc0)
2020: (compare (match_operand:SF 0 "general_operand" "f")
2021: (match_operand:SF 1 "general_operand" "f")))
2022: (set (pc)
2023: (if_then_else (le (cc0)
2024: (const_int 0))
2025: (pc)
2026: (label_ref (match_operand 2 "" ""))))]
2027: ""
2028: "c.le.s\\t%0,%1\\t# Merged CMPSF + I.BGT \;bc1f\\t%l2\\t# Merged CMPSF +I. BGT ")
2029:
2030: ;;- MERGED CMPSF + BLT
2031: (define_peephole
2032: [(set (cc0)
2033: (compare (match_operand:SF 0 "general_operand" "f")
2034: (match_operand:SF 1 "general_operand" "f")))
2035: (set (pc)
2036: (if_then_else (lt (cc0)
2037: (const_int 0))
2038: (label_ref (match_operand 2 "" ""))
2039: (pc)))]
2040: ""
2041: "c.lt.s\\t%0,%1\\t# Merged CMPSF + BLT \;bc1t\\t%l2\\t# Merged CMPSF + BLT ")
2042:
2043: ;;- MERGED CMPSF + INV BLT
2044: (define_peephole
2045: [(set (cc0)
2046: (compare (match_operand:SF 0 "general_operand" "f")
2047: (match_operand:SF 1 "general_operand" "f")))
2048: (set (pc)
2049: (if_then_else (ge (cc0)
2050: (const_int 0))
2051: (pc)
2052: (label_ref (match_operand 2 "" ""))))]
2053: ""
2054: "c.lt.s\\t%0,%1\\t# Merged CMPSF + I.BLT \;bc1t\\t%l2\\t# Merged CMPSF + I.BLT ")
2055:
2056: ;;- MERGED CMPSF + BGE
2057: (define_peephole
2058: [(set (cc0)
2059: (compare (match_operand:SF 0 "general_operand" "f")
2060: (match_operand:SF 1 "general_operand" "f")))
2061: (set (pc)
2062: (if_then_else (ge (cc0)
2063: (const_int 0))
2064: (label_ref (match_operand 2 "" ""))
2065: (pc)))]
2066: ""
2067: "c.lt.s\\t%0,%1\\t# Merged CMPSF + BGE \;bc1f\\t%l2\\t# Merged CMPSF + BGE")
2068:
2069: ;;- MERGED CMPSF + INV BGE
2070: (define_peephole
2071: [(set (cc0)
2072: (compare (match_operand:SF 0 "general_operand" "f")
2073: (match_operand:SF 1 "general_operand" "f")))
2074: (set (pc)
2075: (if_then_else (lt (cc0)
2076: (const_int 0))
2077: (pc)
2078: (label_ref (match_operand 2 "" ""))))]
2079: ""
2080: "c.lt.s\\t%0,%1\\t# Merged CMPSF +INV BGE \;bc1f\\t%l2\\t# Merged CMPSF +INV BGE ")
2081: ;;- MERGED CMPSF + BLE
2082: (define_peephole
2083: [(set (cc0)
2084: (compare (match_operand:SF 0 "general_operand" "f")
2085: (match_operand:SF 1 "general_operand" "f")))
2086: (set (pc)
2087: (if_then_else (le (cc0)
2088: (const_int 0))
2089: (label_ref (match_operand 2 "" ""))
2090: (pc)))]
2091: ""
2092: "c.le.s\\t%0,%1\\t# Merged CMPSF + BLE \;bc1t\\t%l2\\t# Merged CMPSF + BLE ")
2093:
2094: ;;- MERGED CMPSF + INV BLE
2095: (define_peephole
2096: [(set (cc0)
2097: (compare (match_operand:SF 0 "general_operand" "f")
2098: (match_operand:SF 1 "general_operand" "f")))
2099: (set (pc)
2100: (if_then_else (gt (cc0)
2101: (const_int 0))
2102: (pc)
2103: (label_ref (match_operand 2 "" ""))))]
2104: ""
2105: "c.le.s\\t%0,%1\\t# Merged CMPSF + INV BLE \;bc1t\\t%l2\\t# Merged CMPSF +I. BLE")
2106:
2107: ;;- DOUBLE FLOATING POINT CASES
2108: ;;- --------------------
2109:
2110: ;;- MERGED CMPDF + BEQ
2111:
2112: (define_peephole
2113: [(set (cc0)
2114: (compare (match_operand:DF 0 "general_operand" "f")
2115: (match_operand:DF 1 "general_operand" "f")))
2116: (set (pc)
2117: (if_then_else (eq (cc0)
2118: (const_int 0))
2119: (label_ref (match_operand 2 "" ""))
2120: (pc)))]
2121: ""
2122: "c.eq.d\\t%0,%1\\t# Merged CMPDF + BEQ \;bc1t\\t%l2\\t# Merged CMPDF + BEQ ")
2123:
2124: ;;- MERGED CMPDF + INV BEQ
2125:
2126: (define_peephole
2127: [(set (cc0)
2128: (compare (match_operand:DF 0 "general_operand" "f")
2129: (match_operand:DF 1 "general_operand" "f")))
2130: (set (pc)
2131: (if_then_else (ne (cc0)
2132: (const_int 0))
2133: (pc)
2134: (label_ref (match_operand 2 "" ""))))]
2135: ""
2136: "c.eq.d\\t%0,%1\\t# Merged CMPDF + I.BEQ \;bc1t\\t%l2\\t# Merged CMPDF +I. BEQ ")
2137:
2138: ;;- MERGED CMPDF + BNE
2139:
2140: (define_peephole
2141: [(set (cc0)
2142: (compare (match_operand:DF 0 "general_operand" "f")
2143: (match_operand:DF 1 "general_operand" "f")))
2144: (set (pc)
2145: (if_then_else (ne (cc0)
2146: (const_int 0))
2147: (label_ref (match_operand 2 "" ""))
2148: (pc)))]
2149: ""
2150: "c.eq.d\\t%0,%1\\t# Merged CMPDF + BNE \;bc1f\\t%l2\\t# Merged CMPDF + BNE ")
2151:
2152: ;;- MERGED CMPDF + INV BNE
2153: (define_peephole
2154: [(set (cc0)
2155: (compare (match_operand:DF 0 "general_operand" "f")
2156: (match_operand:DF 1 "general_operand" "f")))
2157: (set (pc)
2158: (if_then_else (eq (cc0)
2159: (const_int 0))
2160: (pc)
2161: (label_ref (match_operand 2 "" ""))))]
2162: ""
2163: "c.eq.d\\t%0,%1\\t# Merged CMPDF +I. BNE \;bc1f\\t%l2\\t# Merged CMPDF +I BNE")
2164:
2165: ;;- MERGED CMPDF + BGT
2166: (define_peephole
2167: [(set (cc0)
2168: (compare (match_operand:DF 0 "general_operand" "f")
2169: (match_operand:DF 1 "general_operand" "f")))
2170: (set (pc)
2171: (if_then_else (gt (cc0)
2172: (const_int 0))
2173: (label_ref (match_operand 2 "" ""))
2174: (pc)))]
2175: ""
2176: "c.le.d\\t%0,%1\\t# Merged CMPDF + BGT \;bc1f\\t%l2\\t# Merged CMPDF + BGT ")
2177:
2178: ;;- MERGED CMPDF + INV BGT
2179: (define_peephole
2180: [(set (cc0)
2181: (compare (match_operand:DF 0 "general_operand" "f")
2182: (match_operand:DF 1 "general_operand" "f")))
2183: (set (pc)
2184: (if_then_else (le (cc0)
2185: (const_int 0))
2186: (pc)
2187: (label_ref (match_operand 2 "" ""))))]
2188: ""
2189: "c.le.d\\t%0,%1\\t# Merged CMPDF + I. BGT \;bc1f\\t%l2\\t# Merged CMPDF + I. BGT ")
2190:
2191: ;;- MERGED CMPDF + BLT
2192: (define_peephole
2193: [(set (cc0)
2194: (compare (match_operand:DF 0 "general_operand" "f")
2195: (match_operand:DF 1 "general_operand" "f")))
2196: (set (pc)
2197: (if_then_else (lt (cc0)
2198: (const_int 0))
2199: (label_ref (match_operand 2 "" ""))
2200: (pc)))]
2201: ""
2202: "c.lt.d\\t%0,%1\\t# Merged CMPDF + BLT \;bc1t\\t%l2\\t# Merged CMPDF + BLT ")
2203:
2204: ;;- MERGED CMPDF + INV BLT
2205: (define_peephole
2206: [(set (cc0)
2207: (compare (match_operand:DF 0 "general_operand" "f")
2208: (match_operand:DF 1 "general_operand" "f")))
2209: (set (pc)
2210: (if_then_else (ge (cc0)
2211: (const_int 0))
2212: (pc)
2213: (label_ref (match_operand 2 "" ""))))]
2214: ""
2215: "c.lt.d\\t%0,%1\\t# Merged CMPDF + I.BLT \;bc1t\\t%l2\\t# Merged CMPDF + I.BLT")
2216:
2217: ;;- MERGED CMPDF + BGE
2218: (define_peephole
2219: [(set (cc0)
2220: (compare (match_operand:DF 0 "general_operand" "f")
2221: (match_operand:DF 1 "general_operand" "f")))
2222: (set (pc)
2223: (if_then_else (ge (cc0)
2224: (const_int 0))
2225: (label_ref (match_operand 2 "" ""))
2226: (pc)))]
2227: ""
2228: "c.lt.d\\t%0,%1\\t# Merged CMPDF + BGE \;bc1f\\t%l2\\t# Merged CMPDF + BGE")
2229:
2230: ;;- MERGED CMPDF + INV BGE
2231: (define_peephole
2232: [(set (cc0)
2233: (compare (match_operand:DF 0 "general_operand" "f")
2234: (match_operand:DF 1 "general_operand" "f")))
2235: (set (pc)
2236: (if_then_else (lt (cc0)
2237: (const_int 0))
2238: (pc)
2239: (label_ref (match_operand 2 "" ""))))]
2240: ""
2241: "c.lt.d\\t%0,%1\\t# Merged CMPDF +I. BGE \;bc1f\\t%l2\\t# Merged CMPDF +I. BGE")
2242: ;;- MERGED CMPDF + BLE
2243: (define_peephole
2244: [(set (cc0)
2245: (compare (match_operand:DF 0 "general_operand" "f")
2246: (match_operand:DF 1 "general_operand" "f")))
2247: (set (pc)
2248: (if_then_else (le (cc0)
2249: (const_int 0))
2250: (label_ref (match_operand 2 "" ""))
2251: (pc)))]
2252: ""
2253: "c.le.d\\t%0,%1\\t# Merged CMPDF + BLE \;bc1t\\t%l2\\t# Merged CMPDF + BLE ")
2254:
2255: ;;- MERGED CMPDF + INV BLE
2256: (define_peephole
2257: [(set (cc0)
2258: (compare (match_operand:DF 0 "general_operand" "f")
2259: (match_operand:DF 1 "general_operand" "f")))
2260: (set (pc)
2261: (if_then_else (gt (cc0)
2262: (const_int 0))
2263: (pc)
2264: (label_ref (match_operand 2 "" ""))))]
2265: ""
2266: "c.le.d\\t%0,%1\\t# Merged CMPDF +I. BLE \;bc1t\\t%l2\\t# Merged CMPDF + I.BLE ")
2267:
2268:
2269:
2270:
2271: ;;
2272: ;; ....................
2273: ;;
2274: ;; COMPARISONS
2275: ;;
2276: ;; ....................
2277:
2278: ;;- Order is significant here
2279: ;;- because there are untyped
2280: ;;- comparisons generated by
2281: ;;- the optimizer
2282: ;;- (set (cc0)
2283: ;;- (compare (const_int 2)
2284: ;;- (const_int 1)))
2285:
2286: (define_insn "cmpsi"
2287: [(set (cc0)
2288: (compare (match_operand:SI 0 "register_operand" "r")
2289: (match_operand:SI 1 "register_operand" "r")))]
2290: ""
2291: "*
2292: compare_collect (SImode, operands[0], operands[1]);
2293: return \" #\\tcmpsi\\t%0,%1\";
2294: ")
2295:
2296: ;; These patterns are hopelessly invalid, because
2297: ;; comparing subword values properly requires extending them.
2298:
2299: ;; (define_insn "cmphi"
2300: ;; [(set (cc0)
2301: ;; (compare (match_operand:HI 0 "general_operand" "r")
2302: ;; (match_operand:HI 1 "general_operand" "r")))]
2303: ;; ""
2304: ;; "*
2305: ;; compare_collect (HImode, operands[0], operands[1]);
2306: ;; return \" #\\tcmphi\\t%0,%1\";
2307: ;; ")
2308: ;;
2309: ;; (define_insn "cmpqi"
2310: ;; [(set (cc0)
2311: ;; (compare (match_operand:QI 0 "general_operand" "r")
2312: ;; (match_operand:QI 1 "general_operand" "r")))]
2313: ;; ""
2314: ;; "*
2315: ;; compare_collect (QImode, operands[0], operands[1]);
2316: ;; return \" #\\tcmpqi\\t%0,%1\";
2317: ;; ")
2318:
2319: (define_insn "cmpdf"
2320: [(set (cc0)
2321: (compare (match_operand:DF 0 "register_operand" "f")
2322: (match_operand:DF 1 "register_operand" "f")))]
2323: ""
2324: "*
2325: compare_collect (DFmode, operands[0], operands[1]);
2326: return \" #\\tcmpdf\\t%0,%1\" ;
2327: ")
2328:
2329: (define_insn "cmpsf"
2330: [(set (cc0)
2331: (compare (match_operand:SF 0 "register_operand" "f")
2332: (match_operand:SF 1 "register_operand" "f")))]
2333: ""
2334: "*
2335: compare_collect (SFmode, operands[0], operands[1]);
2336: return \" #\\tcmpsf\\t%0,%1\" ;
2337: ")
2338:
2339: (define_insn ""
2340: [(set (cc0)
2341: (match_operand:QI 0 "general_operand" "r"))]
2342: ""
2343: "*
2344: compare_collect (QImode, operands[0], gen_rtx (REG, QImode, 0));
2345: return \" #\\t (set (cc0)\\t%0)\";
2346: ")
2347:
2348: (define_insn ""
2349: [(set (cc0)
2350: (match_operand:HI 0 "general_operand" "r"))]
2351: ""
2352: "*
2353: compare_collect (HImode, operands[0], gen_rtx (REG, HImode, 0));
2354: return \" #\\t (set (cc0)\\t%0)\";
2355: ")
2356:
2357: (define_insn ""
2358: [(set (cc0)
2359: (match_operand:SI 0 "general_operand" "r"))]
2360: ""
2361: "*
2362: compare_collect (SImode, operands[0], gen_rtx (REG, SImode, 0));
2363: return \" #\\t (set (cc0)\\t%0)\";
2364: ")
2365:
2366: ;;
2367: ;; ....................
2368: ;;
2369: ;; BRANCHES
2370: ;;
2371: ;; ....................
2372:
2373: (define_insn "jump"
2374: [(set (pc)
2375: (label_ref (match_operand 0 "" "")))]
2376: ""
2377: "*
2378: {
2379: if (GET_CODE (operands[0]) == REG)
2380: return \"j\\t%%0\\t#jump %l0 (jr not asm syntax)\";
2381: else
2382: return \"j\\t%l0\\t#jump %l0\";
2383: }")
2384:
2385:
2386: (define_insn "beq"
2387: [(set (pc)
2388: (if_then_else (eq (cc0)
2389: (const_int 0))
2390: (label_ref (match_operand 0 "" ""))
2391: (pc)))]
2392: ""
2393: "*
2394: {
2395: rtx br_ops[3];
2396: enum machine_mode mode;
2397: compare_restore (br_ops, &mode, insn);
2398: br_ops[2] = operands[0];
2399: if (mode == DFmode)
2400: {
2401: output_asm_insn (\"c.eq.d\\t%0,%1\\t#beq\", br_ops);
2402: output_asm_insn (\"bc1t\\t%2\\t#beq\", br_ops);
2403: }
2404: else if (mode == SFmode)
2405: {
2406: output_asm_insn (\"c.eq.s\\t%0,%1\\t#beq\", br_ops);
2407: output_asm_insn (\"bc1t\\t%2\\t#beq\", br_ops);
2408: }
2409: else
2410: {
2411: output_asm_insn (\"beq\\t%0,%1,%2\\t#beq\", br_ops);
2412: }
2413: return \"\";
2414: }
2415: ")
2416:
2417: (define_insn "bne"
2418: [(set (pc)
2419: (if_then_else (ne (cc0)
2420: (const_int 0))
2421: (label_ref (match_operand 0 "" ""))
2422: (pc)))]
2423: ""
2424: "*
2425: {
2426: rtx br_ops[3];
2427: enum machine_mode mode;
2428: compare_restore (br_ops, &mode, insn);
2429: br_ops[2] = operands[0];
2430: if (mode == DFmode)
2431: {
2432: output_asm_insn (\"c.eq.d\\t%0,%1\\t#bne\", br_ops);
2433: output_asm_insn (\"bc1f\\t%2\\t#bne\", br_ops);
2434: }
2435: else if (mode == SFmode)
2436: {
2437: output_asm_insn (\"c.eq.s\\t%0,%1\\t#bne\", br_ops);
2438: output_asm_insn (\"bc1f\\t%2\\t#bne\", br_ops);
2439: }
2440: else
2441: {
2442: output_asm_insn (\"bne\\t%0,%1,%2\\t#bne\", br_ops);
2443: }
2444: return \"\";
2445: }
2446:
2447: ")
2448:
2449: (define_insn "bgt"
2450: [(set (pc)
2451: (if_then_else (gt (cc0)
2452: (const_int 0))
2453: (label_ref (match_operand 0 "" ""))
2454: (pc)))]
2455: ""
2456: "*
2457: {
2458: rtx br_ops[3];
2459: enum machine_mode mode;
2460: compare_restore (br_ops, &mode, insn);
2461: br_ops[2] = operands[0];
2462: if (mode == DFmode)
2463: {
2464: output_asm_insn (\"c.le.d\\t%0,%1\\t#bgt branch %0 > %1\", br_ops);
2465: output_asm_insn (\"bc1f\\t%2\\t#bgt\", br_ops);
2466: }
2467: else if (mode == SFmode)
2468: {
2469: output_asm_insn (\"c.le.s\\t%0,%1\\t#bgt branch %0 > %1\", br_ops);
2470: output_asm_insn (\"bc1f\\t%2\\t#bgt\", br_ops);
2471: }
2472: else
2473: {
2474: output_asm_insn (\"bgt\\t%0,%1,%2\\t#bgt\", br_ops);
2475: }
2476: return \"\";
2477: }
2478:
2479: ")
2480:
2481: (define_insn "blt"
2482: [(set (pc)
2483: (if_then_else (lt (cc0)
2484: (const_int 0))
2485: (label_ref (match_operand 0 "" ""))
2486: (pc)))]
2487: ""
2488: "*
2489: {
2490: rtx br_ops[3];
2491: enum machine_mode mode;
2492: compare_restore (br_ops, &mode, insn);
2493: br_ops[2] = operands[0];
2494: if (mode == DFmode)
2495: {
2496: output_asm_insn (\"c.lt.d\\t%0,%1\\t#blt\", br_ops);
2497: output_asm_insn (\"bc1t\\t%2\\t#blt\", br_ops);
2498: }
2499: else if (mode == SFmode)
2500: {
2501: output_asm_insn (\"c.lt.s\\t%0,%1\\t#blt\", br_ops);
2502: output_asm_insn (\"bc1t\\t%2\\t#blt\", br_ops);
2503: }
2504: else
2505: {
2506: output_asm_insn (\"blt\\t%0,%1,%2\\t#blt\", br_ops);
2507: }
2508: return \" #\\tblt \\t%l0\\t#blt\";
2509: }
2510: ")
2511:
2512: (define_insn "bgtu"
2513: [(set (pc)
2514: (if_then_else (gtu (cc0)
2515: (const_int 0))
2516: (label_ref (match_operand 0 "" ""))
2517: (pc)))]
2518: ""
2519: "*
2520: {
2521: rtx br_ops[3];
2522: enum machine_mode mode;
2523: compare_restore (br_ops, &mode, insn);
2524: br_ops[2] = operands[0];
2525: if (mode == DFmode)
2526: {
2527: output_asm_insn (\"c.le.d\\t%0,%1\\t#bgtu\", br_ops);
2528: output_asm_insn (\"bc1f\\t%2\\t#bgtu\", br_ops);
2529: }
2530: else if (mode == SFmode)
2531: {
2532: output_asm_insn (\"c.le.s\\t%0,%1\\t#bgtu\", br_ops);
2533: output_asm_insn (\"bc1f\\t%2\\t#bgtu\", br_ops);
2534: }
2535: else
2536: {
2537: output_asm_insn (\"bgtu\\t%0,%1,%2\\t#bgtu\", br_ops);
2538: }
2539: return \" #\\tbgtu \\t%l0\\t#bgtu\";
2540: }
2541:
2542: ")
2543:
2544: (define_insn "bltu"
2545: [(set (pc)
2546: (if_then_else (ltu (cc0)
2547: (const_int 0))
2548: (label_ref (match_operand 0 "" ""))
2549: (pc)))]
2550: ""
2551: "*
2552: {
2553: rtx br_ops[3];
2554: enum machine_mode mode;
2555: compare_restore (br_ops, &mode, insn);
2556: br_ops[2] = operands[0];
2557: if (mode == DFmode)
2558: {
2559: output_asm_insn (\"c.lt.d\\t%0,%1\\t#bltu\", br_ops);
2560: output_asm_insn (\"bc1t\\t%2\\t#bltu\", br_ops);
2561: }
2562: else if (mode == SFmode)
2563: {
2564: output_asm_insn (\"c.lt.s\\t%0,%1\\t#bltu\", br_ops);
2565: output_asm_insn (\"bc1t\\t%2\\t#bltu\", br_ops);
2566: }
2567: else
2568: {
2569: output_asm_insn (\"bltu\\t%0,%1,%2\\t#bltu\", br_ops);
2570: }
2571: return \"\";
2572: }
2573: ")
2574:
2575: (define_insn "bge"
2576: [(set (pc)
2577: (if_then_else (ge (cc0)
2578: (const_int 0))
2579: (label_ref (match_operand 0 "" ""))
2580: (pc)))]
2581: ""
2582: "*
2583: {
2584: rtx br_ops[3];
2585: enum machine_mode mode;
2586: compare_restore (br_ops, &mode, insn);
2587: br_ops[2] = operands[0];
2588: if (mode == DFmode)
2589: {
2590: output_asm_insn (\"c.lt.d\\t%0,%1\\t#bge\", br_ops);
2591: output_asm_insn (\"bc1f\\t%2\\t#bge\", br_ops);
2592: }
2593: else if (mode == SFmode)
2594: {
2595: output_asm_insn (\"c.lt.s\\t%0,%1\\t#bge\", br_ops);
2596: output_asm_insn (\"bc1f\\t%2\\t#bge\", br_ops);
2597: }
2598: else
2599: {
2600: output_asm_insn (\"bge\\t%0,%1,%2\\t#bge\", br_ops);
2601: }
2602: return \"\";
2603: }
2604: ")
2605:
2606: (define_insn "bgeu"
2607: [(set (pc)
2608: (if_then_else (geu (cc0)
2609: (const_int 0))
2610: (label_ref (match_operand 0 "" ""))
2611: (pc)))]
2612: ""
2613: "*
2614: {
2615: rtx br_ops[3];
2616: enum machine_mode mode;
2617: compare_restore (br_ops, &mode, insn);
2618: br_ops[2] = operands[0];
2619: if (mode == DFmode)
2620: {
2621: output_asm_insn (\"c.lt.d\\t%0,%1\\t#bgeu\", br_ops);
2622: output_asm_insn (\"bc1f\\t%2\\t#bgeu\", br_ops);
2623: }
2624: else if (mode == SFmode)
2625: {
2626: output_asm_insn (\"c.lt.s\\t%0,%1\\t#bgeu\", br_ops);
2627: output_asm_insn (\"bc1f\\t%2\\t#bgeu\", br_ops);
2628: }
2629: else
2630: {
2631: output_asm_insn (\"bgeu\\t%0,%1,%2\\t#bgeu\", br_ops);
2632: }
2633: return \"\";
2634: }
2635: ")
2636:
2637: (define_insn "ble"
2638: [(set (pc)
2639: (if_then_else (le (cc0)
2640: (const_int 0))
2641: (label_ref (match_operand 0 "" ""))
2642: (pc)))]
2643: ""
2644: "*
2645: {
2646: rtx br_ops[3];
2647: enum machine_mode mode;
2648: compare_restore (br_ops, &mode, insn);
2649: br_ops[2] = operands[0];
2650: if (mode == DFmode)
2651: {
2652: output_asm_insn (\"c.le.d\\t%0,%1\\t#ble\", br_ops);
2653: output_asm_insn (\"bc1t\\t%2\\t#ble\", br_ops);
2654: }
2655: else if (mode == SFmode)
2656: {
2657: output_asm_insn (\"c.le.s\\t%0,%1\\t#ble\", br_ops);
2658: output_asm_insn (\"bc1t\\t%2\\t#ble\", br_ops);
2659: }
2660: else
2661: {
2662: output_asm_insn (\"ble\\t%0,%1,%2\\t#ble\", br_ops);
2663: }
2664: return \"\";
2665: }
2666: ")
2667:
2668: (define_insn "bleu"
2669: [(set (pc)
2670: (if_then_else (leu (cc0)
2671: (const_int 0))
2672: (label_ref (match_operand 0 "" ""))
2673: (pc)))]
2674: ""
2675: "*
2676: {
2677: rtx br_ops[3];
2678: enum machine_mode mode;
2679: compare_restore (br_ops, &mode, insn);
2680: br_ops[2] = operands[0];
2681: if (mode == DFmode)
2682: {
2683: output_asm_insn (\"c.le.d\\t%0,%1\\t#ble\", br_ops);
2684: output_asm_insn (\"bc1t\\t%2\\t#ble\", br_ops);
2685: }
2686: else if (mode == SFmode)
2687: {
2688: output_asm_insn (\"c.le.s\\t%0,%1\\t#ble\", br_ops);
2689: output_asm_insn (\"bc1t\\t%2\\t#ble\", br_ops);
2690: }
2691: else
2692: {
2693: output_asm_insn (\"bleu\\t%0,%1,%2\\t#bleu\", br_ops);
2694: }
2695: return \" #\\tbleu \\t%l0\\t#bleu\";
2696: }
2697: ")
2698:
2699: (define_insn ""
2700: [(set (pc)
2701: (if_then_else (ne (cc0)
2702: (const_int 0))
2703: (pc)
2704: (label_ref (match_operand 0 "" ""))))]
2705: ""
2706: "*
2707: {
2708: rtx br_ops[3];
2709: enum machine_mode mode;
2710: compare_restore (br_ops, &mode, insn);
2711: br_ops[2] = operands[0];
2712: if (mode == DFmode)
2713: {
2714: output_asm_insn (\"c.eq.d\\t%0,%1\\t#beq\", br_ops);
2715: output_asm_insn (\"bc1t\\t%2\\t#beq\", br_ops);
2716: }
2717: else if (mode == SFmode)
2718: {
2719: output_asm_insn (\"c.eq.s\\t%0,%1\\t#beq\", br_ops);
2720: output_asm_insn (\"bc1t\\t%2\\t#beq\", br_ops);
2721: }
2722: else
2723: {
2724: output_asm_insn (\"beq\\t%0,%1,%2\\t#beq Inv.\", br_ops);
2725: }
2726: return \"\";
2727: }
2728: ")
2729:
2730: (define_insn ""
2731: [(set (pc)
2732: (if_then_else (eq (cc0)
2733: (const_int 0))
2734: (pc)
2735: (label_ref (match_operand 0 "" ""))))]
2736: ""
2737: "*
2738: {
2739: rtx br_ops[3];
2740: enum machine_mode mode;
2741: compare_restore (br_ops, &mode, insn);
2742: br_ops[2] = operands[0];
2743: if (mode == DFmode)
2744: {
2745: output_asm_insn (\"c.eq.d\\t%0,%1\\t#bne\", br_ops);
2746: output_asm_insn (\"bc1f\\t%2\\t#bne\", br_ops);
2747: }
2748: else if (mode == SFmode)
2749: {
2750: output_asm_insn (\"c.eq.s\\t%0,%1\\t#bne\", br_ops);
2751: output_asm_insn (\"bc1f\\t%2\\t#beq\", br_ops);
2752: }
2753: else
2754: {
2755: output_asm_insn (\"bne\\t%0,%1,%2\\t#bne Inv.\", br_ops);
2756: }
2757: return \"\";
2758: }
2759:
2760: ")
2761:
2762: (define_insn ""
2763: [(set (pc)
2764: (if_then_else (le (cc0)
2765: (const_int 0))
2766: (pc)
2767: (label_ref (match_operand 0 "" ""))))]
2768: ""
2769: "*
2770: {
2771: rtx br_ops[3];
2772: enum machine_mode mode;
2773: compare_restore (br_ops, &mode, insn);
2774: br_ops[2] = operands[0];
2775: if (mode == DFmode)
2776: {
2777: output_asm_insn (\"c.le.d\\t%0,%1\\t#bgt\", br_ops);
2778: output_asm_insn (\"bc1f\\t%2\\t#beq\", br_ops);
2779: }
2780: else if (mode == SFmode)
2781: {
2782: output_asm_insn (\"c.le.s\\t%0,%1\\t#bgt\", br_ops);
2783: output_asm_insn (\"bc1f\\t%2\\t#beq\", br_ops);
2784: }
2785: else
2786: {
2787: output_asm_insn (\"bgt\\t%0,%1,%2\\t#bgt Inv.\", br_ops);
2788: }
2789: return \"\";
2790: }
2791: ")
2792:
2793: (define_insn ""
2794: [(set (pc)
2795: (if_then_else (leu (cc0)
2796: (const_int 0))
2797: (pc)
2798: (label_ref (match_operand 0 "" ""))))]
2799: ""
2800: "*
2801: {
2802: rtx br_ops[3];
2803: enum machine_mode mode;
2804: compare_restore (br_ops, &mode, insn);
2805: br_ops[2] = operands[0];
2806: if (mode == DFmode)
2807: {
2808: output_asm_insn (\"c.le.d\\t%0,%1\\t#bgt\", br_ops);
2809: output_asm_insn (\"bc1f\\t%2\\t#beq\", br_ops);
2810: }
2811: else if (mode == SFmode)
2812: {
2813: output_asm_insn (\"c.le.s\\t%0,%1\\t#bgt\", br_ops);
2814: output_asm_insn (\"bc1f\\t%2\\t#beq\", br_ops);
2815: }
2816: else
2817: {
2818: output_asm_insn (\"bgtu\\t%0,%1,%2\\t#bgtu Inv.\", br_ops);
2819: }
2820: return \" #\\tbgtu \\t%l0\\t#bgtu\";
2821: }
2822: ")
2823:
2824: (define_insn ""
2825: [(set (pc)
2826: (if_then_else (ge (cc0)
2827: (const_int 0))
2828: (pc)
2829: (label_ref (match_operand 0 "" ""))))]
2830: ""
2831: "*
2832: {
2833: rtx br_ops[3];
2834: enum machine_mode mode;
2835: compare_restore (br_ops, &mode, insn);
2836: br_ops[2] = operands[0];
2837: if (mode == DFmode)
2838: {
2839: output_asm_insn (\"c.lt.d\\t%0,%1\\t#blt\", br_ops);
2840: output_asm_insn (\"bc1t\\t%2\\t#beq\", br_ops);
2841: }
2842: else if (mode == SFmode)
2843: {
2844: output_asm_insn (\"c.lt.s\\t%0,%1\\t#blt\", br_ops);
2845: output_asm_insn (\"bc1t\\t%2\\t#beq\", br_ops);
2846: }
2847: else
2848: {
2849: output_asm_insn (\"blt\\t%0,%1,%2\\t#blt Inv.\", br_ops);
2850: }
2851: return \"\";
2852: }
2853: ")
2854:
2855: (define_insn ""
2856: [(set (pc)
2857: (if_then_else (geu (cc0)
2858: (const_int 0))
2859: (pc)
2860: (label_ref (match_operand 0 "" ""))))]
2861: ""
2862: "*
2863: {
2864: rtx br_ops[3];
2865: enum machine_mode mode;
2866: compare_restore (br_ops, &mode, insn);
2867: br_ops[2] = operands[0];
2868: if (mode == DFmode)
2869: {
2870: output_asm_insn (\"c.lt.d\\t%0,%1\\t#bltu\", br_ops);
2871: output_asm_insn (\"bc1t\\t%2\\t#bltu\", br_ops);
2872: }
2873: else if (mode == SFmode)
2874: {
2875: output_asm_insn (\"c.lt.s\\t%0,%1\\t#bltu\", br_ops);
2876: output_asm_insn (\"bc1t\\t%2\\t#bltu\", br_ops);
2877: }
2878: else
2879: {
2880: output_asm_insn (\"bltu\\t%0,%1,%2\\t#bltu Inv.\", br_ops);
2881: }
2882: return \" #\\tbltu \\t%l0\\t#bltu\";
2883: }
2884: ")
2885:
2886: (define_insn ""
2887: [(set (pc)
2888: (if_then_else (lt (cc0)
2889: (const_int 0))
2890: (pc)
2891: (label_ref (match_operand 0 "" ""))))]
2892: ""
2893: "*
2894: {
2895: rtx br_ops[3];
2896: enum machine_mode mode;
2897: compare_restore (br_ops, &mode, insn);
2898: br_ops[2] = operands[0];
2899: if (mode == DFmode)
2900: {
2901: output_asm_insn (\"c.lt.d\\t%0,%1\\t#bge\", br_ops);
2902: output_asm_insn (\"bc1f\\t%2\\t#bge (DF) Inv.\", br_ops);
2903: }
2904: else if (mode == SFmode)
2905: {
2906: output_asm_insn (\"c.lt.s\\t%0,%1\\t#bge\", br_ops);
2907: output_asm_insn (\"bc1f\\t%2\\t#bge (SF) Inv.\", br_ops);
2908: }
2909: else
2910: {
2911: output_asm_insn (\"bge\\t%0,%1,%2\\t#bge Inv.\", br_ops);
2912: }
2913: return \"\";
2914: }
2915: ")
2916:
2917: (define_insn ""
2918: [(set (pc)
2919: (if_then_else (ltu (cc0)
2920: (const_int 0))
2921: (pc)
2922: (label_ref (match_operand 0 "" ""))))]
2923: ""
2924: "*
2925: {
2926: rtx br_ops[3];
2927: enum machine_mode mode;
2928: compare_restore (br_ops, &mode, insn);
2929: br_ops[2] = operands[0];
2930: if (mode == DFmode)
2931: {
2932: output_asm_insn (\"c.lt.d\\t%0,%1\\t#bge\", br_ops);
2933: output_asm_insn (\"bc1f\\t%2\\t#bgeu (DF) Inv.\", br_ops);
2934: }
2935: else if (mode == SFmode)
2936: {
2937: output_asm_insn (\"c.lt.s\\t%0,%1\\t#bge\", br_ops);
2938: output_asm_insn (\"bc1f\\t%2\\t#bgeu (SF )Inv.\", br_ops);
2939: }
2940: else
2941: {
2942: output_asm_insn (\"bgeu\\t%0,%1,%2\\t#bgeu Inv.\", br_ops);
2943: }
2944: return \" #\\tbgeu \\t%l0\\t#bgeu\";
2945: }
2946: ")
2947:
2948: (define_insn ""
2949: [(set (pc)
2950: (if_then_else (gt (cc0)
2951: (const_int 0))
2952: (pc)
2953: (label_ref (match_operand 0 "" ""))))]
2954: ""
2955: "*
2956: {
2957: rtx br_ops[3];
2958: enum machine_mode mode;
2959: compare_restore (br_ops, &mode, insn);
2960: br_ops[2] = operands[0];
2961: if (mode == DFmode)
2962: {
2963: output_asm_insn (\"c.le.d\\t%0,%1\\t#ble\", br_ops);
2964: output_asm_insn (\"bc1t\\t%2\\t#ble\", br_ops);
2965: }
2966: else if (mode == SFmode)
2967: {
2968: output_asm_insn (\"c.le.s\\t%0,%1\\t#ble\", br_ops);
2969: output_asm_insn (\"bc1t\\t%2\\t#ble\", br_ops);
2970: }
2971: else
2972: {
2973: output_asm_insn (\"ble\\t%0,%1,%2\\t#ble Inv.\", br_ops);
2974: }
2975: return \"\";
2976: }
2977: ")
2978:
2979: (define_insn ""
2980: [(set (pc)
2981: (if_then_else (gtu (cc0)
2982: (const_int 0))
2983: (pc)
2984: (label_ref (match_operand 0 "" ""))))]
2985: ""
2986: "*
2987: {
2988: rtx br_ops[3];
2989: enum machine_mode mode;
2990: compare_restore (br_ops, &mode, insn);
2991: br_ops[2] = operands[0];
2992: if (mode == DFmode)
2993: {
2994: output_asm_insn (\"c.le.d\\t%0,%1\\t#bleu\", br_ops);
2995: output_asm_insn (\"bc1t\\t%2\\t#bleu\", br_ops);
2996: }
2997: else if (mode == SFmode)
2998: {
2999: output_asm_insn (\"c.le.s\\t%0,%1\\t#bleu\", br_ops);
3000: output_asm_insn (\"bc1t\\t%2\\t#bleu\", br_ops);
3001: }
3002: else
3003: {
3004: output_asm_insn (\"bleu\\t%0,%1,%2\\t#bleu Inv.\", br_ops);
3005: }
3006: return \"\";
3007: }
3008: ")
3009:
3010: (define_insn "tablejump"
3011: [(set (pc)
3012: (match_operand:SI 0 "general_operand" "r"))
3013: (use (label_ref (match_operand 1 "" "")))]
3014: ""
3015: "j\\t%0\\t# tablejump, label %l1\\t (jr not asm syntax)")
3016:
3017: ;;
3018: ;; ....................
3019: ;;
3020: ;; LINKAGE
3021: ;;
3022: ;; ....................
3023:
3024: (define_insn "call"
3025: [(call (match_operand 0 "general_operand" "g")
3026: (match_operand 1 "general_operand" "g"))
3027: (clobber (reg:SI 31))]
3028: ""
3029: "*
3030: {
3031: if (GET_CODE (XEXP (operands[0], 0)) == SYMBOL_REF)
3032: return \"jal\\t%0\\t# call with %1 arguments\";
3033: else
3034: {
3035: operands[0] = XEXP (operands[0], 0);
3036: return \"jal\\t$31,%0\\t# call with %1 arguments (reg)\";
3037: }
3038: }" )
3039:
3040:
3041: (define_expand "call_value"
3042: [(set (match_operand 0 "" "=rf")
3043: (call (match_operand:SI 1 "memory_operand" "m")
3044: (match_operand 2 "" "i")))
3045: (clobber (reg:SI 31))]
3046: ;; operand 3 is next_arg_register
3047: ""
3048: "
3049: {
3050: rtx fn_rtx, nregs_rtx;
3051: rtvec vec;
3052:
3053: fn_rtx = operands[1];
3054:
3055: nregs_rtx = const0_rtx;
3056:
3057:
3058: vec = gen_rtvec (2,
3059: gen_rtx (SET, VOIDmode, operands[0],
3060: gen_rtx (CALL, VOIDmode, fn_rtx, nregs_rtx)),
3061: gen_rtx (CLOBBER, VOIDmode, gen_rtx (REG, SImode, 31)));
3062:
3063: emit_call_insn (gen_rtx (PARALLEL, VOIDmode, vec));
3064: DONE;
3065: }")
3066:
3067:
3068: (define_insn ""
3069: [(set (match_operand 0 "general_operand" "=g,f")
3070: (call (match_operand 1 "general_operand" "g,g")
3071: (match_operand 2 "general_operand" "g,g")))
3072: (clobber (match_operand 3 "general_operand" "g,g"))]
3073: ""
3074: "*
3075: {
3076: if (GET_CODE (XEXP (operands[1], 0)) == SYMBOL_REF)
3077: return \"jal\\t%1\\t# call %1 regle 2-call (VOIDmode)\";
3078: else
3079: {
3080: operands[1] = XEXP (operands[1], 0);
3081: return \"jal\\t$31,%1\\t# call %1 regle 2-call (VOIDmode, reg)\";
3082: }
3083: }")
3084:
3085: (define_insn "nop"
3086: [(const_int 0)]
3087: ""
3088: "nop")
3089:
3090: (define_expand "probe"
3091: [(set (reg:SI 29) (minus:SI (reg:SI 29) (const_int 4)))
3092: (set (mem:SI (reg:SI 29)) (const_int 0))
3093: (set (reg:SI 29) (plus:SI (reg:SI 29) (const_int 4)))]
3094: ""
3095: "")
3096:
3097: ;;
3098: ;;- Local variables:
3099: ;;- mode:emacs-lisp
3100: ;;- comment-start: ";;- "
3101: ;;- eval: (set-syntax-table (copy-sequence (syntax-table)))
3102: ;;- eval: (modify-syntax-entry ?[ "(]")
3103: ;;- eval: (modify-syntax-entry ?] ")[")
3104: ;;- eval: (modify-syntax-entry ?{ "(}")
3105: ;;- eval: (modify-syntax-entry ?} "){")
3106: ;;- End:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.