|
|
1.1 root 1: ;;- Machine description for IBM RISC System 6000 (POWER) for GNU C compiler
2: ;; Copyright (C) 1990, 1991 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: ;; Define an insn type attribute. This is used in function unit delay
24: ;; computations.
25: (define_attr "type" "load,integer,fp,compare,delayed_compare,fpcompare"
26: (const_string "integer"))
27:
28: ;; Memory delivers its result in two cycles.
29: (define_function_unit "memory" 1 0 (eq_attr "type" "load") 2 0)
30:
31: ;; We consider floating-point insns to deliver their result in two cycles
32: ;; to try to intersperse integer and FP operations.
33: (define_function_unit "fp" 1 0 (eq_attr "type" "fp,fpcompare") 2 0)
34:
35: ;; Most integer comparisons are ready in four cycles (a stall of three).
36: (define_function_unit "compare" 1 0 (eq_attr "type" "compare") 4 0)
37:
38: ;; Some integer comparisons aren't ready for five cycles (a stall of four).
39: (define_function_unit "compare" 1 0 (eq_attr "type" "delayed_compare") 5 0)
40:
41: ;; Floating-point comparisons take eight cycles.
42: (define_function_unit "compare" 1 0 (eq_attr "type" "fpcompare") 8 0)
43:
44: ;; Start with fixed-point load and store insns. Here we put only the more
45: ;; complex forms. Basic data transfer is done later.
46:
47: (define_expand "zero_extendqisi2"
48: [(set (match_operand:SI 0 "gen_reg_operand" "")
49: (zero_extend:SI (match_operand:QI 1 "gen_reg_operand" "")))]
50: ""
51: "")
52:
53: (define_insn ""
54: [(set (match_operand:SI 0 "gen_reg_operand" "=r,r")
55: (zero_extend:SI (match_operand:QI 1 "reg_or_mem_operand" "m,r")))]
56: ""
57: "@
58: lbz%U1%X1 %0,%1
59: rlinm %0,%1,0,24,31"
60: [(set_attr "type" "load,*")])
61:
62: (define_insn ""
63: [(set (match_operand:CC 0 "cc_reg_operand" "=x")
64: (compare:CC (zero_extend:SI (match_operand:QI 1 "gen_reg_operand" "r"))
65: (const_int 0)))
66: (clobber (match_scratch:SI 2 "=r"))]
67: ""
68: "andil. %2,%1,255"
69: [(set_attr "type" "compare")])
70:
71: (define_insn ""
72: [(set (match_operand:CC 2 "cc_reg_operand" "=x")
73: (compare:CC (zero_extend:SI (match_operand:QI 1 "gen_reg_operand" "r"))
74: (const_int 0)))
75: (set (match_operand:SI 0 "gen_reg_operand" "=r")
76: (zero_extend:SI (match_dup 1)))]
77: ""
78: "andil. %0,%1,255"
79: [(set_attr "type" "compare")])
80:
81: (define_expand "zero_extendqihi2"
82: [(set (match_operand:HI 0 "gen_reg_operand" "")
83: (zero_extend:HI (match_operand:QI 1 "gen_reg_operand" "")))]
84: ""
85: "")
86:
87: (define_insn ""
88: [(set (match_operand:HI 0 "gen_reg_operand" "=r,r")
89: (zero_extend:HI (match_operand:QI 1 "reg_or_mem_operand" "m,r")))]
90: ""
91: "@
92: lbz%U1%X1 %0,%1
93: rlinm %0,%1,0,24,31"
94: [(set_attr "type" "load,*")])
95:
96: (define_expand "zero_extendhisi2"
97: [(set (match_operand:SI 0 "gen_reg_operand" "r")
98: (zero_extend:SI (match_operand:HI 1 "gen_reg_operand" "")))]
99: ""
100: "")
101:
102: (define_insn ""
103: [(set (match_operand:SI 0 "gen_reg_operand" "=r,r")
104: (zero_extend:SI (match_operand:HI 1 "reg_or_mem_operand" "m,r")))]
105: ""
106: "@
107: lhz%U1%X1 %0,%1
108: rlinm %0,%1,0,16,31"
109: [(set_attr "type" "load,*")])
110:
111: (define_insn ""
112: [(set (match_operand:CC 0 "cc_reg_operand" "=x")
113: (compare:CC (zero_extend:SI (match_operand:HI 1 "gen_reg_operand" "r"))
114: (const_int 0)))
115: (clobber (match_scratch:SI 2 "=r"))]
116: ""
117: "andil. %2,%1,65535"
118: [(set_attr "type" "compare")])
119:
120: (define_insn ""
121: [(set (match_operand:CC 2 "cc_reg_operand" "=x")
122: (compare:CC (zero_extend:SI (match_operand:HI 1 "gen_reg_operand" "r"))
123: (const_int 0)))
124: (set (match_operand:SI 0 "gen_reg_operand" "=r")
125: (zero_extend:SI (match_dup 1)))]
126: ""
127: "andil. %0,%1,65535"
128: [(set_attr "type" "compare")])
129:
130: (define_expand "extendhisi2"
131: [(set (match_operand:SI 0 "gen_reg_operand" "")
132: (sign_extend:SI (match_operand:HI 1 "gen_reg_operand" "")))]
133: ""
134: "")
135:
136: (define_insn ""
137: [(set (match_operand:SI 0 "gen_reg_operand" "=r,r")
138: (sign_extend:SI (match_operand:HI 1 "reg_or_mem_operand" "m,r")))]
139: ""
140: "@
141: lha%U1%X1 %0,%1
142: exts %0,%1"
143: [(set_attr "type" "load,*")])
144:
145: (define_insn ""
146: [(set (match_operand:CC 0 "cc_reg_operand" "=x")
147: (compare:CC (sign_extend:SI (match_operand:HI 1 "gen_reg_operand" "r"))
148: (const_int 0)))
149: (clobber (match_scratch:SI 2 "=r"))]
150: ""
151: "exts. %2,%1"
152: [(set_attr "type" "compare")])
153:
154: (define_insn ""
155: [(set (match_operand:CC 2 "cc_reg_operand" "=x")
156: (compare:CC (sign_extend:SI (match_operand:HI 1 "gen_reg_operand" "r"))
157: (const_int 0)))
158: (set (match_operand:SI 0 "gen_reg_operand" "=r")
159: (sign_extend:SI (match_dup 1)))]
160: ""
161: "exts. %0,%1"
162: [(set_attr "type" "compare")])
163:
164: ;; Fixed-point arithmetic insns.
165: (define_insn ""
166: [(set (match_operand:SI 0 "gen_reg_operand" "=r,r")
167: (plus:SI (match_operand:SI 1 "gen_reg_operand" "%r,b")
168: (match_operand:SI 2 "add_operand" "rI,J")))]
169: ""
170: "@
171: a%I2 %0,%1,%2
172: cau %0,%1,%u2")
173:
174: (define_insn ""
175: [(set (match_operand:CC 0 "cc_reg_operand" "=x")
176: (compare:CC (plus:SI (match_operand:SI 1 "gen_reg_operand" "r")
177: (match_operand:SI 2 "reg_or_short_operand" "rI"))
178: (const_int 0)))
179: (clobber (match_scratch:SI 3 "=r"))]
180: ""
181: "a%I2. %3,%1,%2"
182: [(set_attr "type" "compare")])
183:
184: (define_insn ""
185: [(set (match_operand:CC 3 "cc_reg_operand" "=x")
186: (compare:CC (plus:SI (match_operand:SI 1 "gen_reg_operand" "r")
187: (match_operand:SI 2 "reg_or_short_operand" "rI"))
188: (const_int 0)))
189: (set (match_operand:SI 0 "gen_reg_operand" "=r")
190: (plus:SI (match_dup 1) (match_dup 2)))]
191: ""
192: "a%I2. %0,%1,%2"
193: [(set_attr "type" "compare")])
194:
195: (define_expand "addsi3"
196: [(set (match_operand:SI 0 "gen_reg_operand" "")
197: (plus:SI (match_operand:SI 1 "gen_reg_operand" "")
198: (match_operand:SI 2 "reg_or_cint_operand" "")))]
199: ""
200: "
201: {
202: if (GET_CODE (operands[2]) == CONST_INT
203: && (unsigned) (INTVAL (operands[2]) + 0x8000) >= 0x10000
204: && (INTVAL (operands[2]) & 0xffff) != 0)
205: {
206: int low = INTVAL (operands[2]) & 0xffff;
207: int high = (unsigned) INTVAL (operands[2]) >> 16;
208:
209: if (low & 0x8000)
210: high++, low |= 0xffff0000;
211:
212: emit_insn (gen_addsi3 (operands[0], operands[1],
213: gen_rtx (CONST_INT, VOIDmode, high << 16)));
214: operands[1] = operands[0];
215: operands[2] = gen_rtx (CONST_INT, VOIDmode, low);
216: }
217: }")
218:
219: (define_insn "one_cmplsi2"
220: [(set (match_operand:SI 0 "gen_reg_operand" "=r")
221: (not:SI (match_operand:SI 1 "gen_reg_operand" "r")))]
222: ""
223: "sfi %0,%1,-1")
224:
225: (define_insn ""
226: [(set (match_operand:SI 0 "gen_reg_operand" "=r,r")
227: (minus:SI (match_operand:SI 1 "reg_or_short_operand" "r,I")
228: (match_operand:SI 2 "gen_reg_operand" "r,r")))]
229: ""
230: "@
231: sf %0,%2,%1
232: sfi %0,%2,%1")
233:
234: (define_insn ""
235: [(set (match_operand:CC 0 "cc_reg_operand" "=x")
236: (compare:CC (minus:SI (match_operand:SI 1 "gen_reg_operand" "r")
237: (match_operand:SI 2 "gen_reg_operand" "r"))
238: (const_int 0)))
239: (clobber (match_scratch:SI 3 "=r"))]
240: ""
241: "sf. %3,%2,%1"
242: [(set_attr "type" "compare")])
243:
244: (define_insn ""
245: [(set (match_operand:CC 3 "cc_reg_operand" "=x")
246: (compare:CC (minus:SI (match_operand:SI 1 "gen_reg_operand" "r")
247: (match_operand:SI 2 "gen_reg_operand" "r"))
248: (const_int 0)))
249: (set (match_operand:SI 0 "gen_reg_operand" "=r")
250: (minus:SI (match_dup 1) (match_dup 2)))]
251: ""
252: "sf. %0,%2,%1"
253: [(set_attr "type" "compare")])
254:
255: (define_expand "subsi3"
256: [(set (match_operand:SI 0 "gen_reg_operand" "")
257: (minus:SI (match_operand:SI 1 "reg_or_short_operand" "")
258: (match_operand:SI 2 "reg_or_cint_operand" "")))]
259: ""
260: "
261: {
262: if (GET_CODE (operands[2]) == CONST_INT)
263: {
264: emit_insn (gen_addsi3 (operands[0], operands[1],
265: negate_rtx (SImode, operands[2])));
266: DONE;
267: }
268: else
269: operands[2] = force_reg (SImode, operands[2]);
270: }")
271:
272: ;; For SMIN, SMAX, UMIN, and UMAX, we use DEFINE_EXPAND's that involve a doz[i]
273: ;; instruction and some auxiliary computations. Then we just have a single
274: ;; DEFINE_INSN for doz[i].
275:
276: (define_expand "sminsi3"
277: [(set (match_dup 3)
278: (if_then_else:SI (gt:SI (match_operand:SI 1 "gen_reg_operand" "")
279: (match_operand:SI 2 "reg_or_short_operand" ""))
280: (const_int 0)
281: (minus:SI (match_dup 2) (match_dup 1))))
282: (set (match_operand:SI 0 "gen_reg_operand" "")
283: (minus:SI (match_dup 2) (match_dup 3)))]
284: ""
285: "
286: { operands[3] = gen_reg_rtx (SImode); }")
287:
288: (define_expand "smaxsi3"
289: [(set (match_dup 3)
290: (if_then_else:SI (gt:SI (match_operand:SI 1 "gen_reg_operand" "")
291: (match_operand:SI 2 "reg_or_short_operand" ""))
292: (const_int 0)
293: (minus:SI (match_dup 2) (match_dup 1))))
294: (set (match_operand:SI 0 "gen_reg_operand" "")
295: (plus:SI (match_dup 3) (match_dup 1)))]
296: ""
297: "
298: { operands[3] = gen_reg_rtx (SImode); }")
299:
300: (define_expand "uminsi3"
301: [(set (match_dup 3) (xor:SI (match_operand:SI 1 "gen_reg_operand" "")
302: (const_int -2147483648)))
303: (set (match_dup 4) (xor:SI (match_operand:SI 2 "gen_reg_operand" "")
304: (const_int -2147483648)))
305: (set (match_dup 3) (if_then_else:SI (gt (match_dup 3) (match_dup 4))
306: (const_int 0)
307: (minus:SI (match_dup 4) (match_dup 3))))
308: (set (match_operand:SI 0 "gen_reg_operand" "")
309: (minus:SI (match_dup 2) (match_dup 3)))]
310: ""
311: "
312: { operands[3] = gen_reg_rtx (SImode); operands[4] = gen_reg_rtx (SImode); }")
313:
314: (define_expand "umaxsi3"
315: [(set (match_dup 3) (xor:SI (match_operand:SI 1 "gen_reg_operand" "")
316: (const_int -2147483648)))
317: (set (match_dup 4) (xor:SI (match_operand:SI 2 "gen_reg_operand" "")
318: (const_int -2147483648)))
319: (set (match_dup 3) (if_then_else:SI (gt (match_dup 3) (match_dup 4))
320: (const_int 0)
321: (minus:SI (match_dup 4) (match_dup 3))))
322: (set (match_operand:SI 0 "gen_reg_operand" "")
323: (plus:SI (match_dup 3) (match_dup 1)))]
324: ""
325: "
326: { operands[3] = gen_reg_rtx (SImode); operands[4] = gen_reg_rtx (SImode); }")
327:
328: (define_insn ""
329: [(set (match_operand:SI 0 "gen_reg_operand" "=r")
330: (if_then_else:SI (gt (match_operand:SI 1 "gen_reg_operand" "r")
331: (match_operand:SI 2 "reg_or_short_operand" "r"))
332: (const_int 0)
333: (minus:SI (match_dup 2) (match_dup 1))))]
334: ""
335: "doz%I2 %0,%1,%2")
336:
337: (define_insn ""
338: [(set (match_operand:CC 0 "cc_reg_operand" "=x")
339: (compare:CC
340: (if_then_else:SI (gt (match_operand:SI 1 "gen_reg_operand" "r")
341: (match_operand:SI 2 "reg_or_short_operand" "r"))
342: (const_int 0)
343: (minus:SI (match_dup 2) (match_dup 1)))
344: (const_int 0)))
345: (clobber (match_scratch:SI 3 "=r"))]
346: ""
347: "doz%I2. %3,%1,%2"
348: [(set_attr "type" "delayed_compare")])
349:
350: (define_insn ""
351: [(set (match_operand:CC 3 "cc_reg_operand" "=x")
352: (compare:CC
353: (if_then_else:SI (gt (match_operand:SI 1 "gen_reg_operand" "r")
354: (match_operand:SI 2 "reg_or_short_operand" "r"))
355: (const_int 0)
356: (minus:SI (match_dup 2) (match_dup 1)))
357: (const_int 0)))
358: (set (match_operand:SI 0 "gen_reg_operand" "=r")
359: (if_then_else:SI (gt (match_dup 1) (match_dup 2))
360: (const_int 0)
361: (minus:SI (match_dup 2) (match_dup 1))))]
362: ""
363: "doz%I2. %0,%1,%2"
364: [(set_attr "type" "delayed_compare")])
365:
366: ;; We don't need abs with condition code because such comparisons should
367: ;; never be done.
368: (define_insn "abssi2"
369: [(set (match_operand:SI 0 "gen_reg_operand" "=r")
370: (abs:SI (match_operand:SI 1 "gen_reg_operand" "r")))]
371: ""
372: "abs %0,%1")
373:
374: (define_insn ""
375: [(set (match_operand:SI 0 "gen_reg_operand" "=r")
376: (neg:SI (abs:SI (match_operand:SI 1 "gen_reg_operand" "r"))))]
377: ""
378: "nabs %0,%1")
379:
380: (define_insn "negsi2"
381: [(set (match_operand:SI 0 "gen_reg_operand" "=r")
382: (neg:SI (match_operand:SI 1 "gen_reg_operand" "r")))]
383: ""
384: "neg %0,%1")
385:
386: (define_insn ""
387: [(set (match_operand:CC 0 "cc_reg_operand" "=x")
388: (compare:CC (neg:SI (match_operand:SI 1 "gen_reg_operand" "r"))
389: (const_int 0)))
390: (clobber (match_scratch:SI 2 "=r"))]
391: ""
392: "neg. %2,%1"
393: [(set_attr "type" "compare")])
394:
395: (define_insn ""
396: [(set (match_operand:CC 2 "cc_reg_operand" "=x")
397: (compare:CC (neg:SI (match_operand:SI 1 "gen_reg_operand" "r"))
398: (const_int 0)))
399: (set (match_operand:SI 0 "gen_reg_operand" "=r")
400: (neg:SI (match_dup 1)))]
401: ""
402: "neg. %0,%1"
403: [(set_attr "type" "compare")])
404:
405: (define_insn "ffssi2"
406: [(set (match_operand:SI 0 "register_operand" "=&r")
407: (ffs:SI (match_operand:SI 1 "register_operand" "r")))]
408: ""
409: "neg %0,%1\;and %0,%0,%1\;cntlz %0,%0\;sfi %0,%0,32")
410:
411: ;; There is no need for (set (condition) (compare (ffs) 0)) because that
412: ;; can be simplified to an ordinary comparison. A parallel set and compare
413: ;; might be used, so include it.
414:
415: (define_insn ""
416: [(set (match_operand:CC 2 "cc_reg_operand" "=x")
417: (compare:CC (ffs:SI (match_operand:SI 1 "register_operand" "r"))
418: (const_int 0)))
419: (set (match_operand:SI 0 "register_operand" "=&r")
420: (ffs:SI (match_dup 1)))]
421: ""
422: "neg %0,%1\;and %0,%0,%1\;cntlz %0,%0\;sfi. %0,%0,32"
423: [(set_attr "type" "compare")])
424:
425: (define_insn "mulsi3"
426: [(set (match_operand:SI 0 "gen_reg_operand" "=r,r")
427: (mult:SI (match_operand:SI 1 "gen_reg_operand" "%r,r")
428: (match_operand:SI 2 "reg_or_short_operand" "r,I")))
429: (clobber (match_scratch:SI 3 "=q,q"))]
430: ""
431: "@
432: muls %0,%1,%2
433: muli %0,%1,%2")
434:
435: (define_insn ""
436: [(set (match_operand:CC 0 "cc_reg_operand" "=x")
437: (compare:CC (mult:SI (match_operand:SI 1 "gen_reg_operand" "r")
438: (match_operand:SI 2 "gen_reg_operand" "r"))
439: (const_int 0)))
440: (clobber (match_scratch:SI 3 "=r"))
441: (clobber (match_scratch:SI 4 "=q"))]
442: ""
443: "muls. %3,%1,%2"
444: [(set_attr "type" "delayed_compare")])
445:
446: (define_insn ""
447: [(set (match_operand:CC 3 "cc_reg_operand" "=x")
448: (compare:CC (mult:SI (match_operand:SI 1 "gen_reg_operand" "r")
449: (match_operand:SI 2 "gen_reg_operand" "r"))
450: (const_int 0)))
451: (set (match_operand:SI 0 "gen_reg_operand" "=r")
452: (mult:SI (match_dup 1) (match_dup 2)))
453: (clobber (match_scratch:SI 4 "=q"))]
454: ""
455: "muls. %0,%1,%2"
456: [(set_attr "type" "delayed_compare")])
457:
458: ;; Operand 1 is divided by operand 2; quotient goes to operand
459: ;; 0 and remainder to operand 3.
460: ;; ??? At some point, see what, if anything, we can do about if (x % y == 0).
461:
462: (define_insn "divmodsi4"
463: [(set (match_operand:SI 0 "gen_reg_operand" "=r")
464: (div:SI (match_operand:SI 1 "gen_reg_operand" "r")
465: (match_operand:SI 2 "gen_reg_operand" "r")))
466: (set (match_operand:SI 3 "gen_reg_operand" "=q")
467: (mod:SI (match_dup 1) (match_dup 2)))]
468: ""
469: "divs %0,%1,%2")
470:
471: ;; For powers of two we can do srai/aze for divide and then adjust for
472: ;; modulus. If it isn't a power of two, FAIL so divmodsi4 will be used.
473: (define_expand "divsi3"
474: [(set (match_operand:SI 0 "gen_reg_operand" "")
475: (div:SI (match_operand:SI 1 "gen_reg_operand" "")
476: (match_operand:SI 2 "reg_or_cint_operand" "")))]
477: ""
478: "
479: {
480: if (GET_CODE (operands[2]) != CONST_INT
481: || exact_log2 (INTVAL (operands[2])) < 0)
482: FAIL;
483: }")
484:
485: (define_expand "modsi3"
486: [(set (match_dup 3)
487: (div:SI (match_operand:SI 1 "gen_reg_operand" "")
488: (match_operand:SI 2 "reg_or_cint_operand" "")))
489: (parallel [(set (match_dup 4) (ashift:SI (match_dup 3) (match_dup 5)))
490: (clobber (scratch:SI))])
491: (set (match_operand:SI 0 "gen_reg_operand" "")
492: (minus:SI (match_dup 1) (match_dup 4)))]
493: ""
494: "
495: {
496: int i = exact_log2 (INTVAL (operands[2]));
497:
498: if (GET_CODE (operands[2]) != CONST_INT || i < 0)
499: FAIL;
500:
501: operands[3] = gen_reg_rtx (SImode);
502: operands[4] = gen_reg_rtx (SImode);
503: operands[5] = gen_rtx (CONST_INT, VOIDmode, i);
504: }")
505:
506: (define_insn ""
507: [(set (match_operand:SI 0 "gen_reg_operand" "=r")
508: (div:SI (match_operand:SI 1 "gen_reg_operand" "r")
509: (match_operand:SI 2 "const_int_operand" "N")))]
510: "exact_log2 (INTVAL (operands[2])) >= 0"
511: "srai %0,%1,%p2\;aze %0,%0")
512:
513: (define_insn ""
514: [(set (match_operand:CC 0 "cc_reg_operand" "=x")
515: (div:SI (match_operand:SI 1 "gen_reg_operand" "r")
516: (match_operand:SI 2 "const_int_operand" "N")))
517: (clobber (match_scratch:SI 3 "=r"))]
518: "exact_log2 (INTVAL (operands[2])) >= 0"
519: "srai %3,%1,%p2\;aze. %3,%3"
520: [(set_attr "type" "compare")])
521:
522: (define_insn ""
523: [(set (match_operand:CC 3 "cc_reg_operand" "=x")
524: (div:SI (match_operand:SI 1 "gen_reg_operand" "r")
525: (match_operand:SI 2 "const_int_operand" "N")))
526: (set (match_operand:SI 0 "gen_reg_operand" "=r")
527: (div:SI (match_dup 1) (match_dup 2)))]
528: "exact_log2 (INTVAL (operands[2])) >= 0"
529: "srai %0,%1,%p2\;aze. %0,%0"
530: [(set_attr "type" "compare")])
531:
532: (define_insn ""
533: [(set (match_operand:SI 0 "gen_reg_operand" "=r")
534: (udiv:SI
535: (plus:DI (lshift:DI
536: (zero_extend:DI (match_operand:SI 1 "gen_reg_operand" "r"))
537: (const_int 32))
538: (zero_extend:DI (match_operand:SI 2 "register_operand" "*q")))
539: (match_operand:SI 3 "gen_reg_operand" "r")))
540: (set (match_operand:SI 4 "register_operand" "=*q")
541: (umod:SI
542: (plus:DI (lshift:DI
543: (zero_extend:DI (match_dup 1)) (const_int 32))
544: (zero_extend:DI (match_dup 2)))
545: (match_dup 3)))]
546:
547: ""
548: "div %0,%1,%3")
549:
550: ;; To do unsigned divide we handle the cases of the divisor looking like a
551: ;; negative number. If it is a constant that is less than 2**31, we don't
552: ;; have to worry about the branches. So make a few subroutines here.
553: ;;
554: ;; First comes the normal case.
555: (define_expand "udivmodsi4_normal"
556: [(set (match_dup 4) (const_int 0))
557: (parallel [(set (match_operand:SI 0 "" "")
558: (udiv:SI (plus:DI (lshift:DI (zero_extend:DI (match_dup 4))
559: (const_int 32))
560: (zero_extend:DI (match_operand:SI 1 "" "")))
561: (match_operand:SI 2 "" "")))
562: (set (match_operand:SI 3 "" "")
563: (umod:SI (plus:DI (lshift:DI (zero_extend:DI (match_dup 4))
564: (const_int 32))
565: (zero_extend:DI (match_dup 1)))
566: (match_dup 2)))])]
567: ""
568: "
569: { operands[4] = gen_reg_rtx (SImode); }")
570:
571: ;; This handles the branches.
572: (define_expand "udivmodsi4_tests"
573: [(set (match_operand:SI 0 "" "") (const_int 0))
574: (set (match_operand:SI 3 "" "") (match_operand:SI 1 "" ""))
575: (set (match_dup 5) (compare:CCUNS (match_dup 1) (match_operand:SI 2 "" "")))
576: (set (pc) (if_then_else (ltu (match_dup 5) (const_int 0))
577: (label_ref (match_operand:SI 4 "" "")) (pc)))
578: (set (match_dup 0) (const_int 1))
579: (set (match_dup 3) (minus:SI (match_dup 1) (match_dup 2)))
580: (set (match_dup 6) (compare:CC (match_dup 2) (const_int 0)))
581: (set (pc) (if_then_else (lt (match_dup 6) (const_int 0))
582: (label_ref (match_dup 4)) (pc)))]
583: ""
584: "
585: { operands[5] = gen_reg_rtx (CCUNSmode);
586: operands[6] = gen_reg_rtx (CCmode);
587: }")
588:
589: (define_expand "udivmodsi4"
590: [(parallel [(set (match_operand:SI 0 "gen_reg_operand" "")
591: (udiv:SI (match_operand:SI 1 "gen_reg_operand" "")
592: (match_operand:SI 2 "reg_or_cint_operand" "")))
593: (set (match_operand:SI 3 "gen_reg_operand" "")
594: (umod:SI (match_dup 1) (match_dup 2)))])]
595: ""
596: "
597: {
598: rtx label = 0;
599:
600: if (GET_CODE (operands[2]) != CONST_INT || INTVAL (operands[2]) < 0)
601: {
602: operands[2] = force_reg (SImode, operands[2]);
603: label = gen_label_rtx ();
604: emit (gen_udivmodsi4_tests (operands[0], operands[1], operands[2],
605: operands[3], label));
606: }
607: else
608: operands[2] = force_reg (SImode, operands[2]);
609:
610: emit (gen_udivmodsi4_normal (operands[0], operands[1], operands[2],
611: operands[3]));
612: if (label)
613: emit_label (label);
614:
615: DONE;
616: }")
617:
618: (define_insn "andsi3"
619: [(set (match_operand:SI 0 "gen_reg_operand" "=r,r,r,r")
620: (and:SI (match_operand:SI 1 "gen_reg_operand" "%r,r,r,r")
621: (match_operand:SI 2 "and_operand" "?r,L,K,J")))
622: (clobber (match_scratch:CC 3 "=X,X,x,x"))]
623: ""
624: "@
625: and %0,%1,%2
626: rlinm %0,%1,0,%m2,%M2
627: andil. %0,%1,%b2
628: andiu. %0,%1,%u2")
629:
630: (define_insn ""
631: [(set (match_operand:CC 0 "cc_reg_operand" "=x,x,x,x")
632: (compare:CC (and:SI (match_operand:SI 1 "gen_reg_operand" "%r,r,r,r")
633: (match_operand:SI 2 "and_operand" "r,K,J,L"))
634: (const_int 0)))
635: (clobber (match_scratch:SI 3 "=r,r,r,r"))]
636: ""
637: "@
638: and. %3,%1,%2
639: andil. %3,%1,%b2
640: andiu. %3,%1,%u2
641: rlinm. %3,%1,0,%m2,%M2"
642: [(set_attr "type" "compare,compare,compare,delayed_compare")])
643:
644: (define_insn ""
645: [(set (match_operand:CC 3 "cc_reg_operand" "=x,x,x,x")
646: (compare:CC (and:SI (match_operand:SI 1 "gen_reg_operand" "%r,r,r,r")
647: (match_operand:SI 2 "and_operand" "r,K,J,L"))
648: (const_int 0)))
649: (set (match_operand:SI 0 "gen_reg_operand" "=r,r,r,r")
650: (and:SI (match_dup 1) (match_dup 2)))]
651: ""
652: "@
653: and. %0,%1,%2
654: andil. %0,%1,%b2
655: andiu. %0,%1,%u2
656: rlinm. %0,%1,0,%m2,%M2"
657: [(set_attr "type" "compare,compare,compare,delayed_compare")])
658:
659: (define_insn ""
660: [(set (match_operand:SI 0 "gen_reg_operand" "=r,r,r")
661: (ior:SI (match_operand:SI 1 "gen_reg_operand" "%r,r,r")
662: (match_operand:SI 2 "logical_operand" "r,K,J")))]
663: ""
664: "@
665: or %0,%1,%2
666: oril %0,%1,%b2
667: oriu %0,%1,%u2")
668:
669: (define_insn ""
670: [(set (match_operand:CC 0 "cc_reg_operand" "=x")
671: (compare:CC (ior:SI (match_operand:SI 1 "gen_reg_operand" "r")
672: (match_operand:SI 2 "gen_reg_operand" "r"))
673: (const_int 0)))
674: (clobber (match_scratch:SI 3 "=r"))]
675: ""
676: "or. %3,%1,%2"
677: [(set_attr "type" "compare")])
678:
679: (define_insn ""
680: [(set (match_operand:CC 3 "cc_reg_operand" "=x")
681: (compare:CC (ior:SI (match_operand:SI 1 "gen_reg_operand" "r")
682: (match_operand:SI 2 "gen_reg_operand" "r"))
683: (const_int 0)))
684: (set (match_operand:SI 0 "gen_reg_operand" "=r")
685: (ior:SI (match_dup 1) (match_dup 2)))]
686: ""
687: "or. %0,%1,%2"
688: [(set_attr "type" "compare")])
689:
690: (define_expand "iorsi3"
691: [(set (match_operand:SI 0 "gen_reg_operand" "")
692: (ior:SI (match_operand:SI 1 "gen_reg_operand" "")
693: (match_operand:SI 2 "reg_or_cint_operand" "")))]
694: ""
695: "
696: {
697: if (GET_CODE (operands[2]) == CONST_INT
698: && ! logical_operand (operands[2], SImode))
699: {
700: emit_insn (gen_iorsi3 (operands[0], operands[1],
701: gen_rtx (CONST_INT, VOIDmode,
702: INTVAL (operands[2]) & 0xffff0000)));
703: operands[1] = operands[0];
704: operands[2] = gen_rtx (CONST_INT, VOIDmode,
705: INTVAL (operands[2]) & 0xffff);
706: }
707: }")
708:
709: (define_insn ""
710: [(set (match_operand:SI 0 "gen_reg_operand" "=r,r,r")
711: (xor:SI (match_operand:SI 1 "gen_reg_operand" "%r,r,r")
712: (match_operand:SI 2 "logical_operand" "r,K,J")))]
713: ""
714: "@
715: xor %0,%1,%2
716: xoril %0,%1,%b2
717: xoriu %0,%1,%u2")
718:
719: (define_insn ""
720: [(set (match_operand:CC 0 "cc_reg_operand" "=x")
721: (compare:CC (xor:SI (match_operand:SI 1 "gen_reg_operand" "r")
722: (match_operand:SI 2 "gen_reg_operand" "r"))
723: (const_int 0)))
724: (clobber (match_scratch:SI 3 "=r"))]
725: ""
726: "xor. %3,%1,%2"
727: [(set_attr "type" "compare")])
728:
729: (define_insn ""
730: [(set (match_operand:CC 3 "cc_reg_operand" "=x")
731: (compare:CC (xor:SI (match_operand:SI 1 "gen_reg_operand" "r")
732: (match_operand:SI 2 "gen_reg_operand" "r"))
733: (const_int 0)))
734: (set (match_operand:SI 0 "gen_reg_operand" "=r")
735: (xor:SI (match_dup 1) (match_dup 2)))]
736: ""
737: "xor. %0,%1,%2"
738: [(set_attr "type" "compare")])
739:
740: (define_expand "xorsi3"
741: [(set (match_operand:SI 0 "gen_reg_operand" "")
742: (xor:SI (match_operand:SI 1 "gen_reg_operand" "")
743: (match_operand:SI 2 "reg_or_cint_operand" "")))]
744: ""
745: "
746: {
747: if (GET_CODE (operands[2]) == CONST_INT
748: && ! logical_operand (operands[2], SImode))
749: {
750: emit_insn (gen_xorsi3 (operands[0], operands[1],
751: gen_rtx (CONST_INT, VOIDmode,
752: INTVAL (operands[2]) & 0xffff0000)));
753: operands[1] = operands[0];
754: operands[2] = gen_rtx (CONST_INT, VOIDmode,
755: INTVAL (operands[2]) & 0xffff);
756: }
757: }")
758:
759: (define_insn ""
760: [(set (match_operand:SI 0 "gen_reg_operand" "=r")
761: (not:SI (xor:SI (match_operand:SI 1 "gen_reg_operand" "%r")
762: (match_operand:SI 2 "gen_reg_operand" "r"))))]
763: ""
764: "eqv %0,%1,%2")
765:
766: (define_insn ""
767: [(set (match_operand:CC 0 "cc_reg_operand" "=x")
768: (compare:CC (not:SI (xor:SI (match_operand:SI 1 "gen_reg_operand" "%r")
769: (match_operand:SI 2 "gen_reg_operand" "r")))
770: (const_int 0)))
771: (clobber (match_scratch:SI 3 "=r"))]
772: ""
773: "eqv. %3,%1,%2"
774: [(set_attr "type" "compare")])
775:
776: (define_insn ""
777: [(set (match_operand:CC 3 "cc_reg_operand" "=x")
778: (compare:CC (not:SI (xor:SI (match_operand:SI 1 "gen_reg_operand" "%r")
779: (match_operand:SI 2 "gen_reg_operand" "r")))
780: (const_int 0)))
781: (set (match_operand:SI 0 "gen_reg_operand" "=r")
782: (not:SI (xor:SI (match_dup 1) (match_dup 2))))]
783: ""
784: "eqv. %0,%1,%2"
785: [(set_attr "type" "compare")])
786:
787: (define_insn ""
788: [(set (match_operand:SI 0 "gen_reg_operand" "=r")
789: (and:SI (not:SI (match_operand:SI 1 "gen_reg_operand" "r"))
790: (match_operand:SI 2 "gen_reg_operand" "r")))]
791: ""
792: "andc %0,%2,%1")
793:
794: (define_insn ""
795: [(set (match_operand:CC 0 "cc_reg_operand" "=x")
796: (compare:CC (and:SI (not:SI (match_operand:SI 1 "gen_reg_operand" "r"))
797: (match_operand:SI 2 "gen_reg_operand" "r"))
798: (const_int 0)))
799: (clobber (match_scratch:SI 3 "=r"))]
800: ""
801: "andc. %3,%2,%1"
802: [(set_attr "type" "compare")])
803:
804: (define_insn ""
805: [(set (match_operand:CC 3 "cc_reg_operand" "=x")
806: (compare:CC (and:SI (not:SI (match_operand:SI 1 "gen_reg_operand" "r"))
807: (match_operand:SI 2 "gen_reg_operand" "r"))
808: (const_int 0)))
809: (set (match_operand:SI 0 "gen_reg_operand" "=r")
810: (and:SI (not:SI (match_dup 1)) (match_dup 2)))]
811: ""
812: "andc. %0,%2,%1"
813: [(set_attr "type" "compare")])
814:
815: (define_insn ""
816: [(set (match_operand:SI 0 "gen_reg_operand" "=r")
817: (ior:SI (not:SI (match_operand:SI 1 "gen_reg_operand" "r"))
818: (match_operand:SI 2 "gen_reg_operand" "r")))]
819: ""
820: "orc %0,%2,%1")
821:
822: (define_insn ""
823: [(set (match_operand:CC 0 "cc_reg_operand" "=x")
824: (compare:CC (ior:SI (not:SI (match_operand:SI 1 "gen_reg_operand" "r"))
825: (match_operand:SI 2 "gen_reg_operand" "r"))
826: (const_int 0)))
827: (clobber (match_scratch:SI 3 "=r"))]
828: ""
829: "orc. %3,%2,%1"
830: [(set_attr "type" "compare")])
831:
832: (define_insn ""
833: [(set (match_operand:CC 3 "cc_reg_operand" "=x")
834: (compare:CC (ior:SI (not:SI (match_operand:SI 1 "gen_reg_operand" "r"))
835: (match_operand:SI 2 "gen_reg_operand" "r"))
836: (const_int 0)))
837: (set (match_operand:SI 0 "gen_reg_operand" "=r")
838: (ior:SI (not:SI (match_dup 1)) (match_dup 2)))]
839: ""
840: "orc. %0,%2,%1"
841: [(set_attr "type" "compare")])
842:
843: (define_insn ""
844: [(set (match_operand:SI 0 "gen_reg_operand" "=r")
845: (ior:SI (not:SI (match_operand:SI 1 "gen_reg_operand" "r"))
846: (not:SI (match_operand:SI 2 "gen_reg_operand" "r"))))]
847: ""
848: "nand %0,%1,%2")
849:
850: (define_insn ""
851: [(set (match_operand:CC 0 "cc_reg_operand" "=x")
852: (compare:CC (ior:SI (not:SI (match_operand:SI 1 "gen_reg_operand" "r"))
853: (not:SI (match_operand:SI 2 "gen_reg_operand" "r")))
854: (const_int 0)))
855: (clobber (match_scratch:SI 3 "=r"))]
856: ""
857: "nand. %3,%1,%2"
858: [(set_attr "type" "compare")])
859:
860: (define_insn ""
861: [(set (match_operand:CC 3 "cc_reg_operand" "=x")
862: (compare:CC (ior:SI (not:SI (match_operand:SI 1 "gen_reg_operand" "r"))
863: (not:SI (match_operand:SI 2 "gen_reg_operand" "r")))
864: (const_int 0)))
865: (set (match_operand:SI 0 "gen_reg_operand" "=r")
866: (ior:SI (not:SI (match_dup 1)) (not:SI (match_dup 2))))]
867: ""
868: "nand. %0,%1,%2"
869: [(set_attr "type" "compare")])
870:
871: (define_insn ""
872: [(set (match_operand:SI 0 "gen_reg_operand" "=r")
873: (and:SI (not:SI (match_operand:SI 1 "gen_reg_operand" "r"))
874: (not:SI (match_operand:SI 2 "gen_reg_operand" "r"))))]
875: ""
876: "nor %0,%1,%2")
877:
878: (define_insn ""
879: [(set (match_operand:CC 0 "cc_reg_operand" "=x")
880: (compare:CC (and:SI (not:SI (match_operand:SI 1 "gen_reg_operand" "r"))
881: (not:SI (match_operand:SI 2 "gen_reg_operand" "r")))
882: (const_int 0)))
883: (clobber (match_scratch:SI 3 "=r"))]
884: ""
885: "nor. %3,%1,%2"
886: [(set_attr "type" "compare")])
887:
888: (define_insn ""
889: [(set (match_operand:CC 3 "cc_reg_operand" "=x")
890: (compare:CC (and:SI (not:SI (match_operand:SI 1 "gen_reg_operand" "r"))
891: (not:SI (match_operand:SI 2 "gen_reg_operand" "r")))
892: (const_int 0)))
893: (set (match_operand:SI 0 "gen_reg_operand" "=r")
894: (and:SI (not:SI (match_dup 1)) (not:SI (match_dup 2))))]
895: ""
896: "nor. %0,%1,%2"
897: [(set_attr "type" "compare")])
898:
899: ;; maskir insn. We need four forms because things might be in arbitrary
900: ;; orders. Don't define forms that only set CR fields because these
901: ;; would modify an input register.
902:
903: (define_insn ""
904: [(set (match_operand:SI 0 "gen_reg_operand" "=r")
905: (ior:SI (and:SI (not:SI (match_operand:SI 1 "gen_reg_operand" "r"))
906: (match_operand:SI 2 "gen_reg_operand" "0"))
907: (and:SI (match_dup 1)
908: (match_operand:SI 3 "gen_reg_operand" "r"))))]
909: ""
910: "maskir %0,%3,%1")
911:
912: (define_insn ""
913: [(set (match_operand:SI 0 "register_operand" "=r")
914: (ior:SI (and:SI (not:SI (match_operand:SI 1 "gen_reg_operand" "r"))
915: (match_operand:SI 2 "gen_reg_operand" "0"))
916: (and:SI (match_operand:SI 3 "gen_reg_operand" "r")
917: (match_dup 1))))]
918: ""
919: "maskir %0,%3,%1")
920:
921: (define_insn ""
922: [(set (match_operand:SI 0 "gen_reg_operand" "=r")
923: (ior:SI (and:SI (match_dup 1)
924: (match_operand:SI 3 "gen_reg_operand" "r"))
925: (and:SI (not:SI (match_operand:SI 1 "gen_reg_operand" "r"))
926: (match_operand:SI 2 "gen_reg_operand" "0"))))]
927: ""
928: "maskir %0,%3,%1")
929:
930: (define_insn ""
931: [(set (match_operand:SI 0 "gen_reg_operand" "=r")
932: (ior:SI (and:SI (match_operand:SI 3 "gen_reg_operand" "r")
933: (match_dup 1))
934: (and:SI (not:SI (match_operand:SI 1 "gen_reg_operand" "r"))
935: (match_operand:SI 2 "gen_reg_operand" "0"))))]
936: ""
937: "maskir %0,%3,%1")
938:
939: (define_insn ""
940: [(set (match_operand:CC 4 "cc_reg_operand" "=x")
941: (compare:CC
942: (ior:SI (and:SI (not:SI (match_operand:SI 1 "gen_reg_operand" "r"))
943: (match_operand:SI 2 "gen_reg_operand" "0"))
944: (and:SI (match_dup 1)
945: (match_operand:SI 3 "gen_reg_operand" "r")))
946: (const_int 0)))
947: (set (match_operand:SI 0 "gen_reg_operand" "=r")
948: (ior:SI (and:SI (not:SI (match_dup 1)) (match_dup 2))
949: (and:SI (match_dup 1) (match_dup 3))))]
950: ""
951: "maskir. %0,%3,%1"
952: [(set_attr "type" "compare")])
953:
954: (define_insn ""
955: [(set (match_operand:CC 4 "cc_reg_operand" "=x")
956: (compare:CC
957: (ior:SI (and:SI (not:SI (match_operand:SI 1 "gen_reg_operand" "r"))
958: (match_operand:SI 2 "gen_reg_operand" "0"))
959: (and:SI (match_operand:SI 3 "gen_reg_operand" "r")
960: (match_dup 1)))
961: (const_int 0)))
962: (set (match_operand:SI 0 "register_operand" "=r")
963: (ior:SI (and:SI (not:SI (match_dup 1)) (match_dup 2))
964: (and:SI (match_dup 3) (match_dup 1))))]
965: ""
966: "maskir. %0,%3,%1"
967: [(set_attr "type" "compare")])
968:
969: (define_insn ""
970: [(set (match_operand:CC 4 "cc_reg_operand" "=x")
971: (compare:CC
972: (ior:SI (and:SI (match_dup 1)
973: (match_operand:SI 3 "gen_reg_operand" "r"))
974: (and:SI (not:SI (match_operand:SI 1 "gen_reg_operand" "r"))
975: (match_operand:SI 2 "gen_reg_operand" "0")))
976: (const_int 0)))
977: (set (match_operand:SI 0 "gen_reg_operand" "=r")
978: (ior:SI (and:SI (match_dup 1) (match_dup 3))
979: (and:SI (not:SI (match_dup 1)) (match_dup 2))))]
980: ""
981: "maskir. %0,%3,%1"
982: [(set_attr "type" "compare")])
983:
984: (define_insn ""
985: [(set (match_operand:CC 4 "cc_reg_operand" "=x")
986: (compare:CC
987: (ior:SI (and:SI (match_operand:SI 3 "gen_reg_operand" "r")
988: (match_dup 1))
989: (and:SI (not:SI (match_operand:SI 1 "gen_reg_operand" "r"))
990: (match_operand:SI 2 "gen_reg_operand" "0")))
991: (const_int 0)))
992: (set (match_operand:SI 0 "gen_reg_operand" "=r")
993: (ior:SI (and:SI (match_dup 3) (match_dup 1))
994: (and:SI (not:SI (match_dup 1)) (match_dup 2))))]
995: ""
996: "maskir. %0,%3,%1"
997: [(set_attr "type" "compare")])
998:
999: ;; Rotate and shift insns, in all their variants. These support shifts,
1000: ;; field inserts and extracts, and various combinations thereof.
1001: (define_insn "insv"
1002: [(set (zero_extract:SI (match_operand:SI 0 "gen_reg_operand" "+r")
1003: (match_operand:SI 1 "const_int_operand" "i")
1004: (match_operand:SI 2 "const_int_operand" "i"))
1005: (match_operand:SI 3 "gen_reg_operand" "r"))]
1006: ""
1007: "*
1008: {
1009: int start = INTVAL (operands[2]) & 31;
1010: int size = INTVAL (operands[1]) & 31;
1011:
1012: operands[4] = gen_rtx (CONST_INT, VOIDmode, 32 - start - size);
1013: operands[1] = gen_rtx (CONST_INT, VOIDmode, start + size - 1);
1014: return \"rlimi %0,%3,%4,%h2,%h1\";
1015: }")
1016:
1017: (define_insn "extzv"
1018: [(set (match_operand:SI 0 "gen_reg_operand" "=r")
1019: (zero_extract:SI (match_operand:SI 1 "gen_reg_operand" "r")
1020: (match_operand:SI 2 "const_int_operand" "i")
1021: (match_operand:SI 3 "const_int_operand" "i")))]
1022: ""
1023: "*
1024: {
1025: int start = INTVAL (operands[3]) & 31;
1026: int size = INTVAL (operands[2]) & 31;
1027:
1028: if (start + size >= 32)
1029: operands[3] = const0_rtx;
1030: else
1031: operands[3] = gen_rtx (CONST_INT, VOIDmode, start + size);
1032: return \"rlinm %0,%1,%3,%s2,31\";
1033: }")
1034:
1035: (define_insn ""
1036: [(set (match_operand:CC 0 "cc_reg_operand" "=x")
1037: (compare:CC (zero_extract:SI (match_operand:SI 1 "gen_reg_operand" "r")
1038: (match_operand:SI 2 "const_int_operand" "i")
1039: (match_operand:SI 3 "const_int_operand" "i"))
1040: (const_int 0)))
1041: (clobber (match_scratch:SI 4 "=r"))]
1042: ""
1043: "*
1044: {
1045: int start = INTVAL (operands[3]) & 31;
1046: int size = INTVAL (operands[2]) & 31;
1047:
1048: if (start + size >= 32)
1049: operands[3] = const0_rtx;
1050: else
1051: operands[3] = gen_rtx (CONST_INT, VOIDmode, start + size);
1052: return \"rlinm. %4,%1,%3,%s2,31\";
1053: }"
1054: [(set_attr "type" "compare")])
1055:
1056: (define_insn ""
1057: [(set (match_operand:CC 4 "cc_reg_operand" "=x")
1058: (compare:CC (zero_extract:SI (match_operand:SI 1 "gen_reg_operand" "r")
1059: (match_operand:SI 2 "const_int_operand" "i")
1060: (match_operand:SI 3 "const_int_operand" "i"))
1061: (const_int 0)))
1062: (set (match_operand:SI 0 "gen_reg_operand" "=r")
1063: (zero_extract:SI (match_dup 1) (match_dup 2) (match_dup 3)))]
1064: ""
1065: "*
1066: {
1067: int start = INTVAL (operands[3]) & 31;
1068: int size = INTVAL (operands[2]) & 31;
1069:
1070: if (start + size >= 32)
1071: operands[3] = const0_rtx;
1072: else
1073: operands[3] = gen_rtx (CONST_INT, VOIDmode, start + size);
1074: return \"rlinm. %0,%1,%3,%s2,31\";
1075: }"
1076: [(set_attr "type" "delayed_compare")])
1077:
1078: (define_insn "rotlsi3"
1079: [(set (match_operand:SI 0 "gen_reg_operand" "=r")
1080: (rotate:SI (match_operand:SI 1 "gen_reg_operand" "r")
1081: (match_operand:SI 2 "reg_or_cint_operand" "ri")))]
1082: ""
1083: "rl%I2nm %0,%1,%h2,0,31")
1084:
1085: (define_insn ""
1086: [(set (match_operand:CC 0 "cc_reg_operand" "=x")
1087: (compare:CC (rotate:SI (match_operand:SI 1 "gen_reg_operand" "r")
1088: (match_operand:SI 2 "reg_or_cint_operand" "ri"))
1089: (const_int 0)))
1090: (clobber (match_scratch:SI 3 "=r"))]
1091: ""
1092: "rl%I2nm. %3,%1,%h2,0,31"
1093: [(set_attr "type" "delayed_compare")])
1094:
1095: (define_insn ""
1096: [(set (match_operand:CC 3 "cc_reg_operand" "=x")
1097: (compare:CC (rotate:SI (match_operand:SI 1 "gen_reg_operand" "r")
1098: (match_operand:SI 2 "reg_or_cint_operand" "ri"))
1099: (const_int 0)))
1100: (set (match_operand:SI 0 "gen_reg_operand" "=r")
1101: (rotate:SI (match_dup 1) (match_dup 2)))]
1102: ""
1103: "rl%I2nm. %0,%1,%h2,0,31"
1104: [(set_attr "type" "delayed_compare")])
1105:
1106: (define_insn ""
1107: [(set (match_operand:SI 0 "gen_reg_operand" "=r")
1108: (and:SI (rotate:SI (match_operand:SI 1 "gen_reg_operand" "r")
1109: (match_operand:SI 2 "reg_or_cint_operand" "ri"))
1110: (match_operand:SI 3 "mask_operand" "L")))]
1111: ""
1112: "rl%I2nm %0,%1,%h2,%m3,%M3")
1113:
1114: (define_insn ""
1115: [(set (match_operand:CC 0 "cc_reg_operand" "=x")
1116: (compare:CC (and:SI
1117: (rotate:SI (match_operand:SI 1 "gen_reg_operand" "r")
1118: (match_operand:SI 2 "reg_or_cint_operand" "ri"))
1119: (match_operand:SI 3 "mask_operand" "L"))
1120: (const_int 0)))
1121: (clobber (match_scratch:SI 4 "=r"))]
1122: ""
1123: "rl%I2nm. %4,%1,%h2,%m3,%M3"
1124: [(set_attr "type" "delayed_compare")])
1125:
1126: (define_insn ""
1127: [(set (match_operand:CC 4 "cc_reg_operand" "=x")
1128: (compare:CC (and:SI
1129: (rotate:SI (match_operand:SI 1 "gen_reg_operand" "r")
1130: (match_operand:SI 2 "reg_or_cint_operand" "ri"))
1131: (match_operand:SI 3 "mask_operand" "L"))
1132: (const_int 0)))
1133: (set (match_operand:SI 0 "gen_reg_operand" "=r")
1134: (and:SI (rotate:SI (match_dup 1) (match_dup 2)) (match_dup 3)))]
1135: ""
1136: "rl%I2nm. %0,%1,%h2,%m3,%M3"
1137: [(set_attr "type" "delayed_compare")])
1138:
1139: (define_insn ""
1140: [(set (match_operand:SI 0 "gen_reg_operand" "=r")
1141: (zero_extend:SI
1142: (subreg:QI
1143: (rotate:SI (match_operand:SI 1 "gen_reg_operand" "r")
1144: (match_operand:SI 2 "reg_or_cint_operand" "ri")) 0)))]
1145: ""
1146: "rl%I2nm %0,%1,%h2,24,31")
1147:
1148: (define_insn ""
1149: [(set (match_operand:CC 0 "cc_reg_operand" "=x")
1150: (compare:CC (zero_extend:SI
1151: (subreg:QI
1152: (rotate:SI (match_operand:SI 1 "gen_reg_operand" "r")
1153: (match_operand:SI 2 "reg_or_cint_operand" "ri")) 0))
1154: (const_int 0)))
1155: (clobber (match_scratch:SI 3 "=r"))]
1156: ""
1157: "rl%I2nm. %3,%1,%h2,24,31"
1158: [(set_attr "type" "delayed_compare")])
1159:
1160: (define_insn ""
1161: [(set (match_operand:CC 3 "cc_reg_operand" "=x")
1162: (compare:CC (zero_extend:SI
1163: (subreg:QI
1164: (rotate:SI (match_operand:SI 1 "gen_reg_operand" "r")
1165: (match_operand:SI 2 "reg_or_cint_operand" "ri")) 0))
1166: (const_int 0)))
1167: (set (match_operand:SI 0 "gen_reg_operand" "=r")
1168: (zero_extend:SI (subreg:QI (rotate:SI (match_dup 1) (match_dup 2)) 0)))]
1169: ""
1170: "rl%I2nm. %0,%1,%h2,24,31"
1171: [(set_attr "type" "delayed_compare")])
1172:
1173: (define_insn ""
1174: [(set (match_operand:SI 0 "gen_reg_operand" "=r")
1175: (zero_extend:SI
1176: (subreg:HI
1177: (rotate:SI (match_operand:SI 1 "gen_reg_operand" "r")
1178: (match_operand:SI 2 "reg_or_cint_operand" "ri")) 0)))]
1179: ""
1180: "rl%I2nm %0,%1,%h2,16,31")
1181:
1182: (define_insn ""
1183: [(set (match_operand:CC 0 "cc_reg_operand" "=x")
1184: (compare:CC (zero_extend:SI
1185: (subreg:HI
1186: (rotate:SI (match_operand:SI 1 "gen_reg_operand" "r")
1187: (match_operand:SI 2 "reg_or_cint_operand" "ri")) 0))
1188: (const_int 0)))
1189: (clobber (match_scratch:SI 3 "=r"))]
1190: ""
1191: "rl%I2nm. %3,%1,%h2,16,31"
1192: [(set_attr "type" "delayed_compare")])
1193:
1194: (define_insn ""
1195: [(set (match_operand:CC 3 "cc_reg_operand" "=x")
1196: (compare:CC (zero_extend:SI
1197: (subreg:HI
1198: (rotate:SI (match_operand:SI 1 "gen_reg_operand" "r")
1199: (match_operand:SI 2 "reg_or_cint_operand" "ri")) 0))
1200: (const_int 0)))
1201: (set (match_operand:SI 0 "gen_reg_operand" "=r")
1202: (zero_extend:SI (subreg:HI (rotate:SI (match_dup 1) (match_dup 2)) 0)))]
1203: ""
1204: "rl%I2nm. %0,%1,%h2,16,31"
1205: [(set_attr "type" "delayed_compare")])
1206:
1207: ;; Note that we use "sle." instead of "sl." so that we can set
1208: ;; SHIFT_COUNT_TRUNCATED.
1209:
1210: (define_insn "ashlsi3"
1211: [(set (match_operand:SI 0 "gen_reg_operand" "=r,r")
1212: (ashift:SI (match_operand:SI 1 "gen_reg_operand" "r,r")
1213: (match_operand:SI 2 "reg_or_cint_operand" "r,i")))
1214: (clobber (match_scratch:SI 3 "=q,X"))]
1215: ""
1216: "@
1217: sle %0,%1,%2
1218: sli %0,%1,%h2")
1219:
1220: (define_insn ""
1221: [(set (match_operand:CC 0 "cc_reg_operand" "=x,x")
1222: (compare:CC (ashift:SI (match_operand:SI 1 "gen_reg_operand" "r,r")
1223: (match_operand:SI 2 "reg_or_cint_operand" "r,i"))
1224: (const_int 0)))
1225: (clobber (match_scratch:SI 3 "=r,r"))
1226: (clobber (match_scratch:SI 4 "=q,X"))]
1227: ""
1228: "@
1229: sle. %3,%1,%2
1230: sli. %3,%1,%h2"
1231: [(set_attr "type" "delayed_compare")])
1232:
1233: (define_insn ""
1234: [(set (match_operand:CC 3 "cc_reg_operand" "=x,x")
1235: (compare:CC (ashift:SI (match_operand:SI 1 "gen_reg_operand" "r,r")
1236: (match_operand:SI 2 "reg_or_cint_operand" "r,i"))
1237: (const_int 0)))
1238: (set (match_operand:SI 0 "gen_reg_operand" "=r,r")
1239: (ashift:SI (match_dup 1) (match_dup 2)))
1240: (clobber (match_scratch:SI 4 "=q,X"))]
1241: ""
1242: "@
1243: sle. %0,%1,%2
1244: sli. %0,%1,%h2"
1245: [(set_attr "type" "delayed_compare")])
1246:
1247: (define_insn ""
1248: [(set (match_operand:SI 0 "gen_reg_operand" "=r")
1249: (and:SI (ashift:SI (match_operand:SI 1 "gen_reg_operand" "r")
1250: (match_operand:SI 2 "const_int_operand" "i"))
1251: (match_operand:SI 3 "mask_operand" "L")))]
1252: "includes_lshift_p (operands[2], operands[3])"
1253: "rlinm %0,%h1,%h2,%m3,%M3")
1254:
1255: (define_insn ""
1256: [(set (match_operand:CC 0 "cc_reg_operand" "=x")
1257: (compare:CC
1258: (and:SI (ashift:SI (match_operand:SI 1 "gen_reg_operand" "r")
1259: (match_operand:SI 2 "const_int_operand" "i"))
1260: (match_operand:SI 3 "mask_operand" "L"))
1261: (const_int 0)))
1262: (clobber (match_scratch:SI 4 "=r"))]
1263: "includes_lshift_p (operands[2], operands[3])"
1264: "rlinm. %4,%h1,%h2,%m3,%M3"
1265: [(set_attr "type" "delayed_compare")])
1266:
1267: (define_insn ""
1268: [(set (match_operand:CC 4 "cc_reg_operand" "=x")
1269: (compare:CC
1270: (and:SI (ashift:SI (match_operand:SI 1 "gen_reg_operand" "r")
1271: (match_operand:SI 2 "const_int_operand" "i"))
1272: (match_operand:SI 3 "mask_operand" "L"))
1273: (const_int 0)))
1274: (set (match_operand:SI 0 "gen_reg_operand" "=r")
1275: (and:SI (ashift:SI (match_dup 1) (match_dup 2)) (match_dup 3)))]
1276: "includes_lshift_p (operands[2], operands[3])"
1277: "rlinm. %0,%h1,%h2,%m3,%M3"
1278: [(set_attr "type" "delayed_compare")])
1279:
1280: (define_insn "lshrsi3"
1281: [(set (match_operand:SI 0 "gen_reg_operand" "=r,r")
1282: (lshiftrt:SI (match_operand:SI 1 "gen_reg_operand" "r,r")
1283: (match_operand:SI 2 "reg_or_cint_operand" "r,i")))
1284: (clobber (match_scratch:SI 3 "=q,X"))]
1285: ""
1286: "@
1287: sre %0,%1,%2
1288: sri %0,%1,%h2")
1289:
1290: (define_insn ""
1291: [(set (match_operand:CC 0 "cc_reg_operand" "=x,x")
1292: (compare:CC (lshiftrt:SI (match_operand:SI 1 "gen_reg_operand" "r,r")
1293: (match_operand:SI 2 "reg_or_cint_operand" "r,i"))
1294: (const_int 0)))
1295: (clobber (match_scratch:SI 3 "=r,r"))
1296: (clobber (match_scratch:SI 4 "=q,X"))]
1297: ""
1298: "@
1299: sre. %3,%1,%2
1300: sri. %3,%1,%h2"
1301: [(set_attr "type" "delayed_compare")])
1302:
1303: (define_insn ""
1304: [(set (match_operand:CC 3 "cc_reg_operand" "=x,x")
1305: (compare:CC (lshiftrt:SI (match_operand:SI 1 "gen_reg_operand" "r,r")
1306: (match_operand:SI 2 "reg_or_cint_operand" "r,i"))
1307: (const_int 0)))
1308: (set (match_operand:SI 0 "gen_reg_operand" "=r,r")
1309: (lshiftrt:SI (match_dup 1) (match_dup 2)))
1310: (clobber (match_scratch:SI 4 "=q,X"))]
1311: ""
1312: "@
1313: sre. %0,%1,%2
1314: sri. %0,%1,%h2"
1315: [(set_attr "type" "delayed_compare")])
1316:
1317: (define_insn ""
1318: [(set (match_operand:SI 0 "gen_reg_operand" "=r")
1319: (and:SI (lshiftrt:SI (match_operand:SI 1 "gen_reg_operand" "r")
1320: (match_operand:SI 2 "const_int_operand" "i"))
1321: (match_operand:SI 3 "mask_operand" "L")))]
1322: "includes_rshift_p (operands[2], operands[3])"
1323: "rlinm %0,%1,%s2,%m3,%M3")
1324:
1325: (define_insn ""
1326: [(set (match_operand:CC 0 "cc_reg_operand" "=x")
1327: (compare:CC
1328: (and:SI (lshiftrt:SI (match_operand:SI 1 "gen_reg_operand" "r")
1329: (match_operand:SI 2 "const_int_operand" "i"))
1330: (match_operand:SI 3 "mask_operand" "L"))
1331: (const_int 0)))
1332: (clobber (match_scratch:SI 4 "=r"))]
1333: "includes_rshift_p (operands[2], operands[3])"
1334: "rlinm. %4,%1,%s2,%m3,%M3"
1335: [(set_attr "type" "delayed_compare")])
1336:
1337: (define_insn ""
1338: [(set (match_operand:CC 4 "cc_reg_operand" "=x")
1339: (compare:CC
1340: (and:SI (lshiftrt:SI (match_operand:SI 1 "gen_reg_operand" "r")
1341: (match_operand:SI 2 "const_int_operand" "i"))
1342: (match_operand:SI 3 "mask_operand" "L"))
1343: (const_int 0)))
1344: (set (match_operand:SI 0 "gen_reg_operand" "=r")
1345: (and:SI (lshiftrt:SI (match_dup 1) (match_dup 2)) (match_dup 3)))]
1346: "includes_rshift_p (operands[2], operands[3])"
1347: "rlinm. %0,%1,%s2,%m3,%M3"
1348: [(set_attr "type" "delayed_compare")])
1349:
1350: (define_insn ""
1351: [(set (match_operand:SI 0 "gen_reg_operand" "=r")
1352: (zero_extend:SI
1353: (subreg:QI
1354: (lshiftrt:SI (match_operand:SI 1 "gen_reg_operand" "r")
1355: (match_operand:SI 2 "const_int_operand" "i")) 0)))]
1356: "includes_rshift_p (operands[2], gen_rtx (CONST_INT, VOIDmode, 255))"
1357: "rlinm %0,%1,%s2,24,31")
1358:
1359: (define_insn ""
1360: [(set (match_operand:CC 0 "cc_reg_operand" "=x")
1361: (compare:CC
1362: (zero_extend:SI
1363: (subreg:QI
1364: (lshiftrt:SI (match_operand:SI 1 "gen_reg_operand" "r")
1365: (match_operand:SI 2 "const_int_operand" "i")) 0))
1366: (const_int 0)))
1367: (clobber (match_scratch:SI 3 "=r"))]
1368: "includes_rshift_p (operands[2], gen_rtx (CONST_INT, VOIDmode, 255))"
1369: "rlinm. %3,%1,%s2,24,31"
1370: [(set_attr "type" "delayed_compare")])
1371:
1372: (define_insn ""
1373: [(set (match_operand:CC 3 "cc_reg_operand" "=x")
1374: (compare:CC
1375: (zero_extend:SI
1376: (subreg:QI
1377: (lshiftrt:SI (match_operand:SI 1 "gen_reg_operand" "r")
1378: (match_operand:SI 2 "const_int_operand" "i")) 0))
1379: (const_int 0)))
1380: (set (match_operand:SI 0 "gen_reg_operand" "=r")
1381: (zero_extend:SI (subreg:QI (lshiftrt:SI (match_dup 1) (match_dup 2)) 0)))]
1382: "includes_rshift_p (operands[2], gen_rtx (CONST_INT, VOIDmode, 255))"
1383: "rlinm. %0,%1,%s2,24,31"
1384: [(set_attr "type" "delayed_compare")])
1385:
1386: (define_insn ""
1387: [(set (match_operand:SI 0 "gen_reg_operand" "=r")
1388: (zero_extend:SI
1389: (subreg:HI
1390: (lshiftrt:SI (match_operand:SI 1 "gen_reg_operand" "r")
1391: (match_operand:SI 2 "const_int_operand" "i")) 0)))]
1392: "includes_rshift_p (operands[2], gen_rtx (CONST_INT, VOIDmode, 65535))"
1393: "rlinm %0,%1,%s2,16,31")
1394:
1395: (define_insn ""
1396: [(set (match_operand:CC 0 "cc_reg_operand" "=x")
1397: (compare:CC
1398: (zero_extend:SI
1399: (subreg:HI
1400: (lshiftrt:SI (match_operand:SI 1 "gen_reg_operand" "r")
1401: (match_operand:SI 2 "const_int_operand" "i")) 0))
1402: (const_int 0)))
1403: (clobber (match_scratch:SI 3 "=r"))]
1404: "includes_rshift_p (operands[2], gen_rtx (CONST_INT, VOIDmode, 65535))"
1405: "rlinm. %3,%1,%s2,16,31"
1406: [(set_attr "type" "delayed_compare")])
1407:
1408: (define_insn ""
1409: [(set (match_operand:CC 3 "cc_reg_operand" "=x")
1410: (compare:CC
1411: (zero_extend:SI
1412: (subreg:HI
1413: (lshiftrt:SI (match_operand:SI 1 "gen_reg_operand" "r")
1414: (match_operand:SI 2 "const_int_operand" "i")) 0))
1415: (const_int 0)))
1416: (set (match_operand:SI 0 "gen_reg_operand" "=r")
1417: (zero_extend:SI (subreg:HI (lshiftrt:SI (match_dup 1) (match_dup 2)) 0)))]
1418: "includes_rshift_p (operands[2], gen_rtx (CONST_INT, VOIDmode, 65535))"
1419: "rlinm. %0,%1,%s2,16,31"
1420: [(set_attr "type" "delayed_compare")])
1421:
1422: (define_insn ""
1423: [(set (zero_extract:SI (match_operand:SI 0 "gen_reg_operand" "+r")
1424: (const_int 1)
1425: (match_operand:SI 1 "gen_reg_operand" "r"))
1426: (ashiftrt:SI (match_operand:SI 2 "gen_reg_operand" "r")
1427: (const_int 31)))]
1428: ""
1429: "rrib %0,%1,%2")
1430:
1431: (define_insn ""
1432: [(set (zero_extract:SI (match_operand:SI 0 "gen_reg_operand" "+r")
1433: (const_int 1)
1434: (match_operand:SI 1 "gen_reg_operand" "r"))
1435: (lshiftrt:SI (match_operand:SI 2 "gen_reg_operand" "r")
1436: (const_int 31)))]
1437: ""
1438: "rrib %0,%1,%2")
1439:
1440: (define_insn ""
1441: [(set (zero_extract:SI (match_operand:SI 0 "gen_reg_operand" "+r")
1442: (const_int 1)
1443: (match_operand:SI 1 "gen_reg_operand" "r"))
1444: (zero_extract:SI (match_operand:SI 2 "gen_reg_operand" "r")
1445: (const_int 1)
1446: (const_int 0)))]
1447: ""
1448: "rrib %0,%1,%2")
1449:
1450: (define_insn "ashrsi3"
1451: [(set (match_operand:SI 0 "gen_reg_operand" "=r,r")
1452: (ashiftrt:SI (match_operand:SI 1 "gen_reg_operand" "r,r")
1453: (match_operand:SI 2 "reg_or_cint_operand" "r,i")))
1454: (clobber (match_scratch:SI 3 "=q,X"))]
1455: ""
1456: "@
1457: srea %0,%1,%2
1458: srai %0,%1,%h2")
1459:
1460: (define_insn ""
1461: [(set (match_operand:CC 0 "cc_reg_operand" "=x,x")
1462: (compare:CC (ashiftrt:SI (match_operand:SI 1 "gen_reg_operand" "r,r")
1463: (match_operand:SI 2 "reg_or_cint_operand" "r,i"))
1464: (const_int 0)))
1465: (clobber (match_scratch:SI 3 "=r,r"))
1466: (clobber (match_scratch:SI 4 "=q,X"))]
1467: ""
1468: "@
1469: srea. %3,%1,%2
1470: srai. %3,%1,%h2"
1471: [(set_attr "type" "delayed_compare")])
1472:
1473: (define_insn ""
1474: [(set (match_operand:CC 3 "cc_reg_operand" "=x,x")
1475: (compare:CC (ashiftrt:SI (match_operand:SI 1 "gen_reg_operand" "r,r")
1476: (match_operand:SI 2 "reg_or_cint_operand" "r,i"))
1477: (const_int 0)))
1478: (set (match_operand:SI 0 "gen_reg_operand" "=r,r")
1479: (ashiftrt:SI (match_dup 1) (match_dup 2)))
1480: (clobber (match_scratch:SI 4 "=q,X"))]
1481: ""
1482: "@
1483: srea. %0,%1,%2
1484: srai. %0,%1,%h2"
1485: [(set_attr "type" "delayed_compare")])
1486:
1487: (define_expand "extendqisi2"
1488: [(parallel [(set (match_dup 2)
1489: (ashift:SI (match_operand:QI 1 "gen_reg_operand" "")
1490: (const_int 24)))
1491: (clobber (scratch:SI))])
1492: (parallel [(set (match_operand:SI 0 "gen_reg_operand" "")
1493: (ashiftrt:SI (match_dup 2)
1494: (const_int 24)))
1495: (clobber (scratch:SI))])]
1496: ""
1497: "
1498: { operands[1] = gen_lowpart (SImode, operands[1]);
1499: operands[2] = gen_reg_rtx (SImode); }")
1500:
1501: (define_expand "extendqihi2"
1502: [(parallel [(set (match_dup 2)
1503: (ashift:SI (match_operand:QI 1 "gen_reg_operand" "")
1504: (const_int 24)))
1505: (clobber (scratch:SI))])
1506: (parallel [(set (match_operand:HI 0 "gen_reg_operand" "")
1507: (ashiftrt:SI (match_dup 2)
1508: (const_int 24)))
1509: (clobber (scratch:SI))])]
1510: ""
1511: "
1512: { operands[0] = gen_lowpart (SImode, operands[0]);
1513: operands[1] = gen_lowpart (SImode, operands[1]);
1514: operands[2] = gen_reg_rtx (SImode); }")
1515:
1516: ;; Floating-point insns, excluding normal data motion.
1517: ;;
1518: ;; We pretend that we have both SFmode and DFmode insns, while, in fact,
1519: ;; all fp insns are actually done in double. The only conversions we will
1520: ;; do will be when storing to memory. In that case, we will use the "frsp"
1521: ;; instruction before storing.
1522: ;;
1523: ;; Note that when we store into a single-precision memory location, we need to
1524: ;; use the frsp insn first. If the register being stored isn't dead, we
1525: ;; need a scratch register for the frsp. But this is difficult when the store
1526: ;; is done by reload. It is not incorrect to do the frsp on the register in
1527: ;; this case, we just lose precision that we would have otherwise gotten but
1528: ;; is not guaranteed. Perhaps this should be tightened up at some point.
1529:
1530: (define_insn "extendsfdf2"
1531: [(set (match_operand:DF 0 "gen_reg_operand" "=f")
1532: (float_extend:DF (match_operand:SF 1 "gen_reg_operand" "f")))]
1533: ""
1534: "*
1535: {
1536: if (REGNO (operands[0]) == REGNO (operands[1]))
1537: return \"\";
1538: else
1539: return \"fmr %0,%1\";
1540: }"
1541: [(set_attr "type" "fp")])
1542:
1543: (define_insn "truncdfsf2"
1544: [(set (match_operand:SF 0 "gen_reg_operand" "=f")
1545: (float_truncate:SF (match_operand:DF 1 "gen_reg_operand" "f")))]
1546: ""
1547: "*
1548: {
1549: if (REGNO (operands[0]) == REGNO (operands[1]))
1550: return \"\";
1551: else
1552: return \"fmr %0,%1\";
1553: }"
1554: [(set_attr "type" "fp")])
1555:
1556: (define_insn "negsf2"
1557: [(set (match_operand:SF 0 "gen_reg_operand" "=f")
1558: (neg:SF (match_operand:SF 1 "gen_reg_operand" "f")))]
1559: ""
1560: "fneg %0,%1"
1561: [(set_attr "type" "fp")])
1562:
1563: (define_insn "abssf2"
1564: [(set (match_operand:SF 0 "gen_reg_operand" "=f")
1565: (abs:SF (match_operand:SF 1 "gen_reg_operand" "f")))]
1566: ""
1567: "fabs %0,%1"
1568: [(set_attr "type" "fp")])
1569:
1570: (define_insn ""
1571: [(set (match_operand:SF 0 "gen_reg_operand" "=f")
1572: (neg:SF (abs:SF (match_operand:SF 1 "gen_reg_operand" "f"))))]
1573: ""
1574: "fnabs %0,%1"
1575: [(set_attr "type" "fp")])
1576:
1577: (define_insn "addsf3"
1578: [(set (match_operand:SF 0 "gen_reg_operand" "=f")
1579: (plus:SF (match_operand:SF 1 "gen_reg_operand" "%f")
1580: (match_operand:SF 2 "gen_reg_operand" "f")))]
1581: ""
1582: "fa %0,%1,%2"
1583: [(set_attr "type" "fp")])
1584:
1585: (define_insn "subsf3"
1586: [(set (match_operand:SF 0 "gen_reg_operand" "=f")
1587: (minus:SF (match_operand:SF 1 "gen_reg_operand" "f")
1588: (match_operand:SF 2 "gen_reg_operand" "f")))]
1589: ""
1590: "fs %0,%1,%2"
1591: [(set_attr "type" "fp")])
1592:
1593: (define_insn "mulsf3"
1594: [(set (match_operand:SF 0 "gen_reg_operand" "=f")
1595: (mult:SF (match_operand:SF 1 "gen_reg_operand" "%f")
1596: (match_operand:SF 2 "gen_reg_operand" "f")))]
1597: ""
1598: "fm %0,%1,%2"
1599: [(set_attr "type" "fp")])
1600:
1601: (define_insn "divsf3"
1602: [(set (match_operand:SF 0 "gen_reg_operand" "=f")
1603: (div:SF (match_operand:SF 1 "gen_reg_operand" "f")
1604: (match_operand:SF 2 "gen_reg_operand" "f")))]
1605: ""
1606: "fd %0,%1,%2"
1607: [(set_attr "type" "fp")])
1608:
1609: (define_insn ""
1610: [(set (match_operand:SF 0 "gen_reg_operand" "=f")
1611: (plus:SF (mult:SF (match_operand:SF 1 "gen_reg_operand" "%f")
1612: (match_operand:SF 2 "gen_reg_operand" "f"))
1613: (match_operand:SF 3 "gen_reg_operand" "f")))]
1614: ""
1615: "fma %0,%1,%2,%3"
1616: [(set_attr "type" "fp")])
1617:
1618: (define_insn ""
1619: [(set (match_operand:SF 0 "gen_reg_operand" "=f")
1620: (minus:SF (mult:SF (match_operand:SF 1 "gen_reg_operand" "%f")
1621: (match_operand:SF 2 "gen_reg_operand" "f"))
1622: (match_operand:SF 3 "gen_reg_operand" "f")))]
1623: ""
1624: "fms %0,%1,%2,%3"
1625: [(set_attr "type" "fp")])
1626:
1627: (define_insn ""
1628: [(set (match_operand:SF 0 "gen_reg_operand" "=f")
1629: (neg:SF (plus:SF (mult:SF (match_operand:SF 1 "gen_reg_operand" "%f")
1630: (match_operand:SF 2 "gen_reg_operand" "f"))
1631: (match_operand:SF 3 "gen_reg_operand" "f"))))]
1632: ""
1633: "fnma %0,%1,%2,%3"
1634: [(set_attr "type" "fp")])
1635:
1636: (define_insn ""
1637: [(set (match_operand:SF 0 "gen_reg_operand" "=f")
1638: (neg:SF (minus:SF (mult:SF (match_operand:SF 1 "gen_reg_operand" "%f")
1639: (match_operand:SF 2 "gen_reg_operand" "f"))
1640: (match_operand:SF 3 "gen_reg_operand" "f"))))]
1641: ""
1642: "fnms %0,%1,%2,%3"
1643: [(set_attr "type" "fp")])
1644:
1645: (define_insn "negdf2"
1646: [(set (match_operand:DF 0 "gen_reg_operand" "=f")
1647: (neg:DF (match_operand:DF 1 "gen_reg_operand" "f")))]
1648: ""
1649: "fneg %0,%1"
1650: [(set_attr "type" "fp")])
1651:
1652: (define_insn "absdf2"
1653: [(set (match_operand:DF 0 "gen_reg_operand" "=f")
1654: (abs:DF (match_operand:DF 1 "gen_reg_operand" "f")))]
1655: ""
1656: "fabs %0,%1"
1657: [(set_attr "type" "fp")])
1658:
1659: (define_insn ""
1660: [(set (match_operand:DF 0 "gen_reg_operand" "=f")
1661: (neg:DF (abs:DF (match_operand:DF 1 "gen_reg_operand" "f"))))]
1662: ""
1663: "fnabs %0,%1"
1664: [(set_attr "type" "fp")])
1665:
1666: (define_insn "adddf3"
1667: [(set (match_operand:DF 0 "gen_reg_operand" "=f")
1668: (plus:DF (match_operand:DF 1 "gen_reg_operand" "%f")
1669: (match_operand:DF 2 "gen_reg_operand" "f")))]
1670: ""
1671: "fa %0,%1,%2"
1672: [(set_attr "type" "fp")])
1673:
1674: (define_insn "subdf3"
1675: [(set (match_operand:DF 0 "gen_reg_operand" "=f")
1676: (minus:DF (match_operand:DF 1 "gen_reg_operand" "f")
1677: (match_operand:DF 2 "gen_reg_operand" "f")))]
1678: ""
1679: "fs %0,%1,%2"
1680: [(set_attr "type" "fp")])
1681:
1682: (define_insn "muldf3"
1683: [(set (match_operand:DF 0 "gen_reg_operand" "=f")
1684: (mult:DF (match_operand:DF 1 "gen_reg_operand" "%f")
1685: (match_operand:DF 2 "gen_reg_operand" "f")))]
1686: ""
1687: "fm %0,%1,%2"
1688: [(set_attr "type" "fp")])
1689:
1690: (define_insn "divdf3"
1691: [(set (match_operand:DF 0 "gen_reg_operand" "=f")
1692: (div:DF (match_operand:DF 1 "gen_reg_operand" "f")
1693: (match_operand:DF 2 "gen_reg_operand" "f")))]
1694: ""
1695: "fd %0,%1,%2"
1696: [(set_attr "type" "fp")])
1697:
1698: (define_insn ""
1699: [(set (match_operand:DF 0 "gen_reg_operand" "=f")
1700: (plus:DF (mult:DF (match_operand:DF 1 "gen_reg_operand" "%f")
1701: (match_operand:DF 2 "gen_reg_operand" "f"))
1702: (match_operand:DF 3 "gen_reg_operand" "f")))]
1703: ""
1704: "fma %0,%1,%2,%3"
1705: [(set_attr "type" "fp")])
1706:
1707: (define_insn ""
1708: [(set (match_operand:DF 0 "gen_reg_operand" "=f")
1709: (minus:DF (mult:DF (match_operand:DF 1 "gen_reg_operand" "%f")
1710: (match_operand:DF 2 "gen_reg_operand" "f"))
1711: (match_operand:DF 3 "gen_reg_operand" "f")))]
1712: ""
1713: "fms %0,%1,%2,%3"
1714: [(set_attr "type" "fp")])
1715:
1716: (define_insn ""
1717: [(set (match_operand:DF 0 "gen_reg_operand" "=f")
1718: (neg:DF (plus:DF (mult:DF (match_operand:DF 1 "gen_reg_operand" "%f")
1719: (match_operand:DF 2 "gen_reg_operand" "f"))
1720: (match_operand:DF 3 "gen_reg_operand" "f"))))]
1721: ""
1722: "fnma %0,%1,%2,%3"
1723: [(set_attr "type" "fp")])
1724:
1725: (define_insn ""
1726: [(set (match_operand:DF 0 "gen_reg_operand" "=f")
1727: (neg:DF (minus:DF (mult:DF (match_operand:DF 1 "gen_reg_operand" "%f")
1728: (match_operand:DF 2 "gen_reg_operand" "f"))
1729: (match_operand:DF 3 "gen_reg_operand" "f"))))]
1730: ""
1731: "fnms %0,%1,%2,%3"
1732: [(set_attr "type" "fp")])
1733:
1734: ;; Conversions to and from floating-point.
1735: (define_expand "floatsidf2"
1736: [(set (match_dup 2)
1737: (plus:DI (zero_extend:DI
1738: (xor:SI (match_operand:SI 1 "gen_reg_operand" "")
1739: (match_dup 3)))
1740: (match_dup 4)))
1741: (set (match_operand:DF 0 "gen_reg_operand" "")
1742: (minus:DF (subreg:DF (match_dup 2) 0)
1743: (match_dup 5)))]
1744: ""
1745: "
1746: {
1747: #if HOST_BITS_PER_INT != BITS_PER_WORD
1748: /* Maybe someone can figure out how to do this in that case. I don't
1749: want to right now. */
1750: abort ();
1751: #endif
1752:
1753: operands[2] = gen_reg_rtx (DImode);
1754: operands[3] = gen_rtx (CONST_INT, VOIDmode, 0x80000000);
1755: operands[4] = immed_double_const (0, 0x43300000, DImode);
1756: operands[5] = force_reg (DFmode, immed_double_const (0x43300000,
1757: 0x80000000, DFmode));
1758: }")
1759:
1760: (define_expand "floatunssidf2"
1761: [(set (match_dup 2)
1762: (plus:DI (zero_extend:DI (match_operand:SI 1 "gen_reg_operand" ""))
1763: (match_dup 3)))
1764: (set (match_operand:DF 0 "gen_reg_operand" "")
1765: (minus:DF (subreg:DF (match_dup 2) 0)
1766: (match_dup 4)))]
1767: ""
1768: "
1769: {
1770: #if HOST_BITS_PER_INT != BITS_PER_WORD
1771: /* Maybe someone can figure out how to do this in that case. I don't
1772: want to right now. */
1773: abort ();
1774: #endif
1775:
1776: operands[2] = gen_reg_rtx (DImode);
1777: operands[3] = immed_double_const (0, 0x43300000, DImode);
1778: operands[4] = force_reg (DFmode, immed_double_const (0x43300000, 0, DFmode));
1779: }")
1780:
1781: ;; For the above two cases, we always split.
1782: (define_split
1783: [(set (match_operand:DI 0 "gen_reg_operand" "")
1784: (plus:DI (zero_extend:DI
1785: (xor:SI (match_operand:SI 1 "gen_reg_operand" "")
1786: (match_operand:SI 2 "logical_operand" "")))
1787: (match_operand:DI 3 "immediate_operand" "")))]
1788: "reload_completed && HOST_BITS_PER_INT == BITS_PER_WORD
1789: && GET_CODE (operands[3]) == CONST_DOUBLE
1790: && CONST_DOUBLE_LOW (operands[3]) == 0"
1791: [(set (match_dup 6) (xor:SI (match_dup 1) (match_dup 2)))
1792: (set (match_dup 4) (match_dup 5))]
1793: "
1794: { operands[4] = operand_subword (operands[0], 0, 0, DImode);
1795: operands[5] = operand_subword (operands[3], 0, 0, DImode);
1796: operands[6] = operand_subword (operands[0], 1, 0, DImode);
1797: }")
1798:
1799: (define_insn ""
1800: [(set (match_operand:DI 0 "gen_reg_operand" "=r")
1801: (plus:DI (zero_extend:DI
1802: (xor:SI (match_operand:SI 1 "gen_reg_operand" "%r")
1803: (match_operand:SI 2 "logical_operand" "rKJ")))
1804: (match_operand:DI 3 "immediate_operand" "n")))]
1805: "HOST_BITS_PER_INT == BITS_PER_WORD
1806: && GET_CODE (operands[3]) == CONST_DOUBLE
1807: && CONST_DOUBLE_LOW (operands[3]) == 0"
1808: "#")
1809:
1810: (define_split
1811: [(set (match_operand:DI 0 "gen_reg_operand" "=")
1812: (plus:DI (zero_extend:DI (match_operand:SI 1 "gen_reg_operand" ""))
1813: (match_operand:DI 2 "immediate_operand" "")))]
1814: "reload_completed && HOST_BITS_PER_INT == BITS_PER_WORD
1815: && GET_CODE (operands[2]) == CONST_DOUBLE
1816: && CONST_DOUBLE_LOW (operands[2]) == 0"
1817: [(set (match_dup 3) (match_dup 4))
1818: (set (match_dup 5) (match_dup 1))]
1819: "
1820: { operands[3] = operand_subword (operands[0], 0, 0, DImode);
1821: operands[4] = operand_subword (operands[2], 0, 0, DImode);
1822: operands[5] = operand_subword (operands[0], 1, 0, DImode);
1823:
1824: if (rtx_equal_p (operands[1], operands[5]))
1825: {
1826: emit_move_insn (operands[3], operands[4]);
1827: DONE;
1828: }
1829: }")
1830:
1831: (define_insn ""
1832: [(set (match_operand:DI 0 "gen_reg_operand" "=r")
1833: (plus:DI (zero_extend:DI (match_operand:SI 1 "gen_reg_operand" "r"))
1834: (match_operand:DI 2 "immediate_operand" "n")))]
1835: "HOST_BITS_PER_INT == BITS_PER_WORD
1836: && GET_CODE (operands[2]) == CONST_DOUBLE
1837: && CONST_DOUBLE_LOW (operands[2]) == 0"
1838: "#")
1839:
1840: (define_expand "fix_truncdfsi2"
1841: [(set (match_operand:SI 0 "gen_reg_operand" "")
1842: (fix:DF (match_operand:DF 1 "gen_reg_operand" "")))]
1843: ""
1844: "
1845: {
1846: emit_insn (gen_trunc_call (operands[0], operands[1],
1847: gen_rtx (SYMBOL_REF, Pmode, \"itrunc\")));
1848: DONE;
1849: }")
1850:
1851: (define_expand "fixuns_truncdfsi2"
1852: [(set (match_operand:SI 0 "gen_reg_operand" "")
1853: (unsigned_fix:DF (match_operand:DF 1 "gen_reg_operand" "")))]
1854: ""
1855: "
1856: {
1857: emit_insn (gen_trunc_call (operands[0], operands[1],
1858: gen_rtx (SYMBOL_REF, Pmode, \"uitrunc\")));
1859: DONE;
1860: }")
1861:
1862:
1863: (define_expand "trunc_call"
1864: [(parallel [(set (match_operand:SI 0 "" "")
1865: (fix:DF (match_operand:DF 1 "" "")))
1866: (use (match_operand:SI 2 "" ""))])]
1867: ""
1868: "
1869: {
1870: rtx insns = gen_trunc_call_rtl (operands[0], operands[1], operands[2]);
1871: rtx first = XVECEXP (insns, 0, 0);
1872: rtx last = XVECEXP (insns, 0, XVECLEN (insns, 0) - 1);
1873:
1874: REG_NOTES (first) = gen_rtx (INSN_LIST, REG_LIBCALL, last,
1875: REG_NOTES (first));
1876: REG_NOTES (last) = gen_rtx (INSN_LIST, REG_RETVAL, first, REG_NOTES (last));
1877:
1878: emit_insn (insns);
1879: DONE;
1880: }")
1881:
1882: (define_expand "trunc_call_rtl"
1883: [(set (reg:DF 33) (match_operand:DF 1 "gen_reg_operand" ""))
1884: (use (reg:DF 33))
1885: (parallel [(set (reg:SI 3)
1886: (call (mem:SI (match_operand 2 "" "")) (const_int 0)))
1887: (clobber (scratch:SI))])
1888: (set (match_operand:SI 0 "gen_reg_operand" "")
1889: (reg:SI 3))]
1890: ""
1891: "
1892: {
1893: rs6000_trunc_used = 1;
1894: }")
1895:
1896: ;; Define the DImode operations that can be done in a small number
1897: ;; of instructions.
1898: (define_insn "adddi3"
1899: [(set (match_operand:DI 0 "gen_reg_operand" "=r")
1900: (plus:DI (match_operand:DI 1 "gen_reg_operand" "%r")
1901: (match_operand:DI 2 "gen_reg_operand" "r")))]
1902: ""
1903: "a %L0,%L1,%L2\;ae %0,%1,%2")
1904:
1905: (define_insn "subdi3"
1906: [(set (match_operand:DI 0 "gen_reg_operand" "=r")
1907: (minus:DI (match_operand:DI 1 "gen_reg_operand" "r")
1908: (match_operand:DI 2 "gen_reg_operand" "r")))]
1909: ""
1910: "sf %L0,%L2,%L1\;sfe %0,%2,%1")
1911:
1912: (define_insn "negdi3"
1913: [(set (match_operand:DI 0 "gen_reg_operand" "=r")
1914: (neg:DI (match_operand:DI 1 "gen_reg_operand" "r")))]
1915: ""
1916: "sfi %L0,%L1,0\;sfze %0,%1")
1917:
1918: (define_insn "mulsidi3"
1919: [(set (match_operand:DI 0 "gen_reg_operand" "=r")
1920: (mult:DI (sign_extend:DI (match_operand:SI 1 "gen_reg_operand" "r"))
1921: (sign_extend:DI (match_operand:SI 2 "gen_reg_operand" "r"))))
1922: (clobber (match_scratch:SI 3 "=q"))]
1923: ""
1924: "mul %0,%1,%2\;mfmq %L0")
1925:
1926: ;; If operands 0 and 2 are in the same register, we have a problem. But
1927: ;; operands 0 and 1 (the usual case) can be in the same register. That's
1928: ;; why we have the strange constraints below.
1929: (define_insn "ashldi3"
1930: [(set (match_operand:DI 0 "gen_reg_operand" "=r,r,r,&r")
1931: (ashift:DI (match_operand:DI 1 "gen_reg_operand" "r,r,0,r")
1932: (match_operand:SI 2 "reg_or_cint_operand" "M,i,r,r")))
1933: (clobber (match_scratch:SI 3 "=X,q,q,q"))]
1934: ""
1935: "@
1936: sli %0,%L1,%h2\;cal %L0,0(0)
1937: sl%I2q %L0,%L1,%h2\;sll%I2q %0,%1,%h2
1938: sl%I2q %L0,%L1,%h2\;sll%I2q %0,%1,%h2
1939: sl%I2q %L0,%L1,%h2\;sll%I2q %0,%1,%h2 ")
1940:
1941: (define_insn "lshrdi3"
1942: [(set (match_operand:DI 0 "gen_reg_operand" "=r,r,r,&r")
1943: (lshiftrt:DI (match_operand:DI 1 "gen_reg_operand" "r,r,0,r")
1944: (match_operand:SI 2 "reg_or_cint_operand" "M,i,r,r")))
1945: (clobber (match_scratch:SI 3 "=X,q,q,q"))]
1946: ""
1947: "@
1948: cal %0,0(0)\;sri %L0,%1,%h2
1949: sr%I2q %L0,%L1,%2\;srl%I2q %0,%1,%2
1950: sr%I2q %L0,%L1,%2\;srl%I2q %0,%1,%2
1951: sr%I2q %L0,%L1,%2\;srl%I2q %0,%1,%2 ")
1952:
1953: ;; Shift by a variable amount is too complex to be worth open-coding. We
1954: ;; just handle shifts by constants.
1955:
1956: (define_expand "ashrdi3"
1957: [(parallel [(set (match_operand:DI 0 "gen_reg_operand" "=")
1958: (ashiftrt:DI (match_operand:DI 1 "gen_reg_operand" "")
1959: (match_operand:SI 2 "general_operand" "")))
1960: (clobber (match_scratch:SI 3 ""))])]
1961: ""
1962: "
1963: { if (GET_CODE (operands[2]) != CONST_INT)
1964: FAIL;
1965: }")
1966:
1967: (define_insn ""
1968: [(set (match_operand:DI 0 "gen_reg_operand" "=r,r")
1969: (ashiftrt:DI (match_operand:DI 1 "gen_reg_operand" "r,r")
1970: (match_operand:SI 2 "const_int_operand" "M,i")))
1971: (clobber (match_scratch:SI 3 "=X,q"))]
1972: ""
1973: "@
1974: srai %0,%1,31\;srai %L0,%1,%h2
1975: sraiq %L0,%L1,%2\;srlq %0,%1,%2")
1976:
1977: ;; Now define ways of moving data around.
1978: ;;
1979: ;; For SI, we special-case integers that can't be loaded in one insn. We
1980: ;; do the load 16-bits at a time. We could do this by loading from memory,
1981: ;; and this is even supposed to be faster, but it is simpler not to get
1982: ;; integers in the TOC.
1983: (define_expand "movsi"
1984: [(set (match_operand:SI 0 "general_operand" "")
1985: (match_operand:SI 1 "any_operand" ""))]
1986: ""
1987: "
1988: {
1989: if (GET_CODE (operands[0]) != REG)
1990: operands[1] = force_reg (SImode, operands[1]);
1991:
1992: if (CONSTANT_P (operands[1]) && GET_CODE (operands[1]) != CONST_INT)
1993: operands[1] = force_const_mem (SImode, operands[1]);
1994:
1995: if (GET_CODE (operands[1]) == CONST_INT
1996: && (unsigned) (INTVAL (operands[1]) + 0x8000) >= 0x10000
1997: && (INTVAL (operands[1]) & 0xffff) != 0)
1998: {
1999: emit_move_insn (operands[0],
2000: gen_rtx (CONST_INT, VOIDmode,
2001: INTVAL (operands[1]) & 0xffff0000));
2002: emit_insn (gen_iorsi3 (operands[0], operands[0],
2003: gen_rtx (CONST_INT, VOIDmode,
2004: INTVAL (operands[1]) & 0xffff)));
2005: DONE;
2006: }
2007: }")
2008:
2009: (define_insn ""
2010: [(set (match_operand:SI 0 "nonimmediate_operand" "=r,r,m,r,r,r,*h")
2011: (match_operand:SI 1 "input_operand" "r,m,r,I,J,*h,r"))]
2012: "gen_reg_operand (operands[0], SImode)
2013: || gen_reg_operand (operands[1], SImode)"
2014: "@
2015: ai %0,%1,0
2016: l%U1%X1 %0,%1
2017: st%U0%X0 %1,%0
2018: cal %0,%1(0)
2019: cau %0,0,%u1
2020: mf%1 %0
2021: mt%0 %1"
2022: [(set_attr "type" "*,load,*,*,*,*,*")])
2023:
2024: (define_insn ""
2025: [(set (match_operand:CC 2 "cc_reg_operand" "=x")
2026: (compare:CC (match_operand:SI 1 "gen_reg_operand" "r")
2027: (const_int 0)))
2028: (set (match_operand:SI 0 "gen_reg_operand" "=r") (match_dup 1))]
2029: ""
2030: "ai. %0,%1,0"
2031: [(set_attr "type" "compare")])
2032:
2033: (define_expand "movhi"
2034: [(set (match_operand:HI 0 "general_operand" "")
2035: (match_operand:HI 1 "any_operand" ""))]
2036: ""
2037: "
2038: {
2039: if (GET_CODE (operands[0]) != REG)
2040: operands[1] = force_reg (HImode, operands[1]);
2041:
2042: if (CONSTANT_P (operands[1]) && GET_CODE (operands[1]) != CONST_INT)
2043: operands[1] = force_const_mem (HImode, operands[1]);
2044: }")
2045:
2046: (define_insn ""
2047: [(set (match_operand:HI 0 "nonimmediate_operand" "=r,r,m,r,r,*h")
2048: (match_operand:HI 1 "input_operand" "r,m,r,i,*h,r"))]
2049: "gen_reg_operand (operands[0], HImode)
2050: || gen_reg_operand (operands[1], HImode)"
2051: "@
2052: oril %0,%1,0
2053: lhz%U1%X1 %0,%1
2054: sth%U0%X0 %1,%0
2055: cal %0,%w1(0)
2056: mf%1 %0
2057: mt%0 %1"
2058: [(set_attr "type" "*,load,*,*,*,*")])
2059:
2060: (define_expand "movqi"
2061: [(set (match_operand:QI 0 "general_operand" "")
2062: (match_operand:QI 1 "any_operand" ""))]
2063: ""
2064: "
2065: {
2066: if (GET_CODE (operands[0]) != REG)
2067: operands[1] = force_reg (QImode, operands[1]);
2068:
2069: if (CONSTANT_P (operands[1]) && GET_CODE (operands[1]) != CONST_INT)
2070: operands[1] = force_const_mem (QImode, operands[1]);
2071: }")
2072:
2073: (define_insn ""
2074: [(set (match_operand:QI 0 "nonimmediate_operand" "=r,r,m,r,r,*h")
2075: (match_operand:QI 1 "input_operand" "r,m,r,i,*h,r"))]
2076: "gen_reg_operand (operands[0], QImode)
2077: || gen_reg_operand (operands[1], QImode)"
2078: "@
2079: oril %0,%1,0
2080: lbz%U1%X1 %0,%1
2081: stb%U0%X0 %1,%0
2082: cal %0,%1(0)
2083: mf%1 %0
2084: mt%0 %1"
2085: [(set_attr "type" "*,load,*,*,*,*")])
2086:
2087: ;; Here is how to move condition codes around. When we store CC data in
2088: ;; an integer register or memory, we store just the high-order 4 bits.
2089: ;; This lets us not shift in the most common case of CR0.
2090: (define_expand "movcc"
2091: [(set (match_operand:CC 0 "nonimmediate_operand" "")
2092: (match_operand:CC 1 "nonimmediate_operand" ""))]
2093: ""
2094: "")
2095:
2096: (define_insn ""
2097: [(set (match_operand:CC 0 "nonimmediate_operand" "=y,x,y,r,r,r,r,m")
2098: (match_operand:CC 1 "nonimmediate_operand" "y,r,r,x,y,r,m,r"))]
2099: "register_operand (operands[0], CCmode)
2100: || register_operand (operands[1], CCmode)"
2101: "@
2102: mcrf %0,%1
2103: mtcrf 128,%1
2104: rlinm %1,%1,%F0,0,31\;mtcrf %R0,%1\;rlinm %1,%1,%f0,0,31
2105: mfcr %0
2106: mfcr %0\;rlinm %0,%0,%f1,0,3
2107: ai %0,%1,0
2108: l%U1%X1 %0,%1
2109: st%U0%U1 %1,%0"
2110: [(set_attr "type" "*,*,*,compare,*,*,load,*")])
2111:
2112: ;; For floating-point, we normally deal with the floating-point registers.
2113: ;; The sole exception is that parameter passing can produce floating-point
2114: ;; values in fixed-point registers. Unless the value is a simple constant
2115: ;; or already in memory, we deal with this by allocating memory and copying
2116: ;; the value explicitly via that memory location.
2117: (define_expand "movsf"
2118: [(set (match_operand:SF 0 "nonimmediate_operand" "")
2119: (match_operand:SF 1 "any_operand" ""))]
2120: ""
2121: "
2122: {
2123: /* If we are called from reload, we might be getting a SUBREG of a hard
2124: reg. So expand it. */
2125: if (GET_CODE (operands[0]) == SUBREG
2126: && GET_CODE (SUBREG_REG (operands[0])) == REG
2127: && REGNO (SUBREG_REG (operands[0])) < FIRST_PSEUDO_REGISTER)
2128: operands[0] = alter_subreg (operands[0]);
2129: if (GET_CODE (operands[1]) == SUBREG
2130: && GET_CODE (SUBREG_REG (operands[1])) == REG
2131: && REGNO (SUBREG_REG (operands[1])) < FIRST_PSEUDO_REGISTER)
2132: operands[1] = alter_subreg (operands[1]);
2133:
2134: /* If we are being called from reload, it is possible that operands[1]
2135: is a hard non-fp register. So handle those cases. */
2136: if (reload_in_progress && GET_CODE (operands[1]) == REG
2137: && REGNO (operands[1]) < 32)
2138: {
2139: rtx stack_slot;
2140:
2141: /* Remember that we only see a pseudo here if it didn't get a hard
2142: register, so it is memory. */
2143: if (GET_CODE (operands[0]) == MEM
2144: || (GET_CODE (operands[0]) == REG
2145: && (REGNO (operands[0]) < 32
2146: || REGNO (operands[0]) >= FIRST_PSEUDO_REGISTER))
2147: || (GET_CODE (operands[0]) == REG && REGNO (operands[0]) < 32))
2148: {
2149: emit_move_insn (operand_subword (operands[0], 0, 0, SFmode),
2150: operand_subword (operands[1], 0, 0, SFmode));
2151: DONE;
2152: }
2153:
2154: stack_slot = gen_rtx (MEM, SFmode, plus_constant (stack_pointer_rtx, 4));
2155: emit_move_insn (stack_slot, operands[1]);
2156: emit_move_insn (operands[0], stack_slot);
2157: DONE;
2158: }
2159:
2160: if (GET_CODE (operands[0]) == MEM)
2161: operands[1] = force_reg (SFmode, operands[1]);
2162:
2163: if (GET_CODE (operands[0]) == REG && REGNO (operands[0]) < 32)
2164: {
2165: rtx stack_slot;
2166:
2167: if (GET_CODE (operands[1]) == MEM
2168: #if HOST_FLOAT_FORMAT == TARGET_FLOAT_FORMAT && ! defined(REAL_IS_NOT_DOUBLE)
2169: || GET_CODE (operands[1]) == CONST_DOUBLE
2170: #endif
2171: || (GET_CODE (operands[1]) == REG && REGNO (operands[1]) < 32)
2172: || (reload_in_progress && GET_CODE (operands[1]) == REG
2173: && REGNO (operands[1]) >= FIRST_PSEUDO_REGISTER))
2174: {
2175: emit_move_insn (operand_subword (operands[0], 0, 0, SFmode),
2176: operand_subword (operands[1], 0, 0, SFmode));
2177: DONE;
2178: }
2179:
2180: if (reload_in_progress)
2181: stack_slot = gen_rtx (MEM, SFmode,
2182: plus_constant (stack_pointer_rtx, 4));
2183: else
2184: stack_slot = assign_stack_temp (SFmode, 4, 0);
2185: emit_move_insn (stack_slot, operands[1]);
2186: emit_move_insn (operands[0], stack_slot);
2187: DONE;
2188: }
2189:
2190: if (CONSTANT_P (operands[1]))
2191: {
2192: operands[1] = force_const_mem (SFmode, operands[1]);
2193: if (! memory_address_p (SFmode, XEXP (operands[1], 0))
2194: && ! reload_in_progress)
2195: operands[1] = change_address (operands[1], SFmode,
2196: XEXP (operands[1], 0));
2197: }
2198: }")
2199:
2200: (define_insn ""
2201: [(set (match_operand:SF 0 "gen_reg_operand" "=r,r")
2202: (match_operand:SF 1 "mem_or_easy_const_operand" "G,m"))]
2203: "REGNO (operands[0]) <= 31"
2204: "@
2205: #
2206: l%U1%X1 %0,%1"
2207: [(set_attr "type" "*,load")])
2208:
2209: (define_split
2210: [(set (match_operand:SF 0 "gen_reg_operand" "")
2211: (match_operand:SF 1 "easy_fp_constant" ""))]
2212: "reload_completed && REGNO (operands[0]) <= 31"
2213: [(set (match_dup 2) (match_dup 3))]
2214: "
2215: { operands[2] = operand_subword (operands[0], 0, 0, SFmode);
2216: operands[3] = operand_subword (operands[1], 0, 0, SFmode); }")
2217:
2218: (define_insn ""
2219: [(set (match_operand:SF 0 "fp_reg_or_mem_operand" "=f,f,m")
2220: (match_operand:SF 1 "input_operand" "f,m,f"))]
2221: "gen_reg_operand (operands[0], SFmode)
2222: || gen_reg_operand (operands[1], SFmode)"
2223: "@
2224: fmr %0,%1
2225: lfs%U1%X1 %0,%1
2226: frsp %1,%1\;stfs%U0%X0 %1,%0"
2227: [(set_attr "type" "fp,load,*")])
2228:
2229: (define_expand "movdf"
2230: [(set (match_operand:DF 0 "nonimmediate_operand" "")
2231: (match_operand:DF 1 "any_operand" ""))]
2232: ""
2233: "
2234: {
2235: /* If we are called from reload, we might be getting a SUBREG of a hard
2236: reg. So expand it. */
2237: if (GET_CODE (operands[0]) == SUBREG
2238: && GET_CODE (SUBREG_REG (operands[0])) == REG
2239: && REGNO (SUBREG_REG (operands[0])) < FIRST_PSEUDO_REGISTER)
2240: operands[0] = alter_subreg (operands[0]);
2241: if (GET_CODE (operands[1]) == SUBREG
2242: && GET_CODE (SUBREG_REG (operands[1])) == REG
2243: && REGNO (SUBREG_REG (operands[1])) < FIRST_PSEUDO_REGISTER)
2244: operands[1] = alter_subreg (operands[1]);
2245:
2246: /* If we are being called from reload, it is possible that operands[1]
2247: is a hard non-fp register. So handle those cases. */
2248: if (reload_in_progress && GET_CODE (operands[1]) == REG
2249: && REGNO (operands[1]) < 32)
2250: {
2251: rtx stack_slot;
2252:
2253: /* Remember that we only see a pseudo here if it didn't get a hard
2254: register, so it is memory. */
2255: if (GET_CODE (operands[0]) == MEM
2256: || (GET_CODE (operands[0]) == REG
2257: && (REGNO (operands[0]) < 32
2258: || REGNO (operands[0]) >= FIRST_PSEUDO_REGISTER)))
2259: {
2260: emit_move_insn (operand_subword (operands[0], 0, 0, DFmode),
2261: operand_subword (operands[1], 0, 0, DFmode));
2262: emit_move_insn (operand_subword (operands[0], 1, 0, DFmode),
2263: operand_subword (operands[1], 1, 0, DFmode));
2264: DONE;
2265: }
2266:
2267: stack_slot = gen_rtx (MEM, DFmode, plus_constant (stack_pointer_rtx, 8));
2268: emit_move_insn (stack_slot, operands[1]);
2269: emit_move_insn (operands[0], stack_slot);
2270: DONE;
2271: }
2272:
2273: if (GET_CODE (operands[0]) == MEM)
2274: {
2275: if (GET_CODE (operands[1]) == MEM)
2276: {
2277: emit_move_insn (operand_subword (operands[0], 0, 0, DFmode),
2278: operand_subword (operands[1], 0, 0, DFmode));
2279: emit_move_insn (operand_subword (operands[0], 1, 0, DFmode),
2280: operand_subword (operands[1], 1, 0, DFmode));
2281: DONE;
2282: }
2283:
2284: operands[1] = force_reg (DFmode, operands[1]);
2285: }
2286:
2287: if (GET_CODE (operands[0]) == REG && REGNO (operands[0]) < 32)
2288: {
2289: rtx stack_slot;
2290:
2291: if (GET_CODE (operands[1]) == MEM
2292: #if HOST_FLOAT_FORMAT == TARGET_FLOAT_FORMAT && ! defined(REAL_IS_NOT_DOUBLE)
2293: || GET_CODE (operands[1]) == CONST_DOUBLE
2294: #endif
2295: || (GET_CODE (operands[1]) == REG && REGNO (operands[1]) < 32)
2296: || (reload_in_progress && GET_CODE (operands[1]) == REG
2297: && REGNO (operands[1]) >= FIRST_PSEUDO_REGISTER))
2298: {
2299: emit_move_insn (operand_subword (operands[0], 0, 0, DFmode),
2300: operand_subword (operands[1], 0, 0, DFmode));
2301: emit_move_insn (operand_subword (operands[0], 1, 0, DFmode),
2302: operand_subword (operands[1], 1, 0, DFmode));
2303: DONE;
2304: }
2305:
2306: if (reload_in_progress)
2307: stack_slot = gen_rtx (MEM, DFmode,
2308: plus_constant (stack_pointer_rtx, 8));
2309: else
2310: stack_slot = assign_stack_temp (DFmode, 8, 0);
2311: emit_move_insn (stack_slot, operands[1]);
2312: emit_move_insn (operands[0], stack_slot);
2313: DONE;
2314: }
2315:
2316: if (CONSTANT_P (operands[1]))
2317: {
2318: operands[1] = force_const_mem (DFmode, operands[1]);
2319: if (! memory_address_p (DFmode, XEXP (operands[1], 0))
2320: && ! reload_in_progress)
2321: operands[1] = change_address (operands[1], DFmode,
2322: XEXP (operands[1], 0));
2323: }
2324: }")
2325:
2326: (define_insn ""
2327: [(set (match_operand:DF 0 "gen_reg_operand" "=r,r")
2328: (match_operand:DF 1 "mem_or_easy_const_operand" "G,m"))]
2329: "REGNO (operands[0]) <= 31"
2330: "@
2331: #
2332: l %0,%1\;l %L0,%L1"
2333: [(set_attr "type" "*,load")])
2334:
2335: (define_split
2336: [(set (match_operand:DF 0 "gen_reg_operand" "")
2337: (match_operand:DF 1 "easy_fp_constant" ""))]
2338: "reload_completed && REGNO (operands[0]) <= 31"
2339: [(set (match_dup 2) (match_dup 3))
2340: (set (match_dup 4) (match_dup 5))]
2341: "
2342: { operands[2] = operand_subword (operands[0], 0, 0, DFmode);
2343: operands[3] = operand_subword (operands[1], 0, 0, DFmode);
2344: operands[4] = operand_subword (operands[0], 1, 0, DFmode);
2345: operands[5] = operand_subword (operands[1], 1, 0, DFmode); }")
2346:
2347: (define_insn ""
2348: [(set (match_operand:DF 0 "fp_reg_or_mem_operand" "=f,f,m")
2349: (match_operand:DF 1 "fp_reg_or_mem_operand" "f,m,f"))]
2350: "gen_reg_operand (operands[0], DFmode)
2351: || gen_reg_operand (operands[1], DFmode)"
2352: "@
2353: fmr %0,%1
2354: lfd%U1%X1 %0,%1
2355: stfd%U0%X0 %1,%0"
2356: [(set_attr "type" "fp,load,*")])
2357:
2358: ;; Next come the multi-word integer load and store and the load and store
2359: ;; multiple insns.
2360: (define_expand "movdi"
2361: [(set (match_operand:DI 0 "general_operand" "")
2362: (match_operand:DI 1 "general_operand" ""))]
2363: ""
2364: "
2365: {
2366: if (GET_CODE (operands[0]) == MEM)
2367: operands[1] = force_reg (DImode, operands[1]);
2368:
2369: else if (GET_CODE (operands[1]) == CONST_DOUBLE
2370: || GET_CODE (operands[1]) == CONST_INT)
2371: {
2372: emit_move_insn (operand_subword (operands[0], 0, 0, DImode),
2373: operand_subword (operands[1], 0, 0, DImode));
2374: emit_move_insn (operand_subword (operands[0], 1, 0, DImode),
2375: operand_subword (operands[1], 1, 0, DImode));
2376: DONE;
2377: }
2378: }")
2379:
2380: (define_insn ""
2381: [(set (match_operand:DI 0 "nonimmediate_operand" "=r,r,m")
2382: (match_operand:DI 1 "input_operand" "r,m,r"))]
2383: "gen_reg_operand (operands[0], DImode)
2384: || gen_reg_operand (operands[1], DImode)"
2385: "*
2386: {
2387: switch (which_alternative)
2388: {
2389: case 0:
2390: /* We normally copy the low-numbered register first. However, if
2391: the first register operand 0 is the same as the second register of
2392: operand 1, we must copy in the opposite order. */
2393: if (REGNO (operands[0]) == REGNO (operands[1]) + 1)
2394: return \"oril %L0,%L1,0\;oril %0,%1,0\";
2395: else
2396: return \"oril %0,%1,0\;oril %L0,%L1,0\";
2397: case 1:
2398: /* If the low-address word is used in the address, we must load it
2399: last. Otherwise, load it first. Note that we cannot have
2400: auto-increment in that case since the address register is known to be
2401: dead. */
2402: if (refers_to_regno_p (REGNO (operands[0]), REGNO (operands[0]) + 1,
2403: operands [1], 0))
2404: return \"l %L0,%L1\;l %0,%1\";
2405: else
2406: return \"l%U1 %0,%1\;l %L0,%L1\";
2407: case 2:
2408: return \"st%U0 %1,%0\;st %L1,%L0\";
2409: }
2410: }"
2411: [(set_attr "type" "*,load,*")])
2412:
2413: ;; TImode is similar, except that we usually want to compute the address into
2414: ;; a register and use lsi/stsi (the exception is during reload). MQ is also
2415: ;; clobbered in stsi, so we need a SCRATCH for it.
2416: (define_expand "movti"
2417: [(parallel [(set (match_operand:TI 0 "general_operand" "")
2418: (match_operand:TI 1 "general_operand" ""))
2419: (clobber (scratch:SI))])]
2420: ""
2421: "
2422: {
2423: if (GET_CODE (operands[0]) == MEM)
2424: operands[1] = force_reg (TImode, operands[1]);
2425:
2426: if (GET_CODE (operands[0]) == MEM
2427: && GET_CODE (XEXP (operands[0], 0)) != REG
2428: && ! reload_in_progress)
2429: operands[0] = change_address (operands[0], TImode,
2430: copy_addr_to_reg (XEXP (operands[0], 0)));
2431:
2432: if (GET_CODE (operands[1]) == MEM
2433: && GET_CODE (XEXP (operands[1], 0)) != REG
2434: && ! reload_in_progress)
2435: operands[1] = change_address (operands[1], TImode,
2436: copy_addr_to_reg (XEXP (operands[1], 0)));
2437: }")
2438:
2439: ;; We say that MQ is clobbered in the last alternative because the first
2440: ;; alternative would never get used otherwise since it would need a reload
2441: ;; while the 2nd alternative would not. We put memory cases first so they
2442: ;; are preferred. Otherwise, we'd try to reload the output instead of
2443: ;; giving the SCRATCH mq.
2444: (define_insn ""
2445: [(set (match_operand:TI 0 "reg_or_mem_operand" "=Q,m,r,r,r")
2446: (match_operand:TI 1 "reg_or_mem_operand" "r,r,r,Q,m"))
2447: (clobber (match_scratch:SI 2 "=q,q#X,X,X,X"))]
2448: "gen_reg_operand (operands[0], TImode)
2449: || gen_reg_operand (operands[1], TImode)"
2450: "*
2451: {
2452: switch (which_alternative)
2453: {
2454: case 0:
2455: return \"stsi %1,%P0,16\";
2456:
2457: case 1:
2458: return \"st%U0 %1,%0\;st %L1,%L0\;st %Y1,%Y0\;st %Z1,%Z0\";
2459:
2460: case 2:
2461: /* Normally copy registers with lowest numbered register copied first.
2462: But copy in the other order if the first register of the output
2463: is the second, third, or fourth register in the input. */
2464: if (REGNO (operands[0]) >= REGNO (operands[1]) + 1
2465: && REGNO (operands[0]) <= REGNO (operands[1]) + 3)
2466: return \"oril %Z0,%Z1,0\;oril %Y0,%Y1,0\;oril %L0,%L1,0\;oril %0,%1,0\";
2467: else
2468: return \"oril %0,%1,0\;oril %L0,%L1,0\;oril %Y0,%Y1,0\;oril %Z0,%Z1,0\";
2469: case 3:
2470: /* If the address is not used in the output, we can use lsi. Otherwise,
2471: fall through to generating four loads. */
2472: if (! reg_overlap_mentioned_p (operands[0], operands[1]))
2473: return \"lsi %0,%P1,16\";
2474: /* ... fall through ... */
2475: case 4:
2476: /* If the address register is the same as the register for the lowest-
2477: addressed word, load it last. Similarly for the next two words.
2478: Otherwise load lowest address to highest. */
2479: if (refers_to_regno_p (REGNO (operands[0]), REGNO (operands[0]) + 1,
2480: operands[1], 0))
2481: return \"l %L0,%L1\;l %Y0,%Y1\;l %Z0,%Z1\;l %0,%1\";
2482: else if (refers_to_regno_p (REGNO (operands[0]) + 1,
2483: REGNO (operands[0]) + 2, operands[1], 0))
2484: return \"l %0,%1\;l %Y0,%Y1\;l %Z0,%Z1\;l %L0,%L1\";
2485: else if (refers_to_regno_p (REGNO (operands[0]) + 2,
2486: REGNO (operands[0]) + 3, operands[1], 0))
2487: return \"l %0,%1\;l %L0,%L1\;l %Z0,%Z1\;l %Y0,%Y1\";
2488: else
2489: return \"l%U1 %0,%1\;l %L0,%L1\;l %Y0,%Y1\;l %Z0,%Z1\";
2490: }
2491: }"
2492: [(set_attr "type" "*,load,load,*,*")])
2493:
2494: (define_expand "load_multiple"
2495: [(match_parallel 3 "" [(set (match_operand:SI 0 "" "")
2496: (match_operand:SI 1 "" ""))
2497: (use (match_operand:SI 2 "" ""))])]
2498: ""
2499: "
2500: {
2501: int regno;
2502: int count;
2503: rtx from;
2504: int i;
2505:
2506: /* Support only loading a constant number of fixed-point registers from
2507: memory and only bother with this if more than two; the machine
2508: doesn't support more than eight. */
2509: if (GET_CODE (operands[2]) != CONST_INT
2510: || INTVAL (operands[2]) <= 2
2511: || INTVAL (operands[2]) > 8
2512: || GET_CODE (operands[1]) != MEM
2513: || GET_CODE (operands[0]) != REG
2514: || REGNO (operands[0]) >= 32)
2515: FAIL;
2516:
2517: count = INTVAL (operands[2]);
2518: regno = REGNO (operands[0]);
2519:
2520: operands[3] = gen_rtx (PARALLEL, VOIDmode, rtvec_alloc (count));
2521: from = force_reg (SImode, XEXP (operands[1], 0));
2522:
2523: for (i = 0; i < count; i++)
2524: XVECEXP (operands[3], 0, i)
2525: = gen_rtx (SET, VOIDmode, gen_rtx (REG, SImode, regno + i),
2526: gen_rtx (MEM, SImode, plus_constant (from, i * 4)));
2527: }")
2528:
2529: (define_insn ""
2530: [(match_parallel 0 "load_multiple_operation"
2531: [(set (match_operand:SI 1 "gen_reg_operand" "=r")
2532: (match_operand:SI 2 "indirect_operand" "Q"))])]
2533: ""
2534: "*
2535: {
2536: /* We have to handle the case where the pseudo used to contain the address
2537: is assigned to one of the output registers. In that case, do the
2538: lsi, but then load the correct value. This is a bit of a mess, but is
2539: the best we can do. */
2540: static char result[100];
2541: char newload[40];
2542: int i;
2543:
2544: strcpy (result, \"lsi %1,%P2,%N0\");
2545: for (i = 0; i < XVECLEN (operands[0], 0); i++)
2546: if (refers_to_regno_p (REGNO (operands[1]) + i,
2547: REGNO (operands[1]) + i + 1, operands[2], 0))
2548: {
2549: sprintf (newload, \"\;l %d,%d(%d)\",
2550: REGNO (operands[1]) + i,
2551: i * 4, REGNO (XEXP (operands[2], 0)));
2552: strcat (result, newload);
2553: }
2554:
2555: return result;
2556: }"
2557: [(set_attr "type" "load")])
2558:
2559: (define_expand "store_multiple"
2560: [(match_parallel 3 "" [(set (match_operand:SI 0 "" "")
2561: (match_operand:SI 1 "" ""))
2562: (clobber (scratch:SI))
2563: (use (match_operand:SI 2 "" ""))])]
2564: ""
2565: "
2566: {
2567: int regno;
2568: int count;
2569: rtx to;
2570: int i;
2571:
2572: /* Support only storing a constant number of fixed-point registers to
2573: memory and only bother with this if more than two; the machine
2574: doesn't support more than eight. */
2575: if (GET_CODE (operands[2]) != CONST_INT
2576: || INTVAL (operands[2]) <= 2
2577: || INTVAL (operands[2]) > 8
2578: || GET_CODE (operands[0]) != MEM
2579: || GET_CODE (operands[1]) != REG
2580: || REGNO (operands[1]) >= 32)
2581: FAIL;
2582:
2583: count = INTVAL (operands[2]);
2584: regno = REGNO (operands[1]);
2585:
2586: operands[3] = gen_rtx (PARALLEL, VOIDmode, rtvec_alloc (count + 1));
2587: to = force_reg (SImode, XEXP (operands[0], 0));
2588:
2589: XVECEXP (operands[3], 0, 0)
2590: = gen_rtx (SET, VOIDmode, gen_rtx (MEM, SImode, to), operands[1]);
2591: XVECEXP (operands[3], 0, 1) = gen_rtx (CLOBBER, VOIDmode,
2592: gen_rtx (SCRATCH, SImode));
2593:
2594: for (i = 1; i < count; i++)
2595: XVECEXP (operands[3], 0, i + 1)
2596: = gen_rtx (SET, VOIDmode,
2597: gen_rtx (MEM, SImode, plus_constant (to, i * 4)),
2598: gen_rtx (REG, SImode, regno + i));
2599: }")
2600:
2601: (define_insn ""
2602: [(match_parallel 0 "store_multiple_operation"
2603: [(set (match_operand:SI 1 "indirect_operand" "=Q")
2604: (match_operand:SI 2 "gen_reg_operand" "r"))
2605: (clobber (match_scratch:SI 3 "=q"))])]
2606: ""
2607: "stsi %2,%P1,%O0")
2608:
2609: ;; Define insns that do load or store with update. Some of these we can
2610: ;; get by using pre-decrement or pre-increment, but the hardware can also
2611: ;; do cases where the increment is not the size of the object.
2612: ;;
2613: ;; In all these cases, we use operands 0 and 1 for the register being
2614: ;; incremented because those are the operands that local-alloc will
2615: ;; tie and these are the pair most likely to be tieable (and the ones
2616: ;; that will benefit the most).
2617:
2618: (define_insn ""
2619: [(set (match_operand:SI 3 "gen_reg_operand" "=r,r")
2620: (mem:SI (plus:SI (match_operand:SI 1 "gen_reg_operand" "0,0")
2621: (match_operand:SI 2 "reg_or_short_operand" "r,I"))))
2622: (set (match_operand:SI 0 "gen_reg_operand" "=b,b")
2623: (plus:SI (match_dup 1) (match_dup 2)))]
2624: ""
2625: "@
2626: lux %3,%1,%2
2627: lu %3,%2(%1)"
2628: [(set_attr "type" "load,load")])
2629:
2630: (define_insn ""
2631: [(set (mem:SI (plus:SI (match_operand:SI 1 "gen_reg_operand" "0,0")
2632: (match_operand:SI 2 "reg_or_short_operand" "r,I")))
2633: (match_operand:SI 3 "gen_reg_operand" "r,r"))
2634: (set (match_operand:SI 0 "gen_reg_operand" "=b,b")
2635: (plus:SI (match_dup 1) (match_dup 2)))]
2636: ""
2637: "@
2638: stux %3,%1,%2
2639: stu %3,%2(%1)")
2640:
2641: (define_insn ""
2642: [(set (match_operand:HI 3 "gen_reg_operand" "=r,r")
2643: (mem:HI (plus:SI (match_operand:SI 1 "gen_reg_operand" "0,0")
2644: (match_operand:SI 2 "reg_or_short_operand" "r,I"))))
2645: (set (match_operand:SI 0 "gen_reg_operand" "=b,b")
2646: (plus:SI (match_dup 1) (match_dup 2)))]
2647: ""
2648: "@
2649: lhzux %3,%1,%2
2650: lhzu %3,%2(%1)"
2651: [(set_attr "type" "load,load")])
2652:
2653: (define_insn ""
2654: [(set (match_operand:SI 3 "gen_reg_operand" "=r,r")
2655: (zero_extend:SI
2656: (mem:HI (plus:SI (match_operand:SI 1 "gen_reg_operand" "0,0")
2657: (match_operand:SI 2 "reg_or_short_operand" "r,I")))))
2658: (set (match_operand:SI 0 "gen_reg_operand" "=b,b")
2659: (plus:SI (match_dup 1) (match_dup 2)))]
2660: ""
2661: "@
2662: lhzux %3,%1,%2
2663: lhzu %3,%2(%1)"
2664: [(set_attr "type" "load,load")])
2665:
2666: (define_insn ""
2667: [(set (match_operand:SI 3 "gen_reg_operand" "=r,r")
2668: (sign_extend:SI
2669: (mem:HI (plus:SI (match_operand:SI 1 "gen_reg_operand" "0,0")
2670: (match_operand:SI 2 "reg_or_short_operand" "r,I")))))
2671: (set (match_operand:SI 0 "gen_reg_operand" "=b,b")
2672: (plus:SI (match_dup 1) (match_dup 2)))]
2673: ""
2674: "@
2675: lhaux %3,%1,%2
2676: lhau %3,%2(%1)"
2677: [(set_attr "type" "load,load")])
2678:
2679: (define_insn ""
2680: [(set (mem:HI (plus:SI (match_operand:SI 1 "gen_reg_operand" "0,0")
2681: (match_operand:SI 2 "reg_or_short_operand" "r,I")))
2682: (match_operand:HI 3 "gen_reg_operand" "r,r"))
2683: (set (match_operand:SI 0 "gen_reg_operand" "=b,b")
2684: (plus:SI (match_dup 1) (match_dup 2)))]
2685: ""
2686: "@
2687: sthux %3,%1,%2
2688: sthu %3,%2(%1)"
2689: [(set_attr "type" "load,load")])
2690:
2691: (define_insn ""
2692: [(set (match_operand:QI 3 "gen_reg_operand" "=r,r")
2693: (mem:QI (plus:SI (match_operand:SI 1 "gen_reg_operand" "0,0")
2694: (match_operand:SI 2 "reg_or_short_operand" "r,I"))))
2695: (set (match_operand:SI 0 "gen_reg_operand" "=b,b")
2696: (plus:SI (match_dup 1) (match_dup 2)))]
2697: ""
2698: "@
2699: lbzux %3,%1,%2
2700: lbzu %3,%2(%1)"
2701: [(set_attr "type" "load,load")])
2702:
2703: (define_insn ""
2704: [(set (match_operand:SI 3 "gen_reg_operand" "=r,r")
2705: (zero_extend:SI
2706: (mem:QI (plus:SI (match_operand:SI 1 "gen_reg_operand" "0,0")
2707: (match_operand:SI 2 "reg_or_short_operand" "r,I")))))
2708: (set (match_operand:SI 0 "gen_reg_operand" "=b,b")
2709: (plus:SI (match_dup 1) (match_dup 2)))]
2710: ""
2711: "@
2712: lbzux %3,%1,%2
2713: lbzu %3,%2(%1)"
2714: [(set_attr "type" "load,load")])
2715:
2716: (define_insn ""
2717: [(set (mem:QI (plus:SI (match_operand:SI 1 "gen_reg_operand" "0,0")
2718: (match_operand:SI 2 "reg_or_short_operand" "r,I")))
2719: (match_operand:QI 3 "gen_reg_operand" "r,r"))
2720: (set (match_operand:SI 0 "gen_reg_operand" "=b,b")
2721: (plus:SI (match_dup 1) (match_dup 2)))]
2722: ""
2723: "@
2724: stbux %3,%1,%2
2725: stbu %3,%2(%1)")
2726:
2727: (define_insn ""
2728: [(set (match_operand:SF 3 "gen_reg_operand" "=f,f")
2729: (mem:SI (plus:SI (match_operand:SI 1 "gen_reg_operand" "0,0")
2730: (match_operand:SI 2 "reg_or_short_operand" "r,I"))))
2731: (set (match_operand:SI 0 "gen_reg_operand" "=b,b")
2732: (plus:SI (match_dup 1) (match_dup 2)))]
2733: ""
2734: "@
2735: lfsux %3,%1,%2
2736: lfsu %3,%2(%1)"
2737: [(set_attr "type" "load,load")])
2738:
2739: (define_insn ""
2740: [(set (mem:SF (plus:SI (match_operand:SI 1 "gen_reg_operand" "0,0")
2741: (match_operand:SI 2 "reg_or_short_operand" "r,I")))
2742: (match_operand:SF 3 "gen_reg_operand" "f,f"))
2743: (set (match_operand:SI 0 "gen_reg_operand" "=b,b")
2744: (plus:SI (match_dup 1) (match_dup 2)))]
2745: ""
2746: "@
2747: frsp %3,%3\;stfsux %3,%1,%2
2748: frsp %3,%3\;stfsu %3,%2(%1)")
2749:
2750: (define_insn ""
2751: [(set (match_operand:DF 3 "gen_reg_operand" "=f,f")
2752: (mem:DF (plus:SI (match_operand:SI 1 "gen_reg_operand" "0,0")
2753: (match_operand:SI 2 "reg_or_short_operand" "r,I"))))
2754: (set (match_operand:SI 0 "gen_reg_operand" "=b,b")
2755: (plus:SI (match_dup 1) (match_dup 2)))]
2756: ""
2757: "@
2758: lfdux %3,%1,%2
2759: lfdu %3,%2(%1)"
2760: [(set_attr "type" "load,load")])
2761:
2762: (define_insn ""
2763: [(set (mem:DF (plus:SI (match_operand:SI 1 "gen_reg_operand" "0,0")
2764: (match_operand:SI 2 "reg_or_short_operand" "r,I")))
2765: (match_operand:DF 3 "gen_reg_operand" "f,f"))
2766: (set (match_operand:SI 0 "gen_reg_operand" "=b,b")
2767: (plus:SI (match_dup 1) (match_dup 2)))]
2768: ""
2769: "@
2770: stfdux %3,%1,%2
2771: stfdu %3,%2(%1)")
2772:
2773: ;; Next come insns related to the calling sequence.
2774: ;;
2775: ;; First, an insn to allocate new stack space for dynamic use (e.g., alloca).
2776: ;; We move the back-chain and decremement the stack pointer. This is slightly
2777: ;; less efficient than it needs to be for long constants, but that case
2778: ;; should be rare.
2779:
2780: (define_expand "allocate_stack"
2781: [(set (reg:SI 1)
2782: (minus:SI (reg:SI 1) (match_operand:SI 0 "reg_or_cint_operand" "")))]
2783: ""
2784: "
2785: { rtx chain = gen_reg_rtx (SImode);
2786: rtx stack_bot = gen_rtx (MEM, Pmode, stack_pointer_rtx);
2787:
2788: emit_move_insn (chain, stack_bot);
2789: emit_insn (gen_subsi3 (stack_pointer_rtx, stack_pointer_rtx, operands[0]));
2790: emit_move_insn (stack_bot, chain);
2791: DONE;
2792: }")
2793:
2794: ;; A function pointer is a pointer to a data area whose first word contains
2795: ;; the actual address of the function, whose second word contains a pointer
2796: ;; to its TOC, and whose third word contains a value to place in the static
2797: ;; chain register (r11). Note that if we load the static chain, our
2798: ;; "trampoline" need not have any executable code.
2799: ;;
2800: ;; operands[0] is an SImode pseudo in which we place the address of the
2801: ;; function.
2802: ;; operands[1] is the address of data area of the function to call
2803:
2804: (define_expand "call_via_ptr"
2805: [(set (match_operand:SI 0 "gen_reg_operand" "")
2806: (mem:SI (match_operand:SI 1 "gen_reg_operand" "")))
2807: (set (mem:SI (plus:SI (reg:SI 1) (const_int 20)))
2808: (reg:SI 2))
2809: (set (reg:SI 2)
2810: (mem:SI (plus:SI (match_dup 1)
2811: (const_int 4))))
2812: (set (reg:SI 11)
2813: (mem:SI (plus:SI (match_dup 1)
2814: (const_int 8))))
2815: (use (reg:SI 2))
2816: (use (reg:SI 11))]
2817: ""
2818: "")
2819:
2820: (define_expand "call"
2821: [(parallel [(call (mem:SI (match_operand:SI 0 "address_operand" ""))
2822: (match_operand 1 "" ""))
2823: (clobber (scratch:SI))])]
2824: ""
2825: "
2826: {
2827: if (GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != CONST_INT)
2828: abort ();
2829:
2830: operands[0] = XEXP (operands[0], 0);
2831: if (GET_CODE (operands[0]) != SYMBOL_REF)
2832: {
2833: rtx temp = gen_reg_rtx (SImode);
2834:
2835: emit_insn (gen_call_via_ptr (temp, force_reg (SImode, operands[0])));
2836: operands[0] = temp;
2837: }
2838: }")
2839:
2840: (define_expand "call_value"
2841: [(parallel [(set (match_operand 0 "" "")
2842: (call (mem:SI (match_operand:SI 1 "address_operand" ""))
2843: (match_operand 2 "" "")))
2844: (clobber (scratch:SI))])]
2845: ""
2846: "
2847: {
2848: if (GET_CODE (operands[1]) != MEM || GET_CODE (operands[2]) != CONST_INT)
2849: abort ();
2850:
2851: operands[1] = XEXP (operands[1], 0);
2852: if (GET_CODE (operands[1]) != SYMBOL_REF)
2853: {
2854: rtx temp = gen_reg_rtx (SImode);
2855:
2856: emit_insn (gen_call_via_ptr (temp, force_reg (SImode, operands[1])));
2857: operands[1] = temp;
2858: }
2859: }")
2860:
2861: (define_insn ""
2862: [(call (mem:SI (match_operand:SI 0 "call_operand" "l,s"))
2863: (match_operand 1 "" "fg,fg"))
2864: (clobber (match_scratch:SI 3 "=l,l"))]
2865: ""
2866: "@
2867: brl\;l 2,20(1)
2868: bl %z0\;cror 15,15,15")
2869:
2870: (define_insn ""
2871: [(set (match_operand 0 "" "fg,fg")
2872: (call (mem:SI (match_operand:SI 1 "call_operand" "l,s"))
2873: (match_operand 2 "" "fg,fg")))
2874: (clobber (match_scratch:SI 3 "=l,l"))]
2875: ""
2876: "@
2877: brl\;l 2,20(1)
2878: bl %z1\;cror 15,15,15")
2879:
2880: ;; Compare insns are next. Note that the RS/6000 has two types of compares,
2881: ;; signed & unsigned, and one type of branch.
2882: ;;
2883: ;; Start with the DEFINE_EXPANDs to generate the rtl for compares, scc
2884: ;; insns, and branches. We store the operands of compares until we see
2885: ;; how it is used.
2886: (define_expand "cmpsi"
2887: [(set (cc0)
2888: (compare (match_operand:SI 0 "gen_reg_operand" "")
2889: (match_operand:SI 1 "reg_or_short_operand" "")))]
2890: ""
2891: "
2892: {
2893: /* Take care of the possibility that operands[1] might be negative but
2894: this might be a logical operation. That insn doesn't exist. */
2895: if (GET_CODE (operands[1]) == CONST_INT
2896: && INTVAL (operands[1]) < 0)
2897: operands[1] = force_reg (SImode, operands[1]);
2898:
2899: rs6000_compare_op0 = operands[0];
2900: rs6000_compare_op1 = operands[1];
2901: rs6000_compare_fp_p = 0;
2902: DONE;
2903: }")
2904:
2905: (define_expand "cmpsf"
2906: [(set (cc0) (compare (match_operand:SF 0 "gen_reg_operand" "")
2907: (match_operand:SF 1 "gen_reg_operand" "")))]
2908: ""
2909: "
2910: {
2911: rs6000_compare_op0 = operands[0];
2912: rs6000_compare_op1 = operands[1];
2913: rs6000_compare_fp_p = 1;
2914: DONE;
2915: }")
2916:
2917: (define_expand "cmpdf"
2918: [(set (cc0) (compare (match_operand:DF 0 "gen_reg_operand" "")
2919: (match_operand:DF 1 "gen_reg_operand" "")))]
2920: ""
2921: "
2922: {
2923: rs6000_compare_op0 = operands[0];
2924: rs6000_compare_op1 = operands[1];
2925: rs6000_compare_fp_p = 1;
2926: DONE;
2927: }")
2928:
2929: (define_expand "beq"
2930: [(set (match_dup 2) (match_dup 1))
2931: (set (pc)
2932: (if_then_else (eq (match_dup 2)
2933: (const_int 0))
2934: (label_ref (match_operand 0 "" ""))
2935: (pc)))]
2936: ""
2937: "
2938: { enum machine_mode mode = rs6000_compare_fp_p ? CCFPmode : CCmode;
2939: operands[1] = gen_rtx (COMPARE, mode,
2940: rs6000_compare_op0, rs6000_compare_op1);
2941: operands[2] = gen_reg_rtx (mode);
2942: }")
2943:
2944: (define_expand "bne"
2945: [(set (match_dup 2) (match_dup 1))
2946: (set (pc)
2947: (if_then_else (ne (match_dup 2)
2948: (const_int 0))
2949: (label_ref (match_operand 0 "" ""))
2950: (pc)))]
2951: ""
2952: "
2953: { enum machine_mode mode = rs6000_compare_fp_p ? CCFPmode : CCmode;
2954: operands[1] = gen_rtx (COMPARE, mode,
2955: rs6000_compare_op0, rs6000_compare_op1);
2956: operands[2] = gen_reg_rtx (mode);
2957: }")
2958:
2959: (define_expand "blt"
2960: [(set (match_dup 2) (match_dup 1))
2961: (set (pc)
2962: (if_then_else (lt (match_dup 2)
2963: (const_int 0))
2964: (label_ref (match_operand 0 "" ""))
2965: (pc)))]
2966: ""
2967: "
2968: { enum machine_mode mode = rs6000_compare_fp_p ? CCFPmode : CCmode;
2969: operands[1] = gen_rtx (COMPARE, mode,
2970: rs6000_compare_op0, rs6000_compare_op1);
2971: operands[2] = gen_reg_rtx (mode);
2972: }")
2973:
2974: (define_expand "bgt"
2975: [(set (match_dup 2) (match_dup 1))
2976: (set (pc)
2977: (if_then_else (gt (match_dup 2)
2978: (const_int 0))
2979: (label_ref (match_operand 0 "" ""))
2980: (pc)))]
2981: ""
2982: "
2983: { enum machine_mode mode = rs6000_compare_fp_p ? CCFPmode : CCmode;
2984: operands[1] = gen_rtx (COMPARE, mode,
2985: rs6000_compare_op0, rs6000_compare_op1);
2986: operands[2] = gen_reg_rtx (mode);
2987: }")
2988:
2989: (define_expand "ble"
2990: [(set (match_dup 2) (match_dup 1))
2991: (set (pc)
2992: (if_then_else (le (match_dup 2)
2993: (const_int 0))
2994: (label_ref (match_operand 0 "" ""))
2995: (pc)))]
2996: ""
2997: "
2998: { enum machine_mode mode = rs6000_compare_fp_p ? CCFPmode : CCmode;
2999: operands[1] = gen_rtx (COMPARE, mode,
3000: rs6000_compare_op0, rs6000_compare_op1);
3001: operands[2] = gen_reg_rtx (mode);
3002: }")
3003:
3004: (define_expand "bge"
3005: [(set (match_dup 2) (match_dup 1))
3006: (set (pc)
3007: (if_then_else (ge (match_dup 2)
3008: (const_int 0))
3009: (label_ref (match_operand 0 "" ""))
3010: (pc)))]
3011: ""
3012: "
3013: { enum machine_mode mode = rs6000_compare_fp_p ? CCFPmode : CCmode;
3014: operands[1] = gen_rtx (COMPARE, mode,
3015: rs6000_compare_op0, rs6000_compare_op1);
3016: operands[2] = gen_reg_rtx (mode);
3017: }")
3018:
3019: (define_expand "bgtu"
3020: [(set (match_dup 2) (match_dup 1))
3021: (set (pc)
3022: (if_then_else (gtu (match_dup 2)
3023: (const_int 0))
3024: (label_ref (match_operand 0 "" ""))
3025: (pc)))]
3026: ""
3027: "
3028: { operands[1] = gen_rtx (COMPARE, CCUNSmode,
3029: rs6000_compare_op0, rs6000_compare_op1);
3030: operands[2] = gen_reg_rtx (CCUNSmode);
3031: }")
3032:
3033: (define_expand "bltu"
3034: [(set (match_dup 2) (match_dup 1))
3035: (set (pc)
3036: (if_then_else (ltu (match_dup 2)
3037: (const_int 0))
3038: (label_ref (match_operand 0 "" ""))
3039: (pc)))]
3040: ""
3041: "
3042: { operands[1] = gen_rtx (COMPARE, CCUNSmode,
3043: rs6000_compare_op0, rs6000_compare_op1);
3044: operands[2] = gen_reg_rtx (CCUNSmode);
3045: }")
3046:
3047: (define_expand "bgeu"
3048: [(set (match_dup 2) (match_dup 1))
3049: (set (pc)
3050: (if_then_else (geu (match_dup 2)
3051: (const_int 0))
3052: (label_ref (match_operand 0 "" ""))
3053: (pc)))]
3054: ""
3055: "
3056: { operands[1] = gen_rtx (COMPARE, CCUNSmode,
3057: rs6000_compare_op0, rs6000_compare_op1);
3058: operands[2] = gen_reg_rtx (CCUNSmode);
3059: }")
3060:
3061: (define_expand "bleu"
3062: [(set (match_dup 2) (match_dup 1))
3063: (set (pc)
3064: (if_then_else (leu (match_dup 2)
3065: (const_int 0))
3066: (label_ref (match_operand 0 "" ""))
3067: (pc)))]
3068: ""
3069: "
3070: { operands[1] = gen_rtx (COMPARE, CCUNSmode,
3071: rs6000_compare_op0, rs6000_compare_op1);
3072: operands[2] = gen_reg_rtx (CCUNSmode);
3073: }")
3074:
3075: ;; For SNE, we would prefer that the xor/abs sequence be used for integers.
3076: ;; For SEQ, likewise, except that comparisons with zero should be done
3077: ;; with an scc insns. However, due to the order that combine see the
3078: ;; resulting insns, we must, in fact, allow SEQ for integers. Fail in
3079: ;; the cases we don't want to handle.
3080: (define_expand "seq"
3081: [(set (match_dup 2) (match_dup 1))
3082: (set (match_operand:SI 0 "gen_reg_operand" "")
3083: (eq:SI (match_dup 2) (const_int 0)))]
3084: ""
3085: "
3086: { enum machine_mode mode = rs6000_compare_fp_p ? CCFPmode : CCmode;
3087: operands[1] = gen_rtx (COMPARE, mode,
3088: rs6000_compare_op0, rs6000_compare_op1);
3089: operands[2] = gen_reg_rtx (mode);
3090: }")
3091:
3092: (define_expand "sne"
3093: [(set (match_dup 2) (match_dup 1))
3094: (set (match_operand:SI 0 "gen_reg_operand" "")
3095: (ne:SI (match_dup 2) (const_int 0)))]
3096: ""
3097: "
3098: { if (! rs6000_compare_fp_p)
3099: FAIL;
3100:
3101: operands[1] = gen_rtx (COMPARE, CCFPmode,
3102: rs6000_compare_op0, rs6000_compare_op1);
3103: operands[2] = gen_reg_rtx (CCFPmode);
3104: }")
3105:
3106: ;; A > 0 is best done using the portable sequence, so fail in that case.
3107: (define_expand "sgt"
3108: [(set (match_dup 2) (match_dup 1))
3109: (set (match_operand:SI 0 "gen_reg_operand" "")
3110: (gt:SI (match_dup 2) (const_int 0)))]
3111: ""
3112: "
3113: { enum machine_mode mode = rs6000_compare_fp_p ? CCFPmode : CCmode;
3114:
3115: if (! rs6000_compare_fp_p && rs6000_compare_op1 == const0_rtx)
3116: FAIL;
3117:
3118: operands[1] = gen_rtx (COMPARE, mode,
3119: rs6000_compare_op0, rs6000_compare_op1);
3120: operands[2] = gen_reg_rtx (mode);
3121: }")
3122:
3123: ;; A < 0 is best done in the portable way for A an integer.
3124: (define_expand "slt"
3125: [(set (match_dup 2) (match_dup 1))
3126: (set (match_operand:SI 0 "gen_reg_operand" "")
3127: (lt:SI (match_dup 2) (const_int 0)))]
3128: ""
3129: "
3130: { enum machine_mode mode = rs6000_compare_fp_p ? CCFPmode : CCmode;
3131:
3132: if (! rs6000_compare_fp_p && rs6000_compare_op1 == const0_rtx)
3133: FAIL;
3134:
3135: operands[1] = gen_rtx (COMPARE, mode,
3136: rs6000_compare_op0, rs6000_compare_op1);
3137: operands[2] = gen_reg_rtx (mode);
3138: }")
3139:
3140: (define_expand "sge"
3141: [(set (match_dup 2) (match_dup 1))
3142: (set (match_operand:SI 0 "gen_reg_operand" "")
3143: (ge:SI (match_dup 2) (const_int 0)))]
3144: ""
3145: "
3146: { enum machine_mode mode = rs6000_compare_fp_p ? CCFPmode : CCmode;
3147: operands[1] = gen_rtx (COMPARE, mode,
3148: rs6000_compare_op0, rs6000_compare_op1);
3149: operands[2] = gen_reg_rtx (mode);
3150: }")
3151:
3152: ;; A <= 0 is best done the portable way for A an integer.
3153: (define_expand "sle"
3154: [(set (match_dup 2) (match_dup 1))
3155: (set (match_operand:SI 0 "gen_reg_operand" "")
3156: (le:SI (match_dup 2) (const_int 0)))]
3157: ""
3158: "
3159: { enum machine_mode mode = rs6000_compare_fp_p ? CCFPmode : CCmode;
3160:
3161: if (! rs6000_compare_fp_p && rs6000_compare_op1 == const0_rtx)
3162: FAIL;
3163:
3164: operands[1] = gen_rtx (COMPARE, mode,
3165: rs6000_compare_op0, rs6000_compare_op1);
3166: operands[2] = gen_reg_rtx (mode);
3167: }")
3168:
3169: (define_expand "sgtu"
3170: [(set (match_dup 2) (match_dup 1))
3171: (set (match_operand:SI 0 "gen_reg_operand" "")
3172: (gtu:SI (match_dup 2) (const_int 0)))]
3173: ""
3174: "
3175: { operands[1] = gen_rtx (COMPARE, CCUNSmode,
3176: rs6000_compare_op0, rs6000_compare_op1);
3177: operands[2] = gen_reg_rtx (CCUNSmode);
3178: }")
3179:
3180: (define_expand "sltu"
3181: [(set (match_dup 2) (match_dup 1))
3182: (set (match_operand:SI 0 "gen_reg_operand" "")
3183: (ltu:SI (match_dup 2) (const_int 0)))]
3184: ""
3185: "
3186: { operands[1] = gen_rtx (COMPARE, CCUNSmode,
3187: rs6000_compare_op0, rs6000_compare_op1);
3188: operands[2] = gen_reg_rtx (CCUNSmode);
3189: }")
3190:
3191: (define_expand "sgeu"
3192: [(set (match_dup 2) (match_dup 1))
3193: (set (match_operand:SI 0 "gen_reg_operand" "")
3194: (geu:SI (match_dup 2) (const_int 0)))]
3195: ""
3196: "
3197: { operands[1] = gen_rtx (COMPARE, CCUNSmode,
3198: rs6000_compare_op0, rs6000_compare_op1);
3199: operands[2] = gen_reg_rtx (CCUNSmode);
3200: }")
3201:
3202: (define_expand "sleu"
3203: [(set (match_dup 2) (match_dup 1))
3204: (set (match_operand:SI 0 "gen_reg_operand" "")
3205: (leu:SI (match_dup 2) (const_int 0)))]
3206: ""
3207: "
3208: { operands[1] = gen_rtx (COMPARE, CCUNSmode,
3209: rs6000_compare_op0, rs6000_compare_op1);
3210: operands[2] = gen_reg_rtx (CCUNSmode);
3211: }")
3212:
3213: ;; Here are the actual compare insns.
3214: (define_insn ""
3215: [(set (match_operand:CC 0 "cc_reg_operand" "=y")
3216: (compare:CC (match_operand:SI 1 "gen_reg_operand" "r")
3217: (match_operand:SI 2 "reg_or_short_operand" "rI")))]
3218: ""
3219: "cmp%I2 %0,%1,%2"
3220: [(set_attr "type" "compare")])
3221:
3222: (define_insn ""
3223: [(set (match_operand:CCUNS 0 "cc_reg_operand" "=y")
3224: (compare:CCUNS (match_operand:SI 1 "gen_reg_operand" "r")
3225: (match_operand:SI 2 "reg_or_u_short_operand" "rI")))]
3226: ""
3227: "cmpl%I2 %0,%1,%W2"
3228: [(set_attr "type" "compare")])
3229:
3230: ;; The following two insns don't exist as single insns, but if we provide
3231: ;; them, we can swap an add and compare, which will enable us to overlap more
3232: ;; of the required delay between a compare and branch. We generate code for
3233: ;; them by splitting.
3234:
3235: (define_insn ""
3236: [(set (match_operand:CC 3 "cc_reg_operand" "=y")
3237: (compare:CC (match_operand:SI 1 "gen_reg_operand" "r")
3238: (match_operand:SI 2 "short_cint_operand" "i")))
3239: (set (match_operand:SI 0 "gen_reg_operand" "=r")
3240: (plus:SI (match_dup 1) (match_operand:SI 4 "short_cint_operand" "i")))]
3241: ""
3242: "#")
3243:
3244: (define_insn ""
3245: [(set (match_operand:CCUNS 3 "cc_reg_operand" "=y")
3246: (compare:CCUNS (match_operand:SI 1 "gen_reg_operand" "r")
3247: (match_operand:SI 2 "u_short_cint_operand" "i")))
3248: (set (match_operand:SI 0 "gen_reg_operand" "=r")
3249: (plus:SI (match_dup 1) (match_operand:SI 4 "short_cint_operand" "i")))]
3250: ""
3251: "#")
3252:
3253: (define_split
3254: [(set (match_operand:CC 3 "cc_reg_operand" "")
3255: (compare:CC (match_operand:SI 1 "gen_reg_operand" "")
3256: (match_operand:SI 2 "short_cint_operand" "")))
3257: (set (match_operand:SI 0 "gen_reg_operand" "")
3258: (plus:SI (match_dup 1) (match_operand:SI 4 "short_cint_operand" "")))]
3259: ""
3260: [(set (match_dup 3) (compare:CC (match_dup 1) (match_dup 2)))
3261: (set (match_dup 0) (plus:SI (match_dup 1) (match_dup 4)))])
3262:
3263: (define_split
3264: [(set (match_operand:CCUNS 3 "cc_reg_operand" "")
3265: (compare:CCUNS (match_operand:SI 1 "gen_reg_operand" "")
3266: (match_operand:SI 2 "u_short_cint_operand" "")))
3267: (set (match_operand:SI 0 "gen_reg_operand" "")
3268: (plus:SI (match_dup 1) (match_operand:SI 4 "short_cint_operand" "")))]
3269: ""
3270: [(set (match_dup 3) (compare:CCUNS (match_dup 1) (match_dup 2)))
3271: (set (match_dup 0) (plus:SI (match_dup 1) (match_dup 4)))])
3272:
3273: (define_insn ""
3274: [(set (match_operand:CCFP 0 "cc_reg_operand" "=y")
3275: (compare:CCFP (match_operand:SF 1 "gen_reg_operand" "f")
3276: (match_operand:SF 2 "gen_reg_operand" "f")))]
3277: ""
3278: "fcmpu %0,%1,%2"
3279: [(set_attr "type" "fpcompare")])
3280:
3281: (define_insn ""
3282: [(set (match_operand:CCFP 0 "cc_reg_operand" "=y")
3283: (compare:CCFP (match_operand:DF 1 "gen_reg_operand" "f")
3284: (match_operand:DF 2 "gen_reg_operand" "f")))]
3285: ""
3286: "fcmpu %0,%1,%2"
3287: [(set_attr "type" "fpcompare")])
3288:
3289: ;; Now we have the scc insns. We can do some combinations because of the
3290: ;; way the machine works.
3291: ;;
3292: ;; Note that this is probably faster if we can put an insn between the
3293: ;; mfcr and rlinm, but this is tricky. Let's leave it for now.
3294: (define_insn ""
3295: [(set (match_operand:SI 0 "gen_reg_operand" "=r")
3296: (match_operator:SI 1 "scc_comparison_operator"
3297: [(match_operand 2 "cc_reg_operand" "y")
3298: (const_int 0)]))]
3299: ""
3300: "%D1mfcr %0\;rlinm %0,%0,%J1,31,31")
3301:
3302: (define_insn ""
3303: [(set (match_operand:CC 0 "cc_reg_operand" "=x")
3304: (compare:CC (match_operator:SI 1 "scc_comparison_operator"
3305: [(match_operand 2 "cc_reg_operand" "y")
3306: (const_int 0)])
3307: (const_int 0)))
3308: (set (match_operand:SI 3 "gen_reg_operand" "=r")
3309: (match_op_dup 1 [(match_dup 2) (const_int 0)]))]
3310: ""
3311: "%D1mfcr %3\;rlinm. %3,%3,%J1,30,31"
3312: [(set_attr "type" "delayed_compare")])
3313:
3314: (define_insn ""
3315: [(set (match_operand:SI 0 "gen_reg_operand" "=r")
3316: (ashift:SI (match_operator:SI 1 "scc_comparison_operator"
3317: [(match_operand 2 "cc_reg_operand" "y")
3318: (const_int 0)])
3319: (match_operand:SI 3 "const_int_operand" "n")))]
3320: ""
3321: "*
3322: {
3323: int is_bit = ccr_bit (operands[1], 1);
3324: int put_bit = 31 - (INTVAL (operands[3]) & 31);
3325: int count;
3326:
3327: if (is_bit >= put_bit)
3328: count = is_bit - put_bit;
3329: else
3330: count = 32 - (put_bit - is_bit);
3331:
3332: operands[4] = gen_rtx (CONST_INT, VOIDmode, count);
3333: operands[5] = gen_rtx (CONST_INT, VOIDmode, put_bit);
3334:
3335: return \"%D1mfcr %0\;rlinm %0,%0,%4,%5,%5\";
3336: }")
3337:
3338: (define_insn ""
3339: [(set (match_operand:CC 0 "cc_reg_operand" "=x")
3340: (compare:CC
3341: (ashift:SI (match_operator:SI 1 "scc_comparison_operator"
3342: [(match_operand 2 "cc_reg_operand" "y")
3343: (const_int 0)])
3344: (match_operand:SI 3 "const_int_operand" "n"))
3345: (const_int 0)))
3346: (set (match_operand:SI 4 "gen_reg_operand" "=r")
3347: (ashift:SI (match_op_dup 1 [(match_dup 2) (const_int 0)])
3348: (match_dup 3)))]
3349: ""
3350: "*
3351: {
3352: int is_bit = ccr_bit (operands[1], 1);
3353: int put_bit = 31 - (INTVAL (operands[3]) & 31);
3354: int count;
3355:
3356: if (is_bit >= put_bit)
3357: count = is_bit - put_bit;
3358: else
3359: count = 32 - (put_bit - is_bit);
3360:
3361: operands[5] = gen_rtx (CONST_INT, VOIDmode, count);
3362: operands[6] = gen_rtx (CONST_INT, VOIDmode, put_bit);
3363:
3364: return \"%D1mfcr %4\;rlinm. %4,%4,%5,%6,%6\";
3365: }"
3366: [(set_attr "type" "delayed_compare")])
3367:
3368: ;; There are some scc insns that can be done directly, without a compare.
3369: ;; These are faster because they don't involve the communications between
3370: ;; the FXU and branch units. In fact, we will be replacing all of the
3371: ;; integer scc insns here or in the portable methods in emit_store_flag.
3372: ;;
3373: ;; Also support (neg (scc ..)) since that construct is used to replace
3374: ;; branches, (plus (scc ..) ..) since that construct is common and
3375: ;; takes no more insns than scc, and (and (neg (scc ..)) ..) in the
3376: ;; cases where it is no more expensive than (neg (scc ..)).
3377:
3378: ;; Have reload force a constant into a register for the simple insns that
3379: ;; otherwise won't accept constants. We do this because it is faster than
3380: ;; the cmp/mfcr sequence we would otherwise generate.
3381:
3382: (define_insn ""
3383: [(set (match_operand:SI 0 "gen_reg_operand" "=r,r,r,r,r")
3384: (eq:SI (match_operand:SI 1 "gen_reg_operand" "%r,r,r,r,r")
3385: (match_operand:SI 2 "reg_or_cint_operand" "r,O,K,J,I")))
3386: (clobber (match_scratch:SI 3 "=r,&r,r,r,r"))]
3387: ""
3388: "@
3389: xor %0,%1,%2\;sfi %3,%0,0\;ae %0,%3,%0
3390: sfi %3,%1,0\;ae %0,%3,%1
3391: xoril %0,%1,%b2\;sfi %3,%0,0\;ae %0,%3,%0
3392: xoriu %0,%1,%u2\;sfi %3,%0,0\;ae %0,%3,%0
3393: sfi %0,%1,%2\;sfi %3,%0,0\;ae %0,%3,%0")
3394:
3395: (define_insn ""
3396: [(set (match_operand:CC 4 "cc_reg_operand" "=x,x,x,x,x")
3397: (compare:CC
3398: (eq:SI (match_operand:SI 1 "gen_reg_operand" "%r,r,r,r,r")
3399: (match_operand:SI 2 "reg_or_cint_operand" "r,O,K,J,I"))
3400: (const_int 0)))
3401: (set (match_operand:SI 0 "gen_reg_operand" "=r,r,r,r,r")
3402: (eq:SI (match_dup 1) (match_dup 2)))
3403: (clobber (match_scratch:SI 3 "=r,&r,r,r,r"))]
3404: ""
3405: "@
3406: xor %0,%1,%2\;sfi %3,%0,0\;ae. %0,%3,%0
3407: sfi %3,%1,0\;ae. %0,%3,%1
3408: xoril %0,%1,%b2\;sfi %3,%0,0\;ae. %0,%3,%0
3409: xoriu %0,%1,%u2\;sfi %3,%0,0\;ae. %0,%3,%0
3410: sfi %0,%1,%2\;sfi %3,%0,0\;ae. %0,%3,%0"
3411: [(set_attr "type" "compare")])
3412:
3413: (define_insn ""
3414: [(set (match_operand:SI 0 "gen_reg_operand" "=r,r,r,r,r")
3415: (plus:SI (eq:SI (match_operand:SI 1 "gen_reg_operand" "%r,r,r,r,r")
3416: (match_operand:SI 2 "reg_or_cint_operand" "r,O,K,J,I"))
3417: (match_operand:SI 3 "gen_reg_operand" "r,r,r,r,r")))
3418: (clobber (match_scratch:SI 4 "=&r,&r,&r,&r,&r"))]
3419: ""
3420: "@
3421: xor %4,%1,%2\;sfi %4,%4,0\;aze %0,%3
3422: sfi %4,%1,0\;aze %0,%3
3423: xoril %4,%1,%b2\;sfi %4,%4,0\;aze %0,%3
3424: xoriu %4,%1,%u2\;sfi %4,%4,0\;aze %0,%3
3425: sfi %4,%1,%2\;sfi %4,%4,0\;aze %0,%3")
3426:
3427: (define_insn ""
3428: [(set (match_operand:CC 0 "cc_reg_operand" "=x,x,x,x,x")
3429: (compare:CC
3430: (plus:SI
3431: (eq:SI (match_operand:SI 1 "gen_reg_operand" "%r,r,r,r,r")
3432: (match_operand:SI 2 "reg_or_cint_operand" "r,O,K,J,I"))
3433: (match_operand:SI 3 "gen_reg_operand" "r,r,r,r,r"))
3434: (const_int 0)))
3435: (clobber (match_scratch:SI 4 "=&r,&r,&r,&r,&r"))]
3436: ""
3437: "@
3438: xor %4,%1,%2\;sfi %4,%4,0\;aze. %4,%3
3439: sfi %4,%1,0\;aze. %0,%3
3440: xoril %4,%1,%b2\;sfi %4,%4,0\;aze. %4,%3
3441: xoriu %4,%1,%u2\;sfi %4,%4,0\;aze. %4,%3
3442: sfi %4,%1,%2\;sfi %4,%4,0\;aze. %4,%3"
3443: [(set_attr "type" "compare")])
3444:
3445: (define_insn ""
3446: [(set (match_operand:CC 5 "cc_reg_operand" "=x,x,x,x,x")
3447: (compare:CC
3448: (plus:SI
3449: (eq:SI (match_operand:SI 1 "gen_reg_operand" "%r,r,r,r,r")
3450: (match_operand:SI 2 "reg_or_cint_operand" "r,O,K,J,I"))
3451: (match_operand:SI 3 "gen_reg_operand" "r,r,r,r,r"))
3452: (const_int 0)))
3453: (set (match_operand:SI 0 "gen_reg_operand" "=r,r,r,r,r")
3454: (plus:SI (eq:SI (match_dup 1) (match_dup 2)) (match_dup 3)))
3455: (clobber (match_scratch:SI 4 "=&r,&r,&r,&r,&r"))]
3456: ""
3457: "@
3458: xor %4,%1,%2\;sfi %4,%4,0\;aze. %0,%3
3459: sfi %4,%1,0\;aze. %4,%3
3460: xoril %4,%1,%b2\;sfi %4,%4,0\;aze. %0,%3
3461: xoriu %4,%1,%u2\;sfi %4,%4,0\;aze. %0,%3
3462: sfi %4,%1,%2\;sfi %4,%4,0\;aze. %0,%3"
3463: [(set_attr "type" "compare")])
3464:
3465: (define_insn ""
3466: [(set (match_operand:SI 0 "gen_reg_operand" "=r,r,r,r,r")
3467: (neg:SI (eq:SI (match_operand:SI 1 "gen_reg_operand" "r,r,r,r,r")
3468: (match_operand:SI 2 "reg_or_cint_operand" "r,O,K,J,I"))))]
3469: ""
3470: "@
3471: xor %0,%1,%2\;ai %0,%0,-1\;sfe %0,%0,%0
3472: ai %0,%1,-1\;sfe %0,%0,%0
3473: xoril %0,%1,%b2\;ai %0,%0,-1\;sfe %0,%0,%0
3474: xoriu %0,%1,%u2\;ai %0,%0,-1\;sfe %0,%0,%0
3475: sfi %0,%1,%2\;ai %0,%0,-1\;sfe %0,%0,%0")
3476:
3477: ;; This is what (plus (ne X (const_int 0)) Y) looks like.
3478: (define_insn ""
3479: [(set (match_operand:SI 0 "gen_reg_operand" "=r")
3480: (plus:SI (lshiftrt:SI
3481: (neg:SI (abs:SI (match_operand:SI 1 "gen_reg_operand" "r")))
3482: (const_int 31))
3483: (match_operand:SI 2 "gen_reg_operand" "r")))
3484: (clobber (match_scratch:SI 3 "=&r"))]
3485: ""
3486: "ai %3,%1,-1\;aze %0,%2")
3487:
3488: (define_insn ""
3489: [(set (match_operand:CC 0 "cc_reg_operand" "=x")
3490: (compare:CC
3491: (plus:SI (lshiftrt:SI
3492: (neg:SI (abs:SI (match_operand:SI 1 "gen_reg_operand" "r")))
3493: (const_int 31))
3494: (match_operand:SI 2 "gen_reg_operand" "r"))
3495: (const_int 0)))
3496: (clobber (match_scratch:SI 3 "=&r"))]
3497: ""
3498: "ai %3,%1,-1\;aze. %3,%2"
3499: [(set_attr "type" "compare")])
3500:
3501: (define_insn ""
3502: [(set (match_operand:CC 4 "cc_reg_operand" "=x")
3503: (compare:CC
3504: (plus:SI (lshiftrt:SI
3505: (neg:SI (abs:SI (match_operand:SI 1 "gen_reg_operand" "r")))
3506: (const_int 31))
3507: (match_operand:SI 2 "gen_reg_operand" "r"))
3508: (const_int 0)))
3509: (set (match_operand:SI 0 "gen_reg_operand" "=r")
3510: (plus:SI (lshiftrt:SI (neg:SI (abs:SI (match_dup 1))) (const_int 31))
3511: (match_dup 2)))
3512: (clobber (match_scratch:SI 3 "=&r"))]
3513: ""
3514: "ai %3,%1,-1\;aze. %0,%2"
3515: [(set_attr "type" "compare")])
3516:
3517: (define_insn ""
3518: [(set (match_operand:SI 0 "gen_reg_operand" "=r,r")
3519: (le:SI (match_operand:SI 1 "gen_reg_operand" "r,r")
3520: (match_operand:SI 2 "reg_or_short_operand" "r,O")))
3521: (clobber (match_scratch:SI 3 "=r,X"))]
3522: ""
3523: "@
3524: doz %3,%2,%1\;sfi %0,%3,0\;ae %0,%0,%3
3525: ai %0,%1,-1\;aze %0,%0\;sri %0,%0,31")
3526:
3527: (define_insn ""
3528: [(set (match_operand:CC 4 "cc_reg_operand" "=x,x")
3529: (compare:CC
3530: (le:SI (match_operand:SI 1 "gen_reg_operand" "r,r")
3531: (match_operand:SI 2 "reg_or_short_operand" "r,O"))
3532: (const_int 0)))
3533: (set (match_operand:SI 0 "gen_reg_operand" "=r,r")
3534: (le:SI (match_dup 1) (match_dup 2)))
3535: (clobber (match_scratch:SI 3 "=r,X"))]
3536: ""
3537: "@
3538: doz %3,%2,%1\;sfi %0,%3,0\;ae. %0,%0,%3
3539: ai %0,%1,-1\;aze %0,%0\;sri. %0,%0,31"
3540: [(set_attr "type" "delayed_compare,compare")])
3541:
3542: (define_insn ""
3543: [(set (match_operand:SI 0 "gen_reg_operand" "=r,r")
3544: (plus:SI (le:SI (match_operand:SI 1 "gen_reg_operand" "r,r")
3545: (match_operand:SI 2 "reg_or_short_operand" "r,O"))
3546: (match_operand:SI 3 "gen_reg_operand" "r,r")))
3547: (clobber (match_scratch:SI 4 "=&r,&r"))]
3548: ""
3549: "@
3550: doz %4,%2,%1\;sfi %4,%4,0\;aze %0,%3
3551: srai %4,%1,31\;sf %4,%1,%4\;aze %0,%3")
3552:
3553: (define_insn ""
3554: [(set (match_operand:CC 0 "cc_reg_operand" "=x,x")
3555: (compare:CC
3556: (plus:SI (le:SI (match_operand:SI 1 "gen_reg_operand" "r,r")
3557: (match_operand:SI 2 "reg_or_short_operand" "r,O"))
3558: (match_operand:SI 3 "gen_reg_operand" "r,r"))
3559: (const_int 0)))
3560: (clobber (match_scratch:SI 4 "=&r,&r"))]
3561: ""
3562: "@
3563: doz %4,%2,%1\;sfi %4,%4,0\;aze. %4,%3
3564: srai %4,%1,31\;sf %4,%1,%4\;aze. %4,%3"
3565: [(set_attr "type" "compare")])
3566:
3567: (define_insn ""
3568: [(set (match_operand:CC 5 "cc_reg_operand" "=x,x")
3569: (compare:CC
3570: (plus:SI (le:SI (match_operand:SI 1 "gen_reg_operand" "r,r")
3571: (match_operand:SI 2 "reg_or_short_operand" "r,O"))
3572: (match_operand:SI 3 "gen_reg_operand" "r,r"))
3573: (const_int 0)))
3574: (set (match_operand:SI 0 "gen_reg_operand" "=r,r")
3575: (plus:SI (le:SI (match_dup 1) (match_dup 2)) (match_dup 3)))
3576: (clobber (match_scratch:SI 4 "=&r,&r"))]
3577: ""
3578: "@
3579: doz %4,%2,%1\;sfi %4,%4,0\;aze. %0,%3
3580: srai %4,%1,31\;sf %4,%1,%4\;aze. %0,%3"
3581: [(set_attr "type" "compare")])
3582:
3583: (define_insn ""
3584: [(set (match_operand:SI 0 "gen_reg_operand" "=r,r")
3585: (neg:SI (le:SI (match_operand:SI 1 "gen_reg_operand" "r,r")
3586: (match_operand:SI 2 "reg_or_short_operand" "r,O"))))]
3587: ""
3588: "@
3589: doz %0,%2,%1\;ai %0,%0,-1\;sfe %0,%0,%0
3590: ai %0,%1,-1\;aze %0,%0\;srai %0,%0,31")
3591:
3592: (define_insn ""
3593: [(set (match_operand:SI 0 "gen_reg_operand" "=r")
3594: (leu:SI (match_operand:SI 1 "gen_reg_operand" "r")
3595: (match_operand:SI 2 "reg_or_short_operand" "rI")))]
3596: ""
3597: "sf%I2 %0,%1,%2\;cal %0,0(0)\;ae %0,%0,%0")
3598:
3599: (define_insn ""
3600: [(set (match_operand:CC 3 "cc_reg_operand" "=x")
3601: (compare:CC
3602: (leu:SI (match_operand:SI 1 "gen_reg_operand" "r")
3603: (match_operand:SI 2 "reg_or_short_operand" "rI"))
3604: (const_int 0)))
3605: (set (match_operand:SI 0 "gen_reg_operand" "=r")
3606: (leu:SI (match_dup 1) (match_dup 2)))]
3607: ""
3608: "sf%I2 %0,%1,%2\;cal %0,0(0)\;ae. %0,%0,%0"
3609: [(set_attr "type" "compare")])
3610:
3611: (define_insn ""
3612: [(set (match_operand:SI 0 "gen_reg_operand" "=r")
3613: (plus:SI (leu:SI (match_operand:SI 1 "gen_reg_operand" "r")
3614: (match_operand:SI 2 "reg_or_short_operand" "rI"))
3615: (match_operand:SI 3 "gen_reg_operand" "r")))
3616: (clobber (match_scratch:SI 4 "=&r"))]
3617: ""
3618: "sf%I2 %4,%1,%2\;aze %0,%3")
3619:
3620: (define_insn ""
3621: [(set (match_operand:CC 0 "cc_reg_operand" "=x")
3622: (compare:CC
3623: (plus:SI (leu:SI (match_operand:SI 1 "gen_reg_operand" "r")
3624: (match_operand:SI 2 "reg_or_short_operand" "rI"))
3625: (match_operand:SI 3 "gen_reg_operand" "r"))
3626: (const_int 0)))
3627: (clobber (match_scratch:SI 4 "=&r"))]
3628: ""
3629: "sf%I2 %4,%1,%2\;aze. %4,%3"
3630: [(set_attr "type" "compare")])
3631:
3632: (define_insn ""
3633: [(set (match_operand:CC 5 "cc_reg_operand" "=x")
3634: (compare:CC
3635: (plus:SI (leu:SI (match_operand:SI 1 "gen_reg_operand" "r")
3636: (match_operand:SI 2 "reg_or_short_operand" "rI"))
3637: (match_operand:SI 3 "gen_reg_operand" "r"))
3638: (const_int 0)))
3639: (set (match_operand:SI 0 "gen_reg_operand" "=r")
3640: (plus:SI (leu:SI (match_dup 1) (match_dup 2)) (match_dup 3)))
3641: (clobber (match_scratch:SI 4 "=&r"))]
3642: ""
3643: "sf%I2 %4,%1,%2\;aze. %0,%3"
3644: [(set_attr "type" "compare")])
3645:
3646: (define_insn ""
3647: [(set (match_operand:SI 0 "gen_reg_operand" "=r")
3648: (neg:SI (leu:SI (match_operand:SI 1 "gen_reg_operand" "r")
3649: (match_operand:SI 2 "reg_or_short_operand" "rI"))))]
3650: ""
3651: "sf%I2 %0,%1,%2\;sfe %0,%0,%0\;nand %0,%0,%0")
3652:
3653: (define_insn ""
3654: [(set (match_operand:SI 0 "gen_reg_operand" "=r")
3655: (and:SI (neg:SI
3656: (leu:SI (match_operand:SI 1 "gen_reg_operand" "r")
3657: (match_operand:SI 2 "reg_or_short_operand" "rI")))
3658: (match_operand:SI 3 "gen_reg_operand" "r")))
3659: (clobber (match_scratch:SI 4 "=&r"))]
3660: ""
3661: "sf%I2 %4,%1,%2\;sfe %4,%4,%4\;andc %0,%3,%4")
3662:
3663: (define_insn ""
3664: [(set (match_operand:CC 0 "cc_reg_operand" "=x")
3665: (compare:CC
3666: (and:SI (neg:SI
3667: (leu:SI (match_operand:SI 1 "gen_reg_operand" "r")
3668: (match_operand:SI 2 "reg_or_short_operand" "rI")))
3669: (match_operand:SI 3 "gen_reg_operand" "r"))
3670: (const_int 0)))
3671: (clobber (match_scratch:SI 4 "=&r"))]
3672: ""
3673: "sf%I2 %4,%1,%2\;sfe %4,%4,%4\;andc. %4,%3,%4"
3674: [(set_attr "type" "compare")])
3675:
3676: (define_insn ""
3677: [(set (match_operand:CC 5 "cc_reg_operand" "=x")
3678: (compare:CC
3679: (and:SI (neg:SI
3680: (leu:SI (match_operand:SI 1 "gen_reg_operand" "r")
3681: (match_operand:SI 2 "reg_or_short_operand" "rI")))
3682: (match_operand:SI 3 "gen_reg_operand" "r"))
3683: (const_int 0)))
3684: (set (match_operand:SI 0 "gen_reg_operand" "=r")
3685: (and:SI (neg:SI (leu:SI (match_dup 1) (match_dup 2))) (match_dup 3)))
3686: (clobber (match_scratch:SI 4 "=&r"))]
3687: ""
3688: "sf%I2 %4,%1,%2\;sfe %4,%4,%4\;andc. %0,%3,%4"
3689: [(set_attr "type" "compare")])
3690:
3691: (define_insn ""
3692: [(set (match_operand:SI 0 "gen_reg_operand" "=r")
3693: (lt:SI (match_operand:SI 1 "gen_reg_operand" "r")
3694: (match_operand:SI 2 "reg_or_short_operand" "rI")))]
3695: ""
3696: "doz%I2 %0,%1,%2\;nabs %0,%0\;sri %0,%0,31")
3697:
3698: (define_insn ""
3699: [(set (match_operand:SI 3 "cc_reg_operand" "=x")
3700: (compare:CC
3701: (lt:SI (match_operand:SI 1 "gen_reg_operand" "r")
3702: (match_operand:SI 2 "reg_or_short_operand" "rI"))
3703: (const_int 0)))
3704: (set (match_operand:SI 0 "gen_reg_operand" "=r")
3705: (lt:SI (match_dup 1) (match_dup 2)))]
3706: ""
3707: "doz%I2 %0,%1,%2\;nabs %0,%0\;sri. %0,%0,31"
3708: [(set_attr "type" "delayed_compare")])
3709:
3710: (define_insn ""
3711: [(set (match_operand:SI 0 "gen_reg_operand" "=r")
3712: (plus:SI (lt:SI (match_operand:SI 1 "gen_reg_operand" "r")
3713: (match_operand:SI 2 "reg_or_short_operand" "rI"))
3714: (match_operand:SI 3 "gen_reg_operand" "r")))
3715: (clobber (match_scratch:SI 4 "=&r"))]
3716: ""
3717: "doz%I2 %4,%1,%2\;ai %4,%4,-1\;aze %0,%3")
3718:
3719: (define_insn ""
3720: [(set (match_operand:SI 0 "cc_reg_operand" "=x")
3721: (compare:CC
3722: (plus:SI (lt:SI (match_operand:SI 1 "gen_reg_operand" "r")
3723: (match_operand:SI 2 "reg_or_short_operand" "rI"))
3724: (match_operand:SI 3 "gen_reg_operand" "r"))
3725: (const_int 0)))
3726: (clobber (match_scratch:SI 4 "=&r"))]
3727: ""
3728: "doz%I2 %4,%1,%2\;ai %4,%4,-1\;aze. %4,%3"
3729: [(set_attr "type" "compare")])
3730:
3731: (define_insn ""
3732: [(set (match_operand:SI 5 "cc_reg_operand" "=x")
3733: (compare:CC
3734: (plus:SI (lt:SI (match_operand:SI 1 "gen_reg_operand" "r")
3735: (match_operand:SI 2 "reg_or_short_operand" "rI"))
3736: (match_operand:SI 3 "gen_reg_operand" "r"))
3737: (const_int 0)))
3738: (set (match_operand:SI 0 "gen_reg_operand" "=r")
3739: (plus:SI (lt:SI (match_dup 1) (match_dup 2)) (match_dup 3)))
3740: (clobber (match_scratch:SI 4 "=&r"))]
3741: ""
3742: "doz%I2 %4,%1,%2\;ai %4,%4,-1\;aze. %0,%3"
3743: [(set_attr "type" "compare")])
3744:
3745: (define_insn ""
3746: [(set (match_operand:SI 0 "gen_reg_operand" "=r")
3747: (neg:SI (lt:SI (match_operand:SI 1 "gen_reg_operand" "r")
3748: (match_operand:SI 2 "reg_or_short_operand" "rI"))))]
3749: ""
3750: "doz%I2 %0,%1,%2\;nabs %0,%0\;srai %0,%0,31")
3751:
3752: (define_insn ""
3753: [(set (match_operand:SI 0 "gen_reg_operand" "=r,r")
3754: (ltu:SI (match_operand:SI 1 "gen_reg_operand" "r,r")
3755: (match_operand:SI 2 "reg_or_neg_short_operand" "r,P")))]
3756: ""
3757: "@
3758: sf %0,%2,%1\;sfe %0,%0,%0\;neg %0,%0
3759: ai %0,%1,%n2\;sfe %0,%0,%0\;neg %0,%0")
3760:
3761: (define_insn ""
3762: [(set (match_operand:CC 3 "cc_reg_operand" "=x,x")
3763: (compare:CC
3764: (ltu:SI (match_operand:SI 1 "gen_reg_operand" "r,r")
3765: (match_operand:SI 2 "reg_or_neg_short_operand" "r,P"))
3766: (const_int 0)))
3767: (set (match_operand:SI 0 "gen_reg_operand" "=r,r")
3768: (ltu:SI (match_dup 1) (match_dup 2)))]
3769: ""
3770: "@
3771: sf %0,%2,%1\;sfe %0,%0,%0\;neg. %0,%0
3772: ai %0,%1,%n2\;sfe %0,%0,%0\;neg. %0,%0"
3773: [(set_attr "type" "compare")])
3774:
3775: (define_insn ""
3776: [(set (match_operand:SI 0 "gen_reg_operand" "=r,r,r,r")
3777: (plus:SI (ltu:SI (match_operand:SI 1 "gen_reg_operand" "r,r,r,r")
3778: (match_operand:SI 2 "reg_or_neg_short_operand" "r,r,P,P"))
3779: (match_operand:SI 3 "reg_or_short_operand" "r,I,r,I")))
3780: (clobber (match_scratch:SI 4 "=&r,r,&r,r"))]
3781: ""
3782: "@
3783: sf %4,%2,%1\;sfe %4,%4,%4\;sf%I3 %0,%4,%3
3784: sf %4,%2,%1\;sfe %4,%4,%4\;sf%I3 %0,%4,%3
3785: ai %4,%1,%n2\;sfe %4,%4,%4\;sf%I3 %0,%4,%3
3786: ai %4,%1,%n2\;sfe %4,%4,%4\;sf%I3 %0,%4,%3")
3787:
3788: (define_insn ""
3789: [(set (match_operand:CC 0 "cc_reg_operand" "=x,x,x,x")
3790: (compare:CC
3791: (plus:SI (ltu:SI (match_operand:SI 1 "gen_reg_operand" "r,r,r,r")
3792: (match_operand:SI 2 "reg_or_neg_short_operand" "r,r,P,P"))
3793: (match_operand:SI 3 "reg_or_short_operand" "r,I,r,I"))
3794: (const_int 0)))
3795: (clobber (match_scratch:SI 4 "=&r,r,&r,r"))]
3796: ""
3797: "@
3798: sf %4,%2,%1\;sfe %4,%4,%4\;sf%I3. %4,%4,%3
3799: sf %4,%2,%1\;sfe %4,%4,%4\;sf%I3. %4,%4,%3
3800: ai %4,%1,%n2\;sfe %4,%4,%4\;sf%I3. %4,%4,%3
3801: ai %4,%1,%n2\;sfe %4,%4,%4\;sf%I3. %4,%4,%3"
3802: [(set_attr "type" "compare")])
3803:
3804: (define_insn ""
3805: [(set (match_operand:CC 5 "cc_reg_operand" "=x,x,x,x")
3806: (compare:CC
3807: (plus:SI (ltu:SI (match_operand:SI 1 "gen_reg_operand" "r,r,r,r")
3808: (match_operand:SI 2 "reg_or_neg_short_operand" "r,r,P,P"))
3809: (match_operand:SI 3 "reg_or_short_operand" "r,I,r,I"))
3810: (const_int 0)))
3811: (set (match_operand:SI 0 "gen_reg_operand" "=r,r,r,r")
3812: (plus:SI (ltu:SI (match_dup 1) (match_dup 2)) (match_dup 3)))
3813: (clobber (match_scratch:SI 4 "=&r,r,&r,r"))]
3814: ""
3815: "@
3816: sf %4,%2,%1\;sfe %4,%4,%4\;sf%I3. %0,%4,%3
3817: sf %4,%2,%1\;sfe %4,%4,%4\;sf%I3. %0,%4,%3
3818: ai %4,%1,%n2\;sfe %4,%4,%4\;sf%I3. %0,%4,%3
3819: ai %4,%1,%n2\;sfe %4,%4,%4\;sf%I3. %0,%4,%3"
3820: [(set_attr "type" "compare")])
3821:
3822: (define_insn ""
3823: [(set (match_operand:SI 0 "gen_reg_operand" "=r,r")
3824: (neg:SI (ltu:SI (match_operand:SI 1 "gen_reg_operand" "r,r")
3825: (match_operand:SI 2 "reg_or_neg_short_operand" "r,P"))))]
3826: ""
3827: "@
3828: sf %0,%2,%1\;sfe %0,%0,%0
3829: ai %0,%1,%n2\;sfe %0,%0,%0")
3830:
3831: (define_insn ""
3832: [(set (match_operand:SI 0 "gen_reg_operand" "=r")
3833: (ge:SI (match_operand:SI 1 "gen_reg_operand" "r")
3834: (match_operand:SI 2 "reg_or_short_operand" "rI")))
3835: (clobber (match_scratch:SI 3 "=r"))]
3836: ""
3837: "doz%I2 %3,%1,%2\;sfi %0,%3,0\;ae %0,%0,%3")
3838:
3839: (define_insn ""
3840: [(set (match_operand:CC 4 "cc_reg_operand" "=x")
3841: (compare:CC
3842: (ge:SI (match_operand:SI 1 "gen_reg_operand" "r")
3843: (match_operand:SI 2 "reg_or_short_operand" "rI"))
3844: (const_int 0)))
3845: (set (match_operand:SI 0 "gen_reg_operand" "=r")
3846: (ge:SI (match_dup 1) (match_dup 2)))
3847: (clobber (match_scratch:SI 3 "=r"))]
3848: ""
3849: "doz%I2 %3,%1,%2\;sfi %0,%3,0\;ae. %0,%0,%3"
3850: [(set_attr "type" "compare")])
3851:
3852: (define_insn ""
3853: [(set (match_operand:SI 0 "gen_reg_operand" "=r")
3854: (plus:SI (ge:SI (match_operand:SI 1 "gen_reg_operand" "r")
3855: (match_operand:SI 2 "reg_or_short_operand" "rI"))
3856: (match_operand:SI 3 "gen_reg_operand" "r")))
3857: (clobber (match_scratch:SI 4 "=&r"))]
3858: ""
3859: "doz%I2 %4,%1,%2\;sfi %4,%4,0\;aze %0,%3")
3860:
3861: (define_insn ""
3862: [(set (match_operand:CC 0 "cc_reg_operand" "=x")
3863: (compare:CC
3864: (plus:SI (ge:SI (match_operand:SI 1 "gen_reg_operand" "r")
3865: (match_operand:SI 2 "reg_or_short_operand" "rI"))
3866: (match_operand:SI 3 "gen_reg_operand" "r"))
3867: (const_int 0)))
3868: (clobber (match_scratch:SI 4 "=&r"))]
3869: ""
3870: "doz%I2 %4,%1,%2\;sfi %4,%4,0\;aze. %4,%3"
3871: [(set_attr "type" "compare")])
3872:
3873: (define_insn ""
3874: [(set (match_operand:CC 5 "cc_reg_operand" "=x")
3875: (compare:CC
3876: (plus:SI (ge:SI (match_operand:SI 1 "gen_reg_operand" "r")
3877: (match_operand:SI 2 "reg_or_short_operand" "rI"))
3878: (match_operand:SI 3 "gen_reg_operand" "r"))
3879: (const_int 0)))
3880: (set (match_operand:SI 0 "gen_reg_operand" "=r")
3881: (plus:SI (ge:SI (match_dup 1) (match_dup 2)) (match_dup 3)))
3882: (clobber (match_scratch:SI 4 "=&r"))]
3883: ""
3884: "doz%I2 %4,%1,%2\;sfi %4,%4,0\;aze. %0,%3"
3885: [(set_attr "type" "compare")])
3886:
3887: (define_insn ""
3888: [(set (match_operand:SI 0 "gen_reg_operand" "=r")
3889: (neg:SI (ge:SI (match_operand:SI 1 "gen_reg_operand" "r")
3890: (match_operand:SI 2 "reg_or_short_operand" "rI"))))]
3891: ""
3892: "doz%I2 %0,%1,%2\;ai %0,%0,-1\;sfe %0,%0,%0")
3893:
3894: ;; This is (and (neg (ge X (const_int 0))) Y).
3895: (define_insn ""
3896: [(set (match_operand:SI 0 "gen_reg_operand" "=r")
3897: (and:SI (neg:SI
3898: (lshiftrt:SI
3899: (not:SI (match_operand:SI 1 "gen_reg_operand" "r"))
3900: (const_int 31)))
3901: (match_operand:SI 2 "gen_reg_operand" "r")))
3902: (clobber (match_scratch:SI 3 "=&r"))]
3903: ""
3904: "srai %3,%1,31\;andc %0,%2,%3")
3905:
3906: (define_insn ""
3907: [(set (match_operand:CC 0 "cc_reg_operand" "=x")
3908: (compare:CC
3909: (and:SI (neg:SI
3910: (lshiftrt:SI
3911: (not:SI (match_operand:SI 1 "gen_reg_operand" "r"))
3912: (const_int 31)))
3913: (match_operand:SI 2 "gen_reg_operand" "r"))
3914: (const_int 0)))
3915: (clobber (match_scratch:SI 3 "=&r"))]
3916: ""
3917: "srai %3,%1,31\;andc. %3,%2,%3"
3918: [(set_attr "type" "compare")])
3919:
3920: (define_insn ""
3921: [(set (match_operand:CC 4 "cc_reg_operand" "=x")
3922: (compare:CC
3923: (and:SI (neg:SI
3924: (lshiftrt:SI
3925: (not:SI (match_operand:SI 1 "gen_reg_operand" "r"))
3926: (const_int 31)))
3927: (match_operand:SI 2 "gen_reg_operand" "r"))
3928: (const_int 0)))
3929: (set (match_operand:SI 0 "gen_reg_operand" "=r")
3930: (and:SI (neg:SI (lshiftrt:SI (not:SI (match_dup 1))
3931: (const_int 31)))
3932: (match_dup 2)))
3933: (clobber (match_scratch:SI 3 "=&r"))]
3934: ""
3935: "srai %3,%1,31\;andc. %0,%2,%3"
3936: [(set_attr "type" "compare")])
3937:
3938: (define_insn ""
3939: [(set (match_operand:SI 0 "gen_reg_operand" "=r,r")
3940: (geu:SI (match_operand:SI 1 "gen_reg_operand" "r,r")
3941: (match_operand:SI 2 "reg_or_neg_short_operand" "r,P")))]
3942: ""
3943: "@
3944: sf %0,%2,%1\;cal %0,0(0)\;ae %0,%0,%0
3945: ai %0,%1,%n2\;cal %0,0(0)\;ae %0,%0,%0")
3946:
3947: (define_insn ""
3948: [(set (match_operand:CC 3 "cc_reg_operand" "=x,x")
3949: (compare:CC
3950: (geu:SI (match_operand:SI 1 "gen_reg_operand" "r,r")
3951: (match_operand:SI 2 "reg_or_neg_short_operand" "r,P"))
3952: (const_int 0)))
3953: (set (match_operand:SI 0 "gen_reg_operand" "=r,r")
3954: (geu:SI (match_dup 1) (match_dup 2)))]
3955: ""
3956: "@
3957: sf %0,%2,%1\;cal %0,0(0)\;ae. %0,%0,%0
3958: ai %0,%1,%n2\;cal %0,0(0)\;ae. %0,%0,%0"
3959: [(set_attr "type" "compare")])
3960:
3961: (define_insn ""
3962: [(set (match_operand:SI 0 "gen_reg_operand" "=r,r")
3963: (plus:SI (geu:SI (match_operand:SI 1 "gen_reg_operand" "r,r")
3964: (match_operand:SI 2 "reg_or_neg_short_operand" "r,P"))
3965: (match_operand:SI 3 "gen_reg_operand" "r,r")))
3966: (clobber (match_scratch:SI 4 "=&r,&r"))]
3967: ""
3968: "@
3969: sf %4,%2,%1\;aze %0,%3
3970: ai %4,%1,%n2\;aze %0,%3")
3971:
3972: (define_insn ""
3973: [(set (match_operand:CC 0 "cc_reg_operand" "=x,x")
3974: (compare:CC
3975: (plus:SI (geu:SI (match_operand:SI 1 "gen_reg_operand" "r,r")
3976: (match_operand:SI 2 "reg_or_neg_short_operand" "r,P"))
3977: (match_operand:SI 3 "gen_reg_operand" "r,r"))
3978: (const_int 0)))
3979: (clobber (match_scratch:SI 4 "=&r,&r"))]
3980: ""
3981: "@
3982: sf %4,%2,%1\;aze. %4,%3
3983: ai %4,%1,%n2\;aze. %4,%3"
3984: [(set_attr "type" "compare")])
3985:
3986: (define_insn ""
3987: [(set (match_operand:CC 5 "cc_reg_operand" "=x,x")
3988: (compare:CC
3989: (plus:SI (geu:SI (match_operand:SI 1 "gen_reg_operand" "r,r")
3990: (match_operand:SI 2 "reg_or_neg_short_operand" "r,P"))
3991: (match_operand:SI 3 "gen_reg_operand" "r,r"))
3992: (const_int 0)))
3993: (set (match_operand:SI 0 "gen_reg_operand" "=r,r")
3994: (plus:SI (geu:SI (match_dup 1) (match_dup 2)) (match_dup 3)))
3995: (clobber (match_scratch:SI 4 "=&r,&r"))]
3996: ""
3997: "@
3998: sf %4,%2,%1\;aze. %0,%3
3999: ai %4,%1,%n2\;aze. %4,%3"
4000: [(set_attr "type" "compare")])
4001:
4002: (define_insn ""
4003: [(set (match_operand:SI 0 "gen_reg_operand" "=r,r")
4004: (neg:SI (geu:SI (match_operand:SI 1 "gen_reg_operand" "r,r")
4005: (match_operand:SI 2 "reg_or_short_operand" "r,I"))))]
4006: ""
4007: "@
4008: sf %0,%2,%1\;sfe %0,%0,%0\;nand %0,%0,%0
4009: sfi %0,%1,-1\;a%I2 %0,%0,%2\;sfe %0,%0,%0")
4010:
4011: (define_insn ""
4012: [(set (match_operand:SI 0 "gen_reg_operand" "=r,r")
4013: (and:SI (neg:SI
4014: (geu:SI (match_operand:SI 1 "gen_reg_operand" "r,r")
4015: (match_operand:SI 2 "reg_or_neg_short_operand" "r,P")))
4016: (match_operand:SI 3 "gen_reg_operand" "r,r")))
4017: (clobber (match_scratch:SI 4 "=&r,&r"))]
4018: ""
4019: "@
4020: sf %4,%2,%1\;sfe %4,%4,%4\;andc %0,%3,%4
4021: ai %4,%1,%n2\;sfe %4,%4,%4\;andc %0,%3,%4")
4022:
4023: (define_insn ""
4024: [(set (match_operand:CC 0 "cc_reg_operand" "=x,x")
4025: (compare:CC
4026: (and:SI (neg:SI
4027: (geu:SI (match_operand:SI 1 "gen_reg_operand" "r,r")
4028: (match_operand:SI 2 "reg_or_neg_short_operand" "r,P")))
4029: (match_operand:SI 3 "gen_reg_operand" "r,r"))
4030: (const_int 0)))
4031: (clobber (match_scratch:SI 4 "=&r,&r"))]
4032: ""
4033: "@
4034: sf %4,%2,%1\;sfe %4,%4,%4\;andc. %4,%3,%4
4035: ai %4,%1,%n2\;sfe %4,%4,%4\;andc. %4,%3,%4"
4036: [(set_attr "type" "compare")])
4037:
4038: (define_insn ""
4039: [(set (match_operand:CC 5 "cc_reg_operand" "=x,x")
4040: (compare:CC
4041: (and:SI (neg:SI
4042: (geu:SI (match_operand:SI 1 "gen_reg_operand" "r,r")
4043: (match_operand:SI 2 "reg_or_neg_short_operand" "r,P")))
4044: (match_operand:SI 3 "gen_reg_operand" "r,r"))
4045: (const_int 0)))
4046: (set (match_operand:SI 0 "gen_reg_operand" "=r,r")
4047: (and:SI (neg:SI (geu:SI (match_dup 1) (match_dup 2))) (match_dup 3)))
4048: (clobber (match_scratch:SI 4 "=&r,&r"))]
4049: ""
4050: "@
4051: sf %4,%2,%1\;sfe %4,%4,%4\;andc. %0,%3,%4
4052: ai %4,%1,%n2\;sfe %4,%4,%4\;andc. %0,%3,%4"
4053: [(set_attr "type" "compare")])
4054:
4055: (define_insn ""
4056: [(set (match_operand:SI 0 "gen_reg_operand" "=r")
4057: (gt:SI (match_operand:SI 1 "gen_reg_operand" "r")
4058: (const_int 0)))]
4059: ""
4060: "sfi %0,%1,0\;ame %0,%0\;sri %0,%0,31")
4061:
4062: (define_insn ""
4063: [(set (match_operand:CC 2 "cc_reg_operand" "=x")
4064: (compare:CC
4065: (gt:SI (match_operand:SI 1 "gen_reg_operand" "r")
4066: (const_int 0))
4067: (const_int 0)))
4068: (set (match_operand:SI 0 "gen_reg_operand" "=r")
4069: (gt:SI (match_dup 1) (const_int 0)))]
4070: ""
4071: "sfi %0,%1,0\;ame %0,%0\;sri. %0,%0,31"
4072: [(set_attr "type" "delayed_compare")])
4073:
4074: (define_insn ""
4075: [(set (match_operand:SI 0 "gen_reg_operand" "=r")
4076: (gt:SI (match_operand:SI 1 "gen_reg_operand" "r")
4077: (match_operand:SI 2 "reg_or_short_operand" "r")))]
4078: ""
4079: "doz %0,%2,%1\;nabs %0,%0\;sri %0,%0,31")
4080:
4081: (define_insn ""
4082: [(set (match_operand:CC 3 "cc_reg_operand" "=x")
4083: (compare:CC
4084: (gt:SI (match_operand:SI 1 "gen_reg_operand" "r")
4085: (match_operand:SI 2 "reg_or_short_operand" "r"))
4086: (const_int 0)))
4087: (set (match_operand:SI 0 "gen_reg_operand" "=r")
4088: (gt:SI (match_dup 1) (match_dup 2)))]
4089: ""
4090: "doz %0,%2,%1\;nabs %0,%0\;sri. %0,%0,31"
4091: [(set_attr "type" "delayed_compare")])
4092:
4093: (define_insn ""
4094: [(set (match_operand:SI 0 "gen_reg_operand" "=r")
4095: (plus:SI (gt:SI (match_operand:SI 1 "gen_reg_operand" "r")
4096: (const_int 0))
4097: (match_operand:SI 2 "gen_reg_operand" "r")))
4098: (clobber (match_scratch:SI 3 "=&r"))]
4099: ""
4100: "a %3,%1,%1\;sfe %3,%1,%3\;aze %0,%2")
4101:
4102: (define_insn ""
4103: [(set (match_operand:CC 0 "cc_reg_operand" "=x")
4104: (compare:CC
4105: (plus:SI (gt:SI (match_operand:SI 1 "gen_reg_operand" "r")
4106: (const_int 0))
4107: (match_operand:SI 2 "gen_reg_operand" "r"))
4108: (const_int 0)))
4109: (clobber (match_scratch:SI 3 "=&r"))]
4110: ""
4111: "a %3,%1,%1\;sfe %3,%1,%3\;aze. %0,%2"
4112: [(set_attr "type" "compare")])
4113:
4114: (define_insn ""
4115: [(set (match_operand:CC 4 "cc_reg_operand" "=x")
4116: (compare:CC
4117: (plus:SI (gt:SI (match_operand:SI 1 "gen_reg_operand" "r")
4118: (const_int 0))
4119: (match_operand:SI 2 "gen_reg_operand" "r"))
4120: (const_int 0)))
4121: (set (match_operand:SI 0 "gen_reg_operand" "=r")
4122: (plus:SI (gt:SI (match_dup 1) (const_int 0)) (match_dup 2)))
4123: (clobber (match_scratch:SI 3 "=&r"))]
4124: ""
4125: "a %3,%1,%1\;sfe %3,%1,%3\;aze. %3,%2"
4126: [(set_attr "type" "compare")])
4127:
4128: (define_insn ""
4129: [(set (match_operand:SI 0 "gen_reg_operand" "=r")
4130: (plus:SI (gt:SI (match_operand:SI 1 "gen_reg_operand" "r")
4131: (match_operand:SI 2 "reg_or_short_operand" "r"))
4132: (match_operand:SI 3 "gen_reg_operand" "r")))
4133: (clobber (match_scratch:SI 4 "=&r"))]
4134: ""
4135: "doz %4,%2,%1\;ai %4,%4,-1\;aze %0,%3")
4136:
4137: (define_insn ""
4138: [(set (match_operand:CC 0 "cc_reg_operand" "=x")
4139: (compare:CC
4140: (plus:SI (gt:SI (match_operand:SI 1 "gen_reg_operand" "r")
4141: (match_operand:SI 2 "reg_or_short_operand" "r"))
4142: (match_operand:SI 3 "gen_reg_operand" "r"))
4143: (const_int 0)))
4144: (clobber (match_scratch:SI 4 "=&r"))]
4145: ""
4146: "doz %4,%2,%1\;ai %4,%4,-1\;aze. %4,%3"
4147: [(set_attr "type" "compare")])
4148:
4149: (define_insn ""
4150: [(set (match_operand:CC 5 "cc_reg_operand" "=x")
4151: (compare:CC
4152: (plus:SI (gt:SI (match_operand:SI 1 "gen_reg_operand" "r")
4153: (match_operand:SI 2 "reg_or_short_operand" "r"))
4154: (match_operand:SI 3 "gen_reg_operand" "r"))
4155: (const_int 0)))
4156: (set (match_operand:SI 0 "gen_reg_operand" "=r")
4157: (plus:SI (gt:SI (match_dup 1) (match_dup 2)) (match_dup 3)))
4158: (clobber (match_scratch:SI 4 "=&r"))]
4159: ""
4160: "doz %4,%2,%1\;ai %4,%4,-1\;aze. %0,%3"
4161: [(set_attr "type" "compare")])
4162:
4163: (define_insn ""
4164: [(set (match_operand:SI 0 "gen_reg_operand" "=r")
4165: (neg:SI (gt:SI (match_operand:SI 1 "gen_reg_operand" "r")
4166: (const_int 0))))]
4167: ""
4168: "sfi %0,%1,0\;ame %0,%0\;srai %0,%0,31")
4169:
4170: (define_insn ""
4171: [(set (match_operand:SI 0 "gen_reg_operand" "=r")
4172: (neg:SI (gt:SI (match_operand:SI 1 "gen_reg_operand" "r")
4173: (match_operand:SI 2 "reg_or_short_operand" "r"))))]
4174: ""
4175: "doz %0,%2,%1\;nabs %0,%0\;srai %0,%0,31")
4176:
4177: (define_insn ""
4178: [(set (match_operand:SI 0 "gen_reg_operand" "=r")
4179: (gtu:SI (match_operand:SI 1 "gen_reg_operand" "r")
4180: (match_operand:SI 2 "reg_or_short_operand" "rI")))]
4181: ""
4182: "sf%I2 %0,%1,%2\;sfe %0,%0,%0\;neg %0,%0")
4183:
4184: (define_insn ""
4185: [(set (match_operand:CC 3 "cc_reg_operand" "=x")
4186: (compare:CC
4187: (gtu:SI (match_operand:SI 1 "gen_reg_operand" "r")
4188: (match_operand:SI 2 "reg_or_short_operand" "rI"))
4189: (const_int 0)))
4190: (set (match_operand:SI 0 "gen_reg_operand" "=r")
4191: (gtu:SI (match_dup 1) (match_dup 2)))]
4192: ""
4193: "sf%I2 %0,%1,%2\;sfe %0,%0,%0\;neg. %0,%0"
4194: [(set_attr "type" "compare")])
4195:
4196: (define_insn ""
4197: [(set (match_operand:SI 0 "gen_reg_operand" "=r,r")
4198: (plus:SI (gtu:SI (match_operand:SI 1 "gen_reg_operand" "r,r")
4199: (match_operand:SI 2 "reg_or_short_operand" "rI,rI"))
4200: (match_operand:SI 3 "reg_or_short_operand" "r,I")))
4201: (clobber (match_scratch:SI 4 "=&r,&r"))]
4202: ""
4203: "sf%I2 %4,%1,%2\;sfe %4,%4,%4\;sf%I3 %0,%4,%3")
4204:
4205: (define_insn ""
4206: [(set (match_operand:CC 0 "cc_reg_operand" "=x,x")
4207: (compare:CC
4208: (plus:SI (gtu:SI (match_operand:SI 1 "gen_reg_operand" "r,r")
4209: (match_operand:SI 2 "reg_or_short_operand" "rI,rI"))
4210: (match_operand:SI 3 "reg_or_short_operand" "r,I"))
4211: (const_int 0)))
4212: (clobber (match_scratch:SI 4 "=&r,&r"))]
4213: ""
4214: "sf%I2 %4,%1,%2\;sfe %4,%4,%4\;sf%I3. %4,%4,%3"
4215: [(set_attr "type" "compare")])
4216:
4217: (define_insn ""
4218: [(set (match_operand:CC 5 "cc_reg_operand" "=x,x")
4219: (compare:CC
4220: (plus:SI (gtu:SI (match_operand:SI 1 "gen_reg_operand" "r,r")
4221: (match_operand:SI 2 "reg_or_short_operand" "rI,rI"))
4222: (match_operand:SI 3 "reg_or_short_operand" "r,I"))
4223: (const_int 0)))
4224: (set (match_operand:SI 0 "gen_reg_operand" "=r,r")
4225: (plus:SI (gtu:SI (match_dup 1) (match_dup 2)) (match_dup 3)))
4226: (clobber (match_scratch:SI 4 "=&r,&r"))]
4227: ""
4228: "sf%I2 %4,%1,%2\;sfe %4,%4,%4\;sf%I3. %0,%4,%3"
4229: [(set_attr "type" "compare")])
4230:
4231: (define_insn ""
4232: [(set (match_operand:SI 0 "gen_reg_operand" "=r")
4233: (neg:SI (gtu:SI (match_operand:SI 1 "gen_reg_operand" "r")
4234: (match_operand:SI 2 "reg_or_short_operand" "rI"))))]
4235: ""
4236: "sf%I2 %0,%1,%2\;sfe %0,%0,%0")
4237:
4238: ;; Define both directions of branch and return. If we need a reload
4239: ;; register, we'd rather use CR0 since it is much easier to copy a
4240: ;; register CC value to there.
4241:
4242: (define_insn ""
4243: [(set (pc)
4244: (if_then_else (match_operator 1 "branch_comparison_operator"
4245: [(match_operand 2
4246: "cc_reg_operand" "x,?y")
4247: (const_int 0)])
4248: (label_ref (match_operand 0 "" ""))
4249: (pc)))]
4250: ""
4251: "%C1bc %t1,%j1,%0")
4252:
4253: (define_insn ""
4254: [(set (pc)
4255: (if_then_else (match_operator 0 "branch_comparison_operator"
4256: [(match_operand 1
4257: "cc_reg_operand" "x,?y")
4258: (const_int 0)])
4259: (return)
4260: (pc)))]
4261: "direct_return ()"
4262: "%C0bcr %t0,%j0")
4263:
4264: (define_insn ""
4265: [(set (pc)
4266: (if_then_else (match_operator 1 "branch_comparison_operator"
4267: [(match_operand 2
4268: "cc_reg_operand" "x,?y")
4269: (const_int 0)])
4270: (pc)
4271: (label_ref (match_operand 0 "" ""))))]
4272: ""
4273: "%C1bc %T1,%j1,%0")
4274:
4275: (define_insn ""
4276: [(set (pc)
4277: (if_then_else (match_operator 0 "branch_comparison_operator"
4278: [(match_operand 1
4279: "cc_reg_operand" "x,?y")
4280: (const_int 0)])
4281: (pc)
4282: (return)))]
4283: "direct_return ()"
4284: "%C0bcr %T0,%j0")
4285:
4286: ;; Unconditional branch and return.
4287:
4288: (define_insn "jump"
4289: [(set (pc)
4290: (label_ref (match_operand 0 "" "")))]
4291: ""
4292: "b %l0")
4293:
4294: (define_insn "return"
4295: [(return)]
4296: "direct_return ()"
4297: "br")
4298:
4299: (define_insn "indirect_jump"
4300: [(set (pc) (match_operand:SI 0 "register_operand" "c,l"))]
4301: ""
4302: "@
4303: bctr
4304: br")
4305:
4306: ;; Table jump for switch statements:
4307: (define_expand "tablejump"
4308: [(set (match_dup 3)
4309: (plus:SI (match_operand:SI 0 "" "")
4310: (match_dup 2)))
4311: (parallel [(set (pc) (match_dup 3))
4312: (use (label_ref (match_operand 1 "" "")))])]
4313: ""
4314: "
4315: { operands[0] = force_reg (SImode, operands[0]);
4316: operands[2] = force_reg (SImode, gen_rtx (LABEL_REF, VOIDmode, operands[1]));
4317: operands[3] = gen_reg_rtx (SImode);
4318: }")
4319:
4320: (define_insn ""
4321: [(set (pc)
4322: (match_operand:SI 0 "register_operand" "c,r"))
4323: (use (label_ref (match_operand 1 "" "")))]
4324: ""
4325: "@
4326: bctr
4327: br")
4328:
4329: (define_insn "nop"
4330: [(const_int 0)]
4331: ""
4332: "cror 0,0,0")
4333:
4334: ;; Define the subtract-one-and-jump insns.
4335: ;; We need to be able to do this for any operand, including MEM, or we
4336: ;; will cause reload to blow up since we don't allow output reloads on
4337: ;; JUMP_INSNs.
4338: (define_insn ""
4339: [(set (pc)
4340: (if_then_else (ne (match_operand:SI 1 "register_operand" "0,*r,*r")
4341: (const_int 1))
4342: (label_ref (match_operand 2 "" ""))
4343: (pc)))
4344: (set (match_operand:SI 0 "register_operand" "=c,*r,m*q*c*l")
4345: (plus:SI (match_dup 1) (const_int -1)))
4346: (clobber (match_scratch:CC 3 "=X,&x,&x"))
4347: (clobber (match_scratch:SI 4 "=X,X,r"))]
4348: ""
4349: "@
4350: bdn %l2
4351: #
4352: #")
4353:
4354: ;; Similar, but we can use GE since we have a REG_NOTES.
4355: (define_insn ""
4356: [(set (pc)
4357: (if_then_else (ge (match_operand:SI 1 "register_operand" "0,*r,*r")
4358: (const_int 0))
4359: (label_ref (match_operand 2 "" ""))
4360: (pc)))
4361: (set (match_operand:SI 0 "register_operand" "=c,*r,m*q*c*l")
4362: (plus:SI (match_dup 1) (const_int -1)))
4363: (clobber (match_scratch:CC 3 "=X,&x,&X"))
4364: (clobber (match_scratch:SI 4 "=X,X,r"))]
4365: "find_reg_note (insn, REG_NONNEG, 0)"
4366: "@
4367: bdn %l2
4368: #
4369: #")
4370:
4371: (define_insn ""
4372: [(set (pc)
4373: (if_then_else (eq (match_operand:SI 1 "register_operand" "0,*r,*r")
4374: (const_int 1))
4375: (label_ref (match_operand 2 "" ""))
4376: (pc)))
4377: (set (match_operand:SI 0 "register_operand" "=c,*r,m*q*c*l")
4378: (plus:SI (match_dup 1) (const_int -1)))
4379: (clobber (match_scratch:CC 3 "=X,&x,&x"))
4380: (clobber (match_scratch:SI 4 "=X,X,r"))]
4381: ""
4382: "@
4383: bdz %l2
4384: #
4385: #")
4386:
4387: (define_split
4388: [(set (pc)
4389: (if_then_else (match_operator 2 "comparison_operator"
4390: [(match_operand:SI 1 "gen_reg_operand" "")
4391: (const_int 1)])
4392: (match_operand 5 "" "")
4393: (match_operand 6 "" "")))
4394: (set (match_operand:SI 0 "gen_reg_operand" "")
4395: (plus:SI (match_dup 1) (const_int -1)))
4396: (clobber (match_scratch:CC 3 ""))
4397: (clobber (match_scratch:SI 4 ""))]
4398: "reload_completed"
4399: [(parallel [(set (match_dup 3)
4400: (compare:CC (plus:SI (match_dup 1) (const_int -1))
4401: (const_int 0)))
4402: (set (match_dup 0) (plus:SI (match_dup 1) (const_int -1)))])
4403: (set (pc) (if_then_else (match_dup 7) (match_dup 5) (match_dup 6)))]
4404: "
4405: { operands[7] = gen_rtx (GET_CODE (operands[2]), VOIDmode, operands[3],
4406: const0_rtx); }")
4407:
4408: (define_split
4409: [(set (pc)
4410: (if_then_else (match_operator 2 "comparison_operator"
4411: [(match_operand:SI 1 "gen_reg_operand" "")
4412: (const_int 1)])
4413: (match_operand 5 "" "")
4414: (match_operand 6 "" "")))
4415: (set (match_operand:SI 0 "general_operand" "")
4416: (plus:SI (match_dup 1) (const_int -1)))
4417: (clobber (match_scratch:CC 3 ""))
4418: (clobber (match_scratch:SI 4 ""))]
4419: "reload_completed && ! gen_reg_operand (operands[0], SImode)"
4420: [(parallel [(set (match_dup 3)
4421: (compare:CC (plus:SI (match_dup 1) (const_int -1))
4422: (const_int 0)))
4423: (set (match_dup 4) (plus:SI (match_dup 1) (const_int -1)))])
4424: (set (match_dup 0) (match_dup 4))
4425: (set (pc) (if_then_else (match_dup 7) (match_dup 5) (match_dup 6)))]
4426: "
4427: { operands[7] = gen_rtx (GET_CODE (operands[2]), VOIDmode, operands[3],
4428: const0_rtx); }")
4429:
4430: ;;- Local variables:
4431: ;;- mode:emacs-lisp
4432: ;;- comment-start: ";;- "
4433: ;;- eval: (set-syntax-table (copy-sequence (syntax-table)))
4434: ;;- eval: (modify-syntax-entry ?[ "(]")
4435: ;;- eval: (modify-syntax-entry ?] ")[")
4436: ;;- eval: (modify-syntax-entry ?{ "(}")
4437: ;;- eval: (modify-syntax-entry ?} "){")
4438: ;;- End:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.