|
|
1.1 root 1: ;;- Machine description for GNU compiler
2: ;;- AT&T we32000 Version
3: ;; Contributed by John Wehle ([email protected])
4: ;; Copyright (C) 1991-1992 Free Software Foundation, Inc.
5:
6: ;; This file is part of GNU CC.
7:
8: ;; GNU CC is free software; you can redistribute it and/or modify
9: ;; it under the terms of the GNU General Public License as published by
10: ;; the Free Software Foundation; either version 1, or (at your option)
11: ;; any later version.
12:
13: ;; GNU CC is distributed in the hope that it will be useful,
14: ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
15: ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16: ;; GNU General Public License for more details.
17:
18: ;; You should have received a copy of the GNU General Public License
19: ;; along with GNU CC; see the file COPYING. If not, write to
20: ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
21:
22:
23: ;;- instruction definitions
24:
25: ;;- @@The original PO technology requires these to be ordered by speed,
26: ;;- @@ so that assigner will pick the fastest.
27:
28: ;;- See file "rtl.def" for documentation on define_insn, match_*, et. al.
29:
30: ;;- When naming insn's (operand 0 of define_insn) be careful about using
31: ;;- names from other targets machine descriptions.
32:
33: ;; move instructions
34:
35: (define_insn ""
36: [(set (match_operand:DF 0 "push_operand" "=m")
37: (match_operand:DF 1 "general_operand" "mrF"))]
38: ""
39: "*
40: {
41: output_push_double(&operands[1]);
42:
43: return \"\";
44: }")
45:
46: (define_insn "movdf"
47: [(set (match_operand:DF 0 "nonimmediate_operand" "=mr")
48: (match_operand:DF 1 "general_operand" "mrF"))]
49: ""
50: "*
51: {
52: output_move_double(operands);
53:
54: return \"\";
55: }")
56:
57: (define_insn ""
58: [(set (match_operand:SF 0 "push_operand" "=m")
59: (match_operand:SF 1 "general_operand" "mrF"))]
60: ""
61: "pushw %1")
62:
63: (define_insn "movsf"
64: [(set (match_operand:SF 0 "nonimmediate_operand" "=mr")
65: (match_operand:SF 1 "general_operand" "mrF"))]
66: ""
67: "movw %1, %0")
68:
69: (define_insn ""
70: [(set (match_operand:DI 0 "push_operand" "=m")
71: (match_operand:DI 1 "general_operand" "mriF"))]
72: ""
73: "*
74: {
75: output_push_double(&operands[1]);
76:
77: return \"\";
78: }")
79:
80: (define_insn "movdi"
81: [(set (match_operand:DI 0 "nonimmediate_operand" "=mr")
82: (match_operand:DI 1 "general_operand" "mriF"))]
83: ""
84: "*
85: {
86: output_move_double(operands);
87:
88: return \"\";
89: }")
90:
91: (define_insn ""
92: [(set (match_operand:SI 0 "push_operand" "=m")
93: (match_operand:SI 1 "general_operand" "mri"))]
94: ""
95: "pushw %1")
96:
97: (define_insn "movsi"
98: [(set (match_operand:SI 0 "nonimmediate_operand" "=mr")
99: (match_operand:SI 1 "general_operand" "mri"))]
100: ""
101: "movw %1, %0")
102:
103: (define_insn "movhi"
104: [(set (match_operand:HI 0 "nonimmediate_operand" "=mr")
105: (match_operand:HI 1 "general_operand" "mri"))]
106: ""
107: "movh %1, %0")
108:
109: (define_insn "movqi"
110: [(set (match_operand:QI 0 "nonimmediate_operand" "=mr")
111: (match_operand:QI 1 "general_operand" "mri"))]
112: ""
113: "movb %1, %0")
114:
115: ;; add instructions
116:
117: (define_insn ""
118: [(set (match_operand:DI 0 "nonimmediate_operand" "=&or")
119: (plus:DI (match_operand:DI 1 "nonimmediate_operand" "0")
120: (match_operand:DI 2 "general_operand" "oriF")))]
121: ""
122: "*
123: {
124: rtx label[1];
125: rtx lsw_operands[3];
126:
127: if (GET_CODE (operands[0]) == REG)
128: lsw_operands[0] = gen_rtx(REG, SImode, REGNO (operands[0]) + 1);
129: else
130: if (GET_CODE (operands[0]) == MEM && offsettable_memref_p (operands[0]))
131: lsw_operands[0] = adj_offsettable_operand(operands[0], 4);
132: else
133: abort();
134:
135: if (GET_CODE (operands[2]) == REG)
136: lsw_operands[2] = gen_rtx(REG, SImode, REGNO (operands[2]) + 1);
137: else
138: if (GET_CODE (operands[2]) == MEM && offsettable_memref_p (operands[2]))
139: lsw_operands[2] = adj_offsettable_operand(operands[2], 4);
140: else
141: if (GET_CODE (operands[2]) == CONST_DOUBLE)
142: {
143: lsw_operands[2] = gen_rtx(CONST_INT, SImode,
144: CONST_DOUBLE_HIGH(operands[2]));
145: operands[2] = gen_rtx(CONST_INT, SImode,
146: CONST_DOUBLE_LOW(operands[2]));
147: }
148: else
149: if (GET_CODE (operands[2]) == CONST_INT)
150: {
151: lsw_operands[2] = operands[2];
152: operands[2] = const0_rtx;
153: }
154: else
155: abort();
156:
157: label[0] = gen_label_rtx();
158: LABEL_NUSES(label[0]) = 1;
159:
160: output_asm_insn(\"addw2 %2, %0\", operands);
161: output_asm_insn(\"addw2 %2, %0\", lsw_operands);
162: output_asm_insn(\"BCCB %l0\", label);
163: output_asm_insn(\"INCW %0\", operands);
164: output_asm_insn(\"%l0:\", label);
165:
166: return \"\";
167: }")
168:
169: (define_insn "adddi3"
170: [(set (match_operand:DI 0 "nonimmediate_operand" "=&or")
171: (plus:DI (match_operand:DI 1 "general_operand" "oriF")
172: (match_operand:DI 2 "general_operand" "oriF")))]
173: ""
174: "*
175: {
176: rtx label[1];
177: rtx lsw_operands[3];
178:
179: if (GET_CODE (operands[0]) == REG)
180: lsw_operands[0] = gen_rtx(REG, SImode, REGNO (operands[0]) + 1);
181: else
182: if (GET_CODE (operands[0]) == MEM && offsettable_memref_p (operands[0]))
183: lsw_operands[0] = adj_offsettable_operand(operands[0], 4);
184: else
185: abort();
186:
187: if (GET_CODE (operands[1]) == REG)
188: lsw_operands[1] = gen_rtx(REG, SImode, REGNO (operands[1]) + 1);
189: else
190: if (GET_CODE (operands[1]) == MEM && offsettable_memref_p (operands[1]))
191: lsw_operands[1] = adj_offsettable_operand(operands[1], 4);
192: else
193: if (GET_CODE (operands[1]) == CONST_DOUBLE)
194: {
195: lsw_operands[1] = gen_rtx(CONST_INT, SImode,
196: CONST_DOUBLE_HIGH(operands[1]));
197: operands[1] = gen_rtx(CONST_INT, SImode,
198: CONST_DOUBLE_LOW(operands[1]));
199: }
200: else
201: if (GET_CODE (operands[1]) == CONST_INT)
202: {
203: lsw_operands[1] = operands[1];
204: operands[1] = const0_rtx;
205: }
206: else
207: abort();
208:
209: if (GET_CODE (operands[2]) == REG)
210: lsw_operands[2] = gen_rtx(REG, SImode, REGNO (operands[2]) + 1);
211: else
212: if (GET_CODE (operands[2]) == MEM && offsettable_memref_p (operands[2]))
213: lsw_operands[2] = adj_offsettable_operand(operands[2], 4);
214: else
215: if (GET_CODE (operands[2]) == CONST_DOUBLE)
216: {
217: lsw_operands[2] = gen_rtx(CONST_INT, SImode,
218: CONST_DOUBLE_HIGH(operands[2]));
219: operands[2] = gen_rtx(CONST_INT, SImode,
220: CONST_DOUBLE_LOW(operands[2]));
221: }
222: else
223: if (GET_CODE (operands[2]) == CONST_INT)
224: {
225: lsw_operands[2] = operands[2];
226: operands[2] = const0_rtx;
227: }
228: else
229: abort();
230:
231: label[0] = gen_label_rtx();
232: LABEL_NUSES(label[0]) = 1;
233:
234: output_asm_insn(\"addw3 %2, %1, %0\", operands);
235: output_asm_insn(\"addw3 %2, %1, %0\", lsw_operands);
236: output_asm_insn(\"BCCB %l0\", label);
237: output_asm_insn(\"INCW %0\", operands);
238: output_asm_insn(\"%l0:\", label);
239:
240: return \"\";
241: }")
242:
243: (define_insn ""
244: [(set (match_operand:SI 0 "nonimmediate_operand" "=mr")
245: (plus:SI (match_operand:SI 1 "nonimmediate_operand" "0")
246: (match_operand:SI 2 "general_operand" "mri")))]
247: ""
248: "addw2 %2, %0")
249:
250: (define_insn "addsi3"
251: [(set (match_operand:SI 0 "nonimmediate_operand" "=mr")
252: (plus:SI (match_operand:SI 1 "general_operand" "mri")
253: (match_operand:SI 2 "general_operand" "mri")))]
254: ""
255: "addw3 %2, %1, %0")
256:
257: (define_insn ""
258: [(set (match_operand:HI 0 "nonimmediate_operand" "=mr")
259: (plus:HI (match_operand:HI 1 "nonimmediate_operand" "0")
260: (match_operand:HI 2 "general_operand" "mri")))]
261: ""
262: "addh2 %2, %0")
263:
264: (define_insn "addhi3"
265: [(set (match_operand:HI 0 "nonimmediate_operand" "=mr")
266: (plus:HI (match_operand:HI 1 "general_operand" "mri")
267: (match_operand:HI 2 "general_operand" "mri")))]
268: ""
269: "addh3 %2, %1, %0")
270:
271: (define_insn ""
272: [(set (match_operand:QI 0 "nonimmediate_operand" "=mr")
273: (plus:QI (match_operand:QI 1 "nonimmediate_operand" "0")
274: (match_operand:QI 2 "general_operand" "mri")))]
275: ""
276: "addb2 %2, %0")
277:
278: (define_insn "addqi3"
279: [(set (match_operand:QI 0 "nonimmediate_operand" "=mr")
280: (plus:QI (match_operand:QI 1 "general_operand" "mri")
281: (match_operand:QI 2 "general_operand" "mri")))]
282: ""
283: "addb3 %2, %1, %0")
284:
285: ;; subtract instructions
286:
287: (define_insn ""
288: [(set (match_operand:DI 0 "nonimmediate_operand" "=&or")
289: (minus:DI (match_operand:DI 1 "nonimmediate_operand" "0")
290: (match_operand:DI 2 "general_operand" "oriF")))]
291: ""
292: "*
293: {
294: rtx label[1];
295: rtx lsw_operands[3];
296:
297: if (GET_CODE (operands[0]) == REG)
298: lsw_operands[0] = gen_rtx(REG, SImode, REGNO (operands[0]) + 1);
299: else
300: if (GET_CODE (operands[0]) == MEM && offsettable_memref_p (operands[0]))
301: lsw_operands[0] = adj_offsettable_operand(operands[0], 4);
302: else
303: abort();
304:
305: if (GET_CODE (operands[2]) == REG)
306: lsw_operands[2] = gen_rtx(REG, SImode, REGNO (operands[2]) + 1);
307: else
308: if (GET_CODE (operands[2]) == MEM && offsettable_memref_p (operands[2]))
309: lsw_operands[2] = adj_offsettable_operand(operands[2], 4);
310: else
311: if (GET_CODE (operands[2]) == CONST_DOUBLE)
312: {
313: lsw_operands[2] = gen_rtx(CONST_INT, SImode,
314: CONST_DOUBLE_HIGH(operands[2]));
315: operands[2] = gen_rtx(CONST_INT, SImode,
316: CONST_DOUBLE_LOW(operands[2]));
317: }
318: else
319: if (GET_CODE (operands[2]) == CONST_INT)
320: {
321: lsw_operands[2] = operands[2];
322: operands[2] = const0_rtx;
323: }
324: else
325: abort();
326:
327: label[0] = gen_label_rtx();
328: LABEL_NUSES(label[0]) = 1;
329:
330: output_asm_insn(\"subw2 %2, %0\", operands);
331: output_asm_insn(\"subw2 %2, %0\", lsw_operands);
332: output_asm_insn(\"BCCB %l0\", label);
333: output_asm_insn(\"DECW %0\", operands);
334: output_asm_insn(\"%l0:\", label);
335:
336: return \"\";
337: }")
338:
339: (define_insn "subdi3"
340: [(set (match_operand:DI 0 "nonimmediate_operand" "=&or")
341: (minus:DI (match_operand:DI 1 "general_operand" "oriF")
342: (match_operand:DI 2 "general_operand" "oriF")))]
343: ""
344: "*
345: {
346: rtx label[1];
347: rtx lsw_operands[3];
348:
349: if (GET_CODE (operands[0]) == REG)
350: lsw_operands[0] = gen_rtx(REG, SImode, REGNO (operands[0]) + 1);
351: else
352: if (GET_CODE (operands[0]) == MEM && offsettable_memref_p (operands[0]))
353: lsw_operands[0] = adj_offsettable_operand(operands[0], 4);
354: else
355: abort();
356:
357: if (GET_CODE (operands[1]) == REG)
358: lsw_operands[1] = gen_rtx(REG, SImode, REGNO (operands[1]) + 1);
359: else
360: if (GET_CODE (operands[1]) == MEM && offsettable_memref_p (operands[1]))
361: lsw_operands[1] = adj_offsettable_operand(operands[1], 4);
362: else
363: if (GET_CODE (operands[1]) == CONST_DOUBLE)
364: {
365: lsw_operands[1] = gen_rtx(CONST_INT, SImode,
366: CONST_DOUBLE_HIGH(operands[1]));
367: operands[1] = gen_rtx(CONST_INT, SImode,
368: CONST_DOUBLE_LOW(operands[1]));
369: }
370: else
371: if (GET_CODE (operands[1]) == CONST_INT)
372: {
373: lsw_operands[1] = operands[1];
374: operands[1] = const0_rtx;
375: }
376: else
377: abort();
378:
379: if (GET_CODE (operands[2]) == REG)
380: lsw_operands[2] = gen_rtx(REG, SImode, REGNO (operands[2]) + 1);
381: else
382: if (GET_CODE (operands[2]) == MEM && offsettable_memref_p (operands[2]))
383: lsw_operands[2] = adj_offsettable_operand(operands[2], 4);
384: else
385: if (GET_CODE (operands[2]) == CONST_DOUBLE)
386: {
387: lsw_operands[2] = gen_rtx(CONST_INT, SImode,
388: CONST_DOUBLE_HIGH(operands[2]));
389: operands[2] = gen_rtx(CONST_INT, SImode,
390: CONST_DOUBLE_LOW(operands[2]));
391: }
392: else
393: if (GET_CODE (operands[2]) == CONST_INT)
394: {
395: lsw_operands[2] = operands[2];
396: operands[2] = const0_rtx;
397: }
398: else
399: abort();
400:
401: label[0] = gen_label_rtx();
402: LABEL_NUSES(label[0]) = 1;
403:
404: output_asm_insn(\"subw3 %2, %1, %0\", operands);
405: output_asm_insn(\"subw3 %2, %1, %0\", lsw_operands);
406: output_asm_insn(\"BCCB %l0\", label);
407: output_asm_insn(\"DECW %0\", operands);
408: output_asm_insn(\"%l0:\", label);
409:
410: return \"\";
411: }")
412:
413: (define_insn ""
414: [(set (match_operand:SI 0 "nonimmediate_operand" "=mr")
415: (minus:SI (match_operand:SI 1 "nonimmediate_operand" "0")
416: (match_operand:SI 2 "general_operand" "mri")))]
417: ""
418: "subw2 %2, %0")
419:
420: (define_insn "subsi3"
421: [(set (match_operand:SI 0 "nonimmediate_operand" "=mr")
422: (minus:SI (match_operand:SI 1 "general_operand" "mri")
423: (match_operand:SI 2 "general_operand" "mri")))]
424: ""
425: "subw3 %2, %1, %0")
426:
427: (define_insn ""
428: [(set (match_operand:HI 0 "nonimmediate_operand" "=mr")
429: (minus:HI (match_operand:HI 1 "nonimmediate_operand" "0")
430: (match_operand:HI 2 "general_operand" "mri")))]
431: ""
432: "subh2 %2, %0")
433:
434: (define_insn "subhi3"
435: [(set (match_operand:HI 0 "nonimmediate_operand" "=mr")
436: (minus:HI (match_operand:HI 1 "general_operand" "mri")
437: (match_operand:HI 2 "general_operand" "mri")))]
438: ""
439: "subh3 %2, %1, %0")
440:
441: (define_insn ""
442: [(set (match_operand:QI 0 "nonimmediate_operand" "=mr")
443: (minus:QI (match_operand:QI 1 "nonimmediate_operand" "0")
444: (match_operand:QI 2 "general_operand" "mri")))]
445: ""
446: "subb2 %2, %0")
447:
448: (define_insn "subqi3"
449: [(set (match_operand:QI 0 "nonimmediate_operand" "=mr")
450: (minus:QI (match_operand:QI 1 "general_operand" "mri")
451: (match_operand:QI 2 "general_operand" "mri")))]
452: ""
453: "subb3 %2, %1, %0")
454:
455: ;; signed multiply instructions
456:
457: (define_insn ""
458: [(set (match_operand:SI 0 "nonimmediate_operand" "=mr")
459: (mult:SI (match_operand:SI 1 "nonimmediate_operand" "0")
460: (match_operand:SI 2 "general_operand" "mri")))]
461: ""
462: "mulw2 %2, %0")
463:
464: (define_insn "mulsi3"
465: [(set (match_operand:SI 0 "nonimmediate_operand" "=mr")
466: (mult:SI (match_operand:SI 1 "general_operand" "mri")
467: (match_operand:SI 2 "general_operand" "mri")))]
468: ""
469: "mulw3 %2, %1, %0")
470:
471: ;; signed divide instructions
472:
473: (define_insn ""
474: [(set (match_operand:SI 0 "nonimmediate_operand" "=mr")
475: (div:SI (match_operand:SI 1 "nonimmediate_operand" "0")
476: (match_operand:SI 2 "general_operand" "mri")))]
477: ""
478: "divw2 %2, %0")
479:
480: (define_insn "divsi3"
481: [(set (match_operand:SI 0 "nonimmediate_operand" "=mr")
482: (div:SI (match_operand:SI 1 "general_operand" "mri")
483: (match_operand:SI 2 "general_operand" "mri")))]
484: ""
485: "divw3 %2, %1, %0")
486:
487: ;; signed modulus instruction
488:
489: (define_insn ""
490: [(set (match_operand:SI 0 "nonimmediate_operand" "=mr")
491: (mod:SI (match_operand:SI 1 "nonimmediate_operand" "0")
492: (match_operand:SI 2 "general_operand" "mri")))]
493: ""
494: "modw2 %2, %0")
495:
496: (define_insn "modsi3"
497: [(set (match_operand:SI 0 "nonimmediate_operand" "=mr")
498: (mod:SI (match_operand:SI 1 "general_operand" "mri")
499: (match_operand:SI 2 "general_operand" "mri")))]
500: ""
501: "modw3 %2, %1, %0")
502:
503: ;; unsigned divide instruction
504:
505: (define_insn ""
506: [(set (match_operand:SI 0 "nonimmediate_operand" "=mr")
507: (udiv:SI (match_operand:SI 1 "nonimmediate_operand" "0")
508: (match_operand:SI 2 "general_operand" "mri")))]
509: ""
510: "udivw2 %2, %0")
511:
512: (define_insn "udivsi3"
513: [(set (match_operand:SI 0 "nonimmediate_operand" "=mr")
514: (udiv:SI (match_operand:SI 1 "general_operand" "mri")
515: (match_operand:SI 2 "general_operand" "mri")))]
516: ""
517: "udivw3 %2, %1, %0")
518:
519: ;; unsigned modulus instruction
520:
521: (define_insn ""
522: [(set (match_operand:SI 0 "nonimmediate_operand" "=mr")
523: (umod:SI (match_operand:SI 1 "nonimmediate_operand" "0")
524: (match_operand:SI 2 "general_operand" "mri")))]
525: ""
526: "umodw2 %2, %0")
527:
528: (define_insn "umodsi3"
529: [(set (match_operand:SI 0 "nonimmediate_operand" "=mr")
530: (umod:SI (match_operand:SI 1 "general_operand" "mri")
531: (match_operand:SI 2 "general_operand" "mri")))]
532: ""
533: "umodw3 %2, %1, %0")
534:
535: ;; logical-and instructions
536:
537: (define_insn ""
538: [(set (match_operand:SI 0 "nonimmediate_operand" "=mr")
539: (and:SI (match_operand:SI 1 "nonimmediate_operand" "0")
540: (match_operand:SI 2 "general_operand" "mri")))]
541: ""
542: "andw2 %2, %0")
543:
544: (define_insn "andsi3"
545: [(set (match_operand:SI 0 "nonimmediate_operand" "=mr")
546: (and:SI (match_operand:SI 1 "general_operand" "mri")
547: (match_operand:SI 2 "general_operand" "mri")))]
548: ""
549: "andw3 %2, %1, %0")
550:
551: (define_insn ""
552: [(set (match_operand:HI 0 "nonimmediate_operand" "=mr")
553: (and:HI (match_operand:HI 1 "nonimmediate_operand" "0")
554: (match_operand:HI 2 "general_operand" "mri")))]
555: ""
556: "andh2 %2, %0")
557:
558: (define_insn "andhi3"
559: [(set (match_operand:HI 0 "nonimmediate_operand" "=mr")
560: (and:HI (match_operand:HI 1 "general_operand" "mri")
561: (match_operand:HI 2 "general_operand" "mri")))]
562: ""
563: "andh3 %2, %1, %0")
564:
565: (define_insn ""
566: [(set (match_operand:QI 0 "nonimmediate_operand" "=mr")
567: (and:QI (match_operand:QI 1 "nonimmediate_operand" "0")
568: (match_operand:QI 2 "general_operand" "mri")))]
569: ""
570: "andb2 %2, %0")
571:
572: (define_insn "andqi3"
573: [(set (match_operand:QI 0 "nonimmediate_operand" "=mr")
574: (and:QI (match_operand:QI 1 "general_operand" "mri")
575: (match_operand:QI 2 "general_operand" "mri")))]
576: ""
577: "andb3 %2, %1, %0")
578:
579: ;; inclusive-or instructions
580:
581: (define_insn ""
582: [(set (match_operand:SI 0 "nonimmediate_operand" "=mr")
583: (ior:SI (match_operand:SI 1 "nonimmediate_operand" "0")
584: (match_operand:SI 2 "general_operand" "mri")))]
585: ""
586: "orw2 %2, %0")
587:
588: (define_insn "iorsi3"
589: [(set (match_operand:SI 0 "nonimmediate_operand" "=mr")
590: (ior:SI (match_operand:SI 1 "general_operand" "mri")
591: (match_operand:SI 2 "general_operand" "mri")))]
592: ""
593: "orw3 %2, %1, %0")
594:
595: (define_insn ""
596: [(set (match_operand:HI 0 "nonimmediate_operand" "=mr")
597: (ior:HI (match_operand:HI 1 "nonimmediate_operand" "0")
598: (match_operand:HI 2 "general_operand" "mri")))]
599: ""
600: "orh2 %2, %0")
601:
602: (define_insn "iorhi3"
603: [(set (match_operand:HI 0 "nonimmediate_operand" "=mr")
604: (ior:HI (match_operand:HI 1 "general_operand" "mri")
605: (match_operand:HI 2 "general_operand" "mri")))]
606: ""
607: "orh3 %2, %1, %0")
608:
609: (define_insn ""
610: [(set (match_operand:QI 0 "nonimmediate_operand" "=mr")
611: (ior:QI (match_operand:QI 1 "nonimmediate_operand" "0")
612: (match_operand:QI 2 "general_operand" "mri")))]
613: ""
614: "orb2 %2, %0")
615:
616: (define_insn "iorqi3"
617: [(set (match_operand:QI 0 "nonimmediate_operand" "=mr")
618: (ior:QI (match_operand:QI 1 "general_operand" "mri")
619: (match_operand:QI 2 "general_operand" "mri")))]
620: ""
621: "orb3 %2, %1, %0")
622:
623: ;; exclusive-or instructions
624:
625: (define_insn ""
626: [(set (match_operand:SI 0 "nonimmediate_operand" "=mr")
627: (xor:SI (match_operand:SI 1 "nonimmediate_operand" "0")
628: (match_operand:SI 2 "general_operand" "mri")))]
629: ""
630: "xorw2 %2, %0")
631:
632: (define_insn "xorsi3"
633: [(set (match_operand:SI 0 "nonimmediate_operand" "=mr")
634: (xor:SI (match_operand:SI 1 "general_operand" "mri")
635: (match_operand:SI 2 "general_operand" "mri")))]
636: ""
637: "xorw3 %2, %1, %0")
638:
639: (define_insn ""
640: [(set (match_operand:HI 0 "nonimmediate_operand" "=mr")
641: (xor:HI (match_operand:HI 1 "nonimmediate_operand" "0")
642: (match_operand:HI 2 "general_operand" "mri")))]
643: ""
644: "xorh2 %2, %0")
645:
646: (define_insn "xorhi3"
647: [(set (match_operand:HI 0 "nonimmediate_operand" "=mr")
648: (xor:HI (match_operand:HI 1 "general_operand" "mri")
649: (match_operand:HI 2 "general_operand" "mri")))]
650: ""
651: "xorh3 %2, %1, %0")
652:
653: (define_insn ""
654: [(set (match_operand:QI 0 "nonimmediate_operand" "=mr")
655: (xor:QI (match_operand:QI 1 "nonimmediate_operand" "0")
656: (match_operand:QI 2 "general_operand" "mri")))]
657: ""
658: "xorb2 %2, %0")
659:
660: (define_insn "xorqi3"
661: [(set (match_operand:QI 0 "nonimmediate_operand" "=mr")
662: (xor:QI (match_operand:QI 1 "general_operand" "mri")
663: (match_operand:QI 2 "general_operand" "mri")))]
664: ""
665: "xorb3 %2, %1, %0")
666:
667: ;; arithmetic shift instructions
668:
669: (define_insn "ashlsi3"
670: [(set (match_operand:SI 0 "nonimmediate_operand" "=mr")
671: (ashift:SI (match_operand:SI 1 "general_operand" "mri")
672: (match_operand:SI 2 "general_operand" "mri")))]
673: ""
674: "LLSW3 %2, %1, %0")
675:
676: (define_insn "ashrsi3"
677: [(set (match_operand:SI 0 "nonimmediate_operand" "=mr")
678: (ashiftrt:SI (match_operand:SI 1 "general_operand" "mri")
679: (match_operand:SI 2 "general_operand" "mri")))]
680: ""
681: "ARSW3 %2, %1, %0")
682:
683: ;; logical shift instructions
684:
685: ;; (define_insn "lshlsi3"
686: ;; [(set (match_operand:SI 0 "nonimmediate_operand" "=mr")
687: ;; (lshift:SI (match_operand:SI 1 "general_operand" "mri")
688: ;; (match_operand:SI 2 "general_operand" "mri")))]
689: ;; ""
690: ;; "LLSW3 %2, %1, %0")
691:
692: (define_insn "lshrsi3"
693: [(set (match_operand:SI 0 "nonimmediate_operand" "=mr")
694: (lshiftrt:SI (match_operand:SI 1 "general_operand" "mri")
695: (match_operand:SI 2 "general_operand" "mri")))]
696: ""
697: "LRSW3 %2, %1, %0")
698:
699: ;; rotate instruction
700:
701: (define_insn "rotrsi3"
702: [(set (match_operand:SI 0 "nonimmediate_operand" "=mr")
703: (rotatert: SI (match_operand:SI 1 "general_operand" "mri")
704: (match_operand:SI 2 "general_operand" "mri")))]
705: ""
706: "ROTW %2, %1, %0")
707:
708: ;; negate instructions
709:
710: (define_insn "negsi2"
711: [(set (match_operand:SI 0 "nonimmediate_operand" "=mr")
712: (neg:SI (match_operand:SI 1 "general_operand" "mri")))]
713: ""
714: "mnegw %1, %0")
715:
716: (define_insn "neghi2"
717: [(set (match_operand:HI 0 "nonimmediate_operand" "=mr")
718: (neg:HI (match_operand:HI 1 "general_operand" "mri")))]
719: ""
720: "mnegh %1, %0")
721:
722: ;; complement instructions
723:
724: (define_insn "one_cmplsi2"
725: [(set (match_operand:SI 0 "nonimmediate_operand" "=mr")
726: (not:SI (match_operand:SI 1 "general_operand" "mri")))]
727: ""
728: "mcomw %1, %0")
729:
730: (define_insn "one_cmplhi2"
731: [(set (match_operand:HI 0 "nonimmediate_operand" "=mr")
732: (not:HI (match_operand:HI 1 "general_operand" "mri")))]
733: ""
734: "mcomh %1, %0")
735:
736: (define_insn "one_cmplqi2"
737: [(set (match_operand:QI 0 "nonimmediate_operand" "=mr")
738: (not:QI (match_operand:QI 1 "general_operand" "mri")))]
739: ""
740: "mcomb %1, %0")
741:
742: ;; test instruction
743:
744: ;; We don't want to allow a constant operand for test insns because
745: ;; (set (cc0) (const_int foo)) has no mode information. Such insns will
746: ;; be folded while optimizing anyway.
747:
748: (define_insn "tstsi"
749: [(set (cc0) (match_operand:SI 0 "nonimmediate_operand" "mr"))]
750: ""
751: "TSTW %0")
752:
753: (define_insn "tsthi"
754: [(set (cc0) (match_operand:HI 0 "nonimmediate_operand" "mr"))]
755: ""
756: "TSTH %0")
757:
758: (define_insn "tstqi"
759: [(set (cc0) (match_operand:QI 0 "nonimmediate_operand" "mr"))]
760: ""
761: "TSTB {sbyte}%0")
762:
763: ;; compare instruction
764:
765: (define_insn "cmpsi"
766: [(set (cc0) (compare (match_operand:SI 0 "nonimmediate_operand" "mr")
767: (match_operand:SI 1 "general_operand" "mri")))]
768: ""
769: "CMPW %1, %0")
770:
771: (define_insn "cmphi"
772: [(set (cc0) (compare (match_operand:HI 0 "nonimmediate_operand" "mr")
773: (match_operand:HI 1 "general_operand" "mri")))]
774: ""
775: "*
776: {
777:
778: if (GET_CODE (operands[1]) == CONST_INT &&
779: ((unsigned long)INTVAL (operands[1]) & 0x8000L))
780: operands[1] = gen_rtx(CONST_INT, SImode, INTVAL(operands[1]) | 0xffff0000L);
781:
782: output_asm_insn(\"CMPH %1, %0\",operands);
783:
784: return \"\";
785: }")
786:
787: (define_insn "cmpqi"
788: [(set (cc0) (compare (match_operand:QI 0 "nonimmediate_operand" "mr")
789: (match_operand:QI 1 "general_operand" "mri")))]
790: ""
791: "*
792: {
793:
794: if (GET_CODE (operands[1]) == CONST_INT &&
795: ((unsigned long)INTVAL (operands[1]) & 0x80L))
796: operands[1] = gen_rtx(CONST_INT, SImode, INTVAL(operands[1]) | 0xffffff00L);
797:
798: output_asm_insn(\"CMPB {sbyte}%1, {sbyte}%0\",operands);
799:
800: return \"\";
801: }")
802:
803: ;; truncate instructions
804:
805: (define_insn ""
806: [(set (match_operand:SF 0 "register_operand" "=r")
807: (float_truncate:SF (match_operand:DF 1 "general_operand" "orF")))
808: (clobber (reg:SI 1))
809: (clobber (reg:SI 2))]
810: "REGNO (operands[0]) == 0"
811: "*
812: {
813: output_push_double(&operands[1]);
814: output_asm_insn(\"call &2, _fdtos\", operands);
815:
816: return \"\";
817: }")
818:
819: (define_expand "truncdfsf2"
820: [(parallel [(set (reg:SF 0)
821: (float_truncate:SF (match_operand:DF 1 "general_operand" "orF")))
822: (clobber (reg:SI 1))
823: (clobber (reg:SI 2))])
824: (set (match_operand:SF 0 "nonimmediate_operand" "=mr")
825: (reg:SF 0))]
826: ""
827: "")
828:
829: (define_insn "truncsihi2"
830: [(set (match_operand:HI 0 "nonimmediate_operand" "=mr")
831: (truncate:HI (match_operand:SI 1 "general_operand" "mri")))]
832: ""
833: "movtwh %1, %0")
834:
835: (define_insn "truncsiqi2"
836: [(set (match_operand:QI 0 "nonimmediate_operand" "=mr")
837: (truncate:QI (match_operand:SI 1 "general_operand" "mri")))]
838: ""
839: "movtwb %1, %0")
840:
841: (define_insn "trunchiqi2"
842: [(set (match_operand:QI 0 "nonimmediate_operand" "=mr")
843: (truncate:QI (match_operand:HI 1 "general_operand" "mri")))]
844: ""
845: "movthb %1, %0")
846:
847: ;; sign-extend move instructions
848:
849: (define_insn ""
850: [(set (match_operand:DF 0 "register_operand" "=r")
851: (float_extend:DF (match_operand:SF 1 "general_operand" "mrF")))
852: (clobber (reg:SI 2))]
853: "REGNO (operands[0]) == 0"
854: "*
855: {
856: output_asm_insn(\"pushw %1\", operands);
857: output_asm_insn(\"call &1, _fstod\", operands);
858:
859: return \"\";
860: }")
861:
862: (define_expand "extendsfdf2"
863: [(parallel [(set (reg:DF 0)
864: (float_extend:DF (match_operand:SF 1 "general_operand" "mrF")))
865: (clobber (reg:SI 2))])
866: (set (match_operand:DF 0 "nonimmediate_operand" "=or")
867: (reg:DF 0))]
868: ""
869: "")
870:
871: (define_insn "extendhisi2"
872: [(set (match_operand:SI 0 "nonimmediate_operand" "=mr")
873: (sign_extend:SI (match_operand:HI 1 "general_operand" "mri")))]
874: ""
875: "movbhw %1, %0")
876:
877: (define_insn "extendqisi2"
878: [(set (match_operand:SI 0 "nonimmediate_operand" "=mr")
879: (sign_extend:SI (match_operand:QI 1 "general_operand" "mri")))]
880: ""
881: "movbbw %1, %0")
882:
883: (define_insn "extendqihi2"
884: [(set (match_operand:HI 0 "nonimmediate_operand" "=mr")
885: (sign_extend:HI (match_operand:QI 1 "general_operand" "mri")))]
886: ""
887: "movbbh %1, %0")
888:
889: ;; zero-extend move instructions
890:
891: (define_insn "zero_extendhisi2"
892: [(set (match_operand:SI 0 "nonimmediate_operand" "=mr")
893: (zero_extend:SI (match_operand:HI 1 "general_operand" "mri")))]
894: ""
895: "movzhw %1, %0")
896:
897: (define_insn "zero_extendqisi2"
898: [(set (match_operand:SI 0 "nonimmediate_operand" "=mr")
899: (zero_extend:SI (match_operand:QI 1 "general_operand" "mri")))]
900: ""
901: "movzbw %1, %0")
902:
903: (define_insn "zero_extendqihi2"
904: [(set (match_operand:HI 0 "nonimmediate_operand" "=mr")
905: (zero_extend:HI (match_operand:QI 1 "general_operand" "mri")))]
906: ""
907: "movzbh %1, %0")
908:
909: ;; bit field instructions
910:
911: (define_insn "extzv"
912: [(set (match_operand:SI 0 "nonimmediate_operand" "=mr")
913: (zero_extract:SI (match_operand:SI 1 "general_operand" "mri")
914: (match_operand:SI 2 "immediate_operand" "i")
915: (match_operand:SI 3 "general_operand" "mri")))]
916: ""
917: "*
918: {
919:
920: operands[2] = gen_rtx(CONST_INT, SImode, INTVAL(operands[2]) - 1);
921: output_asm_insn(\"EXTFW %2, %3, %1, %0\",operands);
922:
923: return \"\";
924: }")
925:
926: (define_insn ""
927: [(set (match_operand:SI 0 "nonimmediate_operand" "=mr")
928: (zero_extract:SI (match_operand:HI 1 "general_operand" "mri")
929: (match_operand:SI 2 "immediate_operand" "i")
930: (match_operand:SI 3 "general_operand" "mri")))]
931: ""
932: "*
933: {
934:
935: operands[2] = gen_rtx(CONST_INT, SImode, INTVAL(operands[2]) - 1);
936: output_asm_insn(\"EXTFH %2, %3, {uhalf}%1, {uword}%0\",operands);
937:
938: return \"\";
939: }")
940:
941: (define_insn ""
942: [(set (match_operand:SI 0 "nonimmediate_operand" "=mr")
943: (zero_extract:SI (match_operand:QI 1 "general_operand" "mri")
944: (match_operand:SI 2 "immediate_operand" "i")
945: (match_operand:SI 3 "general_operand" "mri")))]
946: ""
947: "*
948: {
949:
950: operands[2] = gen_rtx(CONST_INT, SImode, INTVAL(operands[2]) - 1);
951: output_asm_insn(\"EXTFB %2, %3, {ubyte}%1, {uword}%0\",operands);
952:
953: return \"\";
954: }")
955:
956: (define_insn "insv"
957: [(set (zero_extract:SI (match_operand:SI 0 "nonimmediate_operand" "+mr")
958: (match_operand:SI 1 "immediate_operand" "i")
959: (match_operand:SI 2 "general_operand" "mri"))
960: (match_operand:SI 3 "general_operand" "mri"))]
961: ""
962: "*
963: {
964:
965: operands[1] = gen_rtx(CONST_INT, SImode, INTVAL(operands[1]) - 1);
966: output_asm_insn(\"INSFW %1, %2, %3, %0\",operands);
967:
968: return \"\";
969: }")
970:
971: (define_insn ""
972: [(set (zero_extract:SI (match_operand:HI 0 "nonimmediate_operand" "+mr")
973: (match_operand:SI 1 "immediate_operand" "i")
974: (match_operand:SI 2 "general_operand" "mri"))
975: (match_operand:SI 3 "general_operand" "mri"))]
976: ""
977: "*
978: {
979:
980: operands[1] = gen_rtx(CONST_INT, SImode, INTVAL(operands[1]) - 1);
981: output_asm_insn(\"INSFH %1, %2, {uword}%3, {uhalf}%0\",operands);
982:
983: return \"\";
984: }")
985:
986: (define_insn ""
987: [(set (zero_extract:SI (match_operand:QI 0 "nonimmediate_operand" "+mr")
988: (match_operand:SI 1 "immediate_operand" "i")
989: (match_operand:SI 2 "general_operand" "mri"))
990: (match_operand:SI 3 "general_operand" "mri"))]
991: ""
992: "*
993: {
994:
995: operands[1] = gen_rtx(CONST_INT, SImode, INTVAL(operands[1]) - 1);
996: output_asm_insn(\"INSFB %1, %2, {uword}%3, {ubyte}%0\",operands);
997:
998: return \"\";
999: }")
1000:
1001: ;; conditional branch instructions
1002:
1003: (define_insn "beq"
1004: [(set (pc) (if_then_else (eq (cc0) (const_int 0))
1005: (label_ref (match_operand 0 "" ""))
1006: (pc)))]
1007: ""
1008: "je %l0")
1009:
1010: (define_insn "bne"
1011: [(set (pc) (if_then_else (ne (cc0) (const_int 0))
1012: (label_ref (match_operand 0 "" ""))
1013: (pc)))]
1014: ""
1015: "jne %l0")
1016:
1017: (define_insn "bgt"
1018: [(set (pc) (if_then_else (gt (cc0) (const_int 0))
1019: (label_ref (match_operand 0 "" ""))
1020: (pc)))]
1021: ""
1022: "jg %l0")
1023:
1024: (define_insn "bgtu"
1025: [(set (pc) (if_then_else (gtu (cc0) (const_int 0))
1026: (label_ref (match_operand 0 "" ""))
1027: (pc)))]
1028: ""
1029: "jgu %l0")
1030:
1031: (define_insn "blt"
1032: [(set (pc) (if_then_else (lt (cc0) (const_int 0))
1033: (label_ref (match_operand 0 "" ""))
1034: (pc)))]
1035: ""
1036: "jl %l0")
1037:
1038: (define_insn "bltu"
1039: [(set (pc) (if_then_else (ltu (cc0) (const_int 0))
1040: (label_ref (match_operand 0 "" ""))
1041: (pc)))]
1042: ""
1043: "jlu %l0")
1044:
1045: (define_insn "bge"
1046: [(set (pc) (if_then_else (ge (cc0) (const_int 0))
1047: (label_ref (match_operand 0 "" ""))
1048: (pc)))]
1049: ""
1050: "jge %l0")
1051:
1052: (define_insn "bgeu"
1053: [(set (pc) (if_then_else (geu (cc0) (const_int 0))
1054: (label_ref (match_operand 0 "" ""))
1055: (pc)))]
1056: ""
1057: "jgeu %l0")
1058:
1059: (define_insn "ble"
1060: [(set (pc) (if_then_else (le (cc0) (const_int 0))
1061: (label_ref (match_operand 0 "" ""))
1062: (pc)))]
1063: ""
1064: "jle %l0")
1065:
1066: (define_insn "bleu"
1067: [(set (pc) (if_then_else (leu (cc0) (const_int 0))
1068: (label_ref (match_operand 0 "" ""))
1069: (pc)))]
1070: ""
1071: "jleu %l0")
1072:
1073: ;; reverse-conditional branch instructions
1074:
1075: (define_insn ""
1076: [(set (pc) (if_then_else (eq (cc0) (const_int 0))
1077: (pc)
1078: (label_ref (match_operand 0 "" ""))))]
1079: ""
1080: "jne %l0")
1081:
1082: (define_insn ""
1083: [(set (pc) (if_then_else (ne (cc0) (const_int 0))
1084: (pc)
1085: (label_ref (match_operand 0 "" ""))))]
1086: ""
1087: "je %l0")
1088:
1089: (define_insn ""
1090: [(set (pc) (if_then_else (gt (cc0) (const_int 0))
1091: (pc)
1092: (label_ref (match_operand 0 "" ""))))]
1093: ""
1094: "jle %l0")
1095:
1096: (define_insn ""
1097: [(set (pc) (if_then_else (gtu (cc0) (const_int 0))
1098: (pc)
1099: (label_ref (match_operand 0 "" ""))))]
1100: ""
1101: "jleu %l0")
1102:
1103: (define_insn ""
1104: [(set (pc) (if_then_else (lt (cc0) (const_int 0))
1105: (pc)
1106: (label_ref (match_operand 0 "" ""))))]
1107: ""
1108: "jge %l0")
1109:
1110: (define_insn ""
1111: [(set (pc) (if_then_else (ltu (cc0) (const_int 0))
1112: (pc)
1113: (label_ref (match_operand 0 "" ""))))]
1114: ""
1115: "jgeu %l0")
1116:
1117: (define_insn ""
1118: [(set (pc) (if_then_else (ge (cc0) (const_int 0))
1119: (pc)
1120: (label_ref (match_operand 0 "" ""))))]
1121: ""
1122: "jl %l0")
1123:
1124: (define_insn ""
1125: [(set (pc) (if_then_else (geu (cc0) (const_int 0))
1126: (pc)
1127: (label_ref (match_operand 0 "" ""))))]
1128: ""
1129: "jlu %l0")
1130:
1131: (define_insn ""
1132: [(set (pc) (if_then_else (le (cc0) (const_int 0))
1133: (pc)
1134: (label_ref (match_operand 0 "" ""))))]
1135: ""
1136: "jg %l0")
1137:
1138: (define_insn ""
1139: [(set (pc) (if_then_else (leu (cc0) (const_int 0))
1140: (pc)
1141: (label_ref (match_operand 0 "" ""))))]
1142: ""
1143: "jgu %l0")
1144:
1145: ;; call instructions
1146:
1147: (define_insn "call"
1148: [(call (match_operand:QI 0 "memory_operand" "m")
1149: (match_operand:SI 1 "immediate_operand" "i"))]
1150: ""
1151: "call %1/4, %0")
1152:
1153: (define_insn "call_value"
1154: [(set (match_operand 0 "register_operand" "=r")
1155: (call (match_operand:QI 1 "memory_operand" "m")
1156: (match_operand:SI 2 "immediate_operand" "i")))]
1157: ""
1158: "call %2/4, %1")
1159:
1160: ;; No-op instruction
1161:
1162: (define_insn "nop"
1163: [(const_int 0)]
1164: ""
1165: "NOP")
1166:
1167: ;; jump through a dispatch table instruction
1168:
1169: (define_expand "casesi"
1170: [(use (match_operand:SI 0 "general_operand" "mri"))
1171: (set (cc0) (compare (match_dup 5)
1172: (match_operand:SI 1 "general_operand" "mri")))
1173: (set (pc) (if_then_else (lt (cc0) (const_int 0))
1174: (label_ref (match_operand 4 "" ""))
1175: (pc)))
1176: (set (match_dup 5) (minus:SI (match_dup 5)
1177: (match_dup 1)))
1178: (set (cc0) (compare (match_dup 5)
1179: (match_operand:SI 2 "general_operand" "mri")))
1180: (set (pc) (if_then_else (gtu (cc0) (const_int 0))
1181: (label_ref (match_dup 4))
1182: (pc)))
1183: (set (match_dup 5) (ashift:SI (match_dup 5)
1184: (const_int 2)))
1185: (set (pc) (mem:SI (plus:SI (label_ref (match_operand 3 "" ""))
1186: (match_dup 5))))]
1187: ""
1188: "
1189: {
1190: operands[5] = gen_reg_rtx(GET_MODE (operands[0]));
1191: emit_move_insn(operands[5], operands[0]);
1192: }")
1193:
1194: ;; jump instructions
1195:
1196: (define_insn "indirect_jump"
1197: [(set (pc) (match_operand:SI 0 "address_operand" "p"))]
1198: ""
1199: "jmp %a0")
1200:
1201: (define_insn "jump"
1202: [(set (pc) (label_ref (match_operand 0 "" "")))]
1203: ""
1204: "jmp %l0")
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.