|
|
1.1 root 1: ;;- Machine description for AMD Am29000 for GNU C compiler
2: ;; Copyright (C) 1991, 1992 Free Software Foundation, Inc.
3: ;; Contributed by Richard Kenner ([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: ;; The insns in this file are presented in the same order as the AMD 29000
24: ;; User's Manual (i.e., alphabetical by machine op-code).
25: ;;
26: ;; DEFINE_EXPAND's are located near the first occurrence of the major insn
27: ;; that they generate.
28:
29: ;; The only attribute we have is the type. We only care about calls, branches,
30: ;; loads, stores, floating-point operations, and multi-word insns.
31: ;; Everything else is miscellaneous.
32:
33: (define_attr "type"
34: "call,branch,load,store,fadd,fmul,fam,fdiv,fsqrt,dmul,dam,ddiv,dsqrt,multi,misc"
35: (const_string "misc"))
36:
37: ;; ASM insns cannot go into a delay slot, so call them "multi".
38: (define_asm_attributes [(set_attr "type" "multi")])
39:
40: (define_attr "in_delay_slot" "yes,no"
41: (if_then_else (eq_attr "type" "call,branch,multi") (const_string "no")
42: (const_string "yes")))
43:
44: ;; Branch and call insns require a single delay slot. Annulling is not
45: ;; supported.
46: (define_delay (eq_attr "type" "call,branch")
47: [(eq_attr "in_delay_slot" "yes") (nil) (nil)])
48:
49: ;; Define the function unit usages. We first define memory as a unit.
50: (define_function_unit "memory" 1 0 (eq_attr "type" "load") 6 5
51: [(eq_attr "type" "load")])
52: (define_function_unit "memory" 1 0 (eq_attr "type" "load") 6 6
53: [(eq_attr "type" "store")])
54: (define_function_unit "memory" 1 0 (eq_attr "type" "store") 1 0)
55:
56: ;; Now define the function units for the floating-point support. Most
57: ;; units are pipelined and can accept an input every cycle.
58: ;;
59: ;; Note that we have an inaccuracy here. If a fmac insn is issued, followed
60: ;; 2 cycles later by a fadd, there will be a conflict for the floating
61: ;; adder that we can't represent. Also, all insns will conflict for the
62: ;; floating-point rounder. It isn't clear how to represent this.
63:
64: (define_function_unit "multiplier" 1 0 (eq_attr "type" "fmul") 3 0)
65: (define_function_unit "multiplier" 1 0 (eq_attr "type" "dmul") 6 4)
66: (define_function_unit "multiplier" 1 0 (eq_attr "type" "fam") 6 0)
67: (define_function_unit "multiplier" 1 0 (eq_attr "type" "dam") 9 4)
68:
69: (define_function_unit "adder" 1 0 (eq_attr "type" "fadd,fam,dam") 3 0)
70:
71: (define_function_unit "divider" 1 0 (eq_attr "type" "fdiv") 11 10)
72: (define_function_unit "divider" 1 0 (eq_attr "type" "fsqrt") 28 27)
73: (define_function_unit "divider" 1 0 (eq_attr "type" "ddiv") 18 17)
74: (define_function_unit "divider" 1 0 (eq_attr "type" "dsqrt") 57 56)
75:
76: ;; ADD
77: (define_insn "addsi3"
78: [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
79: (plus:SI (match_operand:SI 1 "gpc_reg_operand" "%r,r")
80: (match_operand:SI 2 "add_operand" "rI,N")))]
81: ""
82: "@
83: add %0,%1,%2
84: sub %0,%1,%n2")
85:
86: (define_insn "adddi3"
87: [(set (match_operand:DI 0 "gpc_reg_operand" "=r")
88: (plus:DI (match_operand:DI 1 "gpc_reg_operand" "%r")
89: (match_operand:DI 2 "gpc_reg_operand" "r")))]
90: ""
91: "add %L0,%L1,%L2\;addc %0,%1,%2"
92: [(set_attr "type" "multi")])
93:
94: ;; AND/ANDN
95: (define_insn "andsi3"
96: [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
97: (and:SI (match_operand:SI 1 "gpc_reg_operand" "%r,r")
98: (match_operand:SI 2 "and_operand" "rI,K")))]
99: ""
100: "@
101: and %0,%1,%2
102: andn %0,%1,%C2")
103:
104: (define_insn ""
105: [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
106: (and:SI (not:SI (match_operand:SI 1 "srcb_operand" "rI"))
107: (match_operand:SI 2 "gpc_reg_operand" "r")))]
108: ""
109: "andn %0,%2,%1")
110:
111:
112: ;; CALLI
113: ;;
114: ;; Start with a subroutine to write out CLOBBERs starting at lr2 up to,
115: ;; but not including, the next parameter register. If operand[0] is null,
116: ;; it means that all the argument registers have been used.
117: (define_expand "clobbers_to"
118: [(clobber (match_operand:SI 0 "" ""))]
119: ""
120: "
121: {
122: int i;
123: int high_regno;
124:
125: if (operands[0] == 0)
126: high_regno = R_LR (18);
127: else if (GET_CODE (operands[0]) != REG || REGNO (operands[0]) < R_LR (0)
128: || REGNO (operands[0]) > R_LR (18))
129: abort ();
130: else
131: high_regno = REGNO (operands[0]);
132:
133: for (i = R_LR (2); i < high_regno; i++)
134: emit_insn (gen_rtx (CLOBBER, VOIDmode, gen_rtx (REG, SImode, i)));
135:
136: DONE;
137: }")
138:
139: ;; We indicate that LR0 is clobbered in the CALL_INSN itself. Otherwise,
140: ;; reorg will think it is just clobbered by the called function.
141:
142: (define_expand "call"
143: [(parallel [(call (match_operand:SI 0 "" "")
144: (match_operand 1 "" ""))
145: (clobber (scratch:SI))])
146: (match_operand 2 "" "")]
147: ""
148: "
149: {
150: if (GET_CODE (operands[0]) != MEM)
151: abort ();
152:
153: /* We tell here whether this is a recursive call, since this insn may
154: later be inlined into another function. */
155: if (! TARGET_SMALL_MEMORY
156: && GET_CODE (XEXP (operands[0], 0)) == SYMBOL_REF)
157: operands[0] = gen_rtx (MEM, SImode,
158: force_reg (Pmode, XEXP (operands[0], 0)));
159:
160: operands[2] = gen_clobbers_to (operands[2]);
161: }")
162:
163: (define_expand "call_value"
164: [(parallel [(set (match_operand:SI 0 "gpc_reg_operand" "")
165: (call (match_operand:SI 1 "" "")
166: (match_operand 2 "" "")))
167: (clobber (scratch:SI))])
168: (match_operand 3 "" "")]
169: ""
170: "
171: {
172: if (GET_CODE (operands[1]) != MEM)
173: abort ();
174:
175: /* We tell here whether this is a recursive call, since this insn may
176: later be inlined into another function. */
177: if (! TARGET_SMALL_MEMORY
178: && GET_CODE (XEXP (operands[1], 0)) == SYMBOL_REF)
179: operands[1] = gen_rtx (MEM, SImode,
180: force_reg (Pmode, XEXP (operands[1], 0)));
181:
182: operands[3] = gen_clobbers_to (operands[3]);
183: }")
184:
185: (define_insn ""
186: [(call (match_operand:SI 0 "memory_operand" "m")
187: (match_operand 1 "" ""))
188: (clobber (match_scratch:SI 2 "=&l"))]
189: "GET_CODE (XEXP (operands[0], 0)) != CONST_INT"
190: "calli lr0,%0%#"
191: [(set_attr "type" "call")])
192:
193: (define_insn ""
194: [(call (mem:SI (match_operand:SI 0 "call_operand" "i"))
195: (match_operand:SI 1 "general_operand" "g"))
196: (clobber (match_scratch:SI 2 "=&l"))]
197: ""
198: "call lr0,%F0"
199: [(set_attr "type" "call")])
200:
201: (define_insn ""
202: [(set (match_operand 0 "gpc_reg_operand" "=r")
203: (call (match_operand:SI 1 "memory_operand" "m")
204: (match_operand 2 "" "")))
205: (clobber (match_scratch:SI 3 "=&l"))]
206: "GET_CODE (XEXP (operands[1], 0)) != CONST_INT"
207: "calli lr0,%1%#"
208: [(set_attr "type" "call")])
209:
210: (define_insn ""
211: [(set (match_operand 0 "gpc_reg_operand" "=r")
212: (call (mem:SI (match_operand:SI 1 "call_operand" "i"))
213: (match_operand:SI 2 "general_operand" "g")))
214: (clobber (match_scratch:SI 3 "=&l"))]
215: ""
216: "call lr0,%F1"
217: [(set_attr "type" "call")])
218:
219: (define_expand "probe"
220: [(call (mem:SI (symbol_ref:SI "_msp_check"))
221: (const_int 1))]
222: "TARGET_STACK_CHECK"
223: "")
224:
225: ;; This is used for internal routine calls via TPC. Currently used only
226: ;; in probe, above.
227: (define_insn ""
228: [(call (mem:SI (match_operand:SI 0 "immediate_operand" "s"))
229: (const_int 1))]
230: ""
231: "call %*,%0"
232: [(set_attr "type" "call")])
233:
234: ;; CONST, CONSTH, CONSTN
235: ;;
236: ;; Many of these are generated from move insns.
237: (define_insn ""
238: [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
239: (and:SI (match_operand:SI 1 "immediate_operand" "i")
240: (const_int 65535)))]
241: ""
242: "const %0,%1")
243:
244: (define_insn ""
245: [(set (zero_extract:SI (match_operand:SI 0 "gpc_reg_operand" "+r")
246: (const_int 16)
247: (match_operand:SI 1 "const_0_operand" ""))
248: (ashiftrt:SI (match_operand:SI 2 "immediate_operand" "i")
249: (const_int 16)))]
250: ""
251: "consth %0,%2")
252:
253: (define_insn ""
254: [(set (zero_extract:SI (match_operand:SI 0 "gpc_reg_operand" "+r")
255: (const_int 16)
256: (match_operand:SI 1 "const_0_operand" ""))
257: (match_operand:SI 2 "cint_16_operand" "J"))]
258: ""
259: "consth %0,%m2")
260:
261: (define_insn ""
262: [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
263: (ior:SI (zero_extend:SI (match_operand:HI 1 "gpc_reg_operand" "0"))
264: (match_operand:SI 2 "const_int_operand" "n")))]
265: "(INTVAL (operands[2]) & 0xffff) == 0"
266: "consth %0,%2")
267:
268: (define_insn ""
269: [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
270: (ior:SI (zero_extend:SI (match_operand:HI 1 "gpc_reg_operand" "0"))
271: (and:SI (match_operand:SI 2 "immediate_operand" "i")
272: (const_int -65536))))]
273: ""
274: "consth %0,%2")
275:
276: ;; CONVERT
277: (define_insn "fix_truncsfsi2"
278: [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
279: (fix:SI (match_operand:SF 1 "register_operand" "r")))]
280: ""
281: "convert %0,%1,0,3,0,1")
282:
283: (define_insn "fix_truncdfsi2"
284: [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
285: (fix:SI (match_operand:DF 1 "register_operand" "r")))]
286: ""
287: "convert %0,%1,0,3,0,2")
288:
289: (define_insn "fixuns_truncsfsi2"
290: [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
291: (unsigned_fix:SI (match_operand:SF 1 "register_operand" "r")))]
292: ""
293: "convert %0,%1,1,3,0,1")
294:
295: (define_insn "fixuns_truncdfsi2"
296: [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
297: (unsigned_fix:SI (match_operand:DF 1 "register_operand" "r")))]
298: ""
299: "convert %0,%1,1,3,0,2")
300:
301: (define_insn "truncdfsf2"
302: [(set (match_operand:SF 0 "register_operand" "=r")
303: (float_truncate:SF (match_operand:DF 1 "register_operand" "r")))]
304: ""
305: "convert %0,%1,0,4,1,2")
306:
307: (define_insn "extendsfdf2"
308: [(set (match_operand:DF 0 "register_operand" "=r")
309: (float_extend:DF (match_operand:SF 1 "register_operand" "r")))]
310: ""
311: "convert %0,%1,0,4,2,1")
312:
313: (define_insn "floatsisf2"
314: [(set (match_operand:SF 0 "register_operand" "=r")
315: (float:SF (match_operand:SI 1 "gpc_reg_operand" "r")))]
316: ""
317: "convert %0,%1,0,4,1,0")
318:
319: (define_insn "floatsidf2"
320: [(set (match_operand:DF 0 "register_operand" "=r")
321: (float:DF (match_operand:SI 1 "gpc_reg_operand" "r")))]
322: ""
323: "convert %0,%1,0,4,2,0")
324:
325: (define_insn "floatunssisf2"
326: [(set (match_operand:SF 0 "register_operand" "=r")
327: (unsigned_float:SF (match_operand:SI 1 "gpc_reg_operand" "r")))]
328: ""
329: "convert %0,%1,1,4,1,0")
330:
331: (define_insn "floatunssidf2"
332: [(set (match_operand:DF 0 "register_operand" "=r")
333: (unsigned_float:DF (match_operand:SI 1 "gpc_reg_operand" "r")))]
334: ""
335: "convert %0,%1,1,4,2,0")
336:
337: ;; CPxxx, DEQ, DGT, DGE, FEQ, FGT, FGE
338: (define_insn ""
339: [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
340: (match_operator 3 "comparison_operator"
341: [(match_operand:SI 1 "gpc_reg_operand" "r")
342: (match_operand:SI 2 "srcb_operand" "rI")]))]
343: ""
344: "cp%J3 %0,%1,%2")
345:
346: (define_insn ""
347: [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
348: (match_operator 3 "fp_comparison_operator"
349: [(match_operand:SF 1 "register_operand" "r")
350: (match_operand:SF 2 "register_operand" "r")]))]
351: ""
352: "f%J3 %0,%1,%2"
353: [(set_attr "type" "fadd")])
354:
355: (define_insn ""
356: [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
357: (match_operator 3 "fp_comparison_operator"
358: [(match_operand:DF 1 "register_operand" "r")
359: (match_operand:DF 2 "register_operand" "r")]))]
360: ""
361: "d%J3 %0,%1,%2"
362: [(set_attr "type" "fadd")])
363:
364: ;; DADD
365: (define_expand "adddf3"
366: [(set (match_operand:DF 0 "register_operand" "")
367: (plus:DF (match_operand:DF 1 "register_operand" "")
368: (match_operand:DF 2 "register_operand" "")))]
369: ""
370: "")
371:
372: (define_insn ""
373: [(set (match_operand:DF 0 "register_operand" "=r")
374: (plus:DF (match_operand:DF 1 "register_operand" "%r")
375: (match_operand:DF 2 "register_operand" "r")))]
376: "! TARGET_29050 "
377: "dadd %0,%1,%2"
378: [(set_attr "type" "fadd")])
379:
380: (define_insn ""
381: [(set (match_operand:DF 0 "register_operand" "=r,a")
382: (plus:DF (match_operand:DF 1 "register_operand" "%r,r")
383: (match_operand:DF 2 "register_operand" "r,0")))]
384: "TARGET_29050"
385: "@
386: dadd %0,%1,%2
387: dmac 8,%0,%1,%1"
388: [(set_attr "type" "fadd,dam")])
389:
390: ;; DDIV
391: (define_insn "divdf3"
392: [(set (match_operand:DF 0 "register_operand" "=r")
393: (div:DF (match_operand:DF 1 "register_operand" "=r")
394: (match_operand:DF 2 "register_operand" "r")))]
395: ""
396: "ddiv %0,%1,%2"
397: [(set_attr "type" "ddiv")])
398:
399: ;; DIVIDE
400: ;;
401: ;; We must set Q to the sign extension of the dividend first. For MOD, we
402: ;; must get the remainder from Q.
403: ;;
404: ;; For divmod: operand 1 is divided by operand 2; quotient goes to operand
405: ;; 0 and remainder to operand 3.
406: (define_expand "divmodsi4"
407: [(set (match_dup 4)
408: (ashiftrt:SI (match_operand:SI 1 "gpc_reg_operand" "")
409: (const_int 31)))
410: (parallel [(set (match_operand:SI 0 "gpc_reg_operand" "")
411: (div:SI (match_dup 1)
412: (match_operand:SI 2 "gpc_reg_operand" "")))
413: (set (match_operand:SI 3 "gpc_reg_operand" "")
414: (mod:SI (match_dup 1)
415: (match_dup 2)))
416: (use (match_dup 4))])]
417: ""
418: "
419: {
420: operands[4] = gen_reg_rtx (SImode);
421: }")
422:
423: (define_insn ""
424: [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
425: (div:SI (match_operand:SI 1 "gpc_reg_operand" "r")
426: (match_operand:SI 2 "gpc_reg_operand" "r")))
427: (set (match_operand:SI 3 "register_operand" "=q")
428: (mod:SI (match_dup 1)
429: (match_dup 2)))
430: (use (match_operand:SI 4 "register_operand" "3"))]
431: ""
432: "divide %0,%1,%2")
433:
434: ;; DIVIDU
435: ;;
436: ;; Similar to DIVIDE.
437: (define_expand "udivmodsi4"
438: [(parallel [(set (match_operand:SI 0 "gpc_reg_operand" "")
439: (udiv:SI (match_operand:SI 1 "gpc_reg_operand" "")
440: (match_operand:SI 2 "gpc_reg_operand" "")))
441: (set (match_operand:SI 3 "gpc_reg_operand" "")
442: (umod:SI (match_dup 1)
443: (match_dup 2)))
444: (use (const_int 0))])]
445: ""
446: "")
447:
448: (define_insn ""
449: [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
450: (udiv:SI (match_operand:SI 1 "gpc_reg_operand" "r")
451: (match_operand:SI 2 "gpc_reg_operand" "r")))
452: (set (match_operand:SI 3 "register_operand" "=q")
453: (umod:SI (match_dup 1)
454: (match_dup 2)))
455: (use (match_operand:SI 4 "const_int_operand" "3"))]
456: ""
457: "dividu %0,%1,%2")
458:
459: ;; DMAC/DMSM
460: (define_insn ""
461: [(set (match_operand:DF 0 "register_operand" "=a,*r")
462: (plus:DF (mult:DF (match_operand:DF 1 "register_operand" "%r,A")
463: (match_operand:DF 2 "register_operand" "r,r"))
464: (match_operand:DF 3 "register_operand" "0,*r")))]
465: "TARGET_29050"
466: "@
467: dmac 0,%0,%1,%2
468: dmsm %0,%2,%3"
469: [(set_attr "type" "dam")])
470:
471: (define_insn ""
472: [(set (match_operand:DF 0 "register_operand" "=a")
473: (plus:DF (mult:DF (neg:DF (match_operand:DF 1 "register_operand" "r"))
474: (match_operand:DF 2 "register_operand" "r"))
475: (match_operand:DF 3 "register_operand" "0")))]
476: "TARGET_29050"
477: "dmac 1,%0,%2,%1"
478: [(set_attr "type" "dam")])
479:
480: (define_insn ""
481: [(set (match_operand:DF 0 "register_operand" "=a")
482: (minus:DF (mult:DF (match_operand:DF 1 "register_operand" "%r")
483: (match_operand:DF 2 "register_operand" "r"))
484: (match_operand:DF 3 "register_operand" "0")))]
485: "TARGET_29050"
486: "dmac 2,%0,%1,%2"
487: [(set_attr "type" "dam")])
488:
489: (define_insn ""
490: [(set (match_operand:DF 0 "register_operand" "=a")
491: (minus:DF (mult:DF (match_operand:DF 1 "register_operand" "r")
492: (neg:DF (match_operand:DF 2 "register_operand" "r")))
493: (match_operand:DF 3 "register_operand" "0")))]
494: "TARGET_29050"
495: "dmac 3,%0,%1,%2"
496: [(set_attr "type" "dam")])
497:
498: (define_insn ""
499: [(set (match_operand:DF 0 "register_operand" "=a")
500: (mult:DF (neg:DF (match_operand:DF 1 "register_operand" "r"))
501: (match_operand:DF 2 "register_operand" "r")))]
502: "TARGET_29050"
503: "dmac 5,%0,%2,%1"
504: [(set_attr "type" "dam")])
505:
506: (define_insn ""
507: [(set (match_operand:DF 0 "register_operand" "=a")
508: (minus:DF (neg:DF (match_operand:DF 1 "register_operand" "r"))
509: (match_operand:DF 2 "register_operand" "0")))]
510: "TARGET_29050"
511: "dmac 11,%0,%1,%1"
512: [(set_attr "type" "dam")])
513:
514: (define_insn ""
515: [(set (match_operand:DF 0 "register_operand" "=a")
516: (neg:DF (plus:DF (match_operand:DF 1 "register_operand" "%r")
517: (match_operand:DF 2 "register_operand" "0"))))]
518: "TARGET_29050"
519: "dmac 11,%0,%1,%1"
520: [(set_attr "type" "dam")])
521:
522: (define_insn ""
523: [(set (match_operand:DF 0 "register_operand" "=r,r,a")
524: (neg:DF (match_operand:DF 1 "register_operand" "0,r,r")))
525: (clobber (match_scratch:SI 2 "=&r,&r,X"))]
526: "TARGET_29050"
527: "@
528: cpeq %2,gr1,gr1\;xor %0,%1,%2
529: cpeq %2,gr1,gr1\;xor %0,%1,%2\;sll %L0,%L1,0
530: dmac 13,%0,%1,%1"
531: [(set_attr "type" "multi,multi,dam")])
532:
533: ;; DMUL
534: (define_expand "muldf3"
535: [(set (match_operand:DF 0 "register_operand" "")
536: (mult:DF (match_operand:DF 1 "register_operand" "")
537: (match_operand:DF 2 "register_operand" "")))]
538: ""
539: "")
540:
541: (define_insn ""
542: [(set (match_operand:DF 0 "register_operand" "=r")
543: (mult:DF (match_operand:DF 1 "register_operand" "%r")
544: (match_operand:DF 2 "register_operand" "r")))]
545: "! TARGET_29050"
546: "dmul %0,%1,%2"
547: [(set_attr "type" "dmul")])
548:
549: (define_insn ""
550: [(set (match_operand:DF 0 "register_operand" "=r,a")
551: (mult:DF (match_operand:DF 1 "register_operand" "%r,r")
552: (match_operand:DF 2 "register_operand" "r,r")))]
553: "TARGET_29050"
554: "@
555: dmul %0,%1,%2
556: dmac 4,%0,%1,%2"
557: [(set_attr "type" "dmul,dam")])
558:
559: ;; DSUB
560: (define_expand "subdf3"
561: [(set (match_operand:DF 0 "register_operand" "=r")
562: (minus:DF (match_operand:DF 1 "register_operand" "r")
563: (match_operand:DF 2 "register_operand" "r")))]
564: ""
565: "")
566:
567: (define_insn ""
568: [(set (match_operand:DF 0 "register_operand" "=r")
569: (minus:DF (match_operand:DF 1 "register_operand" "r")
570: (match_operand:DF 2 "register_operand" "r")))]
571: "! TARGET_29050"
572: "dsub %0,%1,%2"
573: [(set_attr "type" "fadd")])
574:
575: (define_insn ""
576: [(set (match_operand:DF 0 "register_operand" "=r,a,a")
577: (minus:DF (match_operand:DF 1 "register_operand" "r,0,r")
578: (match_operand:DF 2 "register_operand" "r,r,0")))]
579: "TARGET_29050"
580: "@
581: dsub %0,%1,%2
582: dmac 9,%0,%2,%2
583: dmac 10,%0,%1,%1"
584: [(set_attr "type" "fadd,dam,dam")])
585:
586: ;; EXBYTE
587: (define_insn ""
588: [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
589: (ior:SI (and:SI (match_operand:SI 1 "srcb_operand" "rI")
590: (const_int -256))
591: (zero_extract:SI (match_operand:SI 2 "gpc_reg_operand" "r")
592: (const_int 8)
593: (ashift:PSI
594: (match_operand:PSI 3 "register_operand" "b")
595: (const_int 3)))))]
596: ""
597: "exbyte %0,%2,%1")
598:
599: (define_insn ""
600: [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
601: (zero_extract:SI (match_operand:SI 1 "gpc_reg_operand" "r")
602: (const_int 8)
603: (ashift:PSI
604: (match_operand:PSI 2 "register_operand" "b")
605: (const_int 3))))]
606: ""
607: "exbyte %0,%1,0")
608:
609: (define_insn ""
610: [(set (zero_extract:SI (match_operand:SI 0 "gpc_reg_operand" "+r")
611: (const_int 8)
612: (match_operand:PSI 1 "const_24_operand" ""))
613: (zero_extract:SI (match_operand:SI 2 "gpc_reg_operand" "r")
614: (const_int 8)
615: (ashift:PSI
616: (match_operand:PSI 3 "register_operand" "b")
617: (const_int 3))))]
618: ""
619: "exbyte %0,%2,%0")
620:
621: (define_expand "extzv"
622: [(set (match_operand:SI 0 "gpc_reg_operand" "")
623: (zero_extract:SI (match_operand:SI 1 "gpc_reg_operand" "")
624: (match_operand:SI 2 "general_operand" "")
625: (match_operand:SI 3 "general_operand" "")))]
626: ""
627: "
628: {
629: int size, pos;
630:
631: if (GET_CODE (operands[2]) != CONST_INT
632: || GET_CODE (operands[3]) != CONST_INT)
633: FAIL;
634:
635: size = INTVAL (operands[2]);
636: pos = INTVAL (operands[3]);
637:
638: /* Can't do this unless a byte extraction. If extracting the high
639: or low byte, don't do this because a shift or AND is shorter.
640: Don't do 16-bit extracts, since the only two are the high and low
641: ends, and it is faster to do them with CONSTH and SRL. */
642:
643: if (size != 8 || (pos != 8 && pos != 16))
644: FAIL;
645:
646: operands[3] = gen_rtx (ASHIFT, PSImode,
647: force_reg (PSImode, GEN_INT (pos / 8)),
648: GEN_INT (3));
649:
650: }")
651:
652: ;; EXHW
653: (define_insn ""
654: [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
655: (ior:SI (and:SI (match_operand:SI 1 "srcb_operand" "rI")
656: (const_int -65536))
657: (zero_extract:SI (match_operand:SI 2 "gpc_reg_operand" "r")
658: (const_int 16)
659: (ashift:PSI
660: (match_operand:PSI 3 "register_operand" "b")
661: (const_int 3)))))]
662: ""
663: "exhw %0,%2,%1")
664:
665: (define_insn ""
666: [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
667: (zero_extract:SI (match_operand:SI 1 "gpc_reg_operand" "r")
668: (const_int 16)
669: (ashift:PSI
670: (match_operand:PSI 2 "register_operand" "b")
671: (const_int 3))))]
672: ""
673: "exhw %0,%1,0")
674:
675: (define_insn ""
676: [(set (zero_extract:SI (match_operand:SI 0 "gpc_reg_operand" "+r")
677: (const_int 16)
678: (match_operand:PSI 1 "const_16_operand" ""))
679: (zero_extract:SI (match_operand:SI 2 "gpc_reg_operand" "r")
680: (const_int 16)
681: (ashift:PSI
682: (match_operand:PSI 3 "register_operand" "b")
683: (const_int 3))))]
684: ""
685: "exhw %0,%2,%0")
686:
687: ;; EXHWS
688: ;;
689: ;; This is probably unused. The high-order 16-bits are obtained with an SRA
690: ;; insn. The low-order 16 bits are a sign-extend, which is a pair of
691: ;; shifts. Setting BP followed by the insn is equivalent, so we don't
692: ;; bother going to any trouble to generate this insn.
693:
694: (define_insn ""
695: [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
696: (sign_extract:SI (match_operand:SI 1 "gpc_reg_operand" "r")
697: (const_int 16)
698: (ashift:PSI
699: (match_operand:PSI 2 "register_operand" "b")
700: (const_int 3))))]
701: ""
702: "exhws %0,%1")
703:
704: ;; EXTRACT
705: (define_insn ""
706: [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
707: (rotate:SI (match_operand:SI 1 "gpc_reg_operand" "r")
708: (match_operand:PSI 2 "register_operand" "f")))]
709: ""
710: "extract %0,%1,%1")
711:
712: (define_expand "rotlsi3"
713: [(set (match_dup 3)
714: (match_operand:SI 2 "gpc_reg_or_immediate_operand" ""))
715: (set (match_operand:SI 0 "gpc_reg_operand" "")
716: (rotate:SI (match_operand:SI 1 "gpc_reg_operand" "")
717: (match_dup 3)))]
718: ""
719: "
720: { operands[2] = gen_lowpart (PSImode, operands[2]);
721: operands[3] = gen_reg_rtx (PSImode);
722: }")
723:
724: ;; It would be nice to be able to have a define_split corresponding to the
725: ;; above, but there is no way to tell combine we need a PSImode temporary.
726: ;; If we put a (clobber (scratch:PSI)) there, combine would merge the above
727: ;; two insns. This is bad because it then thinks only one insn is needed.
728:
729: ;; FADD
730: (define_expand "addsf3"
731: [(set (match_operand:SF 0 "register_operand" "")
732: (plus:SF (match_operand:SF 1 "register_operand" "")
733: (match_operand:SF 2 "register_operand" "")))]
734: ""
735: "")
736:
737: (define_insn ""
738: [(set (match_operand:SF 0 "register_operand" "=r")
739: (plus:SF (match_operand:SF 1 "register_operand" "%r")
740: (match_operand:SF 2 "register_operand" "r")))]
741: "! TARGET_29050"
742: "fadd %0,%1,%2"
743: [(set_attr "type" "fadd")])
744:
745: (define_insn ""
746: [(set (match_operand:SF 0 "register_operand" "=r,a")
747: (plus:SF (match_operand:SF 1 "register_operand" "%r,r")
748: (match_operand:SF 2 "register_operand" "r,0")))]
749: "TARGET_29050"
750: "@
751: fadd %0,%1,%2
752: fmac 8,%0,%1,%1"
753: [(set_attr "type" "fadd,fam")])
754:
755: ;; FDIV
756: (define_insn "divsf3"
757: [(set (match_operand:SF 0 "register_operand" "=r")
758: (div:SF (match_operand:SF 1 "register_operand" "=r")
759: (match_operand:SF 2 "register_operand" "r")))]
760: ""
761: "fdiv %0,%1,%2"
762: [(set_attr "type" "fdiv")])
763:
764: ;; FDMUL
765: (define_insn ""
766: [(set (match_operand:DF 0 "register_operand" "=r")
767: (mult:DF (float_extend:DF (match_operand:SF 1 "register_operand" "%r"))
768: (float_extend:DF (match_operand:SF 2 "register_operand" "r"))))]
769: ""
770: "fdmul %0,%1,%2")
771:
772: ;; FMAC/FMSM
773: (define_insn ""
774: [(set (match_operand:SF 0 "register_operand" "=a,*r")
775: (plus:SF (mult:SF (match_operand:SF 1 "register_operand" "%r,A")
776: (match_operand:SF 2 "register_operand" "r,r"))
777: (match_operand:SF 3 "register_operand" "0,*r")))]
778: "TARGET_29050"
779: "@
780: fmac 0,%0,%1,%2
781: fmsm %0,%2,%3"
782: [(set_attr "type" "fam")])
783:
784: (define_insn ""
785: [(set (match_operand:SF 0 "register_operand" "=a")
786: (plus:SF (mult:SF (neg:SF (match_operand:SF 1 "register_operand" "r"))
787: (match_operand:SF 2 "register_operand" "r"))
788: (match_operand:SF 3 "register_operand" "0")))]
789: "TARGET_29050"
790: "fmac 1,%0,%2,%1"
791: [(set_attr "type" "fam")])
792:
793: (define_insn ""
794: [(set (match_operand:SF 0 "register_operand" "=a")
795: (minus:SF (mult:SF (match_operand:SF 1 "register_operand" "%r")
796: (match_operand:SF 2 "register_operand" "r"))
797: (match_operand:SF 3 "register_operand" "0")))]
798: "TARGET_29050"
799: "fmac 2,%0,%1,%2"
800: [(set_attr "type" "fam")])
801:
802: (define_insn ""
803: [(set (match_operand:SF 0 "register_operand" "=a")
804: (minus:SF (mult:SF (neg:SF (match_operand:SF 1 "register_operand" "r"))
805: (match_operand:SF 2 "register_operand" "r"))
806: (match_operand:SF 3 "register_operand" "0")))]
807: "TARGET_29050"
808: "fmac 3,%0,%2,%1"
809: [(set_attr "type" "fam")])
810:
811: (define_insn ""
812: [(set (match_operand:SF 0 "register_operand" "=a")
813: (mult:SF (neg:SF (match_operand:SF 1 "register_operand" "r"))
814: (match_operand:SF 2 "register_operand" "r")))]
815: "TARGET_29050"
816: "fmac 5,%0,%2,%1"
817: [(set_attr "type" "fam")])
818:
819: (define_insn ""
820: [(set (match_operand:SF 0 "register_operand" "=a")
821: (minus:SF (neg:SF (match_operand:SF 1 "register_operand" "%r"))
822: (match_operand:SF 2 "register_operand" "0")))]
823: "TARGET_29050"
824: "fmac 11,%0,%1,%1"
825: [(set_attr "type" "fam")])
826:
827: (define_insn ""
828: [(set (match_operand:SF 0 "register_operand" "=a")
829: (neg:SF (plus:SF (match_operand:SF 1 "register_operand" "%r")
830: (match_operand:SF 2 "register_operand" "0"))))]
831: "TARGET_29050"
832: "fmac 11,%0,%1,%1"
833: [(set_attr "type" "fam")])
834:
835: (define_insn ""
836: [(set (match_operand:SF 0 "register_operand" "=r,a")
837: (neg:SF (match_operand:SF 1 "register_operand" "r,r")))
838: (clobber (match_scratch:SI 2 "=&r,X"))]
839: "TARGET_29050"
840: "@
841: cpeq %2,gr1,gr1\;xor %0,%1,%2
842: fmac 13,%0,%1,%1"
843: [(set_attr "type" "multi,fam")])
844:
845: ;; FMUL
846: (define_expand "mulsf3"
847: [(set (match_operand:SF 0 "register_operand" "")
848: (mult:SF (match_operand:SF 1 "register_operand" "")
849: (match_operand:SF 2 "register_operand" "")))]
850: ""
851: "")
852:
853: (define_insn ""
854: [(set (match_operand:SF 0 "register_operand" "=r")
855: (mult:SF (match_operand:SF 1 "register_operand" "%r")
856: (match_operand:SF 2 "register_operand" "r")))]
857: "! TARGET_29050"
858: "fmul %0,%1,%2"
859: [(set_attr "type" "fmul")])
860:
861: (define_insn ""
862: [(set (match_operand:SF 0 "register_operand" "=r,a")
863: (mult:SF (match_operand:SF 1 "register_operand" "%r,r")
864: (match_operand:SF 2 "register_operand" "r,r")))]
865: "TARGET_29050"
866: "@
867: fmul %0,%1,%2
868: fmac 4,%0,%1,%2"
869: [(set_attr "type" "fmul,fam")])
870:
871: ;; FSUB
872: (define_expand "subsf3"
873: [(set (match_operand:SF 0 "register_operand" "")
874: (minus:SF (match_operand:SF 1 "register_operand" "")
875: (match_operand:SF 2 "register_operand" "")))]
876: ""
877: "")
878:
879: (define_insn ""
880: [(set (match_operand:SF 0 "register_operand" "=r")
881: (minus:SF (match_operand:SF 1 "register_operand" "r")
882: (match_operand:SF 2 "register_operand" "r")))]
883: "! TARGET_29050"
884: "fsub %0,%1,%2"
885: [(set_attr "type" "fadd")])
886:
887: (define_insn ""
888: [(set (match_operand:SF 0 "register_operand" "=r,a,a")
889: (minus:SF (match_operand:SF 1 "register_operand" "r,0,r")
890: (match_operand:SF 2 "register_operand" "r,r,0")))]
891: "TARGET_29050"
892: "@
893: fsub %0,%1,%2
894: fmac 9,%0,%2,%2
895: fmac 10,%0,%1,%1"
896: [(set_attr "type" "fadd,fam,fam")])
897:
898: ;; INBYTE
899: (define_insn ""
900: [(set (zero_extract:SI (match_operand:SI 0 "gpc_reg_operand" "+r")
901: (const_int 8)
902: (ashift:PSI
903: (match_operand:PSI 2 "register_operand" "b")
904: (const_int 3)))
905: (match_operand:SI 1 "srcb_operand" "rI"))]
906: ""
907: "inbyte %0,%0,%1")
908:
909: (define_insn ""
910: [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
911: (ior:SI (and:SI
912: (not:SI
913: (ashift:SI (const_int 255)
914: (ashift:PSI
915: (match_operand:PSI 3 "register_operand" "b")
916: (const_int 3))))
917: (match_operand:SI 1 "gpc_reg_operand" "r"))
918: (ashift:SI (zero_extend:SI
919: (match_operand:QI 2 "srcb_operand" "rI"))
920: (ashift:PSI (match_dup 3) (const_int 3)))))]
921: ""
922: "inbyte %0,%1,%2")
923:
924: ;; INHW
925: (define_insn ""
926: [(set (zero_extract:SI (match_operand:SI 0 "gpc_reg_operand" "+r")
927: (const_int 16)
928: (ashift:PSI
929: (match_operand:PSI 2 "register_operand" "b")
930: (const_int 3)))
931: (match_operand:SI 1 "srcb_operand" "rI"))]
932: ""
933: "inhw %0,%0,%1")
934:
935: (define_insn ""
936: [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
937: (ior:SI (and:SI
938: (not:SI
939: (ashift:SI (const_int 65535)
940: (ashift:PSI
941: (match_operand:PSI 3 "register_operand" "b")
942: (const_int 3))))
943: (match_operand:SI 1 "gpc_reg_operand" "r"))
944: (ashift:SI (zero_extend:SI
945: (match_operand:HI 2 "srcb_operand" "rI"))
946: (ashift:PSI (match_dup 3) (const_int 3)))))]
947: ""
948: "inhw %0,%1,%2")
949:
950: (define_expand "insv"
951: [(set (zero_extract:SI (match_operand:SI 0 "gpc_reg_operand" "")
952: (match_operand:SI 1 "general_operand" "")
953: (match_operand:SI 2 "general_operand" ""))
954: (match_operand:SI 3 "srcb_operand" ""))]
955: ""
956: "
957: {
958: int size, pos;
959:
960: if (GET_CODE (operands[1]) != CONST_INT
961: || GET_CODE (operands[2]) != CONST_INT)
962: FAIL;
963:
964: size = INTVAL (operands[1]);
965: pos = INTVAL (operands[2]);
966: if ((size != 8 && size != 16) || pos % size != 0)
967: FAIL;
968:
969: operands[2] = gen_rtx (ASHIFT, PSImode,
970: force_reg (PSImode, GEN_INT (pos / 8)),
971: GEN_INT (3));
972: }")
973:
974: ;; LOAD (also used by move insn).
975: (define_insn ""
976: [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
977: (mem:SI (and:SI (match_operand:SI 1 "gpc_reg_operand" "r")
978: (const_int -4))))
979: (set (match_operand:PSI 2 "register_operand" "=b")
980: (truncate:PSI (match_dup 1)))]
981: "! TARGET_DW_ENABLE"
982: "load 0,16,%0,%1"
983: [(set_attr "type" "load")])
984:
985: (define_insn ""
986: [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
987: (zero_extend:SI (match_operand:QI 1 "memory_operand" "m")))]
988: "TARGET_DW_ENABLE"
989: "load 0,1,%0,%1"
990: [(set_attr "type" "load")])
991:
992: (define_insn ""
993: [(set (match_operand:HI 0 "gpc_reg_operand" "=r")
994: (zero_extend:HI (match_operand:QI 1 "memory_operand" "m")))]
995: "TARGET_DW_ENABLE"
996: "load 0,1,%0,%1"
997: [(set_attr "type" "load")])
998:
999: (define_insn ""
1000: [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
1001: (zero_extend:SI (match_operand:HI 1 "memory_operand" "m")))]
1002: "TARGET_DW_ENABLE"
1003: "load 0,2,%0,%1"
1004: [(set_attr "type" "load")])
1005:
1006: (define_insn ""
1007: [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
1008: (sign_extend:SI (match_operand:QI 1 "memory_operand" "m")))
1009: (clobber (match_scratch:PSI 2 "=&b"))]
1010: "TARGET_DW_ENABLE"
1011: "load 0,17,%0,%1"
1012: [(set_attr "type" "load")])
1013:
1014: (define_insn ""
1015: [(set (match_operand:HI 0 "gpc_reg_operand" "=r")
1016: (sign_extend:HI (match_operand:QI 1 "memory_operand" "m")))
1017: (clobber (match_scratch:PSI 2 "=&b"))]
1018: "TARGET_DW_ENABLE"
1019: "load 0,17,%0,%1"
1020: [(set_attr "type" "load")])
1021:
1022: (define_insn ""
1023: [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
1024: (sign_extend:SI (match_operand:HI 1 "memory_operand" "m")))
1025: (clobber (match_scratch:PSI 2 "=&b"))]
1026: "TARGET_DW_ENABLE"
1027: "load 0,18,%0,%1"
1028: [(set_attr "type" "load")])
1029:
1030: ;; LOADM
1031: (define_expand "load_multiple"
1032: [(set (match_dup 4)
1033: (match_operand:PSI 2 "const_int_operand" ""))
1034: (match_par_dup 3 [(set (match_operand:SI 0 "" "")
1035: (match_operand:SI 1 "" ""))])]
1036: ""
1037: "
1038: {
1039: int regno;
1040: int count;
1041: rtx from;
1042: int i;
1043:
1044: /* Support only loading a constant number of hard registers from memory. */
1045: if (GET_CODE (operands[2]) != CONST_INT
1046: || operands[2] == const1_rtx
1047: || GET_CODE (operands[1]) != MEM
1048: || GET_CODE (operands[0]) != REG
1049: || REGNO (operands[0]) >= FIRST_PSEUDO_REGISTER)
1050: FAIL;
1051:
1052: count = INTVAL (operands[2]);
1053: regno = REGNO (operands[0]);
1054:
1055: /* CR gets set to the number of registers minus one. */
1056: operands[2] = GEN_INT(count - 1);
1057:
1058: operands[3] = gen_rtx (PARALLEL, VOIDmode, rtvec_alloc (count + 2));
1059: from = memory_address (SImode, XEXP (operands[1], 0));
1060: XVECEXP (operands[3], 0, 0) = gen_rtx (SET, VOIDmode,
1061: gen_rtx (REG, SImode, regno),
1062: gen_rtx (MEM, SImode, from));
1063: operands[4] = gen_reg_rtx (PSImode);
1064:
1065: XVECEXP (operands[3], 0, 1) = gen_rtx (USE, VOIDmode, operands[4]);
1066: XVECEXP (operands[3], 0, 2) = gen_rtx (CLOBBER, VOIDmode, operands[4]);
1067:
1068: for (i = 1; i < count; i++)
1069: XVECEXP (operands[3], 0, i + 2)
1070: = gen_rtx (SET, VOIDmode, gen_rtx (REG, SImode, regno + i),
1071: gen_rtx (MEM, SImode, plus_constant (from, i * 4)));
1072: }")
1073:
1074: ;; Indicate that CR is used and is then clobbered.
1075: (define_insn ""
1076: [(set (match_operand 0 "gpc_reg_operand" "=r")
1077: (match_operand 1 "memory_operand" "m"))
1078: (use (match_operand:PSI 2 "register_operand" "+c"))
1079: (clobber (match_dup 2))]
1080: "GET_MODE (operands[0]) == GET_MODE (operands[1])
1081: && GET_MODE_SIZE (GET_MODE (operands[0])) > UNITS_PER_WORD"
1082: "loadm 0,0,%0,%1"
1083: [(set_attr "type" "load")])
1084:
1085: (define_insn ""
1086: [(match_parallel 0 "load_multiple_operation"
1087: [(set (match_operand:SI 1 "gpc_reg_operand" "=r")
1088: (match_operand:SI 2 "memory_operand" "m"))
1089: (use (match_operand:PSI 3 "register_operand" "+c"))
1090: (clobber (match_dup 3))])]
1091: ""
1092: "loadm 0,0,%1,%2"
1093: [(set_attr "type" "load")])
1094:
1095: ;; MTSR (used also by move insn)
1096: (define_insn ""
1097: [(set (match_operand:SI 0 "spec_reg_operand" "=*h,*h")
1098: (and:SI (match_operand:SI 1 "gpc_reg_or_immediate_operand" "r,i")
1099: (match_operand:SI 2 "const_int_operand" "n,n")))]
1100: "masks_bits_for_special (operands[0], operands[2])"
1101: "@
1102: mtsr %0,%1
1103: mtsrim %0,%1")
1104:
1105: (define_insn ""
1106: [(set (match_operand:PSI 0 "register_operand" "=h,h")
1107: (truncate:PSI
1108: (match_operand:SI 1 "gpc_reg_or_immediate_operand" "r,i")))]
1109: ""
1110: "@
1111: mtsr %0,%1
1112: mtsrim %0,%1")
1113:
1114: ;; MULTIPLY, MULTM, MULTMU
1115: (define_insn "mulsi3"
1116: [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
1117: (mult:SI (match_operand:SI 1 "gpc_reg_operand" "%r")
1118: (match_operand:SI 2 "gpc_reg_operand" "r")))
1119: (clobber (match_scratch:SI 3 "=&q"))]
1120: ""
1121: "multiply %0,%1,%2")
1122:
1123: (define_insn ""
1124: [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
1125: (subreg:SI
1126: (mult:DI
1127: (sign_extend:DI (match_operand:SI 1 "gpc_reg_operand" "%r"))
1128: (sign_extend:DI (match_operand:SI 2 "gpc_reg_operand" "r"))) 0))
1129: (clobber (match_scratch:SI 3 "=&q"))]
1130: ""
1131: "multm %0,%1,%2")
1132:
1133: (define_insn ""
1134: [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
1135: (subreg:SI
1136: (mult:DI
1137: (zero_extend:DI (match_operand:SI 1 "gpc_reg_operand" "%r"))
1138: (zero_extend:DI (match_operand:SI 2 "gpc_reg_operand" "r"))) 0))
1139: (clobber (match_scratch:SI 3 "=&q"))]
1140: ""
1141: "multmu %0,%1,%2")
1142:
1143: (define_insn "mulsidi3"
1144: [(set (match_operand:DI 0 "gpc_reg_operand" "=r")
1145: (mult:DI (sign_extend:DI (match_operand:SI 1 "gpc_reg_operand" "r"))
1146: (sign_extend:DI (match_operand:SI 2 "gpc_reg_operand" "r"))))
1147: (clobber (match_scratch:SI 3 "=&q"))]
1148: ""
1149: "multiply %L0,%1,%2\;multm %0,%1,%2"
1150: [(set_attr "type" "multi")])
1151:
1152: (define_split
1153: [(set (match_operand:DI 0 "gpc_reg_operand" "")
1154: (mult:DI (sign_extend:DI (match_operand:SI 1 "gpc_reg_operand" ""))
1155: (sign_extend:DI (match_operand:SI 2 "gpc_reg_operand" ""))))
1156: (clobber (reg:SI 180))]
1157: "reload_completed"
1158: [(parallel [(set (match_dup 3)
1159: (mult:SI (match_dup 1) (match_dup 2)))
1160: (clobber (reg:SI 180))])
1161: (parallel [(set (match_dup 4)
1162: (subreg:SI (mult:DI
1163: (sign_extend:DI (match_dup 1))
1164: (sign_extend:DI (match_dup 2))) 0))
1165: (clobber (reg:SI 180))])]
1166: "
1167: { operands[3] = operand_subword (operands[0], 1, 1, DImode);
1168: operands[4] = operand_subword (operands[1], 0, 1, DImode); } ")
1169:
1170: (define_insn "umulsidi3"
1171: [(set (match_operand:DI 0 "gpc_reg_operand" "=r")
1172: (mult:DI (zero_extend:DI (match_operand:SI 1 "gpc_reg_operand" "r"))
1173: (zero_extend:DI (match_operand:SI 2 "gpc_reg_operand" "r"))))
1174: (clobber (match_scratch:SI 3 "=&q"))]
1175: ""
1176: "multiplu %L0,%1,%2\;multmu %0,%1,%2"
1177: [(set_attr "type" "multi")])
1178:
1179: (define_split
1180: [(set (match_operand:DI 0 "gpc_reg_operand" "")
1181: (mult:DI (zero_extend:DI (match_operand:SI 1 "gpc_reg_operand" ""))
1182: (zero_extend:DI (match_operand:SI 2 "gpc_reg_operand" ""))))
1183: (clobber (reg:SI 180))]
1184: "reload_completed"
1185: [(parallel [(set (match_dup 3)
1186: (mult:SI (match_dup 1) (match_dup 2)))
1187: (clobber (reg:SI 180))])
1188: (parallel [(set (match_dup 4)
1189: (subreg:SI (mult:DI (zero_extend:DI (match_dup 1))
1190: (zero_extend:DI (match_dup 2))) 0))
1191: (clobber (reg:SI 180))])]
1192: "
1193: { operands[3] = operand_subword (operands[0], 1, 1, DImode);
1194: operands[4] = operand_subword (operands[1], 0, 1, DImode); } ")
1195:
1196: ;; NAND
1197: (define_insn ""
1198: [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
1199: (ior:SI (not:SI (match_operand:SI 1 "gpc_reg_operand" "%r"))
1200: (not:SI (match_operand:SI 2 "srcb_operand" "rI"))))]
1201: ""
1202: "nand %0,%1,%2")
1203:
1204: (define_insn ""
1205: [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
1206: (ior:SI (not:SI (match_operand:SI 1 "gpc_reg_operand" "r"))
1207: (match_operand:SI 2 "const_int_operand" "K")))]
1208: "((unsigned) ~ INTVAL (operands[2])) < 256"
1209: "nand %0,%1,%C2")
1210:
1211: ;; NOR
1212: (define_insn ""
1213: [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
1214: (and:SI (not:SI (match_operand:SI 1 "gpc_reg_operand" "%r"))
1215: (not:SI (match_operand:SI 2 "srcb_operand" "rI"))))]
1216: ""
1217: "nor %0,%1,%2")
1218:
1219: (define_insn ""
1220: [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
1221: (and:SI (not:SI (match_operand:SI 1 "gpc_reg_operand" "r"))
1222: (match_operand:SI 2 "const_int_operand" "K")))]
1223: "((unsigned) ~ INTVAL (operands[2])) < 256"
1224: "nor %0,%1,%C2")
1225:
1226: (define_insn "one_cmplsi2"
1227: [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
1228: (not:SI (match_operand:SI 1 "gpc_reg_operand" "r")))]
1229: ""
1230: "nor %0,%1,0")
1231:
1232: ;; OR/ORN
1233: (define_expand "iorsi3"
1234: [(set (match_operand:SI 0 "gpc_reg_operand" "")
1235: (ior:SI (match_operand:SI 1 "gpc_reg_operand" "")
1236: (match_operand:SI 2 "srcb_operand" "")))]
1237: ""
1238: "")
1239:
1240: (define_insn ""
1241: [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
1242: (ior:SI (match_operand:SI 1 "gpc_reg_operand" "%r")
1243: (match_operand:SI 2 "srcb_operand" "rI")))]
1244: "! TARGET_29050"
1245: "or %0,%1,%2")
1246:
1247: (define_insn ""
1248: [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
1249: (ior:SI (match_operand:SI 1 "gpc_reg_operand" "%r,r")
1250: (match_operand:SI 2 "srcb_operand" "rI,K")))]
1251: "TARGET_29050"
1252: "@
1253: or %0,%1,%2
1254: orn %0,%1,%C2")
1255:
1256:
1257: ;; SLL (also used by move insn)
1258: (define_insn "nop"
1259: [(const_int 0)]
1260: ""
1261: "aseq 0x40,gr1,gr1")
1262:
1263: (define_insn "ashlsi3"
1264: [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
1265: (ashift:SI (match_operand:SI 1 "gpc_reg_operand" "r")
1266: (match_operand:QI 2 "srcb_operand" "rn")))]
1267: ""
1268: "sll %0,%1,%Q2")
1269:
1270: ;; SQRT
1271: (define_insn "sqrtsf2"
1272: [(set (match_operand:SF 0 "gpc_reg_operand" "=r")
1273: (sqrt:SF (match_operand:SF 1 "gpc_reg_operand" "r")))]
1274: "TARGET_29050"
1275: "sqrt %0,%1,1"
1276: [(set_attr "type" "fsqrt")])
1277:
1278: (define_insn "sqrtdf2"
1279: [(set (match_operand:DF 0 "gpc_reg_operand" "=r")
1280: (sqrt:DF (match_operand:DF 1 "gpc_reg_operand" "r")))]
1281: "TARGET_29050"
1282: "sqrt %0,%1,2"
1283: [(set_attr "type" "dsqrt")])
1284:
1285: ;; SRA
1286: (define_insn "ashrsi3"
1287: [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
1288: (ashiftrt:SI (match_operand:SI 1 "gpc_reg_operand" "r")
1289: (match_operand:QI 2 "srcb_operand" "rn")))]
1290: ""
1291: "sra %0,%1,%Q2")
1292:
1293: ;; SRL
1294: (define_insn "lshrsi3"
1295: [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
1296: (lshiftrt:SI (match_operand:SI 1 "gpc_reg_operand" "r")
1297: (match_operand:QI 2 "srcb_operand" "rn")))]
1298: ""
1299: "srl %0,%1,%Q2")
1300:
1301: ;; STORE
1302: ;;
1303: ;; These somewhat bogus patterns exist to set OPT = 001/010 for partial-word
1304: ;; stores on systems with DW not set.
1305: (define_insn ""
1306: [(set (mem:SI (and:SI (match_operand:SI 0 "gpc_reg_operand" "r")
1307: (const_int -4)))
1308: (match_operand:SI 1 "gpc_reg_operand" "r"))]
1309: "! TARGET_DW_ENABLE"
1310: "store 0,1,%1,%0"
1311: [(set_attr "type" "store")])
1312:
1313: (define_insn ""
1314: [(set (mem:SI (and:SI (match_operand:SI 0 "gpc_reg_operand" "r")
1315: (const_int -3)))
1316: (match_operand:SI 1 "gpc_reg_operand" "r"))]
1317: "! TARGET_DW_ENABLE"
1318: "store 0,2,%1,%0"
1319: [(set_attr "type" "store")])
1320:
1321: ;; STOREM
1322: (define_expand "store_multiple"
1323: [(use (match_operand 0 "" ""))
1324: (use (match_operand 1 "" ""))
1325: (use (match_operand 2 "" ""))]
1326: ""
1327: "
1328: { rtx pat;
1329:
1330: if (TARGET_NO_STOREM_BUG)
1331: pat = gen_store_multiple_no_bug (operands[0], operands[1], operands[2]);
1332: else
1333: pat = gen_store_multiple_bug (operands[0], operands[1], operands[2]);
1334:
1335: if (pat)
1336: emit_insn (pat);
1337: else
1338: FAIL;
1339:
1340: DONE;
1341: }")
1342:
1343: (define_expand "store_multiple_no_bug"
1344: [(set (match_dup 4)
1345: (match_operand:PSI 2 "const_int_operand" ""))
1346: (match_par_dup 3 [(set (match_operand:SI 0 "" "")
1347: (match_operand:SI 1 "" ""))])]
1348: ""
1349: "
1350: {
1351: int regno;
1352: int count;
1353: rtx from;
1354: int i;
1355:
1356: /* Support only storing a constant number of hard registers to memory. */
1357: if (GET_CODE (operands[2]) != CONST_INT
1358: || operands[2] == const1_rtx
1359: || GET_CODE (operands[0]) != MEM
1360: || GET_CODE (operands[1]) != REG
1361: || REGNO (operands[1]) >= FIRST_PSEUDO_REGISTER)
1362: FAIL;
1363:
1364: count = INTVAL (operands[2]);
1365: regno = REGNO (operands[1]);
1366:
1367: /* CR gets set to the number of registers minus one. */
1368: operands[2] = GEN_INT(count - 1);
1369:
1370: operands[3] = gen_rtx (PARALLEL, VOIDmode, rtvec_alloc (count + 2));
1371: from = memory_address (SImode, XEXP (operands[0], 0));
1372: XVECEXP (operands[3], 0, 0) = gen_rtx (SET, VOIDmode,
1373: gen_rtx (MEM, SImode, from),
1374: gen_rtx (REG, SImode, regno));
1375: operands[4] = gen_reg_rtx (PSImode);
1376: XVECEXP (operands[3], 0, 1) = gen_rtx (USE, VOIDmode, operands[4]);
1377: XVECEXP (operands[3], 0, 2) = gen_rtx (CLOBBER, VOIDmode, operands[4]);
1378:
1379: for (i = 1; i < count; i++)
1380: XVECEXP (operands[3], 0, i + 2)
1381: = gen_rtx (SET, VOIDmode,
1382: gen_rtx (MEM, SImode, plus_constant (from, i * 4)),
1383: gen_rtx (REG, SImode, regno + i));
1384: }")
1385:
1386: (define_expand "store_multiple_bug"
1387: [(match_par_dup 3 [(set (match_operand:SI 0 "" "")
1388: (match_operand:SI 1 "" ""))
1389: (use (match_operand:SI 2 "" ""))])]
1390: ""
1391: "
1392: {
1393: int regno;
1394: int count;
1395: rtx from;
1396: int i;
1397:
1398: /* Support only storing a constant number of hard registers to memory. */
1399: if (GET_CODE (operands[2]) != CONST_INT
1400: || operands[2] == const1_rtx
1401: || GET_CODE (operands[0]) != MEM
1402: || GET_CODE (operands[1]) != REG
1403: || REGNO (operands[1]) >= FIRST_PSEUDO_REGISTER)
1404: FAIL;
1405:
1406: count = INTVAL (operands[2]);
1407: regno = REGNO (operands[1]);
1408:
1409: operands[3] = gen_rtx (PARALLEL, VOIDmode, rtvec_alloc (count + 1));
1410: from = memory_address (SImode, XEXP (operands[0], 0));
1411: XVECEXP (operands[3], 0, 0) = gen_rtx (SET, VOIDmode,
1412: gen_rtx (MEM, SImode, from),
1413: gen_rtx (REG, SImode, regno));
1414: XVECEXP (operands[3], 0, 1)
1415: = gen_rtx (CLOBBER, VOIDmode, gen_rtx (SCRATCH, PSImode));
1416:
1417: for (i = 1; i < count; i++)
1418: XVECEXP (operands[3], 0, i + 1)
1419: = gen_rtx (SET, VOIDmode,
1420: gen_rtx (MEM, SImode, plus_constant (from, i * 4)),
1421: gen_rtx (REG, SImode, regno + i));
1422: }")
1423:
1424: (define_insn ""
1425: [(set (match_operand 0 "memory_operand" "=m")
1426: (match_operand 1 "gpc_reg_operand" "r"))
1427: (clobber (match_scratch:PSI 2 "=&c"))]
1428: "!TARGET_NO_STOREM_BUG
1429: && GET_MODE (operands[0]) == GET_MODE (operands[1])
1430: && GET_MODE_SIZE (GET_MODE (operands[0])) > UNITS_PER_WORD"
1431: "mtsrim cr,%S1\;storem 0,0,%1,%0"
1432: [(set_attr "type" "multi")])
1433:
1434: (define_insn ""
1435: [(match_parallel 0 "store_multiple_operation"
1436: [(set (match_operand:SI 1 "memory_operand" "=m")
1437: (match_operand:SI 2 "gpc_reg_operand" "r"))
1438: (clobber (match_scratch:PSI 3 "=&c"))])]
1439: "!TARGET_NO_STOREM_BUG"
1440: "mtsrim cr,%V0\;storem 0,0,%2,%1"
1441: [(set_attr "type" "multi")])
1442:
1443: (define_insn ""
1444: [(set (match_operand 0 "memory_operand" "=m")
1445: (match_operand 1 "gpc_reg_operand" "r"))
1446: (use (match_operand:PSI 2 "register_operand" "+c"))
1447: (clobber (match_dup 2))]
1448: "TARGET_NO_STOREM_BUG
1449: && GET_MODE (operands[0]) == GET_MODE (operands[1])
1450: && GET_MODE_SIZE (GET_MODE (operands[0])) > UNITS_PER_WORD"
1451: "storem 0,0,%1,%0"
1452: [(set_attr "type" "store")])
1453:
1454: (define_insn ""
1455: [(match_parallel 0 "store_multiple_operation"
1456: [(set (match_operand:SI 1 "memory_operand" "=m")
1457: (match_operand:SI 2 "gpc_reg_operand" "r"))
1458: (use (match_operand:PSI 3 "register_operand" "+c"))
1459: (clobber (match_dup 3))])]
1460: "TARGET_NO_STOREM_BUG"
1461: "storem 0,0,%2,%1"
1462: [(set_attr "type" "store")])
1463:
1464: ;; SUB
1465: ;;
1466: ;; Either operand can be a register or an 8-bit constant, but both cannot be
1467: ;; constants (can't usually occur anyway).
1468: (define_expand "subsi3"
1469: [(set (match_operand:SI 0 "gpc_reg_operand" "")
1470: (minus:SI (match_operand:SI 1 "srcb_operand" "")
1471: (match_operand:SI 2 "srcb_operand" "")))]
1472: ""
1473: "
1474: {
1475: if (GET_CODE (operands[0]) == CONST_INT
1476: && GET_CODE (operands[1]) == CONST_INT)
1477: operands[1] = force_reg (SImode, operands[1]);
1478: }")
1479:
1480: (define_insn ""
1481: [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
1482: (minus:SI (match_operand:SI 1 "srcb_operand" "r,I")
1483: (match_operand:SI 2 "srcb_operand" "rI,r")))]
1484: "register_operand (operands[1], SImode)
1485: || register_operand (operands[2], SImode)"
1486: "@
1487: sub %0,%1,%2
1488: subr %0,%2,%1")
1489:
1490: (define_insn "subdi3"
1491: [(set (match_operand:DI 0 "gpc_reg_operand" "=r")
1492: (minus:DI (match_operand:DI 1 "gpc_reg_operand" "r")
1493: (match_operand:DI 2 "gpc_reg_operand" "r")))]
1494: ""
1495: "sub %L0,%L1,%L2\;subc %0,%1,%2"
1496: [(set_attr "type" "multi")])
1497:
1498: ;; SUBR (also used above in SUB)
1499: (define_insn "negdi2"
1500: [(set (match_operand:DI 0 "gpc_reg_operand" "=r")
1501: (neg:DI (match_operand:DI 1 "gpc_reg_operand" "r")))]
1502: ""
1503: "subr %L0,%L1,0\;subrc %0,%1,0"
1504: [(set_attr "type" "multi")])
1505:
1506: (define_insn "negsi2"
1507: [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
1508: (neg:SI (match_operand:SI 1 "gpc_reg_operand" "r")))]
1509: ""
1510: "subr %0,%1,0")
1511:
1512: ;; XNOR
1513: (define_insn ""
1514: [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
1515: (not:SI (xor:SI (match_operand:SI 1 "gpc_reg_operand" "%r")
1516: (match_operand:SI 2 "srcb_operand" "rI"))))]
1517: ""
1518: "xnor %0,%1,%2")
1519:
1520: ;; XOR
1521: (define_insn "xorsi3"
1522: [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
1523: (xor:SI (match_operand:SI 1 "gpc_reg_operand" "%r")
1524: (match_operand:SI 2 "srcb_operand" "rI")))]
1525: ""
1526: "xor %0,%1,%2")
1527:
1528: ;; Can use XOR to negate floating-point values, but we are better off not doing
1529: ;; it that way on the 29050 so it can combine with the fmac insns.
1530: (define_expand "negsf2"
1531: [(parallel [(set (match_operand:SF 0 "register_operand" "")
1532: (neg:SF (match_operand:SF 1 "register_operand" "")))
1533: (clobber (match_scratch:SI 2 ""))])]
1534: ""
1535: "
1536: {
1537: rtx result;
1538: rtx target;
1539:
1540: if (! TARGET_29050)
1541: {
1542: target = operand_subword_force (operands[0], 0, SFmode);
1543: result = expand_binop (SImode, xor_optab,
1544: operand_subword_force (operands[1], 0, SFmode),
1545: GEN_INT(0x80000000), target, 0, OPTAB_WIDEN);
1546: if (result == 0)
1547: abort ();
1548:
1549: if (result != target)
1550: emit_move_insn (result, target);
1551:
1552: /* Make a place for REG_EQUAL. */
1553: emit_move_insn (operands[0], operands[0]);
1554: DONE;
1555: }
1556: }")
1557:
1558: (define_expand "negdf2"
1559: [(parallel [(set (match_operand:DF 0 "register_operand" "")
1560: (neg:DF (match_operand:DF 1 "register_operand" "")))
1561: (clobber (match_scratch:SI 2 ""))])]
1562: ""
1563: "
1564: {
1565: rtx result;
1566: rtx target;
1567: rtx insns;
1568:
1569: if (! TARGET_29050)
1570: {
1571: start_sequence ();
1572: target = operand_subword (operands[0], 0, 1, DFmode);
1573: result = expand_binop (SImode, xor_optab,
1574: operand_subword_force (operands[1], 0, DFmode),
1575: GEN_INT(0x80000000), target, 0, OPTAB_WIDEN);
1576: if (result == 0)
1577: abort ();
1578:
1579: if (result != target)
1580: emit_move_insn (result, target);
1581:
1582: emit_move_insn (operand_subword (operands[0], 1, 1, DFmode),
1583: operand_subword_force (operands[1], 1, DFmode));
1584:
1585: insns = get_insns ();
1586: end_sequence ();
1587:
1588: emit_no_conflict_block (insns, operands[0], operands[1], 0, 0);
1589: DONE;
1590: }
1591: }")
1592:
1593: ;; Sign extend and truncation operations.
1594: (define_insn "zero_extendqihi2"
1595: [(set (match_operand:HI 0 "gpc_reg_operand" "=r")
1596: (zero_extend:HI (match_operand:QI 1 "gpc_reg_operand" "r")))]
1597: ""
1598: "and %0,%1,255")
1599:
1600: (define_insn "zero_extendqisi2"
1601: [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
1602: (zero_extend:SI (match_operand:QI 1 "gpc_reg_operand" "r")))]
1603: ""
1604: "and %0,%1,255")
1605:
1606: (define_insn "zero_extendhisi2"
1607: [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
1608: (zero_extend:SI (match_operand:HI 1 "gpc_reg_operand" "0")))]
1609: ""
1610: "consth %0,0")
1611:
1612: (define_expand "extendqihi2"
1613: [(set (match_dup 2)
1614: (ashift:SI (match_operand:QI 1 "gpc_reg_operand" "")
1615: (const_int 24)))
1616: (set (match_operand:HI 0 "gpc_reg_operand" "")
1617: (ashiftrt:SI (match_dup 2)
1618: (const_int 24)))]
1619: ""
1620: "
1621: { operands[0] = gen_lowpart (SImode, operands[0]);
1622: operands[1] = gen_lowpart (SImode, operands[1]);
1623: operands[2] = gen_reg_rtx (SImode); }")
1624:
1625: (define_expand "extendqisi2"
1626: [(set (match_dup 2)
1627: (ashift:SI (match_operand:QI 1 "gpc_reg_operand" "")
1628: (const_int 24)))
1629: (set (match_operand:SI 0 "gpc_reg_operand" "")
1630: (ashiftrt:SI (match_dup 2)
1631: (const_int 24)))]
1632: ""
1633: "
1634: { operands[1] = gen_lowpart (SImode, operands[1]);
1635: operands[2] = gen_reg_rtx (SImode); }")
1636:
1637: (define_expand "extendhisi2"
1638: [(set (match_dup 2)
1639: (ashift:SI (match_operand:HI 1 "gpc_reg_operand" "")
1640: (const_int 16)))
1641: (set (match_operand:SI 0 "gpc_reg_operand" "")
1642: (ashiftrt:SI (match_dup 2)
1643: (const_int 16)))]
1644: ""
1645: "
1646: { operands[1] = gen_lowpart (SImode, operands[1]);
1647: operands[2] = gen_reg_rtx (SImode); }")
1648:
1649: ;; Define the methods used to move data around.
1650: ;;
1651: ;; movsi:
1652: ;;
1653: ;; If storing into memory, force source into register.
1654: (define_expand "movsi"
1655: [(set (match_operand:SI 0 "general_operand" "")
1656: (match_operand:SI 1 "general_operand" ""))]
1657: ""
1658: "
1659: {
1660: if (GET_CODE (operands[0]) == MEM && ! gpc_reg_operand (operands[1], SImode))
1661: operands[1] = copy_to_mode_reg (SImode, operands[1]);
1662: else if (spec_reg_operand (operands[0], SImode)
1663: && ! (register_operand (operands[1], SImode)
1664: || cint_16_operand (operands[1], SImode)))
1665: operands[1] = force_reg (SImode, operands[1]);
1666: }")
1667:
1668: (define_expand "movpsi"
1669: [(set (match_operand:PSI 0 "general_operand" "")
1670: (match_operand:PSI 1 "general_operand" ""))]
1671: ""
1672: "
1673: {
1674: if (GET_CODE (operands[0]) == MEM
1675: && ! gpc_reg_operand (operands[1], PSImode))
1676: operands[1] = copy_to_mode_reg (PSImode, operands[1]);
1677: else if (spec_reg_operand (operands[0], PSImode)
1678: && ! (register_operand (operands[1], PSImode)
1679: || cint_16_operand (operands[1], PSImode)))
1680: operands[1] = force_reg (PSImode, operands[1]);
1681: }")
1682:
1683: (define_split
1684: [(set (match_operand:SI 0 "gpc_reg_operand" "")
1685: (match_operand:SI 1 "long_const_operand" ""))]
1686: ""
1687: [(set (match_dup 0)
1688: (and:SI (match_dup 1)
1689: (const_int 65535)))
1690: (set (match_dup 0)
1691: (ior:SI (zero_extend:SI (match_dup 2))
1692: (and:SI (match_dup 1)
1693: (const_int -65536))))]
1694: " operands[2] = gen_lowpart (HImode, operands[0]); ")
1695:
1696: ;; Subroutines to load/store halfwords. Operands 0 and 1 are the output and
1697: ;; input, respectively, except that the address is passed for a MEM instead
1698: ;; of the MEM itself and the short item is passed in QImode.
1699: ;;
1700: ;; Operand 2 is a scratch general register and operand 3 is a scratch register
1701: ;; used for BP. When called before reload, pseudos are passed for both
1702: ;; operands. During reload, R_TAV is used for the general register, and
1703: ;; a reload register of class BR_REGS (R_VP) for BP.
1704: ;;
1705: ;; We have two versions of the store operations, for when halfword writes are
1706: ;; supported and when they are not.
1707: (define_expand "loadhi"
1708: [(parallel [(set (match_operand:SI 2 "gpc_reg_operand" "")
1709: (mem:SI (and:SI (match_operand:SI 1 "gpc_reg_operand" "")
1710: (const_int -4))))
1711: (set (match_operand:PSI 3 "register_operand" "")
1712: (truncate:PSI (match_dup 1)))])
1713: (set (match_operand:SI 0 "gpc_reg_operand" "")
1714: (zero_extract:SI (match_dup 2)
1715: (const_int 16)
1716: (ashift:PSI (match_dup 3) (const_int 3))))]
1717: ""
1718: "")
1719:
1720: (define_expand "storehinhww"
1721: [(parallel [(set (match_operand:SI 2 "gpc_reg_operand" "")
1722: (mem:SI (and:SI (match_operand:SI 0 "gpc_reg_operand" "")
1723: (const_int -4))))
1724: (set (match_operand:PSI 3 "register_operand" "")
1725: (truncate:PSI (match_dup 0)))])
1726: (set (zero_extract:SI (match_dup 2)
1727: (const_int 16)
1728: (ashift:PSI (match_dup 3) (const_int 3)))
1729: (match_operand:SI 1 "gpc_reg_operand" ""))
1730: (set (mem:SI (match_dup 0))
1731: (match_dup 2))]
1732: ""
1733: "")
1734:
1735: (define_expand "storehihww"
1736: [(set (match_operand:PSI 3 "register_operand" "")
1737: (truncate:PSI (match_operand:SI 0 "gpc_reg_operand" "")))
1738: (set (match_operand:SI 2 "gpc_reg_operand" "")
1739: (ior:SI (and:SI (not:SI (ashift:SI (const_int 65535)
1740: (ashift:PSI (match_dup 3)
1741: (const_int 3))))
1742: (match_operand:SI 1 "gpc_reg_operand" ""))
1743: (ashift:SI (zero_extend:SI (match_dup 4))
1744: (ashift:PSI (match_dup 3) (const_int 3)))))
1745: (set (mem:SI (and:SI (match_dup 0)
1746: (const_int -3)))
1747: (match_dup 2))]
1748: ""
1749: "
1750: { operands[4] = gen_lowpart (HImode, operands[1]); }")
1751:
1752: (define_expand "movhi"
1753: [(set (match_operand:HI 0 "general_operand" "")
1754: (match_operand:HI 1 "general_operand" ""))]
1755: ""
1756: "
1757: { if (GET_CODE (operands[0]) == MEM)
1758: {
1759: if (! gpc_reg_operand (operands[1], HImode))
1760: operands[1] = copy_to_mode_reg (HImode, operands[1]);
1761: if (! TARGET_DW_ENABLE)
1762: {
1763: rtx general = gen_reg_rtx (SImode);
1764: rtx bp = gen_reg_rtx (PSImode);
1765: rtx (*fcn) ()
1766: = TARGET_BYTE_WRITES ? gen_storehihww : gen_storehinhww;
1767: rtx seq = (*fcn) (XEXP (operands[0], 0),
1768: gen_lowpart (SImode, operands[1]),
1769: general, bp);
1770:
1771: a29k_set_memflags (seq, operands[0]);
1772: emit_insn (seq);
1773: DONE;
1774: }
1775: }
1776: else if (GET_CODE (operands[1]) == MEM)
1777: {
1778: if (! TARGET_DW_ENABLE)
1779: {
1780: rtx general = gen_reg_rtx (SImode);
1781: rtx bp = gen_reg_rtx (PSImode);
1782: rtx seq = gen_loadqi (gen_lowpart (SImode, operands[0]),
1783: XEXP (operands[1], 0), general, bp);
1784:
1785: a29k_set_memflags (seq, operands[1]);
1786: emit_insn (seq);
1787: DONE;
1788: }
1789: }
1790: }")
1791:
1792: (define_expand "reload_inhi"
1793: [(parallel [(match_operand:SI 0 "register_operand" "=r")
1794: (match_operand:SI 1 "reload_memory_operand" "m")
1795: (match_operand:PSI 2 "register_operand" "=b")])]
1796: "! TARGET_DW_ENABLE"
1797: "
1798: { rtx seq = gen_loadhi (gen_lowpart (SImode, operands[0]),
1799: a29k_get_reloaded_address (operands[1]),
1800: gen_rtx (REG, SImode, R_TAV),
1801: operands[2]);
1802:
1803: a29k_set_memflags (seq, operands[1]);
1804: emit_insn (seq);
1805: DONE;
1806: }")
1807:
1808: (define_expand "reload_outhi"
1809: [(parallel [(match_operand:SI 0 "reload_memory_operand" "=m")
1810: (match_operand:SI 1 "register_operand" "m")
1811: (match_operand:PSI 2 "register_operand" "=b")])]
1812: "! TARGET_DW_ENABLE"
1813: "
1814: { rtx (*fcn) () = TARGET_BYTE_WRITES ? gen_storehihww : gen_storehinhww;
1815: rtx seq = (*fcn) (a29k_get_reloaded_address (operands[0]),
1816: gen_lowpart (SImode, operands[1]),
1817: gen_rtx (REG, SImode, R_TAV), operands[2]);
1818:
1819: a29k_set_memflags (seq, operands[0]);
1820: emit_insn (seq);
1821: DONE;
1822: }")
1823:
1824: ;; Subroutines to load/store bytes. Operands 0 and 1 are the output and
1825: ;; input, respectively, except that the address is passed for a MEM instead
1826: ;; of the MEM itself and the short item is passed in QImode.
1827: ;;
1828: ;; Operand 2 is a scratch general register and operand 3 is a scratch register
1829: ;; used for BP. When called before reload, pseudos are passed for both
1830: ;; operands. During reload, R_TAV is used for the general register, and
1831: ;; a reload register of class BR_REGS (R_VP) for BP.
1832: ;;
1833: ;; We have two versions of the store operations, for when byte writes are
1834: ;; supported and when they are not.
1835: (define_expand "loadqi"
1836: [(parallel [(set (match_operand:SI 2 "gpc_reg_operand" "")
1837: (mem:SI (and:SI (match_operand:SI 1 "gpc_reg_operand" "")
1838: (const_int -4))))
1839: (set (match_operand:PSI 3 "register_operand" "")
1840: (truncate:PSI (match_dup 1)))])
1841: (set (match_operand:SI 0 "gpc_reg_operand" "")
1842: (zero_extract:SI (match_dup 2)
1843: (const_int 8)
1844: (ashift:PSI (match_dup 3) (const_int 3))))]
1845: ""
1846: "")
1847:
1848: (define_expand "storeqinhww"
1849: [(parallel [(set (match_operand:SI 2 "gpc_reg_operand" "")
1850: (mem:SI (and:SI (match_operand:SI 0 "gpc_reg_operand" "")
1851: (const_int -4))))
1852: (set (match_operand:PSI 3 "register_operand" "")
1853: (truncate:PSI (match_dup 0)))])
1854: (set (zero_extract:SI (match_dup 2)
1855: (const_int 8)
1856: (ashift:PSI (match_dup 3)
1857: (const_int 3)))
1858: (match_operand:SI 1 "gpc_reg_operand" ""))
1859: (set (mem:SI (match_dup 0))
1860: (match_dup 2))]
1861: ""
1862: "")
1863:
1864: (define_expand "storeqihww"
1865: [(set (match_operand:PSI 3 "register_operand" "")
1866: (truncate:PSI (match_operand:SI 0 "gpc_reg_operand" "")))
1867: (set (match_operand:SI 2 "gpc_reg_operand" "")
1868: (ior:SI (and:SI (not:SI (ashift:SI (const_int 255)
1869: (ashift:PSI (match_dup 3)
1870: (const_int 3))))
1871: (match_operand:SI 1 "gpc_reg_operand" ""))
1872: (ashift:SI (zero_extend:SI (match_dup 4))
1873: (ashift:PSI (match_dup 3)
1874: (const_int 3)))))
1875: (set (mem:SI (and:SI (match_dup 0)
1876: (const_int -4)))
1877: (match_dup 2))]
1878: ""
1879: "
1880: { operands[4] = gen_lowpart (QImode, operands[1]); }")
1881:
1882: (define_expand "movqi"
1883: [(set (match_operand:QI 0 "general_operand" "")
1884: (match_operand:QI 1 "general_operand" ""))]
1885: ""
1886: "
1887: { if (GET_CODE (operands[0]) == MEM)
1888: {
1889: if (! gpc_reg_operand (operands[1], QImode))
1890: operands[1] = copy_to_mode_reg (QImode, operands[1]);
1891: if (! TARGET_DW_ENABLE)
1892: {
1893: rtx general = gen_reg_rtx (SImode);
1894: rtx bp = gen_reg_rtx (PSImode);
1895: rtx (*fcn) ()
1896: = TARGET_BYTE_WRITES ? gen_storeqihww : gen_storeqinhww;
1897: rtx seq = (*fcn) (XEXP (operands[0], 0),
1898: gen_lowpart (SImode, operands[1]),
1899: general, bp);
1900:
1901: a29k_set_memflags (seq, operands[0]);
1902: emit_insn (seq);
1903: }
1904: }
1905: else if (GET_CODE (operands[1]) == MEM)
1906: {
1907: if (! TARGET_DW_ENABLE)
1908: {
1909: rtx general = gen_reg_rtx (SImode);
1910: rtx bp = gen_reg_rtx (PSImode);
1911: rtx seq = gen_loadqi (gen_lowpart (SImode, operands[0]),
1912: XEXP (operands[1], 0), general, bp);
1913:
1914: a29k_set_memflags (seq, operands[1]);
1915: emit_insn (seq);
1916: DONE;
1917: }
1918: }
1919: }")
1920:
1921: (define_expand "reload_inqi"
1922: [(parallel [(match_operand:SI 0 "register_operand" "=r")
1923: (match_operand:SI 1 "reload_memory_operand" "m")
1924: (match_operand:PSI 2 "register_operand" "=b")])]
1925: "! TARGET_DW_ENABLE"
1926: "
1927: { rtx seq = gen_loadqi (gen_lowpart (SImode, operands[0]),
1928: a29k_get_reloaded_address (operands[1]),
1929: gen_rtx (REG, SImode, R_TAV),
1930: operands[2]);
1931:
1932: a29k_set_memflags (seq, operands[1]);
1933: emit_insn (seq);
1934: DONE;
1935: }")
1936:
1937: (define_expand "reload_outqi"
1938: [(parallel [(match_operand:SI 0 "reload_memory_operand" "=m")
1939: (match_operand:SI 1 "register_operand" "m")
1940: (match_operand:PSI 2 "register_operand" "=b")])]
1941: "! TARGET_DW_ENABLE"
1942: "
1943: { rtx (*fcn) () = TARGET_BYTE_WRITES ? gen_storeqihww : gen_storeqinhww;
1944: rtx seq = (*fcn) (a29k_get_reloaded_address (operands[0]),
1945: gen_lowpart (SImode, operands[1]),
1946: gen_rtx (REG, SImode, R_TAV), operands[2]);
1947:
1948: a29k_set_memflags (seq, operands[0]);
1949: emit_insn (seq);
1950: DONE;
1951: }")
1952:
1953: ;; Now the actual insns used to move data around. We include here the
1954: ;; DEFINE_SPLITs that may be needed. In some cases these will be
1955: ;; split again. For floating-point, if we can look inside the constant,
1956: ;; always split it. This can eliminate unnecessary insns.
1957: (define_insn ""
1958: [(set (match_operand:SF 0 "out_operand" "=r,r,r,r,m")
1959: (match_operand:SF 1 "in_operand" "r,E,F,m,r"))]
1960: "(gpc_reg_operand (operands[0], SFmode)
1961: || gpc_reg_operand (operands[1], SFmode))
1962: && ! TARGET_29050"
1963: "@
1964: sll %0,%1,0
1965: #
1966: const %0,%1\;consth %0,%1
1967: load 0,0,%0,%1
1968: store 0,0,%1,%0"
1969: [(set_attr "type" "misc,multi,multi,load,store")])
1970:
1971: (define_insn ""
1972: [(set (match_operand:SF 0 "out_operand" "=r,r,r,r,m,*a,r")
1973: (match_operand:SF 1 "in_operand" "r,E,F,m,r,r,*a"))]
1974: "(gpc_reg_operand (operands[0], SFmode)
1975: || gpc_reg_operand (operands[1], SFmode))
1976: && TARGET_29050"
1977: "@
1978: sll %0,%1,0
1979: #
1980: const %0,%1\;consth %0,%1
1981: load 0,0,%0,%1
1982: store 0,0,%1,%0
1983: mtacc %1,1,%0
1984: mfacc %0,1,%1"
1985: [(set_attr "type" "misc,multi,multi,load,store,fadd,fadd")])
1986:
1987: ;; Turn this into SImode. It will then be split up that way.
1988: (define_split
1989: [(set (match_operand:SF 0 "register_operand" "")
1990: (match_operand:SF 1 "float_const_operand" ""))]
1991: "HOST_FLOAT_FORMAT == TARGET_FLOAT_FORMAT"
1992: [(set (match_dup 0)
1993: (match_dup 1))]
1994: "
1995: { operands[0] = operand_subword (operands[0], 0, 0, SFmode);
1996: operands[1] = operand_subword (operands[1], 0, 0, SFmode);
1997:
1998: if (operands[0] == 0 || operands[1] == 0)
1999: FAIL;
2000: }")
2001:
2002: (define_insn ""
2003: [(set (match_operand:DF 0 "out_operand" "=?r,?r,r,m")
2004: (match_operand:DF 1 "in_operand" "rE,F,m,r"))
2005: (clobber (match_scratch:PSI 2 "=X,X,&c,&c"))]
2006: "(gpc_reg_operand (operands[0], DFmode)
2007: || gpc_reg_operand (operands[1], DFmode))
2008: && ! TARGET_29050"
2009: "@
2010: #
2011: const %0,%1\;consth %0,%1\;const %L0,%L1\;consth %L0,%L1
2012: mtsrim cr,1\;loadm 0,0,%0,%1
2013: mtsrim cr,1\;storem 0,0,%1,%0"
2014: [(set_attr "type" "multi")])
2015:
2016: (define_insn ""
2017: [(set (match_operand:DF 0 "out_operand" "=?r,?r,r,m,?*a,?r")
2018: (match_operand:DF 1 "in_operand" "rE,F,m,r,r,*a"))
2019: (clobber (match_scratch:PSI 2 "=X,X,&c,&c,X,X"))]
2020: "(gpc_reg_operand (operands[0], DFmode)
2021: || gpc_reg_operand (operands[1], DFmode))
2022: && TARGET_29050"
2023: "@
2024: #
2025: const %0,%1\;consth %0,%1\;const %L0,%L1\;consth %L0,%L1
2026: mtsrim cr,1\;loadm 0,0,%0,%1
2027: mtsrim cr,1\;storem 0,0,%1,%0
2028: mtacc %1,2,%0
2029: mfacc %0,2,%1"
2030: [(set_attr "type" "multi,multi,multi,multi,fadd,fadd")])
2031:
2032: ;; Split register-register copies and constant loads into two SImode loads,
2033: ;; one for each word. In the constant case, they will get further split.
2034: ;; Don't so this until register allocation, though, since it will
2035: ;; interfere with register allocation. Normally copy the lowest-addressed
2036: ;; word first; the exception is if we are copying register to register and
2037: ;; the lowest register of the first operand is the highest register of the
2038: ;; second operand.
2039: (define_split
2040: [(set (match_operand:DF 0 "gpc_reg_operand" "")
2041: (match_operand:DF 1 "gpc_reg_or_float_constant_operand" ""))
2042: (clobber (match_scratch:PSI 2 ""))]
2043: "reload_completed"
2044: [(set (match_dup 3) (match_dup 4))
2045: (set (match_dup 5) (match_dup 6))]
2046: "
2047: { if (GET_CODE (operands[1]) == REG
2048: && REGNO (operands[0]) == REGNO (operands[1]) + 1)
2049: {
2050: operands[3] = operand_subword (operands[0], 1, 1, DFmode);
2051: operands[4] = operand_subword (operands[1], 1, 1, DFmode);
2052: operands[5] = operand_subword (operands[0], 0, 1, DFmode);
2053: operands[6] = operand_subword (operands[1], 0, 1, DFmode);
2054: }
2055: else
2056: {
2057: operands[3] = operand_subword (operands[0], 0, 1, DFmode);
2058: operands[4] = operand_subword (operands[1], 0, 1, DFmode);
2059: operands[5] = operand_subword (operands[0], 1, 1, DFmode);
2060: operands[6] = operand_subword (operands[1], 1, 1, DFmode);
2061: }
2062:
2063: if (operands[3] == 0 || operands[4] == 0
2064: || operands[5] == 0 || operands[6] == 0)
2065: FAIL;
2066: }")
2067:
2068: ;; Split memory loads and stores into the MTSR and LOADM/STOREM.
2069: (define_split
2070: [(set (match_operand:DF 0 "out_operand" "")
2071: (match_operand:DF 1 "in_operand" ""))
2072: (clobber (reg:PSI 179))]
2073: "TARGET_NO_STOREM_BUG
2074: && (memory_operand (operands[0], DFmode)
2075: || memory_operand (operands[1], DFmode))"
2076: [(set (reg:PSI 179) (const_int 1))
2077: (parallel [(set (match_dup 0) (match_dup 1))
2078: (use (reg:PSI 179))
2079: (clobber (reg:PSI 179))])]
2080: "")
2081:
2082: ;; DI move is similar to DF move.
2083: (define_insn ""
2084: [(set (match_operand:DI 0 "out_operand" "=?r,r,m")
2085: (match_operand:DI 1 "in_operand" "rn,m,r"))
2086: (clobber (match_scratch:PSI 2 "=X,&c,&c"))]
2087: "(gpc_reg_operand (operands[0], DImode)
2088: || gpc_reg_operand (operands[1], DImode))"
2089: "@
2090: #
2091: mtsrim cr,1\;loadm 0,0,%0,%1
2092: mtsrim cr,1\;storem 0,0,%1,%0"
2093: [(set_attr "type" "multi")])
2094:
2095: (define_split
2096: [(set (match_operand:DI 0 "gpc_reg_operand" "")
2097: (match_operand:DI 1 "gpc_reg_or_integer_constant_operand" ""))
2098: (clobber (match_scratch:PSI 2 ""))]
2099: "reload_completed"
2100: [(set (match_dup 3) (match_dup 4))
2101: (set (match_dup 5) (match_dup 6))]
2102: "
2103: { if (GET_CODE (operands[1]) == REG
2104: && REGNO (operands[0]) == REGNO (operands[1]) + 1)
2105: {
2106: operands[3] = operand_subword (operands[0], 1, 1, DImode);
2107: operands[4] = operand_subword (operands[1], 1, 1, DImode);
2108: operands[5] = operand_subword (operands[0], 0, 1, DImode);
2109: operands[6] = operand_subword (operands[1], 0, 1, DImode);
2110: }
2111: else
2112: {
2113: operands[3] = operand_subword (operands[0], 0, 1, DImode);
2114: operands[4] = operand_subword (operands[1], 0, 1, DImode);
2115: operands[5] = operand_subword (operands[0], 1, 1, DImode);
2116: operands[6] = operand_subword (operands[1], 1, 1, DImode);
2117: }
2118: }")
2119:
2120: (define_split
2121: [(set (match_operand:DI 0 "out_operand" "")
2122: (match_operand:DI 1 "in_operand" ""))
2123: (clobber (reg:PSI 179))]
2124: "TARGET_NO_STOREM_BUG
2125: && (memory_operand (operands[0], DImode)
2126: || memory_operand (operands[1], DImode))"
2127: [(set (reg:PSI 179) (const_int 1))
2128: (parallel [(set (match_dup 0) (match_dup 1))
2129: (use (reg:PSI 179))
2130: (clobber (reg:PSI 179))])]
2131: "")
2132:
2133: ;; TImode moves are very similar to DImode moves, except that we can't
2134: ;; have constants.
2135: (define_insn ""
2136: [(set (match_operand:TI 0 "out_operand" "=?r,r,m")
2137: (match_operand:TI 1 "in_operand" "r,m,r"))
2138: (clobber (match_scratch:PSI 2 "=X,&c,&c"))]
2139: "(gpc_reg_operand (operands[0], TImode)
2140: || gpc_reg_operand (operands[1], TImode))"
2141: "@
2142: #
2143: mtsrim cr,3\;loadm 0,0,%0,%1
2144: mtsrim cr,3\;storem 0,0,%1,%0"
2145: [(set_attr "type" "multi,multi,multi")])
2146:
2147: (define_split
2148: [(set (match_operand:TI 0 "gpc_reg_operand" "")
2149: (match_operand:TI 1 "gpc_reg_operand" ""))
2150: (clobber (match_scratch:PSI 2 ""))]
2151: "reload_completed"
2152: [(set (match_dup 3) (match_dup 4))
2153: (set (match_dup 5) (match_dup 6))
2154: (set (match_dup 7) (match_dup 8))
2155: (set (match_dup 9) (match_dup 10))]
2156: "
2157: {
2158: if (REGNO (operands[0]) >= REGNO (operands[1]) + 1
2159: && REGNO (operands[0]) <= REGNO (operands[1]) + 3)
2160: {
2161: operands[3] = gen_rtx (REG, SImode, REGNO (operands[0]) + 3);
2162: operands[4] = gen_rtx (REG, SImode, REGNO (operands[1]) + 3);
2163: operands[5] = gen_rtx (REG, SImode, REGNO (operands[0]) + 2);
2164: operands[6] = gen_rtx (REG, SImode, REGNO (operands[1]) + 2);
2165: operands[7] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1);
2166: operands[8] = gen_rtx (REG, SImode, REGNO (operands[1]) + 1);
2167: operands[9] = gen_rtx (REG, SImode, REGNO (operands[0]));
2168: operands[10] = gen_rtx (REG, SImode, REGNO (operands[1]));
2169: }
2170: else
2171: {
2172: operands[3] = gen_rtx (REG, SImode, REGNO (operands[0]));
2173: operands[4] = gen_rtx (REG, SImode, REGNO (operands[1]));
2174: operands[5] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1);
2175: operands[6] = gen_rtx (REG, SImode, REGNO (operands[1]) + 1);
2176: operands[7] = gen_rtx (REG, SImode, REGNO (operands[0]) + 2);
2177: operands[8] = gen_rtx (REG, SImode, REGNO (operands[1]) + 2);
2178: operands[9] = gen_rtx (REG, SImode, REGNO (operands[0]) + 3);
2179: operands[10] = gen_rtx (REG, SImode, REGNO (operands[1]) + 3);
2180: }
2181: }")
2182:
2183: (define_split
2184: [(set (match_operand:TI 0 "out_operand" "")
2185: (match_operand:TI 1 "in_operand" ""))
2186: (clobber (reg:PSI 179))]
2187: "TARGET_NO_STOREM_BUG
2188: && (memory_operand (operands[0], TImode)
2189: || memory_operand (operands[1], TImode))"
2190: [(set (reg:PSI 179) (const_int 3))
2191: (parallel [(set (match_dup 0) (match_dup 1))
2192: (use (reg:PSI 179))
2193: (clobber (reg:PSI 179))])]
2194: "")
2195:
2196: (define_insn ""
2197: [(set (match_operand:SI 0 "out_operand" "=r,r,r,r,r,r,r,m,*h,*h")
2198: (match_operand:SI 1 "in_operand" "r,J,M,O,i,m,*h,r,r,J"))]
2199: "(gpc_reg_operand (operands[0], SImode)
2200: || gpc_reg_operand (operands[1], SImode)
2201: || (spec_reg_operand (operands[0], SImode)
2202: && cint_16_operand (operands[1], SImode)))
2203: && ! TARGET_29050"
2204: "@
2205: sll %0,%1,0
2206: const %0,%1
2207: constn %0,%M1
2208: cpeq %0,gr1,gr1
2209: #
2210: load 0,0,%0,%1
2211: mfsr %0,%1
2212: store 0,0,%1,%0
2213: mtsr %0,%1
2214: mtsrim %0,%1"
2215: [(set_attr "type" "misc,misc,misc,misc,multi,load,misc,store,misc,misc")])
2216:
2217: (define_insn ""
2218: [(set (match_operand:SI 0 "out_operand" "=r,r,r,r,r,r,r,m,*h,*h")
2219: (match_operand:SI 1 "in_operand" "r,J,M,O,i,m,*h,r,r,J"))]
2220: "(gpc_reg_operand (operands[0], SImode)
2221: || gpc_reg_operand (operands[1], SImode)
2222: || (spec_reg_operand (operands[0], SImode)
2223: && cint_16_operand (operands[1], SImode)))
2224: && TARGET_29050"
2225: "@
2226: sll %0,%1,0
2227: const %0,%1
2228: constn %0,%M1
2229: consthz %0,%1
2230: #
2231: load 0,0,%0,%1
2232: mfsr %0,%1
2233: store 0,0,%1,%0
2234: mtsr %0,%1
2235: mtsrim %0,%1"
2236: [(set_attr "type" "misc,misc,misc,misc,multi,load,misc,store,misc,misc")])
2237:
2238: (define_insn ""
2239: [(set (match_operand:PSI 0 "out_operand" "=*r,*r,*r,*r,m,h,h")
2240: (match_operand:PSI 1 "in_operand" "r,i,m,h,r,r,J"))]
2241: "(gpc_reg_operand (operands[0], PSImode)
2242: || gpc_reg_operand (operands[1], PSImode)
2243: || (spec_reg_operand (operands[0], PSImode)
2244: && cint_16_operand (operands[1], PSImode)))"
2245: "@
2246: sll %0,%1,0
2247: const %0,%1
2248: load 0,0,%0,%1
2249: mfsr %0,%1
2250: store 0,0,%1,%0
2251: mtsr %0,%1
2252: mtsrim %0,%1"
2253: [(set_attr "type" "misc,multi,load,misc,store,misc,misc")])
2254:
2255: (define_insn ""
2256: [(set (match_operand:HI 0 "out_operand" "=r,r,r,m,r,*h,*h")
2257: (match_operand:HI 1 "in_operand" "r,i,m,r,*h,r,i"))]
2258: "gpc_reg_operand (operands[0], HImode)
2259: || gpc_reg_operand (operands[1], HImode)
2260: || (spec_reg_operand (operands[0], HImode)
2261: && cint_16_operand (operands[1], HImode))"
2262: "@
2263: sll %0,%1,0
2264: const %0,%1
2265: load 0,2,%0,%1
2266: store 0,2,%1,%0
2267: mfsr %0,%1
2268: mtsr %0,%1
2269: mtsrim %0,%1"
2270: [(set_attr "type" "misc,misc,load,store,misc,misc,misc")])
2271:
2272: (define_insn ""
2273: [(set (match_operand:QI 0 "out_operand" "=r,r,r,m,r,*h,*h")
2274: (match_operand:QI 1 "in_operand" "r,i,m,r,*h,r,i"))]
2275: "gpc_reg_operand (operands[0], QImode)
2276: || gpc_reg_operand (operands[1], QImode)
2277: || (spec_reg_operand (operands[0], HImode)
2278: && cint_16_operand (operands[1], HImode))"
2279: "@
2280: sll %0,%1,0
2281: const %0,%1
2282: load 0,1,%0,%1
2283: store 0,1,%1,%0
2284: mfsr %0,%1
2285: mtsr %0,%1
2286: mtsrim %0,%1"
2287: [(set_attr "type" "misc,misc,load,store,misc,misc,misc")])
2288:
2289: ;; Define move insns for DI, TI, SF, and DF.
2290: ;;
2291: ;; In no case do we support mem->mem directly.
2292: ;;
2293: ;; For DI move of constant to register, split apart at this time since these
2294: ;; can require anywhere from 2 to 4 insns and determining which is complex.
2295: ;;
2296: ;; In other cases, handle similarly to SImode moves.
2297: ;;
2298: ;; However, indicate that DI, TI, and DF moves may clobber CR (reg 179).
2299: (define_expand "movdi"
2300: [(parallel [(set (match_operand:DI 0 "general_operand" "")
2301: (match_operand:DI 1 "general_operand" ""))
2302: (clobber (scratch:PSI))])]
2303: ""
2304: "
2305: {
2306: if (GET_CODE (operands[0]) == MEM)
2307: operands[1] = force_reg (DImode, operands[1]);
2308: }")
2309:
2310: (define_expand "movsf"
2311: [(set (match_operand:SF 0 "general_operand" "")
2312: (match_operand:SF 1 "general_operand" ""))]
2313: ""
2314: "
2315: { if (GET_CODE (operands[0]) == MEM)
2316: operands[1] = force_reg (SFmode, operands[1]);
2317: }")
2318:
2319: (define_expand "movdf"
2320: [(parallel [(set (match_operand:DF 0 "general_operand" "")
2321: (match_operand:DF 1 "general_operand" ""))
2322: (clobber (scratch:PSI))])]
2323: ""
2324: "
2325: { if (GET_CODE (operands[0]) == MEM)
2326: operands[1] = force_reg (DFmode, operands[1]);
2327: }")
2328:
2329: (define_expand "movti"
2330: [(parallel [(set (match_operand:TI 0 "general_operand" "")
2331: (match_operand:TI 1 "general_operand" ""))
2332: (clobber (scratch:PSI))])]
2333: ""
2334: "
2335: {
2336: if (GET_CODE (operands[0]) == MEM)
2337: operands[1] = force_reg (TImode, operands[1]);
2338:
2339: /* We can't handle constants in general because there is no rtl to represent
2340: 128 bit constants. Splitting happens to work for CONST_INTs so we split
2341: them for good code. Other constants will get forced to memory. */
2342:
2343: if (GET_CODE (operands[1]) == CONST_INT)
2344: {
2345: rtx part0, part1, part2, part3;
2346:
2347: part0 = operand_subword (operands[0], 0, 1, TImode);
2348: part1 = operand_subword (operands[0], 1, 1, TImode);
2349: part2 = operand_subword (operands[0], 2, 1, TImode);
2350: part3 = operand_subword (operands[0], 3, 1, TImode);
2351:
2352: emit_move_insn (part0, const0_rtx);
2353: emit_move_insn (part1, const0_rtx);
2354: emit_move_insn (part2, const0_rtx);
2355: emit_move_insn (part3, const0_rtx);
2356:
2357: DONE;
2358: }
2359: else if (CONSTANT_P (operands[1]))
2360: {
2361: operands[1] = force_const_mem (TImode, operands[1]);
2362: if (! memory_address_p (TImode, XEXP (operands[1], 0))
2363: && ! reload_in_progress)
2364: operands[1] = change_address (operands[1], TImode,
2365: XEXP (operands[1], 0));
2366: }
2367: }")
2368:
2369: ;; Here are the variants of the above for use during reload.
2370:
2371: (define_expand "reload_indf"
2372: [(parallel [(set (match_operand:DF 0 "register_operand" "=r")
2373: (match_operand:DF 1 "reload_memory_operand" "m"))
2374: (clobber (match_operand:PSI 2 "register_operand" "=&c"))])]
2375: ""
2376: "")
2377:
2378: (define_expand "reload_outdf"
2379: [(parallel [(set (match_operand:DF 0 "reload_memory_operand" "=m")
2380: (match_operand:DF 1 "register_operand" "r"))
2381: (clobber (match_operand:PSI 2 "register_operand" "=&c"))])]
2382: ""
2383: "")
2384:
2385: (define_expand "reload_indi"
2386: [(parallel [(set (match_operand:DI 0 "register_operand" "=r")
2387: (match_operand:DI 1 "reload_memory_operand" "m"))
2388: (clobber (match_operand:PSI 2 "register_operand" "=&c"))])]
2389: ""
2390: "")
2391:
2392: (define_expand "reload_outdi"
2393: [(parallel [(set (match_operand:DI 0 "reload_memory_operand" "=m")
2394: (match_operand:DI 1 "register_operand" "r"))
2395: (clobber (match_operand:PSI 2 "register_operand" "=&c"))])]
2396: ""
2397: "")
2398:
2399: (define_expand "reload_inti"
2400: [(parallel [(set (match_operand:TI 0 "register_operand" "=r")
2401: (match_operand:TI 1 "reload_memory_operand" "m"))
2402: (clobber (match_operand:PSI 2 "register_operand" "=&c"))])]
2403: ""
2404: "")
2405:
2406: (define_expand "reload_outti"
2407: [(parallel [(set (match_operand:TI 0 "reload_memory_operand" "=m")
2408: (match_operand:TI 1 "register_operand" "r"))
2409: (clobber (match_operand:PSI 2 "register_operand" "=&c"))])]
2410: ""
2411: "")
2412:
2413: ;; For compare operations, we simply store the comparison operands and
2414: ;; do nothing else. The following branch or scc insn will output whatever
2415: ;; is needed.
2416: (define_expand "cmpsi"
2417: [(set (cc0)
2418: (compare (match_operand:SI 0 "gpc_reg_operand" "")
2419: (match_operand:SI 1 "srcb_operand" "")))]
2420: ""
2421: "
2422: {
2423: a29k_compare_op0 = operands[0];
2424: a29k_compare_op1 = operands[1];
2425: a29k_compare_fp_p = 0;
2426: DONE;
2427: }")
2428:
2429: (define_expand "cmpsf"
2430: [(set (cc0)
2431: (compare (match_operand:SF 0 "gpc_reg_operand" "")
2432: (match_operand:SF 1 "gpc_reg_operand" "")))]
2433: ""
2434: "
2435: {
2436: a29k_compare_op0 = operands[0];
2437: a29k_compare_op1 = operands[1];
2438: a29k_compare_fp_p = 1;
2439: DONE;
2440: }")
2441:
2442: (define_expand "cmpdf"
2443: [(set (cc0)
2444: (compare (match_operand:DF 0 "gpc_reg_operand" "")
2445: (match_operand:DF 1 "gpc_reg_operand" "")))]
2446: ""
2447: "
2448: {
2449: a29k_compare_op0 = operands[0];
2450: a29k_compare_op1 = operands[1];
2451: a29k_compare_fp_p = 1;
2452: DONE;
2453: }")
2454:
2455: ;; We can generate bit-tests better if we use NE instead of EQ, but we
2456: ;; don't have an NE for floating-point. So we have to have two patterns
2457: ;; for EQ and two for NE.
2458:
2459: (define_expand "beq"
2460: [(set (match_dup 1) (ne:SI (match_dup 2) (match_dup 3)))
2461: (set (pc)
2462: (if_then_else (ge (match_dup 1) (const_int 0))
2463: (label_ref (match_operand 0 "" ""))
2464: (pc)))]
2465: ""
2466: "
2467: {
2468: if (GET_MODE_CLASS (GET_MODE (a29k_compare_op0)) == MODE_FLOAT)
2469: {
2470: emit_insn (gen_beq_fp (operands[0]));
2471: DONE;
2472: }
2473:
2474: operands[1] = gen_reg_rtx (SImode);
2475: operands[2] = a29k_compare_op0;
2476: operands[3] = a29k_compare_op1;
2477: }")
2478:
2479: (define_expand "beq_fp"
2480: [(set (match_dup 1) (eq:SI (match_dup 2) (match_dup 3)))
2481: (set (pc)
2482: (if_then_else (lt (match_dup 1) (const_int 0))
2483: (label_ref (match_operand 0 "" ""))
2484: (pc)))]
2485: ""
2486: "
2487: {
2488: operands[1] = gen_reg_rtx (SImode);
2489: operands[2] = a29k_compare_op0;
2490: operands[3] = a29k_compare_op1;
2491: }")
2492:
2493: (define_expand "bne"
2494: [(set (match_dup 1) (ne:SI (match_dup 2) (match_dup 3)))
2495: (set (pc)
2496: (if_then_else (lt (match_dup 1) (const_int 0))
2497: (label_ref (match_operand 0 "" ""))
2498: (pc)))]
2499: ""
2500: "
2501: {
2502: if (GET_MODE_CLASS (GET_MODE (a29k_compare_op0)) == MODE_FLOAT)
2503: {
2504: emit_insn (gen_bne_fp (operands[0]));
2505: DONE;
2506: }
2507:
2508: operands[1] = gen_reg_rtx (SImode);
2509: operands[2] = a29k_compare_op0;
2510: operands[3] = a29k_compare_op1;
2511: }")
2512:
2513: (define_expand "bne_fp"
2514: [(set (match_dup 1) (eq:SI (match_dup 2) (match_dup 3)))
2515: (set (pc)
2516: (if_then_else (ge (match_dup 1) (const_int 0))
2517: (label_ref (match_operand 0 "" ""))
2518: (pc)))]
2519: ""
2520: "
2521: {
2522: operands[1] = gen_reg_rtx (SImode);
2523: operands[2] = a29k_compare_op0;
2524: operands[3] = a29k_compare_op1;
2525: }")
2526:
2527: ;; We don't have a floating-point "lt" insn, so we have to use "gt" in that
2528: ;; case with the operands swapped. The operands must both be registers in
2529: ;; the floating-point case, so we know that swapping them is OK.
2530: (define_expand "blt"
2531: [(set (match_dup 1) (match_dup 2))
2532: (set (pc)
2533: (if_then_else (lt (match_dup 1) (const_int 0))
2534: (label_ref (match_operand 0 "" ""))
2535: (pc)))]
2536: ""
2537: "
2538: {
2539: operands[1] = gen_reg_rtx (SImode);
2540: if (a29k_compare_fp_p)
2541: operands[2] = gen_rtx (GT, SImode, a29k_compare_op1, a29k_compare_op0);
2542: else
2543: operands[2] = gen_rtx (LT, SImode, a29k_compare_op0, a29k_compare_op1);
2544: }")
2545:
2546: ;; Similarly for "le".
2547: (define_expand "ble"
2548: [(set (match_dup 1) (match_dup 2))
2549: (set (pc)
2550: (if_then_else (lt (match_dup 1) (const_int 0))
2551: (label_ref (match_operand 0 "" ""))
2552: (pc)))]
2553: ""
2554: "
2555: {
2556: operands[1] = gen_reg_rtx (SImode);
2557: if (a29k_compare_fp_p)
2558: operands[2] = gen_rtx (GE, SImode, a29k_compare_op1, a29k_compare_op0);
2559: else
2560: operands[2] = gen_rtx (LE, SImode, a29k_compare_op0, a29k_compare_op1);
2561: }")
2562:
2563: (define_expand "bltu"
2564: [(set (match_dup 1) (ltu:SI (match_dup 2) (match_dup 3)))
2565: (set (pc)
2566: (if_then_else (lt (match_dup 1) (const_int 0))
2567: (label_ref (match_operand 0 "" ""))
2568: (pc)))]
2569: ""
2570: "
2571: {
2572: operands[1] = gen_reg_rtx (SImode);
2573: operands[2] = a29k_compare_op0;
2574: operands[3] = a29k_compare_op1;
2575: }")
2576:
2577: (define_expand "bleu"
2578: [(set (match_dup 1) (leu:SI (match_dup 2) (match_dup 3)))
2579: (set (pc)
2580: (if_then_else (lt (match_dup 1) (const_int 0))
2581: (label_ref (match_operand 0 "" ""))
2582: (pc)))]
2583: ""
2584: "
2585: {
2586: operands[1] = gen_reg_rtx (SImode);
2587: operands[2] = a29k_compare_op0;
2588: operands[3] = a29k_compare_op1;
2589: }")
2590:
2591: (define_expand "bgt"
2592: [(set (match_dup 1) (gt:SI (match_dup 2) (match_dup 3)))
2593: (set (pc)
2594: (if_then_else (lt (match_dup 1) (const_int 0))
2595: (label_ref (match_operand 0 "" ""))
2596: (pc)))]
2597: ""
2598: "
2599: {
2600: operands[1] = gen_reg_rtx (SImode);
2601: operands[2] = a29k_compare_op0;
2602: operands[3] = a29k_compare_op1;
2603: }")
2604:
2605: (define_expand "bge"
2606: [(set (match_dup 1) (ge:SI (match_dup 2) (match_dup 3)))
2607: (set (pc)
2608: (if_then_else (lt (match_dup 1) (const_int 0))
2609: (label_ref (match_operand 0 "" ""))
2610: (pc)))]
2611: ""
2612: "
2613: {
2614: operands[1] = gen_reg_rtx (SImode);
2615: operands[2] = a29k_compare_op0;
2616: operands[3] = a29k_compare_op1;
2617: }")
2618:
2619: (define_expand "bgtu"
2620: [(set (match_dup 1) (gtu:SI (match_dup 2) (match_dup 3)))
2621: (set (pc)
2622: (if_then_else (lt (match_dup 1) (const_int 0))
2623: (label_ref (match_operand 0 "" ""))
2624: (pc)))]
2625: ""
2626: "
2627: {
2628: operands[1] = gen_reg_rtx (SImode);
2629: operands[2] = a29k_compare_op0;
2630: operands[3] = a29k_compare_op1;
2631: }")
2632:
2633: (define_expand "bgeu"
2634: [(set (match_dup 1) (geu:SI (match_dup 2) (match_dup 3)))
2635: (set (pc)
2636: (if_then_else (lt (match_dup 1) (const_int 0))
2637: (label_ref (match_operand 0 "" ""))
2638: (pc)))]
2639: ""
2640: "
2641: {
2642: operands[1] = gen_reg_rtx (SImode);
2643: operands[2] = a29k_compare_op0;
2644: operands[3] = a29k_compare_op1;
2645: }")
2646:
2647: (define_expand "seq"
2648: [(set (match_operand:SI 0 "gpc_reg_operand" "")
2649: (eq:SI (match_dup 1) (match_dup 2)))]
2650: ""
2651: "
2652: {
2653: operands[1] = a29k_compare_op0;
2654: operands[2] = a29k_compare_op1;
2655: }")
2656:
2657: ;; This is the most complicated case, because we don't have a floating-point
2658: ;; "ne" insn. If integer, handle normally. If floating-point, write the
2659: ;; compare and then write an insn to reverse the test.
2660: (define_expand "sne_fp"
2661: [(set (match_dup 3)
2662: (eq:SI (match_operand 1 "gpc_reg_operand" "")
2663: (match_operand 2 "gpc_reg_operand" "")))
2664: (set (match_operand:SI 0 "gpc_reg_operand" "")
2665: (ge:SI (match_dup 3) (const_int 0)))]
2666: ""
2667: "
2668: { operands[3] = gen_reg_rtx (SImode);
2669: }");
2670:
2671: (define_expand "sne"
2672: [(set (match_operand:SI 0 "gpc_reg_operand" "")
2673: (ne:SI (match_dup 1) (match_dup 2)))]
2674: ""
2675: "
2676: {
2677: operands[1] = a29k_compare_op0;
2678: operands[2] = a29k_compare_op1;
2679:
2680: if (a29k_compare_fp_p)
2681: {
2682: emit_insn (gen_sne_fp (operands[0], operands[1], operands[2]));
2683: DONE;
2684: }
2685: }")
2686:
2687: ;; We don't have a floating-point "lt" insn, so use "gt" and swap the
2688: ;; operands, the same as we do "blt".
2689: (define_expand "slt"
2690: [(set (match_operand:SI 0 "gpc_reg_operand" "")
2691: (match_dup 1))]
2692: ""
2693: "
2694: {
2695: if (a29k_compare_fp_p)
2696: operands[1] = gen_rtx (GT, SImode, a29k_compare_op1, a29k_compare_op0);
2697: else
2698: operands[1] = gen_rtx (LT, SImode, a29k_compare_op0, a29k_compare_op1);
2699: }")
2700:
2701: ;; Similarly for "le"
2702: (define_expand "sle"
2703: [(set (match_operand:SI 0 "gpc_reg_operand" "")
2704: (match_dup 1))]
2705: ""
2706: "
2707: {
2708: if (a29k_compare_fp_p)
2709: operands[1] = gen_rtx (GE, SImode, a29k_compare_op1, a29k_compare_op0);
2710: else
2711: operands[1] = gen_rtx (LE, SImode, a29k_compare_op0, a29k_compare_op1);
2712: }")
2713:
2714: (define_expand "sltu"
2715: [(set (match_operand:SI 0 "gpc_reg_operand" "")
2716: (ltu:SI (match_dup 1) (match_dup 2)))]
2717: ""
2718: "
2719: {
2720: operands[1] = a29k_compare_op0;
2721: operands[2] = a29k_compare_op1;
2722: }")
2723:
2724: (define_expand "sleu"
2725: [(set (match_operand:SI 0 "gpc_reg_operand" "")
2726: (leu:SI (match_dup 1) (match_dup 2)))]
2727: ""
2728: "
2729: {
2730: operands[1] = a29k_compare_op0;
2731: operands[2] = a29k_compare_op1;
2732: }")
2733:
2734: (define_expand "sgt"
2735: [(set (match_operand:SI 0 "gpc_reg_operand" "")
2736: (gt:SI (match_dup 1) (match_dup 2)))]
2737: ""
2738: "
2739: {
2740: operands[1] = a29k_compare_op0;
2741: operands[2] = a29k_compare_op1;
2742: }")
2743:
2744: (define_expand "sge"
2745: [(set (match_operand:SI 0 "gpc_reg_operand" "")
2746: (ge:SI (match_dup 1) (match_dup 2)))]
2747: ""
2748: "
2749: {
2750: operands[1] = a29k_compare_op0;
2751: operands[2] = a29k_compare_op1;
2752: }")
2753:
2754: (define_expand "sgtu"
2755: [(set (match_operand:SI 0 "gpc_reg_operand" "")
2756: (gtu:SI (match_dup 1) (match_dup 2)))]
2757: ""
2758: "
2759: {
2760: operands[1] = a29k_compare_op0;
2761: operands[2] = a29k_compare_op1;
2762: }")
2763:
2764: (define_expand "sgeu"
2765: [(set (match_operand:SI 0 "gpc_reg_operand" "")
2766: (geu:SI (match_dup 1) (match_dup 2)))]
2767: ""
2768: "
2769: {
2770: operands[1] = a29k_compare_op0;
2771: operands[2] = a29k_compare_op1;
2772: }")
2773:
2774: ;; Now define the actual jump insns.
2775: (define_insn ""
2776: [(set (pc)
2777: (if_then_else (match_operator 0 "branch_operator"
2778: [(match_operand:SI 1 "gpc_reg_operand" "r")
2779: (const_int 0)])
2780: (label_ref (match_operand 2 "" ""))
2781: (pc)))]
2782: ""
2783: "jmp%b0 %1,%l2%#"
2784: [(set_attr "type" "branch")])
2785:
2786: (define_insn ""
2787: [(set (pc)
2788: (if_then_else (match_operator 0 "branch_operator"
2789: [(match_operand:SI 1 "gpc_reg_operand" "r")
2790: (const_int 0)])
2791: (return)
2792: (pc)))]
2793: "null_epilogue ()"
2794: "jmp%b0i %1,lr0%#"
2795: [(set_attr "type" "branch")])
2796:
2797: (define_insn ""
2798: [(set (pc)
2799: (if_then_else (match_operator 0 "branch_operator"
2800: [(match_operand:SI 1 "gpc_reg_operand" "r")
2801: (const_int 0)])
2802: (pc)
2803: (label_ref (match_operand 2 "" ""))))]
2804: ""
2805: "jmp%B0 %1,%l2%#"
2806: [(set_attr "type" "branch")])
2807:
2808: (define_insn ""
2809: [(set (pc)
2810: (if_then_else (match_operator 0 "branch_operator"
2811: [(match_operand:SI 1 "gpc_reg_operand" "r")
2812: (const_int 0)])
2813: (pc)
2814: (return)))]
2815: "null_epilogue ()"
2816: "jmp%B0i %1,lr0%#"
2817: [(set_attr "type" "branch")])
2818:
2819: (define_insn "jump"
2820: [(set (pc)
2821: (label_ref (match_operand 0 "" "")))]
2822: ""
2823: "jmp %e0%E0"
2824: [(set_attr "type" "branch")])
2825:
2826: (define_insn "return"
2827: [(return)]
2828: "null_epilogue ()"
2829: "jmpi lr0%#"
2830: [(set_attr "type" "branch")])
2831:
2832: (define_insn "indirect_jump"
2833: [(set (pc)
2834: (match_operand:SI 0 "gpc_reg_operand" "r"))]
2835: ""
2836: "jmpi %0%#"
2837: [(set_attr "type" "branch")])
2838:
2839: (define_insn "tablejump"
2840: [(set (pc)
2841: (match_operand:SI 0 "gpc_reg_operand" "r"))
2842: (use (label_ref (match_operand 1 "" "")))]
2843: ""
2844: "jmpi %0%#"
2845: [(set_attr "type" "branch")])
2846:
2847: ;; JMPFDEC
2848: (define_insn ""
2849: [(set (pc)
2850: (if_then_else (ge (match_operand:SI 0 "gpc_reg_operand" "r")
2851: (const_int 0))
2852: (label_ref (match_operand 1 "" ""))
2853: (pc)))
2854: (set (match_dup 0)
2855: (plus:SI (match_dup 0)
2856: (const_int -1)))]
2857: ""
2858: "jmpfdec %0,%l1%#"
2859: [(set_attr "type" "branch")])
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.