|
|
1.1.1.2 root 1: ;; Machine description for GNU compiler, Tahoe version
2: ;; Copyright (C) 1989, 1994 Free Software Foundation, Inc.
1.1 root 3:
4: ;; This file is part of GNU CC.
5:
6: ;; GNU CC is free software; you can redistribute it and/or modify
7: ;; it under the terms of the GNU General Public License as published by
8: ;; the Free Software Foundation; either version 2, or (at your option)
9: ;; any later version.
10:
11: ;; GNU CC is distributed in the hope that it will be useful,
12: ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
13: ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14: ;; GNU General Public License for more details.
15:
16: ;; You should have received a copy of the GNU General Public License
17: ;; along with GNU CC; see the file COPYING. If not, write to
1.1.1.3 ! root 18: ;; the Free Software Foundation, 59 Temple Place - Suite 330,
! 19: ;; Boston, MA 02111-1307, USA.
1.1 root 20:
21:
22: ; File: tahoe.md
23: ;
24: ; Original port made at the University of Buffalo by Devon Bowen,
25: ; Dale Wiles and Kevin Zachmann.
26: ;
27: ; Piet van Oostrum ([email protected]) made changes for HCX/UX, fixed
28: ; some bugs and made some improvements (hopefully).
29: ;
30: ; Mail bugs reports or fixes to: [email protected]
31:
32:
33: ; movdi must call the output_move_double routine to move it around since
34: ; the tahoe doesn't efficiently support 8 bit moves.
35:
36: (define_insn "movdi"
37: [(set (match_operand:DI 0 "general_operand" "=g")
38: (match_operand:DI 1 "general_operand" "g"))]
39: ""
40: "*
41: {
42: CC_STATUS_INIT;
43: return output_move_double (operands);
44: }")
45:
46:
47: ; the trick in the movsi is accessing the contents of the sp register. The
48: ; tahoe doesn't allow you to access it directly so you have to access the
49: ; address of the top of the stack instead.
50:
51: (define_insn "movsi"
52: [(set (match_operand:SI 0 "general_operand" "=g")
53: (match_operand:SI 1 "general_operand" "g"))]
54: ""
55: "*
56: {
57: rtx link;
58: if (operands[1] == const1_rtx
59: && (link = find_reg_note (insn, REG_WAS_0, 0))
60: && ! INSN_DELETED_P (XEXP (link, 0))
61: && GET_CODE (XEXP (link, 0)) != NOTE
62: && no_labels_between_p (XEXP (link, 0), insn)
63: /* Make sure the reg hasn't been clobbered. */
64: && ! reg_set_between_p (operands[0], XEXP (link, 0), insn))
65: return \"incl %0\";
66: if (GET_CODE (operands[1]) == SYMBOL_REF || GET_CODE (operands[1]) == CONST)
67: {
68: if (push_operand (operands[0], SImode))
69: return \"pushab %a1\";
70: return \"movab %a1,%0\";
71: }
72: if (operands[1] == const0_rtx)
73: return \"clrl %0\";
74: if (push_operand (operands[0], SImode))
75: return \"pushl %1\";
76: if (GET_CODE(operands[1]) == REG && REGNO(operands[1]) == 14)
77: return \"moval (sp),%0\";
78: return \"movl %1,%0\";
79: }")
80:
81:
82: (define_insn "movhi"
83: [(set (match_operand:HI 0 "general_operand" "=g")
84: (match_operand:HI 1 "general_operand" "g"))]
85: ""
86: "*
87: {
88: rtx link;
89: if (operands[1] == const1_rtx
90: && (link = find_reg_note (insn, REG_WAS_0, 0))
91: && ! INSN_DELETED_P (XEXP (link, 0))
92: && GET_CODE (XEXP (link, 0)) != NOTE
93: && no_labels_between_p (XEXP (link, 0), insn)
94: /* Make sure the reg hasn't been clobbered. */
95: && ! reg_set_between_p (operands[0], XEXP (link, 0), insn))
96: return \"incw %0\";
97: if (operands[1] == const0_rtx)
98: return \"clrw %0\";
99: return \"movw %1,%0\";
100: }")
101:
102:
103: (define_insn "movqi"
104: [(set (match_operand:QI 0 "general_operand" "=g")
105: (match_operand:QI 1 "general_operand" "g"))]
106: ""
107: "*
108: {
109: if (operands[1] == const0_rtx)
110: return \"clrb %0\";
111: return \"movb %1,%0\";
112: }")
113:
114:
115: ; movsf has three cases since they can move from one place to another
116: ; or to/from the fpp and since different instructions are needed for
117: ; each case. The fpp related instructions don't set the flags properly.
118:
119: (define_insn "movsf"
120: [(set (match_operand:SF 0 "general_operand" "=g,=a,=g")
121: (match_operand:SF 1 "general_operand" "g,g,a"))]
122: ""
123: "*
124: {
125: CC_STATUS_INIT;
126: switch (which_alternative)
127: {
128: case 0: return \"movl %1,%0\";
129: case 1: return \"ldf %1\";
130: case 2: return \"stf %0\";
131: }
132: }")
133:
134:
135: ; movdf has a number of different cases. If it's going to or from
136: ; the fpp, use the special instructions to do it. If not, use the
137: ; output_move_double function.
138:
139: (define_insn "movdf"
140: [(set (match_operand:DF 0 "general_operand" "=a,=g,?=g")
141: (match_operand:DF 1 "general_operand" "g,a,g"))]
142: ""
143: "*
144: {
145: CC_STATUS_INIT;
146: switch (which_alternative)
147: {
148: case 0:
149: return \"ldd %1\";
150: case 1:
151: if (push_operand (operands[0], DFmode))
152: return \"pushd\";
153: else
154: return \"std %0\";
155: case 2:
156: return output_move_double (operands);
157: }
158: }")
159:
160:
161: ;========================================================================
162: ; The tahoe has the following semantics for byte (and similar for word)
163: ; operands: if the operand is a register or immediate, it takes the full 32
164: ; bit operand, if the operand is memory, it sign-extends the byte. The
165: ; operation is performed on the 32 bit values. If the destination is a
166: ; register, the full 32 bit result is stored, if the destination is memory,
167: ; of course only the low part is stored. The condition code is based on the
168: ; 32 bit operation. Only on the movz instructions the byte from memory is
169: ; zero-extended rather than sign-extended.
170:
171: ; This means that for arithmetic instructions we can use addb etc. to
172: ; perform a long add from a signed byte from memory to a register. Of
173: ; course this would also work for logical operations, but that doesn't seem
174: ; very useful.
175:
176: (define_insn ""
177: [(set (match_operand:SI 0 "register_operand" "=r")
178: (plus:SI (sign_extend:SI (match_operand:QI 1 "memory_operand" "m"))
179: (sign_extend:SI (match_operand:QI 2 "memory_operand" "m"))))]
180: ""
181: "addb3 %1,%2,%0")
182:
183: (define_insn ""
184: [(set (match_operand:SI 0 "register_operand" "=r")
185: (plus:SI (match_operand:SI 1 "nonmemory_operand" "%ri")
186: (sign_extend:SI (match_operand:QI 2 "memory_operand" "m"))))]
187: ""
188: "*
189: {
190: if (rtx_equal_p (operands[0], operands[1]))
191: return \"addb2 %2,%0\";
192: return \"addb3 %1,%2,%0\";
193: }")
194:
195: ; We can also consider the result to be a half integer
196:
197: (define_insn ""
198: [(set (match_operand:HI 0 "register_operand" "=r")
199: (plus:HI (sign_extend:HI (match_operand:QI 1 "memory_operand" "m"))
200: (sign_extend:HI (match_operand:QI 2 "memory_operand" "m"))))]
201: ""
202: "addb3 %1,%2,%0")
203:
204: (define_insn ""
205: [(set (match_operand:HI 0 "register_operand" "=r")
206: (plus:HI (match_operand:HI 1 "nonmemory_operand" "%ri")
207: (sign_extend:HI (match_operand:QI 2 "memory_operand" "m"))))]
208: ""
209: "*
210: {
211: if (rtx_equal_p (operands[0], operands[1]))
212: return \"addb2 %2,%0\";
213: return \"addb3 %1,%2,%0\";
214: }")
215:
216: ; The same applies to words (HI)
217:
218: (define_insn ""
219: [(set (match_operand:SI 0 "register_operand" "=r")
220: (plus:SI (sign_extend:SI (match_operand:HI 1 "memory_operand" "m"))
221: (sign_extend:SI (match_operand:HI 2 "memory_operand" "m"))))]
222: ""
223: "addw3 %1,%2,%0")
224:
225: (define_insn ""
226: [(set (match_operand:SI 0 "register_operand" "=r")
227: (plus:SI (match_operand:SI 1 "nonmemory_operand" "%ri")
228: (sign_extend:SI (match_operand:HI 2 "memory_operand" "m"))))]
229: ""
230: "*
231: {
232: if (rtx_equal_p (operands[0], operands[1]))
233: return \"addw2 %2,%0\";
234: return \"addw3 %1,%2,%0\";
235: }")
236:
237: ; ======================= Now for subtract ==============================
238:
239: (define_insn ""
240: [(set (match_operand:SI 0 "register_operand" "=r")
241: (minus:SI (sign_extend:SI (match_operand:QI 1 "memory_operand" "m"))
242: (sign_extend:SI (match_operand:QI 2 "memory_operand" "m"))))]
243: ""
244: "subb3 %2,%1,%0")
245:
246: (define_insn ""
247: [(set (match_operand:SI 0 "register_operand" "=r")
248: (minus:SI (match_operand:SI 1 "nonmemory_operand" "ri")
249: (sign_extend:SI (match_operand:QI 2 "memory_operand" "m"))))]
250: ""
251: "*
252: {
253: if (rtx_equal_p (operands[0], operands[1]))
254: return \"subb2 %2,%0\";
255: return \"subb3 %2,%1,%0\";
256: }")
257:
258: (define_insn ""
259: [(set (match_operand:SI 0 "register_operand" "=r")
260: (minus:SI (sign_extend:SI (match_operand:QI 1 "memory_operand" "m"))
261: (match_operand:SI 2 "nonmemory_operand" "ri")))]
262: ""
263: "subb3 %2,%1,%0")
264:
265: ; We can also consider the result to be a half integer
266:
267: (define_insn ""
268: [(set (match_operand:HI 0 "register_operand" "=r")
269: (minus:HI (sign_extend:HI (match_operand:QI 1 "memory_operand" "m"))
270: (sign_extend:HI (match_operand:QI 2 "memory_operand" "m"))))]
271: ""
272: "subb3 %2,%1,%0")
273:
274: (define_insn ""
275: [(set (match_operand:HI 0 "register_operand" "=r")
276: (minus:HI (match_operand:HI 1 "nonmemory_operand" "%ri")
277: (sign_extend:HI (match_operand:QI 2 "memory_operand" "m"))))]
278: ""
279: "*
280: {
281: if (rtx_equal_p (operands[0], operands[1]))
282: return \"subb2 %2,%0\";
283: return \"subb3 %2,%1,%0\";
284: }")
285:
286: (define_insn ""
287: [(set (match_operand:HI 0 "register_operand" "=r")
288: (minus:HI (sign_extend:HI (match_operand:QI 1 "memory_operand" "m"))
289: (match_operand:HI 2 "nonmemory_operand" "ri")))]
290: ""
291: "subb3 %2,%1,%0")
292:
293: ; The same applies to words (HI)
294:
295: (define_insn ""
296: [(set (match_operand:SI 0 "register_operand" "=r")
297: (minus:SI (sign_extend:SI (match_operand:HI 1 "memory_operand" "m"))
298: (sign_extend:SI (match_operand:HI 2 "memory_operand" "m"))))]
299: ""
300: "subw3 %2,%1,%0")
301:
302: (define_insn ""
303: [(set (match_operand:SI 0 "register_operand" "=r")
304: (minus:SI (match_operand:SI 1 "nonmemory_operand" "ri")
305: (sign_extend:SI (match_operand:HI 2 "memory_operand" "m"))))]
306: ""
307: "*
308: {
309: if (rtx_equal_p (operands[0], operands[1]))
310: return \"subw2 %2,%0\";
311: return \"subw3 %2,%1,%0\";
312: }")
313:
314: (define_insn ""
315: [(set (match_operand:SI 0 "register_operand" "=r")
316: (minus:SI (sign_extend:SI (match_operand:HI 1 "memory_operand" "m"))
317: (match_operand:SI 2 "nonmemory_operand" "ri")))]
318: ""
319: "subw3 %2,%1,%0")
320:
321: ; ======================= Now for neg ==============================
322:
323: (define_insn ""
324: [(set (match_operand:SI 0 "register_operand" "=r")
325: (neg:SI (sign_extend:SI (match_operand:QI 1 "memory_operand" "m"))))]
326: ""
327: "mnegb %1,%0")
328:
329: (define_insn ""
330: [(set (match_operand:HI 0 "register_operand" "=r")
331: (neg:HI (sign_extend:HI (match_operand:QI 1 "memory_operand" "m"))))]
332: ""
333: "mnegb %1,%0")
334:
335: (define_insn ""
336: [(set (match_operand:SI 0 "register_operand" "=r")
337: (neg:SI (sign_extend:SI (match_operand:HI 1 "memory_operand" "m"))))]
338: ""
339: "mnegw %1,%0")
340:
341: ;========================================================================
342:
343:
344: (define_insn "addsi3"
345: [(set (match_operand:SI 0 "general_operand" "=g")
346: (plus:SI (match_operand:SI 1 "general_operand" "g")
347: (match_operand:SI 2 "general_operand" "g")))]
348: ""
349: "*
350: {
351: if (rtx_equal_p (operands[0], operands[1]))
352: {
353: if (operands[2] == const1_rtx)
354: return \"incl %0\";
355: if (GET_CODE (operands[2]) == CONST_INT
356: && INTVAL (operands[2]) == -1)
357: return \"decl %0\";
358: if (GET_CODE (operands[2]) == CONST_INT
359: && (unsigned) (- INTVAL (operands[2])) < 64)
360: return \"subl2 $%n2,%0\";
361: return \"addl2 %2,%0\";
362: }
363: if (rtx_equal_p (operands[0], operands[2]))
364: return \"addl2 %1,%0\";
365: if (GET_CODE (operands[2]) == CONST_INT
366: && GET_CODE (operands[1]) == REG)
367: {
368: if (push_operand (operands[0], SImode))
369: return \"pushab %c2(%1)\";
370: return \"movab %c2(%1),%0\";
371: }
372: if (GET_CODE (operands[2]) == CONST_INT
373: && (unsigned) (- INTVAL (operands[2])) < 64)
374: return \"subl3 $%n2,%1,%0\";
375: return \"addl3 %1,%2,%0\";
376: }")
377:
378:
379: (define_insn "addhi3"
380: [(set (match_operand:HI 0 "general_operand" "=g")
381: (plus:HI (match_operand:HI 1 "general_operand" "g")
382: (match_operand:HI 2 "general_operand" "g")))]
383: ""
384: "*
385: {
386: if (rtx_equal_p (operands[0], operands[1]))
387: {
388: if (operands[2] == const1_rtx)
389: return \"incw %0\";
390: if (GET_CODE (operands[2]) == CONST_INT
391: && INTVAL (operands[2]) == -1)
392: return \"decw %0\";
393: if (GET_CODE (operands[2]) == CONST_INT
394: && (unsigned) (- INTVAL (operands[2])) < 64)
395: return \"subw2 $%n2,%0\";
396: return \"addw2 %2,%0\";
397: }
398: if (rtx_equal_p (operands[0], operands[2]))
399: return \"addw2 %1,%0\";
400: if (GET_CODE (operands[2]) == CONST_INT
401: && (unsigned) (- INTVAL (operands[2])) < 64)
402: return \"subw3 $%n2,%1,%0\";
403: return \"addw3 %1,%2,%0\";
404: }")
405:
406:
407: (define_insn "addqi3"
408: [(set (match_operand:QI 0 "general_operand" "=g")
409: (plus:QI (match_operand:QI 1 "general_operand" "g")
410: (match_operand:QI 2 "general_operand" "g")))]
411: ""
412: "*
413: {
414: if (rtx_equal_p (operands[0], operands[1]))
415: {
416: if (operands[2] == const1_rtx)
417: return \"incb %0\";
418: if (GET_CODE (operands[2]) == CONST_INT
419: && INTVAL (operands[2]) == -1)
420: return \"decb %0\";
421: if (GET_CODE (operands[2]) == CONST_INT
422: && (unsigned) (- INTVAL (operands[2])) < 64)
423: return \"subb2 $%n2,%0\";
424: return \"addb2 %2,%0\";
425: }
426: if (rtx_equal_p (operands[0], operands[2]))
427: return \"addb2 %1,%0\";
428: if (GET_CODE (operands[2]) == CONST_INT
429: && (unsigned) (- INTVAL (operands[2])) < 64)
430: return \"subb3 $%n2,%1,%0\";
431: return \"addb3 %1,%2,%0\";
432: }")
433:
434: ; addsf3 can only add into the fpp register since the fpp is treated
435: ; as a separate unit in the machine. It also doesn't set the flags at
436: ; all.
437:
438: (define_insn "addsf3"
439: [(set (match_operand:SF 0 "register_operand" "=a")
440: (plus:SF (match_operand:SF 1 "register_operand" "%0")
441: (match_operand:SF 2 "general_operand" "g")))]
442: ""
443: "*
444: {
445: CC_STATUS_INIT;
446: return \"addf %2\";
447: }")
448:
449:
450: ; adddf3 can only add into the fpp reg since the fpp is treated as a
451: ; separate entity. Doubles can only be read from a register or memory
452: ; since a double is not an immediate mode. Flags are not set by this
453: ; instruction.
454:
455: (define_insn "adddf3"
456: [(set (match_operand:DF 0 "register_operand" "=a")
457: (plus:DF (match_operand:DF 1 "register_operand" "%0")
458: (match_operand:DF 2 "general_operand" "rm")))]
459: ""
460: "*
461: {
462: CC_STATUS_INIT;
463: return \"addd %2\";
464: }")
465:
466:
467: ; Subtraction from the sp (needed by the built in alloc function) needs
468: ; to be different since the sp cannot be directly read on the tahoe.
469: ; If it's a simple constant, you just use displacement. Otherwise, you
470: ; push the sp, and then do the subtraction off the stack.
471:
472: (define_insn "subsi3"
473: [(set (match_operand:SI 0 "general_operand" "=g")
474: (minus:SI (match_operand:SI 1 "general_operand" "g")
475: (match_operand:SI 2 "general_operand" "g")))]
476: ""
477: "*
478: {
479: if (rtx_equal_p (operands[0], operands[1]))
480: {
481: if (operands[2] == const1_rtx)
482: return \"decl %0\";
483: if (GET_CODE(operands[0]) == REG && REGNO(operands[0]) == 14)
484: {
485: if (GET_CODE(operands[2]) == CONST_INT)
486: return \"movab %n2(sp),sp\";
487: else
488: return \"pushab (sp)\;subl3 %2,(sp),sp\";
489: }
490: return \"subl2 %2,%0\";
491: }
492: if (rtx_equal_p (operands[1], operands[2]))
493: return \"clrl %0\";
494: return \"subl3 %2,%1,%0\";
495: }")
496:
497:
498: (define_insn "subhi3"
499: [(set (match_operand:HI 0 "general_operand" "=g")
500: (minus:HI (match_operand:HI 1 "general_operand" "g")
501: (match_operand:HI 2 "general_operand" "g")))]
502: ""
503: "*
504: {
505: if (rtx_equal_p (operands[0], operands[1]))
506: {
507: if (operands[2] == const1_rtx)
508: return \"decw %0\";
509: return \"subw2 %2,%0\";
510: }
511: if (rtx_equal_p (operands[1], operands[2]))
512: return \"clrw %0\";
513: return \"subw3 %2,%1,%0\";
514: }")
515:
516:
517: (define_insn "subqi3"
518: [(set (match_operand:QI 0 "general_operand" "=g")
519: (minus:QI (match_operand:QI 1 "general_operand" "g")
520: (match_operand:QI 2 "general_operand" "g")))]
521: ""
522: "*
523: {
524: if (rtx_equal_p (operands[0], operands[1]))
525: {
526: if (operands[2] == const1_rtx)
527: return \"decb %0\";
528: return \"subb2 %2,%0\";
529: }
530: if (rtx_equal_p (operands[1], operands[2]))
531: return \"clrb %0\";
532: return \"subb3 %2,%1,%0\";
533: }")
534:
535:
536: ; subsf3 can only subtract into the fpp accumulator due to the way
537: ; the fpp reg is limited by the instruction set. This also doesn't
538: ; bother setting up flags.
539:
540: (define_insn "subsf3"
541: [(set (match_operand:SF 0 "register_operand" "=a")
542: (minus:SF (match_operand:SF 1 "register_operand" "0")
543: (match_operand:SF 2 "general_operand" "g")))]
544: ""
545: "*
546: {
547: CC_STATUS_INIT;
548: return \"subf %2\";
549: }")
550:
551:
552: ; subdf3 is set up to subtract into the fpp reg due to limitations
553: ; of the fpp instruction set. Doubles can not be immediate. This
554: ; instruction does not set the flags.
555:
556: (define_insn "subdf3"
557: [(set (match_operand:DF 0 "register_operand" "=a")
558: (minus:DF (match_operand:DF 1 "register_operand" "0")
559: (match_operand:DF 2 "general_operand" "rm")))]
560: ""
561: "*
562: {
563: CC_STATUS_INIT;
564: return \"subd %2\";
565: }")
566:
567:
568: (define_insn "mulsi3"
569: [(set (match_operand:SI 0 "general_operand" "=g")
570: (mult:SI (match_operand:SI 1 "general_operand" "g")
571: (match_operand:SI 2 "general_operand" "g")))]
572: ""
573: "*
574: {
575: if (rtx_equal_p (operands[0], operands[1]))
576: return \"mull2 %2,%0\";
577: if (rtx_equal_p (operands[0], operands[2]))
578: return \"mull2 %1,%0\";
579: return \"mull3 %1,%2,%0\";
580: }")
581:
582:
583: ; mulsf3 can only multiply into the fpp accumulator due to limitations
584: ; of the fpp. It also does not set the condition codes properly.
585:
586: (define_insn "mulsf3"
587: [(set (match_operand:SF 0 "register_operand" "=a")
588: (mult:SF (match_operand:SF 1 "register_operand" "%0")
589: (match_operand:SF 2 "general_operand" "g")))]
590: ""
591: "*
592: {
593: CC_STATUS_INIT;
594: return \"mulf %2\";
595: }")
596:
597:
598: ; muldf3 can only multiply into the fpp reg since the fpp is limited
599: ; from the rest. Doubles may not be immediate mode. This does not set
600: ; the flags like gcc would expect.
601:
602: (define_insn "muldf3"
603: [(set (match_operand:DF 0 "register_operand" "=a")
604: (mult:DF (match_operand:DF 1 "register_operand" "%0")
605: (match_operand:DF 2 "general_operand" "rm")))]
606: ""
607: "*
608: {
609: CC_STATUS_INIT;
610: return \"muld %2\";
611: }")
612:
613:
614:
615: (define_insn "divsi3"
616: [(set (match_operand:SI 0 "general_operand" "=g")
617: (div:SI (match_operand:SI 1 "general_operand" "g")
618: (match_operand:SI 2 "general_operand" "g")))]
619: ""
620: "*
621: {
622: if (rtx_equal_p (operands[1], operands[2]))
623: return \"movl $1,%0\";
624: if (operands[1] == const0_rtx)
625: return \"clrl %0\";
626: if (GET_CODE (operands[2]) == CONST_INT
627: && INTVAL (operands[2]) == -1)
628: return \"mnegl %1,%0\";
629: if (rtx_equal_p (operands[0], operands[1]))
630: return \"divl2 %2,%0\";
631: return \"divl3 %2,%1,%0\";
632: }")
633:
634:
635: ; divsf3 must divide into the fpp accumulator. Flags are not set by
636: ; this instruction, so they are cleared.
637:
638: (define_insn "divsf3"
639: [(set (match_operand:SF 0 "register_operand" "=a")
640: (div:SF (match_operand:SF 1 "register_operand" "0")
641: (match_operand:SF 2 "general_operand" "g")))]
642: ""
643: "*
644: {
645: CC_STATUS_INIT;
646: return \"divf %2\";
647: }")
648:
649:
650: ; divdf3 also must divide into the fpp reg so optimization isn't
651: ; possible. Note that doubles cannot be immediate. The flags here
652: ; are not set correctly so they must be ignored.
653:
654: (define_insn "divdf3"
655: [(set (match_operand:DF 0 "register_operand" "=a")
656: (div:DF (match_operand:DF 1 "register_operand" "0")
657: (match_operand:DF 2 "general_operand" "rm")))]
658: ""
659: "*
660: {
661: CC_STATUS_INIT;
662: return \"divd %2\";
663: }")
664:
665:
666:
667: (define_insn "andsi3"
668: [(set (match_operand:SI 0 "general_operand" "=g")
669: (and:SI (match_operand:SI 1 "general_operand" "g")
670: (match_operand:SI 2 "general_operand" "g")))]
671: ""
672: "*
673: {
674: if (rtx_equal_p (operands[0], operands[1]))
675: return \"andl2 %2,%0\";
676: if (rtx_equal_p (operands[0], operands[2]))
677: return \"andl2 %1,%0\";
678: return \"andl3 %2,%1,%0\";
679: }")
680:
681:
682:
683: (define_insn "andhi3"
684: [(set (match_operand:HI 0 "general_operand" "=g")
685: (and:HI (match_operand:HI 1 "general_operand" "g")
686: (match_operand:HI 2 "general_operand" "g")))]
687: ""
688: "*
689: {
690: if (rtx_equal_p (operands[0], operands[1]))
691: return \"andw2 %2,%0\";
692: if (rtx_equal_p (operands[0], operands[2]))
693: return \"andw2 %1,%0\";
694: return \"andw3 %2,%1,%0\";
695: }")
696:
697:
698: (define_insn "andqi3"
699: [(set (match_operand:QI 0 "general_operand" "=g")
700: (and:QI (match_operand:QI 1 "general_operand" "g")
701: (match_operand:QI 2 "general_operand" "g")))]
702: ""
703: "*
704: {
705: if (rtx_equal_p (operands[0], operands[1]))
706: return \"andb2 %2,%0\";
707: if (rtx_equal_p (operands[0], operands[2]))
708: return \"andb2 %1,%0\";
709: return \"andb3 %2,%1,%0\";
710: }")
711:
712:
713: (define_insn "iorsi3"
714: [(set (match_operand:SI 0 "general_operand" "=g")
715: (ior:SI (match_operand:SI 1 "general_operand" "g")
716: (match_operand:SI 2 "general_operand" "g")))]
717: ""
718: "*
719: {
720: if (rtx_equal_p (operands[0], operands[1]))
721: return \"orl2 %2,%0\";
722: if (rtx_equal_p (operands[0], operands[2]))
723: return \"orl2 %1,%0\";
724: return \"orl3 %2,%1,%0\";
725: }")
726:
727:
728:
729: (define_insn "iorhi3"
730: [(set (match_operand:HI 0 "general_operand" "=g")
731: (ior:HI (match_operand:HI 1 "general_operand" "g")
732: (match_operand:HI 2 "general_operand" "g")))]
733: ""
734: "*
735: {
736: if (rtx_equal_p (operands[0], operands[1]))
737: return \"orw2 %2,%0\";
738: if (rtx_equal_p (operands[0], operands[2]))
739: return \"orw2 %1,%0\";
740: return \"orw3 %2,%1,%0\";
741: }")
742:
743:
744:
745: (define_insn "iorqi3"
746: [(set (match_operand:QI 0 "general_operand" "=g")
747: (ior:QI (match_operand:QI 1 "general_operand" "g")
748: (match_operand:QI 2 "general_operand" "g")))]
749: ""
750: "*
751: {
752: if (rtx_equal_p (operands[0], operands[1]))
753: return \"orb2 %2,%0\";
754: if (rtx_equal_p (operands[0], operands[2]))
755: return \"orb2 %1,%0\";
756: return \"orb3 %2,%1,%0\";
757: }")
758:
759:
760: (define_insn "xorsi3"
761: [(set (match_operand:SI 0 "general_operand" "=g")
762: (xor: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 \"xorl2 %2,%0\";
769: if (rtx_equal_p (operands[0], operands[2]))
770: return \"xorl2 %1,%0\";
771: return \"xorl3 %2,%1,%0\";
772: }")
773:
774:
775: (define_insn "xorhi3"
776: [(set (match_operand:HI 0 "general_operand" "=g")
777: (xor:HI (match_operand:HI 1 "general_operand" "g")
778: (match_operand:HI 2 "general_operand" "g")))]
779: ""
780: "*
781: {
782: if (rtx_equal_p (operands[0], operands[1]))
783: return \"xorw2 %2,%0\";
784: if (rtx_equal_p (operands[0], operands[2]))
785: return \"xorw2 %1,%0\";
786: return \"xorw3 %2,%1,%0\";
787: }")
788:
789:
790: (define_insn "xorqi3"
791: [(set (match_operand:QI 0 "general_operand" "=g")
792: (xor:QI (match_operand:QI 1 "general_operand" "g")
793: (match_operand:QI 2 "general_operand" "g")))]
794: ""
795: "*
796: {
797: if (rtx_equal_p (operands[0], operands[1]))
798: return \"xorb2 %2,%0\";
799: if (rtx_equal_p (operands[0], operands[2]))
800: return \"xorb2 %1,%0\";
801: return \"xorb3 %2,%1,%0\";
802: }")
803:
804:
805: ; shifts on the tahoe are expensive, try some magic first...
806:
807: (define_insn "ashlsi3"
808: [(set (match_operand:SI 0 "general_operand" "=g")
809: (ashift:SI (match_operand:SI 1 "general_operand" "g")
810: (match_operand:QI 2 "general_operand" "g")))]
811: ""
812: "*
813: {
814: if (GET_CODE(operands[2]) == REG)
815: return \"mull3 ___shtab[%2],%1,%0\";
816: /* if (GET_CODE(operands[2]) == REG)
817: if (rtx_equal_p (operands[0], operands[1]))
818: return \"mull2 ___shtab[%2],%1\";
819: else
820: return \"mull3 ___shtab[%2],%1,%0\"; */
821: if (GET_CODE(operands[1]) == REG)
822: {
823: if (operands[2] == const1_rtx)
824: {
825: CC_STATUS_INIT;
826: return \"movaw 0[%1],%0\";
827: }
828: if (GET_CODE(operands[2]) == CONST_INT && INTVAL(operands[2]) == 2)
829: {
830: CC_STATUS_INIT;
831: return \"moval 0[%1],%0\";
832: }
833: }
834: if (GET_CODE(operands[2]) != CONST_INT || INTVAL(operands[2]) == 1)
835: return \"shal %2,%1,%0\";
836: if (rtx_equal_p (operands[0], operands[1]))
837: return \"mull2 %s2,%1\";
838: else
839: return \"mull3 %s2,%1,%0\";
840: }")
841:
842:
843: (define_insn "ashrsi3"
844: [(set (match_operand:SI 0 "general_operand" "=g")
845: (ashiftrt:SI (match_operand:SI 1 "general_operand" "g")
846: (match_operand:QI 2 "general_operand" "g")))]
847: ""
848: "shar %2,%1,%0")
849:
850:
851: ; shifts are very expensive, try some magic first...
852:
853: (define_insn "lshrsi3"
854: [(set (match_operand:SI 0 "general_operand" "=g")
855: (lshiftrt:SI (match_operand:SI 1 "general_operand" "g")
856: (match_operand:QI 2 "general_operand" "g")))]
857: ""
858: "shrl %2,%1,%0")
859:
860:
861: (define_insn "negsi2"
862: [(set (match_operand:SI 0 "general_operand" "=g")
863: (neg:SI (match_operand:SI 1 "general_operand" "g")))]
864: ""
865: "mnegl %1,%0")
866:
867:
868: (define_insn "neghi2"
869: [(set (match_operand:HI 0 "general_operand" "=g")
870: (neg:HI (match_operand:HI 1 "general_operand" "g")))]
871: ""
872: "mnegw %1,%0")
873:
874:
875: (define_insn "negqi2"
876: [(set (match_operand:QI 0 "general_operand" "=g")
877: (neg:QI (match_operand:QI 1 "general_operand" "g")))]
878: ""
879: "mnegb %1,%0")
880:
881:
882: ; negsf2 can only negate the value already in the fpp accumulator.
883: ; The value remains in the fpp accumulator. No flags are set.
884:
885: (define_insn "negsf2"
886: [(set (match_operand:SF 0 "register_operand" "=a,=a")
887: (neg:SF (match_operand:SF 1 "register_operand" "a,g")))]
888: ""
889: "*
890: {
891: CC_STATUS_INIT;
892: switch (which_alternative)
893: {
894: case 0: return \"negf\";
895: case 1: return \"lnf %1\";
896: }
897: }")
898:
899:
900: ; negdf2 can only negate the value already in the fpp accumulator.
901: ; The value remains in the fpp accumulator. No flags are set.
902:
903: (define_insn "negdf2"
904: [(set (match_operand:DF 0 "register_operand" "=a,=a")
905: (neg:DF (match_operand:DF 1 "register_operand" "a,g")))]
906: ""
907: "*
908: {
909: CC_STATUS_INIT;
910: switch (which_alternative)
911: {
912: case 0: return \"negd\";
913: case 1: return \"lnd %1\";
914: }
915: }")
916:
917:
918: ; sqrtsf2 tahoe can calculate the square root of a float in the
919: ; fpp accumulator. The answer remains in the fpp accumulator. No
920: ; flags are set by this function.
921:
922: (define_insn "sqrtsf2"
923: [(set (match_operand:SF 0 "register_operand" "=a")
924: (sqrt:SF (match_operand:SF 1 "register_operand" "0")))]
925: ""
926: "*
927: {
928: CC_STATUS_INIT;
929: return \"sqrtf\";
930: }")
931:
932:
933: ; ffssi2 tahoe instruction gives one less than gcc desired result for
934: ; any given input. So the increment is necessary here.
935:
936: (define_insn "ffssi2"
937: [(set (match_operand:SI 0 "general_operand" "=g")
938: (ffs:SI (match_operand:SI 1 "general_operand" "g")))]
939: ""
940: "*
941: {
942: if (push_operand(operands[0], SImode))
943: return \"ffs %1,%0\;incl (sp)\";
944: return \"ffs %1,%0\;incl %0\";
945: }")
946:
947:
948: (define_insn "one_cmplsi2"
949: [(set (match_operand:SI 0 "general_operand" "=g")
950: (not:SI (match_operand:SI 1 "general_operand" "g")))]
951: ""
952: "mcoml %1,%0")
953:
954:
955: (define_insn "one_cmplhi2"
956: [(set (match_operand:HI 0 "general_operand" "=g")
957: (not:HI (match_operand:HI 1 "general_operand" "g")))]
958: ""
959: "mcomw %1,%0")
960:
961:
962: (define_insn "one_cmplqi2"
963: [(set (match_operand:QI 0 "general_operand" "=g")
964: (not:QI (match_operand:QI 1 "general_operand" "g")))]
965: ""
966: "mcomb %1,%0")
967:
968:
969: ; cmpsi works fine, but due to microcode problems, the tahoe doesn't
970: ; properly compare hi's and qi's. Leaving them out seems to be acceptable
971: ; to the compiler, so they were left out. Compares of the stack are
972: ; possible, though.
973:
974: ; There are optimized cases possible, however. These follow first.
975:
976: (define_insn ""
977: [(set (cc0)
978: (compare (sign_extend:SI (match_operand:HI 0 "memory_operand" "m"))
979: (sign_extend:SI (match_operand:HI 1 "memory_operand" "m"))))]
980: ""
981: "cmpw %0,%1")
982:
983: (define_insn ""
984: [(set (cc0)
985: (compare (match_operand:SI 0 "nonmemory_operand" "ri")
986: (sign_extend:SI (match_operand:HI 1 "memory_operand" "m"))))]
987: ""
988: "cmpw %0,%1")
989:
990: (define_insn ""
991: [(set (cc0)
992: (compare (sign_extend:SI (match_operand:HI 0 "memory_operand" "m"))
993: (match_operand:SI 1 "nonmemory_operand" "ri")))]
994: ""
995: "cmpw %0,%1")
996:
997: ; zero-extended compares give the same result as sign-extended compares, if
998: ; the compare is unsigned. Just see: if both operands are <65536 they are the
999: ; same in both cases. If both are >=65536 the you effectively compare x+D
1000: ; with y+D, where D=2**32-2**16, so the result is the same. if x<65536 and
1001: ; y>=65536 then you compare x with y+D, and in both cases the result is x<y.
1002:
1003: (define_insn ""
1004: [(set (cc0)
1005: (compare (zero_extend:SI (match_operand:HI 0 "memory_operand" "m"))
1006: (zero_extend:SI (match_operand:HI 1 "memory_operand" "m"))))]
1007: "tahoe_cmp_check (insn, operands[0], 0)"
1008: "cmpw %0,%1")
1009:
1010: (define_insn ""
1011: [(set (cc0)
1012: (compare (zero_extend:SI (match_operand:HI 0 "memory_operand" "m"))
1013: (match_operand:SI 1 "immediate_operand" "i")))]
1014: "tahoe_cmp_check(insn, operands[1], 65535)"
1015: "*
1016: {
1017: if (INTVAL (operands[1]) > 32767)
1018: operands[1] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[1]) + 0xffff0000);
1019: return \"cmpw %0,%1\";
1020: }")
1021:
1022:
1023: (define_insn ""
1024: [(set (cc0)
1025: (compare (sign_extend:SI (match_operand:QI 0 "memory_operand" "m"))
1026: (sign_extend:SI (match_operand:QI 1 "memory_operand" "m"))))]
1027: ""
1028: "cmpb %0,%1")
1029:
1030: (define_insn ""
1031: [(set (cc0)
1032: (compare (match_operand:SI 0 "nonmemory_operand" "ri")
1033: (sign_extend:SI (match_operand:QI 1 "memory_operand" "m"))))]
1034: ""
1035: "cmpb %0,%1")
1036:
1037: (define_insn ""
1038: [(set (cc0)
1039: (compare (sign_extend:SI (match_operand:QI 0 "memory_operand" "m"))
1040: (match_operand:SI 1 "nonmemory_operand" "ri")))]
1041: ""
1042: "cmpb %0,%1")
1043:
1044: ; zero-extended compares give the same result as sign-extended compares, if
1045: ; the compare is unsigned. Just see: if both operands are <128 they are the
1046: ; same in both cases. If both are >=128 the you effectively compare x+D
1047: ; with y+D, where D=2**32-2**8, so the result is the same. if x<128 and
1048: ; y>=128 then you compare x with y+D, and in both cases the result is x<y.
1049:
1050: (define_insn ""
1051: [(set (cc0)
1052: (compare (zero_extend:SI (match_operand:QI 0 "memory_operand" "m"))
1053: (zero_extend:SI (match_operand:QI 1 "memory_operand" "m"))))]
1054: "tahoe_cmp_check (insn, operands[0], 0)"
1055: "cmpb %0,%1")
1056:
1057: (define_insn ""
1058: [(set (cc0)
1059: (compare (zero_extend:SI (match_operand:QI 0 "memory_operand" "m"))
1060: (match_operand:SI 1 "immediate_operand" "i")))]
1061: "tahoe_cmp_check(insn, operands[1], 255)"
1062: "*
1063: {
1064: if (INTVAL (operands[1]) > 127)
1065: operands[1] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[1]) + 0xffffff00);
1066: return \"cmpb %0,%1\";
1067: }")
1068:
1069:
1070: (define_insn "cmpsi"
1071: [(set (cc0)
1072: (compare (match_operand:SI 0 "nonimmediate_operand" "g")
1073: (match_operand:SI 1 "general_operand" "g")))]
1074: ""
1075: "cmpl %0,%1")
1076:
1077:
1078: ; cmpsf similar to vax, but first operand is expected to be in the
1079: ; fpp accumulator.
1080:
1081: (define_insn "cmpsf"
1082: [(set (cc0)
1083: (compare (match_operand:SF 0 "general_operand" "a,g")
1084: (match_operand:SF 1 "general_operand" "g,g")))]
1085: ""
1086: "*
1087: {
1088: switch (which_alternative)
1089: {
1090: case 0: return \"cmpf %1\";
1091: case 1: return \"cmpf2 %0,%1\";
1092: }
1093: }")
1094:
1095:
1096: ; cmpdf similar to vax, but first operand is expected to be in the
1097: ; fpp accumulator. Immediate doubles not allowed.
1098:
1099: (define_insn "cmpdf"
1100: [(set (cc0)
1101: (compare (match_operand:DF 0 "general_operand" "a,rm")
1102: (match_operand:DF 1 "general_operand" "rm,rm")))]
1103: ""
1104: "*
1105: {
1106: switch (which_alternative)
1107: {
1108: case 0: return \"cmpd %1\";
1109: case 1: return \"cmpd2 %0,%1\";
1110: }
1111: }")
1112:
1113: ;; We don't want to allow a constant operand for test insns because
1114: ;; (set (cc0) (const_int foo)) has no mode information. Such insns will
1115: ;; be folded while optimizing anyway.
1116:
1117: (define_insn "tstsi"
1118: [(set (cc0)
1119: (match_operand:SI 0 "nonimmediate_operand" "g"))]
1120: ""
1121: "tstl %0")
1122:
1123:
1124: ; small tests from memory are normal, but testing from registers doesn't
1125: ; expand the data properly. So test in this case does a convert and tests
1126: ; the new register data from the stack.
1127:
1128: ; First some special cases that do work
1129:
1130:
1131: (define_insn ""
1132: [(set (cc0)
1133: (sign_extend:SI (match_operand:HI 0 "memory_operand" "m")))]
1134: ""
1135: "tstw %0")
1136:
1137: (define_insn ""
1138: [(set (cc0)
1139: (zero_extend:SI (match_operand:HI 0 "memory_operand" "m")))]
1140: "tahoe_cmp_check (insn, operands[0], 0)"
1141: "tstw %0")
1142:
1143:
1144: (define_insn "tsthi"
1145: [(set (cc0)
1146: (match_operand:HI 0 "extendable_operand" "m,!r"))]
1147: "GET_MODE (operands[0]) != VOIDmode"
1148: "*
1149: {
1150: rtx xoperands[2];
1151: extern rtx tahoe_reg_conversion_loc;
1152: switch (which_alternative)
1153: {
1154: case 0:
1155: return \"tstw %0\";
1156: case 1:
1157: xoperands[0] = operands[0];
1158: xoperands[1] = tahoe_reg_conversion_loc;
1159: output_asm_insn (\"movl %0,%1\", xoperands);
1160: xoperands[1] = plus_constant (XEXP (tahoe_reg_conversion_loc, 0), 2);
1161: output_asm_insn (\"tstw %a1\", xoperands);
1162: return \"\";
1163: }
1164: }")
1165:
1166:
1167: (define_insn ""
1168: [(set (cc0)
1169: (sign_extend:SI (match_operand:QI 0 "memory_operand" "m")))]
1170: ""
1171: "tstb %0")
1172:
1173: (define_insn ""
1174: [(set (cc0)
1175: (zero_extend:SI (match_operand:QI 0 "memory_operand" "m")))]
1176: "tahoe_cmp_check (insn, operands[0], 0)"
1177: "tstb %0")
1178:
1179:
1180: (define_insn "tstqi"
1181: [(set (cc0)
1182: (match_operand:QI 0 "extendable_operand" "m,!r"))]
1183: "GET_MODE (operands[0]) != VOIDmode"
1184: "*
1185: {
1186: rtx xoperands[2];
1187: extern rtx tahoe_reg_conversion_loc;
1188: switch (which_alternative)
1189: {
1190: case 0:
1191: return \"tstb %0\";
1192: case 1:
1193: xoperands[0] = operands[0];
1194: xoperands[1] = tahoe_reg_conversion_loc;
1195: output_asm_insn (\"movl %0,%1\", xoperands);
1196: xoperands[1] = plus_constant (XEXP (tahoe_reg_conversion_loc, 0), 3);
1197: output_asm_insn (\"tstb %a1\", xoperands);
1198: return \"\";
1199: }
1200: }")
1201:
1202: ; tstsf compares a given value to a value already in the fpp accumulator.
1203: ; No flags are set by this so ignore them.
1204:
1205: (define_insn "tstsf"
1206: [(set (cc0)
1207: (match_operand:SF 0 "register_operand" "a"))]
1208: ""
1209: "tstf")
1210:
1211:
1212: ; tstdf compares a given value to a value already in the fpp accumulator.
1213: ; immediate doubles not allowed. Flags are ignored after this.
1214:
1215: (define_insn "tstdf"
1216: [(set (cc0)
1217: (match_operand:DF 0 "register_operand" "a"))]
1218: ""
1219: "tstd")
1220:
1221:
1222:
1223: ; movstrhi tahoe instruction does not load registers by itself like
1224: ; the vax counterpart does. registers 0-2 must be primed by hand.
1225: ; we have loaded the registers in the order: dst, src, count.
1226:
1227: (define_insn "movstrhi"
1228: [(set (match_operand:BLK 0 "general_operand" "p")
1229: (match_operand:BLK 1 "general_operand" "p"))
1230: (use (match_operand:HI 2 "general_operand" "g"))
1231: (clobber (reg:SI 0))
1232: (clobber (reg:SI 1))
1233: (clobber (reg:SI 2))]
1234: ""
1235: "movab %0,r1\;movab %1,r0\;movl %2,r2\;movblk")
1236:
1237:
1238: ; floatsisf2 on tahoe converts the long from reg/mem into the fpp
1239: ; accumulator. There are no hi and qi counterparts. Flags are not
1240: ; set correctly here.
1241:
1242: (define_insn "floatsisf2"
1243: [(set (match_operand:SF 0 "register_operand" "=a")
1244: (float:SF (match_operand:SI 1 "general_operand" "g")))]
1245: ""
1246: "*
1247: {
1248: CC_STATUS_INIT;
1249: return \"cvlf %1\";
1250: }")
1251:
1252:
1253: ; floatsidf2 on tahoe converts the long from reg/mem into the fpp
1254: ; accumulator. There are no hi and qi counterparts. Flags are not
1255: ; set correctly here.
1256:
1257: (define_insn "floatsidf2"
1258: [(set (match_operand:DF 0 "register_operand" "=a")
1259: (float:DF (match_operand:SI 1 "general_operand" "g")))]
1260: ""
1261: "*
1262: {
1263: CC_STATUS_INIT;
1264: return \"cvld %1\";
1265: }")
1266:
1267:
1268: ; fix_truncsfsi2 to convert a float to long, tahoe must have the float
1269: ; in the fpp accumulator. Flags are not set here.
1270:
1271: (define_insn "fix_truncsfsi2"
1272: [(set (match_operand:SI 0 "general_operand" "=g")
1273: (fix:SI (fix:SF (match_operand:SF 1 "register_operand" "a"))))]
1274: ""
1275: "*
1276: {
1277: CC_STATUS_INIT;
1278: return \"cvfl %0\";
1279: }")
1280:
1281:
1282: ; fix_truncsfsi2 to convert a double to long, tahoe must have the double
1283: ; in the fpp accumulator. Flags are not set here.
1284:
1285: (define_insn "fix_truncdfsi2"
1286: [(set (match_operand:SI 0 "general_operand" "=g")
1287: (fix:SI (fix:DF (match_operand:DF 1 "register_operand" "a"))))]
1288: ""
1289: "*
1290: {
1291: CC_STATUS_INIT;
1292: return \"cvdl %0\";
1293: }")
1294:
1295:
1296: (define_insn "truncsihi2"
1297: [(set (match_operand:HI 0 "general_operand" "=g")
1298: (truncate:HI (match_operand:SI 1 "general_operand" "g")))]
1299: ""
1300: "cvtlw %1,%0")
1301:
1302:
1303: (define_insn "truncsiqi2"
1304: [(set (match_operand:QI 0 "general_operand" "=g")
1305: (truncate:QI (match_operand:SI 1 "general_operand" "g")))]
1306: ""
1307: "cvtlb %1,%0")
1308:
1309:
1310: (define_insn "trunchiqi2"
1311: [(set (match_operand:QI 0 "general_operand" "=g")
1312: (truncate:QI (match_operand:HI 1 "general_operand" "g")))]
1313: ""
1314: "cvtwb %1,%0")
1315:
1316:
1317: ; The fpp related instructions don't set flags, so ignore them
1318: ; after this instruction.
1319:
1320: (define_insn "truncdfsf2"
1321: [(set (match_operand:SF 0 "register_operand" "=a")
1322: (float_truncate:SF (match_operand:DF 1 "register_operand" "0")))]
1323: ""
1324: "*
1325: {
1326: CC_STATUS_INIT;
1327: return \"cvdf\";
1328: }")
1329:
1330:
1331: ; This monster is to cover for the Tahoe's nasty habit of not extending
1332: ; a number if the source is in a register. (It just moves it!) Case 0 is
1333: ; a normal extend from memory. Case 1 does the extension from the top of
1334: ; the stack. Extension from the stack doesn't set the flags right since
1335: ; the moval changes them.
1336:
1337: (define_insn "extendhisi2"
1338: [(set (match_operand:SI 0 "general_operand" "=g,?=g")
1339: (sign_extend:SI (match_operand:HI 1 "nonimmediate_operand" "m,r")))]
1340: ""
1341: "*
1342: {
1343: switch (which_alternative)
1344: {
1345: case 0:
1346: return \"cvtwl %1,%0\";
1347: case 1:
1348: if (push_operand (operands[0], SImode))
1349: return \"pushl %1\;cvtwl 2(sp),(sp)\";
1350: else
1351: {
1352: CC_STATUS_INIT;
1353: return \"pushl %1\;cvtwl 2(sp),%0\;moval 4(sp),sp\";
1354: }
1355: }
1356: }")
1357:
1358: ; This monster is to cover for the Tahoe's nasty habit of not extending
1359: ; a number if the source is in a register. (It just moves it!) Case 0 is
1360: ; a normal extend from memory. Case 1 does the extension from the top of
1361: ; the stack. Extension from the stack doesn't set the flags right since
1362: ; the moval changes them.
1363:
1364: (define_insn "extendqisi2"
1365: [(set (match_operand:SI 0 "general_operand" "=g,?=g")
1366: (sign_extend:SI (match_operand:QI 1 "nonimmediate_operand" "m,r")))]
1367: ""
1368: "*
1369: {
1370: switch (which_alternative)
1371: {
1372: case 0:
1373: return \"cvtbl %1,%0\";
1374: case 1:
1375: if (push_operand (operands[0], SImode))
1376: return \"pushl %1\;cvtbl 3(sp),(sp)\";
1377: else
1378: {
1379: CC_STATUS_INIT;
1380: return \"pushl %1\;cvtbl 3(sp),%0\;moval 4(sp),sp\";
1381: }
1382: }
1383: }")
1384:
1385:
1386: ; This monster is to cover for the Tahoe's nasty habit of not extending
1387: ; a number if the source is in a register. (It just moves it!) Case 0 is
1388: ; a normal extend from memory. Case 1 does the extension from the top of
1389: ; the stack. Extension from the stack doesn't set the flags right since
1390: ; the moval changes them.
1391:
1392: (define_insn "extendqihi2"
1393: [(set (match_operand:HI 0 "general_operand" "=g,?=g")
1394: (sign_extend:HI (match_operand:QI 1 "nonimmediate_operand" "m,r")))]
1395: ""
1396: "*
1397: {
1398: switch (which_alternative)
1399: {
1400: case 0:
1401: return \"cvtbw %1,%0\";
1402: case 1:
1403: if (push_operand (operands[0], SImode))
1404: return \"pushl %1\;cvtbw 3(sp),(sp)\";
1405: else
1406: {
1407: CC_STATUS_INIT;
1408: return \"pushl %1\;cvtbw 3(sp),%0\;moval 4(sp),sp\";
1409: }
1410: }
1411: }")
1412:
1413:
1414: ; extendsfdf2 tahoe uses the fpp accumulator to do the extension.
1415: ; It takes a float and loads it up directly as a double.
1416:
1417: (define_insn "extendsfdf2"
1418: [(set (match_operand:DF 0 "register_operand" "=a")
1419: (float_extend:DF (match_operand:SF 1 "general_operand" "g")))]
1420: ""
1421: "*
1422: {
1423: CC_STATUS_INIT;
1424: return \"ldfd %1\";
1425: }")
1426:
1427:
1428: ; movz works fine from memory but not from register for the same reasons
1429: ; the cvt instructions don't work right. So we use the normal instruction
1430: ; from memory and we use an and to simulate it from register. This is faster
1431: ; than pulling it off the stack.
1432:
1433:
1434: (define_insn "zero_extendhisi2"
1435: [(set (match_operand:SI 0 "general_operand" "=g,?=g")
1436: (zero_extend:SI (match_operand:HI 1 "nonimmediate_operand" "m,r")))]
1437: ""
1438: "*
1439: {
1440: switch (which_alternative)
1441: {
1442: case 0: return \"movzwl %1,%0\";
1443: case 1: return \"andl3 $0xffff,%1,%0\";
1444: }
1445: }")
1446:
1447: ; movz works fine from memory but not from register for the same reasons
1448: ; the cvt instructions don't work right. So we use the normal instruction
1449: ; from memory and we use an and to simulate it from register. This is faster
1450: ; than pulling it off the stack.
1451:
1452: (define_insn "zero_extendqihi2"
1453: [(set (match_operand:HI 0 "general_operand" "=g,?=g")
1454: (zero_extend:HI (match_operand:QI 1 "nonimmediate_operand" "m,r")))]
1455: ""
1456: "*
1457: {
1458: switch (which_alternative)
1459: {
1460: case 0: return \"movzbw %1,%0\";
1461: case 1: return \"andw3 $0xff,%1,%0\";
1462: }
1463: }")
1464:
1465:
1466: ; movz works fine from memory but not from register for the same reasons
1467: ; the cvt instructions don't work right. So we use the normal instruction
1468: ; from memory and we use an and to simulate it from register. This is faster
1469: ; than pulling it off the stack.
1470:
1471: (define_insn "zero_extendqisi2"
1472: [(set (match_operand:SI 0 "general_operand" "=g,?=g")
1473: (zero_extend:SI (match_operand:QI 1 "nonimmediate_operand" "m,r")))]
1474: ""
1475: "*
1476: {
1477: switch (which_alternative)
1478: {
1479: case 0: return \"movzbl %1,%0\";
1480: case 1: return \"andl3 $0xff,%1,%0\";
1481: }
1482: }")
1483:
1484:
1485: (define_insn "beq"
1486: [(set (pc)
1487: (if_then_else (eq (cc0)
1488: (const_int 0))
1489: (label_ref (match_operand 0 "" ""))
1490: (pc)))]
1491: ""
1492: "jeql %l0")
1493:
1494:
1495: (define_insn "bne"
1496: [(set (pc)
1497: (if_then_else (ne (cc0)
1498: (const_int 0))
1499: (label_ref (match_operand 0 "" ""))
1500: (pc)))]
1501: ""
1502: "jneq %l0")
1503:
1504:
1505: (define_insn "bgt"
1506: [(set (pc)
1507: (if_then_else (gt (cc0)
1508: (const_int 0))
1509: (label_ref (match_operand 0 "" ""))
1510: (pc)))]
1511: ""
1512: "jgtr %l0")
1513:
1514:
1515: (define_insn "bgtu"
1516: [(set (pc)
1517: (if_then_else (gtu (cc0)
1518: (const_int 0))
1519: (label_ref (match_operand 0 "" ""))
1520: (pc)))]
1521: ""
1522: "jgtru %l0")
1523:
1524:
1525: (define_insn "blt"
1526: [(set (pc)
1527: (if_then_else (lt (cc0)
1528: (const_int 0))
1529: (label_ref (match_operand 0 "" ""))
1530: (pc)))]
1531: ""
1532: "jlss %l0")
1533:
1534:
1535: (define_insn "bltu"
1536: [(set (pc)
1537: (if_then_else (ltu (cc0)
1538: (const_int 0))
1539: (label_ref (match_operand 0 "" ""))
1540: (pc)))]
1541: ""
1542: "jlssu %l0")
1543:
1544:
1545: (define_insn "bge"
1546: [(set (pc)
1547: (if_then_else (ge (cc0)
1548: (const_int 0))
1549: (label_ref (match_operand 0 "" ""))
1550: (pc)))]
1551: ""
1552: "jgeq %l0")
1553:
1554:
1555: (define_insn "bgeu"
1556: [(set (pc)
1557: (if_then_else (geu (cc0)
1558: (const_int 0))
1559: (label_ref (match_operand 0 "" ""))
1560: (pc)))]
1561: ""
1562: "jgequ %l0")
1563:
1564:
1565: (define_insn "ble"
1566: [(set (pc)
1567: (if_then_else (le (cc0)
1568: (const_int 0))
1569: (label_ref (match_operand 0 "" ""))
1570: (pc)))]
1571: ""
1572: "jleq %l0")
1573:
1574:
1575: (define_insn "bleu"
1576: [(set (pc)
1577: (if_then_else (leu (cc0)
1578: (const_int 0))
1579: (label_ref (match_operand 0 "" ""))
1580: (pc)))]
1581: ""
1582: "jlequ %l0")
1583:
1584:
1585: ; gcc does not account for register mask/argc longword. Thus the number
1586: ; for the call = number bytes for args + 4
1587:
1588: (define_insn "call"
1589: [(call (match_operand:QI 0 "memory_operand" "m")
1590: (match_operand:QI 1 "general_operand" "g"))]
1591: ""
1592: "*
1593: {
1594: operands[1] = gen_rtx (CONST_INT, VOIDmode, (INTVAL (operands[1]) + 4));
1595: if (GET_CODE(operands[0]) == MEM
1596: && CONSTANT_ADDRESS_P (XEXP(operands[0], 0))
1597: && INTVAL (operands[1]) < 64)
1598: return \"callf %1,%0\"; /* this is much faster */
1599: return \"calls %1,%0\";
1600: }")
1601:
1602: ; gcc does not account for register mask/argc longword. Thus the number
1603: ; for the call = number bytes for args + 4
1604:
1605: (define_insn "call_value"
1606: [(set (match_operand 0 "" "=g")
1607: (call (match_operand:QI 1 "memory_operand" "m")
1608: (match_operand:QI 2 "general_operand" "g")))]
1609: ""
1610: "*
1611: {
1612: operands[2] = gen_rtx (CONST_INT, VOIDmode, (INTVAL (operands[2]) + 4));
1613: if (GET_CODE(operands[1]) == MEM
1614: && CONSTANT_ADDRESS_P (XEXP(operands[1], 0))
1615: && INTVAL (operands[2]) < 64)
1616: return \"callf %2,%1\"; /* this is much faster */
1617: return \"calls %2,%1\";
1618: }")
1619:
1620:
1621: (define_insn "return"
1622: [(return)]
1623: ""
1624: "ret")
1625:
1626: (define_insn "nop"
1627: [(const_int 0)]
1628: ""
1629: "nop")
1630:
1631: ; casesi this code extracted from the vax code. The instructions are
1632: ; very similar. Tahoe requires that the table be word aligned. GCC
1633: ; places the table immediately after, thus the alignment directive.
1634:
1635: (define_insn "casesi"
1636: [(set (pc)
1637: (if_then_else (le (minus:SI (match_operand:SI 0 "general_operand" "g")
1638: (match_operand:SI 1 "general_operand" "g"))
1639: (match_operand:SI 2 "general_operand" "g"))
1640: (plus:SI (sign_extend:SI
1641: (mem:HI (plus:SI (pc)
1642: (minus:SI (match_dup 0)
1643: (match_dup 1)))))
1644: (label_ref:SI (match_operand 3 "" "")))
1645: (pc)))]
1646: ""
1647: "casel %0,%1,%2\;.align %@")
1648:
1649:
1650: (define_insn "jump"
1651: [(set (pc)
1652: (label_ref (match_operand 0 "" "")))]
1653: ""
1654: "jbr %l0")
1655:
1656:
1657: ;; This is the list of all the non-standard insn patterns
1658:
1659:
1660: ; This is used to access the address of a byte. This is similar to
1661: ; movqi, but the second operand had to be "address_operand" type, so
1662: ; it had to be an unnamed one.
1663:
1664: (define_insn ""
1665: [(set (match_operand:SI 0 "general_operand" "=g")
1666: (match_operand:QI 1 "address_operand" "p"))]
1667: ""
1668: "*
1669: {
1670: if (push_operand (operands[0], SImode))
1671: return \"pushab %a1\";
1672: return \"movab %a1,%0\";
1673: }")
1674:
1675: ; This is used to access the address of a word. This is similar to
1676: ; movhi, but the second operand had to be "address_operand" type, so
1677: ; it had to be an unnamed one.
1678:
1679: (define_insn ""
1680: [(set (match_operand:SI 0 "general_operand" "=g")
1681: (match_operand:HI 1 "address_operand" "p"))]
1682: ""
1683: "*
1684: {
1685: if (push_operand (operands[0], SImode))
1686: return \"pushaw %a1\";
1687: return \"movaw %a1,%0\";
1688: }")
1689:
1690: ; This is used to access the address of a long. This is similar to
1691: ; movsi, but the second operand had to be "address_operand" type, so
1692: ; it had to be an unnamed one.
1693:
1694: (define_insn ""
1695: [(set (match_operand:SI 0 "general_operand" "=g")
1696: (match_operand:SI 1 "address_operand" "p"))]
1697: ""
1698: "*
1699: {
1700: if (push_operand (operands[0], SImode))
1701: return \"pushal %a1\";
1702: return \"moval %a1,%0\";
1703: }")
1704:
1705:
1706: ; bit test longword instruction, same as vax
1707:
1708: (define_insn ""
1709: [(set (cc0)
1710: (and:SI (match_operand:SI 0 "general_operand" "g")
1711: (match_operand:SI 1 "general_operand" "g")))]
1712: ""
1713: "bitl %0,%1")
1714:
1715:
1716: ; bit test word instructions, same as vax
1717:
1718: (define_insn ""
1719: [(set (cc0)
1720: (and:HI (match_operand:HI 0 "general_operand" "g")
1721: (match_operand:HI 1 "general_operand" "g")))]
1722: ""
1723: "bitw %0,%1")
1724:
1725:
1726: ; bit test instructions, same as vax
1727:
1728: (define_insn ""
1729: [(set (cc0)
1730: (and:QI (match_operand:QI 0 "general_operand" "g")
1731: (match_operand:QI 1 "general_operand" "g")))]
1732: ""
1733: "bitb %0,%1")
1734:
1735:
1736: ; bne counterpart. in case gcc reverses the conditional.
1737:
1738: (define_insn ""
1739: [(set (pc)
1740: (if_then_else (eq (cc0)
1741: (const_int 0))
1742: (pc)
1743: (label_ref (match_operand 0 "" ""))))]
1744: ""
1745: "jneq %l0")
1746:
1747:
1748: ; beq counterpart. in case gcc reverses the conditional.
1749:
1750: (define_insn ""
1751: [(set (pc)
1752: (if_then_else (ne (cc0)
1753: (const_int 0))
1754: (pc)
1755: (label_ref (match_operand 0 "" ""))))]
1756: ""
1757: "jeql %l0")
1758:
1759:
1760: ; ble counterpart. in case gcc reverses the conditional.
1761:
1762: (define_insn ""
1763: [(set (pc)
1764: (if_then_else (gt (cc0)
1765: (const_int 0))
1766: (pc)
1767: (label_ref (match_operand 0 "" ""))))]
1768: ""
1769: "jleq %l0")
1770:
1771:
1772: ; bleu counterpart. in case gcc reverses the conditional.
1773:
1774: (define_insn ""
1775: [(set (pc)
1776: (if_then_else (gtu (cc0)
1777: (const_int 0))
1778: (pc)
1779: (label_ref (match_operand 0 "" ""))))]
1780: ""
1781: "jlequ %l0")
1782:
1783:
1784: ; bge counterpart. in case gcc reverses the conditional.
1785:
1786: (define_insn ""
1787: [(set (pc)
1788: (if_then_else (lt (cc0)
1789: (const_int 0))
1790: (pc)
1791: (label_ref (match_operand 0 "" ""))))]
1792: ""
1793: "jgeq %l0")
1794:
1795:
1796: ; bgeu counterpart. in case gcc reverses the conditional.
1797:
1798: (define_insn ""
1799: [(set (pc)
1800: (if_then_else (ltu (cc0)
1801: (const_int 0))
1802: (pc)
1803: (label_ref (match_operand 0 "" ""))))]
1804: ""
1805: "jgequ %l0")
1806:
1807:
1808: ; blt counterpart. in case gcc reverses the conditional.
1809:
1810: (define_insn ""
1811: [(set (pc)
1812: (if_then_else (ge (cc0)
1813: (const_int 0))
1814: (pc)
1815: (label_ref (match_operand 0 "" ""))))]
1816: ""
1817: "jlss %l0")
1818:
1819:
1820: ; bltu counterpart. in case gcc reverses the conditional.
1821:
1822: (define_insn ""
1823: [(set (pc)
1824: (if_then_else (geu (cc0)
1825: (const_int 0))
1826: (pc)
1827: (label_ref (match_operand 0 "" ""))))]
1828: ""
1829: "jlssu %l0")
1830:
1831:
1832: ; bgt counterpart. in case gcc reverses the conditional.
1833:
1834: (define_insn ""
1835: [(set (pc)
1836: (if_then_else (le (cc0)
1837: (const_int 0))
1838: (pc)
1839: (label_ref (match_operand 0 "" ""))))]
1840: ""
1841: "jgtr %l0")
1842:
1843:
1844: ; bgtu counterpart. in case gcc reverses the conditional.
1845:
1846: (define_insn ""
1847: [(set (pc)
1848: (if_then_else (leu (cc0)
1849: (const_int 0))
1850: (pc)
1851: (label_ref (match_operand 0 "" ""))))]
1852: ""
1853: "jgtru %l0")
1854:
1855:
1856: ; casesi alternate form as found in vax code. this form is to
1857: ; compensate for the table's offset being no distance (0 displacement)
1858:
1859: (define_insn ""
1860: [(set (pc)
1861: (if_then_else (le (match_operand:SI 0 "general_operand" "g")
1862: (match_operand:SI 1 "general_operand" "g"))
1863: (plus:SI (sign_extend:SI
1864: (mem:HI (plus:SI (pc)
1865: (minus:SI (match_dup 0)
1866: (const_int 0)))))
1867: (label_ref:SI (match_operand 3 "" "")))
1868: (pc)))]
1869: ""
1870: "casel %0,$0,%1\;.align %@")
1871:
1872:
1873: ; casesi alternate form as found in vax code. another form to
1874: ; compensate for the table's offset being no distance (0 displacement)
1875:
1876: (define_insn ""
1877: [(set (pc)
1878: (if_then_else (le (match_operand:SI 0 "general_operand" "g")
1879: (match_operand:SI 1 "general_operand" "g"))
1880: (plus:SI (sign_extend:SI
1881: (mem:HI (plus:SI (pc)
1882: (match_dup 0))))
1883: (label_ref:SI (match_operand 3 "" "")))
1884: (pc)))]
1885: ""
1886: "casel %0,$0,%1 \;.align %@")
1887:
1888: (define_insn ""
1889: [(set (pc)
1890: (if_then_else
1891: (lt (plus:SI (match_operand:SI 0 "general_operand" "+g")
1892: (const_int 1))
1893: (match_operand:SI 1 "general_operand" "g"))
1894: (label_ref (match_operand 2 "" ""))
1895: (pc)))
1896: (set (match_dup 0)
1897: (plus:SI (match_dup 0)
1898: (const_int 1)))]
1899: ""
1900: "aoblss %1,%0,%l2")
1901:
1902: (define_insn ""
1903: [(set (pc)
1904: (if_then_else
1905: (le (plus:SI (match_operand:SI 0 "general_operand" "+g")
1906: (const_int 1))
1907: (match_operand:SI 1 "general_operand" "g"))
1908: (label_ref (match_operand 2 "" ""))
1909: (pc)))
1910: (set (match_dup 0)
1911: (plus:SI (match_dup 0)
1912: (const_int 1)))]
1913: ""
1914: "aobleq %1,%0,%l2")
1915:
1916: (define_insn ""
1917: [(set (pc)
1918: (if_then_else
1919: (ge (plus:SI (match_operand:SI 0 "general_operand" "+g")
1920: (const_int 1))
1921: (match_operand:SI 1 "general_operand" "g"))
1922: (pc)
1923: (label_ref (match_operand 2 "" ""))))
1924: (set (match_dup 0)
1925: (plus:SI (match_dup 0)
1926: (const_int 1)))]
1927: ""
1928: "aoblss %1,%0,%l2")
1929:
1930: (define_insn ""
1931: [(set (pc)
1932: (if_then_else
1933: (gt (plus:SI (match_operand:SI 0 "general_operand" "+g")
1934: (const_int 1))
1935: (match_operand:SI 1 "general_operand" "g"))
1936: (pc)
1937: (label_ref (match_operand 2 "" ""))))
1938: (set (match_dup 0)
1939: (plus:SI (match_dup 0)
1940: (const_int 1)))]
1941: ""
1942: "aobleq %1,%0,%l2")
1943:
1944: ; bbs/bbc
1945:
1946: (define_insn ""
1947: [(set (pc)
1948: (if_then_else
1949: (ne (sign_extract:SI (match_operand:SI 0 "nonimmediate_operand" "rm")
1950: (const_int 1)
1951: (subreg:QI (match_operand:SI 1 "general_operand" "g") 0))
1952: (const_int 0))
1953: (label_ref (match_operand 2 "" ""))
1954: (pc)))]
1955: ""
1956: "bbs %1,%0,%l2")
1957:
1958: (define_insn ""
1959: [(set (pc)
1960: (if_then_else
1961: (eq (sign_extract:SI (match_operand:SI 0 "nonimmediate_operand" "rm")
1962: (const_int 1)
1963: (subreg:QI (match_operand:SI 1 "general_operand" "g") 0))
1964: (const_int 0))
1965: (label_ref (match_operand 2 "" ""))
1966: (pc)))]
1967: ""
1968: "bbc %1,%0,%l2")
1969:
1970: (define_insn ""
1971: [(set (pc)
1972: (if_then_else
1973: (ne (sign_extract:SI (match_operand:SI 0 "nonimmediate_operand" "rm")
1974: (const_int 1)
1975: (subreg:QI (match_operand:SI 1 "general_operand" "g") 0))
1976: (const_int 0))
1977: (pc)
1978: (label_ref (match_operand 2 "" ""))))]
1979: ""
1980: "bbc %1,%0,%l2")
1981:
1982: (define_insn ""
1983: [(set (pc)
1984: (if_then_else
1985: (eq (sign_extract:SI (match_operand:SI 0 "nonimmediate_operand" "rm")
1986: (const_int 1)
1987: (subreg:QI (match_operand:SI 1 "general_operand" "g") 0))
1988: (const_int 0))
1989: (pc)
1990: (label_ref (match_operand 2 "" ""))))]
1991: ""
1992: "bbs %1,%0,%l2")
1993:
1994: ; if the shift count is a byte in a register we can use it as a long
1995:
1996: (define_insn ""
1997: [(set (pc)
1998: (if_then_else
1999: (ne (sign_extract:SI (match_operand:SI 0 "nonimmediate_operand" "rm")
2000: (const_int 1)
2001: (match_operand:QI 1 "register_operand" "r"))
2002: (const_int 0))
2003: (label_ref (match_operand 2 "" ""))
2004: (pc)))]
2005: ""
2006: "bbs %1,%0,%l2")
2007:
2008: (define_insn ""
2009: [(set (pc)
2010: (if_then_else
2011: (eq (sign_extract:SI (match_operand:SI 0 "nonimmediate_operand" "rm")
2012: (const_int 1)
2013: (match_operand:QI 1 "register_operand" "r"))
2014: (const_int 0))
2015: (label_ref (match_operand 2 "" ""))
2016: (pc)))]
2017: ""
2018: "bbc %1,%0,%l2")
2019:
2020: (define_insn ""
2021: [(set (pc)
2022: (if_then_else
2023: (ne (sign_extract:SI (match_operand:SI 0 "nonimmediate_operand" "rm")
2024: (const_int 1)
2025: (match_operand:QI 1 "register_operand" "r"))
2026: (const_int 0))
2027: (pc)
2028: (label_ref (match_operand 2 "" ""))))]
2029: ""
2030: "bbc %1,%0,%l2")
2031:
2032: (define_insn ""
2033: [(set (pc)
2034: (if_then_else
2035: (eq (sign_extract:SI (match_operand:SI 0 "nonimmediate_operand" "rm")
2036: (const_int 1)
2037: (match_operand:QI 1 "register_operand" "r"))
2038: (const_int 0))
2039: (pc)
2040: (label_ref (match_operand 2 "" ""))))]
2041: ""
2042: "bbs %1,%0,%l2")
2043:
2044: ; special case for 1 << constant. We don't do these because they are slower
2045: ; than the bitl instruction
2046:
2047: ;(define_insn ""
2048: ; [(set (pc)
2049: ; (if_then_else
2050: ; (ne (and:SI (match_operand:SI 0 "nonimmediate_operand" "%rm")
2051: ; (match_operand:SI 1 "immediate_operand" "i"))
2052: ; (const_int 0))
2053: ; (label_ref (match_operand 2 "" ""))
2054: ; (pc)))]
2055: ; "GET_CODE (operands[1]) == CONST_INT
2056: ; && exact_log2 (INTVAL (operands[1])) >= 0"
2057: ; "*
2058: ;{
2059: ; operands[1]
2060: ; = gen_rtx (CONST_INT, VOIDmode, exact_log2 (INTVAL (operands[1])));
2061: ; return \"bbs %1,%0,%l2\";
2062: ;}")
2063: ;
2064: ;(define_insn ""
2065: ; [(set (pc)
2066: ; (if_then_else
2067: ; (eq (and:SI (match_operand:SI 0 "nonimmediate_operand" "%rm")
2068: ; (match_operand:SI 1 "immediate_operand" "i"))
2069: ; (const_int 0))
2070: ; (label_ref (match_operand 2 "" ""))
2071: ; (pc)))]
2072: ; "GET_CODE (operands[1]) == CONST_INT
2073: ; && exact_log2 (INTVAL (operands[1])) >= 0"
2074: ; "*
2075: ;{
2076: ; operands[1]
2077: ; = gen_rtx (CONST_INT, VOIDmode, exact_log2 (INTVAL (operands[1])));
2078: ; return \"bbc %1,%0,%l2\";
2079: ;}")
2080: ;
2081: ;(define_insn ""
2082: ; [(set (pc)
2083: ; (if_then_else
2084: ; (ne (and:SI (match_operand:SI 0 "nonimmediate_operand" "%rm")
2085: ; (match_operand:SI 1 "immediate_operand" "i"))
2086: ; (const_int 0))
2087: ; (pc)
2088: ; (label_ref (match_operand 2 "" ""))))]
2089: ; "GET_CODE (operands[1]) == CONST_INT
2090: ; && exact_log2 (INTVAL (operands[1])) >= 0"
2091: ; "*
2092: ;{
2093: ; operands[1]
2094: ; = gen_rtx (CONST_INT, VOIDmode, exact_log2 (INTVAL (operands[1])));
2095: ; return \"bbc %1,%0,%l2\";
2096: ;}")
2097: ;
2098: ;(define_insn ""
2099: ; [(set (pc)
2100: ; (if_then_else
2101: ; (eq (and:SI (match_operand:SI 0 "nonimmediate_operand" "%rm")
2102: ; (match_operand:SI 1 "immediate_operand" "i"))
2103: ; (const_int 0))
2104: ; (pc)
2105: ; (label_ref (match_operand 2 "" ""))))]
2106: ; "GET_CODE (operands[1]) == CONST_INT
2107: ; && exact_log2 (INTVAL (operands[1])) >= 0"
2108: ; "*
2109: ;{
2110: ; operands[1]
2111: ; = gen_rtx (CONST_INT, VOIDmode, exact_log2 (INTVAL (operands[1])));
2112: ; return \"bbs %1,%0,%l2\";
2113: ;}")
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.