|
|
1.1 root 1: ;;- Machine description for the Hitachi H8/300 for the GNU C compiler
2: ;; Copyright (C) 1992, 1993 Free Software Foundation, Inc.
3:
4: ;; This file is part of GNU CC.
5:
6: ;; GNU CC is free software; you can redistribute it and/or modify
7: ;; it under the terms of the GNU General Public License as published by
8: ;; the Free Software Foundation; either version 2, or (at your option)
9: ;; any later version.
10:
11: ;; GNU CC is distributed in the hope that it will be useful,
12: ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
13: ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14: ;; GNU General Public License for more details.
15:
16: ;; You should have received a copy of the GNU General Public License
17: ;; along with GNU CC; see the file COPYING. If not, write to
18: ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
19:
20:
21: ;; The original PO technology requires these to be ordered by speed,
22: ;; so that assigner will pick the fastest.
23:
24: ;; See file "rtl.def" for documentation on define_insn, match_*, et. al.
25:
26: (define_attr "type" "branch,return,call,arith,move,float,multi"
27: (const_string "arith"))
28:
29: ;; The size of instructions in bytes.
30:
31: (define_attr "length" ""
32: (cond [(eq_attr "type" "branch")
33: (if_then_else (and (ge (minus (pc) (match_dup 0))
34: (const_int -128))
35: (le (minus (pc) (match_dup 0))
36: (const_int 128)))
37: (const_int 2)
38: (const_int 6))
39: (eq_attr "type" "move") (const_int 4)
40: (eq_attr "type" "return") (const_int 2)
41: (eq_attr "type" "float") (const_int 12)
42: (eq_attr "type" "call") (const_int 4)]
43: (const_int 200)))
44:
45:
46: (define_attr "cc" "none,clobber,none_0hit,set,compare,whoops"
47: (const_string "whoops"))
48:
49: ;; ----------------------------------------------------------------------
50: ;; move instructions
51: ;; ----------------------------------------------------------------------
52:
53: ;; movhi
54:
55: (define_insn ""
56: [(set (match_operand:HI 0 "push_operand" "=<")
57: (match_operand:HI 1 "register_operand" "ra"))]
58: ""
59: "mov.w %T1,%T0"
60: [(set_attr "type" "move")
61: (set_attr "length" "2")
62: (set_attr "cc" "set")])
63:
64: (define_insn "movstricthi"
65: [(set (strict_low_part (match_operand:HI 0 "general_operand_dst" "=r,r,r,o,<"))
66: (match_operand:HI 1 "general_operand_src" "I,r,io,r,r"))]
67: ""
68: "@
69: sub.w %T0,%T0
70: mov.w %T1,%T0
71: mov.w %T1,%T0
72: mov.w %T1,%T0
73: mov.w %T1,%T0"
74: [(set_attr "type" "move")
75: (set_attr "length" "2,2,4,4,2")
76: (set_attr "cc" "set")])
77:
78: (define_insn ""
79: [(set (match_operand:HI 0 "general_operand_dst" "=ra,ra,ra,o,<")
80: (match_operand:HI 1 "general_operand_src" "I,ra,ion,ra,ra"))]
81: ""
82: "@
83: sub.w %T0,%T0
84: mov.w %T1,%T0
85: mov.w %T1,%T0
86: mov.w %T1,%T0
87: mov.w %T1,%T0"
88: [(set_attr "type" "move")
89: (set_attr "length" "2,2,4,4,2")
90: (set_attr "cc" "set")])
91:
92: (define_expand "movhi"
93: [(set (match_operand:HI 0 "general_operand_dst" "")
94: (match_operand:HI 1 "general_operand_src" ""))]
95: ""
96: "
97: {
98: /* One of the ops has to be in a register. */
99: if (! register_operand (operand1, HImode)
100: && ! register_operand (operand0, HImode))
101: operands[1] = copy_to_mode_reg (HImode, operand1);
102: }")
103:
104: (define_insn ""
105: [(set (match_operand:HI 0 "register_operand" "=&ra")
106: (plus:HI (match_operand:HI 1 "general_operand_src" "g")
107: (match_operand:HI 2 "register_operand" "ra")))]
108: ""
109: "mov.w %T1,%T0\;add.w %T2,%T0"
110: [(set_attr "type" "arith")
111: (set_attr "length" "6")
112: (set_attr "cc" "set")])
113:
114: ;; movqi
115:
116: (define_insn ""
117: [(set (match_operand:QI 0 "push_operand" "=<")
118: (match_operand:QI 1 "register_operand" "r"))]
119: ""
120: "mov.w %T1,%T0"
121: [(set_attr "type" "move")
122: (set_attr "length" "2")
123: (set_attr "cc" "set")])
124:
125: (define_insn "movstrictqi"
126: [(set (strict_low_part (match_operand:QI 0 "general_operand_dst" "=r,r,r,o,<"))
127: (match_operand:QI 1 "general_operand_src" "I,r,io,r,r"))]
128: ""
129: "@
130: sub.b %X0,%X0
131: mov.b %X1,%X0
132: mov.b %X1,%X0
133: mov.b %X1,%X0
134: mov.b %X1,%X0"
135: [(set_attr "type" "move")
136: (set_attr "length" "2,2,4,4,2")
137: (set_attr "cc" "set")])
138:
139: (define_insn ""
140: [(set (match_operand:QI 0 "general_operand_dst" "=r,r,r,o,<")
141: (match_operand:QI 1 "general_operand_src" "I,r,io,r,r"))]
142: ""
143: "@
144: sub.b %X0,%X0
145: mov.b %X1,%X0
146: mov.b %X1,%X0
147: mov.b %X1,%X0
148: mov.b %X1,%X0"
149: [(set_attr "type" "move")
150: (set_attr "length" "2,2,4,4,2")
151: (set_attr "cc" "set")])
152:
153: (define_expand "movqi"
154: [(set (match_operand:QI 0 "general_operand_dst" "")
155: (match_operand:QI 1 "general_operand_src" ""))]
156: ""
157: "
158: {
159: /* One of the ops has to be in a register. */
160: if (! register_operand (operand0, QImode)
161: && ! register_operand (operand1, QImode))
162: operands[1] = copy_to_mode_reg (QImode, operand1);
163: }")
164:
165: ;; movsi
166:
167: (define_insn ""
168: [(set (match_operand:SI 0 "general_operand_dst" "=l,l,l,o,<")
169: (match_operand:SI 1 "general_operand_src" "I,l,ion,l,l"))]
170: ""
171: "*
172: {
173: int rn = -1;
174: switch (which_alternative)
175: {
176: case 0:
177: return \"sub.w %e0,%e0\;sub.w %f0,%f0\";
178: case 1:
179: return \"mov.w %e1,%e0\;mov.w %f1,%f0\";
180: case 2:
181: /* Make sure we don't trample the register we index with. */
182:
183: if (GET_CODE (operands[1]) == MEM)
184: {
185: rtx inside = XEXP (operands[1], 0);
186: if (REG_P (inside))
187: rn = REGNO (inside);
188: else if (GET_CODE (inside) == PLUS)
189: {
190: rtx lhs = XEXP (inside, 0);
191: rtx rhs = XEXP (inside, 1);
192: if (REG_P (lhs))
193: rn = REGNO (lhs);
194: if (REG_P (rhs))
195: rn = REGNO (rhs);
196: }
197: }
198: if (rn == REGNO (operands[0]))
199: /* Move the second word first. */
200: return \"mov.w %f1,%f0\;mov.w %e1,%e0\";
201: else
202: return \"mov.w %e1,%e0\;mov.w %f1,%f0\";
203:
204: case 3:
205: return \"mov.w %e1,%e0\;mov.w %f1,%f0\";
206: case 4:
207: return \"mov.w %f1,%T0\;mov.w %e1,%T0\";
208: }
209: }"
210: [(set_attr "type" "move")
211: (set_attr "length" "4,4,8,8,4")
212: (set_attr "cc" "clobber")])
213:
214: (define_insn ""
215: [(set (match_operand:SI 0 "push_operand" "=<")
216: (match_operand:SI 1 "register_operand" "l"))]
217: ""
218: "mov.w %f1,%T0\;mov.w %e1,%T0"
219: [(set_attr "type" "move")
220: (set_attr "length" "4")
221: (set_attr "cc" "clobber")])
222:
223: (define_expand "movsi"
224: [(set (match_operand:SI 0 "general_operand_dst" "")
225: (match_operand:SI 1 "general_operand_src" ""))]
226: ""
227: "if (domovsi (operands)) DONE;")
228:
229: (define_insn ""
230: [(set (match_operand:SF 0 "general_operand_dst" "=l,l,l,o,<")
231: (match_operand:SF 1 "general_operand_src" "I,l,ion,l,l"))]
232: ""
233: "*
234: {
235: /* This is a copy of the movsi stuff. */
236: int rn = -1;
237: switch (which_alternative)
238: {
239: case 0:
240: return \"sub.w %e0,%e0\;sub.w %f0,%f0\";
241: case 1:
242: return \"mov.w %e1,%e0\;mov.w %f1,%f0\";
243: case 2:
244: /* Make sure we don't trample the register we index with. */
245:
246: if (GET_CODE (operands[1]) == MEM)
247: {
248: rtx inside = XEXP (operands[1], 0);
249: if (REG_P (inside))
250: rn = REGNO (inside);
251: else if (GET_CODE (inside) == PLUS)
252: {
253: rtx lhs = XEXP (inside, 0);
254: rtx rhs = XEXP (inside, 1);
255: if (REG_P (lhs))
256: rn = REGNO (lhs);
257: if (REG_P (rhs))
258: rn = REGNO (rhs);
259: }
260: }
261: if (rn == REGNO (operands[0]))
262: /* Move the second word first. */
263: return \"mov.w %f1,%f0\;mov.w %e1,%e0\";
264: else
265: return \"mov.w %e1,%e0\;mov.w %f1,%f0\";
266:
267: case 3:
268: return \"mov.w %e1,%e0\;mov.w %f1,%f0\";
269: case 4:
270: return \"mov.w %f1,%T0\;mov.w %e1,%T0\";
271: }
272: }"
273: [(set_attr "type" "move")
274: (set_attr "length" "4,4,8,8,4")
275: (set_attr "cc" "clobber")])
276:
277: (define_insn ""
278: [(set (match_operand:SF 0 "push_operand" "=<")
279: (match_operand:SF 1 "register_operand" "l"))]
280: ""
281: "mov.w %f1,%T0\;mov.w %e1,%T0"
282: [(set_attr "type" "move")
283: (set_attr "length" "4")
284: (set_attr "cc" "clobber")])
285:
286: (define_expand "movsf"
287: [(set (match_operand:SF 0 "general_operand_dst" "")
288: (match_operand:SF 1 "general_operand_src" ""))]
289: ""
290: "if (domovsi (operands)) DONE;")
291:
292: ;; Block move
293:
294: (define_expand "movstrhi"
295: [(parallel [(set (mem:BLK (match_operand:BLK 0 "general_operand" ""))
296: (mem:BLK (match_operand:BLK 1 "general_operand" "")))
297: (use (match_operand:HI 2 "general_operand" ""))
298: (use (match_operand:HI 3 "immediate_operand" ""))
299: (clobber (match_dup 3))
300: ])]
301: ""
302: "
303: {
304: rtx src_ptr = copy_to_mode_reg (Pmode, XEXP (operands[1], 0));
305: rtx dst_ptr = copy_to_mode_reg (Pmode, XEXP (operands[0], 0));
306:
307: enum machine_mode mode = INTVAL (operands[3]) >=2 ? HImode : QImode;
308: rtx tmpreg = gen_reg_rtx (mode);
309: rtx increment = mode == QImode ? const1_rtx : const2_rtx;
310: rtx length = operands[2];
311: rtx label = gen_label_rtx ();
312: rtx end_src_ptr = gen_reg_rtx (Pmode);
313:
314: emit_insn (gen_rtx (SET, VOIDmode, end_src_ptr,
315: gen_rtx (PLUS, Pmode, src_ptr, length)));
316:
317: emit_label (label);
318: emit_move_insn (tmpreg, gen_rtx (MEM, mode, src_ptr));
319: emit_move_insn (gen_rtx (MEM, mode, dst_ptr), tmpreg);
320: emit_insn (gen_rtx (SET, VOIDmode, src_ptr,
321: gen_rtx (PLUS, Pmode, src_ptr, increment)));
322: emit_insn (gen_rtx (SET, VOIDmode, dst_ptr,
323: gen_rtx (PLUS, Pmode, dst_ptr, increment)));
324:
325: emit_insn (gen_rtx (SET, VOIDmode, cc0_rtx,
326: gen_rtx (COMPARE, HImode, src_ptr, end_src_ptr)));
327: emit_jump_insn (gen_bne (label));
328:
329: DONE;
330: }
331: ")
332:
333: ;; ----------------------------------------------------------------------
334: ;; Test instructions
335: ;; ----------------------------------------------------------------------
336:
337: (define_insn "tstqi"
338: [(set (cc0)
339: (match_operand:QI 0 "register_operand" "ra"))]
340: ""
341: "cmp.b #0,%X0"
342: [(set_attr "type" "arith")
343: (set_attr "length" "2")
344: (set_attr "cc" "set")])
345:
346: (define_insn "tsthi"
347: [(set (cc0)
348: (match_operand:HI 0 "register_operand" "ra"))]
349: ""
350: "mov.w %T0,%T0"
351: [(set_attr "type" "arith")
352: (set_attr "length" "2")
353: (set_attr "cc" "set")])
354:
355: (define_insn "cmphi"
356: [(set (cc0)
357: (compare:HI (match_operand:HI 0 "register_operand" "ra")
358: (match_operand:HI 1 "register_operand" "ra")))]
359: ""
360: "cmp.w %T1,%T0"
361: [(set_attr "type" "arith")
362: (set_attr "length" "2")
363: (set_attr "cc" "compare")])
364:
365: (define_insn "cmpqi"
366: [(set (cc0)
367: (compare:QI (match_operand:QI 0 "register_operand" "ra")
368: (match_operand:QI 1 "nonmemory_operand" "rai")))]
369: ""
370: "cmp.b %X1,%X0"
371: [(set_attr "type" "arith")
372: (set_attr "length" "2")
373: (set_attr "cc" "compare")])
374:
375: ;; ----------------------------------------------------------------------
376: ;; Add instructions
377: ;; ----------------------------------------------------------------------
378:
379: (define_insn ""
380: [(set (match_operand:HI 0 "register_operand" "=ra,ra,ra,ra,r,ra")
381: (plus:HI (match_operand:HI 1 "register_operand" "%0,0,0,0,0,0")
382: (match_operand:HI 2 "nonmemory_operand" "K,M,L,N,n,ra")))]
383: ""
384: "@
385: adds %T2,%T0
386: adds #2,%T0\;adds %C2,%T0
387: subs %M2,%T0
388: subs #2,%T0\;subs %M2,%T0
389: add.b %s2,%s0\;addx %t2,%t0
390: add.w %T2,%T0"
391: [(set_attr "type" "multi,multi,multi,multi,multi,arith")
392: (set_attr "length" "2,4,2,4,4,2")
393: (set_attr "cc" "none_0hit,none_0hit,none_0hit,none_0hit,clobber,set")])
394:
395: (define_expand "addhi3"
396: [(set (match_operand:HI 0 "register_operand" "")
397: (plus:HI (match_operand:HI 1 "register_operand" "")
398: (match_operand:HI 2 "nonmemory_operand" "")))]
399: ""
400: "
401: {
402: if (operands[0] != operands[1])
403: emit_move_insn (operands[0], operands[1]);
404: }")
405:
406: (define_insn "addqi3"
407: [(set (match_operand:QI 0 "register_operand" "=r")
408: (plus:QI (match_operand:QI 1 "register_operand" "%0")
409: (match_operand:QI 2 "nonmemory_operand" "ri")))]
410: ""
411: "add.b %X2,%X0"
412: [(set_attr "type" "arith")
413: (set_attr "length" "2")
414: (set_attr "cc" "set")])
415:
416: (define_insn ""
417: [(set (match_operand:SI 0 "register_operand" "=l,l")
418: (plus:SI (match_operand:SI 1 "register_operand" "%0,0")
419: (match_operand:SI 2 "nonmemory_operand" "l,n")))
420: (clobber (match_operand:HI 3 "register_operand" "=&l,l"))]
421: ""
422: "@
423: add %w2,%w0\;addx %x2,%x0\;addx %y2,%y0\;addx %z2,%z0
424: add.w %f2,%f0\;addx %y2,%y0\;addx %z2,%z0"
425: [(set_attr "type" "multi")
426: (set_attr "length" "8,6")
427: (set_attr "cc" "clobber")])
428:
429: (define_insn ""
430: [(set (match_operand:SI 0 "register_operand" "=l,l")
431: (plus:SI (match_operand:SI 1 "register_operand" "%0,0")
432: (match_operand:SI 2 "nonmemory_operand" "n,r")))]
433: ""
434: "@
435: add %w2,%w0\;addx %x2,%x0\;addx %y2,%y0\;addx %z2,%z0
436: add.w %f2,%f0\;addx %y2,%y0\;addx %z2,%z0"
437: [(set_attr "type" "arith")
438: (set_attr "length" "8,6")
439: (set_attr "cc" "clobber")])
440:
441: (define_expand "addsi3"
442: [(set (match_dup 3) (match_operand:SI 1 "register_operand" ""))
443: (set (match_dup 3)
444: (plus:SI (match_dup 3)
445: (match_operand:SI 2 "nonmemory_operand" "")))
446: (set (match_operand:SI 0 "register_operand" "") (match_dup 3))]
447: ""
448: "
449: {
450: operands[3] = gen_rtx (REG, SImode, 0);
451: }")
452:
453: ;; ----------------------------------------------------------------------;
454: ;; Subtract instructions
455: ;; ----------------------------------------------------------------------
456:
457: (define_insn ""
458: [(set (match_operand:HI 0 "register_operand" "=ra,ra,ra,r")
459: (minus:HI (match_operand:HI 1 "general_operand" "0,0,0,0")
460: (match_operand:HI 2 "nonmemory_operand" "K,M,ra,n")))]
461: ""
462: "@
463: subs %T2,%T0
464: subs #2,%T0\;subs %E2,%T0
465: sub.w %T2,%T0
466: add.b %E2,%s0\;addx %F2,%t0 ; -%0"
467: [(set_attr "type" "multi")
468: (set_attr "length" "2,4,2,4")
469: (set_attr "cc" "none_0hit,none_0hit,set,clobber")])
470:
471: (define_insn "subqi3"
472: [(set (match_operand:QI 0 "register_operand" "=r,r")
473: (minus:QI (match_operand:QI 1 "register_operand" "0,0")
474: (match_operand:QI 2 "nonmemory_operand" "r,i")))]
475: ""
476: "@
477: sub.b %X2,%X0
478: add.b %G2,%X0"
479: [(set_attr "type" "arith")
480: (set_attr "length" "2")
481: (set_attr "cc" "set")])
482:
483: (define_expand "subhi3"
484: [(set (match_operand:HI 0 "register_operand" "")
485: (minus:HI (match_operand:HI 1 "register_operand" "")
486: (match_operand:HI 2 "nonmemory_operand" "")))]
487: ""
488: "
489: {
490: if (operands[0] != operands[1])
491: emit_move_insn (operands[0], operands[1]);
492: }")
493:
494: (define_insn ""
495: [(set (match_operand:SI 0 "register_operand" "=l")
496: (minus:SI (match_operand:SI 1 "register_operand" "%0")
497: (match_operand:SI 2 "register_operand" "l")))]
498: ""
499: "sub.w %f2,%f0\;subx %y2,%y0\;subx %z2,%z0"
500: [(set_attr "type" "arith")
501: (set_attr "length" "6")
502: (set_attr "cc" "clobber")])
503:
504: (define_expand "subsi3"
505: [(set (match_dup 3) (match_operand:SI 1 "register_operand" ""))
506: (set (match_dup 3)
507: (minus:SI (match_dup 3)
508: (match_operand:SI 2 "nonmemory_operand" "")))
509: (set (match_operand:SI 0 "register_operand" "") (match_dup 3))]
510: ""
511: "operands[3] = gen_rtx (REG, SImode, 0);")
512:
513: ;; ----------------------------------------------------------------------
514: ;; Multiply instruction
515: ;; ----------------------------------------------------------------------
516:
517: (define_insn "umulqihi3"
518: [(set (match_operand:HI 0 "register_operand" "=r")
519: (mult:HI (match_operand:QI 1 "general_operand" "%0")
520: (match_operand:QI 2 "register_operand" "r")))]
521: ""
522: "mulxu %X2,%T0"
523: [(set_attr "type" "multi")
524: (set_attr "length" "2")
525: (set_attr "cc" "none_0hit")])
526:
527: ;; ----------------------------------------------------------------------
528: ;; Divide instructions
529: ;; ----------------------------------------------------------------------
530:
531: (define_insn "udivqi3"
532: [(set (match_operand:QI 0 "register_operand" "=r")
533: (udiv:QI (match_operand:HI 1 "general_operand" "0")
534: (match_operand:QI 2 "register_operand" "r")))]
535: ""
536: "divxu %X2,%T0"
537: [(set_attr "type" "multi")
538: (set_attr "length" "2")
539: (set_attr "cc" "clobber")])
540:
541: (define_insn "divqi3"
542: [(set (match_operand:QI 0 "register_operand" "=r")
543: (div:QI (match_operand:HI 1 "general_operand" "0")
544: (match_operand:QI 2 "register_operand" "r")))]
545: ""
546: "divxu %X2,%T0"
547: [(set_attr "type" "multi")
548: (set_attr "length" "2")
549: (set_attr "cc" "clobber")])
550:
551: ;; ----------------------------------------------------------------------
552: ;; And instructions
553: ;; ----------------------------------------------------------------------
554:
555: (define_insn "andqi3"
556: [(set (match_operand:QI 0 "general_operand" "=r")
557: (and:QI (match_operand:QI 1 "general_operand" "%0")
558: (match_operand:QI 2 "general_operand" "rn")))]
559: ""
560: "and %X2,%X0"
561: [(set_attr "type" "arith")
562: (set_attr "length" "2")
563: (set_attr "cc" "set")])
564:
565: (define_insn "andhi3"
566: [(set (match_operand:HI 0 "register_operand" "=r")
567: (and:HI (match_operand:HI 1 "register_operand" "%0")
568: (match_operand:HI 2 "general_operand" "ri")))]
569: ""
570: "and %s2,%s0\;and %t2,%t0"
571: [(set_attr "type" "multi")
572: (set_attr "length" "4")
573: (set_attr "cc" "clobber")])
574:
575: ;; ----------------------------------------------------------------------
576: ;; Or instructions
577: ;; ----------------------------------------------------------------------
578:
579: (define_insn "iorqi3"
580: [(set (match_operand:QI 0 "general_operand" "=r,U")
581: (ior:QI (match_operand:QI 1 "general_operand" "%0,0")
582: (match_operand:QI 2 "general_operand" "rn,P")))]
583: ""
584: "@
585: or %X2,%X0
586: bset %V2,%X0"
587: [(set_attr "type" "arith")
588: (set_attr "length" "2,4")
589: (set_attr "cc" "set,none_0hit")])
590:
591: (define_insn "iorhi3"
592: [(set (match_operand:HI 0 "general_operand" "=r,r")
593: (ior:HI (match_operand:HI 1 "general_operand" "%0,0")
594: (match_operand:HI 2 "general_operand" "J,ri")))]
595: ""
596: "@
597: or %s2,%s0
598: or %s2,%s0\;or %t2,%t0"
599: [(set_attr "type" "multi")
600: (set_attr "length" "2,4")
601: (set_attr "cc" "clobber,clobber")])
602:
603: ;; ----------------------------------------------------------------------
604: ;; Xor instructions
605: ;; ----------------------------------------------------------------------
606:
607: (define_insn "xorqi3"
608: [(set (match_operand:QI 0 "general_operand" "=r")
609: (xor:QI (match_operand:QI 1 "general_operand" "%0")
610: (match_operand:QI 2 "nonmemory_operand" "ri")))]
611: ""
612: "xor %X2,%X0"
613: [(set_attr "type" "arith")
614: (set_attr "length" "2")
615: (set_attr "cc" "set")])
616:
617: (define_insn "xorhi3"
618: [(set (match_operand:HI 0 "general_operand" "=r")
619: (xor:HI (match_operand:HI 1 "general_operand" "%0")
620: (match_operand:HI 2 "nonmemory_operand" "ri")))]
621: ""
622: "xor %s2,%s0\;xor %t2,%t0"
623: [(set_attr "type" "multi")
624: (set_attr "length" "4")
625: (set_attr "cc" "clobber")])
626:
627: ;; ----------------------------------------------------------------------
628: ;; Negation instructions
629: ;; ----------------------------------------------------------------------
630:
631: (define_insn "negqi2"
632: [(set (match_operand:QI 0 "register_operand" "=r")
633: (neg:QI (match_operand:QI 1 "general_operand" "0")))]
634: ""
635: "neg %X0"
636: [(set_attr "type" "arith")
637: (set_attr "length" "2")
638: (set_attr "cc" "set")])
639:
640: (define_expand "neghi2"
641: [(set (match_dup 2)
642: (not:HI (match_operand:HI 1 "register_operand" "r")))
643: (set (match_dup 2) (plus:HI (match_dup 2) (const_int 1)))
644: (set (match_operand:HI 0 "register_operand" "=r")
645: (match_dup 2))]
646: ""
647: "operands[2] = gen_reg_rtx (HImode);")
648:
649: (define_expand "negsi2"
650: [(set (match_dup 2)
651: (not:SI (match_operand:SI 1 "register_operand" "r")))
652: (set (match_dup 2) (plus:SI (match_dup 2) (const_int 1)))
653: (set (match_operand:SI 0 "register_operand" "=r")
654: (match_dup 2))]
655: ""
656: "operands[2] = gen_reg_rtx (SImode);")
657:
658: ;; ----------------------------------------------------------------------
659: ;; Not instructions
660: ;; ----------------------------------------------------------------------
661:
662: (define_insn "one_cmplqi2"
663: [(set (match_operand:QI 0 "register_operand" "=r")
664: (not:QI (match_operand:QI 1 "general_operand" "0")))]
665: ""
666: "not %X0"
667: [(set_attr "type" "arith")
668: (set_attr "length" "2")
669: (set_attr "cc" "set")])
670:
671: (define_insn "one_cmplhi2"
672: [(set (match_operand:HI 0 "register_operand" "=r")
673: (not:HI (match_operand:HI 1 "general_operand" "0")))]
674: ""
675: "not %s0\;not %t0"
676: [(set_attr "type" "arith")
677: (set_attr "length" "4")
678: (set_attr "cc" "clobber")])
679:
680: (define_insn "one_cmplsi2"
681: [(set (match_operand:SI 0 "register_operand" "=r")
682: (not:SI (match_operand:SI 1 "general_operand" "0")))]
683: ""
684: "not %w0\;not %x0\;not %y0\;not %z0"
685: [(set_attr "type" "arith")
686: (set_attr "length" "8")
687: (set_attr "cc" "clobber")])
688:
689: ;; ----------------------------------------------------------------------
690: ;; Conditional branches
691: ;; ----------------------------------------------------------------------
692:
693: (define_expand "ble"
694: [(set (pc)
695: (if_then_else (le (cc0)
696: (const_int 0))
697: (label_ref (match_operand 0 "" ""))
698: (pc)))]
699: ""
700: "")
701:
702: (define_expand "bleu"
703: [(set (pc)
704: (if_then_else (leu (cc0)
705: (const_int 0))
706: (label_ref (match_operand 0 "" ""))
707: (pc)))]
708: ""
709: "")
710:
711: (define_expand "bge"
712: [(set (pc)
713: (if_then_else (ge (cc0)
714: (const_int 0))
715: (label_ref (match_operand 0 "" ""))
716: (pc)))]
717: ""
718: "")
719:
720: (define_expand "bgeu"
721: [(set (pc)
722: (if_then_else (geu (cc0)
723: (const_int 0))
724: (label_ref (match_operand 0 "" ""))
725: (pc)))]
726: ""
727: "")
728:
729: (define_expand "blt"
730: [(set (pc)
731: (if_then_else (lt (cc0)
732: (const_int 0))
733: (label_ref (match_operand 0 "" ""))
734: (pc)))]
735: ""
736: "")
737:
738: (define_expand "bltu"
739: [(set (pc)
740: (if_then_else (ltu (cc0)
741: (const_int 0))
742: (label_ref (match_operand 0 "" ""))
743: (pc)))]
744: ""
745: "")
746:
747: (define_expand "bgt"
748: [(set (pc)
749: (if_then_else (gt (cc0)
750: (const_int 0))
751: (label_ref (match_operand 0 "" ""))
752: (pc)))]
753: ""
754: "")
755:
756: (define_expand "bgtu"
757: [(set (pc)
758: (if_then_else (gtu (cc0)
759: (const_int 0))
760: (label_ref (match_operand 0 "" ""))
761: (pc)))]
762: ""
763: "")
764:
765: (define_expand "beq"
766: [(set (pc)
767: (if_then_else (eq (cc0)
768: (const_int 0))
769: (label_ref (match_operand 0 "" ""))
770: (pc)))]
771: ""
772: "")
773:
774: (define_expand "bne"
775: [(set (pc)
776: (if_then_else (ne (cc0)
777: (const_int 0))
778: (label_ref (match_operand 0 "" ""))
779: (pc)))]
780: ""
781: "")
782:
783: (define_insn ""
784: [(set (pc)
785: (if_then_else
786: (match_operator 1 "comparison_operator" [(cc0) (const_int 0)])
787: (label_ref (match_operand 0 "" ""))
788: (pc)))]
789: ""
790: "*
791: {
792: if (get_attr_length (insn) == 2)
793: return \"b%j1 %l0\";
794: else
795: return \"b%k1 %L0\;jmp @%l0\;%L0:\";
796: }"
797: [(set_attr "type" "branch")
798: (set_attr "cc" "none")])
799:
800: (define_insn ""
801: [(set (pc)
802: (if_then_else
803: (match_operator 1 "comparison_operator" [(cc0) (const_int 0)])
804: (pc)
805: (label_ref (match_operand 0 "" ""))))]
806: ""
807: "*
808: {
809: if (get_attr_length (insn) == 2)
810: return \"b%k1 %l0\";
811: else
812: return \"b%j1 %L0\;jmp @%l0\;%L0:\";
813: }"
814: [(set_attr "type" "branch")
815: (set_attr "cc" "none")])
816:
817: ;; ----------------------------------------------------------------------
818: ;; Unconditional branches
819: ;; ----------------------------------------------------------------------
820:
821: (define_insn "jump"
822: [(set (pc)
823: (label_ref (match_operand 0 "" "")))]
824: ""
825: "*
826: {
827: if (get_attr_length (insn) == 2)
828: return \"bra %l0\";
829: else
830: return \"jmp @%l0\";
831: }"
832: [(set_attr "type" "branch")
833: (set_attr "cc" "none")])
834:
835: (define_insn "tablejump"
836: [(set (pc) (match_operand:HI 0 "register_operand" ""))
837: (use (label_ref (match_operand 1 "" "")))]
838: ""
839: "jmp @%0"
840: [(set_attr "type" "branch")
841: (set_attr "cc" "none")
842: (set_attr "length" "2")])
843:
844: ;; Call subroutine with no return value.
845:
846: (define_insn "call"
847: [(call (match_operand:QI 0 "memory_operand" "o")
848: (match_operand:HI 1 "general_operand" "g"))]
849: ""
850: "jsr %0"
851: [(set_attr "type" "call")
852: (set_attr "cc" "clobber")
853: (set_attr "length" "4")])
854:
855: ;; Call subroutine, returning value in operand 0
856: ;; (which must be a hard register).
857:
858: (define_insn "call_value"
859: [(set (match_operand 0 "" "=r")
860: (call (match_operand:QI 1 "memory_operand" "o")
861: (match_operand:HI 2 "general_operand" "g")))]
862: ""
863: "jsr %1"
864: [(set_attr "type" "call")
865: (set_attr "cc" "clobber")
866: (set_attr "length" "4")])
867:
868: (define_insn "nop"
869: [(const_int 0)]
870: ""
871: "nop"
872: [(set_attr "type" "multi")
873: (set_attr "cc" "none")
874: (set_attr "length" "2")])
875:
876: (define_insn "indirect_jump"
877: [(set (pc) (match_operand:HI 0 "register_operand" "r"))]
878: ""
879: "jmp @%0"
880: [(set_attr "type" "branch")
881: (set_attr "cc" "none")
882: (set_attr "length" "2")])
883:
884: ;; -----------------------------------------------------------------
885: ;; Shifts
886: ;; -----------------------------------------------------------------
887:
888: ;; All H8 shifts go one bit at a time, here they are defined with names
889: ;; so can use them in the expands..
890:
891: ;; QI BIT SHIFTS
892:
893: (define_insn "ashlqi3_one"
894: [(set (match_operand:QI 0 "register_operand" "=r")
895: (ashift:QI (match_operand:QI 1 "register_operand" "0")
896: (const_int 1)))]
897: ""
898: "shal %X0"
899: [(set_attr "type" "arith")
900: (set_attr "length" "2")
901: (set_attr "cc" "set")])
902:
903: (define_insn "ashrqi3_one"
904: [(set (match_operand:QI 0 "register_operand" "=r")
905: (ashiftrt:QI (match_operand:QI 1 "register_operand" "0")
906: (const_int 1)))]
907: ""
908: "shar %X0"
909: [(set_attr "type" "arith")
910: (set_attr "length" "2")
911: (set_attr "cc" "set")])
912:
913: (define_insn "lshrqi3_one"
914: [(set (match_operand:QI 0 "register_operand" "=r")
915: (lshiftrt:QI (match_operand:QI 1 "register_operand" "0")
916: (const_int 1)))]
917: ""
918: "shlr %X0"
919: [(set_attr "type" "arith")
920: (set_attr "length" "2")
921: (set_attr "cc" "set")])
922:
923: (define_expand "ashlqi3"
924: [(set (match_operand:QI 0 "register_operand" "=r")
925: (ashift:QI (match_operand:QI 1 "register_operand" "0")
926: (match_operand:QI 2 "nonmemory_operand" "rn")))]
927: ""
928: "
929: {
930: if (can_shift (ASHIFT, operands, gen_ashlqi3_one, 4, 0))
931: DONE;
932: else
933: FAIL;
934: }")
935:
936: (define_expand "ashrqi3"
937: [(set (match_operand:QI 0 "register_operand" "=r")
938: (ashiftrt:QI (match_operand:QI 1 "register_operand" "0")
939: (match_operand:QI 2 "nonmemory_operand" "rn")))]
940: ""
941: "
942: {
943: if (can_shift (ASHIFTRT, operands, gen_ashrqi3_one, 4, 0))
944: DONE;
945: else
946: FAIL;
947: }")
948:
949: (define_expand "lshrqi3"
950: [(set (match_operand:QI 0 "register_operand" "=r")
951: (lshiftrt:QI (match_operand:QI 1 "register_operand" "0")
952: (match_operand:QI 2 "nonmemory_operand" "rn")))]
953: ""
954: "
955: {
956: if (can_shift (LSHIFTRT, operands, gen_lshrqi3_one, 4, 0))
957: DONE;
958: else
959: FAIL;
960: }")
961:
962: ;; HI BIT SHIFTS
963:
964: (define_insn "ashlhi3_one"
965: [(set (match_operand:HI 0 "register_operand" "=r")
966: (ashift:HI (match_operand:HI 1 "register_operand" "0")
967: (const_int 1)))]
968: ""
969: "add.w %T1,%T0"
970: [(set_attr "type" "multi")
971: (set_attr "length" "4")
972: (set_attr "cc" "set")])
973:
974: (define_insn "ashlhi3_eight"
975: [(set (match_operand:HI 0 "register_operand" "=r")
976: (ashift:HI (match_operand:HI 1 "register_operand" "0")
977: (const_int 8)))]
978: ""
979: "mov.b %s1,%t0\;mov.b #0,%s0"
980: [(set_attr "type" "multi")
981: (set_attr "length" "4")
982: (set_attr "cc" "clobber")])
983:
984: (define_expand "ashlhi3"
985: [(set (match_operand:HI 0 "register_operand" "")
986: (ashift:HI
987: (match_operand:HI 1 "general_operand_src" "")
988: (match_operand:HI 2 "nonmemory_operand" "")))]
989: ""
990: "
991: {
992: if (can_shift (ASHIFT, operands, gen_ashlhi3_one, 4, gen_ashlhi3_eight))
993: DONE;
994: else
995: FAIL;
996: }")
997:
998: (define_insn "lshrhi3_one"
999: [(set (match_operand:HI 0 "register_operand" "=r")
1000: (lshiftrt:HI (match_operand:HI 1 "register_operand" "0")
1001: (const_int 1)))]
1002: ""
1003: "shlr %t0\;rotxr %s0"
1004: [(set_attr "type" "multi")
1005: (set_attr "length" "4")
1006: (set_attr "cc" "clobber")])
1007:
1008: (define_insn "lshlhi3_eight"
1009: [(set (match_operand:HI 0 "register_operand" "=r")
1010: (lshiftrt:HI (match_operand:HI 1 "register_operand" "0")
1011: (const_int 8)))]
1012: ""
1013: "mov.b %t1,%s0\;mov.b #0,%t0"
1014: [(set_attr "type" "multi")
1015: (set_attr "length" "4")
1016: (set_attr "cc" "clobber")])
1017:
1018: (define_expand "lshrhi3"
1019: [(set (match_operand:HI 0 "register_operand" "")
1020: (lshiftrt:HI
1021: (match_operand:HI 1 "general_operand_src" "")
1022: (match_operand:HI 2 "nonmemory_operand" "")))]
1023: ""
1024: "
1025: {
1026: if (can_shift (LSHIFTRT, operands, gen_lshrhi3_one, 4, gen_lshlhi3_eight))
1027: DONE;
1028: else
1029: FAIL;
1030: }")
1031:
1032: (define_insn "ashrhi3_one"
1033: [(set (match_operand:HI 0 "register_operand" "=r")
1034: (ashiftrt:HI (match_operand:HI 1 "register_operand" "0")
1035: (const_int 1)))]
1036: ""
1037: "shar %t0\;rotxr %s0"
1038: [(set_attr "type" "multi")
1039: (set_attr "length" "4")
1040: (set_attr "cc" "clobber")])
1041:
1042: ; signed shift right by 8 bits
1043: ; fetch the carry bit from the top, copy the byte right, subtract the
1044: ; top byte from itself - carry.
1045:
1046: (define_insn "ashrhi3_eight"
1047: [(set (match_operand:HI 0 "register_operand" "=r")
1048: (ashiftrt:HI (match_operand:HI 1 "register_operand" "0")
1049: (const_int 8)))]
1050: ""
1051: "bld #7,%t0\;mov.b %t0,%s0\;subx %t0,%t0"
1052: [(set_attr "type" "multi")
1053: (set_attr "length" "6")
1054: (set_attr "cc" "clobber")])
1055:
1056: (define_expand "ashrhi3"
1057: [(set (match_operand:HI 0 "register_operand" "")
1058: (ashiftrt:HI
1059: (match_operand:HI 1 "general_operand_src" "")
1060: (match_operand:HI 2 "nonmemory_operand" "")))]
1061: ""
1062: "
1063: {
1064: if (can_shift (ASHIFTRT, operands, gen_ashrhi3_one, 4, gen_ashrhi3_eight))
1065: DONE;
1066: else
1067: FAIL;
1068: }")
1069:
1070: ;; SI BIT SHIFTS
1071:
1072: (define_insn "ashlsi3_one"
1073: [(set (match_operand:SI 0 "register_operand" "=r")
1074: (ashift:SI (match_operand:SI 1 "register_operand" "0")
1075: (const_int 1)))]
1076: ""
1077: "add.w %f1,%f0\;addx %y1,%y0\;addx %z1,%z0"
1078: [(set_attr "type" "multi")
1079: (set_attr "length" "6")
1080: (set_attr "cc" "clobber")])
1081:
1082: (define_expand "ashlsi3"
1083: [(set (match_operand:SI 0 "register_operand" "")
1084: (ashift:SI
1085: (match_operand:SI 1 "general_operand_src" "")
1086: (match_operand:SI 2 "nonmemory_operand" "")))]
1087: ""
1088: "
1089: {
1090: if (can_shift (ASHIFT, operands, gen_ashlsi3_one, 1, 0))
1091: DONE;
1092: else
1093: FAIL;
1094: }")
1095:
1096: (define_insn "lshrsi3_one"
1097: [(set (match_operand:SI 0 "register_operand" "=r")
1098: (lshiftrt:SI (match_operand:SI 1 "register_operand" "0")
1099: (const_int 1)))]
1100: ""
1101: "shlr %z0\;rotxr %y0\;rotxr %x0\;rotxr %w0"
1102: [(set_attr "type" "multi")
1103: (set_attr "length" "8")
1104: (set_attr "cc" "clobber")])
1105:
1106: (define_expand "lshrsi3"
1107: [(set (match_operand:SI 0 "register_operand" "")
1108: (lshiftrt:SI
1109: (match_operand:SI 1 "general_operand_src" "")
1110: (match_operand:SI 2 "nonmemory_operand" "")))]
1111: ""
1112: "
1113: {
1114: if (can_shift (LSHIFTRT, operands, gen_lshrsi3_one, 1, 0))
1115: DONE;
1116: else
1117: FAIL;
1118: }")
1119:
1120: (define_insn "ashrsi3_one"
1121: [(set (match_operand:SI 0 "register_operand" "=r")
1122: (ashiftrt:SI (match_operand:SI 1 "register_operand" "0")
1123: (const_int 1)))]
1124: ""
1125: "shar %z0\;rotxr %y0\;rotxr %x0\;rotxr %w0"
1126: [(set_attr "type" "multi")
1127: (set_attr "length" "16")
1128: (set_attr "cc" "clobber")])
1129:
1130: (define_expand "ashrsi3"
1131: [(set (match_operand:SI 0 "register_operand" "")
1132: (ashiftrt:SI
1133: (match_operand:SI 1 "general_operand_src" "")
1134: (match_operand:SI 2 "nonmemory_operand" "")))]
1135: ""
1136: "
1137: {
1138: if (can_shift (ASHIFTRT, operands, gen_ashrsi3_one, 1, 0))
1139: DONE;
1140: else
1141: FAIL;
1142: }")
1143:
1144: ;; ----------------------------------------------------------------------
1145: ;; BIT FIELDS
1146: ;; ----------------------------------------------------------------------
1147:
1148: (define_insn ""
1149: [(set (zero_extract:HI (match_operand:HI 0 "register_operand" "+r")
1150: (const_int 1)
1151: (match_operand:HI 2 "general_operand" "g"))
1152: (match_operand:HI 3 "general_operand" "r"))]
1153: ""
1154: "bld #0,%3l\;bst %Z2,%0%Y1"
1155: [(set_attr "type" "multi")
1156: (set_attr "length" "4")
1157: (set_attr "cc" "clobber")])
1158:
1159: (define_expand "insv"
1160: [(set (zero_extract:HI (match_operand:HI 0 "register_operand" "+r")
1161: (match_operand:HI 1 "general_operand" "g")
1162: (match_operand:HI 2 "general_operand" "g"))
1163: (match_operand:HI 3 "general_operand" "r"))]
1164: ""
1165: "if (INTVAL (operands[1]) != 1) FAIL;")
1166:
1167: (define_insn ""
1168: [(set (match_operand:HI 0 "register_operand" "=&r")
1169: (zero_extract:HI (match_operand:HI 1 "register_operand" "r")
1170: (const_int 1)
1171: (match_operand:HI 3 "general_operand" "g")))]
1172: ""
1173: "sub.w %T0,%T0\;bld %Z3,%T1%Y1\;rotxl %T0l"
1174: [(set_attr "type" "multi")
1175: (set_attr "length" "6")
1176: (set_attr "cc" "clobber")])
1177:
1178: (define_insn ""
1179: [(set (match_operand:HI 0 "register_operand" "=r")
1180: (sign_extract:HI (match_operand:HI 1 "register_operand" "r")
1181: (const_int 1)
1182: (match_operand:HI 3 "general_operand" "g")))]
1183: ""
1184: "bld %Z3,%1%Y1\;sub.x %0l,%0l\;mov.b %0l,%0h"
1185: [(set_attr "type" "multi")
1186: (set_attr "length" "6")
1187: (set_attr "cc" "clobber")])
1188:
1189: (define_expand "extzv"
1190: [(set (match_operand:HI 0 "register_operand" "")
1191: (zero_extract:HI (match_operand:HI 1 "register_operand" "")
1192: (match_operand:HI 2 "general_operand" "")
1193: (match_operand:HI 3 "general_operand" "")))]
1194: ""
1195: "if (INTVAL (operands[2]) != 1) FAIL;")
1196:
1197: (define_expand "extv"
1198: [(set (match_operand:HI 0 "register_operand" "")
1199: (sign_extract:HI (match_operand:HI 1 "register_operand" "")
1200: (match_operand:HI 2 "general_operand" "")
1201: (match_operand:HI 3 "immediate_operand" "")))]
1202: ""
1203: "if (INTVAL (operands[2]) != 1) FAIL;")
1204:
1205: ;; ----------------------------------------------------------------------
1206: ;; Conversions
1207: ;; ----------------------------------------------------------------------
1208:
1209: (define_insn "zero_extendqihi2"
1210: [(set (match_operand:HI 0 "register_operand" "=r")
1211: (zero_extend:HI
1212: (match_operand:QI 1 "general_operand" "g")))]
1213: ""
1214: "mov.b %X1,%s0\;mov.b #0,%t0"
1215: [(set_attr "type" "multi")
1216: (set_attr "length" "4")
1217: (set_attr "cc" "clobber")])
1218:
1219: (define_insn "extendqihi2"
1220: [(set (match_operand:HI 0 "register_operand" "=r")
1221: (sign_extend:HI
1222: (match_operand:QI 1 "register_operand" "r")))]
1223: ""
1224: "*
1225: {
1226: if (REGNO (operands[1]) != REGNO (operands[0]))
1227: return \"mov.b %X1,%s0\;bld #7,%s0\;subx %t0,%t0\";
1228: else
1229: return \"bld #7,%s0\;subx %t0,%t0\";
1230: }"
1231: [(set_attr "type" "multi")
1232: (set_attr "length" "6")
1233: (set_attr "cc" "clobber")])
1234:
1235: (define_insn "extendhisi2_one"
1236: [(set (match_operand:SI 0 "register_operand" "=l")
1237: (sign_extend:SI (match_operand:HI 1 "register_operand" "0")))]
1238: ""
1239: "mov.w %T1,%f0\;bld #7,%x0\;subx %y0,%y0\;subx %z0,%z0"
1240: [(set_attr "length" "10")
1241: (set_attr "cc" "clobber")])
1242:
1243: (define_expand "extendhisi2"
1244: [(set (reg:HI 1) (match_operand:HI 1 "general_operand" ""))
1245: (set (reg:SI 0) (sign_extend:SI (reg:HI 1)))
1246: (set (match_operand:SI 0 "general_operand" "" ) (reg:SI 0))]
1247: ""
1248: "")
1249:
1250: ;; ----------------------------------------------------------------------
1251: ;; peepholes
1252: ;; ----------------------------------------------------------------------
1253:
1254: ;; notice a move which could be predecremented
1255:
1256: (define_peephole
1257: [(set (match_operand:HI 1 "register_operand" "")
1258: (plus:HI (match_dup 1) (const_int -1)))
1259: (set (mem:HI (match_dup 1))
1260: (match_operand:HI 0 "register_operand" ""))]
1261: "REGNO (operands[1]) != REGNO (operands[0])"
1262: "mov.w %T0,@-%T1"
1263: [(set_attr "length" "2")
1264: (set_attr "cc" "set")])
1265:
1266: (define_peephole
1267: [(set (match_operand:HI 1 "register_operand" "")
1268: (plus:HI (match_dup 1) (const_int -1)))
1269: (set (mem:QI (match_dup 1))
1270: (match_operand:QI 0 "register_operand" ""))]
1271: "REGNO (operands[1]) != REGNO (operands[0])"
1272: "mov.b %X0,@-%T1"
1273: [(set_attr "length" "2")
1274: (set_attr "cc" "set")])
1275:
1276: ;; notice a move which could be post incremented
1277:
1278: (define_peephole
1279: [(set (match_operand:HI 0 "register_operand" "")
1280: (mem:HI (match_operand:HI 1 "register_operand" "")))
1281: (set (match_dup 1) (plus:HI (match_dup 1) (const_int 2)))]
1282: "REGNO (operands[1]) != REGNO (operands[0])"
1283: "mov.w @%T1+,%T0"
1284: [(set_attr "length" "2")
1285: (set_attr "cc" "set")])
1286:
1287: (define_peephole
1288: [(set (match_operand:QI 0 "register_operand" "")
1289: (mem:QI (match_operand:HI 1 "register_operand" "")))
1290: (set (match_dup 1) (plus:HI (match_dup 1) (const_int 1)))]
1291: "REGNO (operands[1]) != REGNO (operands[0])"
1292: "mov.b @%T1+,%X0"
1293: [(set_attr "length" "2")
1294: (set_attr "cc" "set")])
1295:
1296: ;; notice when two byte moves in a row could be a word move
1297:
1298: (define_peephole
1299: [(set (mem:QI (plus:HI (match_operand:HI 1 "register_operand" "ra")
1300: (match_operand:HI 2 "immediate_operand" "n")))
1301: (match_operand:QI 0 "register_operand" "r"))
1302: (set (mem:QI (plus:HI (match_dup 1)
1303: (match_operand:HI 4 "immediate_operand" "n")))
1304: (match_operand:QI 3 "register_operand" "r"))]
1305: "(INTVAL (operands[2]) == INTVAL (operands[4]) + 1)
1306: && (REGNO (operands[0]) + 1 == REGNO (operands[3]))"
1307: "mov.w %T0,@(%u4,%T1)"
1308: [(set_attr "length" "6")
1309: (set_attr "cc" "set")])
1310:
1311: (define_peephole
1312: [(set (match_operand:QI 0 "register_operand" "=r")
1313: (mem:QI (plus:HI (match_operand:HI 1 "register_operand" "ra")
1314: (match_operand:HI 2 "immediate_operand" "n"))))
1315: (set (match_operand:QI 3 "register_operand" "=r")
1316: (mem:QI (plus:HI (match_dup 1)
1317: (match_operand:HI 4 "immediate_operand" "n"))))]
1318: "(INTVAL (operands[2]) == INTVAL (operands[4]) + 1)
1319: && (REGNO (operands[0]) + 1 == REGNO (operands[3]))"
1320: "mov.w @(%u4,%T1),%T0"
1321: [(set_attr "length" "6")
1322: (set_attr "cc" "set")])
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.