|
|
1.1 root 1: ;;- Machine description for GNU compiler, Clipper Version
2: ;; Copyright (C) 1987, 1988, 1991, 1993 Free Software Foundation, Inc.
3:
4: ;; Contributed by Holger Teutsch ([email protected])
5:
6: ;; This file is part of GNU CC.
7:
8: ;; GNU CC is free software; you can redistribute it and/or modify
9: ;; it under the terms of the GNU General Public License as published by
10: ;; the Free Software Foundation; either version 2, or (at your option)
11: ;; any later version.
12:
13: ;; GNU CC is distributed in the hope that it will be useful,
14: ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
15: ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16: ;; GNU General Public License for more details.
17:
18: ;; You should have received a copy of the GNU General Public License
19: ;; along with GNU CC; see the file COPYING. If not, write to
20: ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
21:
22:
23: ;;- Instruction patterns. When multiple patterns apply,
24: ;;- the first one in the file is chosen.
25: ;;-
26: ;;- See file "rtl.def" for documentation on define_insn, match_*, et. al.
27: ;;-
28: ;;- cpp macro #define NOTICE_UPDATE_CC in file tm.h handles condition code
29: ;;- updates for most instructions.
30:
31: ;;
32: ;; define attributes
33: ;;
34: ;; instruction type
35: ;;
36: ;; unknown is temporary in order to generate 'cc clobber' until attribute
37: ;; assignment is consistent
38: ;;
39: (define_attr "type" "load,store,arith,fp,branch,unknown"
40: (const_string "unknown"))
41:
42: ;; condition code setting
43: ;;
44: ;; clobber destroyed
45: ;; unchanged
46: ;; set1 set cc_status.value1, e.g. sub r0,r1
47: ;; set2 set value1 and value2, e.g. mov r0,r1
48: ;; change0 may be side effect, i.e. load mem,r0
49: ;;
50: ;; note: loadi and loadq are 'arith' instructions that set the condition codes
51: ;; mul,div,mod do NOT set the condition codes
52: ;;
53: (define_attr "cc" "clobber,unchanged,set1,set2,change0"
54: (cond [(eq_attr "type" "load") (const_string "change0")
55: (eq_attr "type" "store,branch") (const_string "unchanged")
56: (eq_attr "type" "arith") (if_then_else (match_operand:SI 0 "" "")
57: (const_string "set1")
58: (const_string "clobber"))
59: ]
60: (const_string "clobber")))
61:
62: ;;
63: ;; clipper seems to be a tradional risc processor
64: ;; we define a functional unit 'memory'
65: ;;
66: (define_function_unit "memory" 1 1 (eq_attr "type" "load") 4 0)
67:
68:
69: ;; We don't want to allow a constant operand for test insns because
70: ;; (set (cc0) (const_int foo)) has no mode information. Such insns will
71: ;; be folded while optimizing anyway.
72:
73: (define_insn "tstsi"
74: [(set (cc0)
75: (match_operand:SI 0 "int_reg_operand" "r"))]
76: ""
77: "cmpq $0,%0")
78:
79: (define_insn "cmpsi"
80: [(set (cc0)
81: (compare (match_operand:SI 0 "nonimmediate_operand" "r,r,n")
82: (match_operand:SI 1 "nonmemory_operand" "r,n,r")))]
83: ""
84: "*
85: {
86: int val;
87:
88: if (which_alternative == 0)
89: return \"cmpw %1,%0\";
90:
91: if (which_alternative == 1)
92: {
93: val = INTVAL (operands[1]);
94: if (0 <= val && val < 16)
95: return \"cmpq %1,%0\";
96: return \"cmpi %1,%0\";
97: }
98:
99: cc_status.flags |= CC_REVERSED; /* immediate must be first */
100:
101: val = INTVAL (operands[0]);
102:
103: if (0 <= val && val < 16)
104: return \"cmpq %0,%1\";
105:
106: return \"cmpi %0,%1\";
107: }")
108:
109: (define_insn "cmpdf"
110: [(set (cc0)
111: (compare (match_operand:DF 0 "fp_reg_operand" "f")
112: (match_operand:DF 1 "fp_reg_operand" "f")))]
113: ""
114: "cmpd %1,%0")
115:
116: (define_insn "cmpsf"
117: [(set (cc0)
118: (compare (match_operand:SF 0 "fp_reg_operand" "f")
119: (match_operand:SF 1 "fp_reg_operand" "f")))]
120: ""
121: "cmps %1,%0")
122:
123:
124: ;;
125: ;; double and single float move
126: ;;
127: (define_expand "movdf"
128: [(set (match_operand:DF 0 "general_operand" "")
129: (match_operand:DF 1 "general_operand" ""))]
130: ""
131: "
132: {
133: if (GET_CODE (operands[0]) == MEM)
134: {
135: if (GET_CODE (operands[1]) == CONST_DOUBLE)
136: operands[1] = force_reg (DFmode,
137: force_const_mem (DFmode, operands[1]));
138: else if (GET_CODE (operands[1]) != REG)
139: operands[1] = force_reg (DFmode, operands[1]);
140: }
141:
142: else if (GET_CODE (operands[1]) == CONST_DOUBLE)
143: operands[1] = force_const_mem (DFmode, operands[1]);
144: }")
145:
146: ;;
147: ;; provide two patterns with different predicates as we don't want combine
148: ;; to recombine a mem -> mem move
149: ;;
150: (define_insn ""
151: [(set (match_operand:DF 0 "register_operand" "=*rf")
152: (match_operand:DF 1 "nonimmediate_operand" "*rfo"))]
153: ""
154: "*
155: {
156: #define FP_REG_P(X) (GET_CODE (X) == REG && REGNO (X) >= 16)
157:
158: if (FP_REG_P (operands[0]))
159: {
160: if (FP_REG_P (operands[1])) /* f -> f */
161: return \"movd %1,%0\";
162:
163: if (GET_CODE (operands[1]) == REG) /* r -> f */
164: return \"movld %1,%0\";
165:
166: return \"loadd %1,%0\"; /* m -> f */
167: }
168:
169: if (FP_REG_P (operands[1]))
170: {
171: if (GET_CODE (operands[0]) == REG) /* f -> r */
172: return \"movdl %1,%0\";
173:
174: abort ();
175: }
176:
177: if (GET_CODE (operands[1]) == MEM) /* m -> r */
178: {
179: rtx xops[4];
180: xops[0] = operands[0];
181: xops[1] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1);
182: xops[2] = operands[1];
183: xops[3] = adj_offsettable_operand (operands[1], 4);
184: output_asm_insn (\"loadw %2,%0\;loadw %3,%1\", xops);
185: return \"\";
186: }
187:
188: if (GET_CODE (operands[1]) == REG) /* r -> r */
189: {
190: rtx xops[4];
191: xops[0] = operands[0];
192: xops[1] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1);
193: xops[2] = operands[1];
194: xops[3] = gen_rtx (REG, SImode, REGNO (operands[1]) + 1);
195: output_asm_insn (\"movw %2,%0\;movw %3,%1\", xops);
196: return \"\";
197: }
198:
199: abort ();
200: #undef FP_REG_P
201: }")
202:
203:
204: (define_insn ""
205: [(set (match_operand:DF 0 "memory_operand" "=o,m")
206: (match_operand:DF 1 "register_operand" "*rf,f"))]
207: ""
208: "*
209: {
210: rtx xops[4];
211:
212: if (REGNO (operands[1]) >= 16) /* f -> m */
213: return \"stord %1,%0\";
214:
215: xops[0] = operands[0]; /* r -> o */
216: xops[1] = adj_offsettable_operand (operands[0], 4);
217: xops[2] = operands[1];
218: xops[3] = gen_rtx (REG, SImode, REGNO (operands[1]) + 1);
219: output_asm_insn (\"storw %2,%0\;storw %3,%1\", xops);
220: return \"\";
221: }"
222: [(set_attr "type" "store,store")
223: (set_attr "cc" "clobber,unchanged")])
224:
225:
226: (define_expand "movsf"
227: [(set (match_operand:SF 0 "general_operand" "")
228: (match_operand:SF 1 "general_operand" ""))]
229: ""
230: "
231: {
232: if (GET_CODE (operands[0]) == MEM)
233: {
234: if (GET_CODE (operands[1]) == CONST_DOUBLE)
235: operands[1] = force_reg (SFmode,
236: force_const_mem (SFmode, operands[1]));
237: else if (GET_CODE (operands[1]) != REG)
238: operands[1] = force_reg (SFmode, operands[1]);
239: }
240:
241: else if (GET_CODE (operands[1]) == CONST_DOUBLE)
242: operands[1] = force_const_mem (SFmode, operands[1]);
243: }")
244:
245: ;;
246: ;; provide two patterns with different predicates as we don't want combine
247: ;; to recombine a mem -> mem move
248: ;;
249: (define_insn ""
250: [(set (match_operand:SF 0 "register_operand" "=*rf")
251: (match_operand:SF 1 "nonimmediate_operand" "*rfm"))]
252: ""
253: "*
254: {
255: #define FP_REG_P(X) (GET_CODE (X) == REG && REGNO (X) >= 16)
256:
257: if (FP_REG_P (operands[0]))
258: {
259: if (FP_REG_P (operands[1])) /* f -> f */
260: return \"movs %1,%0\";
261: if (GET_CODE (operands[1]) == REG) /* r -> f */
262: return
263: \"subq $8,sp\;storw %1,(sp)\;loads (sp),%0\;addq $8,sp\";
264: return \"loads %1,%0\"; /* m -> f */
265: }
266:
267: if (FP_REG_P (operands[1]))
268: {
269: if (GET_CODE (operands[0]) == REG) /* f -> r */
270: return
271: \"subq $8,sp\;stors %1,(sp)\;loadw (sp),%0\;addq $8,sp\";
272: abort ();
273: }
274:
275: if (GET_CODE (operands[1]) == MEM) /* m -> r */
276: return \"loadw %1,%0\";
277:
278: if (GET_CODE (operands[1]) == REG) /* r -> r */
279: return \"movw %1,%0\";
280:
281: abort ();
282: #undef FP_REG_P
283: }")
284:
285: (define_insn ""
286: [(set (match_operand:SF 0 "memory_operand" "=m")
287: (match_operand:SF 1 "register_operand" "*rf"))]
288: ""
289: "*
290: {
291: if (GET_CODE (operands[1]) == REG && REGNO (operands[1]) >= 16)
292: return \"stors %1,%0\"; /* f-> m */
293:
294: return \"storw %1,%0\"; /* r -> m */
295: }"
296: [(set_attr "type" "store")])
297:
298:
299: (define_expand "movdi"
300: [(set (match_operand:DI 0 "general_operand" "")
301: (match_operand:DI 1 "general_operand" ""))]
302: ""
303: "
304: {
305: if (GET_CODE (operands[0]) == MEM && GET_CODE (operands[1]) != REG)
306: operands[1] = force_reg (DImode, operands[1]);
307: }")
308:
309: ;; If an operand is a MEM but not offsetable, we can't load it into
310: ;; a register, so we must force the third alternative to be the one
311: ;; reloaded. Hence we show the first as more expensive.
312: (define_insn ""
313: [(set (match_operand:DI 0 "register_operand" "=?r,r,r")
314: (match_operand:DI 1 "general_operand" "r,n,o"))]
315: ""
316: "*
317: {
318: rtx xoperands[2],yoperands[2];
319:
320: xoperands[0] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1);
321:
322: if (which_alternative == 0) /* r -> r */
323: {
324: output_asm_insn (\"movw %1,%0\", operands);
325: xoperands[1] = gen_rtx (REG, SImode, REGNO (operands[1]) + 1);
326: output_asm_insn (\"movw %1,%0\", xoperands);
327: return \"\";
328: }
329:
330: if (which_alternative == 1) /* n -> r */
331: {
332: if (GET_CODE (operands[1]) == CONST_INT)
333: {
334: output_asm_insn (\"loadi %1,%0\", operands);
335: output_asm_insn (\"loadq $0,%0\", xoperands);
336: return \"\";
337: }
338:
339: if (GET_CODE (operands[1]) != CONST_DOUBLE)
340: abort ();
341:
342: yoperands[0] = operands[0];
343: yoperands[1] = gen_rtx (CONST_INT, VOIDmode,
344: CONST_DOUBLE_LOW (operands[1]));
345: output_asm_insn (\"loadi %1,%0\", yoperands);
346:
347: xoperands[1] = gen_rtx (CONST_INT, VOIDmode,
348: CONST_DOUBLE_HIGH (operands[1]));
349: output_asm_insn (\"loadi %1,%0\", xoperands);
350: return \"\";
351: }
352: /* m -> r */
353: output_asm_insn (\"loadw %1,%0\", operands);
354: xoperands[1] = adj_offsettable_operand (operands[1], 4);
355: output_asm_insn (\"loadw %1,%0\", xoperands);
356: return \"\";
357: }"
358: [(set_attr "type" "arith,arith,load")
359: (set_attr "cc" "clobber,clobber,clobber")])
360:
361: (define_insn ""
362: [(set (match_operand:DI 0 "memory_operand" "=o")
363: (match_operand:DI 1 "register_operand" "r"))]
364: ""
365: "*
366: {
367: rtx xops[4];
368: xops[0] = operands[0];
369: xops[1] = adj_offsettable_operand (operands[0], 4);
370: xops[2] = operands[1];
371: xops[3] = gen_rtx (REG, SImode, REGNO (operands[1]) + 1);
372: output_asm_insn (\"storw %2,%0\;storw %3,%1\", xops);
373: return \"\";
374: }"
375: [(set_attr "type" "store")
376: (set_attr "cc" "clobber")])
377:
378: (define_expand "movsi"
379: [(set (match_operand:SI 0 "general_operand" "")
380: (match_operand:SI 1 "general_operand" ""))]
381: ""
382: "
383: {
384: if (GET_CODE (operands[0]) == MEM &&
385: GET_CODE (operands[1]) != REG)
386: operands[1] = force_reg (SImode, operands[1]);
387: }")
388:
389: ;; provide 2 patterns with different predicates as 'general_operand' in both
390: ;; positions results in a 'mem -> mem' move from combine that must be reloaded
391: ;;
392:
393: (define_insn ""
394: [(set (match_operand:SI 0 "register_operand" "=r,r,r,r")
395: (match_operand:SI 1 "general_operand" "r,m,n,i"))]
396: ""
397: "*
398: {
399: int val;
400:
401: if (which_alternative == 0)
402: return \"movw %1,%0\"; /* reg -> reg */
403:
404: if (which_alternative == 1)
405: return \"loadw %1,%0\"; /* mem -> reg */
406:
407: if (which_alternative == 2)
408: {
409: val = INTVAL (operands[1]); /* known const ->reg */
410:
411: if (val == -1)
412: return \"notq $0,%0\";
413:
414: if (val < 0 || val >= 16)
415: return \"loadi %1,%0\";
416:
417: return \"loadq %1,%0\";
418: }
419:
420: if (which_alternative == 3) /* unknown const */
421: return \"loada %a1,%0\";
422: }"
423: [(set_attr "type" "arith,load,arith,load")
424: (set_attr "cc" "set2,change0,set1,change0")])
425:
426:
427: (define_insn ""
428: [(set (match_operand:SI 0 "memory_operand" "=m")
429: (match_operand:SI 1 "int_reg_operand" "r"))]
430: ""
431: "storw %1,%0"
432: [(set_attr "type" "store")])
433:
434: ;; movhi
435: ;;
436: ;; loadh mem to reg
437: ;; storh reg to mem
438: ;;
439: ;;
440: (define_expand "movhi"
441: [(set (match_operand:HI 0 "general_operand" "")
442: (match_operand:HI 1 "general_operand" ""))]
443: ""
444: "
445: {
446: if (GET_CODE (operands[0]) == MEM
447: && ! register_operand (operands[1], HImode))
448: operands[1] = force_reg (HImode, operands[1]);
449: }")
450:
451:
452: (define_insn ""
453: [(set (match_operand:HI 0 "register_operand" "=r,r,r")
454: (match_operand:HI 1 "general_operand" "r,m,n"))]
455: ""
456: "@
457: movw %1,%0
458: loadh %1,%0
459: loadi %1,%0"
460: [(set_attr "type" "arith,load,arith")])
461:
462: (define_insn ""
463: [(set (match_operand:HI 0 "memory_operand" "=m")
464: (match_operand:HI 1 "register_operand" "r"))]
465: ""
466: "storh %1,%0"
467: [(set_attr "type" "store")])
468:
469: ;; movqi
470: ;;
471: ;; loadb mem to reg
472: ;; storb reg to mem
473: ;;
474: (define_expand "movqi"
475: [(set (match_operand:QI 0 "general_operand" "")
476: (match_operand:QI 1 "general_operand" ""))]
477: ""
478: "
479: {
480: if (GET_CODE (operands[0]) == MEM &&
481: ! register_operand (operands[1], QImode))
482: operands[1] = force_reg (QImode, operands[1]);
483: }")
484:
485:
486: (define_insn ""
487: [(set (match_operand:QI 0 "register_operand" "=r,r,r")
488: (match_operand:QI 1 "general_operand" "r,m,n"))]
489: ""
490: "@
491: movw %1,%0
492: loadb %1,%0
493: loadi %1,%0"
494: [(set_attr "type" "arith,load,arith")])
495:
496: (define_insn ""
497: [(set (match_operand:QI 0 "memory_operand" "=m")
498: (match_operand:QI 1 "register_operand" "r"))]
499: ""
500: "storb %1,%0"
501: [(set_attr "type" "store")])
502:
503:
504: ;;
505: ;; block move
506: ;;
507: (define_expand "movstrsi"
508: [(parallel
509: [(set (match_operand:BLK 0 "memory_operand" "")
510: (match_operand:BLK 1 "memory_operand" ""))
511: (use (match_operand:SI 2 "general_operand" ""))
512: (use (match_operand:SI 3 "const_int_operand" ""))
513: (clobber (match_scratch:SI 4 ""))
514: (clobber (match_scratch:SI 5 ""))
515: (clobber (match_dup 6))
516: (clobber (match_dup 7))])]
517: ""
518: "
519: {
520: rtx addr0, addr1;
521:
522: addr0 = copy_to_mode_reg (Pmode, XEXP (operands[0], 0));
523: addr1 = copy_to_mode_reg (Pmode, XEXP (operands[1], 0));
524:
525: operands[6] = addr0;
526: operands[7] = addr1;
527:
528: operands[0] = gen_rtx (MEM, BLKmode, addr0);
529: operands[1] = gen_rtx (MEM, BLKmode, addr1);
530:
531: if (GET_CODE (operands[2]) != CONST_INT)
532: operands[2] = force_reg (SImode, operands[2]);
533: }")
534:
535: ;;
536: ;; there is a problem with this insn in gcc-2.2.3
537: ;; (clobber (match_dup 2)) does not prevent use of this operand later
538: ;; we always use a scratch register and leave operand 2 unchanged
539: ;;
540: (define_insn ""
541: [(set (mem:BLK (match_operand:SI 0 "register_operand" "r"))
542: (mem:BLK (match_operand:SI 1 "register_operand" "r")))
543: (use (match_operand:SI 2 "nonmemory_operand" "rn"))
544: (use (match_operand:SI 3 "const_int_operand" "n"))
545: (clobber (match_scratch:SI 4 "=r"))
546: (clobber (match_scratch:SI 5 "=r"))
547: (clobber (match_dup 0))
548: (clobber (match_dup 1))]
549: ""
550: "*
551: {
552: extern void clipper_movstr ();
553: clipper_movstr (operands);
554: return \"\";
555: }"
556: [(set_attr "cc" "clobber")])
557:
558:
559:
560: ;; Extension and truncation insns.
561: (define_insn "extendhisi2"
562: [(set (match_operand:SI 0 "int_reg_operand" "=r,r")
563: (sign_extend:SI (match_operand:HI 1 "general_operand" "0,m")))]
564: ""
565: "@
566: andi $65535,%0\;xori $32768,%0\;subi $32768,%0
567: loadh %1,%0"
568: [(set_attr "type" "arith,load")])
569:
570:
571: (define_insn "extendqihi2"
572: [(set (match_operand:HI 0 "int_reg_operand" "=r,r")
573: (sign_extend:HI (match_operand:QI 1 "general_operand" "0,m")))]
574: ""
575: "@
576: andi $255,%0\;xori $128,%0\;subi $128,%0
577: loadb %1,%0"
578: [(set_attr "type" "arith,load")
579: (set_attr "cc" "set1,change0")])
580:
581:
582: (define_insn "extendqisi2"
583: [(set (match_operand:SI 0 "int_reg_operand" "=r,r")
584: (sign_extend:SI (match_operand:QI 1 "general_operand" "0,m")))]
585: ""
586: "@
587: andi $255,%0\;xori $128,%0\;subi $128,%0
588: loadb %1,%0"
589: [(set_attr "type" "arith,load")])
590:
591:
592: (define_insn "extendsfdf2"
593: [(set (match_operand:DF 0 "fp_reg_operand" "=f")
594: (float_extend:DF (match_operand:SF 1 "fp_reg_operand" "f")))]
595: ""
596: "cnvsd %1,%0")
597:
598: (define_insn "truncdfsf2"
599: [(set (match_operand:SF 0 "fp_reg_operand" "=f")
600: (float_truncate:SF (match_operand:DF 1 "fp_reg_operand" "f")))]
601: ""
602: "cnvds %1,%0")
603:
604: (define_insn "zero_extendhisi2"
605: [(set (match_operand:SI 0 "int_reg_operand" "=r,r")
606: (zero_extend:SI (match_operand:HI 1 "general_operand" "0,m")))]
607: ""
608: "@
609: andi $65535,%0
610: loadhu %1,%0"
611: [(set_attr "type" "arith,load")])
612:
613:
614: (define_insn "zero_extendqihi2"
615: [(set (match_operand:HI 0 "int_reg_operand" "=r,r")
616: (zero_extend:HI (match_operand:QI 1 "general_operand" "0,m")))]
617: ""
618: "@
619: andi $255,%0
620: loadbu %1,%0"
621: [(set_attr "type" "arith,load")
622: (set_attr "cc" "clobber,clobber")])
623:
624:
625: (define_insn "zero_extendqisi2"
626: [(set (match_operand:SI 0 "int_reg_operand" "=r,r")
627: (zero_extend:SI (match_operand:QI 1 "general_operand" "0,m")))]
628: ""
629: "@
630: andi $255,%0
631: loadbu %1,%0"
632: [(set_attr "type" "arith,load")])
633:
634:
635:
636: ;; Fix-to-float conversion insns.
637:
638: (define_insn "floatsisf2"
639: [(set (match_operand:SF 0 "fp_reg_operand" "=f")
640: (float:SF (match_operand:SI 1 "int_reg_operand" "r")))]
641: ""
642: "cnvws %1,%0")
643:
644: (define_insn "floatsidf2"
645: [(set (match_operand:DF 0 "fp_reg_operand" "=f")
646: (float:DF (match_operand:SI 1 "int_reg_operand" "r")))]
647: ""
648: "cnvwd %1,%0")
649:
650:
651: ;; Float-to-fix conversion insns.
652:
653: (define_insn "fix_truncsfsi2"
654: [(set (match_operand:SI 0 "int_reg_operand" "=r")
655: (fix:SI (fix:SF (match_operand:SF 1 "fp_reg_operand" "f"))))]
656: ""
657: "cnvtsw %1,%0")
658:
659: (define_insn "fix_truncdfsi2"
660: [(set (match_operand:SI 0 "int_reg_operand" "=r")
661: (fix:SI (fix:DF (match_operand:DF 1 "fp_reg_operand" "f"))))]
662: ""
663: "cnvtdw %1,%0")
664:
665: ;;- All kinds of add instructions.
666:
667: (define_insn "adddf3"
668: [(set (match_operand:DF 0 "fp_reg_operand" "=f")
669: (plus:DF (match_operand:DF 1 "fp_reg_operand" "0")
670: (match_operand:DF 2 "fp_reg_operand" "f")))]
671: ""
672: "addd %2,%0"
673: [(set_attr "type" "fp")])
674:
675:
676: (define_insn "addsf3"
677: [(set (match_operand:SF 0 "fp_reg_operand" "=f")
678: (plus:SF (match_operand:SF 1 "fp_reg_operand" "0")
679: (match_operand:SF 2 "fp_reg_operand" "f")))]
680: ""
681: "adds %2,%0"
682: [(set_attr "type" "fp")])
683:
684: (define_insn "adddi3"
685: [(set (match_operand:DI 0 "int_reg_operand" "=r")
686: (plus:DI (match_operand:DI 1 "int_reg_operand" "%0")
687: (match_operand:DI 2 "int_reg_operand" "r")))]
688: ""
689: "*
690: {
691: rtx xoperands[4];
692:
693: xoperands[0] = operands[0];
694: xoperands[1] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1);
695: xoperands[2] = operands[2];
696: xoperands[3] = gen_rtx (REG, SImode, REGNO (operands[2]) + 1);
697: output_asm_insn (\"addw %2,%0\;addwc %3,%1\", xoperands);
698: return \"\";
699: }"
700: [(set_attr "type" "arith")
701: (set_attr "cc" "clobber")])
702:
703: (define_insn "addsi3"
704: [(set (match_operand:SI 0 "int_reg_operand" "=r,r,r")
705: (plus:SI (match_operand:SI 1 "int_reg_operand" "%0,r,r")
706: (match_operand:SI 2 "nonmemory_operand" "rn,0,rn")))]
707: ""
708: "*
709: {
710: if (which_alternative == 2) /* 3 address version */
711: {
712: if (GET_CODE (operands[2]) == CONST_INT)
713: return \"loada %a2(%1),%0\";
714: return \"loada [%2](%1),%0\";
715: }
716: /* 2 address version */
717: if (GET_CODE (operands[2]) == CONST_INT)
718: {
719: int val = INTVAL (operands[2]);
720:
721: if (val >= 16 || val == 0x80000000)
722: return \"addi %2,%0\";
723:
724: if (val < 0) /* change to sub */
725: {
726: rtx xops[2];
727:
728: val = -val;
729:
730: xops[0] = operands[0];
731: xops[1] = gen_rtx (CONST_INT, VOIDmode, val);
732:
733: if (val >= 16)
734: output_asm_insn (\"subi %1,%0\", xops);
735: else
736: output_asm_insn (\"subq %1,%0\", xops);
737:
738: return \"\";
739: }
740:
741: return \"addq %2,%0\";
742: }
743:
744: if (which_alternative == 0)
745: return \"addw %2,%0\";
746:
747: return \"addw %1,%0\";
748: }"
749: [(set_attr "type" "arith,arith,arith")
750: (set_attr "cc" "set1,set1,change0")])
751:
752:
753: ;;- All kinds of subtract instructions.
754:
755: (define_insn "subdi3"
756: [(set (match_operand:DI 0 "int_reg_operand" "=r")
757: (minus:DI (match_operand:DI 1 "int_reg_operand" "%0")
758: (match_operand:DI 2 "int_reg_operand" "r")))]
759: ""
760: "*
761: {
762: rtx xoperands[4];
763:
764: xoperands[0] = operands[0];
765: xoperands[1] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1);
766: xoperands[2] = operands[2];
767: xoperands[3] = gen_rtx (REG, SImode, REGNO (operands[2]) + 1);
768: output_asm_insn (\"subw %2,%0\;subwc %3,%1\", xoperands);
769: return \"\";
770: }"
771: [(set_attr "type" "arith")
772: (set_attr "cc" "clobber")])
773:
774: (define_insn "subsi3"
775: [(set (match_operand:SI 0 "int_reg_operand" "=r")
776: (minus:SI (match_operand:SI 1 "int_reg_operand" "0")
777: (match_operand:SI 2 "nonmemory_operand" "rn")))]
778: ""
779: "*
780: {
781: if (GET_CODE (operands[2]) == CONST_INT)
782: {
783: int val = INTVAL (operands[2]);
784:
785: if (val < 0 || val >= 16)
786: return \"subi %2,%0\";
787: else
788: return \"subq %2,%0\";
789: }
790:
791: return \"subw %2,%0\";
792: }"
793: [(set_attr "type" "arith")])
794:
795: (define_insn "subdf3"
796: [(set (match_operand:DF 0 "fp_reg_operand" "=f")
797: (minus:DF (match_operand:DF 1 "fp_reg_operand" "0")
798: (match_operand:DF 2 "fp_reg_operand" "f")))]
799: ""
800: "subd %2,%0"
801: [(set_attr "type" "fp")])
802:
803: (define_insn "subsf3"
804: [(set (match_operand:SF 0 "fp_reg_operand" "=f")
805: (minus:SF (match_operand:SF 1 "fp_reg_operand" "0")
806: (match_operand:SF 2 "fp_reg_operand" "f")))]
807: ""
808: "subs %2,%0"
809: [(set_attr "type" "fp")])
810:
811:
812: ;;- Multiply instructions.
813:
814: (define_insn "muldf3"
815: [(set (match_operand:DF 0 "fp_reg_operand" "=f")
816: (mult:DF (match_operand:DF 1 "fp_reg_operand" "0")
817: (match_operand:DF 2 "fp_reg_operand" "f")))]
818: ""
819: "muld %2,%0"
820: [(set_attr "type" "fp")])
821:
822: (define_insn "mulsf3"
823: [(set (match_operand:SF 0 "fp_reg_operand" "=f")
824: (mult:SF (match_operand:SF 1 "fp_reg_operand" "0")
825: (match_operand:SF 2 "fp_reg_operand" "f")))]
826: ""
827: "muls %2,%0"
828: [(set_attr "type" "fp")])
829:
830: (define_insn "mulsidi3"
831: [(set (match_operand:DI 0 "int_reg_operand" "=r")
832: (mult:DI (sign_extend:DI (match_operand:SI 1 "int_reg_operand" "%0"))
833: (sign_extend:DI (match_operand:SI 2 "int_reg_operand" "r"))))]
834: ""
835: "mulwx %2,%0"
836: [(set_attr "type" "arith")
837: (set_attr "cc" "clobber")])
838:
839: (define_insn "umulsidi3"
840: [(set (match_operand:DI 0 "int_reg_operand" "=r")
841: (mult:DI (zero_extend:DI (match_operand:SI 1 "int_reg_operand" "%0"))
842: (zero_extend:DI (match_operand:SI 2 "int_reg_operand" "r"))))]
843: ""
844: "mulwux %2,%0"
845: [(set_attr "type" "arith")
846: (set_attr "cc" "clobber")])
847:
848: (define_insn "mulsi3"
849: [(set (match_operand:SI 0 "int_reg_operand" "=r")
850: (mult:SI (match_operand:SI 1 "int_reg_operand" "%0")
851: (match_operand:SI 2 "int_reg_operand" "r")))]
852: ""
853: "mulw %2,%0"
854: [(set_attr "type" "arith")
855: (set_attr "cc" "clobber")])
856:
857:
858: ;;- Divide and mod instructions.
859:
860: (define_insn "divdf3"
861: [(set (match_operand:DF 0 "fp_reg_operand" "=f")
862: (div:DF (match_operand:DF 1 "fp_reg_operand" "0")
863: (match_operand:DF 2 "fp_reg_operand" "f")))]
864: ""
865: "divd %2,%0"
866: [(set_attr "type" "fp")])
867:
868: (define_insn "divsf3"
869: [(set (match_operand:SF 0 "fp_reg_operand" "=f")
870: (div:SF (match_operand:SF 1 "fp_reg_operand" "0")
871: (match_operand:SF 2 "fp_reg_operand" "f")))]
872: ""
873: "divs %2,%0"
874: [(set_attr "type" "fp")])
875:
876: (define_insn "divsi3"
877: [(set (match_operand:SI 0 "int_reg_operand" "=r")
878: (div:SI (match_operand:SI 1 "int_reg_operand" "0")
879: (match_operand:SI 2 "int_reg_operand" "r")))]
880: ""
881: "divw %2,%0"
882: [(set_attr "type" "arith")
883: (set_attr "cc" "clobber")])
884:
885: (define_insn "udivsi3"
886: [(set (match_operand:SI 0 "int_reg_operand" "=r")
887: (udiv:SI (match_operand:SI 1 "int_reg_operand" "0")
888: (match_operand:SI 2 "int_reg_operand" "r")))]
889: ""
890: "divwu %2,%0"
891: [(set_attr "type" "arith")
892: (set_attr "cc" "clobber")])
893:
894:
895: (define_insn "modsi3"
896: [(set (match_operand:SI 0 "int_reg_operand" "=r")
897: (mod:SI (match_operand:SI 1 "int_reg_operand" "0")
898: (match_operand:SI 2 "int_reg_operand" "r")))]
899: ""
900: "modw %2,%0"
901: [(set_attr "type" "arith")
902: (set_attr "cc" "clobber")])
903:
904: (define_insn "umodsi3"
905: [(set (match_operand:SI 0 "int_reg_operand" "=r")
906: (umod:SI (match_operand:SI 1 "int_reg_operand" "0")
907: (match_operand:SI 2 "int_reg_operand" "r")))]
908: ""
909: "modwu %2,%0"
910: [(set_attr "type" "arith")
911: (set_attr "cc" "clobber")])
912:
913: ;;
914: ;; bit and/or instructions
915: ;;
916: (define_insn "andsi3"
917: [(set (match_operand:SI 0 "int_reg_operand" "=r,r")
918: (and:SI (match_operand:SI 1 "int_reg_operand" "%0,0")
919: (match_operand:SI 2 "nonmemory_operand" "r,n")))]
920: ""
921: "@
922: andw %2,%0
923: andi %2,%0"
924: [(set_attr "type" "arith")])
925:
926: (define_insn "iorsi3"
927: [(set (match_operand:SI 0 "int_reg_operand" "=r,r")
928: (ior:SI (match_operand:SI 1 "int_reg_operand" "%0,0")
929: (match_operand:SI 2 "nonmemory_operand" "r,n")))]
930: ""
931: "@
932: orw %2,%0
933: ori %2,%0"
934: [(set_attr "type" "arith")])
935:
936: (define_insn "xorsi3"
937: [(set (match_operand:SI 0 "int_reg_operand" "=r,r")
938: (xor:SI (match_operand:SI 1 "int_reg_operand" "%0,0")
939: (match_operand:SI 2 "nonmemory_operand" "r,n")))]
940: ""
941: "@
942: xorw %2,%0
943: xori %2,%0"
944: [(set_attr "type" "arith")])
945:
946: (define_insn "negdf2"
947: [(set (match_operand:DF 0 "fp_reg_operand" "=f")
948: (neg:DF (match_operand:DF 1 "fp_reg_operand" "f")))]
949: ""
950: "negd %1,%0"
951: [(set_attr "type" "fp")])
952:
953: (define_insn "negsf2"
954: [(set (match_operand:SF 0 "fp_reg_operand" "=f")
955: (neg:SF (match_operand:SF 1 "fp_reg_operand" "f")))]
956: ""
957: "negs %1,%0"
958: [(set_attr "type" "fp")])
959:
960: (define_insn "negsi2"
961: [(set (match_operand:SI 0 "int_reg_operand" "=r")
962: (neg:SI (match_operand:SI 1 "int_reg_operand" "r")))]
963: ""
964: "negw %1,%0"
965: [(set_attr "type" "arith")])
966:
967:
968: (define_insn "one_cmplsi2"
969: [(set (match_operand:SI 0 "int_reg_operand" "=r")
970: (not:SI (match_operand:SI 1 "int_reg_operand" "r")))]
971: ""
972: "notw %1,%0"
973: [(set_attr "type" "arith")])
974:
975:
976:
977: ;; Right shift on the clipper works by negating the shift count,
978: ;; then emitting a right shift with the shift count negated. This means
979: ;; that all actual shift counts in the RTL will be positive.
980:
981: (define_expand "ashrdi3"
982: [(set (match_operand:DI 0 "int_reg_operand" "")
983: (ashiftrt:DI (match_operand:DI 1 "int_reg_operand" "")
984: (match_operand:SI 2 "nonmemory_operand" "")))]
985: ""
986: "
987: {
988: if (GET_CODE (operands[2]) != CONST_INT)
989: operands[2] = gen_rtx (NEG, SImode, negate_rtx (SImode, operands[2]));
990: }")
991:
992: (define_insn ""
993: [(set (match_operand:DI 0 "int_reg_operand" "=r")
994: (ashiftrt:DI (match_operand:DI 1 "int_reg_operand" "0")
995: (match_operand:SI 2 "const_int_operand" "n")))]
996: ""
997: "shali $%n2,%0"
998: [(set_attr "type" "arith")])
999:
1000: (define_insn ""
1001: [(set (match_operand:DI 0 "int_reg_operand" "=r")
1002: (ashiftrt:DI (match_operand:DI 1 "int_reg_operand" "0")
1003: (neg:SI (match_operand:SI 2 "nonmemory_operand" "r"))))]
1004: ""
1005: "shal %2,%0"
1006: [(set_attr "type" "arith")])
1007:
1008: (define_expand "ashrsi3"
1009: [(set (match_operand:SI 0 "int_reg_operand" "")
1010: (ashiftrt:SI (match_operand:SI 1 "int_reg_operand" "")
1011: (match_operand:SI 2 "nonmemory_operand" "")))]
1012: ""
1013: "
1014: {
1015: if (GET_CODE (operands[2]) != CONST_INT)
1016: operands[2] = gen_rtx (NEG, SImode, negate_rtx (SImode, operands[2]));
1017: }")
1018:
1019: (define_insn ""
1020: [(set (match_operand:SI 0 "int_reg_operand" "=r")
1021: (ashiftrt:SI (match_operand:SI 1 "int_reg_operand" "0")
1022: (match_operand:SI 2 "const_int_operand" "n")))]
1023: ""
1024: "shai $%n2,%0"
1025: [(set_attr "type" "arith")])
1026:
1027: (define_insn ""
1028: [(set (match_operand:SI 0 "int_reg_operand" "=r")
1029: (ashiftrt:SI (match_operand:SI 1 "int_reg_operand" "0")
1030: (neg:SI (match_operand:SI 2 "nonmemory_operand" "r"))))]
1031: ""
1032: "shaw %2,%0"
1033: [(set_attr "type" "arith")])
1034:
1035: ;;
1036: ;; left shift
1037: ;;
1038:
1039: (define_insn "ashldi3"
1040: [(set (match_operand:DI 0 "int_reg_operand" "=r,r")
1041: (ashift:DI (match_operand:DI 1 "int_reg_operand" "0,0")
1042: (match_operand:SI 2 "nonmemory_operand" "r,n")))]
1043: ""
1044: "@
1045: shal %2,%0
1046: shali %2,%0"
1047: [(set_attr "type" "arith")])
1048:
1049:
1050: (define_insn "ashlsi3"
1051: [(set (match_operand:SI 0 "int_reg_operand" "=r,r")
1052: (ashift:SI (match_operand:SI 1 "int_reg_operand" "0,0")
1053: (match_operand:SI 2 "nonmemory_operand" "r,n")))]
1054: ""
1055: "*
1056: {
1057: int val;
1058:
1059: if (which_alternative == 0)
1060: return \"shaw %2,%0\";
1061:
1062: val = INTVAL (operands[2]);
1063:
1064: if (val == 2)
1065: return \"addw %0,%0\;addw %0,%0\";
1066:
1067: if (val == 1)
1068: return \"addw %0,%0\";
1069:
1070: return \"shai %2,%0\";
1071: }"
1072: [(set_attr "type" "arith")])
1073:
1074: ;;
1075: ;; logical shift
1076: ;;
1077:
1078: (define_expand "lshrdi3"
1079: [(set (match_operand:DI 0 "int_reg_operand" "")
1080: (lshiftrt:DI (match_operand:DI 1 "int_reg_operand" "")
1081: (match_operand:SI 2 "nonmemory_operand" "")))]
1082: ""
1083: "
1084: {
1085: if (GET_CODE (operands[2]) != CONST_INT)
1086: operands[2] = gen_rtx (NEG, SImode, negate_rtx (SImode, operands[2]));
1087: }")
1088:
1089: (define_insn ""
1090: [(set (match_operand:DI 0 "int_reg_operand" "=r")
1091: (lshiftrt:DI (match_operand:DI 1 "int_reg_operand" "0")
1092: (match_operand:SI 2 "const_int_operand" "n")))]
1093: ""
1094: "shlli $%n2,%0"
1095: [(set_attr "type" "arith")])
1096:
1097: (define_insn ""
1098: [(set (match_operand:DI 0 "int_reg_operand" "=r")
1099: (lshiftrt:DI (match_operand:DI 1 "int_reg_operand" "0")
1100: (neg:SI (match_operand:SI 2 "nonmemory_operand" "r"))))]
1101: ""
1102: "shll %2,%0"
1103: [(set_attr "type" "arith")])
1104:
1105: (define_expand "lshrsi3"
1106: [(set (match_operand:SI 0 "int_reg_operand" "")
1107: (lshiftrt:SI (match_operand:SI 1 "int_reg_operand" "")
1108: (match_operand:SI 2 "nonmemory_operand" "")))]
1109: ""
1110: "
1111: {
1112: if (GET_CODE (operands[2]) != CONST_INT)
1113: operands[2] = gen_rtx (NEG, SImode, negate_rtx (SImode, operands[2]));
1114: }")
1115:
1116: (define_insn ""
1117: [(set (match_operand:SI 0 "int_reg_operand" "=r")
1118: (lshiftrt:SI (match_operand:SI 1 "int_reg_operand" "0")
1119: (match_operand:SI 2 "const_int_operand" "n")))]
1120: ""
1121: "shli $%n2,%0"
1122: [(set_attr "type" "arith")])
1123:
1124: (define_insn ""
1125: [(set (match_operand:SI 0 "int_reg_operand" "=r")
1126: (lshiftrt:SI (match_operand:SI 1 "int_reg_operand" "0")
1127: (neg:SI (match_operand:SI 2 "nonmemory_operand" "r"))))]
1128: ""
1129: "shlw %2,%0"
1130: [(set_attr "type" "arith")])
1131:
1132: (define_insn "lshldi3"
1133: [(set (match_operand:DI 0 "int_reg_operand" "=r,r")
1134: (lshift:DI (match_operand:DI 1 "int_reg_operand" "0,0")
1135: (match_operand:SI 2 "nonmemory_operand" "r,n")))]
1136: ""
1137: "@
1138: shll %2,%0
1139: shlli %2,%0"
1140: [(set_attr "type" "arith")])
1141:
1142: (define_insn "lshlsi3"
1143: [(set (match_operand:SI 0 "int_reg_operand" "=r,r")
1144: (lshift:SI (match_operand:SI 1 "int_reg_operand" "0,0")
1145: (match_operand:SI 2 "nonmemory_operand" "r,n")))]
1146: ""
1147: "@
1148: shlw %2,%0
1149: shli %2,%0"
1150: [(set_attr "type" "arith")])
1151:
1152: ;;
1153: ;; rotate insn
1154: ;;
1155: (define_expand "rotrdi3"
1156: [(set (match_operand:DI 0 "int_reg_operand" "")
1157: (rotatert:DI (match_operand:DI 1 "int_reg_operand" "")
1158: (match_operand:SI 2 "nonmemory_operand" "")))]
1159: ""
1160: "
1161: {
1162: if (GET_CODE (operands[2]) != CONST_INT)
1163: operands[2] = gen_rtx (NEG, SImode, negate_rtx (SImode, operands[2]));
1164: }")
1165:
1166: (define_insn ""
1167: [(set (match_operand:DI 0 "int_reg_operand" "=r")
1168: (rotatert:DI (match_operand:DI 1 "int_reg_operand" "0")
1169: (match_operand:SI 2 "const_int_operand" "n")))]
1170: ""
1171: "rotli $%n2,%0"
1172: [(set_attr "type" "arith")])
1173:
1174: (define_insn ""
1175: [(set (match_operand:DI 0 "int_reg_operand" "=r")
1176: (rotatert:DI (match_operand:DI 1 "int_reg_operand" "0")
1177: (neg:SI (match_operand:SI 2 "nonmemory_operand" "r"))))]
1178: ""
1179: "rotl %2,%0"
1180: [(set_attr "type" "arith")])
1181:
1182: (define_expand "rotrsi3"
1183: [(set (match_operand:SI 0 "int_reg_operand" "")
1184: (rotatert:SI (match_operand:SI 1 "int_reg_operand" "")
1185: (match_operand:SI 2 "nonmemory_operand" "")))]
1186: ""
1187: "
1188: {
1189: if (GET_CODE (operands[2]) != CONST_INT)
1190: operands[2] = gen_rtx (NEG, SImode, negate_rtx (SImode, operands[2]));
1191: }")
1192:
1193: (define_insn ""
1194: [(set (match_operand:SI 0 "int_reg_operand" "=r")
1195: (rotatert:SI (match_operand:SI 1 "int_reg_operand" "0")
1196: (match_operand:SI 2 "const_int_operand" "n")))]
1197: ""
1198: "roti $%n2,%0"
1199: [(set_attr "type" "arith")])
1200:
1201: (define_insn ""
1202: [(set (match_operand:SI 0 "int_reg_operand" "=r")
1203: (rotatert:SI (match_operand:SI 1 "int_reg_operand" "0")
1204: (neg:SI (match_operand:SI 2 "nonmemory_operand" "r"))))]
1205: ""
1206: "rotw %2,%0"
1207: [(set_attr "type" "arith")])
1208:
1209: (define_insn "rotldi3"
1210: [(set (match_operand:DI 0 "int_reg_operand" "=r,r")
1211: (rotate:DI (match_operand:DI 1 "int_reg_operand" "0,0")
1212: (match_operand:SI 2 "nonmemory_operand" "r,n")))]
1213: ""
1214: "@
1215: rotl %2,%0
1216: rotli %2,%0"
1217: [(set_attr "type" "arith")])
1218:
1219: (define_insn "rotlsi3"
1220: [(set (match_operand:SI 0 "int_reg_operand" "=r,r")
1221: (rotate:SI (match_operand:SI 1 "int_reg_operand" "0,0")
1222: (match_operand:SI 2 "nonmemory_operand" "r,n")))]
1223: ""
1224: "@
1225: rotw %2,%0
1226: roti %2,%0"
1227: [(set_attr "type" "arith")])
1228:
1229:
1230: ;;
1231: ;; jump and branch insns
1232: ;;
1233: (define_insn "jump"
1234: [(set (pc)
1235: (label_ref (match_operand 0 "" "")))]
1236: ""
1237: "b %l0"
1238: [(set_attr "type" "branch")])
1239:
1240: (define_insn "tablejump"
1241: [(set (pc) (match_operand:SI 0 "register_operand" "r"))
1242: (use (label_ref (match_operand 1 "" "")))]
1243: ""
1244: "b (%0)"
1245: [(set_attr "type" "branch")])
1246:
1247: (define_insn "beq"
1248: [(set (pc)
1249: (if_then_else (eq (cc0)
1250: (const_int 0))
1251: (label_ref (match_operand 0 "" ""))
1252: (pc)))]
1253: ""
1254: "breq %l0"
1255: [(set_attr "type" "branch")])
1256:
1257: (define_insn "bne"
1258: [(set (pc)
1259: (if_then_else (ne (cc0)
1260: (const_int 0))
1261: (label_ref (match_operand 0 "" ""))
1262: (pc)))]
1263: ""
1264: "brne %l0"
1265: [(set_attr "type" "branch")])
1266:
1267: (define_insn "bgt"
1268: [(set (pc)
1269: (if_then_else (gt (cc0)
1270: (const_int 0))
1271: (label_ref (match_operand 0 "" ""))
1272: (pc)))]
1273: ""
1274: "brgt %l0"
1275: [(set_attr "type" "branch")])
1276:
1277: (define_insn "bgtu"
1278: [(set (pc)
1279: (if_then_else (gtu (cc0)
1280: (const_int 0))
1281: (label_ref (match_operand 0 "" ""))
1282: (pc)))]
1283: ""
1284: "brgtu %l0"
1285: [(set_attr "type" "branch")])
1286:
1287: (define_insn "blt"
1288: [(set (pc)
1289: (if_then_else (lt (cc0)
1290: (const_int 0))
1291: (label_ref (match_operand 0 "" ""))
1292: (pc)))]
1293: ""
1294: "brlt %l0"
1295: [(set_attr "type" "branch")])
1296:
1297: (define_insn "bltu"
1298: [(set (pc)
1299: (if_then_else (ltu (cc0)
1300: (const_int 0))
1301: (label_ref (match_operand 0 "" ""))
1302: (pc)))]
1303: ""
1304: "brltu %l0"
1305: [(set_attr "type" "branch")])
1306:
1307: (define_insn "bge"
1308: [(set (pc)
1309: (if_then_else (ge (cc0)
1310: (const_int 0))
1311: (label_ref (match_operand 0 "" ""))
1312: (pc)))]
1313: ""
1314: "brge %l0"
1315: [(set_attr "type" "branch")])
1316:
1317: (define_insn "bgeu"
1318: [(set (pc)
1319: (if_then_else (geu (cc0)
1320: (const_int 0))
1321: (label_ref (match_operand 0 "" ""))
1322: (pc)))]
1323: ""
1324: "brgeu %l0"
1325: [(set_attr "type" "branch")])
1326:
1327: (define_insn "ble"
1328: [(set (pc)
1329: (if_then_else (le (cc0)
1330: (const_int 0))
1331: (label_ref (match_operand 0 "" ""))
1332: (pc)))]
1333: ""
1334: "brle %l0"
1335: [(set_attr "type" "branch")])
1336:
1337: (define_insn "bleu"
1338: [(set (pc)
1339: (if_then_else (leu (cc0)
1340: (const_int 0))
1341: (label_ref (match_operand 0 "" ""))
1342: (pc)))]
1343: ""
1344: "brleu %l0"
1345: [(set_attr "type" "branch")])
1346:
1347: ;; Recognize reversed jumps.
1348: (define_insn ""
1349: [(set (pc)
1350: (if_then_else (match_operator 0 "comparison_operator"
1351: [(cc0)
1352: (const_int 0)])
1353: (pc)
1354: (label_ref (match_operand 1 "" ""))))]
1355: ""
1356: "br%C0 %l1" ; %C0 negates condition
1357: [(set_attr "type" "branch")])
1358:
1359: ;;
1360: ;; call instructions
1361: ;;
1362: (define_insn "call"
1363: [(call (match_operand:QI 0 "general_operand" "m")
1364: (match_operand:SI 1 "general_operand" ""))]
1365: ;; Operand 1 not used on the clipper.
1366: ""
1367: "call sp,%0")
1368:
1369: (define_insn "call_value"
1370: [(set (match_operand 0 "" "=rf")
1371: (call (match_operand:QI 1 "general_operand" "m")
1372: (match_operand:SI 2 "general_operand" "g")))]
1373: ;; Operand 2 not used on the clipper
1374: ""
1375: "call sp,%1")
1376:
1377: (define_insn "indirect_jump"
1378: [(set (pc) (match_operand:SI 0 "register_operand" "r"))]
1379: ""
1380: "b (%0)"
1381: [(set_attr "type" "branch")])
1382:
1383:
1384: (define_insn "nop"
1385: [(const_int 0)]
1386: ""
1387: "noop"
1388: [(set_attr "type" "arith")
1389: (set_attr "cc" "unchanged")])
1390:
1391:
1392:
1393: ;; while (--foo >= 0)
1394: ;;
1395: ;; Combiners for 'decrement test and branch' do not work for clipper.
1396: ;; These patters are jump_insns that do not allow output reloads and clipper
1397: ;; can only decrement and test registers.
1398: ;;
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.