|
|
1.1 root 1: ;;- Machine description for GNU compiler
2: ;;- Tahoe version
3: ;; Copyright (C) 1989 Free Software Foundation, Inc.
4:
5: ;; This file is part of GNU CC.
6:
7: ;; GNU CC is free software; you can redistribute it and/or modify
8: ;; it under the terms of the GNU General Public License as published by
9: ;; the Free Software Foundation; either version 1, 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:
22: ; File: tahoe.md
23: ;
24: ; This port made at the University of Buffalo by Devon Bowen,
25: ; Dale Wiles and Kevin Zachmann.
26: ;
27: ; Mail bugs reports or fixes to: [email protected]
28:
29:
30: ; movdi must call the output_move_double routine to move it around since
31: ; the tahoe doesn't efficiently support 8 bit moves.
32:
33: (define_insn "movdi"
34: [(set (match_operand:DI 0 "general_operand" "=g")
35: (match_operand:DI 1 "general_operand" "g"))]
36: ""
37: "*
38: {
39: CC_STATUS_INIT;
40: return output_move_double (operands);
41: }")
42:
43:
44: ; The trick in the movsi is accessing the contents of the sp register. The
45: ; tahoe doesn't allow you to access it directly so you have to access the
46: ; address of the top of the stack instead.
47:
48: (define_insn "movsi"
49: [(set (match_operand:SI 0 "general_operand" "=g")
50: (match_operand:SI 1 "general_operand" "g"))]
51: ""
52: "*
53: {
54: rtx link;
55: if (operands[1] == const1_rtx
56: && (link = find_reg_note (insn, REG_WAS_0, 0))
57: && ! XEXP (link, 0)->volatil
58: && GET_CODE (XEXP (link, 0)) != NOTE
59: && no_labels_between_p (XEXP (link, 0), insn))
60: return \"incl %0\";
61: if (GET_CODE (operands[1]) == SYMBOL_REF || GET_CODE (operands[1]) == CONST)
62: {
63: if (push_operand (operands[0], SImode))
64: return \"pushab %a1\";
65: return \"movab %a1,%0\";
66: }
67: if (operands[1] == const0_rtx)
68: return \"clrl %0\";
69: if (push_operand (operands[0], SImode))
70: return \"pushl %1\";
71: if (GET_CODE (operands[1]) == REG && REGNO (operands[1]) == 14)
72: return \"moval (sp),%0\";
73: return \"movl %1,%0\";
74: }")
75:
76:
77: (define_insn "movhi"
78: [(set (match_operand:HI 0 "general_operand" "=g")
79: (match_operand:HI 1 "general_operand" "g"))]
80: ""
81: "*
82: {
83: rtx link;
84: if (operands[1] == const1_rtx
85: && (link = find_reg_note (insn, REG_WAS_0, 0))
86: && ! XEXP (link, 0)->volatil
87: && GET_CODE (XEXP (link, 0)) != NOTE
88: && no_labels_between_p (XEXP (link, 0), insn))
89: return \"incw %0\";
90: if (operands[1] == const0_rtx)
91: return \"clrw %0\";
92: return \"movw %1,%0\";
93: }")
94:
95:
96: (define_insn "movqi"
97: [(set (match_operand:QI 0 "general_operand" "=g")
98: (match_operand:QI 1 "general_operand" "g"))]
99: ""
100: "*
101: {
102: if (operands[1] == const0_rtx)
103: return \"clrb %0\";
104: return \"movb %1,%0\";
105: }")
106:
107:
108: ; movsf has three cases since they can move from one place to another
109: ; or to/from the fpp and since different instructions are needed for
110: ; each case. The fpp related instructions don't set the flags properly.
111:
112: (define_insn "movsf"
113: [(set (match_operand:SF 0 "general_operand" "=g,=a,=g")
114: (match_operand:SF 1 "general_operand" "g,g,a"))]
115: ""
116: "*
117: {
118: CC_STATUS_INIT;
119: switch (which_alternative)
120: {
121: case 0:
122: return \"movl %1,%0\";
123: case 1:
124: return \"ldf %1\";
125: case 2:
126: return \"stf %0\";
127: }
128: }")
129:
130:
131: ; movdf has a number of different cases. If it's going to or from
132: ; the fpp, use the special instructions to do it. If not, use the
133: ; output_move_double function.
134:
135: (define_insn "movdf"
136: [(set (match_operand:DF 0 "general_operand" "=a,=g,?=g")
137: (match_operand:DF 1 "general_operand" "g,a,g"))]
138: ""
139: "*
140: {
141: CC_STATUS_INIT;
142: switch (which_alternative)
143: {
144: case 0:
145: return \"ldd %1\";
146: case 1:
147: if (push_operand (operands[0], DFmode))
148: return \"pushd\";
149: else
150: return \"std %0\";
151: case 2:
152: return output_move_double (operands);
153: }
154: }")
155:
156:
157: (define_insn "addsi3"
158: [(set (match_operand:SI 0 "general_operand" "=g")
159: (plus:SI (match_operand:SI 1 "general_operand" "g")
160: (match_operand:SI 2 "general_operand" "g")))]
161: ""
162: "*
163: {
164: if (rtx_equal_p (operands[0], operands[1]))
165: {
166: if (operands[2] == const1_rtx)
167: return \"incl %0\";
168: if (GET_CODE (operands[2]) == CONST_INT
169: && INTVAL (operands[2]) == -1)
170: return \"decl %0\";
171: if (GET_CODE (operands[2]) == CONST_INT
172: && (unsigned) (- INTVAL (operands[2])) < 64)
173: return \"subl2 $%n2,%0\";
174: return \"addl2 %2,%0\";
175: }
176: if (rtx_equal_p (operands[0], operands[2]))
177: return \"addl2 %1,%0\";
178: if (GET_CODE (operands[2]) == CONST_INT
179: && GET_CODE (operands[1]) == REG)
180: {
181: if (push_operand (operands[0], SImode))
182: return \"pushab %c2(%1)\";
183: return \"movab %c2(%1),%0\";
184: }
185: if (GET_CODE (operands[2]) == CONST_INT
186: && (unsigned) (- INTVAL (operands[2])) < 64)
187: return \"subl3 $%n2,%1,%0\";
188: return \"addl3 %1,%2,%0\";
189: }")
190:
191:
192: (define_insn "addhi3"
193: [(set (match_operand:HI 0 "general_operand" "=g")
194: (plus:HI (match_operand:HI 1 "general_operand" "g")
195: (match_operand:HI 2 "general_operand" "g")))]
196: ""
197: "*
198: {
199: if (rtx_equal_p (operands[0], operands[1]))
200: {
201: if (operands[2] == const1_rtx)
202: return \"incw %0\";
203: if (GET_CODE (operands[1]) == CONST_INT
204: && INTVAL (operands[1]) == -1)
205: return \"decw %0\";
206: if (GET_CODE (operands[2]) == CONST_INT
207: && (unsigned) (- INTVAL (operands[2])) < 64)
208: return \"subw2 $%n2,%0\";
209: return \"addw2 %2,%0\";
210: }
211: if (rtx_equal_p (operands[0], operands[2]))
212: return \"addw2 %1,%0\";
213: if (GET_CODE (operands[2]) == CONST_INT
214: && (unsigned) (- INTVAL (operands[2])) < 64)
215: return \"subw3 $%n2,%1,%0\";
216: return \"addw3 %1,%2,%0\";
217: }")
218:
219:
220: (define_insn "addqi3"
221: [(set (match_operand:QI 0 "general_operand" "=g")
222: (plus:QI (match_operand:QI 1 "general_operand" "g")
223: (match_operand:QI 2 "general_operand" "g")))]
224: ""
225: "*
226: {
227: if (rtx_equal_p (operands[0], operands[1]))
228: {
229: if (operands[2] == const1_rtx)
230: return \"incb %0\";
231: if (GET_CODE (operands[1]) == CONST_INT
232: && INTVAL (operands[1]) == -1)
233: return \"decb %0\";
234: if (GET_CODE (operands[2]) == CONST_INT
235: && (unsigned) (- INTVAL (operands[2])) < 64)
236: return \"subb2 $%n2,%0\";
237: return \"addb2 %2,%0\";
238: }
239: if (rtx_equal_p (operands[0], operands[2]))
240: return \"addb2 %1,%0\";
241: if (GET_CODE (operands[2]) == CONST_INT
242: && (unsigned) (- INTVAL (operands[2])) < 64)
243: return \"subb3 $%n2,%1,%0\";
244: return \"addb3 %1,%2,%0\";
245: }")
246:
247:
248: ; addsf3 can only add into the fpp register since the fpp is treated
249: ; as a separate unit in the machine. It also doesn't set the flags at
250: ; all.
251:
252: (define_insn "addsf3"
253: [(set (match_operand:SF 0 "register_operand" "=a")
254: (plus:SF (match_operand:SF 1 "register_operand" "%0")
255: (match_operand:SF 2 "general_operand" "g")))]
256: ""
257: "*
258: {
259: CC_STATUS_INIT;
260: return \"addf %2\";
261: }")
262:
263:
264: ; adddf3 can only add into the fpp reg since the fpp is treated as a
265: ; separate entity. Doubles can only be read from a register or memory
266: ; since a double is not an immediate mode. Flags are not set by this
267: ; instruction.
268:
269: (define_insn "adddf3"
270: [(set (match_operand:DF 0 "register_operand" "=a")
271: (plus:DF (match_operand:DF 1 "register_operand" "%0")
272: (match_operand:DF 2 "general_operand" "rm")))]
273: ""
274: "*
275: {
276: CC_STATUS_INIT;
277: return \"addd %2\";
278: }")
279:
280:
281: ; Subtraction from the sp (needed by the built in alloc funtion) needs
282: ; to be different since the sp cannot be directly read on the tahoe.
283: ; If it's a simple constant, you just use displacment. Otherwise, you
284: ; push the sp, and then do the subtraction off the stack.
285:
286: (define_insn "subsi3"
287: [(set (match_operand:SI 0 "general_operand" "=g")
288: (minus:SI (match_operand:SI 1 "general_operand" "g")
289: (match_operand:SI 2 "general_operand" "g")))]
290: ""
291: "*
292: {
293: if (rtx_equal_p (operands[0], operands[1]))
294: {
295: if (operands[2] == const1_rtx)
296: return \"decl %0\";
297: if (GET_CODE (operands[0]) == REG && REGNO (operands[0]) == 14)
298: if (GET_CODE (operands[2]) == CONST_INT)
299: return \"movab %n2(sp),sp\";
300: else
301: return \"pushab (sp)\;subl3 %2,(sp),sp\";
302: return \"subl2 %2,%0\";
303: }
304: if (rtx_equal_p (operands[1], operands[2]))
305: return \"clrl %0\";
306: return \"subl3 %2,%1,%0\";
307: }")
308:
309:
310: (define_insn "subhi3"
311: [(set (match_operand:HI 0 "general_operand" "=g")
312: (minus:HI (match_operand:HI 1 "general_operand" "g")
313: (match_operand:HI 2 "general_operand" "g")))]
314: ""
315: "*
316: {
317: if (rtx_equal_p (operands[0], operands[1]))
318: {
319: if (operands[2] == const1_rtx)
320: return \"decw %0\";
321: return \"subw2 %2,%0\";
322: }
323: if (rtx_equal_p (operands[1], operands[2]))
324: return \"clrw %0\";
325: return \"subw3 %2,%1,%0\";
326: }")
327:
328:
329: (define_insn "subqi3"
330: [(set (match_operand:QI 0 "general_operand" "=g")
331: (minus:QI (match_operand:QI 1 "general_operand" "g")
332: (match_operand:QI 2 "general_operand" "g")))]
333: ""
334: "*
335: {
336: if (rtx_equal_p (operands[0], operands[1]))
337: {
338: if (operands[2] == const1_rtx)
339: return \"decb %0\";
340: return \"subb2 %2,%0\";
341: }
342: if (rtx_equal_p (operands[1], operands[2]))
343: return \"clrb %0\";
344: return \"subb3 %2,%1,%0\";
345: }")
346:
347:
348: ; subsf3 can only subtract into the fpp accumulator due to the way
349: ; the fpp reg is limited by the instruction set. This also doesn't
350: ; bother setting up flags.
351:
352: (define_insn "subsf3"
353: [(set (match_operand:SF 0 "register_operand" "=a")
354: (minus:SF (match_operand:SF 1 "register_operand" "0")
355: (match_operand:SF 2 "general_operand" "g")))]
356: ""
357: "*
358: {
359: CC_STATUS_INIT;
360: return \"subf %2\";
361: }")
362:
363:
364: ; subdf3 is set up to subtract into the fpp reg due to limitations
365: ; of the fpp instruction set. Doubles can not be immediate. This
366: ; instruction does not set the flags.
367:
368: (define_insn "subdf3"
369: [(set (match_operand:DF 0 "register_operand" "=a")
370: (minus:DF (match_operand:DF 1 "register_operand" "0")
371: (match_operand:DF 2 "general_operand" "rm")))]
372: ""
373: "*
374: {
375: CC_STATUS_INIT;
376: return \"subd %2\";
377: }")
378:
379:
380: (define_insn "mulsi3"
381: [(set (match_operand:SI 0 "general_operand" "=g")
382: (mult:SI (match_operand:SI 1 "general_operand" "g")
383: (match_operand:SI 2 "general_operand" "g")))]
384: ""
385: "*
386: {
387: if (rtx_equal_p (operands[0], operands[1]))
388: return \"mull2 %2,%0\";
389: if (rtx_equal_p (operands[0], operands[2]))
390: return \"mull2 %1,%0\";
391: return \"mull3 %1,%2,%0\";
392: }")
393:
394:
395: ; mulsf3 can only multiply into the fpp accumulator due to limitations
396: ; of the fpp. It also does not set the condition codes properly.
397:
398: (define_insn "mulsf3"
399: [(set (match_operand:SF 0 "register_operand" "=a")
400: (mult:SF (match_operand:SF 1 "register_operand" "%0")
401: (match_operand:SF 2 "general_operand" "g")))]
402: ""
403: "*
404: {
405: CC_STATUS_INIT;
406: return \"mulf %2\";
407: }")
408:
409:
410: ; muldf3 can only multiply into the fpp reg since the fpp is limited
411: ; from the rest. Doubles may not be immediate mode. This does not set
412: ; the flags like GCC would expect.
413:
414: (define_insn "muldf3"
415: [(set (match_operand:DF 0 "register_operand" "=a")
416: (mult:DF (match_operand:DF 1 "register_operand" "%0")
417: (match_operand:DF 2 "general_operand" "rm")))]
418: ""
419: "*
420: {
421: CC_STATUS_INIT;
422: return \"muld %2\";
423: }")
424:
425:
426: (define_insn "divsi3"
427: [(set (match_operand:SI 0 "general_operand" "=g")
428: (div:SI (match_operand:SI 1 "general_operand" "g")
429: (match_operand:SI 2 "general_operand" "g")))]
430: ""
431: "*
432: {
433: if (rtx_equal_p (operands[1], operands[2]))
434: return \"movl $1,%0\";
435: if (operands[1] == const0_rtx)
436: return \"clrl %0\";
437: if (GET_CODE (operands[2]) == CONST_INT
438: && INTVAL (operands[2]) == -1)
439: return \"mnegl %1,%0\";
440: if (rtx_equal_p (operands[0], operands[1]))
441: return \"divl2 %2,%0\";
442: return \"divl3 %2,%1,%0\";
443: }")
444:
445:
446: ; divsf3 must divide into the fpp accumulator. Flags are not set by
447: ; this instruction, so they are cleared.
448:
449: (define_insn "divsf3"
450: [(set (match_operand:SF 0 "register_operand" "=a")
451: (div:SF (match_operand:SF 1 "register_operand" "0")
452: (match_operand:SF 2 "general_operand" "g")))]
453: ""
454: "*
455: {
456: CC_STATUS_INIT;
457: return \"divf %2\";
458: }")
459:
460:
461: ; divdf3 also must divide into the fpp reg so optimization isn't
462: ; possible. Note that doubles cannot be immediate. The flags here
463: ; are not set correctly so they must be ignored.
464:
465: (define_insn "divdf3"
466: [(set (match_operand:DF 0 "register_operand" "=a")
467: (div:DF (match_operand:DF 1 "register_operand" "0")
468: (match_operand:DF 2 "general_operand" "rm")))]
469: ""
470: "*
471: {
472: CC_STATUS_INIT;
473: return \"divd %2\";
474: }")
475:
476:
477: (define_insn "andsi3"
478: [(set (match_operand:SI 0 "general_operand" "=g")
479: (and:SI (match_operand:SI 1 "general_operand" "g")
480: (match_operand:SI 2 "general_operand" "g")))]
481: ""
482: "andl3 %2,%1,%0")
483:
484:
485: (define_insn "andhi3"
486: [(set (match_operand:HI 0 "general_operand" "=g")
487: (and:HI (match_operand:HI 1 "general_operand" "g")
488: (match_operand:HI 2 "general_operand" "g")))]
489: ""
490: "andw3 %1,%2,%0")
491:
492:
493: (define_insn "andqi3"
494: [(set (match_operand:QI 0 "general_operand" "=g")
495: (and:QI (match_operand:QI 1 "general_operand" "g")
496: (match_operand:QI 2 "general_operand" "g")))]
497: ""
498: "andb3 %1,%2,%0")
499:
500:
501: (define_insn "iorsi3"
502: [(set (match_operand:SI 0 "general_operand" "=g")
503: (ior:SI (match_operand:SI 1 "general_operand" "g")
504: (match_operand:SI 2 "general_operand" "g")))]
505: ""
506: "orl3 %2,%1,%0")
507:
508:
509: (define_insn "iorhi3"
510: [(set (match_operand:HI 0 "general_operand" "=g")
511: (ior:HI (match_operand:HI 1 "general_operand" "g")
512: (match_operand:HI 2 "general_operand" "g")))]
513: ""
514: "orw3 %2,%1,%0")
515:
516:
517: (define_insn "iorqi3"
518: [(set (match_operand:QI 0 "general_operand" "=g")
519: (ior:QI (match_operand:QI 1 "general_operand" "g")
520: (match_operand:QI 2 "general_operand" "g")))]
521: ""
522: "orb3 %2,%1,%0")
523:
524:
525: (define_insn "xorsi3"
526: [(set (match_operand:SI 0 "general_operand" "=g")
527: (xor:SI (match_operand:SI 1 "general_operand" "g")
528: (match_operand:SI 2 "general_operand" "g")))]
529: ""
530: "xorl3 %1,%2,%0")
531:
532:
533: (define_insn "xorhi3"
534: [(set (match_operand:HI 0 "general_operand" "=g")
535: (xor:HI (match_operand:HI 1 "general_operand" "g")
536: (match_operand:HI 2 "general_operand" "g")))]
537: ""
538: "xorw3 %1,%2,%0")
539:
540:
541: (define_insn "xorqi3"
542: [(set (match_operand:QI 0 "general_operand" "=g")
543: (xor:QI (match_operand:QI 1 "general_operand" "g")
544: (match_operand:QI 2 "general_operand" "g")))]
545: ""
546: "xorb3 %1,%2,%0")
547:
548:
549: ; Shifts on the tahoe are expensive, so try to do an add instead.
550:
551: (define_insn "ashlsi3"
552: [(set (match_operand:SI 0 "general_operand" "=g")
553: (ashift:SI (match_operand:SI 1 "general_operand" "g")
554: (match_operand:QI 2 "general_operand" "g")))]
555: ""
556: "*
557: {
558: if (operands[2] == const1_rtx && rtx_equal_p (operands[0], operands[1]))
559: {
560: CC_STATUS_INIT;
561: return \"addl2 %0,%0\";
562: }
563: return \"shal %2,%1,%0\";
564: }")
565:
566:
567: (define_insn "ashrsi3"
568: [(set (match_operand:SI 0 "general_operand" "=g")
569: (ashiftrt:SI (match_operand:SI 1 "general_operand" "g")
570: (match_operand:QI 2 "general_operand" "g")))]
571: ""
572: "shar %2,%1,%0")
573:
574:
575: ; Shifts are very expensive, so try to do an add if possible.
576:
577: (define_insn "lshlsi3"
578: [(set (match_operand:SI 0 "general_operand" "=g")
579: (lshift:SI (match_operand:SI 1 "general_operand" "g")
580: (match_operand:QI 2 "general_operand" "g")))]
581: ""
582: "*
583: {
584: if (operands[2] == const1_rtx && rtx_equal_p (operands[0], operands[1]))
585: {
586: CC_STATUS_INIT;
587: return \"addl2 %0,%0\";
588: }
589: return \"shll %2,%1,%0\";
590: }")
591:
592:
593: (define_insn "lshrsi3"
594: [(set (match_operand:SI 0 "general_operand" "=g")
595: (lshiftrt:SI (match_operand:SI 1 "general_operand" "g")
596: (match_operand:QI 2 "general_operand" "g")))]
597: ""
598: "shrl %2,%1,%0")
599:
600:
601: (define_insn "negsi2"
602: [(set (match_operand:SI 0 "general_operand" "=g")
603: (neg:SI (match_operand:SI 1 "general_operand" "g")))]
604: ""
605: "mnegl %1,%0")
606:
607:
608: (define_insn "neghi2"
609: [(set (match_operand:HI 0 "general_operand" "=g")
610: (neg:HI (match_operand:HI 1 "general_operand" "g")))]
611: ""
612: "mnegw %1,%0")
613:
614:
615: (define_insn "negqi2"
616: [(set (match_operand:QI 0 "general_operand" "=g")
617: (neg:QI (match_operand:QI 1 "general_operand" "g")))]
618: ""
619: "mnegb %1,%0")
620:
621:
622: ; negsf2 can only negate the value already in the fpp accumulator.
623: ; The value remains in the fpp accumulator. No flags are set.
624:
625: (define_insn "negsf2"
626: [(set (match_operand:SF 0 "register_operand" "=a,=a")
627: (neg:SF (match_operand:SF 1 "register_operand" "a,g")))]
628: ""
629: "*
630: {
631: CC_STATUS_INIT;
632: switch (which_alternative)
633: {
634: case 0:
635: return \"negf\";
636: case 1:
637: return \"lnf %1\";
638: }
639: }")
640:
641:
642: ; negdf2 can only negate the value already in the fpp accumulator.
643: ; The value remains in the fpp accumulator. No flags are set.
644:
645: (define_insn "negdf2"
646: [(set (match_operand:DF 0 "register_operand" "=a,=a")
647: (neg:DF (match_operand:DF 1 "register_operand" "a,g")))]
648: ""
649: "*
650: {
651: CC_STATUS_INIT;
652: switch (which_alternative)
653: {
654: case 0:
655: return \"negd\";
656: case 1:
657: return \"lnd %1\";
658: }
659: }")
660:
661:
662: ; sqrtsf2 tahoe can calculate the square root of a float in the
663: ; fpp accumulator. The answer remains in the fpp accumulator. No
664: ; flags are set by this function.
665:
666: (define_insn "sqrtsf2"
667: [(set (match_operand:SF 0 "register_operand" "=a")
668: (sqrt:SF (match_operand:SF 1 "register_operand" "0")))]
669: ""
670: "*
671: {
672: CC_STATUS_INIT;
673: return \"sqrtf\";
674: }")
675:
676:
677: ; ffssi2 tahoe instruction gives one less than GCC desired result for
678: ; any given input. So the increment is necessary here.
679:
680: (define_insn "ffssi2"
681: [(set (match_operand:SI 0 "general_operand" "=g")
682: (ffs:SI (match_operand:SI 1 "general_operand" "g")))]
683: ""
684: "ffs %1,%0\;incl %0")
685:
686:
687: (define_insn "one_cmplsi2"
688: [(set (match_operand:SI 0 "general_operand" "=g")
689: (not:SI (match_operand:SI 1 "general_operand" "g")))]
690: ""
691: "mcoml %1,%0")
692:
693:
694: (define_insn "one_cmplhi2"
695: [(set (match_operand:HI 0 "general_operand" "=g")
696: (not:HI (match_operand:HI 1 "general_operand" "g")))]
697: ""
698: "mcomw %1,%0")
699:
700:
701: (define_insn "one_cmplqi2"
702: [(set (match_operand:QI 0 "general_operand" "=g")
703: (not:QI (match_operand:QI 1 "general_operand" "g")))]
704: ""
705: "mcomb %1,%0")
706:
707:
708: ; cmpsi works fine, but due to microcode problems, the tahoe doesn't
709: ; properly compare hi's and qi's. Leaving them out seems to be acceptable
710: ; to the compiler, so they were left out. Compares of the stack are
711: ; possible, though.
712:
713: ;; Put cmpsi first among compare insns so it matches two CONST_INT operands.
714:
715: (define_insn "cmpsi"
716: [(set (cc0)
717: (compare (match_operand:SI 0 "general_operand" "g")
718: (match_operand:SI 1 "general_operand" "g")))]
719: ""
720: "cmpl %0,%1")
721:
722:
723: ; cmpsf similar to vax, but first operand is expected to be in the
724: ; fpp accumulator.
725:
726: (define_insn "cmpsf"
727: [(set (cc0)
728: (compare (match_operand:SF 0 "register_operand" "a")
729: (match_operand:SF 1 "general_operand" "g")))]
730: ""
731: "cmpf %1")
732:
733:
734: ; cmpdf similar to vax, but first operand is expected to be in the
735: ; fpp accumulator. Immediate doubles not allowed.
736:
737: (define_insn "cmpdf"
738: [(set (cc0)
739: (compare (match_operand:DF 0 "register_operand" "a")
740: (match_operand:DF 1 "general_operand" "rm")))]
741: ""
742: "cmpd %1")
743:
744:
745: ;; Put tstsi first among test insns so it matches a CONST_INT operand.
746:
747: (define_insn "tstsi"
748: [(set (cc0)
749: (match_operand:SI 0 "general_operand" "g"))]
750: ""
751: "tstl %0")
752:
753:
754: ; Small tests from memory are normal, but testing from registers don't
755: ; expand the data properly. So test in this case does a convert and tests
756: ; the new register data from the stack.
757:
758: (define_insn "tsthi"
759: [(set (cc0)
760: (match_operand:HI 0 "general_operand" "m,?r"))]
761: ""
762: "*
763: {
764: switch (which_alternative)
765: {
766: case 0:
767: return \"tstw %0\";
768: case 1:
769: return \"pushl %0\;cvtwl 2(sp),(sp)\;tstl (sp)+\";
770: }
771: }")
772:
773:
774: ; Small tests from memory are normal, but testing from registers don't
775: ; expand the data properly. So test in this case does a convert and tests
776: ; the new register data from the stack.
777:
778: (define_insn "tstqi"
779: [(set (cc0)
780: (match_operand:QI 0 "general_operand" "m,?r"))]
781: ""
782: "*
783: {
784: switch (which_alternative)
785: {
786: case 0:
787: return \"tstb %0\";
788: case 1:
789: return \"pushl %0\;cvtbl 3(sp),(sp)\;tstl (sp)+\";
790: }
791: }")
792:
793:
794: ; tstsf compares a given value to a value already in the fpp accumulator.
795: ; No flags are set by this so ignore them.
796:
797: (define_insn "tstsf"
798: [(set (cc0)
799: (match_operand:SF 0 "register_operand" "a"))]
800: ""
801: "tstf")
802:
803:
804: ; tstdf compares a given value to a value already in the fpp accumulator.
805: ; immediate doubles not allowed. Flags are ignored after this.
806:
807: (define_insn "tstdf"
808: [(set (cc0)
809: (match_operand:DF 0 "register_operand" "a"))]
810: ""
811: "tstd")
812:
813:
814: ; movstrhi tahoe instruction does not load registers by itself like
815: ; the vax counterpart does. registers 0-2 must be primed by hand.
816: ; we have loaded the registers in the order: dst, src, count.
817:
818: (define_insn "movstrhi"
819: [(set (match_operand:BLK 0 "general_operand" "p")
820: (match_operand:BLK 1 "general_operand" "p"))
821: (use (match_operand:HI 2 "general_operand" "g"))
822: (clobber (reg:SI 0))
823: (clobber (reg:SI 1))
824: (clobber (reg:SI 2))]
825: ""
826: "movab %0,r1\;movab %1,r0\;movl %2,r2\;movblk")
827:
828:
829: ; floatsisf2 on tahoe converts the long from reg/mem into the fpp
830: ; accumulator. There are no hi and qi counterparts. Flags are not
831: ; set correctly here.
832:
833: (define_insn "floatsisf2"
834: [(set (match_operand:SF 0 "register_operand" "=a")
835: (float:SF (match_operand:SI 1 "general_operand" "g")))]
836: ""
837: "*
838: {
839: CC_STATUS_INIT;
840: return \"cvlf %1\";
841: }")
842:
843:
844: ; floatsidf2 on tahoe converts the long from reg/mem into the fpp
845: ; accumulator. There are no hi and qi counterparts. Flags are not
846: ; set correctly here.
847:
848: (define_insn "floatsidf2"
849: [(set (match_operand:DF 0 "register_operand" "=a")
850: (float:DF (match_operand:SI 1 "general_operand" "g")))]
851: ""
852: "*
853: {
854: CC_STATUS_INIT;
855: return \"cvld %1\";
856: }")
857:
858:
859: ; fix_truncsfsi2 to convert a float to long, tahoe must have the float
860: ; in the fpp accumulator. Flags are not set here.
861:
862: (define_insn "fix_truncsfsi2"
863: [(set (match_operand:SI 0 "general_operand" "=g")
864: (fix:SI (fix:SF (match_operand:SF 1 "register_operand" "a"))))]
865: ""
866: "*
867: {
868: CC_STATUS_INIT;
869: return \"cvfl %0\";
870: }")
871:
872:
873: ; fix_truncsfsi2 to convert a double to long, tahoe must have the double
874: ; in the fpp accumulator. Flags are not set here.
875:
876: (define_insn "fix_truncdfsi2"
877: [(set (match_operand:SI 0 "general_operand" "=g")
878: (fix:SI (fix:DF (match_operand:DF 1 "register_operand" "a"))))]
879: ""
880: "*
881: {
882: CC_STATUS_INIT;
883: return \"cvdl %0\";
884: }")
885:
886:
887: (define_insn "truncsihi2"
888: [(set (match_operand:HI 0 "general_operand" "=g")
889: (truncate:HI (match_operand:SI 1 "general_operand" "g")))]
890: ""
891: "cvtlw %1,%0")
892:
893:
894: (define_insn "truncsiqi2"
895: [(set (match_operand:QI 0 "general_operand" "=g")
896: (truncate:QI (match_operand:SI 1 "general_operand" "g")))]
897: ""
898: "cvtlb %1,%0")
899:
900:
901: (define_insn "trunchiqi2"
902: [(set (match_operand:QI 0 "general_operand" "=g")
903: (truncate:QI (match_operand:HI 1 "general_operand" "g")))]
904: ""
905: "cvtwb %1,%0")
906:
907:
908: ; The fpp related instructions don't set flags, so ignore them
909: ; after this instruction.
910:
911: (define_insn "truncdfsf2"
912: [(set (match_operand:SF 0 "register_operand" "=a")
913: (float_truncate:SF (match_operand:DF 1 "register_operand" "0")))]
914: ""
915: "*
916: {
917: CC_STATUS_INIT;
918: return \"cvdf\";
919: }")
920:
921:
922: ; This monster is to cover for the Tahoe's nasty habit of not extending
923: ; a number if the source is in a register. (It just moves it!) Case 0 is
924: ; a normal extend from memory. Case 1 does the extension from the top of
925: ; the stack. Extension from the stack doesn't set the flags right since
926: ; the moval changes them.
927:
928: (define_insn "extendhisi2"
929: [(set (match_operand:SI 0 "general_operand" "=g,?=g")
930: (sign_extend:SI (match_operand:HI 1 "general_operand" "m,r")))]
931: ""
932: "*
933: {
934: switch (which_alternative)
935: {
936: case 0:
937: return \"cvtwl %1,%0\";
938: case 1:
939: if (push_operand(operands[0], SImode))
940: return \"pushl %1\;cvtwl 2(sp),(sp)\";
941: else
942: {
943: CC_STATUS_INIT;
944: return \"pushl %1\;cvtwl 2(sp),%0\;moval 4(sp),sp\";
945: }
946: }
947: }")
948:
949:
950: ; This monster is to cover for the Tahoe's nasty habit of not extending
951: ; a number if the source is in a register. (It just moves it!) Case 0 is
952: ; a normal extend from memory. Case 1 does the extension from the top of
953: ; the stack. Extension from the stack doesn't set the flags right since
954: ; the moval changes them.
955:
956: (define_insn "extendqisi2"
957: [(set (match_operand:SI 0 "general_operand" "=g,?=g")
958: (sign_extend:SI (match_operand:QI 1 "general_operand" "m,r")))]
959: ""
960: "*
961: {
962: switch (which_alternative)
963: {
964: case 0:
965: return \"cvtbl %1,%0\";
966: case 1:
967: if (push_operand(operands[0], SImode))
968: return \"pushl %1\;cvtbl 3(sp),(sp)\";
969: else
970: {
971: CC_STATUS_INIT;
972: return \"pushl %1\;cvtbl 3(sp),%0\;moval 4(sp),sp\";
973: }
974: }
975: }")
976:
977:
978: ; This monster is to cover for the Tahoe's nasty habit of not extending
979: ; a number if the source is in a register. (It just moves it!) Case 0 is
980: ; a normal extend from memory. Case 1 does the extension from the top of
981: ; the stack. Extension from the stack doesn't set the flags right since
982: ; the moval changes them.
983:
984: (define_insn "extendqihi2"
985: [(set (match_operand:HI 0 "general_operand" "=g,?=g")
986: (sign_extend:HI (match_operand:QI 1 "general_operand" "m,r")))]
987: ""
988: "*
989: {
990: switch (which_alternative)
991: {
992: case 0:
993: return \"cvtbw %1,%0\";
994: case 1:
995: if (push_operand(operands[0], SImode))
996: return \"pushl %1\;cvtbw 3(sp),2(sp)\";
997: else {
998: CC_STATUS_INIT;
999: return \"pushl %1\;cvtbw 3(sp),%0\;moval 4(sp),sp\";
1000: }
1001: }
1002: }")
1003:
1004:
1005: ; extendsfdf2 tahoe uses the fpp accumulator to do the extension.
1006: ; It takes a float and loads it up directly as a double.
1007:
1008: (define_insn "extendsfdf2"
1009: [(set (match_operand:DF 0 "register_operand" "=a")
1010: (float_extend:DF (match_operand:SF 1 "general_operand" "g")))]
1011: ""
1012: "*
1013: {
1014: CC_STATUS_INIT;
1015: return \"ldfd %1\";
1016: }")
1017:
1018:
1019: ; movz works fine from memory but not from register for the same reasons
1020: ; the cvt instructions don't work right. So we use the normal instruction
1021: ; from memory and we use an and to simulate it from register. This is faster
1022: ; than pulling it off the stack.
1023:
1024: (define_insn "zero_extendhisi2"
1025: [(set (match_operand:SI 0 "general_operand" "=g,?=g")
1026: (zero_extend:SI (match_operand:HI 1 "general_operand" "m,r")))]
1027: ""
1028: "*
1029: {
1030: switch (which_alternative)
1031: {
1032: case 0:
1033: return \"movzwl %1,%0\";
1034: case 1:
1035: return \"andl3 $0xffff,%1,%0\";
1036: }
1037: }")
1038:
1039:
1040: ; movz works fine from memory but not from register for the same reasons
1041: ; the cvt instructions don't work right. So we use the normal instruction
1042: ; from memory and we use an and to simulate it from register. This is faster
1043: ; than pulling it off the stack.
1044:
1045: (define_insn "zero_extendqihi2"
1046: [(set (match_operand:HI 0 "general_operand" "=g,?=g")
1047: (zero_extend:HI (match_operand:QI 1 "general_operand" "m,r")))]
1048: ""
1049: "*
1050: {
1051: switch (which_alternative)
1052: {
1053: case 0:
1054: return \"movzbw %1,%0\";
1055: case 1:
1056: return \"andw3 $0xff,%1,%0\";
1057: }
1058: }")
1059:
1060:
1061: ; movz works fine from memory but not from register for the same reasons
1062: ; the cvt instructions don't work right. So we use the normal instruction
1063: ; from memory and we use an and to simulate it from register. This is faster
1064: ; than pulling it off the stack.
1065:
1066: (define_insn "zero_extendqisi2"
1067: [(set (match_operand:SI 0 "general_operand" "=g,?=g")
1068: (zero_extend:SI (match_operand:QI 1 "general_operand" "m,r")))]
1069: ""
1070: "*
1071: {
1072: switch (which_alternative)
1073: {
1074: case 0:
1075: return \"movzbl %1,%0\";
1076: case 1:
1077: return \"andl3 $0xff,%1,%0\";
1078: }
1079: }")
1080:
1081:
1082: (define_insn "beq"
1083: [(set (pc)
1084: (if_then_else (eq (cc0)
1085: (const_int 0))
1086: (label_ref (match_operand 0 "" ""))
1087: (pc)))]
1088: ""
1089: "jeql %l0")
1090:
1091:
1092: (define_insn "bne"
1093: [(set (pc)
1094: (if_then_else (ne (cc0)
1095: (const_int 0))
1096: (label_ref (match_operand 0 "" ""))
1097: (pc)))]
1098: ""
1099: "jneq %l0")
1100:
1101:
1102: (define_insn "bgt"
1103: [(set (pc)
1104: (if_then_else (gt (cc0)
1105: (const_int 0))
1106: (label_ref (match_operand 0 "" ""))
1107: (pc)))]
1108: ""
1109: "jgtr %l0")
1110:
1111:
1112: (define_insn "bgtu"
1113: [(set (pc)
1114: (if_then_else (gtu (cc0)
1115: (const_int 0))
1116: (label_ref (match_operand 0 "" ""))
1117: (pc)))]
1118: ""
1119: "jgtru %l0")
1120:
1121:
1122: (define_insn "blt"
1123: [(set (pc)
1124: (if_then_else (lt (cc0)
1125: (const_int 0))
1126: (label_ref (match_operand 0 "" ""))
1127: (pc)))]
1128: ""
1129: "jlss %l0")
1130:
1131:
1132: (define_insn "bltu"
1133: [(set (pc)
1134: (if_then_else (ltu (cc0)
1135: (const_int 0))
1136: (label_ref (match_operand 0 "" ""))
1137: (pc)))]
1138: ""
1139: "jlssu %l0")
1140:
1141:
1142: (define_insn "bge"
1143: [(set (pc)
1144: (if_then_else (ge (cc0)
1145: (const_int 0))
1146: (label_ref (match_operand 0 "" ""))
1147: (pc)))]
1148: ""
1149: "jgeq %l0")
1150:
1151:
1152: (define_insn "bgeu"
1153: [(set (pc)
1154: (if_then_else (geu (cc0)
1155: (const_int 0))
1156: (label_ref (match_operand 0 "" ""))
1157: (pc)))]
1158: ""
1159: "jgequ %l0")
1160:
1161:
1162: (define_insn "ble"
1163: [(set (pc)
1164: (if_then_else (le (cc0)
1165: (const_int 0))
1166: (label_ref (match_operand 0 "" ""))
1167: (pc)))]
1168: ""
1169: "jleq %l0")
1170:
1171:
1172: (define_insn "bleu"
1173: [(set (pc)
1174: (if_then_else (leu (cc0)
1175: (const_int 0))
1176: (label_ref (match_operand 0 "" ""))
1177: (pc)))]
1178: ""
1179: "jlequ %l0")
1180:
1181:
1182: ; GCC does not account for register mask/argc longword. Thus the number
1183: ; for the call = number bytes for args + 4
1184:
1185: (define_insn "call"
1186: [(call (match_operand:QI 0 "general_operand" "g")
1187: (match_operand:QI 1 "general_operand" "g"))]
1188: ""
1189: "*
1190: {
1191: operands[1] = gen_rtx (CONST_INT, VOIDmode, (INTVAL (operands[1]) + 4));
1192: return \"calls %1,%0\";
1193: }")
1194:
1195:
1196: ; GCC does not account for register mask/argc longword. Thus the number
1197: ; for the call = number bytes for args + 4
1198:
1199: (define_insn "call_value"
1200: [(set (match_operand 0 "" "=g")
1201: (call (match_operand:QI 1 "general_operand" "g")
1202: (match_operand:QI 2 "general_operand" "g")))]
1203: ""
1204: "*
1205: {
1206: operands[2] = gen_rtx (CONST_INT, VOIDmode, (INTVAL (operands[2]) + 4));
1207: return \"calls %2,%1\";
1208: }")
1209:
1210:
1211: (define_insn "nop"
1212: [(const_int 0)]
1213: ""
1214: "nop")
1215:
1216:
1217: (define_insn "return"
1218: [(return)]
1219: ""
1220: "ret")
1221:
1222:
1223: ; casesi, extracted from the vax code. The instructions are
1224: ; very similar. Tahoe requires that the table be word aligned. GCC
1225: ; places the table immediately after, thus the alignment directive.
1226:
1227: (define_insn "casesi"
1228: [(set (pc)
1229: (if_then_else (le (minus:SI (match_operand:SI 0 "general_operand" "g")
1230: (match_operand:SI 1 "general_operand" "g"))
1231: (match_operand:SI 2 "general_operand" "g"))
1232: (plus:SI (sign_extend:SI
1233: (mem:HI (plus:SI (pc)
1234: (minus:SI (match_dup 0)
1235: (match_dup 1)))))
1236: (label_ref:SI (match_operand 3 "" "")))
1237: (pc)))]
1238: ""
1239: "casel %0,%1,%2\;.align %@")
1240:
1241:
1242: (define_insn "jump"
1243: [(set (pc)
1244: (label_ref (match_operand 0 "" "")))]
1245: ""
1246: "jbr %l0")
1247:
1248:
1249: ;; This is the list of all the non-standard insn patterns
1250:
1251:
1252: ; This is used to access the address of a byte. This is similar to
1253: ; movqi, but the second operand had to be "address_operand" type, so
1254: ; it had to be an unnamed one.
1255:
1256: (define_insn ""
1257: [(set (match_operand:SI 0 "general_operand" "=g")
1258: (match_operand:QI 1 "address_operand" "p"))]
1259: ""
1260: "*
1261: {
1262: if (push_operand (operands[0], SImode))
1263: return \"pushab %a1\";
1264: return \"movab %a1,%0\";
1265: }")
1266:
1267: ; This is used to access the address of a word. This is similar to
1268: ; movhi, but the second operand had to be "address_operand" type, so
1269: ; it had to be an unnamed one.
1270:
1271: (define_insn ""
1272: [(set (match_operand:SI 0 "general_operand" "=g")
1273: (match_operand:HI 1 "address_operand" "p"))]
1274: ""
1275: "*
1276: {
1277: if (push_operand (operands[0], SImode))
1278: return \"pushaw %a1\";
1279: return \"movaw %a1,%0\";
1280: }")
1281:
1282: ; This is used to access the address of a long. This is similar to
1283: ; movsi, but the second operand had to be "address_operand" type, so
1284: ; it had to be an unnamed one.
1285:
1286: (define_insn ""
1287: [(set (match_operand:SI 0 "general_operand" "=g")
1288: (match_operand:SI 1 "address_operand" "p"))]
1289: ""
1290: "*
1291: {
1292: if (push_operand (operands[0], SImode))
1293: return \"pushal %a1\";
1294: return \"moval %a1,%0\";
1295: }")
1296:
1297: ; The tahoe doesn't have an 8 byte indexed move address command
1298: ; and GCC needs it. To work around it, double the index (%2) and
1299: ; then use the 4 byte indexed move address command.
1300: ;
1301: ;(define_insn ""
1302: ; [(set (match_operand:SI 0 "general_operand" "=g")
1303: ; (plus:SI (match_operand:SI 1 "general_operand" "g")
1304: ; (mult:SI (match_operand:SI 2 "register_operand" "r")
1305: ; (const_int 8))))]
1306: ; ""
1307: ; "*
1308: ;{
1309: ; if (GET_CODE (operands[0]) == REG &&
1310: ; REGNO (operands[0]) == REGNO (operands[2])) {
1311: ; return \"shll $3,%2,%2\;addl3 %1,%2,%0\";
1312: ; } else {
1313: ; return \"shll $3,%2,%2\;addl3 %1,%2,%0\;shrl $3,%2,%2\"; }
1314: ;}")
1315:
1316:
1317: ; Bit test longword instruction, same as vax.
1318:
1319: (define_insn ""
1320: [(set (cc0)
1321: (and:SI (match_operand:SI 0 "general_operand" "g")
1322: (match_operand:SI 1 "general_operand" "g")))]
1323: ""
1324: "bitl %0,%1")
1325:
1326:
1327: ; Bit test word instructions, same as vax.
1328:
1329: (define_insn ""
1330: [(set (cc0)
1331: (and:HI (match_operand:HI 0 "general_operand" "g")
1332: (match_operand:HI 1 "general_operand" "g")))]
1333: ""
1334: "bitw %0,%1")
1335:
1336:
1337: ; Bit test instructions, same as vax.
1338:
1339: (define_insn ""
1340: [(set (cc0)
1341: (and:QI (match_operand:QI 0 "general_operand" "g")
1342: (match_operand:QI 1 "general_operand" "g")))]
1343: ""
1344: "bitb %0,%1")
1345:
1346:
1347: ; bne counterpart. In case GCC reverses the conditional.
1348:
1349: (define_insn ""
1350: [(set (pc)
1351: (if_then_else (eq (cc0)
1352: (const_int 0))
1353: (pc)
1354: (label_ref (match_operand 0 "" ""))))]
1355: ""
1356: "jneq %l0")
1357:
1358:
1359: ; beq counterpart. In case GCC reverses the conditional.
1360:
1361: (define_insn ""
1362: [(set (pc)
1363: (if_then_else (ne (cc0)
1364: (const_int 0))
1365: (pc)
1366: (label_ref (match_operand 0 "" ""))))]
1367: ""
1368: "jeql %l0")
1369:
1370:
1371: ; ble counterpart. In case GCC reverses the conditional.
1372:
1373: (define_insn ""
1374: [(set (pc)
1375: (if_then_else (gt (cc0)
1376: (const_int 0))
1377: (pc)
1378: (label_ref (match_operand 0 "" ""))))]
1379: ""
1380: "jleq %l0")
1381:
1382:
1383: ; bleu counterpart. In case GCC reverses the conditional.
1384:
1385: (define_insn ""
1386: [(set (pc)
1387: (if_then_else (gtu (cc0)
1388: (const_int 0))
1389: (pc)
1390: (label_ref (match_operand 0 "" ""))))]
1391: ""
1392: "jlequ %l0")
1393:
1394:
1395: ; bge counterpart. In case GCC reverses the conditional.
1396:
1397: (define_insn ""
1398: [(set (pc)
1399: (if_then_else (lt (cc0)
1400: (const_int 0))
1401: (pc)
1402: (label_ref (match_operand 0 "" ""))))]
1403: ""
1404: "jgeq %l0")
1405:
1406:
1407: ; bgeu counterpart. In case GCC reverses the conditional.
1408:
1409: (define_insn ""
1410: [(set (pc)
1411: (if_then_else (ltu (cc0)
1412: (const_int 0))
1413: (pc)
1414: (label_ref (match_operand 0 "" ""))))]
1415: ""
1416: "jgequ %l0")
1417:
1418:
1419: ; blt counterpart. In case GCC reverses the conditional.
1420:
1421: (define_insn ""
1422: [(set (pc)
1423: (if_then_else (ge (cc0)
1424: (const_int 0))
1425: (pc)
1426: (label_ref (match_operand 0 "" ""))))]
1427: ""
1428: "jlss %l0")
1429:
1430:
1431: ; bltu counterpart. In case GCC reverses the conditional.
1432:
1433: (define_insn ""
1434: [(set (pc)
1435: (if_then_else (geu (cc0)
1436: (const_int 0))
1437: (pc)
1438: (label_ref (match_operand 0 "" ""))))]
1439: ""
1440: "jlssu %l0")
1441:
1442:
1443: ; bgt counterpart. In case GCC reverses the conditional.
1444:
1445: (define_insn ""
1446: [(set (pc)
1447: (if_then_else (le (cc0)
1448: (const_int 0))
1449: (pc)
1450: (label_ref (match_operand 0 "" ""))))]
1451: ""
1452: "jgtr %l0")
1453:
1454:
1455: ; bgtu counterpart. In case GCC reverses the conditional.
1456:
1457: (define_insn ""
1458: [(set (pc)
1459: (if_then_else (leu (cc0)
1460: (const_int 0))
1461: (pc)
1462: (label_ref (match_operand 0 "" ""))))]
1463: ""
1464: "jgtru %l0")
1465:
1466:
1467: ; casesi alternate form as found in vax code. This form is to
1468: ; compensate for the table's offset being no distance (0 displacement)
1469:
1470: (define_insn ""
1471: [(set (pc)
1472: (if_then_else (le (match_operand:SI 0 "general_operand" "g")
1473: (match_operand:SI 1 "general_operand" "g"))
1474: (plus:SI (sign_extend:SI
1475: (mem:HI (plus:SI (pc)
1476: (minus:SI (match_dup 0)
1477: (const_int 0)))))
1478: (label_ref:SI (match_operand 3 "" "")))
1479: (pc)))]
1480: ""
1481: "casel %0,$0,%1\;.align %@")
1482:
1483:
1484: ; casesi alternate form as found in vax code. Another form to
1485: ; compensate for the table's offset being no distance (0 displacement)
1486:
1487: (define_insn ""
1488: [(set (pc)
1489: (if_then_else (le (match_operand:SI 0 "general_operand" "g")
1490: (match_operand:SI 1 "general_operand" "g"))
1491: (plus:SI (sign_extend:SI
1492: (mem:HI (plus:SI (pc)
1493: (match_dup 0))))
1494: (label_ref:SI (match_operand 3 "" "")))
1495: (pc)))]
1496: ""
1497: "casel %0,$0,%1 \;.align %@")
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.