|
|
1.1 root 1: ;;- Machine description the Hitachi SH
2: ;; Copyright (C) 1993 Free Software Foundation, Inc.
3: ;; Contributed by Steve Chamberlain ([email protected])
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 2, 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: ;;- See file "rtl.def" for documentation on define_insn, match_*, et. al.
22:
23:
24:
25: ;; -------------------------------------------------------------------------
26: ;; Attributes
27: ;; -------------------------------------------------------------------------
28:
29: ; Target CPU.
30:
31: (define_attr "cpu" "sh0,sh1,sh2,sh3"
32: (const (symbol_ref "sh_cpu")))
33:
34: (define_attr "type" "cbranch,ctable,jump,arith,other,load,store,move,smpy,dmpy,return,pload"
35: (const_string "other"))
36:
37: ; If a conditional branch destination is within -100..100 bytes away
38: ; from the instruction it can be 2 bytes long. Something in the
39: ; range -4000..4000 bytes can be 6 bytes long, all other conditional
40: ; branches are 8 bytes long.
41:
42: ; An unconditional jump which can reach forward or back 4k can be
43: ; 6 bytes long (including the delay slot). If it is too big, it
44: ; must be 8 bytes long.
45:
46: ; All other instructions are two bytes long by default.
47:
48: (define_attr "length" ""
49: (cond [(eq_attr "type" "cbranch")
50: (if_then_else (and (ge (minus (pc) (match_dup 0))
51: (const_int -100))
52: (le (minus (pc) (match_dup 0))
53: (const_int 100)))
54: (const_int 2)
55: (if_then_else (and (ge (minus (pc) (match_dup 0))
56: (const_int -4000))
57: (le (minus (pc) (match_dup 0))
58: (const_int 4000)))
59: (const_int 6)
60: (const_int 8)))
61:
62: (eq_attr "type" "jump")
63: (if_then_else (and (ge (minus (pc) (match_dup 0))
64: (const_int -4000))
65: (le (minus (pc) (match_dup 0))
66: (const_int 4000)))
67: (const_int 4)
68: (const_int 6))
69: ] (const_int 2)))
70:
71: ;; (define_function_unit {name} {num-units} {n-users} {test}
72: ;; {ready-delay} {issue-delay} [{conflict-list}])
73:
74: (define_function_unit "memory" 1 1 (eq_attr "type" "load") 1 0)
75: (define_function_unit "mpy" 1 1 (eq_attr "type" "smpy") 3 0)
76: (define_function_unit "mpy" 1 1 (eq_attr "type" "dmpy") 5 0)
77:
78: (define_attr "needs_delay_slot" "yes,no"
79: (cond [(eq_attr "type" "jump") (const_string "yes")
80: (eq_attr "type" "return") (const_string "yes")]
81: (const_string "no")))
82:
83: (define_delay
84: (eq_attr "needs_delay_slot" "yes")
85: [(eq_attr "in_delay_slot" "yes") (nil) (nil)])
86:
87:
88: (define_attr "dump" "yes,no,must" (const_string "no"))
89: (define_attr "constneed" "yes,no" (const_string "no"))
90: (define_attr "smallestsize" "" (const_int 2))
91: (define_attr "largestsize" "" (const_int 8))
92: (define_attr "constantsize" "" (const_int 4))
93:
94: (define_attr "in_delay_slot" "maybe,yes,no"
95: (cond [(eq_attr "type" "cbranch") (const_string "no")
96: (eq_attr "type" "jump") (const_string "no")
97: (eq_attr "type" "pload") (const_string "no")
98: (eq_attr "type" "return") (const_string "no")
99: (eq_attr "length" "2") (const_string "yes")
100: (eq_attr "length" "4,6,8,10,12") (const_string "no")
101: ] (const_string "yes")))
102:
103:
104:
105: ;; -------------------------------------------------------------------------
106: ;; SImode signed integer comparisons
107: ;; -------------------------------------------------------------------------
108:
109: (define_insn ""
110: [(set (match_operand:SI 0 "arith_reg_operand" "=r")
111: (eq:SI (reg:SI 18)
112: (const_int 1)))]
113: ""
114: "movt %0 !movt1")
115:
116: (define_insn ""
117: [(set (reg:SI 18) (gt (match_operand:SI 0 "arith_reg_operand" "r")
118: (const_int 0)))]
119: ""
120: "cmp/pl %0")
121:
122: (define_insn ""
123: [(set (reg:SI 18) (ge (match_operand:SI 0 "arith_reg_operand" "r")
124: (const_int 0)))]
125: ""
126: "cmp/pz %0")
127:
128: (define_insn "cmpeqsi_t"
129: [(set (reg:SI 18) (eq (match_operand:SI 0 "arith_reg_operand" "r,z")
130: (match_operand:SI 1 "arith_operand" "r,I")))]
131: ""
132: "cmp/eq %1,%0")
133:
134:
135: (define_insn "cmpgtsi_t"
136: [(set (reg:SI 18) (gt (match_operand:SI 0 "arith_reg_operand" "r")
137: (match_operand:SI 1 "arith_reg_operand" "r")))]
138: ""
139: "cmp/gt %1,%0")
140:
141: (define_insn "cmpgesi_t"
142: [(set (reg:SI 18) (ge (match_operand:SI 0 "arith_reg_operand" "r")
143: (match_operand:SI 1 "arith_reg_operand" "r")))]
144: ""
145: "cmp/ge %1,%0")
146:
147: (define_insn "cmpltsi_t"
148: [(set (reg:SI 18) (lt (match_operand:SI 0 "arith_reg_operand" "r")
149: (match_operand:SI 1 "arith_reg_operand" "r")))]
150: ""
151: "cmp/gt %0,%1")
152:
153: (define_insn "cmplesi_t"
154: [(set (reg:SI 18) (le (match_operand:SI 0 "arith_reg_operand" "r")
155: (match_operand:SI 1 "arith_reg_operand" "r")))]
156: ""
157: "cmp/ge %0,%1")
158:
159:
160: ;; -------------------------------------------------------------------------
161: ;; SImode unsigned integer comparisons
162: ;; -------------------------------------------------------------------------
163:
164: (define_insn "cmpgeusi_t"
165: [(set (reg:SI 18) (geu (match_operand:SI 0 "arith_reg_operand" "r")
166: (match_operand:SI 1 "arith_reg_operand" "r")))]
167: ""
168: "cmp/hs %1,%0")
169:
170: (define_insn "cmpgtusi_t"
171: [(set (reg:SI 18) (gtu (match_operand:SI 0 "arith_reg_operand" "r")
172: (match_operand:SI 1 "arith_reg_operand" "r")))]
173: ""
174: "cmp/hi %1,%0")
175:
176: (define_insn "cmpleusi_t"
177: [(set (reg:SI 18) (leu (match_operand:SI 0 "arith_reg_operand" "r")
178: (match_operand:SI 1 "arith_reg_operand" "r")))]
179: ""
180: "cmp/hs %0,%1")
181:
182: (define_insn "cmpltusi_t"
183: [(set (reg:SI 18) (ltu (match_operand:SI 0 "arith_reg_operand" "r")
184: (match_operand:SI 1 "arith_reg_operand" "r")))]
185: ""
186: "cmp/hi %0,%1")
187:
188: ;; We save the compare operands in the cmpxx patterns and use them when
189: ;; we generate the branch.
190:
191: (define_expand "cmpsi"
192: [(set (reg:SI 18) (compare (match_operand:SI 0 "arith_reg_operand" "")
193: (match_operand:SI 1 "arith_reg_operand" "")))]
194: ""
195: "
196: { sh_compare_op0 = operands[0];
197: sh_compare_op1 = operands[1];
198: DONE;
199: }")
200:
201:
202: ;; -------------------------------------------------------------------------
203: ;; Addition instructions
204: ;; -------------------------------------------------------------------------
205:
206: (define_insn "adddi3"
207: [(set (match_operand:DI 0 "arith_reg_operand" "=&r")
208: (plus:DI (match_operand:DI 1 "arith_reg_operand" "%0")
209: (match_operand:DI 2 "arith_reg_operand" "r")))
210: (clobber (reg:SI 18))]
211: ""
212: "clrt\;addc %R2,%R0\;addc %2,%0"
213: [(set_attr "length" "6")
214: (set_attr "in_delay_slot" "no")
215: (set_attr "type" "arith")])
216:
217:
218: (define_insn "addsi3_i"
219: [(set (match_operand:SI 0 "arith_reg_operand" "=r")
220: (plus:SI (match_operand:SI 1 "arith_reg_operand" "%0")
221: (match_operand:SI 2 "arith_operand" "rI")))]
222: ""
223: "add %2,%0"
224: [(set_attr "length" "2")
225: (set_attr "type" "arith")])
226:
227: (define_expand "addsi3"
228: [(set (match_operand:SI 0 "arith_reg_operand" "=r")
229: (plus:SI (match_operand:SI 1 "arith_reg_operand" "%0")
230: (match_operand:SI 2 "arith_operand" "rI")))]
231: ""
232: "")
233:
234:
235: ;; -------------------------------------------------------------------------
236: ;; Subtraction instructions
237: ;; -------------------------------------------------------------------------
238:
239: (define_insn "subdi3"
240: [(set (match_operand:DI 0 "arith_reg_operand" "=&r")
241: (minus:DI (match_operand:DI 1 "arith_reg_operand" "0")
242: (match_operand:DI 2 "arith_reg_operand" "r")))
243: (clobber (reg:SI 18))]
244: ""
245: "clrt\;subc %R2,%R0\;subc %2,%0"
246: [(set_attr "length" "6")
247: (set_attr "in_delay_slot" "no")
248: (set_attr "type" "arith")])
249:
250: (define_insn "subsi3"
251: [(set (match_operand:SI 0 "arith_reg_operand" "=r,r")
252: (minus:SI (match_operand:SI 1 "arith_reg_operand" "0,0")
253: (match_operand:SI 2 "arith_operand" "r,I")))]
254: ""
255: "@
256: sub %2,%0
257: add %M2,%0"
258: [(set_attr "type" "arith")])
259:
260:
261: ;; -------------------------------------------------------------------------
262: ;; Multiplication instructions
263: ;; -------------------------------------------------------------------------
264:
265:
266: (define_insn ""
267: [(set (reg:SI 21)
268: (mult:SI (zero_extend:SI
269: (match_operand:HI 1 "arith_reg_operand" "r"))
270: (zero_extend:SI
271: (match_operand:HI 2 "arith_reg_operand" "r"))))]
272: ""
273: "mulu %2,%1"
274: [(set_attr "type" "smpy")])
275:
276: (define_insn ""
277: [(set (reg:SI 21)
278: (mult:SI (sign_extend:SI
279: (match_operand:HI 1 "arith_reg_operand" "r"))
280: (sign_extend:SI
281: (match_operand:HI 2 "arith_reg_operand" "r"))))]
282: ""
283: "muls %2,%1"
284: [(set_attr "type" "smpy")])
285:
286: (define_expand "mulhisi3"
287: [(set (reg:SI 21)
288: (mult:SI (sign_extend:SI
289: (match_operand:HI 1 "arith_reg_operand" "r"))
290: (sign_extend:SI
291: (match_operand:HI 2 "arith_reg_operand" "r"))))
292: (set (match_operand:SI 0 "arith_reg_operand" "=r")
293: (reg:SI 21))]
294: ""
295: "")
296:
297: (define_expand "umulhisi3"
298: [(set (reg:SI 21)
299: (mult:SI (zero_extend:SI
300: (match_operand:HI 1 "arith_reg_operand" "r"))
301: (zero_extend:SI
302: (match_operand:HI 2 "arith_reg_operand" "r"))))
303: (set (match_operand:SI 0 "arith_reg_operand" "=r")
304: (reg:SI 21))]
305: ""
306: "")
307:
308:
309: ;; -------------------------------------------------------------------------
310: ;; Logical operations
311: ;; -------------------------------------------------------------------------
312:
313: (define_insn "andsi3"
314: [(set (match_operand:SI 0 "arith_reg_operand" "=r,z")
315: (and:SI (match_operand:SI 1 "arith_reg_operand" "%0,0")
316: (match_operand:SI 2 "logical_operand" "r,L")))]
317: ""
318: "and %2,%0"
319: [(set_attr "type" "arith")])
320:
321: (define_insn "iorsi3"
322: [(set (match_operand:SI 0 "arith_reg_operand" "=r,z")
323: (ior:SI (match_operand:SI 1 "arith_reg_operand" "%0,0")
324: (match_operand:SI 2 "logical_operand" "r,L")))]
325: ""
326: "or %2,%0")
327:
328: (define_insn "xorsi3"
329: [(set (match_operand:SI 0 "arith_reg_operand" "=r,z")
330: (xor:SI (match_operand:SI 1 "arith_reg_operand" "%0,0")
331: (match_operand:SI 2 "logical_operand" "r,L")))]
332: ""
333: "xor %2,%0"
334: [(set_attr "type" "arith")])
335:
336:
337: ;; -------------------------------------------------------------------------
338: ;; Shifts and rotates
339: ;; -------------------------------------------------------------------------
340:
341: (define_insn "rotlsi3_k"
342: [(set (match_operand:SI 0 "arith_reg_operand" "=r")
343: (rotate:SI (match_operand:SI 1 "arith_reg_operand" "0")
344: (const_int 1)))
345: (clobber (reg:SI 18))]
346: ""
347: "rotl %0")
348:
349: (define_expand "rotlsi3"
350: [(parallel[(set (match_operand:SI 0 "arith_reg_operand" "")
351: (rotate:SI (match_operand:SI 1 "arith_reg_operand" "")
352: (match_operand:SI 2 "immediate_operand" "")))
353: (clobber (reg:SI 18))])]
354: ""
355: "{ if (GET_CODE(operands[2]) != CONST_INT || INTVAL(operands[2]) != 1) FAIL;}")
356:
357: (define_insn "rotrsi3_k"
358: [(set (match_operand:SI 0 "arith_reg_operand" "=r")
359: (rotatert:SI (match_operand:SI 1 "arith_reg_operand" "0")
360: (const_int 1)))
361: (clobber (reg:SI 18))]
362: ""
363: "rotr %0")
364:
365: (define_expand "rotrsi3"
366: [(parallel[(set (match_operand:SI 0 "arith_reg_operand" "")
367: (rotatert:SI (match_operand:SI 1 "arith_reg_operand" "")
368: (match_operand:SI 2 "immediate_operand" "")))
369: (clobber (reg:SI 18))])]
370: ""
371: "{ if (GET_CODE(operands[2]) != CONST_INT || INTVAL(operands[2]) != 1) FAIL;}")
372:
373: (define_insn "ashlsi3_k"
374: [(set (match_operand:SI 0 "arith_reg_operand" "=r,r")
375: (ashift:SI (match_operand:SI 1 "arith_reg_operand" "0,0")
376: (match_operand:SI 2 "immediate_operand" "K,n")))
377: (clobber (reg:SI 18))]
378: ""
379: "*return output_shift(\"shll\", operands[0], operands[2], ASHIFT);"
380: [(set_attr "length" "2,12")
381: (set_attr "in_delay_slot" "yes,no")
382: (set_attr "type" "arith")])
383:
384: (define_expand "ashlsi3"
385: [(parallel[(set (match_operand:SI 0 "arith_reg_operand" "")
386: (ashift:SI (match_operand:SI 1 "arith_reg_operand" "")
387: (match_operand:SI 2 "immediate_operand" "")))
388: (clobber (reg:SI 18))])]
389: ""
390: "if (!ok_shift_value(operands[2], ASHIFT)) FAIL;")
391:
392: (define_insn "ashrsi3_k"
393: [(set (match_operand:SI 0 "arith_reg_operand" "=r")
394: (ashiftrt:SI (match_operand:SI 1 "arith_reg_operand" "0")
395: (const_int 1)))
396: (clobber (reg:SI 18))]
397: ""
398: "shar %0"
399: [(set_attr "type" "arith")])
400:
401: (define_expand "ashrsi3"
402: [(parallel[(set (match_operand:SI 0 "arith_reg_operand" "=r")
403: (ashiftrt:SI (match_operand:SI 1 "arith_reg_operand" "r")
404: (match_operand:SI 2 "nonmemory_operand" "M")))
405: (clobber (reg:SI 18))])]
406: ""
407: "
408: {
409: if (GET_CODE (operands[2]) != CONST_INT ||
410: INTVAL (operands[2]) != 1) FAIL;
411: }
412: ")
413:
414: (define_insn "lshrsi3_k"
415: [(set (match_operand:SI 0 "arith_reg_operand" "=r,r")
416: (lshiftrt:SI (match_operand:SI 1 "arith_reg_operand" "0,0")
417: (match_operand:SI 2 "immediate_operand" "K,n")))
418: (clobber (reg:SI 18))]
419: ""
420: "* return output_shift (\"shlr\", operands[0], operands[2], LSHIFTRT);"
421: [(set_attr "length" "2,12")
422: (set_attr "in_delay_slot" "yes,no")
423: (set_attr "type" "arith")])
424:
425: (define_expand "lshrsi3"
426: [(parallel[(set (match_operand:SI 0 "arith_reg_operand" "")
427: (lshiftrt:SI (match_operand:SI 1 "arith_reg_operand" "")
428: (match_operand:SI 2 "nonmemory_operand" "")))
429: (clobber (reg:SI 18))])]
430: ""
431: "if (!ok_shift_value (operands[2])) FAIL; ")
432:
433: (define_insn "ashldi3_k"
434: [(set (match_operand:DI 0 "arith_reg_operand" "=r")
435: (ashift:DI (match_operand:DI 1 "arith_reg_operand" "0")
436: (match_operand:DI 2 "immediate_operand" "I")))
437: (clobber (reg:SI 18))]
438: ""
439: "shll %R0\;rotcl %0"
440: [(set_attr "length" "4")])
441:
442: (define_expand "ashldi3"
443: [(parallel[(set (match_operand:DI 0 "arith_reg_operand" "")
444: (ashift:DI (match_operand:DI 1 "arith_reg_operand" "")
445: (match_operand:DI 2 "immediate_operand" "")))
446: (clobber (reg:SI 18))])]
447:
448: ""
449: "{ if (GET_CODE (operands[2]) != CONST_INT
450: || INTVAL (operands[2]) != 1) FAIL;} ")
451:
452: (define_insn "lshrdi3_k"
453: [(set (match_operand:DI 0 "arith_reg_operand" "=r")
454: (lshiftrt:DI (match_operand:DI 1 "arith_reg_operand" "0")
455: (match_operand:DI 2 "immediate_operand" "I")))
456: (clobber (reg:SI 18))]
457: ""
458: "shlr %0\;rotcr %R0"
459: [(set_attr "length" "4")])
460:
461: (define_expand "lshrdi3"
462: [(parallel[(set (match_operand:DI 0 "arith_reg_operand" "")
463: (lshiftrt:DI (match_operand:DI 1 "arith_reg_operand" "")
464: (match_operand:DI 2 "immediate_operand" "")))
465: (clobber (reg:SI 18))])]
466: ""
467: "{ if (GET_CODE (operands[2]) != CONST_INT
468: || INTVAL (operands[2]) != 1) FAIL;} ")
469:
470: (define_insn "ashrdi3_k"
471: [(set (match_operand:DI 0 "arith_reg_operand" "=r")
472: (ashiftrt:DI (match_operand:DI 1 "arith_reg_operand" "0")
473: (match_operand:DI 2 "immediate_operand" "")))
474: (clobber (reg:SI 18))]
475: ""
476: "shar %0\;rotcr %R0"
477: [(set_attr "length" "4")])
478:
479: (define_expand "ashrdi3"
480: [(parallel[(set (match_operand:DI 0 "arith_reg_operand" "")
481: (ashiftrt:DI (match_operand:DI 1 "arith_reg_operand" "")
482: (match_operand:DI 2 "immediate_operand" "")))
483: (clobber (reg:SI 18))])]
484: ""
485: "{ if (GET_CODE (operands[2]) != CONST_INT
486: || INTVAL (operands[2]) != 1) FAIL; } ")
487:
488:
489:
490: ;; -------------------------------------------------------------------------
491: ;; Unary arithmetic
492: ;; -------------------------------------------------------------------------
493:
494: (define_insn "negdi2"
495: [(set (match_operand:DI 0 "arith_reg_operand" "=&r")
496: (neg:DI (match_operand:DI 1 "arith_reg_operand" "0")))
497: (clobber (reg:SI 18))]
498: ""
499: "clrt\;negc %R1,%R0\;negc %1,%0"
500: [(set_attr "length" "6")
501: (set_attr "type" "arith")])
502:
503: (define_insn "negsi2"
504: [(set (match_operand:SI 0 "arith_reg_operand" "=r")
505: (neg:SI (match_operand:SI 1 "arith_reg_operand" "r")))]
506: ""
507: "neg %1,%0"
508: [(set_attr "type" "arith")])
509:
510: (define_insn "one_cmplsi2"
511: [(set (match_operand:SI 0 "arith_reg_operand" "=r")
512: (not:SI (match_operand:SI 1 "arith_reg_operand" "r")))]
513: ""
514: "not %1,%0"
515: [ (set_attr "type" "arith")])
516:
517:
518: ;; -------------------------------------------------------------------------
519: ;; Zero extension instructions
520: ;; -------------------------------------------------------------------------
521:
522: (define_insn "zero_extendhisi2"
523: [(set (match_operand:SI 0 "arith_reg_operand" "=r")
524: (zero_extend:SI (match_operand:HI 1 "arith_reg_operand" "r")))]
525: ""
526: "extu.w %1,%0"
527: [(set_attr "type" "arith")])
528:
529: (define_insn "zero_extendqisi2"
530: [(set (match_operand:SI 0 "arith_reg_operand" "=r")
531: (zero_extend:SI (match_operand:QI 1 "arith_reg_operand" "r")))]
532: ""
533: "extu.b %1,%0"
534: [(set_attr "type" "arith")])
535:
536: (define_insn "zero_extendqihi2"
537: [(set (match_operand:HI 0 "arith_reg_operand" "=r")
538: (zero_extend:HI (match_operand:QI 1 "arith_reg_operand" "r")))]
539: ""
540: "extu.b %1,%0"
541: [(set_attr "type" "arith")])
542:
543:
544: ;; -------------------------------------------------------------------------
545: ;; Sign extension instructions
546: ;; -------------------------------------------------------------------------
547:
548: (define_insn "extendsidi2"
549: [(set (match_operand:DI 0 "arith_reg_operand" "=r")
550: (sign_extend:DI (match_operand:SI 1 "arith_reg_operand" "0")))]
551: ""
552: "mov %1,%0\;shll %0\;subc %0,%0"
553: [(set_attr "length" "6")])
554:
555: (define_insn "extendhisi2"
556: [(set (match_operand:SI 0 "arith_reg_operand" "=r")
557: (sign_extend:SI (match_operand:HI 1 "arith_reg_operand" "r")))]
558: ""
559: "exts.w %1,%0")
560:
561: (define_insn "extendqisi2"
562: [(set (match_operand:SI 0 "arith_reg_operand" "=r")
563: (sign_extend:SI (match_operand:QI 1 "arith_reg_operand" "r")))]
564: ""
565: "exts.b %1,%0")
566:
567: (define_insn "extendqihi2"
568: [(set (match_operand:HI 0 "arith_reg_operand" "=r")
569: (sign_extend:HI (match_operand:QI 1 "arith_reg_operand" "r")))]
570: ""
571: "exts.b %1,%0")
572:
573:
574: ;; -------------------------------------------------------------------------
575: ;; Move instructions
576: ;; -------------------------------------------------------------------------
577:
578: (define_insn ""
579: [(set (match_operand:SI 0 "push_operand" "=<,<")
580: (match_operand:SI 1 "arith_reg_operand" "r,l"))]
581: ""
582: "@
583: mov.l %1,%0
584: sts.l pr,%0"
585: [(set_attr "type" "store")])
586:
587: (define_insn ""
588: [(set (match_operand:SI 0 "arith_reg_operand" "=r,l")
589: (match_operand:SI 1 "pop_operand" "=>,>"))]
590: ""
591: "@
592: mov.l %1,%0
593: lds.l %1,pr"
594: [(set_attr "type" "load,pload")])
595:
596: (define_insn "push"
597: [(set (mem:SI (pre_dec:SI (reg:SI 15)))
598: (match_operand:SI 0 "register_operand" "r,l"))]
599: ""
600: "@
601: mov.l %0,@-r15
602: sts.l pr,@-r15")
603:
604: (define_insn "pop"
605: [(set (match_operand:SI 0 "register_operand" "=r,l")
606: (mem:SI (post_inc:SI (reg:SI 15))))]
607: ""
608: "@
609: mov.l @r15+,%0
610: lds.l @r15+,pr"
611: [(set_attr "type" "load,pload")])
612:
613: ; some constants are easier to generate with alu operations
614: ; rather than loading from memory
615:
616: (define_split
617: [(set (match_operand:SI 0 "register_operand" "=r")
618: (match_operand:SI 1 "painful_immediate_operand" "i"))]
619: ""
620: [(set (match_dup 0) (const_int 127))
621: (set (match_dup 0) (plus:SI (match_dup 0)
622: (match_dup 2)))]
623: "operands[2] = GEN_INT (INTVAL(operands[1]) - 127);" )
624:
625: (define_insn "movsi_i"
626: [(set (match_operand:SI 0 "general_operand" "=r,r,r,m,l,r,r,r,t,x")
627: (match_operand:SI 1 "general_movsrc_operand" "r,I,m,r,r,l,t,x,r,r"))]
628: ""
629: "@
630: mov %1,%0
631: mov %1,%0
632: mov.l %1,%0
633: mov.l %1,%0
634: lds %1,%0
635: sts %1,%0
636: movt %0
637: sts %1,%0
638: tst %1,%1\;bt T%*\;bra F%*\;sett\;T%*:clrt\;F%*:%^
639: lds %1,%0"
640: [(set_attr "length" "2,2,2,2,2,2,2,2,10,2")
641: (set_attr "type" "move,move,load,pload,move,move,move,move,move,move")])
642:
643: (define_insn "movsi_pcrel"
644: [(set (match_operand:SI 0 "arith_reg_operand" "=r")
645: (match_operand:SI 1 "hard_immediate_operand" "i"))]
646: ""
647: "* return output_movepcrel (insn, operands, SImode);"
648: [(set_attr "length" "2")
649: (set_attr "in_delay_slot" "no")
650: (set_attr "constneed" "yes")
651: (set_attr "smallestsize" "2")
652: (set_attr "largestsize" "8")
653: (set_attr "type" "load")])
654:
655: (define_expand "movsi"
656: [(set (match_operand:SI 0 "general_operand" "")
657: (match_operand:SI 1 "general_operand" ""))]
658: ""
659: "{ if(prepare_move_operands(operands, SImode)) DONE; } ")
660:
661: (define_insn "movqi_i"
662: [(set (match_operand:QI 0 "general_operand" "=r,r,r,m,r,m,r,r")
663: (match_operand:QI 1 "general_operand" "r,n,m,r,m,r,x,t"))]
664: ""
665: "@
666: mov %1,%0
667: mov %1,%0
668: mov.b %1,%0
669: mov.b %1,%0
670: mov.b %1,%0
671: mov.b %1,%0
672: sts %1,%0
673: movt %0")
674:
675: (define_expand "movqi"
676: [(set (match_operand:QI 0 "general_operand" "")
677: (match_operand:QI 1 "general_operand" ""))]
678: ""
679: "prepare_move_operands(operands, QImode);")
680:
681: (define_insn "movhi_pcrel"
682: [(set (match_operand:HI 0 "arith_reg_operand" "=r")
683: (match_operand:HI 1 "hard_immediate_operand" "i"))]
684: ""
685: "* return output_movepcrel (insn, operands, SImode);"
686: [(set_attr "length" "2")
687: (set_attr "in_delay_slot" "no")
688: (set_attr "constneed" "yes")
689: (set_attr "smallestsize" "2")
690: (set_attr "largestsize" "8")
691: (set_attr "type" "load")])
692:
693: (define_insn "movhi_i"
694: [(set (match_operand:HI 0 "general_operand" "=r,r,m,z,m,r,r")
695: (match_operand:HI 1 "general_operand" "rI,m,r,m,z,x,t"))]
696: ""
697: "@
698: mov %1,%0
699: mov.w %1,%0
700: mov.w %1,%0
701: mov.w %1,%0
702: mov.w %1,%0
703: sts %1,%0
704: movt %0"
705: [(set_attr "type" "move,load,store,load,store,move,move")])
706:
707: (define_expand "movhi"
708: [(set (match_operand:HI 0 "general_operand" "")
709: (match_operand:HI 1 "general_operand" ""))]
710: ""
711: "prepare_move_operands (operands, HImode);")
712:
713: (define_insn ""
714: [(set (match_operand:DI 0 "push_operand" "=<")
715: (match_operand:DI 1 "arith_reg_operand" "r"))]
716: ""
717: "mov.l %R1,%0\;mov.l %1,%0"
718: [(set_attr "length" "4")
719: (set_attr "type" "store")])
720:
721: (define_insn "movdi_pcrel"
722: [(set (match_operand:DI 0 "arith_reg_operand" "=r")
723: (match_operand:DI 1 "hard_immediate_operand" "i"))]
724: ""
725: "* return output_movepcrel (insn, operands, DImode);"
726: [(set_attr "length" "4")
727: (set_attr "in_delay_slot" "no")
728: (set_attr "constneed" "yes")
729: (set_attr "smallestsize" "4")
730: (set_attr "constantsize" "8")
731: (set_attr "largestsize" "18")
732: (set_attr "type" "load")])
733:
734: (define_insn "movdi_k"
735: [(set (match_operand:DI 0 "general_operand" "=r,r,m,r,r,m,r")
736: (match_operand:DI 1 "general_operand" "r,m,r,I,m,r,x"))]
737: ""
738: "* return output_movedouble(operands, DImode);"
739: [(set_attr "length" "4")
740: (set_attr "type" "move,load,store,move,load,store,load")])
741:
742:
743: (define_expand "movdi"
744: [(set (match_operand:DI 0 "general_operand" "")
745: (match_operand:DI 1 "general_operand" ""))]
746: ""
747: "prepare_move_operands (operands, DImode);")
748:
749: (define_insn ""
750: [(set (match_operand:DF 0 "push_operand" "=<")
751: (match_operand:DF 1 "arith_reg_operand" "r"))]
752: ""
753: "mov.l %R1,%0\;mov.l %1,%0"
754: [(set_attr "length" "4")
755: (set_attr "type" "store")])
756:
757: (define_insn "movdf_pcrel"
758: [(set (match_operand:DF 0 "arith_reg_operand" "=r")
759: (match_operand:DF 1 "hard_immediate_operand" "i"))]
760: ""
761: "* return output_movepcrel (insn, operands, DFmode);"
762: [(set_attr "length" "4")
763: (set_attr "in_delay_slot" "no")
764: (set_attr "constneed" "yes")
765: (set_attr "smallestsize" "4")
766: (set_attr "constantsize" "8")
767: (set_attr "largestsize" "18")
768: (set_attr "type" "load")])
769:
770: (define_insn "movdf_k"
771: [(set (match_operand:DF 0 "general_operand" "=r,r,m")
772: (match_operand:DF 1 "general_operand" "r,m,r"))]
773: ""
774: "* return output_movedouble(operands, DFmode);"
775: [(set_attr "length" "4")
776: (set_attr "type" "move,load,store")])
777:
778: (define_expand "movdf"
779: [(set (match_operand:DF 0 "general_operand" "")
780: (match_operand:DF 1 "general_operand" ""))]
781: ""
782: "prepare_move_operands(operands, DFmode);")
783:
784: (define_insn ""
785: [(set (match_operand:SF 0 "push_operand" "=<")
786: (match_operand:SF 1 "arith_reg_operand" "r"))]
787: ""
788: "mov.l %1,%0"
789: [(set_attr "type" "store")])
790:
791: (define_insn "movsf_pcrel"
792: [(set (match_operand:SF 0 "arith_reg_operand" "=r")
793: (match_operand:SF 1 "hard_immediate_operand" "i"))]
794: ""
795: "* return output_movepcrel (insn, operands, SFmode);"
796: [(set_attr "length" "2")
797: (set_attr "in_delay_slot" "no")
798: (set_attr "constneed" "yes")
799: (set_attr "smallestsize" "2")
800: (set_attr "largestsize" "8")
801: (set_attr "type" "load")])
802:
803: (define_insn "movsf_i"
804: [(set (match_operand:SF 0 "general_operand" "=r,r,r,m,l,r,m,r")
805: (match_operand:SF 1 "general_operand" "r,I,m,r,r,l,r,m"))]
806: ""
807: "@
808: mov %1,%0
809: mov %1,%0
810: mov.l %1,%0
811: mov.l %1,%0
812: lds %1,%0
813: sts %1,%0
814: mov %1,%0
815: mov %1,%0"
816: [(set_attr "type" "move,move,load,store,move,move,move,move")])
817:
818: (define_expand "movsf"
819: [(set (match_operand:SF 0 "general_operand" "")
820: (match_operand:SF 1 "general_operand" ""))]
821: ""
822: "prepare_move_operands(operands, SFmode);")
823:
824:
825: ;; ------------------------------------------------------------------------
826: ;; Define the real conditional branch instructions.
827: ;; ------------------------------------------------------------------------
828:
829: (define_insn "branch_true"
830: [(set (pc) (if_then_else (eq (reg:SI 18) (const_int 1))
831: (label_ref (match_operand 0 "" ""))
832: (pc)))]
833: ""
834: "* return output_branch (1, insn);"
835: [(set_attr "type" "cbranch")])
836:
837: (define_insn "branch_false"
838: [(set (pc) (if_then_else (ne (reg:SI 18) (const_int 1))
839: (label_ref (match_operand 0 "" ""))
840: (pc)))]
841: ""
842: "* return output_branch (0, insn);"
843: [(set_attr "type" "cbranch")])
844:
845: (define_insn "inverse_branch_true"
846: [(set (pc) (if_then_else (eq (reg:SI 18) (const_int 1))
847: (pc)
848: (label_ref (match_operand 0 "" ""))))]
849: ""
850: "* return output_branch (0, insn);"
851: [(set_attr "type" "cbranch")])
852:
853: (define_insn "inverse_branch_false"
854: [(set (pc) (if_then_else (ne (reg:SI 18) (const_int 1))
855: (pc)
856: (label_ref (match_operand 0 "" ""))))]
857: ""
858: "* return output_branch (1, insn);"
859: [(set_attr "type" "cbranch")])
860:
861:
862: ;; Conditional branch insns
863:
864: (define_expand "beq"
865: [(set (reg:SI 18) (eq:SI (match_dup 1) (match_dup 2)))
866: (set (pc)
867: (if_then_else (eq (reg:SI 18)
868: (const_int 1))
869: (label_ref (match_operand 0 "" ""))
870: (pc)))]
871: ""
872: "
873: {
874: operands[1] = sh_compare_op0;
875: operands[2] = sh_compare_op1;
876: }")
877:
878:
879: ; There is no bne compare, so we reverse the branch arms.
880:
881: (define_expand "bne"
882: [(set (reg:SI 18) (eq:SI (match_dup 1) (match_dup 2)))
883: (set (pc)
884: (if_then_else (eq (reg:SI 18)
885: (const_int 1))
886: (pc)
887: (label_ref (match_operand 0 "" ""))))]
888: ""
889: "
890: {
891: operands[1] = sh_compare_op0;
892: operands[2] = sh_compare_op1;
893: }")
894:
895: (define_expand "bgt"
896: [(set (reg:SI 18) (gt:SI (match_dup 1) (match_dup 2)))
897: (set (pc)
898: (if_then_else (eq (reg:SI 18)
899: (const_int 1))
900: (label_ref (match_operand 0 "" ""))
901: (pc)))]
902: ""
903: "
904: {
905: operands[1] = sh_compare_op0;
906: operands[2] = sh_compare_op1;
907: }")
908:
909: (define_expand "blt"
910: [(set (reg:SI 18) (lt:SI (match_dup 1) (match_dup 2)))
911: (set (pc)
912: (if_then_else (eq (reg:SI 18)
913: (const_int 1))
914: (label_ref (match_operand 0 "" ""))
915: (pc)))]
916: ""
917: "
918: {
919: operands[1] = sh_compare_op0;
920: operands[2] = sh_compare_op1;
921: }")
922:
923: (define_expand "ble"
924: [(set (reg:SI 18) (le:SI (match_dup 1) (match_dup 2)))
925: (set (pc)
926: (if_then_else (eq (reg:SI 18)
927: (const_int 1))
928: (label_ref (match_operand 0 "" ""))
929: (pc)))]
930: ""
931: "
932: {
933: operands[1] = sh_compare_op0;
934: operands[2] = sh_compare_op1;
935: }")
936:
937: (define_expand "bge"
938: [(set (reg:SI 18) (ge:SI (match_dup 1) (match_dup 2)))
939: (set (pc)
940: (if_then_else (eq (reg:SI 18)
941: (const_int 1))
942: (label_ref (match_operand 0 "" ""))
943: (pc)))]
944: ""
945: "
946: {
947: operands[1] = sh_compare_op0;
948: operands[2] = sh_compare_op1;
949: }")
950:
951: (define_expand "bgtu"
952: [(set (reg:SI 18) (gtu:SI (match_dup 1) (match_dup 2)))
953: (set (pc)
954: (if_then_else (eq (reg:SI 18)
955: (const_int 1))
956: (label_ref (match_operand 0 "" ""))
957: (pc)))]
958: ""
959: "
960: {
961: operands[1] = sh_compare_op0;
962: operands[2] = sh_compare_op1;
963: }")
964:
965: (define_expand "bltu"
966: [(set (reg:SI 18) (ltu:SI (match_dup 1) (match_dup 2)))
967: (set (pc)
968: (if_then_else (eq (reg:SI 18)
969: (const_int 1))
970: (label_ref (match_operand 0 "" ""))
971: (pc)))]
972: ""
973: "
974: {
975: operands[1] = sh_compare_op0;
976: operands[2] = sh_compare_op1;
977: }")
978:
979: (define_expand "bgeu"
980: [(set (reg:SI 18) (geu:SI (match_dup 1) (match_dup 2)))
981: (set (pc)
982: (if_then_else (eq (reg:SI 18)
983: (const_int 1))
984: (label_ref (match_operand 0 "" ""))
985: (pc)))]
986: ""
987: "
988: {
989: operands[1] = sh_compare_op0;
990: operands[2] = sh_compare_op1;
991: }")
992:
993: (define_expand "bleu"
994: [(set (reg:SI 18) (leu:SI (match_dup 1) (match_dup 2)))
995: (set (pc)
996: (if_then_else (eq (reg:SI 18)
997: (const_int 1))
998: (label_ref (match_operand 0 "" ""))
999: (pc)))]
1000: ""
1001: "
1002: {
1003: operands[1] = sh_compare_op0;
1004: operands[2] = sh_compare_op1;
1005: }")
1006:
1007:
1008: ;; ------------------------------------------------------------------------
1009: ;; Jump and linkage insns
1010: ;; ------------------------------------------------------------------------
1011:
1012: (define_insn "jump_real"
1013: [(set (pc)
1014: (label_ref (match_operand 0 "" "")))]
1015: ""
1016: "*
1017: {
1018: if (get_attr_length(insn) == 6)
1019: {
1020: return \"mov.l %I0,r13\;jmp @r13%#\";
1021: }
1022: else
1023: {
1024: return \"bra %l0%#\";
1025: }
1026: }"
1027: [(set_attr "type" "jump")
1028: (set_attr "needs_delay_slot" "yes")])
1029:
1030: (define_expand "jump"
1031: [(set (pc) (label_ref (match_operand 0 "" "")))]
1032: ""
1033: "
1034: {
1035: emit_insn(gen_jump_real(operand0));
1036: DONE;
1037: }
1038: ")
1039:
1040: (define_insn "calli"
1041: [(call (mem:SI (match_operand:SI 0 "arith_reg_operand" "r"))
1042: (match_operand 1 "" ""))
1043: (clobber (reg:SI 17))]
1044: ""
1045: "jsr @%0%#"
1046: [(set_attr "needs_delay_slot" "yes")
1047: (set_attr "in_delay_slot" "no")
1048: (set_attr "length" "4")])
1049:
1050: (define_insn "call_valuei"
1051: [(set (match_operand 0 "" "=rf")
1052: (call (mem:SI (match_operand:SI 1 "arith_reg_operand" "r"))
1053: (match_operand 2 "" "")))
1054: (clobber (reg:SI 17))]
1055: ""
1056: "jsr @%1%#"
1057: [(set_attr "needs_delay_slot" "yes")
1058: (set_attr "in_delay_slot" "no")
1059: (set_attr "length" "4")])
1060:
1061: (define_expand "call"
1062: [(parallel[(call (match_operand 0 "arith_reg_operand" "o")
1063: (match_operand 1 "" ""))
1064: (clobber (reg:SI 17))])]
1065: ""
1066: "
1067: {
1068: if (GET_CODE (operands[0]) == MEM)
1069: {
1070: operands[0]
1071: = gen_rtx(MEM,GET_MODE (operands[0]),
1072: force_reg (Pmode,
1073: XEXP (operands[0], 0)));
1074: }
1075: }")
1076:
1077: (define_expand "call_value"
1078: [(parallel[(set (match_operand 0 "" "=rf")
1079: (call (match_operand 1 "arith_reg_operand" "o")
1080: (match_operand 2 "" "")))
1081: (clobber (reg:SI 17))])]
1082: ""
1083: "
1084: {
1085: if (GET_CODE (operands[1]) == MEM)
1086: {
1087: operands[1]
1088: = gen_rtx (MEM, GET_MODE (operands[1]),
1089: force_reg (Pmode,
1090: XEXP (operands[1], 0)));
1091: }
1092: }")
1093:
1094: (define_insn "indirect_jump"
1095: [(set (pc)
1096: (match_operand:SI 0 "arith_reg_operand" "r"))]
1097: ""
1098: "jmp @%0%#"
1099: [(set_attr "needs_delay_slot" "yes")
1100: (set_attr "in_delay_slot" "no")
1101: (set_attr "length" "4")])
1102:
1103:
1104:
1105: ;; ------------------------------------------------------------------------
1106: ;; Misc insns
1107: ;; ------------------------------------------------------------------------
1108:
1109:
1110: (define_insn "nop"
1111: [(const_int 0)]
1112: ""
1113: "or r0,r0")
1114:
1115: (define_insn "tablejump"
1116: [(set (pc)
1117: (match_operand:SI 0 "arith_reg_operand" "r"))
1118: (use (label_ref (match_operand 1 "" "")))]
1119: ""
1120: "!table jump\;jmp @%0\;or r0,r0\;%!"
1121: [(set_attr "needs_delay_slot" "no")
1122: (set_attr "in_delay_slot" "no")
1123: (set_attr "type" "jump")
1124: (set_attr "dump" "no")])
1125:
1126: (define_insn "return"
1127: [(return)]
1128: "reload_completed"
1129: "rts %#"
1130: [(set_attr "type" "return")
1131: (set_attr "needs_delay_slot" "yes")
1132: (set_attr "dump" "yes")])
1133:
1134: (define_expand "prologue"
1135: [(const_int 0)]
1136: ""
1137: "sh_expand_prologue (); DONE;")
1138:
1139: (define_expand "epilogue"
1140: [(return)]
1141: ""
1142: "sh_expand_epilogue ();")
1143:
1144: (define_insn "blockage"
1145: [(unspec_volatile [(const_int 0)] 0)]
1146: ""
1147: ""
1148: [(set_attr "length" "0")])
1149:
1150:
1151: ;; ------------------------------------------------------------------------
1152: ;; Scc instructions
1153: ;; ------------------------------------------------------------------------
1154:
1155: (define_insn ""
1156: [(set (match_operand:SI 0 "arith_reg_operand" "=r")
1157: (eq (reg:SI 18) (const_int 1)))]
1158: ""
1159: "movt %0 ! ")
1160:
1161: (define_expand "seq"
1162: [(set (match_operand:SI 0 "arith_reg_operand" "")
1163: (match_dup 1))]
1164: ""
1165: "operands[1] = prepare_scc_operands (EQ);")
1166:
1167: (define_expand "slt"
1168: [(set (match_operand:SI 0 "arith_reg_operand" "")
1169: (match_dup 1))]
1170: ""
1171: "operands[1] = prepare_scc_operands (LT);")
1172:
1173: (define_expand "sle"
1174: [(set (match_operand:SI 0 "arith_reg_operand" "")
1175: (match_dup 1))]
1176: ""
1177: "operands[1] = prepare_scc_operands (LE);")
1178:
1179: (define_expand "sgt"
1180: [(set (match_operand:SI 0 "arith_reg_operand" "")
1181: (match_dup 1))]
1182: ""
1183: "operands[1] = prepare_scc_operands (GT);")
1184:
1185: (define_expand "sge"
1186: [(set (match_operand:SI 0 "arith_reg_operand" "")
1187: (match_dup 1))]
1188: ""
1189: "operands[1] = prepare_scc_operands (GE);")
1190:
1191: (define_expand "sgtu"
1192: [(set (match_operand:SI 0 "arith_reg_operand" "")
1193: (match_dup 1))]
1194: ""
1195: "operands[1] = prepare_scc_operands (GTU);")
1196:
1197: (define_expand "sltu"
1198: [(set (match_operand:SI 0 "arith_reg_operand" "")
1199: (match_dup 1))]
1200: ""
1201: "operands[1] = prepare_scc_operands (LTU);")
1202:
1203: (define_expand "sleu"
1204: [(set (match_operand:SI 0 "arith_reg_operand" "")
1205: (match_dup 1))]
1206: ""
1207: "operands[1] = prepare_scc_operands (LEU);")
1208:
1209: (define_expand "sgeu"
1210: [(set (match_operand:SI 0 "arith_reg_operand" "")
1211: (match_dup 1))]
1212: ""
1213: "operands[1] = prepare_scc_operands (GEU);")
1214:
1215: (define_expand "sne"
1216: [(set (match_operand:SI 0 "arith_reg_operand" "")
1217: (match_dup 1))
1218: (set (match_dup 0) (xor:SI (match_dup 0) (const_int 1)))]
1219: ""
1220: "operands[1] = prepare_scc_operands (EQ);")
1221:
1222: ; these patterns give better code then gcc invents if
1223: ; left to its own devices
1224:
1225: (define_insn "anddi3"
1226: [(set (match_operand:DI 0 "arith_reg_operand" "=r")
1227: (and:DI (match_operand:DI 1 "arith_reg_operand" "%0")
1228: (match_operand:DI 2 "arith_reg_operand" "r")))]
1229: ""
1230: "and %2,%0\;and %R2,%R0"
1231: [(set_attr "length" "4")])
1232:
1233: (define_insn "iordi3"
1234: [(set (match_operand:DI 0 "arith_reg_operand" "=r")
1235: (ior:DI (match_operand:DI 1 "arith_reg_operand" "%0")
1236: (match_operand:DI 2 "arith_reg_operand" "r")))]
1237: ""
1238: "or %2,%0\;or %R2,%R0"
1239: [(set_attr "length" "4")])
1240:
1241: (define_insn "xordi3"
1242: [(set (match_operand:DI 0 "arith_reg_operand" "=r")
1243: (xor:DI (match_operand:DI 1 "arith_reg_operand" "%0")
1244: (match_operand:DI 2 "arith_reg_operand" "r")))]
1245: ""
1246: "xor %2,%0\;xor %R2,%R0"
1247: [(set_attr "length" "4")])
1248:
1249:
1250: ;; ------------------------------------------------------------------------
1251: ;; Block move
1252: ;; ------------------------------------------------------------------------
1253:
1254: (define_expand "movstrsi"
1255: [(parallel [(set (mem:BLK (match_operand:BLK 0 "general_operand" ""))
1256: (mem:BLK (match_operand:BLK 1 "general_operand" "")))
1257: (use (match_operand:SI 2 "general_operand" ""))
1258: (use (match_operand:SI 3 "immediate_operand" ""))
1259: ])]
1260: ""
1261: "
1262: {
1263: rtx dest_mem = operands[0];
1264: rtx src_mem = operands[1];
1265: operands[0] = copy_to_mode_reg (SImode, XEXP (operands[0], 0));
1266: operands[1] = copy_to_mode_reg (SImode, XEXP (operands[1], 0));
1267: expand_block_move (dest_mem, src_mem, operands);
1268: DONE;
1269: }")
1270:
1271:
1272:
1273:
1274:
1275: ;; -------------------------------------------------------------------------
1276: ;; Peepholes
1277: ;; -------------------------------------------------------------------------
1278:
1279:
1280: (define_peephole
1281: [(set (match_operand:QI 0 "arith_reg_operand" "")
1282: (mem:QI (match_operand:SI 1 "arith_reg_operand" "")))
1283: (set (match_dup 1) (plus:SI (match_dup 1) (const_int 1)))]
1284: "REGNO(operands[1]) != REGNO(operands[0])"
1285: "mov.b @%1+,%0")
1286:
1287: (define_peephole
1288: [(set (match_operand:HI 0 "arith_reg_operand" "")
1289: (mem:HI (match_operand:SI 1 "arith_reg_operand" "")))
1290: (set (match_dup 1) (plus:SI (match_dup 1) (const_int 2)))]
1291: "REGNO(operands[1]) != REGNO(operands[0])"
1292: "mov.w @%1+,%0")
1293:
1294: (define_peephole
1295: [(set (match_operand:SI 0 "arith_reg_operand" "")
1296: (mem:SI (match_operand:SI 1 "arith_reg_operand" "")))
1297: (set (match_dup 1) (plus:SI (match_dup 1) (const_int 4)))]
1298: "REGNO(operands[1]) != REGNO(operands[0])"
1299: "mov.l @%1+,%0")
1300:
1301: (define_peephole
1302: [(set (match_operand:QI 0 "register_operand" "=r")
1303: (match_operand:QI 1 "general_operand" "g"))
1304: (set (match_operand:SI 2 "register_operand" "=r")
1305: (sign_extend:SI (match_dup 0)))]
1306: "REGNO(operands[0]) == REGNO(operands[2])"
1307: "mov.b %1,%0")
1308:
1309: (define_peephole
1310: [(set (match_operand:QI 0 "register_operand" "=r")
1311: (match_operand:QI 1 "general_operand" "g"))
1312: (set (match_operand:SI 2 "register_operand" "=r")
1313: (sign_extend:SI (match_dup 0)))]
1314: "REGNO(operands[0]) != REGNO(operands[2])
1315: && dead_or_set_p (insn, operands[0])"
1316: "mov.b %1,%2")
1317:
1318: ; notice when a mov.b could be done with a displacement
1319:
1320: (define_peephole
1321: [(set (match_operand:SI 0 "register_operand" "=r")
1322: (plus:SI (match_dup 0)
1323: (match_operand:SI 1 "byte_index_operand" "i")))
1324: (set (mem:QI (match_dup 0)) (reg:QI 0))]
1325: "dead_or_set_p(insn, operands[0])"
1326: "mov.b r0,@(%O1,%0)")
1327:
1328: (define_peephole
1329: [(set (match_operand:SI 0 "register_operand" "=r")
1330: (plus:SI (match_dup 0)
1331: (match_operand:SI 1 "byte_index_operand" "i")))
1332: (set (reg:QI 0) (mem:QI (match_dup 0)))]
1333: "dead_or_set_p(insn, operands[0])"
1334: "mov.b @(%O1,%0),r0")
1335:
1336:
1337:
1338:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.