|
|
1.1 root 1: ;;- Machine description for GNU compiler
2: ;;- Convex Version
3: ;; Copyright (C) 1988, 1993 Free Software Foundation, Inc.
4:
5: ;; This file is part of GNU CC.
6:
7: ;; GNU CC is free software; you can redistribute it and/or modify
8: ;; it under the terms of the GNU General Public License as published by
9: ;; the Free Software Foundation; either version 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: ;; Attribute specifications
22:
23: ; Target CPU
24: (define_attr "cpu" "c1,c32,c34,c38"
25: (const (symbol_ref "(enum attr_cpu) target_cpu")))
26:
27: ;; Instruction classification
28:
29: (define_attr "type"
30: "alu,xalu,mldw,mldl,mldb,mst,adds,addd,mulw,mull,muls,muld,divw,divl,divs,divd,shfw,shfl,cvts,cvtd"
31: (const_string "alu"))
32:
33: ;; Instruction times
34:
35: (define_function_unit "mem" 1 0
36: (and (eq_attr "cpu" "c1") (eq_attr "type" "mldw")) 2 0)
37: (define_function_unit "mem" 1 0
38: (and (eq_attr "cpu" "c1") (eq_attr "type" "mldl")) 4 0)
39: (define_function_unit "mem" 1 0
40: (and (eq_attr "cpu" "c32") (eq_attr "type" "mldw,mldl")) 2 0)
41: (define_function_unit "mem" 1 0
42: (and (eq_attr "cpu" "c34") (eq_attr "type" "mldw,mldl")) 4 0)
43: (define_function_unit "mem" 1 0
44: (and (eq_attr "cpu" "c38") (eq_attr "type" "mldw,mldl")) 2 0)
45:
46: (define_function_unit "mem" 1 0
47: (and (eq_attr "cpu" "c32") (eq_attr "type" "mldb")) 9 0)
48: (define_function_unit "mem" 1 0
49: (and (eq_attr "cpu" "c34") (eq_attr "type" "mldb")) 36 0)
50: (define_function_unit "mem" 1 0
51: (and (eq_attr "cpu" "c38") (eq_attr "type" "mldb")) 21 0)
52:
53: (define_function_unit "mem" 1 0
54: (and (eq_attr "cpu" "c1") (eq_attr "type" "xalu")) 1 0)
55: (define_function_unit "mem" 1 0
56: (and (eq_attr "cpu" "c32") (eq_attr "type" "xalu")) 1 0)
57: (define_function_unit "mem" 1 0
58: (and (eq_attr "cpu" "c34") (eq_attr "type" "xalu")) 5 0)
59: (define_function_unit "mem" 1 0
60: (and (eq_attr "cpu" "c38") (eq_attr "type" "xalu")) 2 0)
61:
62: (define_function_unit "add" 1 0
63: (and (eq_attr "cpu" "c1") (eq_attr "type" "adds,addd")) 3 2)
64: (define_function_unit "add" 1 0
65: (and (eq_attr "cpu" "c32") (eq_attr "type" "adds,addd")) 2 1)
66: (define_function_unit "add" 1 0
67: (and (eq_attr "cpu" "c34") (eq_attr "type" "adds,addd")) 5 2)
68: (define_function_unit "add" 1 0
69: (and (eq_attr "cpu" "c38") (eq_attr "type" "adds,addd")) 2 1)
70:
71: (define_function_unit "mul" 1 0
72: (and (eq_attr "cpu" "c1") (eq_attr "type" "mulw,muls")) 3 2)
73: (define_function_unit "mul" 1 0
74: (and (eq_attr "cpu" "c32") (eq_attr "type" "mulw,muls")) 4 2)
75: (define_function_unit "mul" 1 0
76: (and (eq_attr "cpu" "c34") (eq_attr "type" "mulw,muls")) 6 2)
77: (define_function_unit "mul" 1 0
78: (and (eq_attr "cpu" "c38") (eq_attr "type" "mulw,muls")) 3 2)
79:
80: (define_function_unit "mul" 1 0
81: (and (eq_attr "cpu" "c1") (eq_attr "type" "mull,muld")) 4 3)
82: (define_function_unit "mul" 1 0
83: (and (eq_attr "cpu" "c32") (eq_attr "type" "mull")) 10 7)
84: (define_function_unit "mul" 1 0
85: (and (eq_attr "cpu" "c32") (eq_attr "type" "muld")) 5 2)
86: (define_function_unit "mul" 1 0
87: (and (eq_attr "cpu" "c34") (eq_attr "type" "mull,muld")) 7 3)
88: (define_function_unit "mul" 1 0
89: (and (eq_attr "cpu" "c38") (eq_attr "type" "mull,muld")) 4 3)
90:
91: (define_function_unit "div" 1 0
92: (and (eq_attr "cpu" "c1") (eq_attr "type" "divw")) 24 24)
93: (define_function_unit "div" 1 0
94: (and (eq_attr "cpu" "c32") (eq_attr "type" "divw")) 44 6)
95: (define_function_unit "div" 1 0
96: (and (eq_attr "cpu" "c34") (eq_attr "type" "divw")) 14 10)
97: (define_function_unit "div" 1 0
98: (and (eq_attr "cpu" "c38") (eq_attr "type" "divw")) 11 10)
99:
100: (define_function_unit "div" 1 0
101: (and (eq_attr "cpu" "c1") (eq_attr "type" "divl")) 41 42)
102: (define_function_unit "div" 1 0
103: (and (eq_attr "cpu" "c32") (eq_attr "type" "divl")) 76 5)
104: (define_function_unit "div" 1 0
105: (and (eq_attr "cpu" "c34") (eq_attr "type" "divl")) 22 18)
106: (define_function_unit "div" 1 0
107: (and (eq_attr "cpu" "c38") (eq_attr "type" "divl")) 19 18)
108:
109: (define_function_unit "div" 1 0
110: (and (eq_attr "cpu" "c1") (eq_attr "type" "divs")) 22 22)
111: (define_function_unit "div" 1 0
112: (and (eq_attr "cpu" "c32") (eq_attr "type" "divs")) 8 6)
113: (define_function_unit "div" 1 0
114: (and (eq_attr "cpu" "c34") (eq_attr "type" "divs")) 13 9)
115: (define_function_unit "div" 1 0
116: (and (eq_attr "cpu" "c38") (eq_attr "type" "divs")) 10 9)
117:
118: (define_function_unit "div" 1 0
119: (and (eq_attr "cpu" "c1") (eq_attr "type" "divd")) 37 38)
120: (define_function_unit "div" 1 0
121: (and (eq_attr "cpu" "c32") (eq_attr "type" "divd")) 12 8)
122: (define_function_unit "div" 1 0
123: (and (eq_attr "cpu" "c34") (eq_attr "type" "divd")) 20 16)
124: (define_function_unit "div" 1 0
125: (and (eq_attr "cpu" "c38") (eq_attr "type" "divd")) 17 16)
126:
127: (define_function_unit "misc" 1 0
128: (and (eq_attr "cpu" "c1") (eq_attr "type" "cvts,cvtd")) 4 3)
129: (define_function_unit "misc" 1 0
130: (and (eq_attr "cpu" "c32") (eq_attr "type" "cvts")) 9 7)
131: (define_function_unit "misc" 1 0
132: (and (eq_attr "cpu" "c32") (eq_attr "type" "cvtd")) 9 6)
133: (define_function_unit "misc" 1 0
134: (and (eq_attr "cpu" "c34") (eq_attr "type" "cvts")) 6 2)
135: (define_function_unit "misc" 1 0
136: (and (eq_attr "cpu" "c34") (eq_attr "type" "cvtd")) 6 1)
137: (define_function_unit "misc" 1 0
138: (and (eq_attr "cpu" "c38") (eq_attr "type" "cvts,cvtd")) 3 1)
139:
140: (define_function_unit "misc" 1 0
141: (and (eq_attr "cpu" "c1") (eq_attr "type" "shfw,shfl")) 3 2)
142: (define_function_unit "misc" 1 0
143: (and (eq_attr "cpu" "c32") (eq_attr "type" "shfw")) 7 5)
144: (define_function_unit "misc" 1 0
145: (and (eq_attr "cpu" "c32") (eq_attr "type" "shfl")) 7 4)
146: (define_function_unit "misc" 1 0
147: (and (eq_attr "cpu" "c38") (eq_attr "type" "shfw,shfl")) 3 1)
148:
149: (define_function_unit "mystery_latch" 1 1
150: (and (eq_attr "type" "!alu,mldw,mldl,adds,addd") (eq_attr "cpu" "c32")) 2 2)
151:
152: ;(define_function_unit "ip" 1 1
153: ; (and (eq_attr "cpu" "c1")
154: ; (eq_attr "type" "divw,divl,divs,divd,xalu")) 2 2)
155: ;(define_function_unit "ip" 1 1
156: ; (and (eq_attr "cpu" "c1")
157: ; (eq_attr "type" "!divw,divl,divs,divd,xalu")) 1 1)
158: ;(define_function_unit "ip" 1 1
159: ; (and (eq_attr "cpu" "c32")
160: ; (eq_attr "type" "mull,muld,divl,divd,shfl,cvtd,xalu")) 2 2)
161: ;(define_function_unit "ip" 1 1
162: ; (and (eq_attr "cpu" "c32")
163: ; (eq_attr "type" "!mull,muld,divl,divd,shfl,cvtd,xalu")) 1 1)
164: ;(define_function_unit "ip" 1 1
165: ; (and (eq_attr "cpu" "c34")
166: ; (eq_attr "type" "addd,mull,muld,divl,divd,cvtd,xalu")) 2 2)
167: ;(define_function_unit "ip" 1 1
168: ; (and (eq_attr "cpu" "c34")
169: ; (eq_attr "type" "!addd,mull,muld,divl,divd,cvtd,xalu")) 1 1)
170:
171: ;; Make the first thing a real insn in case of genattrtab bug
172:
173: (define_insn "nop"
174: [(const_int 0)]
175: ""
176: "nop")
177:
178: ;; Moves
179:
180: (define_expand "movdf"
181: [(set (match_operand:DF 0 "general_operand" "")
182: (match_operand:DF 1 "general_operand" ""))]
183: ""
184: "if (GET_CODE (operands[0]) != REG)
185: operands[1] = force_reg (DFmode, operands[1]);")
186:
187: (define_insn ""
188: [(set (match_operand:DF 0 "general_operand" "=d,d,d,d,d,<,m")
189: (match_operand:DF 1 "general_operand" "d,Q,m,G,H,d,d"))]
190: "register_operand (operands[0], DFmode)
191: || register_operand (operands[1], DFmode)"
192: "@
193: mov %1,%0
194: ldb.d %1,%0
195: ld.d %1,%0
196: ld.d %u1,%0
197: ld.l %v1,%0
198: psh.l %1
199: st.d %1,%0"
200: [(set_attr "type" "alu,mldb,mldl,alu,alu,alu,mst")])
201:
202: ;; This is here so we can load any result of RTL constant folding
203: ;; but do not use it on constants that can be loaded from memory.
204: ;; It is never better and can be worse.
205:
206: (define_insn ""
207: [(set (match_operand:DF 0 "register_operand" "=d")
208: (match_operand:DF 1 "const_double_operand" "F"))]
209: "CONST_DOUBLE_MEM (operands[1]) == const0_rtx"
210: "ld.u %u1,%0\;ld.w %v1,%0"
211: [(set_attr "type" "xalu")])
212:
213: (define_expand "movsf"
214: [(set (match_operand:SF 0 "general_operand" "")
215: (match_operand:SF 1 "general_operand" ""))]
216: ""
217: "if (GET_CODE (operands[0]) != REG)
218: operands[1] = force_reg (SFmode, operands[1]);")
219:
220: (define_insn ""
221: [(set (match_operand:SF 0 "general_operand" "=d,d,d,d,<,m")
222: (match_operand:SF 1 "general_operand" "d,Q,m,F,d,d"))]
223: "register_operand (operands[0], SFmode)
224: || register_operand (operands[1], SFmode)"
225: "@
226: mov.s %1,%0
227: ldb.s %1,%0
228: ld.s %1,%0
229: ld.s %1,%0
230: psh.w %1
231: st.s %1,%0"
232: [(set_attr "type" "alu,mldb,mldw,alu,alu,mst")])
233:
234: (define_expand "movdi"
235: [(set (match_operand:DI 0 "general_operand" "")
236: (match_operand:DI 1 "general_operand" ""))]
237: ""
238: "if (GET_CODE (operands[0]) != REG)
239: operands[1] = force_reg (DImode, operands[1]);")
240:
241: (define_insn ""
242: [(set (match_operand:DI 0 "general_operand" "=d,d,d,d,d,<,m")
243: (match_operand:DI 1 "general_operand" "d,Q,m,G,HI,d,d"))]
244: "register_operand (operands[0], DImode)
245: || register_operand (operands[1], DImode)"
246: "@
247: mov %1,%0
248: ldb.l %1,%0
249: ld.l %1,%0
250: ld.d %u1,%0
251: ld.l %1,%0
252: psh.l %1
253: st.l %1,%0"
254: [(set_attr "type" "alu,mldb,mldl,alu,alu,alu,mst")])
255:
256: ;; This is here so we can load any result of RTL constant folding
257: ;; but do not use it on constants that can be loaded from memory.
258: ;; It is never better and can be worse.
259:
260: (define_insn ""
261: [(set (match_operand:DI 0 "register_operand" "=d")
262: (match_operand:DI 1 "const_double_operand" "F"))]
263: "CONST_DOUBLE_MEM (operands[1]) == const0_rtx"
264: "ld.u %u1,%0\;ld.w %v1,%0"
265: [(set_attr "type" "xalu")])
266:
267: (define_expand "movsi"
268: [(set (match_operand:SI 0 "general_operand" "")
269: (match_operand:SI 1 "general_operand" ""))]
270: ""
271: "if (GET_CODE (operands[0]) != REG)
272: operands[1] = force_reg (SImode, operands[1]);")
273:
274: (define_insn ""
275: [(set (match_operand:SI 0 "push_operand" "=<,<")
276: (match_operand:SI 1 "nonmemory_operand" "Ad,i"))]
277: ""
278: "@
279: psh.w %1
280: pshea %a1")
281:
282: (define_insn ""
283: [(set (match_operand:SI 0 "general_operand" "=d,r,d,r,r,m")
284: (match_operand:SI 1 "general_operand" "d,r,Q,m,i,r"))]
285: "register_operand (operands[0], SImode)
286: || register_operand (operands[1], SImode)"
287: "@
288: mov.w %1,%0
289: mov %1,%0
290: ldb.w %1,%0
291: ld.w %1,%0
292: ld.w %1,%0
293: st.w %1,%0"
294: [(set_attr "type" "alu,alu,mldb,mldw,alu,mst")])
295:
296: (define_expand "movstrictsi"
297: [(set (strict_low_part (match_operand:SI 0 "general_operand" ""))
298: (match_operand:SI 1 "general_operand" ""))]
299: ""
300: "if (GET_CODE (operands[0]) != REG)
301: operands[1] = force_reg (SImode, operands[1]);")
302:
303: (define_insn ""
304: [(set (strict_low_part (match_operand:SI 0 "general_operand" "=d,r,d,r,r,m"))
305: (match_operand:SI 1 "general_operand" "d,r,Q,m,i,r"))]
306: "register_operand (operands[0], SImode)
307: || register_operand (operands[1], SImode)"
308: "@
309: mov.w %1,%0
310: mov %1,%0
311: ldb.w %1,%0
312: ld.w %1,%0
313: ld.w %1,%0
314: st.w %1,%0"
315: [(set_attr "type" "alu,alu,mldb,mldw,alu,mst")])
316:
317: (define_expand "movhi"
318: [(set (match_operand:HI 0 "general_operand" "")
319: (match_operand:HI 1 "general_operand" ""))]
320: ""
321: "if (GET_CODE (operands[0]) != REG)
322: operands[1] = force_reg (HImode, operands[1]);")
323:
324: (define_insn ""
325: [(set (match_operand:HI 0 "general_operand" "=d,r,d,r,r,<,m")
326: (match_operand:HI 1 "general_operand" "d,r,Q,m,i,Ad,r"))]
327: "register_operand (operands[0], HImode)
328: || register_operand (operands[1], HImode)"
329: "@
330: mov.w %1,%0
331: mov %1,%0
332: ldb.h %1,%0
333: ld.h %1,%0
334: ld.w %1,%0
335: psh.w %1
336: st.h %1,%0"
337: [(set_attr "type" "alu,alu,mldb,mldw,alu,alu,mst")])
338:
339: (define_expand "movqi"
340: [(set (match_operand:QI 0 "general_operand" "")
341: (match_operand:QI 1 "general_operand" ""))]
342: ""
343: "if (GET_CODE (operands[0]) != REG)
344: operands[1] = force_reg (QImode, operands[1]);")
345:
346: (define_insn ""
347: [(set (match_operand:QI 0 "general_operand" "=d,r,d,r,r,<,m")
348: (match_operand:QI 1 "general_operand" "d,r,Q,m,i,Ad,r"))]
349: "register_operand (operands[0], QImode)
350: || register_operand (operands[1], QImode)"
351: "@
352: mov.w %1,%0
353: mov %1,%0
354: ldb.b %1,%0
355: ld.b %1,%0
356: ld.w %1,%0
357: psh.w %1
358: st.b %1,%0"
359: [(set_attr "type" "alu,alu,mldb,mldw,alu,alu,mst")])
360:
361: ;; Expand block moves manually to get code that pipelines the loads.
362:
363: (define_expand "movstrsi"
364: [(set (match_operand:BLK 0 "memory_operand" "=m")
365: (match_operand:BLK 1 "memory_operand" "m"))
366: (use (match_operand:SI 2 "const_int_operand" "i"))
367: (use (match_operand:SI 3 "const_int_operand" "i"))]
368: ""
369: " expand_movstr (operands); DONE; ")
370:
371: ;; Extension and truncation insns.
372: ;; Those for integer source operand
373: ;; are ordered widest source type first.
374:
375: (define_insn "truncsiqi2"
376: [(set (match_operand:QI 0 "register_operand" "=d,a")
377: (truncate:QI (match_operand:SI 1 "register_operand" "d,a")))]
378: ""
379: "cvtw.b %1,%0")
380:
381: (define_insn "truncsihi2"
382: [(set (match_operand:HI 0 "register_operand" "=d,a")
383: (truncate:HI (match_operand:SI 1 "register_operand" "d,a")))]
384: ""
385: "cvtw.h %1,%0")
386:
387: (define_insn "trunchiqi2"
388: [(set (match_operand:QI 0 "register_operand" "=r")
389: (truncate:QI (match_operand:HI 1 "register_operand" "0")))]
390: ""
391: "")
392:
393: (define_insn "truncdisi2"
394: [(set (match_operand:SI 0 "register_operand" "=d")
395: (truncate:SI (match_operand:DI 1 "register_operand" "d")))]
396: ""
397: "cvtl.w %1,%0")
398:
399: (define_insn "extendsidi2"
400: [(set (match_operand:DI 0 "register_operand" "=d")
401: (sign_extend:DI (match_operand:SI 1 "register_operand" "d")))]
402: ""
403: "cvtw.l %1,%0")
404:
405: (define_insn "extendhisi2"
406: [(set (match_operand:SI 0 "register_operand" "=d,a")
407: (sign_extend:SI (match_operand:HI 1 "register_operand" "d,a")))]
408: ""
409: "cvth.w %1,%0")
410:
411: (define_insn "extendqihi2"
412: [(set (match_operand:HI 0 "register_operand" "=d,a")
413: (sign_extend:HI (match_operand:QI 1 "register_operand" "d,a")))]
414: ""
415: "cvtb.w %1,%0")
416:
417: (define_insn "extendqisi2"
418: [(set (match_operand:SI 0 "register_operand" "=d,a")
419: (sign_extend:SI (match_operand:QI 1 "register_operand" "d,a")))]
420: ""
421: "cvtb.w %1,%0")
422:
423: (define_insn "extendsfdf2"
424: [(set (match_operand:DF 0 "register_operand" "=d")
425: (float_extend:DF (match_operand:SF 1 "register_operand" "d")))]
426: ""
427: "cvts.d %1,%0"
428: [(set_attr "type" "cvts")])
429:
430: (define_insn "truncdfsf2"
431: [(set (match_operand:SF 0 "register_operand" "=d")
432: (float_truncate:SF (match_operand:DF 1 "register_operand" "d")))]
433: ""
434: "cvtd.s %1,%0"
435: [(set_attr "type" "cvtd")])
436:
437: (define_insn "zero_extendhisi2"
438: [(set (match_operand:SI 0 "register_operand" "=r")
439: (zero_extend:SI (match_operand:HI 1 "register_operand" "0")))]
440: ""
441: "and #0xffff,%0")
442:
443: (define_insn "zero_extendqihi2"
444: [(set (match_operand:HI 0 "register_operand" "=r")
445: (zero_extend:HI (match_operand:QI 1 "register_operand" "0")))]
446: ""
447: "and #0xff,%0")
448:
449: (define_insn "zero_extendqisi2"
450: [(set (match_operand:SI 0 "register_operand" "=r")
451: (zero_extend:SI (match_operand:QI 1 "register_operand" "0")))]
452: ""
453: "and #0xff,%0")
454:
455: (define_insn "zero_extendsidi2"
456: [(set (match_operand:DI 0 "register_operand" "=d")
457: (zero_extend:DI (match_operand:SI 1 "register_operand" "0")))]
458: ""
459: "ld.u #0,%0")
460:
461: ;; Fix-to-float conversion insns.
462: ;; Note that the ones that start with SImode come first.
463: ;; That is so that an operand that is a CONST_INT
464: ;; (and therefore lacks a specific machine mode).
465: ;; will be recognized as SImode (which is always valid)
466: ;; rather than as QImode or HImode.
467:
468: (define_insn "floatsisf2"
469: [(set (match_operand:SF 0 "register_operand" "=d")
470: (float:SF (match_operand:SI 1 "register_operand" "d")))]
471: ""
472: "cvtw.s %1,%0"
473: [(set_attr "type" "cvts")])
474:
475: (define_insn "floatdisf2"
476: [(set (match_operand:SF 0 "register_operand" "=d")
477: (float:SF (match_operand:DI 1 "register_operand" "d")))]
478: ""
479: "cvtl.s %1,%0"
480: [(set_attr "type" "cvtd")])
481:
482: (define_insn "floatsidf2"
483: [(set (match_operand:DF 0 "register_operand" "=d")
484: (float:DF (match_operand:SI 1 "register_operand" "d")))]
485: "! TARGET_C1"
486: "cvtw.d %1,%0"
487: [(set_attr "type" "cvts")])
488:
489: (define_insn "floatdidf2"
490: [(set (match_operand:DF 0 "register_operand" "=d")
491: (float:DF (match_operand:DI 1 "register_operand" "d")))]
492: ""
493: "cvtl.d %1,%0"
494: [(set_attr "type" "cvtd")])
495:
496: ;; These are a little slower than gcc's normal way of doing unsigned
497: ;; DI floats (if the DI number is "negative") but they avoid double
498: ;; rounding and they avoid explicit constants.
499:
500: (define_expand "floatunsdidf2"
501: [(set (match_operand:DF 0 "register_operand" "=d")
502: (float:DF (match_operand:DI 1 "register_operand" "d")))
503: (set (cc0) (compare:DI (match_dup 3) (match_dup 1)))
504: (set (pc)
505: (if_then_else (le (cc0) (const_int 0))
506: (label_ref (match_dup 4))
507: (pc)))
508: (set (match_dup 2) (lshiftrt:DI (match_dup 1) (const_int 1)))
509: (set (match_dup 0) (float:DF (match_dup 2)))
510: (set (match_dup 0) (plus:DF (match_dup 0) (match_dup 0)))
511: (match_dup 4)
512: (set (match_dup 0) (match_dup 0))]
513: ""
514: "
515: {
516: operands[2] = gen_reg_rtx (DImode);
517: operands[3] = force_reg (DImode, const0_rtx);
518: operands[4] = gen_label_rtx ();
519: }")
520:
521: (define_expand "floatunsdisf2"
522: [(set (match_operand:SF 0 "register_operand" "=d")
523: (float:SF (match_operand:DI 1 "register_operand" "d")))
524: (set (cc0) (compare:DI (match_dup 3) (match_dup 1)))
525: (set (pc)
526: (if_then_else (le (cc0) (const_int 0))
527: (label_ref (match_dup 4))
528: (pc)))
529: (set (match_dup 2) (lshiftrt:DI (match_dup 1) (const_int 1)))
530: (set (match_dup 0) (float:SF (match_dup 2)))
531: (set (match_dup 0) (plus:SF (match_dup 0) (match_dup 0)))
532: (match_dup 4)
533: (set (match_dup 0) (match_dup 0))]
534: ""
535: "
536: {
537: operands[2] = gen_reg_rtx (DImode);
538: operands[3] = force_reg (DImode, const0_rtx);
539: operands[4] = gen_label_rtx ();
540: }")
541:
542: ;; These patterns are identical to gcc's default action
543: ;; if DI->DF and DI->SF are not present. There are here
544: ;; only to prevent SI->*F from promoting to DI->*F.
545:
546: (define_expand "floatunssidf2"
547: [(set (match_dup 2)
548: (zero_extend:DI (match_operand:SI 1 "register_operand" "")))
549: (set (match_operand:DF 0 "register_operand" "")
550: (float:DF (match_dup 2)))]
551: ""
552: "operands[2] = gen_reg_rtx (DImode);")
553:
554: (define_expand "floatunssisf2"
555: [(set (match_dup 2)
556: (zero_extend:DI (match_operand:SI 1 "register_operand" "")))
557: (set (match_operand:SF 0 "register_operand" "")
558: (float:SF (match_dup 2)))]
559: ""
560: "operands[2] = gen_reg_rtx (DImode);")
561:
562: ;; Float-to-fix conversion insns.
563:
564: (define_insn "fix_truncsfsi2"
565: [(set (match_operand:SI 0 "register_operand" "=d")
566: (fix:SI (fix:SF (match_operand:SF 1 "register_operand" "d"))))]
567: ""
568: "cvts.w %1,%0"
569: [(set_attr "type" "cvts")])
570:
571: (define_insn "fix_truncsfdi2"
572: [(set (match_operand:DI 0 "register_operand" "=d")
573: (fix:DI (fix:SF (match_operand:SF 1 "register_operand" "d"))))]
574: ""
575: "cvts.l %1,%0"
576: [(set_attr "type" "cvts")])
577:
578: (define_insn "fix_truncdfsi2"
579: [(set (match_operand:SI 0 "register_operand" "=d")
580: (fix:SI (fix:DF (match_operand:DF 1 "register_operand" "d"))))]
581: ""
582: "cvtd.l %1,%0"
583: [(set_attr "type" "cvtd")])
584:
585: (define_insn "fix_truncdfdi2"
586: [(set (match_operand:DI 0 "register_operand" "=d")
587: (fix:DI (fix:DF (match_operand:DF 1 "register_operand" "d"))))]
588: ""
589: "cvtd.l %1,%0"
590: [(set_attr "type" "cvtd")])
591:
592: ;;- All kinds of add instructions.
593:
594: (define_insn "adddf3"
595: [(set (match_operand:DF 0 "register_operand" "=d")
596: (plus:DF (match_operand:DF 1 "register_operand" "%0")
597: (match_operand:DF 2 "register_operand" "d")))]
598: ""
599: "add.d %2,%0"
600: [(set_attr "type" "addd")])
601:
602: (define_insn "addsf3"
603: [(set (match_operand:SF 0 "register_operand" "=d")
604: (plus:SF (match_operand:SF 1 "register_operand" "%0")
605: (match_operand:SF 2 "nonmemory_operand" "dF")))]
606: ""
607: "add.s %2,%0"
608: [(set_attr "type" "adds")])
609:
610: (define_insn "adddi3"
611: [(set (match_operand:DI 0 "register_operand" "=d")
612: (plus:DI (match_operand:DI 1 "register_operand" "%0")
613: (match_operand:DI 2 "register_operand" "d")))]
614: ""
615: "add.l %2,%0")
616:
617: (define_expand "addsi3"
618: [(set (match_operand:SI 0 "register_operand" "")
619: (plus:SI (match_operand:SI 1 "register_operand" "")
620: (match_operand:SI 2 "nonmemory_operand" "")))]
621: ""
622: "")
623:
624: (define_insn ""
625: [(set (match_operand:SI 0 "register_operand" "=a")
626: (plus:SI (match_operand:SI 1 "register_operand" "%A")
627: (match_operand:SI 2 "immediate_operand" "i")))]
628: "operands[1] == frame_pointer_rtx || operands[1] == arg_pointer_rtx"
629: "ldea %a2(%1),%0")
630:
631: (define_insn ""
632: [(set (match_operand:SI 0 "register_operand" "=a")
633: (plus:SI (match_operand:SI 1 "register_operand" "%a")
634: (match_operand:SI 2 "nonmemory_operand" "ri")))]
635: "operands[1] == stack_pointer_rtx && operands[0] != stack_pointer_rtx"
636: "mov %1,%0\;add.w %2,%0")
637:
638: (define_insn ""
639: [(set (match_operand:SI 0 "push_operand" "=<")
640: (plus:SI (match_operand:SI 1 "register_operand" "A")
641: (match_operand:SI 2 "immediate_operand" "i")))]
642: "operands[1] != stack_pointer_rtx"
643: "pshea %a2(%1)"
644: [(set_attr "type" "mst")])
645:
646: (define_insn ""
647: [(set (match_operand:SI 0 "register_operand" "=d,a,a")
648: (plus:SI (match_operand:SI 1 "register_operand" "%0,0,A")
649: (match_operand:SI 2 "nonmemory_operand" "di,ri,i")))]
650: "TARGET_C1"
651: "@
652: add.w %2,%0
653: add.w %2,%0
654: ldea %a2(%1),%0")
655:
656: (define_insn ""
657: [(set (match_operand:SI 0 "register_operand" "=d,a,r")
658: (plus:SI (match_operand:SI 1 "register_operand" "%0,0,A")
659: (match_operand:SI 2 "nonmemory_operand" "di,ri,i")))]
660: ""
661: "@
662: add.w %2,%0
663: add.w %2,%0
664: ldea %a2(%1),%0")
665:
666: (define_insn "addhi3"
667: [(set (match_operand:HI 0 "register_operand" "=d,a")
668: (plus:HI (match_operand:HI 1 "register_operand" "%0,0")
669: (match_operand:HI 2 "nonmemory_operand" "di,ai")))]
670: ""
671: "add.h %2,%0")
672:
673: (define_insn "addqi3"
674: [(set (match_operand:QI 0 "register_operand" "=d,d")
675: (plus:QI (match_operand:QI 1 "register_operand" "%0,0")
676: (match_operand:QI 2 "nonmemory_operand" "d,i")))]
677: ""
678: "@
679: add.b %2,%0
680: add.w %2,%0")
681:
682: ;;- All kinds of subtract instructions.
683:
684: (define_insn "subdf3"
685: [(set (match_operand:DF 0 "register_operand" "=d")
686: (minus:DF (match_operand:DF 1 "register_operand" "0")
687: (match_operand:DF 2 "register_operand" "d")))]
688: ""
689: "sub.d %2,%0"
690: [(set_attr "type" "addd")])
691:
692: (define_insn "subsf3"
693: [(set (match_operand:SF 0 "register_operand" "=d")
694: (minus:SF (match_operand:SF 1 "register_operand" "0")
695: (match_operand:SF 2 "nonmemory_operand" "dF")))]
696: ""
697: "sub.s %2,%0"
698: [(set_attr "type" "adds")])
699:
700: (define_insn "subdi3"
701: [(set (match_operand:DI 0 "register_operand" "=d")
702: (minus:DI (match_operand:DI 1 "register_operand" "0")
703: (match_operand:DI 2 "register_operand" "d")))]
704: ""
705: "sub.l %2,%0")
706:
707: (define_insn "subsi3"
708: [(set (match_operand:SI 0 "register_operand" "=d,a,?d,?a")
709: (minus:SI (match_operand:SI 1 "nonmemory_operand" "0,0,di,ai")
710: (match_operand:SI 2 "nonmemory_operand" "di,ai,0,0")))]
711: ""
712: "@
713: sub.w %2,%0
714: sub.w %2,%0
715: sub.w %1,%0\;neg.w %0,%0
716: sub.w %1,%0\;neg.w %0,%0")
717:
718: (define_insn "subhi3"
719: [(set (match_operand:HI 0 "register_operand" "=d,a")
720: (minus:HI (match_operand:HI 1 "register_operand" "0,0")
721: (match_operand:HI 2 "nonmemory_operand" "di,ai")))]
722: ""
723: "sub.h %2,%0")
724:
725: (define_insn "subqi3"
726: [(set (match_operand:QI 0 "register_operand" "=d,d")
727: (minus:QI (match_operand:QI 1 "register_operand" "0,0")
728: (match_operand:QI 2 "nonmemory_operand" "d,i")))]
729: ""
730: "@
731: sub.b %2,%0
732: sub.w %2,%0")
733:
734: ;;- Multiply instructions.
735:
736: (define_insn "muldf3"
737: [(set (match_operand:DF 0 "register_operand" "=d")
738: (mult:DF (match_operand:DF 1 "register_operand" "%0")
739: (match_operand:DF 2 "register_operand" "d")))]
740: ""
741: "mul.d %2,%0"
742: [(set_attr "type" "muld")])
743:
744: (define_insn "mulsf3"
745: [(set (match_operand:SF 0 "register_operand" "=d")
746: (mult:SF (match_operand:SF 1 "register_operand" "%0")
747: (match_operand:SF 2 "nonmemory_operand" "dF")))]
748: ""
749: "mul.s %2,%0"
750: [(set_attr "type" "muls")])
751:
752: (define_insn "muldi3"
753: [(set (match_operand:DI 0 "register_operand" "=d")
754: (mult:DI (match_operand:DI 1 "register_operand" "%0")
755: (match_operand:DI 2 "register_operand" "d")))]
756: ""
757: "mul.l %2,%0"
758: [(set_attr "type" "mull")])
759:
760: (define_insn "mulsi3"
761: [(set (match_operand:SI 0 "register_operand" "=d,a")
762: (mult:SI (match_operand:SI 1 "register_operand" "%0,0")
763: (match_operand:SI 2 "nonmemory_operand" "di,ai")))]
764: ""
765: "mul.w %2,%0"
766: [(set_attr "type" "mulw")])
767:
768: (define_insn "mulhi3"
769: [(set (match_operand:HI 0 "register_operand" "=d,a")
770: (mult:HI (match_operand:HI 1 "register_operand" "%0,0")
771: (match_operand:HI 2 "nonmemory_operand" "di,ai")))]
772: ""
773: "mul.h %2,%0"
774: [(set_attr "type" "mulw")])
775:
776: (define_insn "mulqi3"
777: [(set (match_operand:QI 0 "register_operand" "=d,d")
778: (mult:QI (match_operand:QI 1 "register_operand" "%0,0")
779: (match_operand:QI 2 "nonmemory_operand" "d,i")))]
780: ""
781: "@
782: mul.b %2,%0
783: mul.w %2,%0"
784: [(set_attr "type" "mulw,mulw")])
785:
786: ;;- Divide instructions.
787:
788: (define_insn "divdf3"
789: [(set (match_operand:DF 0 "register_operand" "=d")
790: (div:DF (match_operand:DF 1 "register_operand" "0")
791: (match_operand:DF 2 "register_operand" "d")))]
792: ""
793: "div.d %2,%0"
794: [(set_attr "type" "divd")])
795:
796: (define_insn "divsf3"
797: [(set (match_operand:SF 0 "register_operand" "=d")
798: (div:SF (match_operand:SF 1 "register_operand" "0")
799: (match_operand:SF 2 "nonmemory_operand" "dF")))]
800: ""
801: "div.s %2,%0"
802: [(set_attr "type" "divs")])
803:
804: (define_insn "divdi3"
805: [(set (match_operand:DI 0 "register_operand" "=d")
806: (div:DI (match_operand:DI 1 "register_operand" "0")
807: (match_operand:DI 2 "register_operand" "d")))]
808: ""
809: "div.l %2,%0"
810: [(set_attr "type" "divl")])
811:
812: (define_expand "udivsi3"
813: [(set (match_dup 3)
814: (zero_extend:DI (match_operand:SI 1 "register_operand" "")))
815: (set (match_dup 4)
816: (zero_extend:DI (match_operand:SI 2 "register_operand" "")))
817: (set (match_dup 3)
818: (div:DI (match_dup 3) (match_dup 4)))
819: (set (match_operand:SI 0 "register_operand" "")
820: (subreg:SI (match_dup 3) 0))]
821: ""
822: "operands[3] = gen_reg_rtx (DImode);
823: operands[4] = gen_reg_rtx (DImode); ")
824:
825: (define_insn "udivdi3"
826: [(set (match_operand:DI 0 "register_operand" "=d")
827: (udiv:DI (match_operand:DI 1 "register_operand" "d")
828: (match_operand:DI 2 "register_operand" "d")))]
829: ""
830: "psh.l %2\;psh.l %1\;callq udiv64\;pop.l %0\;add.w #8,sp")
831:
832: (define_insn "divsi3"
833: [(set (match_operand:SI 0 "register_operand" "=d,a")
834: (div:SI (match_operand:SI 1 "register_operand" "0,0")
835: (match_operand:SI 2 "nonmemory_operand" "di,ai")))]
836: ""
837: "div.w %2,%0"
838: [(set_attr "type" "divw")])
839:
840: (define_insn "divhi3"
841: [(set (match_operand:HI 0 "register_operand" "=d,a")
842: (div:HI (match_operand:HI 1 "register_operand" "0,0")
843: (match_operand:HI 2 "nonmemory_operand" "di,ai")))]
844: ""
845: "div.h %2,%0"
846: [(set_attr "type" "divw")])
847:
848: (define_insn "divqi3"
849: [(set (match_operand:QI 0 "register_operand" "=d")
850: (div:QI (match_operand:QI 1 "register_operand" "0")
851: (match_operand:QI 2 "register_operand" "d")))]
852: ""
853: "div.b %2,%0"
854: [(set_attr "type" "divw")])
855:
856: ;;- Bit clear instructions.
857:
858: (define_insn ""
859: [(set (match_operand:DI 0 "register_operand" "=d")
860: (and:DI (match_operand:DI 1 "register_operand" "%0")
861: (match_operand:DI 2 "" "")))]
862: "(GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) < 0)
863: || (GET_CODE (operands[2]) == CONST_DOUBLE
864: && CONST_DOUBLE_HIGH (operands[2]) == -1)"
865: "and %2,%0")
866:
867: (define_insn "anddi3"
868: [(set (match_operand:DI 0 "register_operand" "=d")
869: (and:DI (match_operand:DI 1 "register_operand" "%0")
870: (match_operand:DI 2 "register_operand" "d")))]
871: ""
872: "and %2,%0")
873:
874: (define_insn "andsi3"
875: [(set (match_operand:SI 0 "register_operand" "=d,a")
876: (and:SI (match_operand:SI 1 "register_operand" "%0,0")
877: (match_operand:SI 2 "nonmemory_operand" "di,ai")))]
878: ""
879: "and %2,%0")
880:
881: (define_insn "andhi3"
882: [(set (match_operand:HI 0 "register_operand" "=d,a")
883: (and:HI (match_operand:HI 1 "register_operand" "%0,0")
884: (match_operand:HI 2 "nonmemory_operand" "di,ai")))]
885: ""
886: "and %2,%0")
887:
888: (define_insn "andqi3"
889: [(set (match_operand:QI 0 "register_operand" "=d,a")
890: (and:QI (match_operand:QI 1 "register_operand" "%0,0")
891: (match_operand:QI 2 "nonmemory_operand" "di,ai")))]
892: ""
893: "and %2,%0")
894:
895: ;;- Bit set instructions.
896:
897: (define_insn ""
898: [(set (match_operand:DI 0 "register_operand" "=d")
899: (ior:DI (match_operand:DI 1 "register_operand" "%0")
900: (match_operand:DI 2 "" "")))]
901: "(GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) >= 0)
902: || (GET_CODE (operands[2]) == CONST_DOUBLE
903: && CONST_DOUBLE_HIGH (operands[2]) == 0)"
904: "or %2,%0")
905:
906: (define_insn "iordi3"
907: [(set (match_operand:DI 0 "register_operand" "=d")
908: (ior:DI (match_operand:DI 1 "register_operand" "%0")
909: (match_operand:DI 2 "register_operand" "d")))]
910: ""
911: "or %2,%0")
912:
913: (define_insn "iorsi3"
914: [(set (match_operand:SI 0 "register_operand" "=d,a")
915: (ior:SI (match_operand:SI 1 "register_operand" "%0,0")
916: (match_operand:SI 2 "nonmemory_operand" "di,ai")))]
917: ""
918: "or %2,%0")
919:
920: (define_insn "iorhi3"
921: [(set (match_operand:HI 0 "register_operand" "=d,a")
922: (ior:HI (match_operand:HI 1 "register_operand" "%0,0")
923: (match_operand:HI 2 "nonmemory_operand" "di,ai")))]
924: ""
925: "or %2,%0")
926:
927: (define_insn "iorqi3"
928: [(set (match_operand:QI 0 "register_operand" "=d,a")
929: (ior:QI (match_operand:QI 1 "register_operand" "%0,0")
930: (match_operand:QI 2 "nonmemory_operand" "di,ai")))]
931: ""
932: "or %2,%0")
933:
934: ;;- xor instructions.
935:
936: (define_insn ""
937: [(set (match_operand:DI 0 "register_operand" "=d")
938: (xor:DI (match_operand:DI 1 "register_operand" "%0")
939: (match_operand:DI 2 "" "")))]
940: "(GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) >= 0)
941: || (GET_CODE (operands[2]) == CONST_DOUBLE
942: && CONST_DOUBLE_HIGH (operands[2]) == 0)"
943: "xor %2,%0")
944:
945: (define_insn "xordi3"
946: [(set (match_operand:DI 0 "register_operand" "=d")
947: (xor:DI (match_operand:DI 1 "register_operand" "%0")
948: (match_operand:DI 2 "register_operand" "d")))]
949: ""
950: "xor %2,%0")
951:
952: (define_insn "xorsi3"
953: [(set (match_operand:SI 0 "register_operand" "=d,a")
954: (xor:SI (match_operand:SI 1 "register_operand" "%0,0")
955: (match_operand:SI 2 "nonmemory_operand" "di,ai")))]
956: ""
957: "xor %2,%0")
958:
959: (define_insn "xorhi3"
960: [(set (match_operand:HI 0 "register_operand" "=d,a")
961: (xor:HI (match_operand:HI 1 "register_operand" "%0,0")
962: (match_operand:HI 2 "nonmemory_operand" "di,ai")))]
963: ""
964: "xor %2,%0")
965:
966: (define_insn "xorqi3"
967: [(set (match_operand:QI 0 "register_operand" "=d,a")
968: (xor:QI (match_operand:QI 1 "register_operand" "%0,0")
969: (match_operand:QI 2 "nonmemory_operand" "di,ai")))]
970: ""
971: "xor %2,%0")
972:
973: (define_insn "negdf2"
974: [(set (match_operand:DF 0 "register_operand" "=d")
975: (neg:DF (match_operand:DF 1 "register_operand" "d")))]
976: ""
977: "neg.d %1,%0"
978: [(set_attr "type" "addd")])
979:
980: (define_insn "negsf2"
981: [(set (match_operand:SF 0 "register_operand" "=d")
982: (neg:SF (match_operand:SF 1 "register_operand" "d")))]
983: ""
984: "neg.s %1,%0"
985: [(set_attr "type" "adds")])
986:
987: (define_insn "negdi2"
988: [(set (match_operand:DI 0 "register_operand" "=d")
989: (neg:DI (match_operand:DI 1 "register_operand" "d")))]
990: ""
991: "neg.l %1,%0")
992:
993: (define_insn "negsi2"
994: [(set (match_operand:SI 0 "register_operand" "=d,a")
995: (neg:SI (match_operand:SI 1 "register_operand" "d,a")))]
996: ""
997: "neg.w %1,%0")
998:
999: (define_insn "neghi2"
1000: [(set (match_operand:HI 0 "register_operand" "=d,a")
1001: (neg:HI (match_operand:HI 1 "register_operand" "d,a")))]
1002: ""
1003: "neg.h %1,%0")
1004:
1005: (define_insn "negqi2"
1006: [(set (match_operand:QI 0 "register_operand" "=d")
1007: (neg:QI (match_operand:QI 1 "register_operand" "d")))]
1008: ""
1009: "neg.b %1,%0")
1010:
1011: (define_insn "one_cmpldi2"
1012: [(set (match_operand:DI 0 "register_operand" "=d")
1013: (not:DI (match_operand:DI 1 "register_operand" "d")))]
1014: ""
1015: "not %1,%0")
1016:
1017: (define_insn "one_cmplsi2"
1018: [(set (match_operand:SI 0 "register_operand" "=d,a")
1019: (not:SI (match_operand:SI 1 "register_operand" "d,a")))]
1020: ""
1021: "not %1,%0")
1022:
1023: (define_insn "one_cmplhi2"
1024: [(set (match_operand:HI 0 "register_operand" "=d,a")
1025: (not:HI (match_operand:HI 1 "register_operand" "d,a")))]
1026: ""
1027: "not %1,%0")
1028:
1029: (define_insn "one_cmplqi2"
1030: [(set (match_operand:QI 0 "register_operand" "=d,a")
1031: (not:QI (match_operand:QI 1 "register_operand" "d,a")))]
1032: ""
1033: "not %1,%0")
1034:
1035: ;;- Shifts
1036: ;;
1037: ;; The extreme profusion of patterns here is due to the different-speed
1038: ;; shifts on different machines, and the C1's lack of word shift S-register
1039: ;; instructions.
1040:
1041: ;; SImode
1042:
1043: ;; Logical left 1, 1 cycle on all machines via add
1044:
1045: (define_insn ""
1046: [(set (match_operand:SI 0 "register_operand" "=r")
1047: (lshift:SI (match_operand:SI 1 "register_operand" "0")
1048: (const_int 1)))]
1049: ""
1050: "add.w %0,%0")
1051:
1052: ;; C34 general shift is 1 cycle
1053:
1054: (define_insn ""
1055: [(set (match_operand:SI 0 "register_operand" "=d,a")
1056: (lshift:SI (match_operand:SI 1 "register_operand" "0,0")
1057: (match_operand:SI 2 "nonmemory_operand" "di,ai")))]
1058: "TARGET_C34"
1059: "@
1060: shf.w %2,%0
1061: shf %2,%0"
1062: [(set_attr "type" "shfw,shfw")])
1063:
1064: ;; else shift left 0..7 is 1 cycle if we use an A register
1065:
1066: (define_insn ""
1067: [(set (match_operand:SI 0 "register_operand" "=a,?d")
1068: (lshift:SI (match_operand:SI 1 "register_operand" "0,0")
1069: (match_operand:SI 2 "immediate_operand" "ai,di")))]
1070: "TARGET_C1 && INTVAL (operands[2]) < (unsigned) 8"
1071: "@
1072: shf %2,%0
1073: shf %2,%0"
1074: [(set_attr "type" "alu,shfl")])
1075:
1076: (define_insn ""
1077: [(set (match_operand:SI 0 "register_operand" "=a,?d")
1078: (lshift:SI (match_operand:SI 1 "register_operand" "0,0")
1079: (match_operand:SI 2 "immediate_operand" "ai,di")))]
1080: "INTVAL (operands[2]) < (unsigned) 8"
1081: "@
1082: shf %2,%0
1083: shf.w %2,%0"
1084: [(set_attr "type" "alu,shfw")])
1085:
1086: ;; else general left shift
1087:
1088: (define_insn ""
1089: [(set (match_operand:SI 0 "register_operand" "=d,a")
1090: (lshift:SI (match_operand:SI 1 "register_operand" "0,0")
1091: (match_operand:SI 2 "nonmemory_operand" "di,ai")))]
1092: "TARGET_C1"
1093: "@
1094: shf %2,%0
1095: shf %2,%0"
1096: [(set_attr "type" "shfl,shfw")])
1097:
1098: ;; (but C2 shift left by a constant can is faster via multiply)
1099:
1100: (define_insn ""
1101: [(set (match_operand:SI 0 "register_operand" "=r")
1102: (lshift:SI (match_operand:SI 1 "register_operand" "0")
1103: (match_operand:SI 2 "const_int_operand" "i")))]
1104: "TARGET_C2 && INTVAL (operands[2]) < (unsigned) 32"
1105: "mul.w %z2,%0"
1106: [(set_attr "type" "mulw")])
1107:
1108: (define_insn "lshlsi3"
1109: [(set (match_operand:SI 0 "register_operand" "=d,a")
1110: (lshift:SI (match_operand:SI 1 "register_operand" "0,0")
1111: (match_operand:SI 2 "nonmemory_operand" "di,ai")))]
1112: ""
1113: "@
1114: shf.w %2,%0
1115: shf %2,%0"
1116: [(set_attr "type" "shfw,shfw")])
1117:
1118: ;; Arithmetic left 1, 1 cycle on all machines via add
1119:
1120: (define_insn ""
1121: [(set (match_operand:SI 0 "register_operand" "=r")
1122: (ashift:SI (match_operand:SI 1 "register_operand" "0")
1123: (const_int 1)))]
1124: ""
1125: "add.w %0,%0")
1126:
1127: ;; C34 general shift is 1 cycle
1128:
1129: (define_insn ""
1130: [(set (match_operand:SI 0 "register_operand" "=d,a")
1131: (ashift:SI (match_operand:SI 1 "register_operand" "0,0")
1132: (match_operand:SI 2 "nonmemory_operand" "di,ai")))]
1133: "TARGET_C34"
1134: "@
1135: shf.w %2,%0
1136: shf %2,%0"
1137: [(set_attr "type" "shfw,shfw")])
1138:
1139: ;; else shift left 0..7 is 1 cycle if we use an A register
1140:
1141: (define_insn ""
1142: [(set (match_operand:SI 0 "register_operand" "=a,?d")
1143: (ashift:SI (match_operand:SI 1 "register_operand" "0,0")
1144: (match_operand:SI 2 "immediate_operand" "ai,di")))]
1145: "TARGET_C1 && INTVAL (operands[2]) < (unsigned) 8"
1146: "@
1147: shf %2,%0
1148: shf %2,%0"
1149: [(set_attr "type" "alu,shfl")])
1150:
1151: (define_insn ""
1152: [(set (match_operand:SI 0 "register_operand" "=a,?d")
1153: (ashift:SI (match_operand:SI 1 "register_operand" "0,0")
1154: (match_operand:SI 2 "immediate_operand" "ai,di")))]
1155: "INTVAL (operands[2]) < (unsigned) 8"
1156: "@
1157: shf %2,%0
1158: shf.w %2,%0"
1159: [(set_attr "type" "alu,shfw")])
1160:
1161: ;; else general left shift
1162:
1163: (define_insn ""
1164: [(set (match_operand:SI 0 "register_operand" "=d,a")
1165: (ashift:SI (match_operand:SI 1 "register_operand" "0,0")
1166: (match_operand:SI 2 "nonmemory_operand" "di,ai")))]
1167: "TARGET_C1"
1168: "@
1169: shf %2,%0
1170: shf %2,%0"
1171: [(set_attr "type" "shfl,shfw")])
1172:
1173: (define_insn ""
1174: [(set (match_operand:SI 0 "register_operand" "=r")
1175: (ashift:SI (match_operand:SI 1 "register_operand" "0")
1176: (match_operand:SI 2 "const_int_operand" "i")))]
1177: "TARGET_C2 && INTVAL (operands[2]) < (unsigned) 32"
1178: "mul.w %z2,%0"
1179: [(set_attr "type" "mulw")])
1180:
1181: (define_insn "ashlsi3"
1182: [(set (match_operand:SI 0 "register_operand" "=d,a")
1183: (ashift:SI (match_operand:SI 1 "register_operand" "0,0")
1184: (match_operand:SI 2 "nonmemory_operand" "di,ai")))]
1185: ""
1186: "@
1187: shf.w %2,%0
1188: shf %2,%0"
1189: [(set_attr "type" "shfw,shfw")])
1190:
1191: ;; Logical right, general
1192: ;; The hardware wants the negative of the shift count
1193:
1194: (define_expand "lshrsi3"
1195: [(set (match_operand:SI 0 "register_operand" "")
1196: (lshiftrt:SI (match_operand:SI 1 "register_operand" "")
1197: (neg:SI (match_operand:SI 2 "nonmemory_operand" ""))))]
1198: ""
1199: "operands[2] = negate_rtx (SImode, operands[2]);")
1200:
1201: ;; C1 lacks word shift S reg
1202:
1203: (define_insn ""
1204: [(set
1205: (match_operand:SI 0 "register_operand" "=a,?d")
1206: (lshiftrt:SI (match_operand:SI 1 "register_operand" "0,0")
1207: (neg:SI (match_operand:SI 2 "nonmemory_operand" "ai,di"))))]
1208: "TARGET_C1"
1209: "@
1210: shf %2,%0
1211: ld.u #0,%0\;shf %2,%0"
1212: [(set_attr "type" "shfw,shfl")])
1213:
1214: ;; general case
1215:
1216: (define_insn ""
1217: [(set
1218: (match_operand:SI 0 "register_operand" "=d,a")
1219: (lshiftrt:SI (match_operand:SI 1 "register_operand" "0,0")
1220: (neg:SI (match_operand:SI 2 "nonmemory_operand" "di,ai"))))]
1221: ""
1222: "@
1223: shf.w %2,%0
1224: shf %2,%0"
1225: [(set_attr "type" "shfw,shfw")])
1226:
1227: ;; Patterns without neg produced by constant folding
1228:
1229: (define_insn ""
1230: [(set
1231: (match_operand:SI 0 "register_operand" "=a,?d")
1232: (lshiftrt:SI (match_operand:SI 1 "register_operand" "0,0")
1233: (match_operand:SI 2 "immediate_operand" "i,i")))]
1234: "TARGET_C1"
1235: "@
1236: shf #%n2,%0
1237: ld.u #0,%0\;shf #%n2,%0"
1238: [(set_attr "type" "shfw,shfl")])
1239:
1240: (define_insn ""
1241: [(set
1242: (match_operand:SI 0 "register_operand" "=d,a")
1243: (lshiftrt:SI (match_operand:SI 1 "register_operand" "0,0")
1244: (match_operand:SI 2 "immediate_operand" "i,i")))]
1245: ""
1246: "@
1247: shf.w #%n2,%0
1248: shf #%n2,%0"
1249: [(set_attr "type" "shfw,shfw")])
1250:
1251: ;; Arithmetic right, general
1252: ;; Sign-extend to 64 bits, then shift that. Works for 0..32.
1253:
1254: (define_expand "ashrsi3"
1255: [(set (match_operand:SI 0 "register_operand" "")
1256: (ashiftrt:SI (match_operand:SI 1 "register_operand" "")
1257: (neg:SI (match_operand:SI 2 "nonmemory_operand" ""))))]
1258: ""
1259: "operands[2] = negate_rtx (SImode, operands[2]);")
1260:
1261: (define_insn ""
1262: [(set (match_operand:SI 0 "register_operand" "=d,&d")
1263: (ashiftrt:SI (match_operand:SI 1 "register_operand" "0,d")
1264: (neg:SI
1265: (match_operand:SI 2 "nonmemory_operand" "di,di"))))]
1266: ""
1267: "cvtw.l %1,%0\;shf %2,%0"
1268: [(set_attr "type" "shfl,shfl")])
1269:
1270: (define_insn ""
1271: [(set (match_operand:SI 0 "register_operand" "=d")
1272: (ashiftrt:SI (match_operand:SI 1 "register_operand" "d")
1273: (match_operand:SI 2 "immediate_operand" "i")))]
1274: ""
1275: "cvtw.l %1,%0\;shf #%n2,%0"
1276: [(set_attr "type" "shfl")])
1277:
1278: ;; DImode
1279: ;; Logical left, 1-cycle
1280:
1281: (define_insn ""
1282: [(set (match_operand:DI 0 "register_operand" "=d")
1283: (lshift:DI (match_operand:DI 1 "register_operand" "0")
1284: (const_int 1)))]
1285: ""
1286: "add.l %0,%0")
1287:
1288: ;; Logical left, general
1289:
1290: (define_insn "lshldi3"
1291: [(set (match_operand:DI 0 "register_operand" "=d")
1292: (lshift:DI (match_operand:DI 1 "register_operand" "0")
1293: (match_operand:SI 2 "nonmemory_operand" "di")))]
1294: ""
1295: "shf %2,%0"
1296: [(set_attr "type" "shfl")])
1297:
1298: ;; Arithmetic left, 1-cycle
1299:
1300: (define_insn ""
1301: [(set (match_operand:DI 0 "register_operand" "=d")
1302: (ashift:DI (match_operand:DI 1 "register_operand" "0")
1303: (const_int 1)))]
1304: ""
1305: "add.l %0,%0")
1306:
1307: ;; Arithmetic left, general
1308:
1309: (define_insn "ashldi3"
1310: [(set (match_operand:DI 0 "register_operand" "=d")
1311: (ashift:DI (match_operand:DI 1 "register_operand" "0")
1312: (match_operand:SI 2 "nonmemory_operand" "di")))]
1313: ""
1314: "shf %2,%0"
1315: [(set_attr "type" "shfl")])
1316:
1317: ;; Can omit zero- or sign-extend if shift is 32 or more.
1318:
1319: (define_insn ""
1320: [(set (match_operand:DI 0 "register_operand" "=d")
1321: (ashift:DI (zero_extend:DI (match_operand:SI 1 "register_operand" "0"))
1322: (match_operand:SI 2 "const_int_operand" "i")))]
1323: "INTVAL (operands[2]) >= 32"
1324: "shf %2,%0"
1325: [(set_attr "type" "shfl")])
1326:
1327: (define_insn ""
1328: [(set (match_operand:DI 0 "register_operand" "=d")
1329: (ashift:DI (sign_extend:DI (match_operand:SI 1 "register_operand" "0"))
1330: (match_operand:SI 2 "const_int_operand" "i")))]
1331: "INTVAL (operands[2]) >= 32"
1332: "shf %2,%0"
1333: [(set_attr "type" "shfl")])
1334:
1335: ;; Logical right, general
1336:
1337: (define_expand "lshrdi3"
1338: [(set (match_operand:DI 0 "register_operand" "")
1339: (lshiftrt:DI (match_operand:DI 1 "register_operand" "")
1340: (neg:SI (match_operand:SI 2 "nonmemory_operand" ""))))]
1341: ""
1342: "operands[2] = negate_rtx (SImode, operands[2]);")
1343:
1344: (define_insn ""
1345: [(set (match_operand:DI 0 "register_operand" "=d")
1346: (lshiftrt:DI (match_operand:DI 1 "register_operand" "0")
1347: (neg:SI (match_operand:SI 2 "nonmemory_operand" "di"))))]
1348: ""
1349: "shf %2,%0"
1350: [(set_attr "type" "shfl")])
1351:
1352: (define_insn ""
1353: [(set (match_operand:DI 0 "register_operand" "=d")
1354: (lshiftrt:DI (match_operand:DI 1 "register_operand" "0")
1355: (match_operand:SI 2 "immediate_operand" "i")))]
1356: ""
1357: "shf #%n2,%0"
1358: [(set_attr "type" "shfl")])
1359:
1360: ;; Arithmetic right, general
1361: ;; Use
1362: ;; ((a >> b) ^ signbit) - signbit
1363: ;; where signbit is (1 << 63) >> b
1364: ;; Works for 0..63. Does not work for 64; unfortunate but legal.
1365:
1366: (define_expand "ashrdi3"
1367: [(set (match_operand:DI 0 "register_operand" "")
1368: (lshiftrt:DI (match_operand:DI 1 "register_operand" "")
1369: (neg:SI (match_operand:SI 2 "nonmemory_operand" ""))))
1370: (set (match_dup 3) (lshiftrt:DI (match_dup 3) (neg:SI (match_dup 2))))
1371: (set (match_dup 0) (xor:DI (match_dup 0) (match_dup 3)))
1372: (set (match_dup 0) (minus:DI (match_dup 0) (match_dup 3)))]
1373: ""
1374: "
1375: {
1376: if (GET_CODE (operands[2]) == CONST_INT)
1377: switch (INTVAL (operands[2]))
1378: {
1379: case 32:
1380: emit_insn (gen_ashrdi3_32 (operands[0], operands[1]));
1381: DONE;
1382: }
1383:
1384: operands[2] = negate_rtx (SImode, operands[2]);
1385: operands[3] = force_reg (DImode, immed_double_const (0, 1 << 31, DImode));
1386: }")
1387:
1388: ;; Arithmetic right 32, a common case that can save a couple of insns.
1389:
1390: (define_expand "ashrdi3_32"
1391: [(set (match_operand:DI 0 "register_operand" "")
1392: (lshiftrt:DI (match_operand:DI 1 "register_operand" "")
1393: (const_int 32)))
1394: (set (match_dup 0)
1395: (sign_extend:DI (subreg:SI (match_dup 0) 0)))]
1396: ""
1397: "")
1398:
1399: ;; __builtin instructions
1400:
1401: (define_insn "sqrtdf2"
1402: [(set (match_operand:DF 0 "register_operand" "=d")
1403: (sqrt:DF (match_operand:DF 1 "register_operand" "0")))]
1404: "! TARGET_C1 && flag_fast_math"
1405: "sqrt.d %0"
1406: [(set_attr "type" "divd")])
1407:
1408: (define_insn "sqrtsf2"
1409: [(set (match_operand:SF 0 "register_operand" "=d")
1410: (sqrt:SF (match_operand:SF 1 "register_operand" "0")))]
1411: "! TARGET_C1 && flag_fast_math"
1412: "sqrt.s %0"
1413: [(set_attr "type" "divs")])
1414:
1415: (define_insn "sindf2"
1416: [(set (match_operand:DF 0 "register_operand" "=d")
1417: (unspec:DF [(match_operand:DF 1 "register_operand" "0")] 1))]
1418: "! TARGET_C1 && flag_fast_math"
1419: "sin.d %0")
1420:
1421: (define_insn "sinsf2"
1422: [(set (match_operand:SF 0 "register_operand" "=d")
1423: (unspec:SF [(match_operand:SF 1 "register_operand" "0")] 1))]
1424: "! TARGET_C1 && flag_fast_math"
1425: "sin.s %0")
1426:
1427: (define_insn "cosdf2"
1428: [(set (match_operand:DF 0 "register_operand" "=d")
1429: (unspec:DF [(match_operand:DF 1 "register_operand" "0")] 2))]
1430: "! TARGET_C1 && flag_fast_math"
1431: "cos.d %0")
1432:
1433: (define_insn "cossf2"
1434: [(set (match_operand:SF 0 "register_operand" "=d")
1435: (unspec:SF [(match_operand:SF 1 "register_operand" "0")] 2))]
1436: "! TARGET_C1 && flag_fast_math"
1437: "cos.s %0")
1438:
1439: (define_insn "ftruncdf2"
1440: [(set (match_operand:DF 0 "register_operand" "=d")
1441: (fix:DF (match_operand:DF 1 "register_operand" "d")))]
1442: "! TARGET_C1"
1443: "frint.d %1,%0"
1444: [(set_attr "type" "cvtd")])
1445:
1446: (define_insn "ftruncsf2"
1447: [(set (match_operand:SF 0 "register_operand" "=d")
1448: (fix:SF (match_operand:SF 1 "register_operand" "d")))]
1449: "! TARGET_C1"
1450: "frint.s %1,%0"
1451: [(set_attr "type" "cvts")])
1452:
1453: (define_insn ""
1454: [(set (match_operand:SI 0 "register_operand" "=d")
1455: (minus:SI (ffs:SI (match_operand:SI 1 "register_operand" "d"))
1456: (const_int 1)))]
1457: ""
1458: "tzc %1,%0\;le.w #32,%0\;jbrs.f L0%=\;ld.w #-1,%0\\nL0%=:")
1459:
1460: (define_expand "ffssi2"
1461: [(set (match_operand:SI 0 "register_operand" "=d")
1462: (minus:SI (ffs:SI (match_operand:SI 1 "register_operand" "d"))
1463: (const_int 1)))
1464: (set (match_dup 0)
1465: (plus:SI (match_dup 0)
1466: (const_int 1)))]
1467: ""
1468: "")
1469:
1470: (define_insn "abssf2"
1471: [(set (match_operand:SF 0 "register_operand" "=d")
1472: (abs:SF (match_operand:SF 1 "register_operand" "0")))]
1473: ""
1474: "and #0x7fffffff,%0")
1475:
1476: (define_expand "absdf2"
1477: [(set (subreg:DI (match_operand:DF 0 "register_operand" "=d") 0)
1478: (and:DI (subreg:DI (match_operand:DF 1 "register_operand" "d") 0)
1479: (match_dup 2)))]
1480: ""
1481: "operands[2] = force_reg (DImode,
1482: immed_double_const (-1, 0x7fffffff, DImode));")
1483:
1484: ;;- Compares
1485:
1486: (define_insn "cmpdi"
1487: [(set (cc0)
1488: (compare (match_operand:DI 0 "register_operand" "d")
1489: (match_operand:DI 1 "register_operand" "d")))]
1490: ""
1491: "* return output_cmp (operands[0], operands[1], 'l');")
1492:
1493: (define_insn ""
1494: [(set (cc0) (match_operand:DI 0 "register_operand" "d"))
1495: (clobber (match_scratch:DI 1 "=d"))]
1496: "next_insn_tests_no_inequality (insn)"
1497: "* return output_cmp (operands[0], operands[1], 'L');")
1498:
1499: (define_insn "cmpsi"
1500: [(set (cc0)
1501: (compare (match_operand:SI 0 "register_operand" "d,a")
1502: (match_operand:SI 1 "nonmemory_operand" "di,ai")))]
1503: ""
1504: "* return output_cmp (operands[0], operands[1], 'w');")
1505:
1506: (define_insn "cmphi"
1507: [(set (cc0)
1508: (compare (match_operand:HI 0 "register_operand" "d,a")
1509: (match_operand:HI 1 "nonmemory_operand" "di,ai")))]
1510: ""
1511: "* return output_cmp (operands[0], operands[1], 'h');")
1512:
1513: ; cmpqi is intentionally omitted.
1514: ;
1515: ; gcc will sign-extend or zero-extend the operands to the next
1516: ; wider mode, HImode.
1517: ;
1518: ; For reg .cmp. constant, we just go with the halfword immediate
1519: ; instruction. Perhaps the widening insn can be cse'd or combined away.
1520: ; If not, we're still as good as loading a byte constant into a register
1521: ; to do a reg-reg byte compare.
1522: ;
1523: ; The following patterns pick up cases that can use reg .cmp. reg after all.
1524:
1525: (define_insn ""
1526: [(set (cc0)
1527: (compare
1528: (sign_extend:HI (match_operand:QI 0 "register_operand" "d"))
1529: (sign_extend:HI (match_operand:QI 1 "register_operand" "d"))))]
1530: ""
1531: "* return output_cmp (operands[0], operands[1], 'b');")
1532:
1533: (define_insn ""
1534: [(set (cc0)
1535: (compare
1536: (ashift:HI (subreg:HI (match_operand:QI 0 "register_operand" "d") 0)
1537: (const_int 8))
1538: (ashift:HI (subreg:HI (match_operand:QI 1 "register_operand" "d") 0)
1539: (const_int 8))))]
1540: ""
1541: "* return output_cmp (operands[0], operands[1], 'b');")
1542:
1543: (define_insn ""
1544: [(set (cc0)
1545: (compare (match_operand:QI 0 "register_operand" "d")
1546: (match_operand:QI 1 "register_operand" "d")))]
1547: ""
1548: "* return output_cmp (operands[0], operands[1], 'b');")
1549:
1550: (define_insn ""
1551: [(set (cc0) (match_operand:QI 0 "register_operand" "d,a"))
1552: (clobber (match_scratch:QI 1 "=d,a"))]
1553: "next_insn_tests_no_inequality (insn)"
1554: "* return output_cmp (operands[0], operands[1], 'B');")
1555:
1556: (define_insn ""
1557: [(set (cc0) (subreg (match_operand:QI 0 "register_operand" "d,a") 0))
1558: (clobber (match_scratch:QI 1 "=d,a"))]
1559: "next_insn_tests_no_inequality (insn)"
1560: "* return output_cmp (operands[0], operands[1], 'B');")
1561:
1562: (define_insn ""
1563: [(set (cc0)
1564: (zero_extend (subreg (match_operand:QI 0 "register_operand" "d,a") 0)))
1565: (clobber (match_scratch:QI 1 "=d,a"))]
1566: "next_insn_tests_no_inequality (insn)"
1567: "* return output_cmp (operands[0], operands[1], 'B');")
1568:
1569: (define_insn "cmpdf"
1570: [(set (cc0)
1571: (compare (match_operand:DF 0 "register_operand" "d")
1572: (match_operand:DF 1 "register_operand" "d")))]
1573: ""
1574: "* return output_cmp (operands[0], operands[1], 'd');")
1575:
1576: (define_insn "cmpsf"
1577: [(set (cc0)
1578: (compare (match_operand:SF 0 "register_operand" "d")
1579: (match_operand:SF 1 "nonmemory_cmpsf_operand" "dF")))]
1580: ""
1581: "* return output_cmp (operands[0], operands[1], 's');")
1582:
1583: ;; decrement-and-set-cc0 insns.
1584: ;;
1585: ;; The most important case where we can use the carry bit from an
1586: ;; arithmetic insn to eliminate a redundant compare is the decrement in
1587: ;; constructs like while (n--) and while (--n >= 0).
1588: ;;
1589: ;; We do it with combine patterns instead of NOTICE_UPDATE_CC because
1590: ;; the decrement needs to be kept at the end of the block during scheduling.
1591: ;;
1592: ;; These patterns must have memory alternatives because reload refuses
1593: ;; to do output reloads for an insn that sets cc0 (since it does not
1594: ;; want to clobber cc0 with its moves). Convex moves do not clobber
1595: ;; cc0, but there is no evident way to get reload to know that.
1596:
1597: (define_insn ""
1598: [(set (cc0)
1599: (match_operand:SI 0 "register_operand" "+r,*m"))
1600: (set (match_dup 0)
1601: (plus:SI (match_dup 0)
1602: (const_int -1)))]
1603: "next_insn_tests_no_inequality (insn)"
1604: "*
1605: {
1606: if (which_alternative == 0)
1607: {
1608: output_cmp (operands[0], constm1_rtx, 'W');
1609: return \"add.w #-1,%0\";
1610: }
1611: else
1612: {
1613: output_cmp (gen_rtx (REG, SImode, 7), constm1_rtx, 'W');
1614: return \"psh.w s7\;ld.w %0,s7\;add.w #-1,s7\;st.w s7,%0\;pop.w s7\";
1615: }
1616: }")
1617:
1618: (define_insn ""
1619: [(set (cc0)
1620: (plus:SI (match_operand:SI 0 "register_operand" "+r,*m")
1621: (const_int -1)))
1622: (set (match_dup 0)
1623: (plus:SI (match_dup 0)
1624: (const_int -1)))]
1625: "find_reg_note (next_cc0_user (insn), REG_NONNEG, 0)"
1626: "*
1627: {
1628: if (which_alternative == 0)
1629: {
1630: output_cmp (operands[0], const0_rtx, 'W');
1631: return \"add.w #-1,%0\";
1632: }
1633: else
1634: {
1635: output_cmp (gen_rtx (REG, SImode, 7), const0_rtx, 'W');
1636: return \"psh.w s7\;ld.w %0,s7\;add.w #-1,s7\;st.w s7,%0\;pop.w s7\";
1637: }
1638: }")
1639:
1640: (define_insn ""
1641: [(set (cc0)
1642: (match_operand:HI 0 "register_operand" "+r,*m"))
1643: (set (match_dup 0)
1644: (plus:HI (match_dup 0)
1645: (const_int -1)))]
1646: "next_insn_tests_no_inequality (insn)"
1647: "*
1648: {
1649: if (which_alternative == 0)
1650: {
1651: output_cmp (operands[0], constm1_rtx, 'W');
1652: return \"add.w #-1,%0\";
1653: }
1654: else
1655: {
1656: output_cmp (gen_rtx (REG, HImode, 7), constm1_rtx, 'W');
1657: return \"psh.w s7\;ld.h %0,s7\;add.h #-1,s7\;st.h s7,%0\;pop.w s7\";
1658: }
1659: }")
1660:
1661: (define_insn ""
1662: [(set (cc0)
1663: (plus:HI (match_operand:HI 0 "register_operand" "+r,*m")
1664: (const_int -1)))
1665: (set (match_dup 0)
1666: (plus:HI (match_dup 0)
1667: (const_int -1)))]
1668: "find_reg_note (next_cc0_user (insn), REG_NONNEG, 0)"
1669: "*
1670: {
1671: if (which_alternative == 0)
1672: {
1673: output_cmp (operands[0], const0_rtx, 'W');
1674: return \"add.w #-1,%0\";
1675: }
1676: else
1677: {
1678: output_cmp (gen_rtx (REG, HImode, 7), const0_rtx, 'W');
1679: return \"psh.w s7\;ld.h %0,s7\;add.h #-1,s7\;st.h s7,%0\;pop.w s7\";
1680: }
1681: }")
1682:
1683: ;;- Jumps
1684:
1685: (define_insn "jump"
1686: [(set (pc)
1687: (label_ref (match_operand 0 "" "")))]
1688: ""
1689: "jbr %l0")
1690:
1691: (define_insn "beq"
1692: [(set (pc)
1693: (if_then_else (eq (cc0)
1694: (const_int 0))
1695: (label_ref (match_operand 0 "" ""))
1696: (pc)))]
1697: ""
1698: "* return output_condjump (operands[0], \"eq\", 't'); ")
1699:
1700: (define_insn "bne"
1701: [(set (pc)
1702: (if_then_else (ne (cc0)
1703: (const_int 0))
1704: (label_ref (match_operand 0 "" ""))
1705: (pc)))]
1706: ""
1707: "* return output_condjump (operands[0], \"eq\", 'f'); ")
1708:
1709: (define_insn "bgt"
1710: [(set (pc)
1711: (if_then_else (gt (cc0)
1712: (const_int 0))
1713: (label_ref (match_operand 0 "" ""))
1714: (pc)))]
1715: ""
1716: "* return output_condjump (operands[0], \"le\", 'f'); ")
1717:
1718: (define_insn "bgtu"
1719: [(set (pc)
1720: (if_then_else (gtu (cc0)
1721: (const_int 0))
1722: (label_ref (match_operand 0 "" ""))
1723: (pc)))]
1724: ""
1725: "* return output_condjump (operands[0], \"leu\", 'f'); ")
1726:
1727: (define_insn "blt"
1728: [(set (pc)
1729: (if_then_else (lt (cc0)
1730: (const_int 0))
1731: (label_ref (match_operand 0 "" ""))
1732: (pc)))]
1733: ""
1734: "* return output_condjump (operands[0], \"lt\", 't'); ")
1735:
1736: (define_insn "bltu"
1737: [(set (pc)
1738: (if_then_else (ltu (cc0)
1739: (const_int 0))
1740: (label_ref (match_operand 0 "" ""))
1741: (pc)))]
1742: ""
1743: "* return output_condjump (operands[0], \"ltu\", 't'); ")
1744:
1745: (define_insn "bge"
1746: [(set (pc)
1747: (if_then_else (ge (cc0)
1748: (const_int 0))
1749: (label_ref (match_operand 0 "" ""))
1750: (pc)))]
1751: ""
1752: "* return output_condjump (operands[0], \"lt\", 'f'); ")
1753:
1754: (define_insn "bgeu"
1755: [(set (pc)
1756: (if_then_else (geu (cc0)
1757: (const_int 0))
1758: (label_ref (match_operand 0 "" ""))
1759: (pc)))]
1760: ""
1761: "* return output_condjump (operands[0], \"ltu\", 'f'); ")
1762:
1763: (define_insn "ble"
1764: [(set (pc)
1765: (if_then_else (le (cc0)
1766: (const_int 0))
1767: (label_ref (match_operand 0 "" ""))
1768: (pc)))]
1769: ""
1770: "* return output_condjump (operands[0], \"le\", 't'); ")
1771:
1772: (define_insn "bleu"
1773: [(set (pc)
1774: (if_then_else (leu (cc0)
1775: (const_int 0))
1776: (label_ref (match_operand 0 "" ""))
1777: (pc)))]
1778: ""
1779: "* return output_condjump (operands[0], \"leu\", 't'); ")
1780:
1781: (define_insn ""
1782: [(set (pc)
1783: (if_then_else (eq (cc0)
1784: (const_int 0))
1785: (pc)
1786: (label_ref (match_operand 0 "" ""))))]
1787: ""
1788: "* return output_condjump (operands[0], \"eq\", 'f'); ")
1789:
1790: (define_insn ""
1791: [(set (pc)
1792: (if_then_else (ne (cc0)
1793: (const_int 0))
1794: (pc)
1795: (label_ref (match_operand 0 "" ""))))]
1796: ""
1797: "* return output_condjump (operands[0], \"eq\", 't'); ")
1798:
1799: (define_insn ""
1800: [(set (pc)
1801: (if_then_else (gt (cc0)
1802: (const_int 0))
1803: (pc)
1804: (label_ref (match_operand 0 "" ""))))]
1805: ""
1806: "* return output_condjump (operands[0], \"le\", 't'); ")
1807:
1808: (define_insn ""
1809: [(set (pc)
1810: (if_then_else (gtu (cc0)
1811: (const_int 0))
1812: (pc)
1813: (label_ref (match_operand 0 "" ""))))]
1814: ""
1815: "* return output_condjump (operands[0], \"leu\", 't'); ")
1816:
1817: (define_insn ""
1818: [(set (pc)
1819: (if_then_else (lt (cc0)
1820: (const_int 0))
1821: (pc)
1822: (label_ref (match_operand 0 "" ""))))]
1823: ""
1824: "* return output_condjump (operands[0], \"lt\", 'f'); ")
1825:
1826: (define_insn ""
1827: [(set (pc)
1828: (if_then_else (ltu (cc0)
1829: (const_int 0))
1830: (pc)
1831: (label_ref (match_operand 0 "" ""))))]
1832: ""
1833: "* return output_condjump (operands[0], \"ltu\", 'f'); ")
1834:
1835: (define_insn ""
1836: [(set (pc)
1837: (if_then_else (ge (cc0)
1838: (const_int 0))
1839: (pc)
1840: (label_ref (match_operand 0 "" ""))))]
1841: ""
1842: "* return output_condjump (operands[0], \"lt\", 't'); ")
1843:
1844: (define_insn ""
1845: [(set (pc)
1846: (if_then_else (geu (cc0)
1847: (const_int 0))
1848: (pc)
1849: (label_ref (match_operand 0 "" ""))))]
1850: ""
1851: "* return output_condjump (operands[0], \"ltu\", 't'); ")
1852:
1853: (define_insn ""
1854: [(set (pc)
1855: (if_then_else (le (cc0)
1856: (const_int 0))
1857: (pc)
1858: (label_ref (match_operand 0 "" ""))))]
1859: ""
1860: "* return output_condjump (operands[0], \"le\", 'f'); ")
1861:
1862: (define_insn ""
1863: [(set (pc)
1864: (if_then_else (leu (cc0)
1865: (const_int 0))
1866: (pc)
1867: (label_ref (match_operand 0 "" ""))))]
1868: ""
1869: "* return output_condjump (operands[0], \"leu\", 'f'); ")
1870:
1871: ;;- Calls
1872:
1873: (define_expand "call_pop"
1874: [(parallel [(call (match_operand:QI 0 "memory_operand" "m")
1875: (match_operand:SI 1 "const_int_operand" "i"))
1876: (match_operand:SI 2 "const_int_operand" "i")
1877: (match_operand:SI 3 "const_int_operand" "i")
1878: (reg:SI 8)])]
1879: ""
1880: "")
1881:
1882: (define_insn ""
1883: [(call (match_operand:QI 0 "memory_operand" "m")
1884: (match_operand:SI 1 "const_int_operand" "i"))
1885: (match_operand:SI 2 "const_int_operand" "i")
1886: (match_operand:SI 3 "const_int_operand" "i")
1887: (match_operand:SI 4 "" "")]
1888: ""
1889: "* return output_call (insn, &operands[0]);")
1890:
1891: (define_expand "call_value_pop"
1892: [(parallel [(set (match_operand 0 "" "=g")
1893: (call (match_operand:QI 1 "memory_operand" "m")
1894: (match_operand:SI 2 "const_int_operand" "i")))
1895: (match_operand:SI 3 "const_int_operand" "i")
1896: (match_operand:SI 4 "const_int_operand" "i")
1897: (reg:SI 8)])]
1898: ""
1899: "")
1900:
1901: (define_insn ""
1902: [(set (match_operand 0 "" "=g")
1903: (call (match_operand:QI 1 "memory_operand" "m")
1904: (match_operand:SI 2 "const_int_operand" "i")))
1905: (match_operand:SI 3 "const_int_operand" "i")
1906: (match_operand:SI 4 "const_int_operand" "i")
1907: (match_operand:SI 5 "" "")]
1908: ""
1909: "* return output_call (insn, &operands[1]); ")
1910:
1911: ;; Call subroutine returning any type.
1912:
1913: (define_expand "untyped_call"
1914: [(parallel [(call (match_operand 0 "" "")
1915: (const_int 0))
1916: (match_operand 1 "" "")
1917: (match_operand 2 "" "")])]
1918: ""
1919: "
1920: {
1921: int i;
1922:
1923: emit_call_insn (gen_call_pop (operands[0], const0_rtx,
1924: const0_rtx, const0_rtx));
1925:
1926: for (i = 0; i < XVECLEN (operands[2], 0); i++)
1927: {
1928: rtx set = XVECEXP (operands[2], 0, i);
1929: emit_move_insn (SET_DEST (set), SET_SRC (set));
1930: }
1931:
1932: /* The optimizer does not know that the call sets the function value
1933: registers we stored in the result block. We avoid problems by
1934: claiming that all hard registers are used and clobbered at this
1935: point. */
1936: emit_insn (gen_blockage ());
1937:
1938: DONE;
1939: }")
1940:
1941: ;; UNSPEC_VOLATILE is considered to use and clobber all hard registers and
1942: ;; all of memory. This blocks insns from being moved across this point.
1943:
1944: (define_insn "blockage"
1945: [(unspec_volatile [(const_int 0)] 0)]
1946: ""
1947: "")
1948:
1949: (define_expand "return"
1950: [(return)]
1951: ""
1952: " replace_arg_pushes (); ")
1953:
1954: (define_insn ""
1955: [(return)]
1956: ""
1957: "rtn")
1958:
1959: (define_expand "prologue"
1960: [(const_int 0)]
1961: ""
1962: "
1963: {
1964: emit_ap_optimizations ();
1965: DONE;
1966: }")
1967:
1968: (define_insn "tablejump"
1969: [(set (pc) (match_operand:SI 0 "address_operand" "p"))
1970: (use (label_ref (match_operand 1 "" "")))]
1971: ""
1972: "jmp %a0")
1973:
1974: (define_insn "indirect_jump"
1975: [(set (pc) (match_operand:SI 0 "address_operand" "p"))]
1976: ""
1977: "jmp %a0")
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.