|
|
1.1 root 1: ;;- Machine description for GNU compiler
2: ;;- Fujitsu Gmicro Version
3: ;;- Ported by M.Yuhara, Fujitsu Laboratories LTD.
4: ;;
5: ;; Copyright (C) 1990 Free Software Foundation, Inc.
6:
7: ;; This file is part of GNU CC.
8:
9: ;; GNU CC is free software; you can redistribute it and/or modify
10: ;; it under the terms of the GNU General Public License as published by
11: ;; the Free Software Foundation; either version 2, or (at your option)
12: ;; any later version.
13:
14: ;; GNU CC is distributed in the hope that it will be useful,
15: ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
16: ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17: ;; GNU General Public License for more details.
18: ;; Among other things, the copyright
19: ;; notice and this notice must be preserved on all copies.
20:
21:
22: ;; You should have received a copy of the GNU General Public License
23: ;; along with GNU CC; see the file COPYING. If not, write to
24: ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
25:
26:
27: ;;- instruction definitions
28:
29: ;;- See file "rtl.def" for documentation on define_insn, match_*, et. al.
30:
31: ;;- When naming insn's (operand 0 of define_insn) be careful about using
32: ;;- names from other targets machine descriptions.
33:
34: ;;- cpp macro #define NOTICE_UPDATE_CC is essentially a no-op for the
35: ;;- gmicro; no compares are eliminated.
36:
37: ;;- The original structure of this file is m68k.md.
38:
39: ;; ??? Work to be done:
40: ;; Add patterns for ACB and SCB instructions.
41: ;; Add define_insn patterns to recognize the insns that extend a byte
42: ;; to a word and add it into a word, etc.
43:
44: ;;- Some of these insn's are composites of several Gmicro op codes.
45: ;;- The assembler (or final @@??) insures that the appropriate one is
46: ;;- selected.
47:
48: (define_insn ""
49: [(set (match_operand:DF 0 "push_operand" "=m")
50: (match_operand:DF 1 "general_operand" "rmfF"))]
51: ""
52: "*
53: {
54: if (FPU_REG_P (operands[1]))
55: return \"fmov.d %f1,%0\";
56: return output_move_double (operands);
57: }")
58:
59: (define_insn ""
60: [(set (match_operand:DI 0 "push_operand" "=m")
61: (match_operand:DF 1 "general_operand" "rmF"))]
62: ""
63: "*
64: {
65: return output_move_double (operands);
66: }")
67:
68: ;; We don't want to allow a constant operand for test insns because
69: ;; (set (cc0) (const_int foo)) has no mode information. Such insns will
70: ;; be folded while optimizing anyway.
71:
72: (define_insn "tstsi"
73: [(set (cc0)
74: (match_operand:SI 0 "nonimmediate_operand" "rm"))]
75: ""
76: "cmp:z.w #0,%0")
77:
78: (define_insn "tsthi"
79: [(set (cc0)
80: (match_operand:HI 0 "nonimmediate_operand" "rm"))]
81: ""
82: "cmp:z.h #0,%0")
83:
84: (define_insn "tstqi"
85: [(set (cc0)
86: (match_operand:QI 0 "nonimmediate_operand" "rm"))]
87: ""
88: "cmp:z.b #0,%0")
89:
90:
91: (define_insn "tstsf"
92: [(set (cc0)
93: (match_operand:SF 0 "general_operand" "fmF"))]
94: "TARGET_FPU"
95: "*
96: {
97: cc_status.flags = CC_IN_FPU;
98: return \"ftst.s %0\";
99: }")
100:
101:
102: (define_insn "tstdf"
103: [(set (cc0)
104: (match_operand:DF 0 "general_operand" "fmF"))]
105: "TARGET_FPU"
106: "*
107: {
108: cc_status.flags = CC_IN_FPU;
109: return \"ftst.d %0\";
110: }")
111:
112: ;; compare instructions.
113:
114: ;; (operand0 - operand1)
115: (define_insn "cmpsi"
116: [(set (cc0)
117: (compare (match_operand:SI 0 "nonimmediate_operand" "ri,rm")
118: (match_operand:SI 1 "general_operand" "rm,rmi")))]
119: ""
120: "*
121: {
122: int signed_flag = my_signed_comp (insn);
123:
124: if (which_alternative == 0)
125: {
126: cc_status.flags |= CC_REVERSED;
127: if (signed_flag && GET_CODE (operands[0]) == CONST_INT)
128: {
129: register rtx xfoo;
130: xfoo = operands[1];
131: operands[0] = operands[1];
132: operands[1] = xfoo;
133: return cmp_imm_word (INTVAL (operands[1]), operands[0]);
134: }
135: if (signed_flag)
136: return \"cmp.w %0,%1\";
137: return \"cmpu.w %0,%1\";
138: }
139: if (signed_flag)
140: {
141: if (GET_CODE (operands[1]) == CONST_INT)
142: return cmp_imm_word (INTVAL (operands[1]), operands[0]);
143: return \"cmp.w %1,%0\";
144: }
145: else
146: return \"cmpu.w %1,%0\";
147: }")
148:
149: (define_insn "cmphi"
150: [(set (cc0)
151: (compare (match_operand:HI 0 "nonimmediate_operand" "ri,rm")
152: (match_operand:HI 1 "general_operand" "rm,rmi")))]
153: ""
154: "*
155: {
156: int signed_flag = my_signed_comp (insn);
157:
158: if (which_alternative == 0)
159: {
160: cc_status.flags |= CC_REVERSED;
161: if (signed_flag)
162: return \"cmp.h %0,%1\";
163: return \"cmpu.h %0,%1\";
164: }
165: if (signed_flag)
166: return \"cmp.h %1,%0\";
167: return \"cmpu.h %1,%0\";
168: }")
169:
170: (define_insn "cmpqi"
171: [(set (cc0)
172: (compare (match_operand:QI 0 "nonimmediate_operand" "ri,rm")
173: (match_operand:QI 1 "general_operand" "rm,rmi")))]
174: ""
175: "*
176: {
177: int signed_flag = my_signed_comp (insn);
178:
179: if (which_alternative == 0)
180: {
181: cc_status.flags |= CC_REVERSED;
182: if (signed_flag)
183: return \"cmp.b %0,%1\";
184: return \"cmpu.b %0,%1\";
185: }
186: if (signed_flag)
187: return \"cmp.b %1,%0\";
188: return \"cmpu.b %1,%0\";
189: }")
190:
191:
192: (define_insn "cmpdf"
193: [(set (cc0)
194: (compare (match_operand:DF 0 "general_operand" "f,mG")
195: (match_operand:DF 1 "general_operand" "fmG,f")))]
196: "TARGET_FPU"
197: "*
198: {
199: cc_status.flags = CC_IN_FPU;
200:
201: if (FPU_REG_P (operands[0]))
202: return \"fcmp.d %f1,%f0\";
203: cc_status.flags |= CC_REVERSED;
204: return \"fcmp.d %f0,%f1\";
205: }")
206:
207:
208: (define_insn "cmpsf"
209: [(set (cc0)
210: (compare (match_operand:SF 0 "general_operand" "f,mG")
211: (match_operand:SF 1 "general_operand" "fmG,f")))]
212: "TARGET_FPU"
213: "*
214: {
215: cc_status.flags = CC_IN_FPU;
216: if (FPU_REG_P (operands[0]))
217: return \"fcmp.s %f1,%0\";
218: cc_status.flags |= CC_REVERSED;
219: return \"fcmp.s %f0,%1\";
220: }")
221:
222: ;; Recognizers for btst instructions.
223:
224: (define_insn ""
225: [(set (cc0) (zero_extract (match_operand:QI 0 "nonimmediate_operand" "rm")
226: (const_int 1)
227: (match_operand:SI 1 "general_operand" "rmi")))]
228: ""
229: "btst %1.w,%0.b")
230:
231: (define_insn ""
232: [(set (cc0) (zero_extract (match_operand:HI 0 "nonimmediate_operand" "rm")
233: (const_int 1)
234: (match_operand:SI 1 "general_operand" "rmi")))]
235: ""
236: "btst %1.w,%0.h")
237:
238: (define_insn ""
239: [(set (cc0) (zero_extract (match_operand:SI 0 "nonimmediate_operand" "rm")
240: (const_int 1)
241: (match_operand:SI 1 "general_operand" "rmi")))]
242: ""
243: "btst %1.w,%0.w")
244:
245: ;; The following two patterns are like the previous two
246: ;; except that they use the fact that bit-number operands (offset)
247: ;; are automatically masked to 3 or 5 bits when the base is a register.
248:
249: (define_insn ""
250: [(set (cc0) (zero_extract (match_operand:QI 0 "nonimmediate_operand" "r")
251: (const_int 1)
252: (and:SI
253: (match_operand:SI 1 "general_operand" "rmi")
254: (const_int 7))))]
255: ""
256: "btst %1.w,%0.b")
257:
258: (define_insn ""
259: [(set (cc0) (zero_extract (match_operand:SI 0 "nonimmediate_operand" "r")
260: (const_int 1)
261: (and:SI
262: (match_operand:SI 1 "general_operand" "rmi")
263: (const_int 31))))]
264: ""
265: "btst %1.w,%0.w")
266:
267: ; More various size-patterns are allowed for btst, but not
268: ; included yet. M.Yuhara
269:
270:
271: (define_insn ""
272: [(set (cc0) (and:SI (sign_extend:SI (sign_extend:HI (match_operand:QI 0 "nonimmediate_operand" "rm")))
273: (match_operand:SI 1 "general_operand" "i")))]
274: "(GET_CODE (operands[1]) == CONST_INT
275: && (unsigned) INTVAL (operands[1]) < 0x100
276: && exact_log2 (INTVAL (operands[1])) >= 0)"
277: "*
278: {
279: register int log = exact_log2 (INTVAL (operands[1]));
280: operands[1] = gen_rtx (CONST_INT, VOIDmode, log);
281: return \"btst %1,%0.b\";
282: }")
283:
284: ; I can add more patterns like above. But not yet. M.Yuhara
285:
286:
287: ; mtst is supported only by G/300.
288:
289: (define_insn ""
290: [(set (cc0)
291: (and:SI (match_operand:SI 0 "general_operand" "%rmi")
292: (match_operand:SI 1 "general_operand" "rm")))]
293: "TARGET_G300"
294: "*
295: {
296: if (GET_CODE (operands[0]) == CONST_INT)
297: return \"mtst.w %0,%1\";
298: return \"mtst.w %1,%0\";
299: }")
300:
301: (define_insn ""
302: [(set (cc0)
303: (and:HI (match_operand:HI 0 "general_operand" "%rmi")
304: (match_operand:HI 1 "general_operand" "rm")))]
305: "TARGET_G300"
306: "*
307: {
308: if (GET_CODE (operands[0]) == CONST_INT)
309: return \"mtst.h %0,%1\";
310: return \"mtst.h %1,%0\";
311: }")
312:
313: (define_insn ""
314: [(set (cc0)
315: (and:QI (match_operand:QI 0 "general_operand" "%rmi")
316: (match_operand:QI 1 "general_operand" "rm")))]
317: "TARGET_G300"
318: "*
319: {
320: if (GET_CODE (operands[0]) == CONST_INT)
321: return \"mtst.b %0,%1\";
322: return \"mtst.b %1,%0\";
323: }")
324:
325:
326:
327: ;; move instructions
328:
329: /* added by M.Yuhara */
330: ;; 1.35.04 89.08.28 modification start
331: ;; register_operand -> general_operand
332: ;; ashift -> mult
333:
334: (define_insn ""
335: [(set (mem:SI (plus:SI
336: (match_operand:SI 0 "general_operand" "r")
337: (ashift:SI
338: (match_operand:SI 1 "general_operand" "r")
339: (const_int 2))))
340: (match_operand:SI 2 "general_operand" "rmi"))]
341: ""
342: "*
343: {
344: return \"mov.w %2,@(%0:b,%1*4)\";
345: }")
346:
347: (define_insn ""
348: [(set (mem:SI (plus:SI
349: (ashift:SI
350: (match_operand:SI 0 "general_operand" "r")
351: (const_int 2))
352: (match_operand:SI 1 "general_operand" "r")))
353: (match_operand:SI 2 "general_operand" "rmi"))]
354: ""
355: "*
356: {
357: return \"mov.w %2,@(%1:b,%0*4)\";
358: }")
359:
360:
361: (define_insn ""
362: [(set (mem:SI (plus:SI
363: (match_operand:SI 0 "register_operand" "r")
364: (mult:SI
365: (match_operand:SI 1 "register_operand" "r")
366: (const_int 4))))
367: (match_operand:SI 2 "general_operand" "rmi"))]
368: ""
369: "*
370: {
371: return \"mov.w %2,@(%0:b,%1*4)\";
372: }")
373:
374: (define_insn ""
375: [(set (mem:SI (plus:SI
376: (mult:SI
377: (match_operand:SI 0 "register_operand" "r")
378: (const_int 4))
379: (match_operand:SI 1 "register_operand" "r")))
380: (match_operand:SI 2 "general_operand" "rmi"))]
381: ""
382: "*
383: {
384: return \"mov.w %2,@(%1:b,%0*4)\";
385: }")
386:
387:
388: (define_insn ""
389: [(set (mem:SI (plus:SI
390: (match_operand:SI 0 "general_operand" "r")
391: (plus:SI
392: (match_operand:SI 1 "register_operand" "r")
393: (match_operand:SI 2 "register_operand" "i"))))
394: (match_operand:SI 3 "general_operand" "rmi"))]
395: ""
396: "*
397: {
398: return \"mov.w %3,@(%c2,%0,%1)\";
399: }")
400:
401: (define_insn ""
402: [(set (mem:SI (plus:SI
403: (plus:SI
404: (match_operand:SI 0 "register_operand" "r")
405: (match_operand:SI 1 "register_operand" "r"))
406: (match_operand:SI 2 "general_operand" "i")))
407: (match_operand:SI 3 "general_operand" "rmi"))]
408: ""
409: "*
410: {
411: return \"mov.w %3,@(%c2,%0,%1)\";
412: }")
413:
414:
415: (define_insn ""
416: [(set (mem:SI (plus:SI
417: (match_operand:SI 0 "general_operand" "i")
418: (plus:SI
419: (match_operand:SI 1 "register_operand" "r")
420: (mult:SI
421: (match_operand:SI 2 "register_operand" "r")
422: (const_int 4)))))
423: (match_operand:SI 3 "general_operand" "rmi"))]
424: ""
425: "*
426: {
427: return \"mov.w %3,@(%1:b,%0,%2*4)\";
428: }")
429:
430: ;; 89.08.28 1.35.04 modification end
431:
432: ;; Should add "!" to op2 ??
433:
434: ;; General move-address-to-operand should handle these.
435: ;; If that does not work, please figure out why.
436:
437: ;(define_insn ""
438: ; [(set (match_operand:SI 0 "push_operand" "=m")
439: ; (plus:SI
440: ; (match_operand:SI 1 "immediate_operand" "i")
441: ; (match_operand:SI 2 "general_operand" "r")))]
442: ; ""
443: ; "mova.w @(%c1,%2),%-")
444:
445: ;(define_insn ""
446: ; [(set (match_operand:SI 0 "push_operand" "=m")
447: ; (plus:SI
448: ; (match_operand:SI 1 "general_operand" "r")
449: ; (match_operand:SI 2 "immediate_operand" "i")))]
450: ; ""
451: ; "mova.w @(%c2,%1),%-")
452:
453:
454: (define_insn ""
455: [(set (match_operand:SI 0 "push_operand" "=m")
456: (minus:SI
457: (match_operand:SI 1 "general_operand" "r")
458: (match_operand:SI 2 "immediate_operand" "i")))]
459: ""
460: "mova.w @(%n2,%1),%-")
461:
462:
463:
464: ;; General case of fullword move.
465:
466: (define_insn "movsi"
467: [(set (match_operand:SI 0 "general_operand" "=rm")
468: (match_operand:SI 1 "general_operand" "rmi"))]
469: ""
470: "*
471: {
472: if (GET_CODE (operands[1]) == CONST_INT)
473: return mov_imm_word (INTVAL (operands[1]), operands[0]);
474: /* if (address_operand (operands[1], SImode))
475: return \"mova.w %1,%0\"; */
476: if (push_operand (operands[0], SImode))
477: return \"mov.w %1,%-\";
478: return \"mov.w %1,%0\";
479: }")
480:
481: /* pushsi 89.08.10 for test M.Yuhara */
482: /*
483: (define_insn ""
484: [(set (match_operand:SI 0 "push_operand" "=m")
485: (match_operand:SI 1 "general_operand" "rmi"))]
486: ""
487: "*
488: {
489: if (GET_CODE (operands[1]) == CONST_INT)
490: return mov_imm_word (INTVAL (operands[1]), operands[0]);
491: if (push_operand (operands[0], SImode))
492: return \"mov.w %1,%-\";
493: return \"mov.w %1,%0\";
494: }")
495: */
496:
497:
498: (define_insn "movhi"
499: [(set (match_operand:HI 0 "general_operand" "=rm")
500: (match_operand:HI 1 "general_operand" "rmi"))]
501: ""
502: "*
503: {
504: if (push_operand (operands[0], SImode))
505: return \"mov.h %1,%-\";
506: return \"mov.h %1,%0\";
507: }")
508:
509: ;; Is the operand constraint "+" necessary ????
510: ;; Should I check push_operand ????
511:
512: (define_insn "movstricthi"
513: [(set (strict_low_part (match_operand:HI 0 "general_operand" "+rm"))
514: (match_operand:HI 1 "general_operand" "rmi"))]
515: ""
516: "mov.h %1,%0");
517:
518: (define_insn "movqi"
519: [(set (match_operand:QI 0 "general_operand" "=rm")
520: (match_operand:QI 1 "general_operand" "rmi"))]
521: ""
522: "*
523: {
524: if (GREG_P (operands[0]))
525: {
526: if (CONSTANT_P (operands[1]))
527: return \"mov:l %1,%0.w\";
528: else
529: return \"mov:l %1.b,%0.w\";
530: }
531: if (GREG_P (operands[1]))
532: return \"mov:s %1.w,%0.b\";
533: return \"mov.b %1,%0\";
534: }")
535:
536: (define_insn "movstrictqi"
537: [(set (strict_low_part (match_operand:QI 0 "general_operand" "+rm"))
538: (match_operand:QI 1 "general_operand" "rmi"))]
539: ""
540: "mov.b %1,%0")
541:
542:
543: (define_insn "movsf"
544: [(set (match_operand:SF 0 "general_operand" "=f,mf,rm,fr")
545: (match_operand:SF 1 "general_operand" "mfF,f,rmF,fr"))]
546: ""
547: "*
548: {
549: switch (which_alternative)
550: {
551: case 0:
552: if (GET_CODE (operands[1]) == CONST_DOUBLE)
553: return output_move_const_single (operands);
554: return \"fmov.s %1,%0\";
555: case 1:
556: return \"fmov.s %1,%0\";
557: case 2:
558: if (GET_CODE (operands[1]) == CONST_DOUBLE)
559: return output_move_const_single (operands);
560: return \"mov.w %1,%0\";
561: case 3:
562: if (FPU_REG_P (operands[0]))
563: return \"mov.w %1,%-\\n\\tfmov.s %+,%0\";
564: return \"fmov.s %1,%-\\n\\tmov.w %+,%0\";
565: }
566: }")
567:
568: (define_insn "movdf"
569: [(set (match_operand:DF 0 "general_operand" "=f,mf,rm,fr")
570: (match_operand:DF 1 "general_operand" "mfF,f,rmF,fr"))]
571: ""
572: "*
573: {
574: switch (which_alternative)
575: {
576: case 0:
577: if (GET_CODE (operands[1]) == CONST_DOUBLE)
578: return output_move_const_double (operands);
579: return \"fmov.d %1,%0\";
580: case 1:
581: return \"fmov.d %1,%0\";
582: case 2:
583: if (GET_CODE (operands[1]) == CONST_DOUBLE)
584: return output_move_const_double (operands);
585: return output_move_double (operands);
586: case 3:
587: if (FPU_REG_P (operands[0]))
588: {
589: rtx xoperands[2];
590: xoperands[1] = gen_rtx (REG, SImode, REGNO (operands[1]) + 1);
591: output_asm_insn (\"mov.w %1,%-\", xoperands);
592: output_asm_insn (\"mov.w %1,%-\", operands);
593: return \"fmov.d %+,%0\";
594: }
595: else
596: {
597: output_asm_insn (\"fmov.d %f1,%-\", operands);
598: output_asm_insn (\"mov.w %+,%0\", operands);
599: operands[0] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1);
600: return \"mov.w %+,%0\";
601: }
602: }
603: }")
604:
605:
606: ;; movdi can apply to fp regs in some cases
607: ;; Must check again. you can use fsti/fldi, etc.
608: ;; FPU reg should be included ??
609: ;; 89.12.13 for test
610:
611: (define_insn "movdi"
612: ;; Let's see if it really still needs to handle fp regs, and, if so, why.
613: [(set (match_operand:DI 0 "general_operand" "=rm,&r,&ro")
614: (match_operand:DI 1 "general_operand" "rF,m,roiF"))]
615: ""
616: "*
617: {
618: if (FPU_REG_P (operands[0]))
619: {
620: if (FPU_REG_P (operands[1]))
621: return \"fmov.d %1,%0\";
622: if (REG_P (operands[1]))
623: {
624: rtx xoperands[2];
625: xoperands[1] = gen_rtx (REG, SImode, REGNO (operands[1]) + 1);
626: output_asm_insn (\"mov.w %1,%-\", xoperands);
627: output_asm_insn (\"mov.w %1,%-\", operands);
628: return \"fmov.d %+,%0\";
629: }
630: if (GET_CODE (operands[1]) == CONST_DOUBLE)
631: return output_move_const_double (operands);
632: return \"fmov.d %f1,%0\";
633: }
634: else if (FPU_REG_P (operands[1]))
635: {
636: if (REG_P (operands[0]))
637: {
638: output_asm_insn (\"fmov.d %f1,%-\;mov.w %+,%0\", operands);
639: operands[0] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1);
640: return \"mov.w %+,%0\";
641: }
642: else
643: return \"fmov.d %f1,%0\";
644: }
645: return output_move_double (operands);
646: }
647: ")
648:
649:
650: ;; The definition of this insn does not really explain what it does,
651: ;; but it should suffice
652: ;; that anything generated as this insn will be recognized as one
653: ;; and that it won't successfully combine with anything.
654:
655: ;; This is dangerous when %0 and %1 overlapped !!!!!
656: ;; Ugly code...
657:
658: (define_insn "movstrhi"
659: [(set (match_operand:BLK 0 "general_operand" "=m")
660: (match_operand:BLK 1 "general_operand" "m"))
661: (use (match_operand:HI 2 "general_operand" "rmi"))
662: (clobber (reg:SI 0))
663: (clobber (reg:SI 1))
664: (clobber (reg:SI 2))]
665: ""
666: "*
667: {
668: int op2const;
669: rtx tmpx;
670:
671: if (CONSTANT_P (operands[1]))
672: {
673: fprintf (stderr, \"smov 1 const err \");
674: abort ();
675: }
676: else if (GET_CODE (operands[1]) == REG)
677: {
678: fprintf (stderr, \"smov 1 reg err \");
679: abort ();
680: }
681: else if (GET_CODE (operands[1]) == MEM)
682: {
683: tmpx = XEXP (operands[1], 0);
684: if (CONSTANT_ADDRESS_P (tmpx) || GREG_P (tmpx))
685: {
686: operands[1] = tmpx;
687: output_asm_insn (\"mov.w %1,r0\", operands);
688: }
689: else
690: {
691: output_asm_insn (\"mova %1,r0\", operands);
692: }
693: }
694: else
695: {
696: fprintf (stderr, \"smov 1 else err \");
697: abort ();
698: output_asm_insn (\"mova.w %p1,r0\", operands);
699: }
700:
701: if (CONSTANT_P (operands[0]))
702: {
703: fprintf (stderr, \"smov 0 const err \");
704: abort ();
705: }
706: else if (GET_CODE (operands[0]) == REG)
707: {
708: fprintf (stderr, \"smov 0 reg err \");
709: abort ();
710: }
711: else if (GET_CODE (operands[0]) == MEM)
712: {
713: tmpx = XEXP (operands[0], 0);
714: if (CONSTANT_ADDRESS_P (tmpx) || GREG_P (tmpx))
715: {
716: operands[0] = tmpx;
717: output_asm_insn (\"mov.w %0,r1\", operands);
718: }
719: else
720: {
721: output_asm_insn (\"mova %0,r1\", operands);
722: }
723: }
724: else
725: {
726: fprintf (stderr, \"smov 0 else err \");
727: abort ();
728: }
729:
730: if (GET_CODE (operands[2]) == CONST_INT)
731: {
732: op2const = INTVAL (operands[2]);
733: if (op2const % 4 != 0)
734: {
735: output_asm_insn (\"mov.w %2,r2\", operands);
736: return \"smov/n/f.b\";
737: }
738: op2const = op2const / 4;
739: if (op2const <= 4)
740: {
741: if (op2const == 0)
742: abort (0);
743: if (op2const == 1)
744: return \"mov.w @r0,@r1\";
745: output_asm_insn (\"mov.w @r0,@r1\", operands);
746: if (op2const == 2)
747: return \"mov.w @(4,r0),@(4,r1)\";
748: output_asm_insn (\"mov.w @(4,r0),@(4,r1)\", operands);
749: if (op2const == 3)
750: return \"mov.w @(8,r0),@(8,r1)\";
751: output_asm_insn (\"mov.w @(8,r0),@(8,r1)\", operands);
752: return \"mov.w @(12,r0),@(12,r1)\";
753: }
754:
755: operands[2] =
756: gen_rtx (CONST_INT, VOIDmode, op2const);
757: output_asm_insn (\"mov.w %2,r2\", operands);
758: return \"smov/n/f.w\";
759: }
760: else
761: {
762: fprintf (stderr, \"smov 0 else err \");
763: abort ();
764: output_asm_insn (\"mov %2.h,r2.w\", operands);
765: return \"smov/n/f.b\";
766: }
767:
768: }")
769:
770: ;; M.Yuhara 89.08.24
771: ;; experiment on the built-in strcpy (__builtin_smov)
772: ;;
773: ;; len = 0 means unknown string length.
774: ;;
775: ;; mem:SI is dummy. Necessary so as not to be deleted by optimization.
776: ;; Use of BLKmode would be better...
777: ;;
778: ;;
779: (define_insn "smovsi"
780: [(set (mem:SI (match_operand:SI 0 "general_operand" "=rm"))
781: (mem:SI (match_operand:SI 1 "general_operand" "rm")))
782: (use (match_operand:SI 2 "general_operand" "i"))
783: (clobber (reg:SI 0))
784: (clobber (reg:SI 1))
785: (clobber (reg:SI 2))
786: (clobber (reg:SI 3))]
787: ""
788: "*
789: {
790: int len, wlen, blen, offset;
791: char tmpstr[128];
792: rtx xoperands[1];
793:
794: len = INTVAL (operands[2]);
795: output_asm_insn (\"mov.w %1,r0\\t; begin built-in strcpy\", operands);
796: output_asm_insn (\"mov.w %0,r1\", operands);
797:
798: if (len == 0)
799: {
800: output_asm_insn (\"mov:z.w #0,r2\", operands);
801: output_asm_insn (\"mov:z.w #0,r3\", operands);
802: return \"smov/eq/f.b\\t; end built-in strcpy\";
803: }
804:
805: wlen = len / 4;
806: blen = len - wlen * 4;
807:
808: if (wlen > 0)
809: {
810: if (len <= 40 && !TARGET_FORCE_SMOV)
811: {
812: output_asm_insn (\"mov.w @r0,@r1\", operands);
813: offset = 4;
814: while ( (blen = len - offset) > 0)
815: {
816: if (blen >= 4)
817: {
818: sprintf (tmpstr, \"mov.w @(%d,r0),@(%d,r1)\",
819: offset, offset);
820: output_asm_insn (tmpstr, operands);
821: offset += 4;
822: }
823: else if (blen >= 2)
824: {
825: sprintf (tmpstr, \"mov.h @(%d,r0),@(%d,r1)\",
826: offset, offset);
827: output_asm_insn (tmpstr, operands);
828: offset += 2;
829: }
830: else
831: {
832: sprintf (tmpstr, \"mov.b @(%d,r0),@(%d,r1)\",
833: offset, offset);
834: output_asm_insn (tmpstr, operands);
835: offset++;
836: }
837: }
838: return \"\\t\\t; end built-in strcpy\";
839: }
840: else
841: {
842: xoperands[0] = gen_rtx (CONST_INT, VOIDmode, wlen);
843: output_asm_insn (\"mov.w %0,r2\", xoperands);
844: output_asm_insn (\"smov/n/f.w\", operands);
845: }
846: }
847:
848: if (blen >= 2)
849: {
850: output_asm_insn (\"mov.h @r0,@r1\", operands);
851: if (blen == 3)
852: output_asm_insn (\"mov.b @(2,r0),@(2,r1)\", operands);
853: }
854: else if (blen == 1)
855: {
856: output_asm_insn (\"mov.b @r0,@r1\", operands);
857: }
858:
859: return \"\\t\\t; end built-in strcpy\";
860: }")
861:
862: ;; truncation instructions
863: (define_insn "truncsiqi2"
864: [(set (match_operand:QI 0 "general_operand" "=rm")
865: (truncate:QI
866: (match_operand:SI 1 "general_operand" "rmi")))]
867: ""
868: "mov %1.w,%0.b")
869: ; "*
870: ;{
871: ; if (GET_CODE (operands[0]) == REG)
872: ; return \"mov.w %1,%0\";
873: ; if (GET_CODE (operands[1]) == MEM)
874: ; operands[1] = adj_offsettable_operand (operands[1], 3);
875: ; return \"mov.b %1,%0\";
876: ;}")
877:
878: (define_insn "trunchiqi2"
879: [(set (match_operand:QI 0 "general_operand" "=rm")
880: (truncate:QI
881: (match_operand:HI 1 "general_operand" "rmi")))]
882: ""
883: "mov %1.h,%0.b")
884: ; "*
885: ;{
886: ; if (GET_CODE (operands[0]) == REG)
887: ; return \"mov.h %1,%0\";
888: ; if (GET_CODE (operands[1]) == MEM)
889: ; operands[1] = adj_offsettable_operand (operands[1], 1);
890: ; return \"mov.b %1,%0\";
891: ;}")
892:
893: (define_insn "truncsihi2"
894: [(set (match_operand:HI 0 "general_operand" "=rm")
895: (truncate:HI
896: (match_operand:SI 1 "general_operand" "rmi")))]
897: ""
898: "mov %1.w,%0.h")
899: ; "*
900: ;{
901: ; if (GET_CODE (operands[0]) == REG)
902: ; return \"mov.w %1,%0\";
903: ; if (GET_CODE (operands[1]) == MEM)
904: ; operands[1] = adj_offsettable_operand (operands[1], 2);
905: ; return \"mov.h %1,%0\";
906: ;}")
907:
908: ;; zero extension instructions
909: ;; define_expand (68k) -> define_insn (Gmicro)
910:
911: (define_insn "zero_extendhisi2"
912: [(set (match_operand:SI 0 "general_operand" "=rm")
913: (zero_extend:SI (match_operand:HI 1 "nonimmediate_operand" "rm")))]
914: ""
915: "movu %1.h,%0.w")
916:
917:
918: (define_insn "zero_extendqihi2"
919: [(set (match_operand:HI 0 "general_operand" "=rm")
920: (zero_extend:HI (match_operand:QI 1 "nonimmediate_operand" "rm")))]
921: ""
922: "movu %1.b,%0.h")
923:
924: (define_insn "zero_extendqisi2"
925: [(set (match_operand:SI 0 "general_operand" "=rm")
926: (zero_extend:SI (match_operand:QI 1 "nonimmediate_operand" "rm")))]
927: ""
928: "movu %1.b,%0.w")
929:
930:
931: ;; sign extension instructions
932:
933: (define_insn "extendhisi2"
934: [(set (match_operand:SI 0 "general_operand" "=rm")
935: (sign_extend:SI (match_operand:HI 1 "nonimmediate_operand" "rm")))]
936: ""
937: "mov %1.h,%0.w")
938:
939:
940: (define_insn "extendqihi2"
941: [(set (match_operand:HI 0 "general_operand" "=rm")
942: (sign_extend:HI (match_operand:QI 1 "nonimmediate_operand" "rm")))]
943: ""
944: "mov %1.b,%0.h")
945:
946: (define_insn "extendqisi2"
947: [(set (match_operand:SI 0 "general_operand" "=rm")
948: (sign_extend:SI (match_operand:QI 1 "nonimmediate_operand" "rm")))]
949: ""
950: "mov %1.b,%0.w")
951:
952:
953:
954: ;; Conversions between float and double.
955:
956: (define_insn "extendsfdf2"
957: [(set (match_operand:DF 0 "general_operand" "=*frm,f")
958: (float_extend:DF
959: (match_operand:SF 1 "general_operand" "f,rmF")))]
960: "TARGET_FPU"
961: "*
962: {
963: if (FPU_REG_P (operands[0]))
964: {
965: if (GET_CODE (operands[1]) == CONST_DOUBLE)
966: return output_move_const_double (operands);
967: if (GREG_P (operands[1]))
968: {
969: output_asm_insn (\"mov.w %1,%-\", operands);
970: return \"fmov %+.s,%0.d\";
971: }
972: return \"fmov %1.s,%0.d\";
973: }
974: else
975: {
976: if (GREG_P (operands[0]))
977: {
978: output_asm_insn (\"fmov %1.s,%-.d\", operands);
979: output_asm_insn (\"mov.w %+,%0\", operands);
980: operands[0] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1);
981: return \"mov.w %+,%0\";
982: }
983: return \"fmov %1.s,%0.d\";
984: }
985: }")
986:
987:
988: (define_insn "truncdfsf2"
989: [(set (match_operand:SF 0 "general_operand" "=rfm")
990: (float_truncate:SF
991: (match_operand:DF 1 "general_operand" "f")))]
992: "TARGET_FPU"
993: "*
994: {
995: if (GREG_P (operands[0]))
996: {
997: output_asm_insn (\"fmov %1.d,%-.s\", operands);
998: return \"mov.w %+,%0\";
999: }
1000: return \"fmov %1.d,%0.s\";
1001: }")
1002:
1003: ;; Conversion between fixed point and floating point.
1004: ;; Note that among the fix-to-float insns
1005: ;; the ones that start with SImode come first.
1006: ;; That is so that an operand that is a CONST_INT
1007: ;; (and therefore lacks a specific machine mode).
1008: ;; will be recognized as SImode (which is always valid)
1009: ;; rather than as QImode or HImode.
1010:
1011:
1012: (define_insn "floatsisf2"
1013: [(set (match_operand:SF 0 "general_operand" "=f")
1014: (float:SF (match_operand:SI 1 "general_operand" "rmi")))]
1015: "TARGET_FPU"
1016: "fldi %1.w,%0.s")
1017:
1018: (define_insn "floatsidf2"
1019: [(set (match_operand:DF 0 "general_operand" "=f")
1020: (float:DF (match_operand:SI 1 "general_operand" "rmi")))]
1021: "TARGET_FPU"
1022: "fldi %1.w,%0.d")
1023:
1024: (define_insn "floathisf2"
1025: [(set (match_operand:SF 0 "general_operand" "=f")
1026: (float:SF (match_operand:HI 1 "general_operand" "rmi")))]
1027: "TARGET_FPU"
1028: "fldi %1.h,%0.s")
1029:
1030: (define_insn "floathidf2"
1031: [(set (match_operand:DF 0 "general_operand" "=f")
1032: (float:DF (match_operand:HI 1 "general_operand" "rmi")))]
1033: "TARGET_FPU"
1034: "fldi %1.h,%0.d")
1035:
1036: (define_insn "floatqisf2"
1037: [(set (match_operand:SF 0 "general_operand" "=f")
1038: (float:SF (match_operand:QI 1 "general_operand" "rmi")))]
1039: "TARGET_FPU"
1040: "fldi %1.b,%0.s")
1041:
1042: (define_insn "floatqidf2"
1043: [(set (match_operand:DF 0 "general_operand" "=f")
1044: (float:DF (match_operand:QI 1 "general_operand" "rmi")))]
1045: "TARGET_FPU"
1046: "fldi %1.b,%0.d")
1047:
1048: ;;; Convert a float to a float whose value is an integer.
1049: ;;; This is the first stage of converting it to an integer type.
1050: ;
1051: ;(define_insn "ftruncdf2"
1052: ; [(set (match_operand:DF 0 "general_operand" "=f")
1053: ; (fix:DF (match_operand:DF 1 "general_operand" "fFm")))]
1054: ; "TARGET_FPU"
1055: ; "*
1056: ;{
1057: ; return \"fintrz.d %f1,%0\";
1058: ;}")
1059: ;
1060: ;(define_insn "ftruncsf2"
1061: ; [(set (match_operand:SF 0 "general_operand" "=f")
1062: ; (fix:SF (match_operand:SF 1 "general_operand" "fFm")))]
1063: ; "TARGET_FPU"
1064: ; "*
1065: ;{
1066: ; return \"fintrz.s %f1,%0\";
1067: ;}")
1068:
1069: ;; Convert a float to an integer.
1070:
1071: (define_insn "fix_truncsfqi2"
1072: [(set (match_operand:QI 0 "general_operand" "=rm")
1073: (fix:QI (fix:SF (match_operand:SF 1 "general_operand" "f"))))]
1074: "TARGET_FPU"
1075: "fsti %1.s,%0.b")
1076:
1077: (define_insn "fix_truncsfhi2"
1078: [(set (match_operand:HI 0 "general_operand" "=rm")
1079: (fix:HI (fix:SF (match_operand:SF 1 "general_operand" "f"))))]
1080: "TARGET_FPU"
1081: "fsti %1.s,%0.h")
1082:
1083: (define_insn "fix_truncsfsi2"
1084: [(set (match_operand:SI 0 "general_operand" "=rm")
1085: (fix:SI (fix:SF (match_operand:SF 1 "general_operand" "f"))))]
1086: "TARGET_FPU"
1087: "fsti %1.s,%0.w")
1088:
1089: (define_insn "fix_truncdfqi2"
1090: [(set (match_operand:QI 0 "general_operand" "=rm")
1091: (fix:QI (fix:DF (match_operand:DF 1 "general_operand" "f"))))]
1092: "TARGET_FPU"
1093: "fsti %1.d,%0.b")
1094:
1095: (define_insn "fix_truncdfhi2"
1096: [(set (match_operand:HI 0 "general_operand" "=rm")
1097: (fix:HI (fix:DF (match_operand:DF 1 "general_operand" "f"))))]
1098: "TARGET_FPU"
1099: "fsti %1.d,%0.h")
1100:
1101: (define_insn "fix_truncdfsi2"
1102: [(set (match_operand:SI 0 "general_operand" "=rm")
1103: (fix:SI (fix:DF (match_operand:DF 1 "general_operand" "f"))))]
1104: "TARGET_FPU"
1105: "fsti %1.d,%0.w")
1106:
1107:
1108: ;;; Special add patterns
1109: ;;; 89.09.28
1110:
1111: ;; This should be redundant; please find out why regular addsi3
1112: ;; fails to match this case.
1113:
1114: ;(define_insn ""
1115: ; [(set (mem:SI (plus:SI
1116: ; (plus:SI (match_operand 0 "general_operand" "r")
1117: ; (match_operand 1 "general_operand" "r"))
1118: ; (match_operand 2 "general_operand" "i")))
1119: ; (plus:SI
1120: ; (mem:SI (plus:SI
1121: ; (plus:SI (match_dup 0)
1122: ; (match_dup 1))
1123: ; (match_dup 2)))
1124: ; (match_operand 3 "general_operand" "rmi")))]
1125: ; ""
1126: ; "add.w %3,@(%c2,%0,%1)")
1127:
1128:
1129: ;; add instructions
1130:
1131: ;; Note that the last two alternatives are near-duplicates
1132: ;; in order to handle insns generated by reload.
1133: ;; This is needed since they are not themselves reloaded,
1134: ;; so commutativity won't apply to them.
1135:
1136: (define_insn "addsi3"
1137: [(set (match_operand:SI 0 "general_operand" "=rm,!r,!r")
1138: (plus:SI (match_operand:SI 1 "general_operand" "%0,r,ri")
1139: (match_operand:SI 2 "general_operand" "rmi,ri,r")))]
1140: ""
1141: "*
1142: {
1143: if (which_alternative == 0)
1144: {
1145: if (GET_CODE (operands[2]) == CONST_INT)
1146: {
1147: operands[1] = operands[2];
1148: return add_imm_word (INTVAL (operands[1]), operands[0], &operands[1]);
1149: }
1150: else
1151: return \"add.w %2,%0\";
1152: }
1153: else
1154: {
1155: if (GET_CODE (operands[1]) == REG
1156: && REGNO (operands[0]) == REGNO (operands[1]))
1157: return \"add.w %2,%0\";
1158: if (GET_CODE (operands[2]) == REG
1159: && REGNO (operands[0]) == REGNO (operands[2]))
1160: return \"add.w %1,%0\";
1161:
1162: if (GET_CODE (operands[1]) == REG)
1163: {
1164: if (GET_CODE (operands[2]) == REG)
1165: return \"mova.w @(%1,%2),%0\";
1166: else
1167: return \"mova.w @(%c2,%1),%0\";
1168: }
1169: else
1170: return \"mova.w @(%c1,%2),%0\";
1171: }
1172: }")
1173:
1174: (define_insn ""
1175: [(set (match_operand:SI 0 "general_operand" "=rm")
1176: (plus:SI (match_operand:SI 1 "general_operand" "0")
1177: (sign_extend:SI (match_operand:HI 2 "nonimmediate_operand" "rmi"))))]
1178: ""
1179: "*
1180: {
1181: if (CONSTANT_P (operands[2]))
1182: {
1183: operands[1] = operands[2];
1184: return add_imm_word (INTVAL (operands[1]), operands[0], &operands[1]);
1185: }
1186: else
1187: return \"add %2.h,%0.w\";
1188: }")
1189:
1190: (define_insn "addhi3"
1191: [(set (match_operand:HI 0 "general_operand" "=rm")
1192: (plus:HI (match_operand:HI 1 "general_operand" "%0")
1193: (match_operand:HI 2 "general_operand" "rmi")))]
1194: ""
1195: "*
1196: {
1197: if (GET_CODE (operands[2]) == CONST_INT
1198: && INTVAL (operands[2]) < 0)
1199: return \"sub.h #%n2,%0\";
1200: if (GREG_P (operands[0]))
1201: {
1202: if (CONSTANT_P (operands[2]))
1203: return \"add:l %2,%0.w\";
1204: else
1205: return \"add:l %2.h,%0.w\";
1206: }
1207: return \"add.h %2,%0\";
1208: }")
1209:
1210: (define_insn ""
1211: [(set (strict_low_part (match_operand:HI 0 "general_operand" "+rm"))
1212: (plus:HI (match_dup 0)
1213: (match_operand:HI 1 "general_operand" "rmi")))]
1214: ""
1215: "add.h %1,%0")
1216:
1217: (define_insn "addqi3"
1218: [(set (match_operand:QI 0 "general_operand" "=rm")
1219: (plus:QI (match_operand:QI 1 "general_operand" "%0")
1220: (match_operand:QI 2 "general_operand" "rmi")))]
1221: ""
1222: "*
1223: {
1224: if (GET_CODE (operands[2]) == CONST_INT
1225: && INTVAL (operands[2]) < 0)
1226: return \"sub.b #%n2,%0\";
1227: if (GREG_P (operands[0]))
1228: {
1229: if (CONSTANT_P (operands[2]))
1230: return \"add:l %2,%0.w\";
1231: else
1232: return \"add:l %2.b,%0.w\";
1233: }
1234: return \"add.b %2,%0\";
1235: }")
1236:
1237: (define_insn ""
1238: [(set (strict_low_part (match_operand:QI 0 "general_operand" "+rm"))
1239: (plus:QI (match_dup 0)
1240: (match_operand:QI 1 "general_operand" "rmi")))]
1241: ""
1242: "add.b %1,%0")
1243:
1244: (define_insn "adddf3"
1245: [(set (match_operand:DF 0 "general_operand" "=f")
1246: (plus:DF (match_operand:DF 1 "general_operand" "%0")
1247: (match_operand:DF 2 "general_operand" "fmG")))]
1248: "TARGET_FPU"
1249: "fadd.d %f2,%0")
1250:
1251: (define_insn "addsf3"
1252: [(set (match_operand:SF 0 "general_operand" "=f")
1253: (plus:SF (match_operand:SF 1 "general_operand" "%0")
1254: (match_operand:SF 2 "general_operand" "fmG")))]
1255: "TARGET_FPU"
1256: "fadd.s %f2,%0")
1257:
1258: ;; subtract instructions
1259:
1260: (define_insn "subsi3"
1261: [(set (match_operand:SI 0 "general_operand" "=rm,!r")
1262: (minus:SI (match_operand:SI 1 "general_operand" "0,r")
1263: (match_operand:SI 2 "general_operand" "rmi,i")))]
1264: ""
1265: "*
1266: {
1267: if (which_alternative == 0
1268: || (GET_CODE (operands[1]) == REG
1269: && REGNO (operands[0]) == REGNO (operands[1])))
1270: {
1271: if (GET_CODE (operands[2]) == CONST_INT)
1272: {
1273: operands[1] = operands[2];
1274: return sub_imm_word (INTVAL (operands[1]),
1275: operands[0], &operands[1]);
1276: }
1277: else
1278: return \"sub.w %2,%0\";
1279: }
1280: else
1281: return \"mova.w @(%n2,%1),%0\";
1282: }")
1283:
1284: (define_insn ""
1285: [(set (match_operand:SI 0 "general_operand" "=rm")
1286: (minus:SI (match_operand:SI 1 "general_operand" "0")
1287: (sign_extend:SI (match_operand:HI 2 "nonimmediate_operand" "rmi"))))]
1288: ""
1289: "sub %2.h,%0.w")
1290:
1291: (define_insn "subhi3"
1292: [(set (match_operand:HI 0 "general_operand" "=rm")
1293: (minus:HI (match_operand:HI 1 "general_operand" "0")
1294: (match_operand:HI 2 "general_operand" "rmi")))]
1295: ""
1296: "*
1297: {
1298: if (GET_CODE (operands[2]) == CONST_INT
1299: && INTVAL (operands[2]) < 0
1300: && INTVAL (operands[2]) != 0x8000)
1301: return \"add.h #%n2,%0\";
1302: return \"sub.h %2,%0\";
1303: }")
1304:
1305: (define_insn ""
1306: [(set (strict_low_part (match_operand:HI 0 "general_operand" "+rm"))
1307: (minus:HI (match_dup 0)
1308: (match_operand:HI 1 "general_operand" "rmi")))]
1309: ""
1310: "sub.h %1,%0")
1311:
1312: (define_insn "subqi3"
1313: [(set (match_operand:QI 0 "general_operand" "=rm")
1314: (minus:QI (match_operand:QI 1 "general_operand" "0")
1315: (match_operand:QI 2 "general_operand" "rmi")))]
1316: ""
1317: "*
1318: {
1319: if (GET_CODE (operands[2]) == CONST_INT
1320: && INTVAL (operands[2]) < 0
1321: && INTVAL (operands[2]) != 0x80)
1322: return \"add.b #%n2,%0\";
1323: return \"sub.b %2,%0\";
1324: }")
1325:
1326: (define_insn ""
1327: [(set (strict_low_part (match_operand:QI 0 "general_operand" "+rm"))
1328: (minus:QI (match_dup 0)
1329: (match_operand:QI 1 "general_operand" "rmi")))]
1330: ""
1331: "sub.b %1,%0")
1332:
1333: (define_insn "subdf3"
1334: [(set (match_operand:DF 0 "general_operand" "=f")
1335: (minus:DF (match_operand:DF 1 "general_operand" "0")
1336: (match_operand:DF 2 "general_operand" "fmG")))]
1337: "TARGET_FPU"
1338: "fsub.d %f2,%0")
1339:
1340: (define_insn "subsf3"
1341: [(set (match_operand:SF 0 "general_operand" "=f")
1342: (minus:SF (match_operand:SF 1 "general_operand" "0")
1343: (match_operand:SF 2 "general_operand" "fmG")))]
1344: "TARGET_FPU"
1345: "fsub.s %f2,%0")
1346:
1347:
1348: ;; multiply instructions
1349:
1350: (define_insn "mulqi3"
1351: [(set (match_operand:QI 0 "general_operand" "=rm")
1352: (mult:QI (match_operand:QI 1 "general_operand" "%0")
1353: (match_operand:QI 2 "general_operand" "rmi")))]
1354: ""
1355: "mul.b %2,%0")
1356:
1357:
1358: (define_insn "mulhi3"
1359: [(set (match_operand:HI 0 "general_operand" "=rm")
1360: (mult:HI (match_operand:HI 1 "general_operand" "%0")
1361: (match_operand:HI 2 "general_operand" "rmi")))]
1362: ""
1363: "mul.h %2,%0")
1364:
1365: ;; define_insn "mulhisi3"
1366:
1367: (define_insn "mulsi3"
1368: [(set (match_operand:SI 0 "general_operand" "=rm")
1369: (mult:SI (match_operand:SI 1 "general_operand" "%0")
1370: (match_operand:SI 2 "general_operand" "rmi")))]
1371: ""
1372: "mul.w %2,%0")
1373:
1374: (define_insn "muldf3"
1375: [(set (match_operand:DF 0 "general_operand" "=f")
1376: (mult:DF (match_operand:DF 1 "general_operand" "%0")
1377: (match_operand:DF 2 "general_operand" "fmG")))]
1378: "TARGET_FPU"
1379: "fmul.d %f2,%0")
1380:
1381: (define_insn "mulsf3"
1382: [(set (match_operand:SF 0 "general_operand" "=f")
1383: (mult:SF (match_operand:SF 1 "general_operand" "%0")
1384: (match_operand:SF 2 "general_operand" "fmG")))]
1385: "TARGET_FPU"
1386: "fmul.s %f2,%0")
1387:
1388:
1389: ;; divide instructions
1390:
1391: (define_insn "divqi3"
1392: [(set (match_operand:QI 0 "general_operand" "=rm")
1393: (div:QI (match_operand:QI 1 "general_operand" "0")
1394: (match_operand:QI 2 "general_operand" "rmi")))]
1395: ""
1396: "div.b %2,%0")
1397:
1398: (define_insn "divhi3"
1399: [(set (match_operand:HI 0 "general_operand" "=rm")
1400: (div:HI (match_operand:HI 1 "general_operand" "0")
1401: (match_operand:HI 2 "general_operand" "rmi")))]
1402: ""
1403: "div.h %2,%0")
1404:
1405: (define_insn "divhisi3"
1406: [(set (match_operand:HI 0 "general_operand" "=r")
1407: (div:HI (match_operand:SI 1 "general_operand" "0")
1408: (match_operand:HI 2 "general_operand" "rmi")))]
1409: ""
1410: "div %2.h,%0.w")
1411:
1412: (define_insn "divsi3"
1413: [(set (match_operand:SI 0 "general_operand" "=rm")
1414: (div:SI (match_operand:SI 1 "general_operand" "0")
1415: (match_operand:SI 2 "general_operand" "rmi")))]
1416: ""
1417: "div.w %2,%0")
1418:
1419: (define_insn "udivqi3"
1420: [(set (match_operand:QI 0 "general_operand" "=rm")
1421: (udiv:QI (match_operand:QI 1 "general_operand" "0")
1422: (match_operand:QI 2 "general_operand" "rmi")))]
1423: ""
1424: "divu.b %2,%0")
1425:
1426: (define_insn "udivhi3"
1427: [(set (match_operand:HI 0 "general_operand" "=rm")
1428: (udiv:HI (match_operand:HI 1 "general_operand" "0")
1429: (match_operand:HI 2 "general_operand" "rmi")))]
1430: ""
1431: "divu.h %2,%0")
1432:
1433: (define_insn "udivhisi3"
1434: [(set (match_operand:HI 0 "general_operand" "=r")
1435: (udiv:HI (match_operand:SI 1 "general_operand" "0")
1436: (match_operand:HI 2 "general_operand" "rmi")))]
1437: ""
1438: "divu %2.h,%0.w")
1439:
1440: (define_insn "udivsi3"
1441: [(set (match_operand:SI 0 "general_operand" "=rm")
1442: (udiv:SI (match_operand:SI 1 "general_operand" "0")
1443: (match_operand:SI 2 "general_operand" "rmi")))]
1444: ""
1445: "divu.w %2,%0")
1446:
1447: (define_insn "divdf3"
1448: [(set (match_operand:DF 0 "general_operand" "=f")
1449: (div:DF (match_operand:DF 1 "general_operand" "0")
1450: (match_operand:DF 2 "general_operand" "fmG")))]
1451: "TARGET_FPU"
1452: "fdiv.d %f2,%0")
1453:
1454: (define_insn "divsf3"
1455: [(set (match_operand:SF 0 "general_operand" "=f")
1456: (div:SF (match_operand:SF 1 "general_operand" "0")
1457: (match_operand:SF 2 "general_operand" "fmG")))]
1458: "TARGET_FPU"
1459: "fdiv.s %f2,%0")
1460:
1461: ;; Remainder instructions.
1462:
1463: (define_insn "modqi3"
1464: [(set (match_operand:QI 0 "general_operand" "=rm")
1465: (mod:QI (match_operand:QI 1 "general_operand" "0")
1466: (match_operand:QI 2 "general_operand" "rmi")))]
1467: ""
1468: "rem.b %2,%0")
1469:
1470: (define_insn "modhisi3"
1471: [(set (match_operand:HI 0 "general_operand" "=r")
1472: (mod:HI (match_operand:SI 1 "general_operand" "0")
1473: (match_operand:HI 2 "general_operand" "rmi")))]
1474: ""
1475: "rem.h %2,%0")
1476:
1477: (define_insn "umodqi3"
1478: [(set (match_operand:QI 0 "general_operand" "=rm")
1479: (umod:QI (match_operand:QI 1 "general_operand" "0")
1480: (match_operand:QI 2 "general_operand" "rmi")))]
1481: ""
1482: "remu.b %2,%0")
1483:
1484: (define_insn "umodhi3"
1485: [(set (match_operand:HI 0 "general_operand" "=rm")
1486: (umod:HI (match_operand:HI 1 "general_operand" "0")
1487: (match_operand:HI 2 "general_operand" "rmi")))]
1488: ""
1489: "remu.h %2,%0")
1490:
1491: (define_insn "umodhisi3"
1492: [(set (match_operand:HI 0 "general_operand" "=r")
1493: (umod:HI (match_operand:SI 1 "general_operand" "0")
1494: (match_operand:HI 2 "general_operand" "rmi")))]
1495: ""
1496: "remu %2.h,%0.w")
1497:
1498: ;; define_insn "divmodsi4"
1499:
1500: (define_insn "udivmodsi4"
1501: [(set (match_operand:SI 0 "general_operand" "=rm")
1502: (udiv:SI (match_operand:SI 1 "general_operand" "0")
1503: (match_operand:SI 2 "general_operand" "rmi")))
1504: (set (match_operand:SI 3 "general_operand" "=r")
1505: (umod:SI (match_dup 1) (match_dup 2)))]
1506: ""
1507: "mov.w #0,%3;divx.w %2,%0,%3")
1508:
1509: ;; logical-and instructions
1510:
1511: (define_insn "andsi3"
1512: [(set (match_operand:SI 0 "general_operand" "=rm")
1513: (and:SI (match_operand:SI 1 "general_operand" "%0")
1514: (match_operand:SI 2 "general_operand" "rmi")))]
1515: ""
1516: "*
1517: {
1518: if (GET_CODE (operands[2]) == CONST_INT
1519: && (INTVAL (operands[2]) | 0xffff) == 0xffffffff
1520: && (GREG_P (operands[0])
1521: || offsettable_memref_p (operands[0])))
1522:
1523: {
1524: if (GET_CODE (operands[0]) != REG)
1525: operands[0] = adj_offsettable_operand (operands[0], 2);
1526: operands[2] = gen_rtx (CONST_INT, VOIDmode,
1527: INTVAL (operands[2]) & 0xffff);
1528: /* Do not delete a following tstl %0 insn; that would be incorrect. */
1529: CC_STATUS_INIT;
1530: return \"and.h %2,%0\";
1531: }
1532: return \"and.w %2,%0\";
1533: }")
1534:
1535: (define_insn "andhi3"
1536: [(set (match_operand:HI 0 "general_operand" "=rm")
1537: (and:HI (match_operand:HI 1 "general_operand" "%0")
1538: (match_operand:HI 2 "general_operand" "rmi")))]
1539: ""
1540: "and.h %2,%0")
1541:
1542: (define_insn "andqi3"
1543: [(set (match_operand:QI 0 "general_operand" "=rm")
1544: (and:QI (match_operand:QI 1 "general_operand" "%0")
1545: (match_operand:QI 2 "general_operand" "rmi")))]
1546: ""
1547: "and.b %2,%0")
1548:
1549: (define_insn ""
1550: [(set (match_operand:SI 0 "general_operand" "=r")
1551: (and:SI (zero_extend:SI (match_operand:HI 1 "nonimmediate_operand" "rm"))
1552: (match_operand:SI 2 "general_operand" "0")))]
1553: ""
1554: "*
1555: {
1556: if (GET_CODE (operands[1]) == CONST_INT)
1557: return \"and %1,%0.w\";
1558: return \"and %1.h,%0.w\";
1559: }")
1560:
1561:
1562: (define_insn ""
1563: [(set (match_operand:SI 0 "general_operand" "=r")
1564: (and:SI (zero_extend:SI (match_operand:QI 1 "nonimmediate_operand" "rm"))
1565: (match_operand:SI 2 "general_operand" "0")))]
1566: ""
1567: "*
1568: {
1569: if (GET_CODE (operands[1]) == CONST_INT)
1570: return \"and %1,%0.w\";
1571: return \"and %1.b,%0.w\";
1572: }")
1573:
1574: ;; inclusive-or instructions
1575:
1576: (define_insn "iorsi3"
1577: [(set (match_operand:SI 0 "general_operand" "=rm")
1578: (ior:SI (match_operand:SI 1 "general_operand" "%0")
1579: (match_operand:SI 2 "general_operand" "rmi")))]
1580: ""
1581: "*
1582: {
1583: register int logval;
1584: if (GET_CODE (operands[2]) == CONST_INT
1585: && INTVAL (operands[2]) >> 16 == 0
1586: && (GREG_P (operands[0])
1587: || offsettable_memref_p (operands[0])))
1588: {
1589: if (GET_CODE (operands[0]) != REG)
1590: operands[0] = adj_offsettable_operand (operands[0], 2);
1591: /* Do not delete a following tstl %0 insn; that would be incorrect. */
1592: CC_STATUS_INIT;
1593: return \"or.h %2,%0\";
1594: }
1595: if (GET_CODE (operands[2]) == CONST_INT
1596: && (logval = exact_log2 (INTVAL (operands[2]))) >= 0
1597: && (GREG_P (operands[0])
1598: || offsettable_memref_p (operands[0])))
1599: {
1600: if (GREG_P (operands[0]))
1601: {
1602: if (logval < 7)
1603: {
1604: operands[1] = gen_rtx (CONST_INT, VOIDmode, 7 - logval);
1605: return \"bset.b %1,%0\";
1606: }
1607: operands[1] = gen_rtx (CONST_INT, VOIDmode, 31 - logval);
1608: return \"bset.w %1,%0\";
1609: }
1610: else
1611: {
1612: operands[0] = adj_offsettable_operand (operands[0], 3 - (logval / 8));
1613: operands[1] = gen_rtx (CONST_INT, VOIDmode, 7 - (logval % 8));
1614: }
1615: return \"bset.b %1,%0\";
1616: }
1617: return \"or.w %2,%0\";
1618: }")
1619:
1620: (define_insn "iorhi3"
1621: [(set (match_operand:HI 0 "general_operand" "=rm")
1622: (ior:HI (match_operand:HI 1 "general_operand" "%0")
1623: (match_operand:HI 2 "general_operand" "rmi")))]
1624: ""
1625: "or.h %2,%0")
1626:
1627: (define_insn "iorqi3"
1628: [(set (match_operand:QI 0 "general_operand" "=rm")
1629: (ior:QI (match_operand:QI 1 "general_operand" "%0")
1630: (match_operand:QI 2 "general_operand" "rmi")))]
1631: ""
1632: "or.b %2,%0")
1633:
1634: ;; xor instructions
1635:
1636: (define_insn "xorsi3"
1637: [(set (match_operand:SI 0 "general_operand" "=rm")
1638: (xor:SI (match_operand:SI 1 "general_operand" "%0")
1639: (match_operand:SI 2 "general_operand" "rmi")))]
1640: ""
1641: "*
1642: {
1643: if (GET_CODE (operands[2]) == CONST_INT
1644: && INTVAL (operands[2]) >> 16 == 0
1645: && (offsettable_memref_p (operands[0]) || GREG_P (operands[0])))
1646: {
1647: if (! GREG_P (operands[0]))
1648: operands[0] = adj_offsettable_operand (operands[0], 2);
1649: /* Do not delete a following tstl %0 insn; that would be incorrect. */
1650: CC_STATUS_INIT;
1651: return \"xor.h %2,%0\";
1652: }
1653: return \"xor.w %2,%0\";
1654: }")
1655:
1656: (define_insn "xorhi3"
1657: [(set (match_operand:HI 0 "general_operand" "=rm")
1658: (xor:HI (match_operand:HI 1 "general_operand" "%0")
1659: (match_operand:HI 2 "general_operand" "rmi")))]
1660: ""
1661: "xor.h %2,%0")
1662:
1663: (define_insn "xorqi3"
1664: [(set (match_operand:QI 0 "general_operand" "=rm")
1665: (xor:QI (match_operand:QI 1 "general_operand" "%0")
1666: (match_operand:QI 2 "general_operand" "rmi")))]
1667: ""
1668: "xor.b %2,%0")
1669:
1670: ;; negation instructions
1671:
1672: (define_insn "negsi2"
1673: [(set (match_operand:SI 0 "general_operand" "=rm")
1674: (neg:SI (match_operand:SI 1 "general_operand" "0")))]
1675: ""
1676: "neg.w %0")
1677:
1678: (define_insn "neghi2"
1679: [(set (match_operand:HI 0 "general_operand" "=rm")
1680: (neg:HI (match_operand:HI 1 "general_operand" "0")))]
1681: ""
1682: "neg.h %0")
1683:
1684: (define_insn "negqi2"
1685: [(set (match_operand:QI 0 "general_operand" "=rm")
1686: (neg:QI (match_operand:QI 1 "general_operand" "0")))]
1687: ""
1688: "neg.b %0")
1689:
1690: (define_insn "negsf2"
1691: [(set (match_operand:SF 0 "general_operand" "=f")
1692: (neg:SF (match_operand:SF 1 "general_operand" "fmF")))]
1693: "TARGET_FPU"
1694: "fneg.s %f1,%0")
1695:
1696:
1697: (define_insn "negdf2"
1698: [(set (match_operand:DF 0 "general_operand" "=f")
1699: (neg:DF (match_operand:DF 1 "general_operand" "fmF")))]
1700: "TARGET_FPU"
1701: "fneg.d %f1,%0")
1702:
1703:
1704: ;; Absolute value instructions
1705:
1706: (define_insn "abssf2"
1707: [(set (match_operand:SF 0 "general_operand" "=f")
1708: (abs:SF (match_operand:SF 1 "general_operand" "fmF")))]
1709: "TARGET_FPU"
1710: "fabs.s %f1,%0")
1711:
1712: (define_insn "absdf2"
1713: [(set (match_operand:DF 0 "general_operand" "=f")
1714: (abs:DF (match_operand:DF 1 "general_operand" "fmF")))]
1715: "TARGET_FPU"
1716: "fabs.d %f1,%0")
1717:
1718:
1719: ;; one complement instructions
1720:
1721: (define_insn "one_cmplsi2"
1722: [(set (match_operand:SI 0 "general_operand" "=rm")
1723: (not:SI (match_operand:SI 1 "general_operand" "0")))]
1724: ""
1725: "not.w %0")
1726:
1727: (define_insn "one_cmplhi2"
1728: [(set (match_operand:HI 0 "general_operand" "=rm")
1729: (not:HI (match_operand:HI 1 "general_operand" "0")))]
1730: ""
1731: "not.h %0")
1732:
1733: (define_insn "one_cmplqi2"
1734: [(set (match_operand:QI 0 "general_operand" "=rm")
1735: (not:QI (match_operand:QI 1 "general_operand" "0")))]
1736: ""
1737: "not.b %0")
1738:
1739: ;; Optimized special case of shifting.
1740: ;; Must precede the general case.
1741:
1742: (define_insn ""
1743: [(set (match_operand:SI 0 "general_operand" "=r")
1744: (ashiftrt:SI (match_operand:SI 1 "memory_operand" "m")
1745: (const_int 24)))]
1746: "GET_CODE (XEXP (operands[1], 0)) != POST_INC
1747: && GET_CODE (XEXP (operands[1], 0)) != PRE_DEC"
1748: "mov:l %1.b,%0.w")
1749:
1750: (define_insn ""
1751: [(set (match_operand:SI 0 "general_operand" "=r")
1752: (lshiftrt:SI (match_operand:SI 1 "memory_operand" "m")
1753: (const_int 24)))]
1754: "GET_CODE (XEXP (operands[1], 0)) != POST_INC
1755: && GET_CODE (XEXP (operands[1], 0)) != PRE_DEC"
1756: "movu %1.b,%0.w")
1757:
1758: (define_insn ""
1759: [(set (cc0) (compare (match_operand:QI 0 "general_operand" "i")
1760: (lshiftrt:SI (match_operand:SI 1 "memory_operand" "m")
1761: (const_int 24))))]
1762: "(GET_CODE (operands[0]) == CONST_INT
1763: && (INTVAL (operands[0]) & ~0xff) == 0)"
1764: "*
1765: {
1766: cc_status.flags |= CC_REVERSED;
1767: if (my_signed_comp (insn))
1768: return \"cmp.b %0,%1\";
1769: return \"cmpu.b %0,%1\";
1770: }")
1771:
1772: (define_insn ""
1773: [(set (cc0) (compare (lshiftrt:SI (match_operand:SI 0 "memory_operand" "m")
1774: (const_int 24))
1775: (match_operand:QI 1 "general_operand" "i")))]
1776: "(GET_CODE (operands[1]) == CONST_INT
1777: && (INTVAL (operands[1]) & ~0xff) == 0)"
1778: "*
1779: if (my_signed_comp (insn))
1780: return \"cmp.b %1,%0\";
1781: return \"cmpu.b %1,%0\";
1782: ")
1783:
1784: (define_insn ""
1785: [(set (cc0) (compare (match_operand:QI 0 "general_operand" "i")
1786: (ashiftrt:SI (match_operand:SI 1 "memory_operand" "m")
1787: (const_int 24))))]
1788: "(GET_CODE (operands[0]) == CONST_INT
1789: && ((INTVAL (operands[0]) + 0x80) & ~0xff) == 0)"
1790: "*
1791: cc_status.flags |= CC_REVERSED;
1792: if (my_signed_comp (insn))
1793: return \"cmp.b %0,%1\";
1794: return \"cmpu.b %0,%1\";
1795: ")
1796:
1797: (define_insn ""
1798: [(set (cc0) (compare (ashiftrt:SI (match_operand:SI 0 "memory_operand" "m")
1799: (const_int 24))
1800: (match_operand:QI 1 "general_operand" "i")))]
1801: "(GET_CODE (operands[1]) == CONST_INT
1802: && ((INTVAL (operands[1]) + 0x80) & ~0xff) == 0)"
1803: "*
1804: if (my_signed_comp (insn))
1805: return \"cmp.b %1,%0\";
1806: return \"cmpu.b %1,%0\";
1807: ")
1808:
1809: ;; arithmetic shift instructions
1810: ;; We don't need the shift memory by 1 bit instruction
1811:
1812: (define_insn "ashlsi3"
1813: [(set (match_operand:SI 0 "general_operand" "=rm")
1814: (ashift:SI (match_operand:SI 1 "general_operand" "0")
1815: (match_operand:SI 2 "general_operand" "rmi")))]
1816: ""
1817: "sha.w %2,%0")
1818:
1819: (define_insn "ashlhi3"
1820: [(set (match_operand:HI 0 "general_operand" "=rm")
1821: (ashift:HI (match_operand:HI 1 "general_operand" "0")
1822: (match_operand:HI 2 "general_operand" "rmi")))]
1823: ""
1824: "sha.h %2,%0")
1825:
1826: (define_insn "ashlqi3"
1827: [(set (match_operand:QI 0 "general_operand" "=rm")
1828: (ashift:QI (match_operand:QI 1 "general_operand" "0")
1829: (match_operand:QI 2 "general_operand" "rmi")))]
1830: ""
1831: "sha.b %2,%0")
1832:
1833: ;; Arithmetic right shift on the Gmicro works by negating the shift count
1834:
1835: ;; ashiftrt -> ashift
1836: (define_expand "ashrsi3"
1837: [(set (match_operand:SI 0 "general_operand" "=rm")
1838: (ashift:SI (match_operand:SI 1 "general_operand" "0")
1839: (match_operand:SI 2 "general_operand" "rmi")))]
1840: ""
1841: "{ operands[2] = negate_rtx (SImode, operands[2]); }")
1842:
1843: ;; ashiftrt -> ashift
1844: (define_expand "ashrhi3"
1845: [(set (match_operand:HI 0 "general_operand" "=rm")
1846: (ashift:HI (match_operand:HI 1 "general_operand" "0")
1847: (match_operand:HI 2 "general_operand" "rmi")))]
1848: ""
1849: " { operands[2] = negate_rtx (HImode, operands[2]); }")
1850:
1851: ;; ashiftrt -> ashift
1852: (define_expand "ashrqi3"
1853: [(set (match_operand:QI 0 "general_operand" "=rm")
1854: (ashift:QI (match_operand:QI 1 "general_operand" "0")
1855: (match_operand:QI 2 "general_operand" "rmi")))]
1856: ""
1857: " { operands[2] = negate_rtx (QImode, operands[2]); }")
1858:
1859: ;; logical shift instructions
1860:
1861: (define_insn "lshlsi3"
1862: [(set (match_operand:SI 0 "general_operand" "=rm")
1863: (lshift:SI (match_operand:SI 1 "general_operand" "0")
1864: (match_operand:SI 2 "general_operand" "rmi")))]
1865: ""
1866: "shl.w %2,%0")
1867:
1868: (define_insn "lshlhi3"
1869: [(set (match_operand:HI 0 "general_operand" "=rm")
1870: (lshift:HI (match_operand:HI 1 "general_operand" "0")
1871: (match_operand:HI 2 "general_operand" "rmi")))]
1872: ""
1873: "shl.h %2,%0")
1874:
1875: (define_insn "lshlqi3"
1876: [(set (match_operand:QI 0 "general_operand" "=rm")
1877: (lshift:QI (match_operand:QI 1 "general_operand" "0")
1878: (match_operand:QI 2 "general_operand" "rmi")))]
1879: ""
1880: "shl.b %2,%0")
1881:
1882: ;; lshiftrt -> lshift
1883: (define_expand "lshrsi3"
1884: [(set (match_operand:SI 0 "general_operand" "=rm")
1885: (lshift:SI (match_operand:SI 1 "general_operand" "0")
1886: (match_operand:SI 2 "general_operand" "rmi")))]
1887: ""
1888: " { operands[2] = negate_rtx (SImode, operands[2]); }")
1889:
1890: ;; lshiftrt -> lshift
1891: (define_expand "lshrhi3"
1892: [(set (match_operand:HI 0 "general_operand" "=rm")
1893: (lshift:HI (match_operand:HI 1 "general_operand" "0")
1894: (match_operand:HI 2 "general_operand" "rmi")))]
1895: ""
1896: " { operands[2] = negate_rtx (HImode, operands[2]); }")
1897:
1898: ;; lshiftrt -> lshift
1899: (define_expand "lshrqi3"
1900: [(set (match_operand:QI 0 "general_operand" "=rm")
1901: (lshift:QI (match_operand:QI 1 "general_operand" "0")
1902: (match_operand:QI 2 "general_operand" "rmi")))]
1903: ""
1904: " { operands[2] = negate_rtx (QImode, operands[2]); }")
1905:
1906: ;; rotate instructions
1907:
1908: (define_insn "rotlsi3"
1909: [(set (match_operand:SI 0 "general_operand" "=rm")
1910: (rotate:SI (match_operand:SI 1 "general_operand" "0")
1911: (match_operand:SI 2 "general_operand" "rmi")))]
1912: ""
1913: "rol.w %2,%0")
1914:
1915: (define_insn "rotlhi3"
1916: [(set (match_operand:HI 0 "general_operand" "=rm")
1917: (rotate:HI (match_operand:HI 1 "general_operand" "0")
1918: (match_operand:HI 2 "general_operand" "rmi")))]
1919: ""
1920: "rol.h %2,%0")
1921:
1922: (define_insn "rotlqi3"
1923: [(set (match_operand:QI 0 "general_operand" "=rm")
1924: (rotate:QI (match_operand:QI 1 "general_operand" "0")
1925: (match_operand:QI 2 "general_operand" "rmi")))]
1926: ""
1927: "rol.b %2,%0")
1928:
1929: (define_expand "rotrsi3"
1930: [(set (match_operand:SI 0 "general_operand" "=rm")
1931: (rotatert:SI (match_operand:SI 1 "general_operand" "0")
1932: (match_operand:SI 2 "general_operand" "rmi")))]
1933: ""
1934: " { operands[2] = negate_rtx (SImode, operands[2]); }")
1935:
1936: (define_expand "rotrhi3"
1937: [(set (match_operand:HI 0 "general_operand" "=rm")
1938: (rotatert:HI (match_operand:HI 1 "general_operand" "0")
1939: (match_operand:HI 2 "general_operand" "rmi")))]
1940: ""
1941: " { operands[2] = negate_rtx (HImode, operands[2]); }")
1942:
1943: (define_expand "rotrqi3"
1944: [(set (match_operand:QI 0 "general_operand" "=rm")
1945: (rotatert:QI (match_operand:QI 1 "general_operand" "0")
1946: (match_operand:QI 2 "general_operand" "rmi")))]
1947: ""
1948: " { operands[2] = negate_rtx (QImode, operands[2]); }")
1949:
1950: ;; Special cases of bit-field insns which we should
1951: ;; recognize in preference to the general case.
1952: ;; These handle aligned 8-bit and 16-bit fields,
1953: ;; which can usually be done with move instructions.
1954:
1955: ;; Should I add mode_dependent_address_p ????
1956:
1957: (define_insn ""
1958: [(set (zero_extract:SI (match_operand:SI 0 "nonimmediate_operand" "+rm")
1959: (match_operand:SI 1 "immediate_operand" "i")
1960: (match_operand:SI 2 "immediate_operand" "i"))
1961: (match_operand:SI 3 "general_operand" "rm"))]
1962: "TARGET_BITFIELD
1963: && GET_CODE (operands[1]) == CONST_INT
1964: && (INTVAL (operands[1]) == 8 || INTVAL (operands[1]) == 16)
1965: && GET_CODE (operands[2]) == CONST_INT
1966: && INTVAL (operands[2]) % INTVAL (operands[1]) == 0
1967: && (GET_CODE (operands[0]) != REG
1968: || ( INTVAL (operands[1]) + INTVAL (operands[2]) == 32))"
1969: "*
1970: {
1971: if (GET_CODE (operands[3]) == MEM)
1972: operands[3] = adj_offsettable_operand (operands[3],
1973: (32 - INTVAL (operands[1])) / 8);
1974:
1975: if (GET_CODE (operands[0]) == REG)
1976: {
1977: if (INTVAL (operands[1]) == 8)
1978: return \"movu %3.b,%0.w\";
1979: return \"movu %3.h,%0.w\";
1980: }
1981: else
1982: {
1983: operands[0]
1984: = adj_offsettable_operand (operands[0], INTVAL (operands[2]) / 8);
1985: if (INTVAL (operands[1]) == 8)
1986: return \"mov.b %3,%0\";
1987: return \"mov.h %3,%0\";
1988: }
1989: }")
1990:
1991: (define_insn ""
1992: [(set (match_operand:SI 0 "general_operand" "=&r")
1993: (zero_extract:SI (match_operand:SI 1 "nonimmediate_operand" "rm")
1994: (match_operand:SI 2 "immediate_operand" "i")
1995: (match_operand:SI 3 "immediate_operand" "i")))]
1996: "TARGET_BITFIELD
1997: && GET_CODE (operands[2]) == CONST_INT
1998: && (INTVAL (operands[2]) == 8 || INTVAL (operands[2]) == 16)
1999: && GET_CODE (operands[3]) == CONST_INT
2000: && INTVAL (operands[3]) % INTVAL (operands[2]) == 0"
2001: "*
2002: {
2003: if (!REG_P (operands[1]))
2004: operands[1]
2005: = adj_offsettable_operand (operands[1], INTVAL (operands[3]) / 8);
2006:
2007: if (REG_P (operands[0]))
2008: {
2009: if (REG_P (operands[1]))
2010: {
2011: if (INTVAL (operands[2]) == 8)
2012: { /* width == 8 */
2013: switch (INTVAL (operands[3]))
2014: {
2015: case 0:
2016: return \"mov.w %1,%0;shl.w #-24,%0\";
2017: break;
2018: case 8:
2019: return \"mov.w %1,%0;shl.w #8,%0;shl.w #-24,%0\";
2020: break;
2021: case 16:
2022: return \"mov.w %1,%0;shl.w #16,%0;shl.w #-24,%0\";
2023: break;
2024: case 24:
2025: return \"movu %1.b,%0.w\";
2026: break;
2027: default:
2028: myabort (2);
2029: }
2030: }
2031: else
2032: {
2033: switch (INTVAL (operands[3]))
2034: {
2035: case 0:
2036: return \"mov.w %1,%0;shl.w #-16,%0\";
2037: break;
2038: case 16:
2039: return \"movu %1.h,%0.w\";
2040: break;
2041: default:
2042: myabort (3);
2043: }
2044: }
2045: }
2046: else
2047: {
2048: if (INTVAL (operands[2]) == 8)
2049: return \"movu %1.h,%0.w\";
2050: else
2051: return \"movu %1.b,%0.w\";
2052: }
2053: }
2054: else
2055: { /* op[0] == MEM */
2056: if (INTVAL (operands[2]) == 8)
2057: return \"movu %1.b,%0.w\";
2058: return \"movu %1.h,%0.w\";
2059: }
2060: }")
2061:
2062: (define_insn ""
2063: [(set (match_operand:SI 0 "general_operand" "=r")
2064: (sign_extract:SI (match_operand:SI 1 "nonimmediate_operand" "ro")
2065: (match_operand:SI 2 "immediate_operand" "i")
2066: (match_operand:SI 3 "immediate_operand" "i")))]
2067: "TARGET_BITFIELD
2068: && GET_CODE (operands[2]) == CONST_INT
2069: && (INTVAL (operands[2]) == 8 || INTVAL (operands[2]) == 16)
2070: && GET_CODE (operands[3]) == CONST_INT
2071: && INTVAL (operands[3]) % INTVAL (operands[2]) == 0"
2072: "*
2073: {
2074: if (!REG_P (operands[1]))
2075: operands[1]
2076: = adj_offsettable_operand (operands[1], INTVAL (operands[3]) / 8);
2077:
2078: if (REG_P (operands[0]))
2079: {
2080: if (REG_P (operands[1]))
2081: {
2082: if (INTVAL (operands[2]) == 8)
2083: { /* width == 8 */
2084: switch (INTVAL (operands[3]))
2085: {
2086: case 0:
2087: return \"mov.w %1,%0;sha.w #-24,%0\";
2088: break;
2089: case 8:
2090: return \"mov.w %1,%0;shl.w #8,%0;sha.w #-24,%0\";
2091: break;
2092: case 16:
2093: return \"mov.w %1,%0;shl.w #16,%0;sha.w #-24,%0\";
2094: break;
2095: case 24:
2096: return \"mov %1.b,%0.w\";
2097: break;
2098: default:
2099: myabort (4);
2100: }
2101: }
2102: else
2103: {
2104: switch (INTVAL (operands[3]))
2105: {
2106: case 0:
2107: return \"mov.w %1,%0;sha.w #-16,%0\";
2108: break;
2109: case 16:
2110: return \"mov %1.h,%0.w\";
2111: break;
2112: default:
2113: myabort (5);
2114: }
2115: }
2116: }
2117: else
2118: {
2119: if (INTVAL (operands[2]) == 8)
2120: return \"mov %1.h,%0.w\";
2121: else
2122: return \"mov %1.b,%0.w\";
2123: }
2124: }
2125: else
2126: { /* op[0] == MEM */
2127: if (INTVAL (operands[2]) == 8)
2128: return \"mov %1.b,%0.w\";
2129: return \"mov %1.h,%0.w\";
2130: }
2131: }")
2132:
2133: ;; Bit field instructions, general cases.
2134: ;; "o,d" constraint causes a nonoffsettable memref to match the "o"
2135: ;; so that its address is reloaded.
2136:
2137: ;; extv dest:SI src(:QI/:SI) width:SI pos:SI
2138: ;; r.w m r.w/# rmi
2139: ;; %0 %1 %2 %3
2140:
2141: (define_insn "extv"
2142: [(set (match_operand:SI 0 "general_operand" "=r")
2143: (sign_extract:SI (match_operand:QI 1 "nonimmediate_operand" "m")
2144: (match_operand:SI 2 "general_operand" "ri")
2145: (match_operand:SI 3 "general_operand" "rmi")))]
2146: "TARGET_BITFIELD"
2147: "bfext %3,%2,%1,%0")
2148:
2149:
2150: (define_insn "extzv"
2151: [(set (match_operand:SI 0 "general_operand" "=r")
2152: (zero_extract:SI (match_operand:QI 1 "nonimmediate_operand" "m")
2153: (match_operand:SI 2 "general_operand" "ri")
2154: (match_operand:SI 3 "general_operand" "rmi")))]
2155: "TARGET_BITFIELD"
2156: "bfextu %3,%2,%1,%0")
2157:
2158: ;; There is no insn on the Gmicro to NOT/SET/CLR bitfield.
2159:
2160:
2161: ;; insv dest(BF):QI/SI width:SI pos:SI src:SI
2162: ;; m r.w rmi r.w/i
2163: ;; 0 1 2 3
2164:
2165:
2166: (define_insn "insv"
2167: [(set (zero_extract:SI (match_operand:QI 0 "nonimmediate_operand" "+m,m")
2168: (match_operand:SI 1 "general_operand" "r,i")
2169: (match_operand:SI 2 "general_operand" "rmi,i"))
2170: (match_operand:SI 3 "general_operand" "ri,ri"))]
2171: "TARGET_BITFIELD"
2172: "bfinsu %3,%2,%1,%0")
2173: ;;; bfins/bfinsu ????????
2174:
2175: ;; == == == == == == == == == == == == ==
2176:
2177: ;; Now recognize bit field insns that operate on registers
2178: ;; (or at least were intended to do so).
2179:
2180: ;; On the Gmicro/300,
2181: ;; bitfield instructions are not applicable to registers ;-<
2182: ;; But I write the register cases, because without them the gcc
2183: ;; seems to use "and" instruction with some other instructions
2184: ;; instead of using a shift instruction.
2185: ;; It is because on many processors shift instructions are slower.
2186: ;; On the Gmicro/300 which has a barrel shifter,
2187: ;; it is faster to use a shift instruction.
2188: ;;
2189: ;; Restricts width and offset to be immediates.
2190: ;;
2191: (define_insn ""
2192: [(set (match_operand:SI 0 "general_operand" "=r")
2193: (sign_extract:SI (match_operand:SI 1 "nonimmediate_operand" "r")
2194: (match_operand:SI 2 "immediate_operand" "i")
2195: (match_operand:SI 3 "immediate_operand" "i")))]
2196: "TARGET_BITFIELD"
2197: "*
2198: {
2199: if (REGNO (operands[0]) != REGNO (operands[1]))
2200: output_asm_insn (\"mov.w %1,%0\", operands);
2201: if (INTVAL (operands[3]) != 0)
2202: output_asm_insn (\"shl.w %3,%0\", operands);
2203: operands[2] = gen_rtx (CONST_INT, VOIDmode, -(32 - INTVAL (operands[2])));
2204: return \"sha.w %3,%0\";
2205: }")
2206:
2207:
2208: (define_insn ""
2209: [(set (match_operand:SI 0 "general_operand" "=r")
2210: (zero_extract:SI (match_operand:SI 1 "nonimmediate_operand" "r")
2211: (match_operand:SI 2 "immediate_operand" "i")
2212: (match_operand:SI 3 "immediate_operand" "i")))]
2213: "TARGET_BITFIELD"
2214: "*
2215: {
2216: if (REGNO (operands[0]) != REGNO (operands[1]))
2217: output_asm_insn (\"mov.w %1,%0\", operands);
2218: if (INTVAL (operands[3]) != 0)
2219: output_asm_insn (\"shl.w %3,%0\", operands);
2220: operands[2] = gen_rtx (CONST_INT, VOIDmode, -(32 - INTVAL (operands[2])));
2221: return \"shl.w %3,%0\";
2222: }")
2223:
2224:
2225: ;; There are more descriptions for m68k, but not yet for the Gmicro.
2226: ;;
2227:
2228: ;; Basic conditional jump instructions.
2229:
2230:
2231: (define_insn "beq"
2232: [(set (pc)
2233: (if_then_else (eq (cc0)
2234: (const_int 0))
2235: (label_ref (match_operand 0 "" ""))
2236: (pc)))]
2237: ""
2238: "*
2239: {
2240: OUTPUT_JUMP (\"beq %b0\", \"fbeq %b0\", \"beq %b0\");
2241: }")
2242:
2243: (define_insn "bne"
2244: [(set (pc)
2245: (if_then_else (ne (cc0)
2246: (const_int 0))
2247: (label_ref (match_operand 0 "" ""))
2248: (pc)))]
2249: ""
2250: "*
2251: {
2252: OUTPUT_JUMP (\"bne %b0\", \"fbne %b0\", \"bne %b0\");
2253: }")
2254:
2255: (define_insn "bgt"
2256: [(set (pc)
2257: (if_then_else (gt (cc0)
2258: (const_int 0))
2259: (label_ref (match_operand 0 "" ""))
2260: (pc)))]
2261: ""
2262: "*
2263: OUTPUT_JUMP (\"bgt %b0\", \"fbgt %b0\", 0);
2264: ")
2265:
2266: (define_insn "bgtu"
2267: [(set (pc)
2268: (if_then_else (gtu (cc0)
2269: (const_int 0))
2270: (label_ref (match_operand 0 "" ""))
2271: (pc)))]
2272: ""
2273: "bgt %b0")
2274:
2275: (define_insn "blt"
2276: [(set (pc)
2277: (if_then_else (lt (cc0)
2278: (const_int 0))
2279: (label_ref (match_operand 0 "" ""))
2280: (pc)))]
2281: ""
2282: "*
2283: OUTPUT_JUMP (\"blt %b0\", \"fblt %b0\", \"bms %b0\");
2284: ")
2285:
2286: ;; bms ?????
2287: ;;
2288:
2289: (define_insn "bltu"
2290: [(set (pc)
2291: (if_then_else (ltu (cc0)
2292: (const_int 0))
2293: (label_ref (match_operand 0 "" ""))
2294: (pc)))]
2295: ""
2296: "blt %b0")
2297:
2298: (define_insn "bge"
2299: [(set (pc)
2300: (if_then_else (ge (cc0)
2301: (const_int 0))
2302: (label_ref (match_operand 0 "" ""))
2303: (pc)))]
2304: ""
2305: "*
2306: OUTPUT_JUMP (\"bge %b0\", \"fbge %b0\", \"bmc %b0\");
2307: ")
2308:
2309: ;; bmc ??
2310:
2311: (define_insn "bgeu"
2312: [(set (pc)
2313: (if_then_else (geu (cc0)
2314: (const_int 0))
2315: (label_ref (match_operand 0 "" ""))
2316: (pc)))]
2317: ""
2318: "bge %b0")
2319:
2320: (define_insn "ble"
2321: [(set (pc)
2322: (if_then_else (le (cc0)
2323: (const_int 0))
2324: (label_ref (match_operand 0 "" ""))
2325: (pc)))]
2326: ""
2327: "ble %b0")
2328:
2329: (define_insn "bleu"
2330: [(set (pc)
2331: (if_then_else (leu (cc0)
2332: (const_int 0))
2333: (label_ref (match_operand 0 "" ""))
2334: (pc)))]
2335: ""
2336: "ble %b0")
2337:
2338: ;; Negated conditional jump instructions.
2339:
2340: (define_insn ""
2341: [(set (pc)
2342: (if_then_else (eq (cc0)
2343: (const_int 0))
2344: (pc)
2345: (label_ref (match_operand 0 "" ""))))]
2346: ""
2347: "*
2348: {
2349: OUTPUT_JUMP (\"bne %b0\", \"fbne %b0\", \"bne %b0\");
2350: }")
2351:
2352: (define_insn ""
2353: [(set (pc)
2354: (if_then_else (ne (cc0)
2355: (const_int 0))
2356: (pc)
2357: (label_ref (match_operand 0 "" ""))))]
2358: ""
2359: "*
2360: {
2361: OUTPUT_JUMP (\"beq %b0\", \"fbeq %b0\", \"beq %b0\");
2362: }")
2363:
2364: (define_insn ""
2365: [(set (pc)
2366: (if_then_else (gt (cc0)
2367: (const_int 0))
2368: (pc)
2369: (label_ref (match_operand 0 "" ""))))]
2370: ""
2371: "*
2372: OUTPUT_JUMP (\"ble %b0\", \"fbngt %b0\", 0);
2373: ")
2374: ;; fbngt ???
2375:
2376: (define_insn ""
2377: [(set (pc)
2378: (if_then_else (gtu (cc0)
2379: (const_int 0))
2380: (pc)
2381: (label_ref (match_operand 0 "" ""))))]
2382: ""
2383: "ble %b0")
2384:
2385: (define_insn ""
2386: [(set (pc)
2387: (if_then_else (lt (cc0)
2388: (const_int 0))
2389: (pc)
2390: (label_ref (match_operand 0 "" ""))))]
2391: ""
2392: "*
2393: OUTPUT_JUMP (\"bge %b0\", \"fbnlt %b0\", \"jbmc %b0\");
2394: ")
2395:
2396: (define_insn ""
2397: [(set (pc)
2398: (if_then_else (ltu (cc0)
2399: (const_int 0))
2400: (pc)
2401: (label_ref (match_operand 0 "" ""))))]
2402: ""
2403: "blt %b0")
2404:
2405: (define_insn ""
2406: [(set (pc)
2407: (if_then_else (ge (cc0)
2408: (const_int 0))
2409: (pc)
2410: (label_ref (match_operand 0 "" ""))))]
2411: ""
2412: "*
2413: OUTPUT_JUMP (\"blt %b0\", \"fbnge %b0\", \"jbms %b0\");
2414: ")
2415:
2416: (define_insn ""
2417: [(set (pc)
2418: (if_then_else (geu (cc0)
2419: (const_int 0))
2420: (pc)
2421: (label_ref (match_operand 0 "" ""))))]
2422: ""
2423: "blt %b0")
2424: ;; ????
2425:
2426: (define_insn ""
2427: [(set (pc)
2428: (if_then_else (le (cc0)
2429: (const_int 0))
2430: (pc)
2431: (label_ref (match_operand 0 "" ""))))]
2432: ""
2433: "*
2434: OUTPUT_JUMP (\"bgt %b0\", \"fbnle %b0\", 0);
2435: ")
2436:
2437: (define_insn ""
2438: [(set (pc)
2439: (if_then_else (leu (cc0)
2440: (const_int 0))
2441: (pc)
2442: (label_ref (match_operand 0 "" ""))))]
2443: ""
2444: "bgt %b0")
2445:
2446: ;; Unconditional and other jump instructions
2447: (define_insn "jump"
2448: [(set (pc)
2449: (label_ref (match_operand 0 "" "")))]
2450: ""
2451: "bra %b0")
2452:
2453: (define_insn "tablejump"
2454: [(set (pc)
2455: (plus:SI (pc) (match_operand:SI 0 "general_operand" "r")))
2456: (use (label_ref (match_operand 1 "" "")))]
2457: ""
2458: "jmp @(pc:b,4:4,%0)")
2459:
2460: ;;
2461: ;; Should Add code for "ACB", "SCB". !!! ????
2462: ;; See m68k.h (dbra)
2463: ;;
2464:
2465: ;; Call subroutine with no return value.
2466: (define_insn "call"
2467: [(call (match_operand:QI 0 "general_operand" "m")
2468: (match_operand:SI 1 "general_operand" "rmi"))]
2469: ;; Operand 1 not really used on the Gmicro.
2470:
2471: ""
2472: "*
2473: {
2474: if (GET_CODE (operands[0]) == MEM
2475: && GET_CODE (XEXP (operands[0],0)) == SYMBOL_REF)
2476: return \"bsr %b0\";
2477: return \"jsr %0\";
2478: }")
2479:
2480: ;; Call subroutine, returning value in operand 0
2481: ;; (which must be a hard register).
2482: (define_insn "call_value"
2483: [(set (match_operand 0 "" "=rf")
2484: (call (match_operand:QI 1 "general_operand" "m")
2485: (match_operand:SI 2 "general_operand" "rmi")))]
2486: ;; Operand 2 not really used on the Gmicro.
2487: ""
2488: "*
2489: {
2490: if (GET_CODE (operands[1]) == MEM
2491: && GET_CODE (XEXP (operands[1],0)) == SYMBOL_REF)
2492: return \"bsr %b1\";
2493: return \"jsr %1\";
2494: }")
2495:
2496: ;; Call subroutine returning any type.
2497:
2498: (define_expand "untyped_call"
2499: [(parallel [(call (match_operand 0 "" "")
2500: (const_int 0))
2501: (match_operand 1 "" "")
2502: (match_operand 2 "" "")])]
2503: ""
2504: "
2505: {
2506: int i;
2507:
2508: emit_call_insn (gen_call (operands[0], const0_rtx, NULL, const0_rtx));
2509:
2510: for (i = 0; i < XVECLEN (operands[2], 0); i++)
2511: {
2512: rtx set = XVECEXP (operands[2], 0, i);
2513: emit_move_insn (SET_DEST (set), SET_SRC (set));
2514: }
2515:
2516: /* The optimizer does not know that the call sets the function value
2517: registers we stored in the result block. We avoid problems by
2518: claiming that all hard registers are used and clobbered at this
2519: point. */
2520: emit_insn (gen_blockage ());
2521:
2522: DONE;
2523: }")
2524:
2525: ;; UNSPEC_VOLATILE is considered to use and clobber all hard registers and
2526: ;; all of memory. This blocks insns from being moved across this point.
2527:
2528: (define_insn "blockage"
2529: [(unspec_volatile [(const_int 0)] 0)]
2530: ""
2531: "")
2532:
2533: (define_insn "nop"
2534: [(const_int 0)]
2535: ""
2536: "nop")
2537:
2538: ;; Turned off because the general move-an-address pattern handles it.
2539: ;;
2540: ;; Thus goes after the move instructions
2541: ;; because the move instructions are better (require no spilling)
2542: ;; when they can apply.
2543: ;; After add/sub now !!
2544:
2545: ;(define_insn "pushasi"
2546: ; [(set (match_operand:SI 0 "push_operand" "=m")
2547: ; (match_operand:SI 1 "address_operand" "p"))]
2548: ; ""
2549: ; "*
2550: ;{
2551: ; if (GET_CODE (operands[1]) == CONST_INT)
2552: ; return push_imm_word (INTVAL (operands[1]), operands[0]);
2553: ; if (CONSTANT_P (operands[1]))
2554: ; return \"mov.w %1,%-\";
2555: ; if (GET_CODE (operands[1]) == REG)
2556: ; return \"mov.w %1,%-\";
2557: ; else if (GET_CODE (operands[1]) == MEM)
2558: ; {
2559: ; return \"mov.w %1,%-\";
2560: ; }
2561: ; else
2562: ; return \"mova.w %p1,%-\";
2563: ;}")
2564:
2565: ;; This should not be used unless the add/sub insns can't be.
2566:
2567: /* mova.[whq] 89.08.11 for test M.Yuhara */
2568: ;(define_insn ""
2569: ; [(set (match_operand:SI 0 "general_operand" "=rm")
2570: ; (address (match_operand:SI 1 "address_operand" "p")))]
2571: ; ""
2572: ; "*
2573: ;{
2574: ; if (GET_CODE (operands[1]) == CONST_INT)
2575: ; return mov_imm_word (INTVAL (operands[1]), operands[0]);
2576: ; if (CONSTANT_P (operands[1]))
2577: ; return \"mov.w %1,%0\";
2578: ; if (GET_CODE (operands[1]) == REG)
2579: ; return \"mov.w %1,%0\";
2580: ; else if (GET_CODE (operands[1]) == MEM) {
2581: ; operands[1] = XEXP (operands[1],0);
2582: ; return \"mov.w %1,%0\";
2583: ; }
2584: ; else
2585: ; return \"mova.w %p1,%0\";
2586: ;}")
2587:
2588:
2589: (define_insn ""
2590: [(set (match_operand:SI 0 "general_operand" "=rm")
2591: (address (match_operand:HI 1 "address_operand" "")))]
2592: ""
2593: "*
2594: {
2595: if (GET_CODE (operands[1]) == CONST_INT)
2596: return mov_imm_word (INTVAL (operands[1]), operands[0]);
2597: if (CONSTANT_P (operands[1]))
2598: return \"mov.w %1,%0\";
2599: if (GET_CODE (operands[1]) == REG)
2600: return \"mov.w %1,%0\";
2601: else if (GET_CODE (operands[1]) == MEM)
2602: {
2603: operands[1] = XEXP (operands[1],0);
2604: return \"mov.w %1,%0\"; /* OK ? */
2605: }
2606: else
2607: return \"mova.w %p1,%0\";
2608: }")
2609:
2610: ;(define_insn ""
2611: ; [(set (match_operand:SI 0 "general_operand" "=rm")
2612: ; (match_operand:QI 1 "address_operand" "p"))]
2613: ; ""
2614: ; "*
2615: ;{
2616: ; if (push_operand (operands[0], SImode))
2617: ; return \"mova %1,%-\";
2618: ; return \"mova %1,%0\";
2619: ;}")
2620:
2621: ;(define_insn ""
2622: ; [(set (match_operand:SI 0 "general_operand" "=rm")
2623: ; (match_operand:QI 1 "address_operand" "p"))]
2624: ; ""
2625: ; "*
2626: ;{
2627: ; if (CONSTANT_P (operands[1]))
2628: ; return \"mov.w %1,%0\";
2629: ; else if (GET_CODE (operands[1]) == REG)
2630: ; return \"mov.w %1,%0\";
2631: ; else if (GET_CODE (operands[1]) == MEM)
2632: ; {
2633: ; operands[1] = XEXP (operands[1],0);
2634: ; return \"mov.w %1,%0 ; OK?\";
2635: ; }
2636: ; else if (GET_CODE (operands[0]) == REG
2637: ; && GET_CODE (operands[1]) == PLUS)
2638: ; {
2639: ; rtx xreg, xdisp;
2640: ;
2641: ; if (GET_CODE (XEXP (operands[1], 0)) == REG
2642: ; && REGNO (XEXP (operands[1], 0)) == REGNO (operands[0]))
2643: ; {
2644: ; xreg = XEXP (operands[1], 0);
2645: ; xdisp = XEXP (operands[1],1);
2646: ; }
2647: ; else
2648: ; {
2649: ; xreg = XEXP (operands[1], 1);
2650: ; xdisp = XEXP (operands[1],0);
2651: ; }
2652: ;
2653: ; if (GET_CODE (xreg) == REG
2654: ; && REGNO (xreg) == REGNO (operands[0])
2655: ; && (CONSTANT_P (xdisp) || GET_CODE (xdisp) == REG))
2656: ; {
2657: ; operands[1] = xdisp;
2658: ; if (CONSTANT_P (xdisp))
2659: ; return add_imm_word (INTVAL (xdisp), xreg, &operands[1]);
2660: ; else
2661: ; return \"add.w %1,%0\";
2662: ; }
2663: ; }
2664: ; return \"mova.w %p1,%0\";
2665: ;}")
2666:
2667: ;; This is the first machine-dependent peephole optimization.
2668: ;; It is useful when a floating value is returned from a function call
2669: ;; and then is moved into an FP register.
2670: ;; But it is mainly intended to test the support for these optimizations.
2671:
2672: (define_peephole
2673: [(set (reg:SI 15) (plus:SI (reg:SI 15) (const_int 4)))
2674: (set (match_operand:DF 0 "register_operand" "=f")
2675: (match_operand:DF 1 "register_operand" "r"))]
2676: "FPU_REG_P (operands[0]) && ! FPU_REG_P (operands[1])"
2677: "*
2678: {
2679: rtx xoperands[2];
2680: xoperands[1] = gen_rtx (REG, SImode, REGNO (operands[1]) + 1);
2681: output_asm_insn (\"mov.w %1,@sp\", xoperands);
2682: output_asm_insn (\"mov.w %1,%-\", operands);
2683: return \"fmov.d %+,%0\";
2684: }
2685: ")
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.