|
|
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 2, or (at your option)
10: ;; any later version.
11:
12: ;; GNU CC is distributed in the hope that it will be useful,
13: ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
14: ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15: ;; GNU General Public License for more details.
16:
17: ;; You should have received a copy of the GNU General Public License
18: ;; along with GNU CC; see the file COPYING. If not, write to
19: ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
20:
21:
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 "lshlsi3"
854: [(set (match_operand:SI 0 "general_operand" "=g")
855: (lshift:SI (match_operand:SI 1 "general_operand" "g")
856: (match_operand:QI 2 "general_operand" "g")))]
857: ""
858: "*
859: {
860: if (GET_CODE(operands[2]) == REG)
861: return \"mull3 ___shtab[%2],%1,%0\";
862: /* if (GET_CODE(operands[2]) == REG)
863: if (rtx_equal_p (operands[0], operands[1]))
864: return \"mull2 ___shtab[%2],%1\";
865: else
866: return \"mull3 ___shtab[%2],%1,%0\"; */
867: if (GET_CODE(operands[1]) == REG)
868: {
869: if (operands[2] == const1_rtx)
870: {
871: CC_STATUS_INIT;
872: return \"movaw 0[%1],%0\";
873: }
874: if (GET_CODE(operands[2]) == CONST_INT && INTVAL(operands[2]) == 2)
875: {
876: CC_STATUS_INIT;
877: return \"moval 0[%1],%0\";
878: }
879: }
880: if (GET_CODE(operands[2]) != CONST_INT || INTVAL(operands[2]) == 1)
881: return \"shll %2,%1,%0\";
882: if (rtx_equal_p (operands[0], operands[1]))
883: return \"mull2 %s2,%1\";
884: else
885: return \"mull3 %s2,%1,%0\";
886: }")
887:
888:
889: (define_insn "lshrsi3"
890: [(set (match_operand:SI 0 "general_operand" "=g")
891: (lshiftrt:SI (match_operand:SI 1 "general_operand" "g")
892: (match_operand:QI 2 "general_operand" "g")))]
893: ""
894: "shrl %2,%1,%0")
895:
896:
897: (define_insn "negsi2"
898: [(set (match_operand:SI 0 "general_operand" "=g")
899: (neg:SI (match_operand:SI 1 "general_operand" "g")))]
900: ""
901: "mnegl %1,%0")
902:
903:
904: (define_insn "neghi2"
905: [(set (match_operand:HI 0 "general_operand" "=g")
906: (neg:HI (match_operand:HI 1 "general_operand" "g")))]
907: ""
908: "mnegw %1,%0")
909:
910:
911: (define_insn "negqi2"
912: [(set (match_operand:QI 0 "general_operand" "=g")
913: (neg:QI (match_operand:QI 1 "general_operand" "g")))]
914: ""
915: "mnegb %1,%0")
916:
917:
918: ; negsf2 can only negate the value already in the fpp accumulator.
919: ; The value remains in the fpp accumulator. No flags are set.
920:
921: (define_insn "negsf2"
922: [(set (match_operand:SF 0 "register_operand" "=a,=a")
923: (neg:SF (match_operand:SF 1 "register_operand" "a,g")))]
924: ""
925: "*
926: {
927: CC_STATUS_INIT;
928: switch (which_alternative)
929: {
930: case 0: return \"negf\";
931: case 1: return \"lnf %1\";
932: }
933: }")
934:
935:
936: ; negdf2 can only negate the value already in the fpp accumulator.
937: ; The value remains in the fpp accumulator. No flags are set.
938:
939: (define_insn "negdf2"
940: [(set (match_operand:DF 0 "register_operand" "=a,=a")
941: (neg:DF (match_operand:DF 1 "register_operand" "a,g")))]
942: ""
943: "*
944: {
945: CC_STATUS_INIT;
946: switch (which_alternative)
947: {
948: case 0: return \"negd\";
949: case 1: return \"lnd %1\";
950: }
951: }")
952:
953:
954: ; sqrtsf2 tahoe can calculate the square root of a float in the
955: ; fpp accumulator. The answer remains in the fpp accumulator. No
956: ; flags are set by this function.
957:
958: (define_insn "sqrtsf2"
959: [(set (match_operand:SF 0 "register_operand" "=a")
960: (sqrt:SF (match_operand:SF 1 "register_operand" "0")))]
961: ""
962: "*
963: {
964: CC_STATUS_INIT;
965: return \"sqrtf\";
966: }")
967:
968:
969: ; ffssi2 tahoe instruction gives one less than gcc desired result for
970: ; any given input. So the increment is necessary here.
971:
972: (define_insn "ffssi2"
973: [(set (match_operand:SI 0 "general_operand" "=g")
974: (ffs:SI (match_operand:SI 1 "general_operand" "g")))]
975: ""
976: "*
977: {
978: if (push_operand(operands[0], SImode))
979: return \"ffs %1,%0\;incl (sp)\";
980: return \"ffs %1,%0\;incl %0\";
981: }")
982:
983:
984: (define_insn "one_cmplsi2"
985: [(set (match_operand:SI 0 "general_operand" "=g")
986: (not:SI (match_operand:SI 1 "general_operand" "g")))]
987: ""
988: "mcoml %1,%0")
989:
990:
991: (define_insn "one_cmplhi2"
992: [(set (match_operand:HI 0 "general_operand" "=g")
993: (not:HI (match_operand:HI 1 "general_operand" "g")))]
994: ""
995: "mcomw %1,%0")
996:
997:
998: (define_insn "one_cmplqi2"
999: [(set (match_operand:QI 0 "general_operand" "=g")
1000: (not:QI (match_operand:QI 1 "general_operand" "g")))]
1001: ""
1002: "mcomb %1,%0")
1003:
1004:
1005: ; cmpsi works fine, but due to microcode problems, the tahoe doesn't
1006: ; properly compare hi's and qi's. Leaving them out seems to be acceptable
1007: ; to the compiler, so they were left out. Compares of the stack are
1008: ; possible, though.
1009:
1010: ; There are optimized cases possible, however. These follow first.
1011:
1012: (define_insn ""
1013: [(set (cc0)
1014: (compare (sign_extend:SI (match_operand:HI 0 "memory_operand" "m"))
1015: (sign_extend:SI (match_operand:HI 1 "memory_operand" "m"))))]
1016: ""
1017: "cmpw %0,%1")
1018:
1019: (define_insn ""
1020: [(set (cc0)
1021: (compare (match_operand:SI 0 "nonmemory_operand" "ri")
1022: (sign_extend:SI (match_operand:HI 1 "memory_operand" "m"))))]
1023: ""
1024: "cmpw %0,%1")
1025:
1026: (define_insn ""
1027: [(set (cc0)
1028: (compare (sign_extend:SI (match_operand:HI 0 "memory_operand" "m"))
1029: (match_operand:SI 1 "nonmemory_operand" "ri")))]
1030: ""
1031: "cmpw %0,%1")
1032:
1033: ; zero-extended compares give the same result as sign-extended compares, if
1034: ; the compare is unsigned. Just see: if both operands are <65536 they are the
1035: ; same in both cases. If both are >=65536 the you effectively compare x+D
1036: ; with y+D, where D=2**32-2**16, so the result is the same. if x<65536 and
1037: ; y>=65536 then you compare x with y+D, and in both cases the result is x<y.
1038:
1039: (define_insn ""
1040: [(set (cc0)
1041: (compare (zero_extend:SI (match_operand:HI 0 "memory_operand" "m"))
1042: (zero_extend:SI (match_operand:HI 1 "memory_operand" "m"))))]
1043: "tahoe_cmp_check (insn, operands[0], 0)"
1044: "cmpw %0,%1")
1045:
1046: (define_insn ""
1047: [(set (cc0)
1048: (compare (zero_extend:SI (match_operand:HI 0 "memory_operand" "m"))
1049: (match_operand:SI 1 "immediate_operand" "i")))]
1050: "tahoe_cmp_check(insn, operands[1], 65535)"
1051: "*
1052: {
1053: if (INTVAL (operands[1]) > 32767)
1054: operands[1] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[1]) + 0xffff0000);
1055: return \"cmpw %0,%1\";
1056: }")
1057:
1058:
1059: (define_insn ""
1060: [(set (cc0)
1061: (compare (sign_extend:SI (match_operand:QI 0 "memory_operand" "m"))
1062: (sign_extend:SI (match_operand:QI 1 "memory_operand" "m"))))]
1063: ""
1064: "cmpb %0,%1")
1065:
1066: (define_insn ""
1067: [(set (cc0)
1068: (compare (match_operand:SI 0 "nonmemory_operand" "ri")
1069: (sign_extend:SI (match_operand:QI 1 "memory_operand" "m"))))]
1070: ""
1071: "cmpb %0,%1")
1072:
1073: (define_insn ""
1074: [(set (cc0)
1075: (compare (sign_extend:SI (match_operand:QI 0 "memory_operand" "m"))
1076: (match_operand:SI 1 "nonmemory_operand" "ri")))]
1077: ""
1078: "cmpb %0,%1")
1079:
1080: ; zero-extended compares give the same result as sign-extended compares, if
1081: ; the compare is unsigned. Just see: if both operands are <128 they are the
1082: ; same in both cases. If both are >=128 the you effectively compare x+D
1083: ; with y+D, where D=2**32-2**8, so the result is the same. if x<128 and
1084: ; y>=128 then you compare x with y+D, and in both cases the result is x<y.
1085:
1086: (define_insn ""
1087: [(set (cc0)
1088: (compare (zero_extend:SI (match_operand:QI 0 "memory_operand" "m"))
1089: (zero_extend:SI (match_operand:QI 1 "memory_operand" "m"))))]
1090: "tahoe_cmp_check (insn, operands[0], 0)"
1091: "cmpb %0,%1")
1092:
1093: (define_insn ""
1094: [(set (cc0)
1095: (compare (zero_extend:SI (match_operand:QI 0 "memory_operand" "m"))
1096: (match_operand:SI 1 "immediate_operand" "i")))]
1097: "tahoe_cmp_check(insn, operands[1], 255)"
1098: "*
1099: {
1100: if (INTVAL (operands[1]) > 127)
1101: operands[1] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[1]) + 0xffffff00);
1102: return \"cmpb %0,%1\";
1103: }")
1104:
1105:
1106: (define_insn "cmpsi"
1107: [(set (cc0)
1108: (compare (match_operand:SI 0 "nonimmediate_operand" "g")
1109: (match_operand:SI 1 "general_operand" "g")))]
1110: ""
1111: "cmpl %0,%1")
1112:
1113:
1114: ; cmpsf similar to vax, but first operand is expected to be in the
1115: ; fpp accumulator.
1116:
1117: (define_insn "cmpsf"
1118: [(set (cc0)
1119: (compare (match_operand:SF 0 "general_operand" "a,g")
1120: (match_operand:SF 1 "general_operand" "g,g")))]
1121: ""
1122: "*
1123: {
1124: switch (which_alternative)
1125: {
1126: case 0: return \"cmpf %1\";
1127: case 1: return \"cmpf2 %0,%1\";
1128: }
1129: }")
1130:
1131:
1132: ; cmpdf similar to vax, but first operand is expected to be in the
1133: ; fpp accumulator. Immediate doubles not allowed.
1134:
1135: (define_insn "cmpdf"
1136: [(set (cc0)
1137: (compare (match_operand:DF 0 "general_operand" "a,rm")
1138: (match_operand:DF 1 "general_operand" "rm,rm")))]
1139: ""
1140: "*
1141: {
1142: switch (which_alternative)
1143: {
1144: case 0: return \"cmpd %1\";
1145: case 1: return \"cmpd2 %0,%1\";
1146: }
1147: }")
1148:
1149: ;; We don't want to allow a constant operand for test insns because
1150: ;; (set (cc0) (const_int foo)) has no mode information. Such insns will
1151: ;; be folded while optimizing anyway.
1152:
1153: (define_insn "tstsi"
1154: [(set (cc0)
1155: (match_operand:SI 0 "nonimmediate_operand" "g"))]
1156: ""
1157: "tstl %0")
1158:
1159:
1160: ; small tests from memory are normal, but testing from registers doesn't
1161: ; expand the data properly. So test in this case does a convert and tests
1162: ; the new register data from the stack.
1163:
1164: ; First some special cases that do work
1165:
1166:
1167: (define_insn ""
1168: [(set (cc0)
1169: (sign_extend:SI (match_operand:HI 0 "memory_operand" "m")))]
1170: ""
1171: "tstw %0")
1172:
1173: (define_insn ""
1174: [(set (cc0)
1175: (zero_extend:SI (match_operand:HI 0 "memory_operand" "m")))]
1176: "tahoe_cmp_check (insn, operands[0], 0)"
1177: "tstw %0")
1178:
1179:
1180: (define_insn "tsthi"
1181: [(set (cc0)
1182: (match_operand:HI 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 \"tstw %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), 2);
1197: output_asm_insn (\"tstw %a1\", xoperands);
1198: return \"\";
1199: }
1200: }")
1201:
1202:
1203: (define_insn ""
1204: [(set (cc0)
1205: (sign_extend:SI (match_operand:QI 0 "memory_operand" "m")))]
1206: ""
1207: "tstb %0")
1208:
1209: (define_insn ""
1210: [(set (cc0)
1211: (zero_extend:SI (match_operand:QI 0 "memory_operand" "m")))]
1212: "tahoe_cmp_check (insn, operands[0], 0)"
1213: "tstb %0")
1214:
1215:
1216: (define_insn "tstqi"
1217: [(set (cc0)
1218: (match_operand:QI 0 "extendable_operand" "m,!r"))]
1219: "GET_MODE (operands[0]) != VOIDmode"
1220: "*
1221: {
1222: rtx xoperands[2];
1223: extern rtx tahoe_reg_conversion_loc;
1224: switch (which_alternative)
1225: {
1226: case 0:
1227: return \"tstb %0\";
1228: case 1:
1229: xoperands[0] = operands[0];
1230: xoperands[1] = tahoe_reg_conversion_loc;
1231: output_asm_insn (\"movl %0,%1\", xoperands);
1232: xoperands[1] = plus_constant (XEXP (tahoe_reg_conversion_loc, 0), 3);
1233: output_asm_insn (\"tstb %a1\", xoperands);
1234: return \"\";
1235: }
1236: }")
1237:
1238: ; tstsf compares a given value to a value already in the fpp accumulator.
1239: ; No flags are set by this so ignore them.
1240:
1241: (define_insn "tstsf"
1242: [(set (cc0)
1243: (match_operand:SF 0 "register_operand" "a"))]
1244: ""
1245: "tstf")
1246:
1247:
1248: ; tstdf compares a given value to a value already in the fpp accumulator.
1249: ; immediate doubles not allowed. Flags are ignored after this.
1250:
1251: (define_insn "tstdf"
1252: [(set (cc0)
1253: (match_operand:DF 0 "register_operand" "a"))]
1254: ""
1255: "tstd")
1256:
1257:
1258:
1259: ; movstrhi tahoe instruction does not load registers by itself like
1260: ; the vax counterpart does. registers 0-2 must be primed by hand.
1261: ; we have loaded the registers in the order: dst, src, count.
1262:
1263: (define_insn "movstrhi"
1264: [(set (match_operand:BLK 0 "general_operand" "p")
1265: (match_operand:BLK 1 "general_operand" "p"))
1266: (use (match_operand:HI 2 "general_operand" "g"))
1267: (clobber (reg:SI 0))
1268: (clobber (reg:SI 1))
1269: (clobber (reg:SI 2))]
1270: ""
1271: "movab %0,r1\;movab %1,r0\;movl %2,r2\;movblk")
1272:
1273:
1274: ; floatsisf2 on tahoe converts the long from reg/mem into the fpp
1275: ; accumulator. There are no hi and qi counterparts. Flags are not
1276: ; set correctly here.
1277:
1278: (define_insn "floatsisf2"
1279: [(set (match_operand:SF 0 "register_operand" "=a")
1280: (float:SF (match_operand:SI 1 "general_operand" "g")))]
1281: ""
1282: "*
1283: {
1284: CC_STATUS_INIT;
1285: return \"cvlf %1\";
1286: }")
1287:
1288:
1289: ; floatsidf2 on tahoe converts the long from reg/mem into the fpp
1290: ; accumulator. There are no hi and qi counterparts. Flags are not
1291: ; set correctly here.
1292:
1293: (define_insn "floatsidf2"
1294: [(set (match_operand:DF 0 "register_operand" "=a")
1295: (float:DF (match_operand:SI 1 "general_operand" "g")))]
1296: ""
1297: "*
1298: {
1299: CC_STATUS_INIT;
1300: return \"cvld %1\";
1301: }")
1302:
1303:
1304: ; fix_truncsfsi2 to convert a float to long, tahoe must have the float
1305: ; in the fpp accumulator. Flags are not set here.
1306:
1307: (define_insn "fix_truncsfsi2"
1308: [(set (match_operand:SI 0 "general_operand" "=g")
1309: (fix:SI (fix:SF (match_operand:SF 1 "register_operand" "a"))))]
1310: ""
1311: "*
1312: {
1313: CC_STATUS_INIT;
1314: return \"cvfl %0\";
1315: }")
1316:
1317:
1318: ; fix_truncsfsi2 to convert a double to long, tahoe must have the double
1319: ; in the fpp accumulator. Flags are not set here.
1320:
1321: (define_insn "fix_truncdfsi2"
1322: [(set (match_operand:SI 0 "general_operand" "=g")
1323: (fix:SI (fix:DF (match_operand:DF 1 "register_operand" "a"))))]
1324: ""
1325: "*
1326: {
1327: CC_STATUS_INIT;
1328: return \"cvdl %0\";
1329: }")
1330:
1331:
1332: (define_insn "truncsihi2"
1333: [(set (match_operand:HI 0 "general_operand" "=g")
1334: (truncate:HI (match_operand:SI 1 "general_operand" "g")))]
1335: ""
1336: "cvtlw %1,%0")
1337:
1338:
1339: (define_insn "truncsiqi2"
1340: [(set (match_operand:QI 0 "general_operand" "=g")
1341: (truncate:QI (match_operand:SI 1 "general_operand" "g")))]
1342: ""
1343: "cvtlb %1,%0")
1344:
1345:
1346: (define_insn "trunchiqi2"
1347: [(set (match_operand:QI 0 "general_operand" "=g")
1348: (truncate:QI (match_operand:HI 1 "general_operand" "g")))]
1349: ""
1350: "cvtwb %1,%0")
1351:
1352:
1353: ; The fpp related instructions don't set flags, so ignore them
1354: ; after this instruction.
1355:
1356: (define_insn "truncdfsf2"
1357: [(set (match_operand:SF 0 "register_operand" "=a")
1358: (float_truncate:SF (match_operand:DF 1 "register_operand" "0")))]
1359: ""
1360: "*
1361: {
1362: CC_STATUS_INIT;
1363: return \"cvdf\";
1364: }")
1365:
1366:
1367: ; This monster is to cover for the Tahoe's nasty habit of not extending
1368: ; a number if the source is in a register. (It just moves it!) Case 0 is
1369: ; a normal extend from memory. Case 1 does the extension from the top of
1370: ; the stack. Extension from the stack doesn't set the flags right since
1371: ; the moval changes them.
1372:
1373: (define_insn "extendhisi2"
1374: [(set (match_operand:SI 0 "general_operand" "=g,?=g")
1375: (sign_extend:SI (match_operand:HI 1 "nonimmediate_operand" "m,r")))]
1376: ""
1377: "*
1378: {
1379: switch (which_alternative)
1380: {
1381: case 0:
1382: return \"cvtwl %1,%0\";
1383: case 1:
1384: if (push_operand (operands[0], SImode))
1385: return \"pushl %1\;cvtwl 2(sp),(sp)\";
1386: else
1387: {
1388: CC_STATUS_INIT;
1389: return \"pushl %1\;cvtwl 2(sp),%0\;moval 4(sp),sp\";
1390: }
1391: }
1392: }")
1393:
1394: ; This monster is to cover for the Tahoe's nasty habit of not extending
1395: ; a number if the source is in a register. (It just moves it!) Case 0 is
1396: ; a normal extend from memory. Case 1 does the extension from the top of
1397: ; the stack. Extension from the stack doesn't set the flags right since
1398: ; the moval changes them.
1399:
1400: (define_insn "extendqisi2"
1401: [(set (match_operand:SI 0 "general_operand" "=g,?=g")
1402: (sign_extend:SI (match_operand:QI 1 "nonimmediate_operand" "m,r")))]
1403: ""
1404: "*
1405: {
1406: switch (which_alternative)
1407: {
1408: case 0:
1409: return \"cvtbl %1,%0\";
1410: case 1:
1411: if (push_operand (operands[0], SImode))
1412: return \"pushl %1\;cvtbl 3(sp),(sp)\";
1413: else
1414: {
1415: CC_STATUS_INIT;
1416: return \"pushl %1\;cvtbl 3(sp),%0\;moval 4(sp),sp\";
1417: }
1418: }
1419: }")
1420:
1421:
1422: ; This monster is to cover for the Tahoe's nasty habit of not extending
1423: ; a number if the source is in a register. (It just moves it!) Case 0 is
1424: ; a normal extend from memory. Case 1 does the extension from the top of
1425: ; the stack. Extension from the stack doesn't set the flags right since
1426: ; the moval changes them.
1427:
1428: (define_insn "extendqihi2"
1429: [(set (match_operand:HI 0 "general_operand" "=g,?=g")
1430: (sign_extend:HI (match_operand:QI 1 "nonimmediate_operand" "m,r")))]
1431: ""
1432: "*
1433: {
1434: switch (which_alternative)
1435: {
1436: case 0:
1437: return \"cvtbw %1,%0\";
1438: case 1:
1439: if (push_operand (operands[0], SImode))
1440: return \"pushl %1\;cvtbw 3(sp),(sp)\";
1441: else
1442: {
1443: CC_STATUS_INIT;
1444: return \"pushl %1\;cvtbw 3(sp),%0\;moval 4(sp),sp\";
1445: }
1446: }
1447: }")
1448:
1449:
1450: ; extendsfdf2 tahoe uses the fpp accumulator to do the extension.
1451: ; It takes a float and loads it up directly as a double.
1452:
1453: (define_insn "extendsfdf2"
1454: [(set (match_operand:DF 0 "register_operand" "=a")
1455: (float_extend:DF (match_operand:SF 1 "general_operand" "g")))]
1456: ""
1457: "*
1458: {
1459: CC_STATUS_INIT;
1460: return \"ldfd %1\";
1461: }")
1462:
1463:
1464: ; movz works fine from memory but not from register for the same reasons
1465: ; the cvt instructions don't work right. So we use the normal instruction
1466: ; from memory and we use an and to simulate it from register. This is faster
1467: ; than pulling it off the stack.
1468:
1469:
1470: (define_insn "zero_extendhisi2"
1471: [(set (match_operand:SI 0 "general_operand" "=g,?=g")
1472: (zero_extend:SI (match_operand:HI 1 "nonimmediate_operand" "m,r")))]
1473: ""
1474: "*
1475: {
1476: switch (which_alternative)
1477: {
1478: case 0: return \"movzwl %1,%0\";
1479: case 1: return \"andl3 $0xffff,%1,%0\";
1480: }
1481: }")
1482:
1483: ; movz works fine from memory but not from register for the same reasons
1484: ; the cvt instructions don't work right. So we use the normal instruction
1485: ; from memory and we use an and to simulate it from register. This is faster
1486: ; than pulling it off the stack.
1487:
1488: (define_insn "zero_extendqihi2"
1489: [(set (match_operand:HI 0 "general_operand" "=g,?=g")
1490: (zero_extend:HI (match_operand:QI 1 "nonimmediate_operand" "m,r")))]
1491: ""
1492: "*
1493: {
1494: switch (which_alternative)
1495: {
1496: case 0: return \"movzbw %1,%0\";
1497: case 1: return \"andw3 $0xff,%1,%0\";
1498: }
1499: }")
1500:
1501:
1502: ; movz works fine from memory but not from register for the same reasons
1503: ; the cvt instructions don't work right. So we use the normal instruction
1504: ; from memory and we use an and to simulate it from register. This is faster
1505: ; than pulling it off the stack.
1506:
1507: (define_insn "zero_extendqisi2"
1508: [(set (match_operand:SI 0 "general_operand" "=g,?=g")
1509: (zero_extend:SI (match_operand:QI 1 "nonimmediate_operand" "m,r")))]
1510: ""
1511: "*
1512: {
1513: switch (which_alternative)
1514: {
1515: case 0: return \"movzbl %1,%0\";
1516: case 1: return \"andl3 $0xff,%1,%0\";
1517: }
1518: }")
1519:
1520:
1521: (define_insn "beq"
1522: [(set (pc)
1523: (if_then_else (eq (cc0)
1524: (const_int 0))
1525: (label_ref (match_operand 0 "" ""))
1526: (pc)))]
1527: ""
1528: "jeql %l0")
1529:
1530:
1531: (define_insn "bne"
1532: [(set (pc)
1533: (if_then_else (ne (cc0)
1534: (const_int 0))
1535: (label_ref (match_operand 0 "" ""))
1536: (pc)))]
1537: ""
1538: "jneq %l0")
1539:
1540:
1541: (define_insn "bgt"
1542: [(set (pc)
1543: (if_then_else (gt (cc0)
1544: (const_int 0))
1545: (label_ref (match_operand 0 "" ""))
1546: (pc)))]
1547: ""
1548: "jgtr %l0")
1549:
1550:
1551: (define_insn "bgtu"
1552: [(set (pc)
1553: (if_then_else (gtu (cc0)
1554: (const_int 0))
1555: (label_ref (match_operand 0 "" ""))
1556: (pc)))]
1557: ""
1558: "jgtru %l0")
1559:
1560:
1561: (define_insn "blt"
1562: [(set (pc)
1563: (if_then_else (lt (cc0)
1564: (const_int 0))
1565: (label_ref (match_operand 0 "" ""))
1566: (pc)))]
1567: ""
1568: "jlss %l0")
1569:
1570:
1571: (define_insn "bltu"
1572: [(set (pc)
1573: (if_then_else (ltu (cc0)
1574: (const_int 0))
1575: (label_ref (match_operand 0 "" ""))
1576: (pc)))]
1577: ""
1578: "jlssu %l0")
1579:
1580:
1581: (define_insn "bge"
1582: [(set (pc)
1583: (if_then_else (ge (cc0)
1584: (const_int 0))
1585: (label_ref (match_operand 0 "" ""))
1586: (pc)))]
1587: ""
1588: "jgeq %l0")
1589:
1590:
1591: (define_insn "bgeu"
1592: [(set (pc)
1593: (if_then_else (geu (cc0)
1594: (const_int 0))
1595: (label_ref (match_operand 0 "" ""))
1596: (pc)))]
1597: ""
1598: "jgequ %l0")
1599:
1600:
1601: (define_insn "ble"
1602: [(set (pc)
1603: (if_then_else (le (cc0)
1604: (const_int 0))
1605: (label_ref (match_operand 0 "" ""))
1606: (pc)))]
1607: ""
1608: "jleq %l0")
1609:
1610:
1611: (define_insn "bleu"
1612: [(set (pc)
1613: (if_then_else (leu (cc0)
1614: (const_int 0))
1615: (label_ref (match_operand 0 "" ""))
1616: (pc)))]
1617: ""
1618: "jlequ %l0")
1619:
1620:
1621: ; gcc does not account for register mask/argc longword. Thus the number
1622: ; for the call = number bytes for args + 4
1623:
1624: (define_insn "call"
1625: [(call (match_operand:QI 0 "memory_operand" "m")
1626: (match_operand:QI 1 "general_operand" "g"))]
1627: ""
1628: "*
1629: {
1630: operands[1] = gen_rtx (CONST_INT, VOIDmode, (INTVAL (operands[1]) + 4));
1631: if (GET_CODE(operands[0]) == MEM
1632: && CONSTANT_ADDRESS_P (XEXP(operands[0], 0))
1633: && INTVAL (operands[1]) < 64)
1634: return \"callf %1,%0\"; /* this is much faster */
1635: return \"calls %1,%0\";
1636: }")
1637:
1638: ; gcc does not account for register mask/argc longword. Thus the number
1639: ; for the call = number bytes for args + 4
1640:
1641: (define_insn "call_value"
1642: [(set (match_operand 0 "" "=g")
1643: (call (match_operand:QI 1 "memory_operand" "m")
1644: (match_operand:QI 2 "general_operand" "g")))]
1645: ""
1646: "*
1647: {
1648: operands[2] = gen_rtx (CONST_INT, VOIDmode, (INTVAL (operands[2]) + 4));
1649: if (GET_CODE(operands[1]) == MEM
1650: && CONSTANT_ADDRESS_P (XEXP(operands[1], 0))
1651: && INTVAL (operands[2]) < 64)
1652: return \"callf %2,%1\"; /* this is much faster */
1653: return \"calls %2,%1\";
1654: }")
1655:
1656:
1657: (define_insn "return"
1658: [(return)]
1659: ""
1660: "ret")
1661:
1662: (define_insn "nop"
1663: [(const_int 0)]
1664: ""
1665: "nop")
1666:
1667: ; casesi this code extracted from the vax code. The instructions are
1668: ; very similar. Tahoe requires that the table be word aligned. GCC
1669: ; places the table immediately after, thus the alignment directive.
1670:
1671: (define_insn "casesi"
1672: [(set (pc)
1673: (if_then_else (le (minus:SI (match_operand:SI 0 "general_operand" "g")
1674: (match_operand:SI 1 "general_operand" "g"))
1675: (match_operand:SI 2 "general_operand" "g"))
1676: (plus:SI (sign_extend:SI
1677: (mem:HI (plus:SI (pc)
1678: (minus:SI (match_dup 0)
1679: (match_dup 1)))))
1680: (label_ref:SI (match_operand 3 "" "")))
1681: (pc)))]
1682: ""
1683: "casel %0,%1,%2\;.align %@")
1684:
1685:
1686: (define_insn "jump"
1687: [(set (pc)
1688: (label_ref (match_operand 0 "" "")))]
1689: ""
1690: "jbr %l0")
1691:
1692:
1693: ;; This is the list of all the non-standard insn patterns
1694:
1695:
1696: ; This is used to access the address of a byte. This is similar to
1697: ; movqi, but the second operand had to be "address_operand" type, so
1698: ; it had to be an unnamed one.
1699:
1700: (define_insn ""
1701: [(set (match_operand:SI 0 "general_operand" "=g")
1702: (match_operand:QI 1 "address_operand" "p"))]
1703: ""
1704: "*
1705: {
1706: if (push_operand (operands[0], SImode))
1707: return \"pushab %a1\";
1708: return \"movab %a1,%0\";
1709: }")
1710:
1711: ; This is used to access the address of a word. This is similar to
1712: ; movhi, but the second operand had to be "address_operand" type, so
1713: ; it had to be an unnamed one.
1714:
1715: (define_insn ""
1716: [(set (match_operand:SI 0 "general_operand" "=g")
1717: (match_operand:HI 1 "address_operand" "p"))]
1718: ""
1719: "*
1720: {
1721: if (push_operand (operands[0], SImode))
1722: return \"pushaw %a1\";
1723: return \"movaw %a1,%0\";
1724: }")
1725:
1726: ; This is used to access the address of a long. This is similar to
1727: ; movsi, but the second operand had to be "address_operand" type, so
1728: ; it had to be an unnamed one.
1729:
1730: (define_insn ""
1731: [(set (match_operand:SI 0 "general_operand" "=g")
1732: (match_operand:SI 1 "address_operand" "p"))]
1733: ""
1734: "*
1735: {
1736: if (push_operand (operands[0], SImode))
1737: return \"pushal %a1\";
1738: return \"moval %a1,%0\";
1739: }")
1740:
1741:
1742: ; bit test longword instruction, same as vax
1743:
1744: (define_insn ""
1745: [(set (cc0)
1746: (and:SI (match_operand:SI 0 "general_operand" "g")
1747: (match_operand:SI 1 "general_operand" "g")))]
1748: ""
1749: "bitl %0,%1")
1750:
1751:
1752: ; bit test word instructions, same as vax
1753:
1754: (define_insn ""
1755: [(set (cc0)
1756: (and:HI (match_operand:HI 0 "general_operand" "g")
1757: (match_operand:HI 1 "general_operand" "g")))]
1758: ""
1759: "bitw %0,%1")
1760:
1761:
1762: ; bit test instructions, same as vax
1763:
1764: (define_insn ""
1765: [(set (cc0)
1766: (and:QI (match_operand:QI 0 "general_operand" "g")
1767: (match_operand:QI 1 "general_operand" "g")))]
1768: ""
1769: "bitb %0,%1")
1770:
1771:
1772: ; bne counterpart. in case gcc reverses the conditional.
1773:
1774: (define_insn ""
1775: [(set (pc)
1776: (if_then_else (eq (cc0)
1777: (const_int 0))
1778: (pc)
1779: (label_ref (match_operand 0 "" ""))))]
1780: ""
1781: "jneq %l0")
1782:
1783:
1784: ; beq counterpart. in case gcc reverses the conditional.
1785:
1786: (define_insn ""
1787: [(set (pc)
1788: (if_then_else (ne (cc0)
1789: (const_int 0))
1790: (pc)
1791: (label_ref (match_operand 0 "" ""))))]
1792: ""
1793: "jeql %l0")
1794:
1795:
1796: ; ble counterpart. in case gcc reverses the conditional.
1797:
1798: (define_insn ""
1799: [(set (pc)
1800: (if_then_else (gt (cc0)
1801: (const_int 0))
1802: (pc)
1803: (label_ref (match_operand 0 "" ""))))]
1804: ""
1805: "jleq %l0")
1806:
1807:
1808: ; bleu counterpart. in case gcc reverses the conditional.
1809:
1810: (define_insn ""
1811: [(set (pc)
1812: (if_then_else (gtu (cc0)
1813: (const_int 0))
1814: (pc)
1815: (label_ref (match_operand 0 "" ""))))]
1816: ""
1817: "jlequ %l0")
1818:
1819:
1820: ; bge counterpart. in case gcc reverses the conditional.
1821:
1822: (define_insn ""
1823: [(set (pc)
1824: (if_then_else (lt (cc0)
1825: (const_int 0))
1826: (pc)
1827: (label_ref (match_operand 0 "" ""))))]
1828: ""
1829: "jgeq %l0")
1830:
1831:
1832: ; bgeu counterpart. in case gcc reverses the conditional.
1833:
1834: (define_insn ""
1835: [(set (pc)
1836: (if_then_else (ltu (cc0)
1837: (const_int 0))
1838: (pc)
1839: (label_ref (match_operand 0 "" ""))))]
1840: ""
1841: "jgequ %l0")
1842:
1843:
1844: ; blt counterpart. in case gcc reverses the conditional.
1845:
1846: (define_insn ""
1847: [(set (pc)
1848: (if_then_else (ge (cc0)
1849: (const_int 0))
1850: (pc)
1851: (label_ref (match_operand 0 "" ""))))]
1852: ""
1853: "jlss %l0")
1854:
1855:
1856: ; bltu counterpart. in case gcc reverses the conditional.
1857:
1858: (define_insn ""
1859: [(set (pc)
1860: (if_then_else (geu (cc0)
1861: (const_int 0))
1862: (pc)
1863: (label_ref (match_operand 0 "" ""))))]
1864: ""
1865: "jlssu %l0")
1866:
1867:
1868: ; bgt counterpart. in case gcc reverses the conditional.
1869:
1870: (define_insn ""
1871: [(set (pc)
1872: (if_then_else (le (cc0)
1873: (const_int 0))
1874: (pc)
1875: (label_ref (match_operand 0 "" ""))))]
1876: ""
1877: "jgtr %l0")
1878:
1879:
1880: ; bgtu counterpart. in case gcc reverses the conditional.
1881:
1882: (define_insn ""
1883: [(set (pc)
1884: (if_then_else (leu (cc0)
1885: (const_int 0))
1886: (pc)
1887: (label_ref (match_operand 0 "" ""))))]
1888: ""
1889: "jgtru %l0")
1890:
1891:
1892: ; casesi alternate form as found in vax code. this form is to
1893: ; compensate for the table's offset being no distance (0 displacement)
1894:
1895: (define_insn ""
1896: [(set (pc)
1897: (if_then_else (le (match_operand:SI 0 "general_operand" "g")
1898: (match_operand:SI 1 "general_operand" "g"))
1899: (plus:SI (sign_extend:SI
1900: (mem:HI (plus:SI (pc)
1901: (minus:SI (match_dup 0)
1902: (const_int 0)))))
1903: (label_ref:SI (match_operand 3 "" "")))
1904: (pc)))]
1905: ""
1906: "casel %0,$0,%1\;.align %@")
1907:
1908:
1909: ; casesi alternate form as found in vax code. another form to
1910: ; compensate for the table's offset being no distance (0 displacement)
1911:
1912: (define_insn ""
1913: [(set (pc)
1914: (if_then_else (le (match_operand:SI 0 "general_operand" "g")
1915: (match_operand:SI 1 "general_operand" "g"))
1916: (plus:SI (sign_extend:SI
1917: (mem:HI (plus:SI (pc)
1918: (match_dup 0))))
1919: (label_ref:SI (match_operand 3 "" "")))
1920: (pc)))]
1921: ""
1922: "casel %0,$0,%1 \;.align %@")
1923:
1924: (define_insn ""
1925: [(set (pc)
1926: (if_then_else
1927: (lt (plus:SI (match_operand:SI 0 "general_operand" "+g")
1928: (const_int 1))
1929: (match_operand:SI 1 "general_operand" "g"))
1930: (label_ref (match_operand 2 "" ""))
1931: (pc)))
1932: (set (match_dup 0)
1933: (plus:SI (match_dup 0)
1934: (const_int 1)))]
1935: ""
1936: "aoblss %1,%0,%l2")
1937:
1938: (define_insn ""
1939: [(set (pc)
1940: (if_then_else
1941: (le (plus:SI (match_operand:SI 0 "general_operand" "+g")
1942: (const_int 1))
1943: (match_operand:SI 1 "general_operand" "g"))
1944: (label_ref (match_operand 2 "" ""))
1945: (pc)))
1946: (set (match_dup 0)
1947: (plus:SI (match_dup 0)
1948: (const_int 1)))]
1949: ""
1950: "aobleq %1,%0,%l2")
1951:
1952: (define_insn ""
1953: [(set (pc)
1954: (if_then_else
1955: (ge (plus:SI (match_operand:SI 0 "general_operand" "+g")
1956: (const_int 1))
1957: (match_operand:SI 1 "general_operand" "g"))
1958: (pc)
1959: (label_ref (match_operand 2 "" ""))))
1960: (set (match_dup 0)
1961: (plus:SI (match_dup 0)
1962: (const_int 1)))]
1963: ""
1964: "aoblss %1,%0,%l2")
1965:
1966: (define_insn ""
1967: [(set (pc)
1968: (if_then_else
1969: (gt (plus:SI (match_operand:SI 0 "general_operand" "+g")
1970: (const_int 1))
1971: (match_operand:SI 1 "general_operand" "g"))
1972: (pc)
1973: (label_ref (match_operand 2 "" ""))))
1974: (set (match_dup 0)
1975: (plus:SI (match_dup 0)
1976: (const_int 1)))]
1977: ""
1978: "aobleq %1,%0,%l2")
1979:
1980: ; bbs/bbc
1981:
1982: (define_insn ""
1983: [(set (pc)
1984: (if_then_else
1985: (ne (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: (label_ref (match_operand 2 "" ""))
1990: (pc)))]
1991: ""
1992: "bbs %1,%0,%l2")
1993:
1994: (define_insn ""
1995: [(set (pc)
1996: (if_then_else
1997: (eq (sign_extract:SI (match_operand:SI 0 "nonimmediate_operand" "rm")
1998: (const_int 1)
1999: (subreg:QI (match_operand:SI 1 "general_operand" "g") 0))
2000: (const_int 0))
2001: (label_ref (match_operand 2 "" ""))
2002: (pc)))]
2003: ""
2004: "bbc %1,%0,%l2")
2005:
2006: (define_insn ""
2007: [(set (pc)
2008: (if_then_else
2009: (ne (sign_extract:SI (match_operand:SI 0 "nonimmediate_operand" "rm")
2010: (const_int 1)
2011: (subreg:QI (match_operand:SI 1 "general_operand" "g") 0))
2012: (const_int 0))
2013: (pc)
2014: (label_ref (match_operand 2 "" ""))))]
2015: ""
2016: "bbc %1,%0,%l2")
2017:
2018: (define_insn ""
2019: [(set (pc)
2020: (if_then_else
2021: (eq (sign_extract:SI (match_operand:SI 0 "nonimmediate_operand" "rm")
2022: (const_int 1)
2023: (subreg:QI (match_operand:SI 1 "general_operand" "g") 0))
2024: (const_int 0))
2025: (pc)
2026: (label_ref (match_operand 2 "" ""))))]
2027: ""
2028: "bbs %1,%0,%l2")
2029:
2030: ; if the shift count is a byte in a register we can use it as a long
2031:
2032: (define_insn ""
2033: [(set (pc)
2034: (if_then_else
2035: (ne (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: (label_ref (match_operand 2 "" ""))
2040: (pc)))]
2041: ""
2042: "bbs %1,%0,%l2")
2043:
2044: (define_insn ""
2045: [(set (pc)
2046: (if_then_else
2047: (eq (sign_extract:SI (match_operand:SI 0 "nonimmediate_operand" "rm")
2048: (const_int 1)
2049: (match_operand:QI 1 "register_operand" "r"))
2050: (const_int 0))
2051: (label_ref (match_operand 2 "" ""))
2052: (pc)))]
2053: ""
2054: "bbc %1,%0,%l2")
2055:
2056: (define_insn ""
2057: [(set (pc)
2058: (if_then_else
2059: (ne (sign_extract:SI (match_operand:SI 0 "nonimmediate_operand" "rm")
2060: (const_int 1)
2061: (match_operand:QI 1 "register_operand" "r"))
2062: (const_int 0))
2063: (pc)
2064: (label_ref (match_operand 2 "" ""))))]
2065: ""
2066: "bbc %1,%0,%l2")
2067:
2068: (define_insn ""
2069: [(set (pc)
2070: (if_then_else
2071: (eq (sign_extract:SI (match_operand:SI 0 "nonimmediate_operand" "rm")
2072: (const_int 1)
2073: (match_operand:QI 1 "register_operand" "r"))
2074: (const_int 0))
2075: (pc)
2076: (label_ref (match_operand 2 "" ""))))]
2077: ""
2078: "bbs %1,%0,%l2")
2079:
2080: ; special case for 1 << constant. We don't do these because they are slower
2081: ; than the bitl instruction
2082:
2083: ;(define_insn ""
2084: ; [(set (pc)
2085: ; (if_then_else
2086: ; (ne (and:SI (match_operand:SI 0 "nonimmediate_operand" "%rm")
2087: ; (match_operand:SI 1 "immediate_operand" "i"))
2088: ; (const_int 0))
2089: ; (label_ref (match_operand 2 "" ""))
2090: ; (pc)))]
2091: ; "GET_CODE (operands[1]) == CONST_INT
2092: ; && exact_log2 (INTVAL (operands[1])) >= 0"
2093: ; "*
2094: ;{
2095: ; operands[1]
2096: ; = gen_rtx (CONST_INT, VOIDmode, exact_log2 (INTVAL (operands[1])));
2097: ; return \"bbs %1,%0,%l2\";
2098: ;}")
2099: ;
2100: ;(define_insn ""
2101: ; [(set (pc)
2102: ; (if_then_else
2103: ; (eq (and:SI (match_operand:SI 0 "nonimmediate_operand" "%rm")
2104: ; (match_operand:SI 1 "immediate_operand" "i"))
2105: ; (const_int 0))
2106: ; (label_ref (match_operand 2 "" ""))
2107: ; (pc)))]
2108: ; "GET_CODE (operands[1]) == CONST_INT
2109: ; && exact_log2 (INTVAL (operands[1])) >= 0"
2110: ; "*
2111: ;{
2112: ; operands[1]
2113: ; = gen_rtx (CONST_INT, VOIDmode, exact_log2 (INTVAL (operands[1])));
2114: ; return \"bbc %1,%0,%l2\";
2115: ;}")
2116: ;
2117: ;(define_insn ""
2118: ; [(set (pc)
2119: ; (if_then_else
2120: ; (ne (and:SI (match_operand:SI 0 "nonimmediate_operand" "%rm")
2121: ; (match_operand:SI 1 "immediate_operand" "i"))
2122: ; (const_int 0))
2123: ; (pc)
2124: ; (label_ref (match_operand 2 "" ""))))]
2125: ; "GET_CODE (operands[1]) == CONST_INT
2126: ; && exact_log2 (INTVAL (operands[1])) >= 0"
2127: ; "*
2128: ;{
2129: ; operands[1]
2130: ; = gen_rtx (CONST_INT, VOIDmode, exact_log2 (INTVAL (operands[1])));
2131: ; return \"bbc %1,%0,%l2\";
2132: ;}")
2133: ;
2134: ;(define_insn ""
2135: ; [(set (pc)
2136: ; (if_then_else
2137: ; (eq (and:SI (match_operand:SI 0 "nonimmediate_operand" "%rm")
2138: ; (match_operand:SI 1 "immediate_operand" "i"))
2139: ; (const_int 0))
2140: ; (pc)
2141: ; (label_ref (match_operand 2 "" ""))))]
2142: ; "GET_CODE (operands[1]) == CONST_INT
2143: ; && exact_log2 (INTVAL (operands[1])) >= 0"
2144: ; "*
2145: ;{
2146: ; operands[1]
2147: ; = gen_rtx (CONST_INT, VOIDmode, exact_log2 (INTVAL (operands[1])));
2148: ; return \"bbs %1,%0,%l2\";
2149: ;}")
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.