|
|
1.1 root 1:
2: ;;- Machine description for GNU compiler
3: ;;- Vax Version
4: ;; Copyright (C) 1987, 1988 Free Software Foundation, Inc.
5:
6: ;; This file is part of GNU CC.
7:
8: ;; GNU CC is free software; you can redistribute it and/or modify
9: ;; it under the terms of the GNU General Public License as published by
10: ;; the Free Software Foundation; either version 1, or (at your option)
11: ;; any later version.
12:
13: ;; GNU CC is distributed in the hope that it will be useful,
14: ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
15: ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16: ;; GNU General Public License for more details.
17:
18: ;; You should have received a copy of the GNU General Public License
19: ;; along with GNU CC; see the file COPYING. If not, write to
20: ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
21:
22:
23: ;;- Instruction patterns. When multiple patterns apply,
24: ;;- the first one in the file is chosen.
25: ;;-
26: ;;- See file "rtl.def" for documentation on define_insn, match_*, et. al.
27: ;;-
28: ;;- cpp macro #define NOTICE_UPDATE_CC in file tm.h handles condition code
29: ;;- updates for most instructions.
30:
31: ; tstsi is first test insn so that it is the one to match
32: ; a constant argument.
33:
34: (define_insn "tstsi"
35: [(set (cc0)
36: (match_operand:SI 0 "general_operand" "g"))]
37: ""
38: "tstl %0")
39:
40: (define_insn "tsthi"
41: [(set (cc0)
42: (match_operand:HI 0 "general_operand" "g"))]
43: ""
44: "tstw %0")
45:
46: (define_insn "tstqi"
47: [(set (cc0)
48: (match_operand:QI 0 "general_operand" "g"))]
49: ""
50: "tstb %0")
51:
52: (define_insn "tstdf"
53: [(set (cc0)
54: (match_operand:DF 0 "general_operand" "gF"))]
55: ""
56: "tst%# %0")
57:
58: (define_insn "tstsf"
59: [(set (cc0)
60: (match_operand:SF 0 "general_operand" "gF"))]
61: ""
62: "tstf %0")
63:
64: ;; Put cmpsi first among compare insns so it matches two CONST_INT operands.
65:
66: (define_insn "cmpsi"
67: [(set (cc0)
68: (compare (match_operand:SI 0 "general_operand" "g")
69: (match_operand:SI 1 "general_operand" "g")))]
70: ""
71: "cmpl %0,%1")
72:
73: (define_insn "cmphi"
74: [(set (cc0)
75: (compare (match_operand:HI 0 "general_operand" "g")
76: (match_operand:HI 1 "general_operand" "g")))]
77: ""
78: "cmpw %0,%1")
79:
80: (define_insn "cmpqi"
81: [(set (cc0)
82: (compare (match_operand:QI 0 "general_operand" "g")
83: (match_operand:QI 1 "general_operand" "g")))]
84: ""
85: "cmpb %0,%1")
86:
87: (define_insn "cmpdf"
88: [(set (cc0)
89: (compare (match_operand:DF 0 "general_operand" "gF")
90: (match_operand:DF 1 "general_operand" "gF")))]
91: ""
92: "cmp%# %0,%1")
93:
94: (define_insn "cmpsf"
95: [(set (cc0)
96: (compare (match_operand:SF 0 "general_operand" "gF")
97: (match_operand:SF 1 "general_operand" "gF")))]
98: ""
99: "cmpf %0,%1")
100:
101: (define_insn ""
102: [(set (cc0)
103: (and:SI (match_operand:SI 0 "general_operand" "g")
104: (match_operand:SI 1 "general_operand" "g")))]
105: ""
106: "bitl %0,%1")
107:
108: (define_insn ""
109: [(set (cc0)
110: (and:HI (match_operand:HI 0 "general_operand" "g")
111: (match_operand:HI 1 "general_operand" "g")))]
112: ""
113: "bitw %0,%1")
114:
115: (define_insn ""
116: [(set (cc0)
117: (and:QI (match_operand:QI 0 "general_operand" "g")
118: (match_operand:QI 1 "general_operand" "g")))]
119: ""
120: "bitb %0,%1")
121:
122: (define_insn "movdf"
123: [(set (match_operand:DF 0 "general_operand" "=g")
124: (match_operand:DF 1 "general_operand" "gF"))]
125: ""
126: "*
127: {
128: if (operands[1] == dconst0_rtx)
129: return \"clr%# %0\";
130: return \"mov%# %1,%0\";
131: }")
132:
133: (define_insn "movsf"
134: [(set (match_operand:SF 0 "general_operand" "=g")
135: (match_operand:SF 1 "general_operand" "gF"))]
136: ""
137: "*
138: {
139: if (operands[1] == fconst0_rtx)
140: return \"clrf %0\";
141: return \"movf %1,%0\";
142: }")
143:
144: ;; Some vaxes don't support this instruction.
145: ;;(define_insn "movti"
146: ;; [(set (match_operand:TI 0 "general_operand" "=g")
147: ;; (match_operand:TI 1 "general_operand" "g"))]
148: ;; ""
149: ;; "movh %1,%0")
150:
151: (define_insn "movdi"
152: [(set (match_operand:DI 0 "general_operand" "=g")
153: (match_operand:DI 1 "general_operand" "g"))]
154: ""
155: "movq %1,%0")
156:
1.1.1.3 ! root 157: ;; This handles constants which are not legitimate
! 158: ;; for the sake of shared libraries on VMS.
! 159: (define_insn ""
! 160: [(set (match_operand:SI 0 "general_operand" "=g")
! 161: (match_operand:SI 1 "" "i"))]
! 162: "CONSTANT_P (operands[1]) && ! LEGITIMATE_CONSTANT_P (operands[1])"
! 163: "*
! 164: {
! 165: operands[2] = XEXP (XEXP (operands[1], 0), 0);
! 166: operands[1] = XEXP (XEXP (operands[1], 0), 1);
! 167: return \"movl %2,%0\;addl2 %1,%0\";
! 168: }")
! 169:
1.1 root 170: (define_insn "movsi"
171: [(set (match_operand:SI 0 "general_operand" "=g")
1.1.1.3 ! root 172: (match_operand:SI 1 "supergeneral_operand" "g"))]
1.1 root 173: ""
174: "*
175: {
176: rtx link;
177: if (operands[1] == const1_rtx
178: && (link = find_reg_note (insn, REG_WAS_0, 0))
179: /* Make sure the insn that stored the 0 is still present. */
180: && ! XEXP (link, 0)->volatil
181: && GET_CODE (XEXP (link, 0)) != NOTE
182: /* Make sure cross jumping didn't happen here. */
183: && no_labels_between_p (XEXP (link, 0), insn))
184: /* Fastest way to change a 0 to a 1. */
185: return \"incl %0\";
186: if (GET_CODE (operands[1]) == SYMBOL_REF || GET_CODE (operands[1]) == CONST)
187: {
188: if (push_operand (operands[0], SImode))
189: return \"pushab %a1\";
190: return \"movab %a1,%0\";
191: }
192: /* this is slower than a movl, except when pushing an operand */
193: if (operands[1] == const0_rtx)
194: return \"clrl %0\";
195: if (GET_CODE (operands[1]) == CONST_INT
196: && (unsigned) INTVAL (operands[1]) >= 64)
197: {
198: int i = INTVAL (operands[1]);
199: if ((unsigned)(~i) < 64)
200: {
201: operands[1] = gen_rtx (CONST_INT, VOIDmode, ~i);
202: return \"mcoml %1,%0\";
203: }
204: if ((unsigned)i < 127)
205: {
206: operands[1] = gen_rtx (CONST_INT, VOIDmode, 63);
207: operands[2] = gen_rtx (CONST_INT, VOIDmode, i-63);
208: return \"addl3 %2,%1,%0\";
209: }
210: /* trading speed for space */
211: if ((unsigned)i < 0x100)
212: return \"movzbl %1,%0\";
213: if (i >= -0x80 && i < 0)
214: return \"cvtbl %1,%0\";
215: if ((unsigned)i < 0x10000)
216: return \"movzwl %1,%0\";
217: if (i >= -0x8000 && i < 0)
218: return \"cvtwl %1,%0\";
219: }
220: if (push_operand (operands[0], SImode))
221: return \"pushl %1\";
222: return \"movl %1,%0\";
223: }")
224:
225: (define_insn "movhi"
226: [(set (match_operand:HI 0 "general_operand" "=g")
227: (match_operand:HI 1 "general_operand" "g"))]
228: ""
229: "*
230: {
231: rtx link;
232: if (operands[1] == const1_rtx
233: && (link = find_reg_note (insn, REG_WAS_0, 0))
234: /* Make sure the insn that stored the 0 is still present. */
235: && ! XEXP (link, 0)->volatil
236: && GET_CODE (XEXP (link, 0)) != NOTE
237: /* Make sure cross jumping didn't happen here. */
238: && no_labels_between_p (XEXP (link, 0), insn))
239: /* Fastest way to change a 0 to a 1. */
240: return \"incw %0\";
241: if (operands[1] == const0_rtx)
242: return \"clrw %0\";
243: if (GET_CODE (operands[1]) == CONST_INT
244: && (unsigned) INTVAL (operands[1]) >= 64)
245: {
246: int i = INTVAL (operands[1]);
247: if ((unsigned)((~i) & 0xffff) < 64)
248: {
249: operands[1] = gen_rtx (CONST_INT, VOIDmode, (~i) & 0xffff);
250: return \"mcomw %1,%0\";
251: }
252: if ((unsigned)(i & 0xffff) < 127)
253: {
254: operands[1] = gen_rtx (CONST_INT, VOIDmode, 63);
255: operands[2] = gen_rtx (CONST_INT, VOIDmode, (i-63) & 0xffff);
256: return \"addw3 %2,%1,%0\";
257: }
258: /* this is a lot slower, and only saves 1 measly byte! */
259: /* if ((unsigned)i < 0x100)
260: return \"movzbw %1,%0\"; */
261: /* if (i >= -0x80 && i < 0)
262: return \"cvtbw %1,%0\"; */
263: }
264: return \"movw %1,%0\";
265: }")
266:
267: (define_insn "movqi"
268: [(set (match_operand:QI 0 "general_operand" "=g")
269: (match_operand:QI 1 "general_operand" "g"))]
270: ""
271: "*
272: {
273: if (operands[1] == const0_rtx)
274: return \"clrb %0\";
275: if (GET_CODE (operands[1]) == CONST_INT
276: && (unsigned) INTVAL (operands[1]) >= 64)
277: {
278: int i = INTVAL (operands[1]);
279: if ((unsigned)((~i) & 0xff) < 64)
280: {
281: operands[1] = gen_rtx (CONST_INT, VOIDmode, (~i) & 0xff);
282: return \"mcomb %1,%0\";
283: }
284: #if 0
285: /* ASCII alphabetics */
286: if (((unsigned) INTVAL (operands[1]) &0xff) < 127)
287: {
288: operands[1] = gen_rtx (CONST_INT, VOIDmode, 63);
289: operands[2] = gen_rtx (CONST_INT, VOIDmode, i-63);
290: return \"addb3 %2,%1,%0\";
291: }
292: #endif
293: }
294: return \"movb %1,%0\";
295: }")
296:
297: ;; The definition of this insn does not really explain what it does,
298: ;; but it should suffice
299: ;; that anything generated as this insn will be recognized as one
300: ;; and that it won't successfully combine with anything.
301: (define_insn "movstrhi"
302: [(set (match_operand:BLK 0 "general_operand" "=g")
303: (match_operand:BLK 1 "general_operand" "g"))
304: (use (match_operand:HI 2 "general_operand" "g"))
305: (clobber (reg:SI 0))
306: (clobber (reg:SI 1))
307: (clobber (reg:SI 2))
308: (clobber (reg:SI 3))
309: (clobber (reg:SI 4))
310: (clobber (reg:SI 5))]
311: ""
312: "movc3 %2,%1,%0")
313:
314: ;; Extension and truncation insns.
315: ;; Those for integer source operand
316: ;; are ordered widest source type first.
317:
318: (define_insn "truncsiqi2"
319: [(set (match_operand:QI 0 "general_operand" "=g")
320: (truncate:QI (match_operand:SI 1 "general_operand" "g")))]
321: ""
322: "cvtlb %1,%0")
323:
324: (define_insn "truncsihi2"
325: [(set (match_operand:HI 0 "general_operand" "=g")
326: (truncate:HI (match_operand:SI 1 "general_operand" "g")))]
327: ""
328: "cvtlw %1,%0")
329:
330: (define_insn "trunchiqi2"
331: [(set (match_operand:QI 0 "general_operand" "=g")
332: (truncate:QI (match_operand:HI 1 "general_operand" "g")))]
333: ""
334: "cvtwb %1,%0")
335:
336: (define_insn "extendhisi2"
337: [(set (match_operand:SI 0 "general_operand" "=g")
338: (sign_extend:SI (match_operand:HI 1 "general_operand" "g")))]
339: ""
340: "cvtwl %1,%0")
341:
342: (define_insn "extendqihi2"
343: [(set (match_operand:HI 0 "general_operand" "=g")
344: (sign_extend:HI (match_operand:QI 1 "general_operand" "g")))]
345: ""
346: "cvtbw %1,%0")
347:
348: (define_insn "extendqisi2"
349: [(set (match_operand:SI 0 "general_operand" "=g")
350: (sign_extend:SI (match_operand:QI 1 "general_operand" "g")))]
351: ""
352: "cvtbl %1,%0")
353:
354: (define_insn "extendsfdf2"
355: [(set (match_operand:DF 0 "general_operand" "=g")
356: (float_extend:DF (match_operand:SF 1 "general_operand" "gF")))]
357: ""
358: "cvtf%# %1,%0")
359:
360: (define_insn "truncdfsf2"
361: [(set (match_operand:SF 0 "general_operand" "=g")
362: (float_truncate:SF (match_operand:DF 1 "general_operand" "gF")))]
363: ""
364: "cvt%#f %1,%0")
365:
366: (define_insn "zero_extendhisi2"
367: [(set (match_operand:SI 0 "general_operand" "=g")
368: (zero_extend:SI (match_operand:HI 1 "general_operand" "g")))]
369: ""
370: "movzwl %1,%0")
371:
372: (define_insn "zero_extendqihi2"
373: [(set (match_operand:HI 0 "general_operand" "=g")
374: (zero_extend:HI (match_operand:QI 1 "general_operand" "g")))]
375: ""
376: "movzbw %1,%0")
377:
378: (define_insn "zero_extendqisi2"
379: [(set (match_operand:SI 0 "general_operand" "=g")
380: (zero_extend:SI (match_operand:QI 1 "general_operand" "g")))]
381: ""
382: "movzbl %1,%0")
383:
384: ;; Fix-to-float conversion insns.
385: ;; Note that the ones that start with SImode come first.
386: ;; That is so that an operand that is a CONST_INT
387: ;; (and therefore lacks a specific machine mode).
388: ;; will be recognized as SImode (which is always valid)
389: ;; rather than as QImode or HImode.
390:
391: (define_insn "floatsisf2"
392: [(set (match_operand:SF 0 "general_operand" "=g")
393: (float:SF (match_operand:SI 1 "general_operand" "g")))]
394: ""
395: "cvtlf %1,%0")
396:
397: (define_insn "floatsidf2"
398: [(set (match_operand:DF 0 "general_operand" "=g")
399: (float:DF (match_operand:SI 1 "general_operand" "g")))]
400: ""
401: "cvtl%# %1,%0")
402:
403: (define_insn "floathisf2"
404: [(set (match_operand:SF 0 "general_operand" "=g")
405: (float:SF (match_operand:HI 1 "general_operand" "g")))]
406: ""
407: "cvtwf %1,%0")
408:
409: (define_insn "floathidf2"
410: [(set (match_operand:DF 0 "general_operand" "=g")
411: (float:DF (match_operand:HI 1 "general_operand" "g")))]
412: ""
413: "cvtw%# %1,%0")
414:
415: (define_insn "floatqisf2"
416: [(set (match_operand:SF 0 "general_operand" "=g")
417: (float:SF (match_operand:QI 1 "general_operand" "g")))]
418: ""
419: "cvtbf %1,%0")
420:
421: (define_insn "floatqidf2"
422: [(set (match_operand:DF 0 "general_operand" "=g")
423: (float:DF (match_operand:QI 1 "general_operand" "g")))]
424: ""
425: "cvtb%# %1,%0")
426:
427: ;; Float-to-fix conversion insns.
428:
429: (define_insn "fix_truncsfqi2"
430: [(set (match_operand:QI 0 "general_operand" "=g")
431: (fix:QI (fix:SF (match_operand:SF 1 "general_operand" "gF"))))]
432: ""
433: "cvtfb %1,%0")
434:
435: (define_insn "fix_truncsfhi2"
436: [(set (match_operand:HI 0 "general_operand" "=g")
437: (fix:HI (fix:SF (match_operand:SF 1 "general_operand" "gF"))))]
438: ""
439: "cvtfw %1,%0")
440:
441: (define_insn "fix_truncsfsi2"
442: [(set (match_operand:SI 0 "general_operand" "=g")
443: (fix:SI (fix:SF (match_operand:SF 1 "general_operand" "gF"))))]
444: ""
445: "cvtfl %1,%0")
446:
447: (define_insn "fix_truncdfqi2"
448: [(set (match_operand:QI 0 "general_operand" "=g")
449: (fix:QI (fix:DF (match_operand:DF 1 "general_operand" "gF"))))]
450: ""
451: "cvt%#b %1,%0")
452:
453: (define_insn "fix_truncdfhi2"
454: [(set (match_operand:HI 0 "general_operand" "=g")
455: (fix:HI (fix:DF (match_operand:DF 1 "general_operand" "gF"))))]
456: ""
457: "cvt%#w %1,%0")
458:
459: (define_insn "fix_truncdfsi2"
460: [(set (match_operand:SI 0 "general_operand" "=g")
461: (fix:SI (fix:DF (match_operand:DF 1 "general_operand" "gF"))))]
462: ""
463: "cvt%#l %1,%0")
464:
465: ;;- All kinds of add instructions.
466:
467: (define_insn "adddf3"
468: [(set (match_operand:DF 0 "general_operand" "=g")
469: (plus:DF (match_operand:DF 1 "general_operand" "gF")
470: (match_operand:DF 2 "general_operand" "gF")))]
471: ""
472: "*
473: {
474: if (rtx_equal_p (operands[0], operands[1]))
475: return \"add%#2 %2,%0\";
476: if (rtx_equal_p (operands[0], operands[2]))
477: return \"add%#2 %1,%0\";
478: return \"add%#3 %1,%2,%0\";
479: }")
480:
481: (define_insn "addsf3"
482: [(set (match_operand:SF 0 "general_operand" "=g")
483: (plus:SF (match_operand:SF 1 "general_operand" "gF")
484: (match_operand:SF 2 "general_operand" "gF")))]
485: ""
486: "*
487: {
488: if (rtx_equal_p (operands[0], operands[1]))
489: return \"addf2 %2,%0\";
490: if (rtx_equal_p (operands[0], operands[2]))
491: return \"addf2 %1,%0\";
492: return \"addf3 %1,%2,%0\";
493: }")
494:
495: (define_insn "addsi3"
496: [(set (match_operand:SI 0 "general_operand" "=g")
497: (plus:SI (match_operand:SI 1 "general_operand" "g")
498: (match_operand:SI 2 "general_operand" "g")))]
499: ""
500: "*
501: {
502: if (rtx_equal_p (operands[0], operands[1]))
503: {
504: if (operands[2] == const1_rtx)
505: return \"incl %0\";
506: if (GET_CODE (operands[2]) == CONST_INT
507: && INTVAL (operands[2]) == -1)
508: return \"decl %0\";
509: if (GET_CODE (operands[2]) == CONST_INT
510: && (unsigned) (- INTVAL (operands[2])) < 64)
511: return \"subl2 $%n2,%0\";
512: if (GET_CODE (operands[2]) == CONST_INT
513: && (unsigned) INTVAL (operands[2]) >= 64
514: && GET_CODE (operands[1]) == REG)
515: return \"movab %c2(%1),%0\";
516: return \"addl2 %2,%0\";
517: }
518: if (rtx_equal_p (operands[0], operands[2]))
519: return \"addl2 %1,%0\";
520: if (GET_CODE (operands[2]) == CONST_INT
521: && (unsigned) (- INTVAL (operands[2])) < 64)
522: return \"subl3 $%n2,%1,%0\";
523: if (GET_CODE (operands[2]) == CONST_INT
524: && (unsigned) INTVAL (operands[2]) >= 64
525: && GET_CODE (operands[1]) == REG)
526: {
527: if (push_operand (operands[0], SImode))
528: return \"pushab %c2(%1)\";
529: return \"movab %c2(%1),%0\";
530: }
531: return \"addl3 %1,%2,%0\";
532: }")
533:
534: (define_insn "addhi3"
535: [(set (match_operand:HI 0 "general_operand" "=g")
536: (plus:HI (match_operand:HI 1 "general_operand" "g")
537: (match_operand:HI 2 "general_operand" "g")))]
538: ""
539: "*
540: {
541: if (rtx_equal_p (operands[0], operands[1]))
542: {
543: if (operands[2] == const1_rtx)
544: return \"incw %0\";
545: if (GET_CODE (operands[1]) == CONST_INT
546: && INTVAL (operands[1]) == -1)
547: return \"decw %0\";
548: if (GET_CODE (operands[2]) == CONST_INT
549: && (unsigned) (- INTVAL (operands[2])) < 64)
550: return \"subw2 $%n2,%0\";
551: return \"addw2 %2,%0\";
552: }
553: if (rtx_equal_p (operands[0], operands[2]))
554: return \"addw2 %1,%0\";
555: if (GET_CODE (operands[2]) == CONST_INT
556: && (unsigned) (- INTVAL (operands[2])) < 64)
557: return \"subw3 $%n2,%1,%0\";
558: return \"addw3 %1,%2,%0\";
559: }")
560:
561: (define_insn "addqi3"
562: [(set (match_operand:QI 0 "general_operand" "=g")
563: (plus:QI (match_operand:QI 1 "general_operand" "g")
564: (match_operand:QI 2 "general_operand" "g")))]
565: ""
566: "*
567: {
568: if (rtx_equal_p (operands[0], operands[1]))
569: {
570: if (operands[2] == const1_rtx)
571: return \"incb %0\";
572: if (GET_CODE (operands[1]) == CONST_INT
573: && INTVAL (operands[1]) == -1)
574: return \"decb %0\";
575: if (GET_CODE (operands[2]) == CONST_INT
576: && (unsigned) (- INTVAL (operands[2])) < 64)
577: return \"subb2 $%n2,%0\";
578: return \"addb2 %2,%0\";
579: }
580: if (rtx_equal_p (operands[0], operands[2]))
581: return \"addb2 %1,%0\";
582: if (GET_CODE (operands[2]) == CONST_INT
583: && (unsigned) (- INTVAL (operands[2])) < 64)
584: return \"subb3 $%n2,%1,%0\";
585: return \"addb3 %1,%2,%0\";
586: }")
587:
588: ;;- All kinds of subtract instructions.
589:
590: (define_insn "subdf3"
591: [(set (match_operand:DF 0 "general_operand" "=g")
592: (minus:DF (match_operand:DF 1 "general_operand" "gF")
593: (match_operand:DF 2 "general_operand" "gF")))]
594: ""
595: "*
596: {
597: if (rtx_equal_p (operands[0], operands[1]))
598: return \"sub%#2 %2,%0\";
599: return \"sub%#3 %2,%1,%0\";
600: }")
601:
602: (define_insn "subsf3"
603: [(set (match_operand:SF 0 "general_operand" "=g")
604: (minus:SF (match_operand:SF 1 "general_operand" "gF")
605: (match_operand:SF 2 "general_operand" "gF")))]
606: ""
607: "*
608: {
609: if (rtx_equal_p (operands[0], operands[1]))
610: return \"subf2 %2,%0\";
611: return \"subf3 %2,%1,%0\";
612: }")
613:
614: (define_insn "subsi3"
615: [(set (match_operand:SI 0 "general_operand" "=g")
616: (minus:SI (match_operand:SI 1 "general_operand" "g")
617: (match_operand:SI 2 "general_operand" "g")))]
618: ""
619: "*
620: {
621: if (rtx_equal_p (operands[0], operands[1]))
622: {
623: if (operands[2] == const1_rtx)
624: return \"decl %0\";
625: return \"subl2 %2,%0\";
626: }
627: return \"subl3 %2,%1,%0\";
628: }")
629:
630: (define_insn "subhi3"
631: [(set (match_operand:HI 0 "general_operand" "=g")
632: (minus:HI (match_operand:HI 1 "general_operand" "g")
633: (match_operand:HI 2 "general_operand" "g")))]
634: ""
635: "*
636: {
637: if (rtx_equal_p (operands[0], operands[1]))
638: {
639: if (operands[2] == const1_rtx)
640: return \"decw %0\";
641: return \"subw2 %2,%0\";
642: }
643: return \"subw3 %2,%1,%0\";
644: }")
645:
646: (define_insn "subqi3"
647: [(set (match_operand:QI 0 "general_operand" "=g")
648: (minus:QI (match_operand:QI 1 "general_operand" "g")
649: (match_operand:QI 2 "general_operand" "g")))]
650: ""
651: "*
652: {
653: if (rtx_equal_p (operands[0], operands[1]))
654: {
655: if (operands[2] == const1_rtx)
656: return \"decb %0\";
657: return \"subb2 %2,%0\";
658: }
659: return \"subb3 %2,%1,%0\";
660: }")
661:
662: ;;- Multiply instructions.
663:
664: (define_insn "muldf3"
665: [(set (match_operand:DF 0 "general_operand" "=g")
666: (mult:DF (match_operand:DF 1 "general_operand" "gF")
667: (match_operand:DF 2 "general_operand" "gF")))]
668: ""
669: "*
670: {
671: if (rtx_equal_p (operands[0], operands[1]))
672: return \"mul%#2 %2,%0\";
673: if (rtx_equal_p (operands[0], operands[2]))
674: return \"mul%#2 %1,%0\";
675: return \"mul%#3 %1,%2,%0\";
676: }")
677:
678: (define_insn "mulsf3"
679: [(set (match_operand:SF 0 "general_operand" "=g")
680: (mult:SF (match_operand:SF 1 "general_operand" "gF")
681: (match_operand:SF 2 "general_operand" "gF")))]
682: ""
683: "*
684: {
685: if (rtx_equal_p (operands[0], operands[1]))
686: return \"mulf2 %2,%0\";
687: if (rtx_equal_p (operands[0], operands[2]))
688: return \"mulf2 %1,%0\";
689: return \"mulf3 %1,%2,%0\";
690: }")
691:
692: (define_insn "mulsi3"
693: [(set (match_operand:SI 0 "general_operand" "=g")
694: (mult:SI (match_operand:SI 1 "general_operand" "g")
695: (match_operand:SI 2 "general_operand" "g")))]
696: ""
697: "*
698: {
699: if (rtx_equal_p (operands[0], operands[1]))
700: return \"mull2 %2,%0\";
701: if (rtx_equal_p (operands[0], operands[2]))
702: return \"mull2 %1,%0\";
703: return \"mull3 %1,%2,%0\";
704: }")
705:
706: (define_insn "mulhi3"
707: [(set (match_operand:HI 0 "general_operand" "=g")
708: (mult:HI (match_operand:HI 1 "general_operand" "g")
709: (match_operand:HI 2 "general_operand" "g")))]
710: ""
711: "*
712: {
713: if (rtx_equal_p (operands[0], operands[1]))
714: return \"mulw2 %2,%0\";
715: if (rtx_equal_p (operands[0], operands[2]))
716: return \"mulw2 %1,%0\";
717: return \"mulw3 %1,%2,%0\";
718: }")
719:
720: (define_insn "mulqi3"
721: [(set (match_operand:QI 0 "general_operand" "=g")
722: (mult:QI (match_operand:QI 1 "general_operand" "g")
723: (match_operand:QI 2 "general_operand" "g")))]
724: ""
725: "*
726: {
727: if (rtx_equal_p (operands[0], operands[1]))
728: return \"mulb2 %2,%0\";
729: if (rtx_equal_p (operands[0], operands[2]))
730: return \"mulb2 %1,%0\";
731: return \"mulb3 %1,%2,%0\";
732: }")
733:
734: ;;- Divide instructions.
735:
736: (define_insn "divdf3"
737: [(set (match_operand:DF 0 "general_operand" "=g")
738: (div:DF (match_operand:DF 1 "general_operand" "gF")
739: (match_operand:DF 2 "general_operand" "gF")))]
740: ""
741: "*
742: {
743: if (rtx_equal_p (operands[0], operands[1]))
744: return \"div%#2 %2,%0\";
745: return \"div%#3 %2,%1,%0\";
746: }")
747:
748: (define_insn "divsf3"
749: [(set (match_operand:SF 0 "general_operand" "=g")
750: (div:SF (match_operand:SF 1 "general_operand" "gF")
751: (match_operand:SF 2 "general_operand" "gF")))]
752: ""
753: "*
754: {
755: if (rtx_equal_p (operands[0], operands[1]))
756: return \"divf2 %2,%0\";
757: return \"divf3 %2,%1,%0\";
758: }")
759:
760: (define_insn "divsi3"
761: [(set (match_operand:SI 0 "general_operand" "=g")
762: (div:SI (match_operand:SI 1 "general_operand" "g")
763: (match_operand:SI 2 "general_operand" "g")))]
764: ""
765: "*
766: {
767: if (rtx_equal_p (operands[0], operands[1]))
768: return \"divl2 %2,%0\";
769: return \"divl3 %2,%1,%0\";
770: }")
771:
772: (define_insn "divhi3"
773: [(set (match_operand:HI 0 "general_operand" "=g")
774: (div:HI (match_operand:HI 1 "general_operand" "g")
775: (match_operand:HI 2 "general_operand" "g")))]
776: ""
777: "*
778: {
779: if (rtx_equal_p (operands[0], operands[1]))
780: return \"divw2 %2,%0\";
781: return \"divw3 %2,%1,%0\";
782: }")
783:
784: (define_insn "divqi3"
785: [(set (match_operand:QI 0 "general_operand" "=g")
786: (div:QI (match_operand:QI 1 "general_operand" "g")
787: (match_operand:QI 2 "general_operand" "g")))]
788: ""
789: "*
790: {
791: if (rtx_equal_p (operands[0], operands[1]))
792: return \"divb2 %2,%0\";
793: return \"divb3 %2,%1,%0\";
794: }")
795:
796: ;This is left out because it is very slow;
797: ;we are better off programming around the "lack" of this insn.
798: ;(define_insn "divmoddisi4"
799: ; [(set (match_operand:SI 0 "general_operand" "=g")
800: ; (div:SI (match_operand:DI 1 "general_operand" "g")
801: ; (match_operand:SI 2 "general_operand" "g")))
802: ; (set (match_operand:SI 3 "general_operand" "=g")
803: ; (mod:SI (match_operand:DI 1 "general_operand" "g")
804: ; (match_operand:SI 2 "general_operand" "g")))]
805: ; ""
806: ; "ediv %2,%1,%0,%3")
807:
808: ;; Bit-and on the vax is done with a clear-bits insn.
809: (define_expand "andsi3"
810: [(set (match_operand:SI 0 "general_operand" "=g")
811: (and:SI (match_operand:SI 1 "general_operand" "g")
812: (not:SI (match_operand:SI 2 "general_operand" "g"))))]
813: ""
814: "
815: {
816: extern rtx expand_unop ();
817: if (GET_CODE (operands[2]) == CONST_INT)
818: operands[2] = gen_rtx (CONST_INT, VOIDmode, ~INTVAL (operands[2]));
819: else
820: operands[2] = expand_unop (SImode, one_cmpl_optab, operands[2], 0, 1);
821: }")
822:
823: (define_expand "andhi3"
824: [(set (match_operand:HI 0 "general_operand" "=g")
825: (and:HI (match_operand:HI 1 "general_operand" "g")
826: (not:HI (match_operand:HI 2 "general_operand" "g"))))]
827: ""
828: "
829: {
830: extern rtx expand_unop ();
831: rtx op = operands[2];
832: if (GET_CODE (op) == CONST_INT)
833: operands[2] = gen_rtx (CONST_INT, VOIDmode,
834: ((1 << 16) - 1) & ~INTVAL (op));
835: else
836: operands[2] = expand_unop (HImode, one_cmpl_optab, op, 0, 1);
837: }")
838:
839: (define_expand "andqi3"
840: [(set (match_operand:QI 0 "general_operand" "=g")
841: (and:QI (match_operand:QI 1 "general_operand" "g")
842: (not:QI (match_operand:QI 2 "general_operand" "g"))))]
843: ""
844: "
845: {
846: extern rtx expand_unop ();
847: rtx op = operands[2];
848: if (GET_CODE (op) == CONST_INT)
849: operands[2] = gen_rtx (CONST_INT, VOIDmode,
850: ((1 << 8) - 1) & ~INTVAL (op));
851: else
852: operands[2] = expand_unop (QImode, one_cmpl_optab, op, 0, 1);
853: }")
854:
855: (define_insn "andcbsi3"
856: [(set (match_operand:SI 0 "general_operand" "=g")
857: (and:SI (match_operand:SI 1 "general_operand" "g")
858: (not:SI (match_operand:SI 2 "general_operand" "g"))))]
859: ""
860: "*
861: {
862: if (rtx_equal_p (operands[0], operands[1]))
863: return \"bicl2 %2,%0\";
864: return \"bicl3 %2,%1,%0\";
865: }")
866:
867: (define_insn "andcbhi3"
868: [(set (match_operand:HI 0 "general_operand" "=g")
869: (and:HI (match_operand:HI 1 "general_operand" "g")
870: (not:HI (match_operand:HI 2 "general_operand" "g"))))]
871: ""
872: "*
873: {
874: if (rtx_equal_p (operands[0], operands[1]))
875: return \"bicw2 %2,%0\";
876: return \"bicw3 %2,%1,%0\";
877: }")
878:
879: (define_insn "andcbqi3"
880: [(set (match_operand:QI 0 "general_operand" "=g")
881: (and:QI (match_operand:QI 1 "general_operand" "g")
882: (not:QI (match_operand:QI 2 "general_operand" "g"))))]
883: ""
884: "*
885: {
886: if (rtx_equal_p (operands[0], operands[1]))
887: return \"bicb2 %2,%0\";
888: return \"bicb3 %2,%1,%0\";
889: }")
890:
891: ;; The following are needed because constant propagation can
892: ;; create them starting from the bic insn patterns above.
893:
894: (define_insn ""
895: [(set (match_operand:SI 0 "general_operand" "=g")
896: (and:SI (match_operand:SI 1 "general_operand" "g")
897: (match_operand:SI 2 "general_operand" "g")))]
898: "GET_CODE (operands[2]) == CONST_INT"
899: "*
900: { operands[2] = gen_rtx (CONST_INT, VOIDmode, ~INTVAL (operands[2]));
901: if (rtx_equal_p (operands[1], operands[0]))
902: return \"bicl2 %2,%0\";
903: return \"bicl3 %2,%1,%0\";
904: }")
905:
906: (define_insn ""
907: [(set (match_operand:HI 0 "general_operand" "=g")
908: (and:HI (match_operand:HI 1 "general_operand" "g")
909: (match_operand:HI 2 "general_operand" "g")))]
910: "GET_CODE (operands[2]) == CONST_INT"
911: "*
912: { operands[2] = gen_rtx (CONST_INT, VOIDmode, 0xffff & ~INTVAL (operands[2]));
913: if (rtx_equal_p (operands[1], operands[0]))
914: return \"bicw2 %2,%0\";
915: return \"bicw3 %2,%1,%0\";
916: }")
917:
918: (define_insn ""
919: [(set (match_operand:QI 0 "general_operand" "=g")
920: (and:QI (match_operand:QI 1 "general_operand" "g")
921: (match_operand:QI 2 "general_operand" "g")))]
922: "GET_CODE (operands[2]) == CONST_INT"
923: "*
924: { operands[2] = gen_rtx (CONST_INT, VOIDmode, 0xff & ~INTVAL (operands[2]));
925: if (rtx_equal_p (operands[1], operands[0]))
926: return \"bicb2 %2,%0\";
927: return \"bicb3 %2,%1,%0\";
928: }")
929:
930: ;;- Bit set instructions.
931:
932: (define_insn "iorsi3"
933: [(set (match_operand:SI 0 "general_operand" "=g")
934: (ior:SI (match_operand:SI 1 "general_operand" "g")
935: (match_operand:SI 2 "general_operand" "g")))]
936: ""
937: "*
938: {
939: if (rtx_equal_p (operands[0], operands[1]))
940: return \"bisl2 %2,%0\";
941: if (rtx_equal_p (operands[0], operands[2]))
942: return \"bisl2 %1,%0\";
943: return \"bisl3 %2,%1,%0\";
944: }")
945:
946: (define_insn "iorhi3"
947: [(set (match_operand:HI 0 "general_operand" "=g")
948: (ior:HI (match_operand:HI 1 "general_operand" "g")
949: (match_operand:HI 2 "general_operand" "g")))]
950: ""
951: "*
952: {
953: if (rtx_equal_p (operands[0], operands[1]))
954: return \"bisw2 %2,%0\";
955: if (rtx_equal_p (operands[0], operands[2]))
956: return \"bisw2 %1,%0\";
957: return \"bisw3 %2,%1,%0\";
958: }")
959:
960: (define_insn "iorqi3"
961: [(set (match_operand:QI 0 "general_operand" "=g")
962: (ior:QI (match_operand:QI 1 "general_operand" "g")
963: (match_operand:QI 2 "general_operand" "g")))]
964: ""
965: "*
966: {
967: if (rtx_equal_p (operands[0], operands[1]))
968: return \"bisb2 %2,%0\";
969: if (rtx_equal_p (operands[0], operands[2]))
970: return \"bisb2 %1,%0\";
971: return \"bisb3 %2,%1,%0\";
972: }")
973:
974: ;;- xor instructions.
975:
976: (define_insn "xorsi3"
977: [(set (match_operand:SI 0 "general_operand" "=g")
978: (xor:SI (match_operand:SI 1 "general_operand" "g")
979: (match_operand:SI 2 "general_operand" "g")))]
980: ""
981: "*
982: {
983: if (rtx_equal_p (operands[0], operands[1]))
984: return \"xorl2 %2,%0\";
985: if (rtx_equal_p (operands[0], operands[2]))
986: return \"xorl2 %1,%0\";
987: return \"xorl3 %2,%1,%0\";
988: }")
989:
990: (define_insn "xorhi3"
991: [(set (match_operand:HI 0 "general_operand" "=g")
992: (xor:HI (match_operand:HI 1 "general_operand" "g")
993: (match_operand:HI 2 "general_operand" "g")))]
994: ""
995: "*
996: {
997: if (rtx_equal_p (operands[0], operands[1]))
998: return \"xorw2 %2,%0\";
999: if (rtx_equal_p (operands[0], operands[2]))
1000: return \"xorw2 %1,%0\";
1001: return \"xorw3 %2,%1,%0\";
1002: }")
1003:
1004: (define_insn "xorqi3"
1005: [(set (match_operand:QI 0 "general_operand" "=g")
1006: (xor:QI (match_operand:QI 1 "general_operand" "g")
1007: (match_operand:QI 2 "general_operand" "g")))]
1008: ""
1009: "*
1010: {
1011: if (rtx_equal_p (operands[0], operands[1]))
1012: return \"xorb2 %2,%0\";
1013: if (rtx_equal_p (operands[0], operands[2]))
1014: return \"xorb2 %1,%0\";
1015: return \"xorb3 %2,%1,%0\";
1016: }")
1017:
1018: (define_insn "negdf2"
1019: [(set (match_operand:DF 0 "general_operand" "=g")
1020: (neg:DF (match_operand:DF 1 "general_operand" "gF")))]
1021: ""
1022: "mneg%# %1,%0")
1023:
1024: (define_insn "negsf2"
1025: [(set (match_operand:SF 0 "general_operand" "=g")
1026: (neg:SF (match_operand:SF 1 "general_operand" "gF")))]
1027: ""
1028: "mnegf %1,%0")
1029:
1030: (define_insn "negsi2"
1031: [(set (match_operand:SI 0 "general_operand" "=g")
1032: (neg:SI (match_operand:SI 1 "general_operand" "g")))]
1033: ""
1034: "mnegl %1,%0")
1035:
1036: (define_insn "neghi2"
1037: [(set (match_operand:HI 0 "general_operand" "=g")
1038: (neg:HI (match_operand:HI 1 "general_operand" "g")))]
1039: ""
1040: "mnegw %1,%0")
1041:
1042: (define_insn "negqi2"
1043: [(set (match_operand:QI 0 "general_operand" "=g")
1044: (neg:QI (match_operand:QI 1 "general_operand" "g")))]
1045: ""
1046: "mnegb %1,%0")
1047:
1048: (define_insn "one_cmplsi2"
1049: [(set (match_operand:SI 0 "general_operand" "=g")
1050: (not:SI (match_operand:SI 1 "general_operand" "g")))]
1051: ""
1052: "mcoml %1,%0")
1053:
1054: (define_insn "one_cmplhi2"
1055: [(set (match_operand:HI 0 "general_operand" "=g")
1056: (not:HI (match_operand:HI 1 "general_operand" "g")))]
1057: ""
1058: "mcomw %1,%0")
1059:
1060: (define_insn "one_cmplqi2"
1061: [(set (match_operand:QI 0 "general_operand" "=g")
1062: (not:QI (match_operand:QI 1 "general_operand" "g")))]
1063: ""
1064: "mcomb %1,%0")
1065:
1066: ;; Arithmetic right shift on the vax works by negating the shift count.
1067: (define_expand "ashrsi3"
1068: [(set (match_operand:SI 0 "general_operand" "=g")
1069: (ashift:SI (match_operand:SI 1 "general_operand" "g")
1070: (match_operand:QI 2 "general_operand" "g")))]
1071: ""
1072: "
1073: {
1074: operands[2] = negate_rtx (QImode, operands[2]);
1075: }")
1076:
1077: (define_insn "ashlsi3"
1078: [(set (match_operand:SI 0 "general_operand" "=g")
1079: (ashift:SI (match_operand:SI 1 "general_operand" "g")
1080: (match_operand:QI 2 "general_operand" "g")))]
1081: ""
1082: "*
1083: {
1084: if (operands[2] == const1_rtx && rtx_equal_p (operands[0], operands[1]))
1085: return \"addl2 %0,%0\";
1086: if (GET_CODE (operands[1]) == REG
1087: && GET_CODE (operands[2]) == CONST_INT)
1088: {
1089: int i = INTVAL (operands[2]);
1090: if (i == 1)
1091: return \"addl3 %1,%1,%0\";
1092: if (i == 2)
1093: return \"moval 0[%1],%0\";
1094: if (i == 3)
1095: return \"movad 0[%1],%0\";
1096: }
1097: return \"ashl %2,%1,%0\";
1098: }")
1099:
1100: ;; Arithmetic right shift on the vax works by negating the shift count.
1101: (define_expand "ashrdi3"
1102: [(set (match_operand:DI 0 "general_operand" "=g")
1103: (ashift:DI (match_operand:DI 1 "general_operand" "g")
1104: (match_operand:QI 2 "general_operand" "g")))]
1105: ""
1106: "
1107: {
1108: operands[2] = negate_rtx (QImode, operands[2]);
1109: }")
1110:
1111: (define_insn "ashldi3"
1112: [(set (match_operand:DI 0 "general_operand" "=g")
1113: (ashift:DI (match_operand:DI 1 "general_operand" "g")
1114: (match_operand:QI 2 "general_operand" "g")))]
1115: ""
1116: "ashq %2,%1,%0")
1117:
1118: ;; Rotate right on the vax works by negating the shift count.
1119: (define_expand "rotrsi3"
1120: [(set (match_operand:SI 0 "general_operand" "=g")
1121: (rotate:SI (match_operand:SI 1 "general_operand" "g")
1122: (match_operand:QI 2 "general_operand" "g")))]
1123: ""
1124: "
1125: {
1126: operands[2] = negate_rtx (QImode, operands[2]);
1127: }")
1128:
1129: (define_insn "rotlsi3"
1130: [(set (match_operand:SI 0 "general_operand" "=g")
1131: (rotate:SI (match_operand:SI 1 "general_operand" "g")
1132: (match_operand:QI 2 "general_operand" "g")))]
1133: ""
1134: "rotl %2,%1,%0")
1135:
1136: ;This insn is probably slower than a multiply and an add.
1137: ;(define_insn ""
1138: ; [(set (match_operand:SI 0 "general_operand" "=g")
1139: ; (mult:SI (plus:SI (match_operand:SI 1 "general_operand" "g")
1140: ; (match_operand:SI 2 "general_operand" "g"))
1141: ; (match_operand:SI 3 "general_operand" "g")))]
1142: ; ""
1143: ; "index %1,$0x80000000,$0x7fffffff,%3,%2,%0")
1144:
1145: ;; Special cases of bit-field insns which we should
1146: ;; recognize in preference to the general case.
1147: ;; These handle aligned 8-bit and 16-bit fields,
1148: ;; which can usually be done with move instructions.
1149:
1150: (define_insn ""
1151: [(set (zero_extract:SI (match_operand:SI 0 "general_operand" "+ro")
1152: (match_operand:SI 1 "immediate_operand" "i")
1153: (match_operand:SI 2 "immediate_operand" "i"))
1154: (match_operand:SI 3 "general_operand" "g"))]
1155: "GET_CODE (operands[1]) == CONST_INT
1156: && (INTVAL (operands[1]) == 8 || INTVAL (operands[1]) == 16)
1157: && GET_CODE (operands[2]) == CONST_INT
1158: && INTVAL (operands[2]) % INTVAL (operands[1]) == 0
1159: && (GET_CODE (operands[0]) == REG
1160: || ! mode_dependent_address_p (XEXP (operands[0], 0)))"
1161: "*
1162: {
1163: if (REG_P (operands[0]))
1164: {
1165: if (INTVAL (operands[2]) != 0)
1166: return \"insv %3,%2,%1,%0\";
1167: }
1168: else
1169: operands[0]
1170: = adj_offsettable_operand (operands[0], INTVAL (operands[2]) / 8);
1171:
1172: if (INTVAL (operands[1]) == 8)
1173: return \"movb %3,%0\";
1174: return \"movw %3,%0\";
1175: }")
1176:
1177: (define_insn ""
1178: [(set (match_operand:SI 0 "general_operand" "=&g")
1179: (zero_extract:SI (match_operand:SI 1 "general_operand" "ro")
1180: (match_operand:SI 2 "immediate_operand" "i")
1181: (match_operand:SI 3 "immediate_operand" "i")))]
1182: "GET_CODE (operands[2]) == CONST_INT
1183: && (INTVAL (operands[2]) == 8 || INTVAL (operands[2]) == 16)
1184: && GET_CODE (operands[3]) == CONST_INT
1185: && INTVAL (operands[3]) % INTVAL (operands[2]) == 0
1186: && (GET_CODE (operands[1]) == REG
1187: || ! mode_dependent_address_p (XEXP (operands[1], 0)))"
1188: "*
1189: {
1190: if (REG_P (operands[1]))
1191: {
1192: if (INTVAL (operands[3]) != 0)
1193: return \"extzv %3,%2,%1,%0\";
1194: }
1195: else
1196: operands[1]
1197: = adj_offsettable_operand (operands[1], INTVAL (operands[3]) / 8);
1198:
1199: if (INTVAL (operands[2]) == 8)
1200: return \"movzbl %1,%0\";
1201: return \"movzwl %1,%0\";
1202: }")
1203:
1204: (define_insn ""
1205: [(set (match_operand:SI 0 "general_operand" "=g")
1206: (sign_extract:SI (match_operand:SI 1 "general_operand" "ro")
1207: (match_operand:SI 2 "immediate_operand" "i")
1208: (match_operand:SI 3 "immediate_operand" "i")))]
1209: "GET_CODE (operands[2]) == CONST_INT
1210: && (INTVAL (operands[2]) == 8 || INTVAL (operands[2]) == 16)
1211: && GET_CODE (operands[3]) == CONST_INT
1212: && INTVAL (operands[3]) % INTVAL (operands[2]) == 0
1213: && (GET_CODE (operands[1]) == REG
1214: || ! mode_dependent_address_p (XEXP (operands[1], 0)))"
1215: "*
1216: {
1217: if (REG_P (operands[1]))
1218: {
1219: if (INTVAL (operands[3]) != 0)
1220: return \"extv %3,%2,%1,%0\";
1221: }
1222: else
1223: operands[1]
1224: = adj_offsettable_operand (operands[1], INTVAL (operands[3]) / 8);
1225:
1226: if (INTVAL (operands[2]) == 8)
1227: return \"cvtbl %1,%0\";
1228: return \"cvtwl %1,%0\";
1229: }")
1230:
1231: ;; Register-only SImode cases of bit-field insns.
1232:
1233: (define_insn ""
1234: [(set (cc0)
1235: (compare
1236: (sign_extract:SI (match_operand:SI 0 "general_operand" "r")
1237: (match_operand:SI 1 "general_operand" "g")
1238: (match_operand:SI 2 "general_operand" "g"))
1239: (match_operand:SI 3 "general_operand" "g")))]
1240: ""
1241: "cmpv %2,%1,%0,%3")
1242:
1243: (define_insn ""
1244: [(set (cc0)
1245: (compare
1246: (zero_extract:SI (match_operand:SI 0 "general_operand" "r")
1247: (match_operand:SI 1 "general_operand" "g")
1248: (match_operand:SI 2 "general_operand" "g"))
1249: (match_operand:SI 3 "general_operand" "g")))]
1250: ""
1251: "cmpzv %2,%1,%0,%3")
1252:
1253: (define_insn ""
1254: [(set (match_operand:SI 0 "general_operand" "=g")
1255: (sign_extract:SI (match_operand:SI 1 "general_operand" "r")
1256: (match_operand:SI 2 "general_operand" "g")
1257: (match_operand:SI 3 "general_operand" "g")))]
1258: ""
1259: "extv %3,%2,%1,%0")
1260:
1261: (define_insn ""
1262: [(set (match_operand:SI 0 "general_operand" "=g")
1263: (zero_extract:SI (match_operand:SI 1 "general_operand" "r")
1264: (match_operand:SI 2 "general_operand" "g")
1265: (match_operand:SI 3 "general_operand" "g")))]
1266: ""
1267: "extzv %3,%2,%1,%0")
1268:
1269: ;; Non-register cases.
1270: ;; nonimmediate_operand is used to make sure that mode-ambiguous cases
1271: ;; don't match these (and therefore match the cases above instead).
1272:
1273: (define_insn ""
1274: [(set (cc0)
1275: (compare
1276: (sign_extract:SI (match_operand:QI 0 "nonimmediate_operand" "rm")
1277: (match_operand:SI 1 "general_operand" "g")
1278: (match_operand:SI 2 "general_operand" "g"))
1279: (match_operand:SI 3 "general_operand" "g")))]
1280: ""
1281: "cmpv %2,%1,%0,%3")
1282:
1283: (define_insn ""
1284: [(set (cc0)
1285: (compare
1286: (zero_extract:SI (match_operand:QI 0 "nonimmediate_operand" "rm")
1287: (match_operand:SI 1 "general_operand" "g")
1288: (match_operand:SI 2 "general_operand" "g"))
1289: (match_operand:SI 3 "general_operand" "g")))]
1290: ""
1291: "cmpzv %2,%1,%0,%3")
1292:
1293: (define_insn "extv"
1294: [(set (match_operand:SI 0 "general_operand" "=g")
1295: (sign_extract:SI (match_operand:QI 1 "nonimmediate_operand" "rm")
1296: (match_operand:SI 2 "general_operand" "g")
1297: (match_operand:SI 3 "general_operand" "g")))]
1298: ""
1299: "extv %3,%2,%1,%0")
1300:
1301: (define_insn "extzv"
1302: [(set (match_operand:SI 0 "general_operand" "=g")
1303: (zero_extract:SI (match_operand:QI 1 "nonimmediate_operand" "rm")
1304: (match_operand:SI 2 "general_operand" "g")
1305: (match_operand:SI 3 "general_operand" "g")))]
1306: ""
1307: "extzv %3,%2,%1,%0")
1308:
1309: (define_insn "insv"
1310: [(set (zero_extract:SI (match_operand:QI 0 "general_operand" "+g")
1311: (match_operand:SI 1 "general_operand" "g")
1312: (match_operand:SI 2 "general_operand" "g"))
1313: (match_operand:SI 3 "general_operand" "g"))]
1314: ""
1315: "insv %3,%2,%1,%0")
1316:
1317: (define_insn ""
1318: [(set (zero_extract:SI (match_operand:SI 0 "register_operand" "+r")
1319: (match_operand:SI 1 "general_operand" "g")
1320: (match_operand:SI 2 "general_operand" "g"))
1321: (match_operand:SI 3 "general_operand" "g"))]
1322: ""
1323: "insv %3,%2,%1,%0")
1324:
1325: (define_insn "jump"
1326: [(set (pc)
1327: (label_ref (match_operand 0 "" "")))]
1328: ""
1329: "jbr %l0")
1330:
1331: (define_insn "beq"
1332: [(set (pc)
1333: (if_then_else (eq (cc0)
1334: (const_int 0))
1335: (label_ref (match_operand 0 "" ""))
1336: (pc)))]
1337: ""
1338: "jeql %l0")
1339:
1340: (define_insn "bne"
1341: [(set (pc)
1342: (if_then_else (ne (cc0)
1343: (const_int 0))
1344: (label_ref (match_operand 0 "" ""))
1345: (pc)))]
1346: ""
1347: "jneq %l0")
1348:
1349: (define_insn "bgt"
1350: [(set (pc)
1351: (if_then_else (gt (cc0)
1352: (const_int 0))
1353: (label_ref (match_operand 0 "" ""))
1354: (pc)))]
1355: ""
1356: "jgtr %l0")
1357:
1358: (define_insn "bgtu"
1359: [(set (pc)
1360: (if_then_else (gtu (cc0)
1361: (const_int 0))
1362: (label_ref (match_operand 0 "" ""))
1363: (pc)))]
1364: ""
1365: "jgtru %l0")
1366:
1367: (define_insn "blt"
1368: [(set (pc)
1369: (if_then_else (lt (cc0)
1370: (const_int 0))
1371: (label_ref (match_operand 0 "" ""))
1372: (pc)))]
1373: ""
1374: "jlss %l0")
1375:
1376: (define_insn "bltu"
1377: [(set (pc)
1378: (if_then_else (ltu (cc0)
1379: (const_int 0))
1380: (label_ref (match_operand 0 "" ""))
1381: (pc)))]
1382: ""
1383: "jlssu %l0")
1384:
1385: (define_insn "bge"
1386: [(set (pc)
1387: (if_then_else (ge (cc0)
1388: (const_int 0))
1389: (label_ref (match_operand 0 "" ""))
1390: (pc)))]
1391: ""
1392: "jgeq %l0")
1393:
1394: (define_insn "bgeu"
1395: [(set (pc)
1396: (if_then_else (geu (cc0)
1397: (const_int 0))
1398: (label_ref (match_operand 0 "" ""))
1399: (pc)))]
1400: ""
1401: "jgequ %l0")
1402:
1403: (define_insn "ble"
1404: [(set (pc)
1405: (if_then_else (le (cc0)
1406: (const_int 0))
1407: (label_ref (match_operand 0 "" ""))
1408: (pc)))]
1409: ""
1410: "jleq %l0")
1411:
1412: (define_insn "bleu"
1413: [(set (pc)
1414: (if_then_else (leu (cc0)
1415: (const_int 0))
1416: (label_ref (match_operand 0 "" ""))
1417: (pc)))]
1418: ""
1419: "jlequ %l0")
1420:
1421: (define_insn ""
1422: [(set (pc)
1423: (if_then_else (eq (cc0)
1424: (const_int 0))
1425: (pc)
1426: (label_ref (match_operand 0 "" ""))))]
1427: ""
1428: "jneq %l0")
1429:
1430: (define_insn ""
1431: [(set (pc)
1432: (if_then_else (ne (cc0)
1433: (const_int 0))
1434: (pc)
1435: (label_ref (match_operand 0 "" ""))))]
1436: ""
1437: "jeql %l0")
1438:
1439: (define_insn ""
1440: [(set (pc)
1441: (if_then_else (gt (cc0)
1442: (const_int 0))
1443: (pc)
1444: (label_ref (match_operand 0 "" ""))))]
1445: ""
1446: "jleq %l0")
1447:
1448: (define_insn ""
1449: [(set (pc)
1450: (if_then_else (gtu (cc0)
1451: (const_int 0))
1452: (pc)
1453: (label_ref (match_operand 0 "" ""))))]
1454: ""
1455: "jlequ %l0")
1456:
1457: (define_insn ""
1458: [(set (pc)
1459: (if_then_else (lt (cc0)
1460: (const_int 0))
1461: (pc)
1462: (label_ref (match_operand 0 "" ""))))]
1463: ""
1464: "jgeq %l0")
1465:
1466: (define_insn ""
1467: [(set (pc)
1468: (if_then_else (ltu (cc0)
1469: (const_int 0))
1470: (pc)
1471: (label_ref (match_operand 0 "" ""))))]
1472: ""
1473: "jgequ %l0")
1474:
1475: (define_insn ""
1476: [(set (pc)
1477: (if_then_else (ge (cc0)
1478: (const_int 0))
1479: (pc)
1480: (label_ref (match_operand 0 "" ""))))]
1481: ""
1482: "jlss %l0")
1483:
1484: (define_insn ""
1485: [(set (pc)
1486: (if_then_else (geu (cc0)
1487: (const_int 0))
1488: (pc)
1489: (label_ref (match_operand 0 "" ""))))]
1490: ""
1491: "jlssu %l0")
1492:
1493: (define_insn ""
1494: [(set (pc)
1495: (if_then_else (le (cc0)
1496: (const_int 0))
1497: (pc)
1498: (label_ref (match_operand 0 "" ""))))]
1499: ""
1500: "jgtr %l0")
1501:
1502: (define_insn ""
1503: [(set (pc)
1504: (if_then_else (leu (cc0)
1505: (const_int 0))
1506: (pc)
1507: (label_ref (match_operand 0 "" ""))))]
1508: ""
1509: "jgtru %l0")
1510:
1511: ;; Recognize jlbs and jlbc insns.
1512: ;; These come before the jbc and jbs recognizers so these will be preferred.
1513:
1514: (define_insn ""
1515: [(set (pc)
1516: (if_then_else
1517: (ne (and:SI (match_operand:SI 0 "general_operand" "g")
1518: (const_int 1))
1519: (const_int 0))
1520: (label_ref (match_operand 1 "" ""))
1521: (pc)))]
1522: "GET_CODE (operands[0]) != MEM
1523: || ! mode_dependent_address_p (XEXP (operands[0], 0))"
1524: "jlbs %0,%l1")
1525:
1526: (define_insn ""
1527: [(set (pc)
1528: (if_then_else
1529: (eq (and:SI (match_operand:SI 0 "general_operand" "g")
1530: (const_int 1))
1531: (const_int 0))
1532: (label_ref (match_operand 1 "" ""))
1533: (pc)))]
1534: "GET_CODE (operands[0]) != MEM
1535: || ! mode_dependent_address_p (XEXP (operands[0], 0))"
1536: "jlbc %0,%l1")
1537:
1538: (define_insn ""
1539: [(set (pc)
1540: (if_then_else
1541: (ne (and:SI (match_operand:SI 0 "general_operand" "g")
1542: (const_int 1))
1543: (const_int 0))
1544: (pc)
1545: (label_ref (match_operand 1 "" ""))))]
1546: "GET_CODE (operands[0]) != MEM
1547: || ! mode_dependent_address_p (XEXP (operands[0], 0))"
1548: "jlbc %0,%l1")
1549:
1550: (define_insn ""
1551: [(set (pc)
1552: (if_then_else
1553: (eq (and:SI (match_operand:SI 0 "general_operand" "g")
1554: (const_int 1))
1555: (const_int 0))
1556: (pc)
1557: (label_ref (match_operand 1 "" ""))))]
1558: "GET_CODE (operands[0]) != MEM
1559: || ! mode_dependent_address_p (XEXP (operands[0], 0))"
1560: "jlbs %0,%l1")
1561:
1562: ;; These four entries allow a jlbc or jlbs to be made
1563: ;; by combination with a bic.
1564: (define_insn ""
1565: [(set (pc)
1566: (if_then_else
1567: (ne (and:SI (match_operand:SI 0 "general_operand" "g")
1568: (not:SI (const_int -2)))
1569: (const_int 0))
1570: (label_ref (match_operand 1 "" ""))
1571: (pc)))]
1572: "GET_CODE (operands[0]) != MEM
1573: || ! mode_dependent_address_p (XEXP (operands[0], 0))"
1574: "jlbs %0,%l1")
1575:
1576: (define_insn ""
1577: [(set (pc)
1578: (if_then_else
1579: (eq (and:SI (match_operand:SI 0 "general_operand" "g")
1580: (not:SI (const_int -2)))
1581: (const_int 0))
1582: (label_ref (match_operand 1 "" ""))
1583: (pc)))]
1584: "GET_CODE (operands[0]) != MEM
1585: || ! mode_dependent_address_p (XEXP (operands[0], 0))"
1586: "jlbc %0,%l1")
1587:
1588: (define_insn ""
1589: [(set (pc)
1590: (if_then_else
1591: (ne (and:SI (match_operand:SI 0 "general_operand" "g")
1592: (not:SI (const_int -2)))
1593: (const_int 0))
1594: (pc)
1595: (label_ref (match_operand 1 "" ""))))]
1596: "GET_CODE (operands[0]) != MEM
1597: || ! mode_dependent_address_p (XEXP (operands[0], 0))"
1598: "jlbc %0,%l1")
1599:
1600: (define_insn ""
1601: [(set (pc)
1602: (if_then_else
1603: (eq (and:SI (match_operand:SI 0 "general_operand" "g")
1604: (not:SI (const_int -2)))
1605: (const_int 0))
1606: (pc)
1607: (label_ref (match_operand 1 "" ""))))]
1608: "GET_CODE (operands[0]) != MEM
1609: || ! mode_dependent_address_p (XEXP (operands[0], 0))"
1610: "jlbs %0,%l1")
1611:
1612: ;; Recognize jbs and jbc instructions.
1613:
1614: (define_insn ""
1615: [(set (pc)
1616: (if_then_else
1617: (ne (sign_extract:SI (match_operand:QI 0 "general_operand" "g")
1618: (const_int 1)
1619: (match_operand:SI 1 "general_operand" "g"))
1620: (const_int 0))
1621: (label_ref (match_operand 2 "" ""))
1622: (pc)))]
1623: ""
1624: "jbs %1,%0,%l2")
1625:
1626: (define_insn ""
1627: [(set (pc)
1628: (if_then_else
1629: (eq (sign_extract:SI (match_operand:QI 0 "general_operand" "g")
1630: (const_int 1)
1631: (match_operand:SI 1 "general_operand" "g"))
1632: (const_int 0))
1633: (label_ref (match_operand 2 "" ""))
1634: (pc)))]
1635: ""
1636: "jbc %1,%0,%l2")
1637:
1638: (define_insn ""
1639: [(set (pc)
1640: (if_then_else
1641: (ne (sign_extract:SI (match_operand:QI 0 "general_operand" "g")
1642: (const_int 1)
1643: (match_operand:SI 1 "general_operand" "g"))
1644: (const_int 0))
1645: (pc)
1646: (label_ref (match_operand 2 "" ""))))]
1647: ""
1648: "jbc %1,%0,%l2")
1649:
1650: (define_insn ""
1651: [(set (pc)
1652: (if_then_else
1653: (eq (sign_extract:SI (match_operand:QI 0 "general_operand" "g")
1654: (const_int 1)
1655: (match_operand:SI 1 "general_operand" "g"))
1656: (const_int 0))
1657: (pc)
1658: (label_ref (match_operand 2 "" ""))))]
1659: ""
1660: "jbs %1,%0,%l2")
1661:
1662: (define_insn ""
1663: [(set (pc)
1664: (if_then_else
1665: (ne (sign_extract:SI (match_operand:SI 0 "general_operand" "r")
1666: (const_int 1)
1667: (match_operand:SI 1 "general_operand" "g"))
1668: (const_int 0))
1669: (label_ref (match_operand 2 "" ""))
1670: (pc)))]
1671: "GET_CODE (operands[0]) != MEM
1672: || ! mode_dependent_address_p (XEXP (operands[0], 0))"
1673: "jbs %1,%0,%l2")
1674:
1675: (define_insn ""
1676: [(set (pc)
1677: (if_then_else
1678: (eq (sign_extract:SI (match_operand:SI 0 "general_operand" "r")
1679: (const_int 1)
1680: (match_operand:SI 1 "general_operand" "g"))
1681: (const_int 0))
1682: (label_ref (match_operand 2 "" ""))
1683: (pc)))]
1684: "GET_CODE (operands[0]) != MEM
1685: || ! mode_dependent_address_p (XEXP (operands[0], 0))"
1686: "jbc %1,%0,%l2")
1687:
1688: (define_insn ""
1689: [(set (pc)
1690: (if_then_else
1691: (eq (and:SI (match_operand:SI 0 "general_operand" "g")
1692: (match_operand:SI 1 "general_operand" "g"))
1693: (const_int 0))
1694: (pc)
1695: (label_ref (match_operand 2 "" ""))))]
1696: "GET_CODE (operands[1]) == CONST_INT
1697: && exact_log2 (INTVAL (operands[1])) >= 0
1698: && (GET_CODE (operands[0]) != MEM
1699: || ! mode_dependent_address_p (XEXP (operands[0], 0)))"
1700: "*
1701: {
1702: operands[1]
1703: = gen_rtx (CONST_INT, VOIDmode, exact_log2 (INTVAL (operands[1])));
1704: return \"jbs %1,%0,%l2\";
1705: }")
1706:
1707: (define_insn ""
1708: [(set (pc)
1709: (if_then_else
1710: (eq (and:SI (match_operand:SI 0 "general_operand" "g")
1711: (match_operand:SI 1 "general_operand" "g"))
1712: (const_int 0))
1713: (label_ref (match_operand 2 "" ""))
1714: (pc)))]
1715: "GET_CODE (operands[1]) == CONST_INT
1716: && exact_log2 (INTVAL (operands[1])) >= 0
1717: && (GET_CODE (operands[0]) != MEM
1718: || ! mode_dependent_address_p (XEXP (operands[0], 0)))"
1719: "*
1720: {
1721: operands[1]
1722: = gen_rtx (CONST_INT, VOIDmode, exact_log2 (INTVAL (operands[1])));
1723: return \"jbc %1,%0,%l2\";
1724: }")
1725:
1726: (define_insn ""
1727: [(set (pc)
1728: (if_then_else
1729: (ne (and:SI (match_operand:SI 0 "general_operand" "g")
1730: (match_operand:SI 1 "general_operand" "g"))
1731: (const_int 0))
1732: (pc)
1733: (label_ref (match_operand 2 "" ""))))]
1734: "GET_CODE (operands[1]) == CONST_INT
1735: && exact_log2 (INTVAL (operands[1])) >= 0
1736: && (GET_CODE (operands[0]) != MEM
1737: || ! mode_dependent_address_p (XEXP (operands[0], 0)))"
1738: "*
1739: {
1740: operands[1]
1741: = gen_rtx (CONST_INT, VOIDmode, exact_log2 (INTVAL (operands[1])));
1742: return \"jbc %1,%0,%l2\";
1743: }")
1744:
1745: (define_insn ""
1746: [(set (pc)
1747: (if_then_else
1748: (ne (and:SI (match_operand:SI 0 "general_operand" "g")
1749: (match_operand:SI 1 "general_operand" "g"))
1750: (const_int 0))
1751: (label_ref (match_operand 2 "" ""))
1752: (pc)))]
1753: "GET_CODE (operands[1]) == CONST_INT
1754: && exact_log2 (INTVAL (operands[1])) >= 0
1755: && (GET_CODE (operands[0]) != MEM
1756: || ! mode_dependent_address_p (XEXP (operands[0], 0)))"
1757: "*
1758: {
1759: operands[1]
1760: = gen_rtx (CONST_INT, VOIDmode, exact_log2 (INTVAL (operands[1])));
1761: return \"jbs %1,%0,%l2\";
1762: }")
1763:
1764: (define_insn ""
1765: [(set (pc)
1766: (if_then_else
1767: (ne (sign_extract:SI (match_operand:SI 0 "general_operand" "r")
1768: (const_int 1)
1769: (match_operand:SI 1 "general_operand" "g"))
1770: (const_int 0))
1771: (pc)
1772: (label_ref (match_operand 2 "" ""))))]
1773: "GET_CODE (operands[0]) != MEM
1774: || ! mode_dependent_address_p (XEXP (operands[0], 0))"
1775: "jbc %1,%0,%l2")
1776:
1777: (define_insn ""
1778: [(set (pc)
1779: (if_then_else
1780: (eq (sign_extract:SI (match_operand:SI 0 "general_operand" "r")
1781: (const_int 1)
1782: (match_operand:SI 1 "general_operand" "g"))
1783: (const_int 0))
1784: (pc)
1785: (label_ref (match_operand 2 "" ""))))]
1786: "GET_CODE (operands[0]) != MEM
1787: || ! mode_dependent_address_p (XEXP (operands[0], 0))"
1788: "jbs %1,%0,%l2")
1789:
1790: ;; Subtract-and-jump and Add-and-jump insns.
1791: ;; These are not used when output is for the Unix assembler
1792: ;; because it does not know how to modify them to reach far.
1793:
1794: ;; Normal sob insns.
1795:
1796: (define_insn ""
1797: [(set (pc)
1798: (if_then_else
1799: (gt (plus:SI (match_operand:SI 0 "general_operand" "+g")
1800: (const_int -1))
1801: (const_int 0))
1802: (label_ref (match_operand 1 "" ""))
1803: (pc)))
1804: (set (match_dup 0)
1805: (plus:SI (match_dup 0)
1806: (const_int -1)))]
1807: "!TARGET_UNIX_ASM"
1808: "jsobgtr %0,%l1")
1809:
1810: (define_insn ""
1811: [(set (pc)
1812: (if_then_else
1813: (ge (plus:SI (match_operand:SI 0 "general_operand" "+g")
1814: (const_int -1))
1815: (const_int 0))
1816: (label_ref (match_operand 1 "" ""))
1817: (pc)))
1818: (set (match_dup 0)
1819: (plus:SI (match_dup 0)
1820: (const_int -1)))]
1821: "!TARGET_UNIX_ASM"
1822: "jsobgeq %0,%l1")
1823:
1824: ;; Reversed sob insns.
1825:
1826: (define_insn ""
1827: [(set (pc)
1828: (if_then_else
1829: (le (plus:SI (match_operand:SI 0 "general_operand" "+g")
1830: (const_int -1))
1831: (const_int 0))
1832: (pc)
1833: (label_ref (match_operand 1 "" ""))))
1834: (set (match_dup 0)
1835: (plus:SI (match_dup 0)
1836: (const_int -1)))]
1837: "!TARGET_UNIX_ASM"
1838: "jsobgtr %0,%l1")
1839:
1840: (define_insn ""
1841: [(set (pc)
1842: (if_then_else
1843: (lt (plus:SI (match_operand:SI 0 "general_operand" "+g")
1844: (const_int -1))
1845: (const_int 0))
1846: (pc)
1847: (label_ref (match_operand 1 "" ""))))
1848: (set (match_dup 0)
1849: (plus:SI (match_dup 0)
1850: (const_int -1)))]
1851: "!TARGET_UNIX_ASM"
1852: "jsobgeq %0,%l1")
1853:
1854: ;; Normal aob insns.
1855: (define_insn ""
1856: [(set (pc)
1857: (if_then_else
1858: (lt (compare (plus:SI (match_operand:SI 0 "general_operand" "+g")
1859: (const_int 1))
1860: (match_operand:SI 1 "general_operand" "g"))
1861: (const_int 0))
1862: (label_ref (match_operand 2 "" ""))
1863: (pc)))
1864: (set (match_dup 0)
1865: (plus:SI (match_dup 0)
1866: (const_int 1)))]
1867: "!TARGET_UNIX_ASM"
1868: "jaoblss %1,%0,%l2")
1869:
1870: (define_insn ""
1871: [(set (pc)
1872: (if_then_else
1873: (le (compare (plus:SI (match_operand:SI 0 "general_operand" "+g")
1874: (const_int 1))
1875: (match_operand:SI 1 "general_operand" "g"))
1876: (const_int 0))
1877: (label_ref (match_operand 2 "" ""))
1878: (pc)))
1879: (set (match_dup 0)
1880: (plus:SI (match_dup 0)
1881: (const_int 1)))]
1882: "!TARGET_UNIX_ASM"
1883: "jaobleq %1,%0,%l2")
1884:
1885: ;; Reverse aob insns.
1886: (define_insn ""
1887: [(set (pc)
1888: (if_then_else
1889: (ge (compare (plus:SI (match_operand:SI 0 "general_operand" "+g")
1890: (const_int 1))
1891: (match_operand:SI 1 "general_operand" "g"))
1892: (const_int 0))
1893: (pc)
1894: (label_ref (match_operand 2 "" ""))))
1895: (set (match_dup 0)
1896: (plus:SI (match_dup 0)
1897: (const_int 1)))]
1898: "!TARGET_UNIX_ASM"
1899: "jaoblss %1,%0,%l2")
1900:
1901: (define_insn ""
1902: [(set (pc)
1903: (if_then_else
1904: (gt (compare (plus:SI (match_operand:SI 0 "general_operand" "+g")
1905: (const_int 1))
1906: (match_operand:SI 1 "general_operand" "g"))
1907: (const_int 0))
1908: (pc)
1909: (label_ref (match_operand 2 "" ""))))
1910: (set (match_dup 0)
1911: (plus:SI (match_dup 0)
1912: (const_int 1)))]
1913: "!TARGET_UNIX_ASM"
1914: "jaobleq %1,%0,%l2")
1915:
1916: ;; Something like a sob insn, but compares against -1.
1917: ;; This finds `while (foo--)' which was changed to `while (--foo != -1)'.
1918:
1919: (define_insn ""
1920: [(set (pc)
1921: (if_then_else
1922: (ne (compare (plus:SI (match_operand:SI 0 "general_operand" "g")
1923: (const_int -1))
1924: (const_int -1))
1925: (const_int 0))
1926: (label_ref (match_operand 1 "" ""))
1927: (pc)))
1928: (set (match_dup 0)
1929: (plus:SI (match_dup 0)
1930: (const_int -1)))]
1931: ""
1932: "decl %0\;jgequ %l1")
1933:
1934: ;; Note that operand 1 is total size of args, in bytes,
1935: ;; and what the call insn wants is the number of words.
1936: (define_insn "call"
1937: [(call (match_operand:QI 0 "general_operand" "g")
1938: (match_operand:QI 1 "general_operand" "g"))]
1939: ""
1940: "*
1941: if (INTVAL (operands[1]) > 255 * 4)
1942: /* Vax `calls' really uses only one byte of #args, so pop explicitly. */
1943: return \"calls $0,%0\;addl2 %1,sp\";
1944: operands[1] = gen_rtx (CONST_INT, VOIDmode, (INTVAL (operands[1]) + 3)/ 4);
1945: return \"calls %1,%0\";
1946: ")
1947:
1948: (define_insn "call_value"
1949: [(set (match_operand 0 "" "=g")
1950: (call (match_operand:QI 1 "general_operand" "g")
1951: (match_operand:QI 2 "general_operand" "g")))]
1952: ""
1953: "*
1954: if (INTVAL (operands[2]) > 255 * 4)
1955: /* Vax `calls' really uses only one byte of #args, so pop explicitly. */
1956: return \"calls $0,%1\;addl2 %2,sp\";
1957: operands[2] = gen_rtx (CONST_INT, VOIDmode, (INTVAL (operands[2]) + 3)/ 4);
1958: return \"calls %2,%1\";
1959: ")
1960:
1961: (define_insn "return"
1962: [(return)]
1963: ""
1964: "ret")
1965:
1966: (define_insn "nop"
1967: [(const_int 0)]
1968: ""
1969: "nop")
1970:
1971: (define_insn "casesi"
1972: [(set (pc)
1973: (if_then_else (le (minus:SI (match_operand:SI 0 "general_operand" "g")
1974: (match_operand:SI 1 "general_operand" "g"))
1975: (match_operand:SI 2 "general_operand" "g"))
1976: (plus:SI (sign_extend:SI
1977: (mem:HI (plus:SI (pc)
1978: (minus:SI (match_dup 0)
1979: (match_dup 1)))))
1980: (label_ref:SI (match_operand 3 "" "")))
1981: (pc)))]
1982: ""
1983: "casel %0,%1,%2")
1984:
1985: ;; This used to arise from the preceding by simplification
1986: ;; if operand 1 is zero. Perhaps it is no longer necessary.
1987: (define_insn ""
1988: [(set (pc)
1989: (if_then_else (le (match_operand:SI 0 "general_operand" "g")
1990: (match_operand:SI 1 "general_operand" "g"))
1991: (plus:SI (sign_extend:SI
1992: (mem:HI (plus:SI (pc)
1993: (minus:SI (match_dup 0)
1994: (const_int 0)))))
1995: (label_ref:SI (match_operand 3 "" "")))
1996: (pc)))]
1997: ""
1998: "casel %0,$0,%1")
1999:
2000: ;; This arises from the preceding by simplification if operand 1 is zero.
2001: (define_insn ""
2002: [(set (pc)
2003: (if_then_else (le (match_operand:SI 0 "general_operand" "g")
2004: (match_operand:SI 1 "general_operand" "g"))
2005: (plus:SI (sign_extend:SI
2006: (mem:HI (plus:SI (pc)
2007: (match_dup 0))))
2008: (label_ref:SI (match_operand 3 "" "")))
2009: (pc)))]
2010: ""
2011: "casel %0,$0,%1")
2012:
2013: ;; This arises from casesi if operand 0 is a constant, in range.
2014: (define_insn ""
2015: [(set (pc)
2016: (plus:SI (sign_extend:SI
2017: (mem:HI (plus:SI (pc)
2018: (match_operand:SI 0 "general_operand" "g"))))
2019: (label_ref:SI (match_operand 3 "" ""))))]
2020: ""
2021: "casel %0,$0,%0")
1.1.1.2 root 2022:
2023: ;; This arises from the above if both operands are the same.
2024: (define_insn ""
2025: [(set (pc)
2026: (plus:SI (sign_extend:SI (mem:HI (pc)))
2027: (label_ref:SI (match_operand 3 "" ""))))]
2028: ""
2029: "casel $0,$0,$0")
1.1 root 2030:
2031: ;;- load or push effective address
2032: ;; These come after the move and add/sub patterns
2033: ;; because we don't want pushl $1 turned into pushad 1.
2034: ;; or addl3 r1,r2,r3 turned into movab 0(r1)[r2],r3.
2035:
2036: (define_insn ""
2037: [(set (match_operand:SI 0 "general_operand" "=g")
2038: (match_operand:QI 1 "address_operand" "p"))]
2039: ""
2040: "*
2041: {
2042: if (push_operand (operands[0], SImode))
2043: return \"pushab %a1\";
2044: return \"movab %a1,%0\";
2045: }")
2046:
2047: (define_insn ""
2048: [(set (match_operand:SI 0 "general_operand" "=g")
2049: (match_operand:HI 1 "address_operand" "p"))]
2050: ""
2051: "*
2052: {
2053: if (push_operand (operands[0], SImode))
2054: return \"pushaw %a1\";
2055: return \"movaw %a1,%0\";
2056: }")
2057:
2058: (define_insn ""
2059: [(set (match_operand:SI 0 "general_operand" "=g")
2060: (match_operand:SI 1 "address_operand" "p"))]
2061: ""
2062: "*
2063: {
2064: if (push_operand (operands[0], SImode))
2065: return \"pushal %a1\";
2066: return \"moval %a1,%0\";
2067: }")
2068:
2069: (define_insn ""
2070: [(set (match_operand:SI 0 "general_operand" "=g")
2071: (match_operand:SF 1 "address_operand" "p"))]
2072: ""
2073: "*
2074: {
2075: if (push_operand (operands[0], SImode))
2076: return \"pushaf %a1\";
2077: return \"movaf %a1,%0\";
2078: }")
2079:
2080: (define_insn ""
2081: [(set (match_operand:SI 0 "general_operand" "=g")
2082: (match_operand:DF 1 "address_operand" "p"))]
2083: ""
2084: "*
2085: {
2086: if (push_operand (operands[0], SImode))
2087: return \"pushad %a1\";
2088: return \"movad %a1,%0\";
2089: }")
2090:
2091: ;; Optimize extzv ...,z; andl2 ...,z
2092: ;; with other operands constant.
2093: (define_peephole
2094: [(set (match_operand:SI 0 "general_operand" "g")
2095: (zero_extract:SI (match_operand:SI 1 "general_operand" "g")
2096: (match_operand:SI 2 "general_operand" "g")
2097: (match_operand:SI 3 "general_operand" "g")))
2098: (set (match_operand:SI 4 "general_operand" "g")
2099: (and:SI (match_dup 0)
2100: (match_operand:SI 5 "general_operand" "g")))]
2101: "GET_CODE (operands[2]) == CONST_INT
2102: && GET_CODE (operands[3]) == CONST_INT
2103: && (INTVAL (operands[2]) + INTVAL (operands[3])) == 32
2104: && GET_CODE (operands[5]) == CONST_INT
2105: && dead_or_set_p (insn, operands[0])"
2106: "*
2107: {
2108: unsigned long mask = INTVAL (operands[5]);
2109: operands[3] = gen_rtx (CONST_INT, VOIDmode, -INTVAL (operands[3]));
2110:
2111: if ((floor_log2 (mask) + 1) >= INTVAL (operands[2]))
2112: mask &= ((1 << INTVAL (operands[2])) - 1);
2113:
2114: operands[5] = gen_rtx (CONST_INT, VOIDmode, ~mask);
2115: if (push_operand (operands[4], SImode))
2116: {
2117: output_asm_insn (\"rotl %3,%1,%0\", operands);
2118: return \"bicl3 %5,%0,%4\";
2119: }
2120: else
2121: {
2122: output_asm_insn (\"rotl %3,%1,%4\", operands);
2123: return \"bicl2 %5,%4\";
2124: }
2125: }")
2126:
2127: ;; Optimize andl3 x,y,z; extzv z,....,z
2128:
2129: (define_peephole
2130: [(set (match_operand:SI 0 "general_operand" "g")
2131: (and:SI (match_operand:SI 1 "general_operand" "g")
2132: (match_operand:SI 2 "general_operand" "g")))
2133: (set (match_operand 3 "general_operand" "g")
2134: (zero_extract:SI (match_dup 0)
2135: (match_operand:SI 4 "general_operand" "g")
2136: (match_operand:SI 5 "general_operand" "g")))]
2137: "GET_CODE (operands[2]) == CONST_INT
2138: && GET_CODE (operands[4]) == CONST_INT
2139: && GET_CODE (operands[5]) == CONST_INT
2140: && (INTVAL (operands[4]) + INTVAL (operands[5])) == 32
2141: && dead_or_set_p (insn, operands[0])"
2142: "*
2143: {
2144: unsigned long mask = INTVAL (operands[2]);
2145:
2146: mask &= ~((1 << INTVAL (operands[5])) - 1);
2147: operands[2] = gen_rtx (CONST_INT, VOIDmode, ~mask);
2148:
2149: operands[5] = gen_rtx (CONST_INT, VOIDmode, -INTVAL (operands[5]));
2150:
2151: if (rtx_equal_p (operands[0], operands[1]))
2152: output_asm_insn (\"bicl2 %2,%0\", operands);
2153: else
2154: output_asm_insn (\"bicl3 %2,%1,%0\", operands);
2155: return \"rotl %5,%0,%3\";
2156: }")
2157:
2158: ;;- Local variables:
2159: ;;- mode:emacs-lisp
2160: ;;- comment-start: ";;- "
2161: ;;- eval: (set-syntax-table (copy-sequence (syntax-table)))
2162: ;;- eval: (modify-syntax-entry ?[ "(]")
2163: ;;- eval: (modify-syntax-entry ?] ")[")
2164: ;;- eval: (modify-syntax-entry ?{ "(}")
2165: ;;- eval: (modify-syntax-entry ?} "){")
2166: ;;- End:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.