|
|
1.1 root 1: ;;- Machine description for GNU compiler
2: ;;- Motorola 68000 Version
3: ;; Copyright (C) 1987 Free Software Foundation, Inc.
4:
5: ;; This file is part of GNU CC.
6:
7: ;; GNU CC is distributed in the hope that it will be useful,
8: ;; but WITHOUT ANY WARRANTY. No author or distributor
9: ;; accepts responsibility to anyone for the consequences of using it
10: ;; or for whether it serves any particular purpose or works at all,
11: ;; unless he says so in writing. Refer to the GNU CC General Public
12: ;; License for full details.
13:
14: ;; Everyone is granted permission to copy, modify and redistribute
15: ;; GNU CC, but only under the conditions described in the
16: ;; GNU CC General Public License. A copy of this license is
17: ;; supposed to have been given to you along with GNU CC so you
18: ;; can know your rights and responsibilities. It should be in a
19: ;; file named COPYING. Among other things, the copyright notice
20: ;; and this notice must be preserved on all copies.
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: ;;- cpp macro #define NOTICE_UPDATE_CC in file tm.h handles condition code
34: ;;- updates for most instructions.
35:
36: ;;- Operand classes for the register allocator:
37: ;;- 'a' one of the address registers can be used.
38: ;;- 'd' one of the data registers can be used.
39: ;;- 'r' either a data or an address register can be used.
40:
41: ;;- Immedidate integer operands Constrains:
42: ;;- 'I' 1 .. 8
43: ;;- 'J' -32768 .. 32767
44: ;;- 'K' -128 .. 127
45: ;;- 'L' -8 .. -1
46:
47: ;;- Some of these insn's are composites of several m68000 op codes.
48: ;;- The assembler (or final @@??) insures that the appropriate one is
49: ;;- selected.
50:
51: (define_insn ""
52: [(set (match_operand:DF 0 "push_operand" "=m")
53: (match_operand:DF 1 "general_operand" "ro<>fF"))]
54: ""
55: "*
56: {
57: if (FP_REG_P (operands[1]))
58: return \"fmove%.d %f1,%0\";
59: return output_move_double (operands);
60: }")
61:
62: (define_insn ""
63: [(set (match_operand:DI 0 "push_operand" "=m")
64: (match_operand:DI 1 "general_operand" "ro<>"))]
65: ""
66: "*
67: {
68: return output_move_double (operands);
69: }")
70:
71: (define_insn "tstsi"
72: [(set (cc0)
73: (match_operand:SI 0 "general_operand" "rm"))]
74: ""
75: "*
76: {
77: #ifdef ISI_OV
78: /* ISI's assembler fails to handle tstl a0. */
79: if (! ADDRESS_REG_P (operands[0]))
80: #else
81: if (TARGET_68020 || ! ADDRESS_REG_P (operands[0]))
82: #endif
83: return \"tst%.l %0\";
84: /* If you think that the 68020 does not support tstl a0,
85: reread page B-167 of the 68020 manual more carefully. */
86: /* On an address reg, cmpw may replace cmpl. */
87: #ifdef HPUX_ASM
88: return \"cmp%.w %0,%#0\";
89: #else
90: return \"cmp%.w %#0,%0\";
91: #endif
92: }")
93:
94: (define_insn "tsthi"
95: [(set (cc0)
96: (match_operand:HI 0 "general_operand" "rm"))]
97: ""
98: "*
99: {
100: #ifdef ISI_OV
101: if (! ADDRESS_REG_P (operands[0]))
102: #else
103: if (TARGET_68020 || ! ADDRESS_REG_P (operands[0]))
104: #endif
105: return \"tst%.w %0\";
106: #ifdef HPUX_ASM
107: return \"cmp%.w %0,%#0\";
108: #else
109: return \"cmp%.w %#0,%0\";
110: #endif
111: }")
112:
113: (define_insn "tstqi"
114: [(set (cc0)
115: (match_operand:QI 0 "general_operand" "dm"))]
116: ""
117: "tst%.b %0")
118:
119: (define_insn "tstsf"
120: [(set (cc0)
121: (match_operand:SF 0 "general_operand" "fdm"))]
122: "TARGET_68881"
123: "*
124: {
125: cc_status.flags = CC_IN_68881;
126: if (FP_REG_P (operands[0]))
127: return \"ftst%.x %0\";
128: return \"ftst%.s %0\";
129: }")
130:
131: (define_insn "tstdf"
132: [(set (cc0)
133: (match_operand:DF 0 "general_operand" "fm"))]
134: "TARGET_68881"
135: "*
136: {
137: cc_status.flags = CC_IN_68881;
138: if (FP_REG_P (operands[0]))
139: return \"ftst%.x %0\";
140: return \"ftst%.d %0\";
141: }")
142:
143: ;; compare instructions.
144:
145: ;; A composite of the cmp, cmpa, & cmpi m68000 op codes.
146: (define_insn "cmpsi"
147: [(set (cc0)
148: (minus (match_operand:SI 0 "general_operand" "rKs,mr")
149: (match_operand:SI 1 "general_operand" "mr,Ksr")))]
150: ""
151: "*
152: {
153: if (REG_P (operands[1])
154: || (!REG_P (operands[0]) && GET_CODE (operands[0]) != MEM))
155: { cc_status.flags |= CC_REVERSED;
156: #ifdef HPUX_ASM
157: return \"cmp%.l %1,%0\";
158: #else
159: return \"cmp%.l %0,%1\";
160: #endif
161: }
162: #ifdef HPUX_ASM
163: return \"cmp%.l %0,%1\";
164: #else
165: return \"cmp%.l %1,%0\";
166: #endif
167: }")
168:
169: (define_insn "cmphi"
170: [(set (cc0)
171: (minus (match_operand:HI 0 "general_operand" "rn,mr")
172: (match_operand:HI 1 "general_operand" "mr,nr")))]
173: ""
174: "*
175: {
176: if (REG_P (operands[1])
177: || (!REG_P (operands[0]) && GET_CODE (operands[0]) != MEM))
178: { cc_status.flags |= CC_REVERSED;
179: #ifdef HPUX_ASM
180: return \"cmp%.w %1,%0\";
181: #else
182: return \"cmp%.w %0,%1\";
183: #endif
184: }
185: #ifdef HPUX_ASM
186: return \"cmp%.w %0,%1\";
187: #else
188: return \"cmp%.w %1,%0\";
189: #endif
190: }")
191:
192: (define_insn ""
193: [(set (cc0)
194: (minus (mem:QI (post_inc:SI (match_operand:SI 0 "general_operand" "+a")))
195: (mem:QI (post_inc:SI (match_operand:SI 1 "general_operand" "+a")))))]
196: "! CONSTANT_P (operands[0]) && ! CONSTANT_P (operands[1])"
197: "*
198: #ifdef MOTOROLA
199: return \"cmpm.b (%1)+,(%0)+\";
200: #else
201: return \"cmpmb %1@+,%0@+\";
202: #endif
203: ")
204:
205: (define_insn "cmpqi"
206: [(set (cc0)
207: (minus (match_operand:QI 0 "general_operand" "dn,md")
208: (match_operand:QI 1 "general_operand" "dm,nd")))]
209: ""
210: "*
211: {
212: if (REG_P (operands[1])
213: || (!REG_P (operands[0]) && GET_CODE (operands[0]) != MEM))
214: { cc_status.flags |= CC_REVERSED;
215: #ifdef HPUX_ASM
216: return \"cmp%.b %1,%0\";
217: #else
218: return \"cmp%.b %0,%1\";
219: #endif
220: }
221: #ifdef HPUX_ASM
222: return \"cmp%.b %0,%1\";
223: #else
224: return \"cmp%.b %1,%0\";
225: #endif
226: }")
227:
228: (define_insn "cmpdf"
229: [(set (cc0)
230: (minus:DF (match_operand:DF 0 "general_operand" "f,mG")
231: (match_operand:DF 1 "general_operand" "fmG,f")))]
232: "TARGET_68881"
233: "*
234: {
235: cc_status.flags = CC_IN_68881;
236: #ifdef HPUX_ASM
237: if (REG_P (operands[0]))
238: {
239: if (REG_P (operands[1]))
240: return \"fcmp%.x %0,%1\";
241: else
242: return \"fcmp%.d %0,%f1\";
243: }
244: cc_status.flags |= CC_REVERSED;
245: return \"fcmp%.d %1,%f0\";
246: #else
247: if (REG_P (operands[0]))
248: {
249: if (REG_P (operands[1]))
250: return \"fcmp%.x %1,%0\";
251: else
252: return \"fcmp%.d %f1,%0\";
253: }
254: cc_status.flags |= CC_REVERSED;
255: return \"fcmp%.d %f0,%1\";
256: #endif
257: }")
258:
259: (define_insn "cmpsf"
260: [(set (cc0)
261: (minus:SF (match_operand:SF 0 "general_operand" "f,mdG")
262: (match_operand:SF 1 "general_operand" "fmdG,f")))]
263: "TARGET_68881"
264: "*
265: {
266: cc_status.flags = CC_IN_68881;
267: #ifdef HPUX_ASM
268: if (FP_REG_P (operands[0]))
269: {
270: if (FP_REG_P (operands[1]))
271: return \"fcmp%.x %0,%1\";
272: else
273: return \"fcmp%.s %0,%f1\";
274: }
275: cc_status.flags |= CC_REVERSED;
276: return \"fcmp%.s %1,%f0\";
277: #else
278: if (FP_REG_P (operands[0]))
279: {
280: if (FP_REG_P (operands[1]))
281: return \"fcmp%.x %1,%0\";
282: else
283: return \"fcmp%.s %f1,%0\";
284: }
285: cc_status.flags |= CC_REVERSED;
286: return \"fcmp%.s %f0,%1\";
287: #endif
288: }")
289:
290: ;; Recognizers for btst instructions.
291:
292: (define_insn ""
293: [(set (cc0) (zero_extract (match_operand:QI 0 "general_operand" "do")
294: (const_int 1)
295: (minus:SI (const_int 7)
296: (match_operand:SI 1 "general_operand" "di"))))]
297: ""
298: "* { return output_btst (operands, operands[1], operands[0], insn, 7); }")
299:
300: (define_insn ""
301: [(set (cc0) (zero_extract (match_operand:SI 0 "general_operand" "d")
302: (const_int 1)
303: (minus:SI (const_int 31)
304: (match_operand:SI 1 "general_operand" "di"))))]
305: ""
306: "* { return output_btst (operands, operands[1], operands[0], insn, 31); }")
307:
308: ;; The following two patterns are like the previous two
309: ;; except that they use the fact that bit-number operands
310: ;; are automatically masked to 3 or 5 bits.
311:
312: (define_insn ""
313: [(set (cc0) (zero_extract (match_operand:QI 0 "general_operand" "do")
314: (const_int 1)
315: (minus:SI (const_int 7)
316: (and:SI
317: (match_operand:SI 1 "general_operand" "d")
318: (const_int 7)))))]
319: ""
320: "* { return output_btst (operands, operands[1], operands[0], insn, 7); }")
321:
322: (define_insn ""
323: [(set (cc0) (zero_extract (match_operand:SI 0 "general_operand" "d")
324: (const_int 1)
325: (minus:SI (const_int 31)
326: (and:SI
327: (match_operand:SI 1 "general_operand" "d")
328: (const_int 31)))))]
329: ""
330: "* { return output_btst (operands, operands[1], operands[0], insn, 31); }")
331:
332: (define_insn ""
333: ;; The constraint "o,d" here means that a nonoffsetable memref
334: ;; will match the first alternative, and its address will be reloaded.
335: ;; Copying the memory contents into a reg would be incorrect if the
336: ;; bit position is over 7.
337: [(set (cc0) (zero_extract (match_operand:QI 0 "general_operand" "o,d")
338: (const_int 1)
339: (match_operand:SI 1 "general_operand" "i,i")))]
340: "GET_CODE (operands[1]) == CONST_INT"
341: "*
342: { operands[1] = gen_rtx (CONST_INT, VOIDmode, 7 - INTVAL (operands[1]));
343: return output_btst (operands, operands[1], operands[0], insn, 7); }")
344:
345: (define_insn ""
346: [(set (cc0) (zero_extract (match_operand:HI 0 "general_operand" "o,d")
347: (const_int 1)
348: (match_operand:SI 1 "general_operand" "i,i")))]
349: "GET_CODE (operands[1]) == CONST_INT"
350: "*
351: {
352: if (GET_CODE (operands[0]) == MEM)
353: {
354: operands[0] = adj_offsetable_operand (operands[0],
355: INTVAL (operands[1]) / 8);
356: operands[1] = gen_rtx (CONST_INT, VOIDmode,
357: 7 - INTVAL (operands[1]) % 8);
358: return output_btst (operands, operands[1], operands[0], insn, 7);
359: }
360: operands[1] = gen_rtx (CONST_INT, VOIDmode,
361: 15 - INTVAL (operands[1]));
362: return output_btst (operands, operands[1], operands[0], insn, 15);
363: }")
364:
365: (define_insn ""
366: [(set (cc0) (zero_extract (match_operand:SI 0 "general_operand" "do")
367: (const_int 1)
368: (match_operand:SI 1 "general_operand" "i")))]
369: "GET_CODE (operands[1]) == CONST_INT"
370: "*
371: {
372: if (GET_CODE (operands[0]) == MEM)
373: {
374: operands[0] = adj_offsetable_operand (operands[0],
375: INTVAL (operands[1]) / 8);
376: operands[1] = gen_rtx (CONST_INT, VOIDmode,
377: 7 - INTVAL (operands[1]) % 8);
378: return output_btst (operands, operands[1], operands[0], insn, 7);
379: }
380: operands[1] = gen_rtx (CONST_INT, VOIDmode,
381: 31 - INTVAL (operands[1]));
382: return output_btst (operands, operands[1], operands[0], insn, 31);
383: }")
384:
385: (define_insn ""
386: [(set (cc0) (subreg:SI (lshiftrt:QI (match_operand:QI 0 "general_operand" "dm")
387: (const_int 7))
388: 0))]
389: ""
390: "*
391: {
392: cc_status.flags = CC_Z_IN_NOT_N | CC_NOT_NEGATIVE;
393: return \"tst%.b %0\";
394: }")
395:
396: (define_insn ""
397: [(set (cc0) (and:SI (sign_extend:SI (sign_extend:HI (match_operand:QI 0 "general_operand" "dm")))
398: (match_operand:SI 1 "general_operand" "i")))]
399: "(GET_CODE (operands[1]) == CONST_INT
400: && (unsigned) INTVAL (operands[1]) < 0x100
401: && exact_log2 (INTVAL (operands[1])) >= 0)"
402: "*
403: { register int log = exact_log2 (INTVAL (operands[1]));
404: operands[1] = gen_rtx (CONST_INT, VOIDmode, log);
405: return output_btst (operands, operands[1], operands[0], insn, 7);
406: }")
407:
408: ;; move instructions
409: (define_insn "swapsi"
410: [(set (match_operand:SI 0 "general_operand" "r")
411: (match_operand:SI 1 "general_operand" "r"))
412: (set (match_dup 1) (match_dup 0))]
413: ""
414: "exg %1,%0")
415:
416: ;; Special case of fullword move when source is zero.
417: ;; The reason this is special is to avoid loading a zero
418: ;; into a data reg with moveq in order to store it elsewhere.
419:
420: (define_insn ""
421: [(set (match_operand:SI 0 "general_operand" "=g")
422: (const_int 0))]
423: ""
424: "*
425: {
426: if (ADDRESS_REG_P (operands[0]))
427: return \"sub%.l %0,%0\";
428: return \"clr%.l %0\";
429: }")
430:
431: ;; Another special case in which it is not desirable
432: ;; to reload the constant into a data register.
433: (define_insn ""
434: [(set (match_operand:SI 0 "push_operand" "=m")
435: (match_operand:SI 1 "general_operand" "J"))]
436: "GET_CODE (operands[1]) == CONST_INT
437: && INTVAL (operands[1]) >= -0x8000
438: && INTVAL (operands[1]) < 0x8000"
439: "pea %a1")
440:
441: ;; General case of fullword move. The register constraints
442: ;; force integer constants in range for a moveq to be reloaded
443: ;; if they are headed for memory.
444: (define_insn "movsi"
445: [(set (match_operand:SI 0 "general_operand" "=g,da")
446: (match_operand:SI 1 "general_operand" "damKs,i"))]
447: ""
448: "*
449: {
450: if (GET_CODE (operands[1]) == CONST_INT)
451: {
452: if (operands[1] == const0_rtx
453: && (DATA_REG_P (operands[0])
454: || GET_CODE (operands[0]) == MEM))
455: return \"clr%.l %0\";
456: else if (DATA_REG_P (operands[0])
457: && INTVAL (operands[1]) < 128
458: && INTVAL (operands[1]) >= -128)
459: {
460: #ifdef MOTOROLA
461: return \"moveq%.l %1,%0\";
462: #else
463: return \"moveq %1,%0\";
464: #endif
465: }
466: else if (ADDRESS_REG_P (operands[0])
467: && INTVAL (operands[1]) < 0x8000
468: && INTVAL (operands[1]) >= -0x8000)
469: return \"move%.w %1,%0\";
470: else if (push_operand (operands[0], SImode)
471: && INTVAL (operands[1]) < 0x8000
472: && INTVAL (operands[1]) >= -0x8000)
473: return \"pea %a1\";
474: }
475: else if ((GET_CODE (operands[1]) == SYMBOL_REF
476: || GET_CODE (operands[1]) == CONST)
477: && push_operand (operands[0], SImode))
478: return \"pea %a1\";
479: else if ((GET_CODE (operands[1]) == SYMBOL_REF
480: || GET_CODE (operands[1]) == CONST)
481: && ADDRESS_REG_P (operands[0]))
482: return \"lea %a1,%0\";
483: return \"move%.l %1,%0\";
484: }")
485:
486: (define_insn "movhi"
487: [(set (match_operand:HI 0 "general_operand" "=g")
488: (match_operand:HI 1 "general_operand" "g"))]
489: ""
490: "*
491: {
492: if (GET_CODE (operands[1]) == CONST_INT)
493: {
494: if (operands[1] == const0_rtx
495: && (DATA_REG_P (operands[0])
496: || GET_CODE (operands[0]) == MEM))
497: return \"clr%.w %0\";
498: }
499: else if (CONSTANT_P (operands[1]))
500: return \"move%.l %1,%0\";
501: /* Recognize the insn before a tablejump, one that refers
502: to a table of offsets. Such an insn will need to refer
503: to a label on the insn. So output one. Use the label-number
504: of the table of offsets to generate this label. */
505: if (GET_CODE (operands[1]) == MEM
506: && GET_CODE (XEXP (operands[1], 0)) == PLUS
507: && (GET_CODE (XEXP (XEXP (operands[1], 0), 0)) == LABEL_REF
508: || GET_CODE (XEXP (XEXP (operands[1], 0), 1)) == LABEL_REF)
509: && GET_CODE (XEXP (XEXP (operands[1], 0), 0)) != PLUS
510: && GET_CODE (XEXP (XEXP (operands[1], 0), 1)) != PLUS)
511: {
512: rtx labelref;
513: if (GET_CODE (XEXP (XEXP (operands[1], 0), 0)) == LABEL_REF)
514: labelref = XEXP (XEXP (operands[1], 0), 0);
515: else
516: labelref = XEXP (XEXP (operands[1], 0), 1);
517: #if defined (MOTOROLA) && ! defined (SGS_3B1)
518: #ifdef SGS
519: fprintf (asm_out_file, \"\\tset %s%d,.+2\\n\", \"LI\",
520: CODE_LABEL_NUMBER (XEXP (labelref, 0)));
521: #else
522: fprintf (asm_out_file, \"\\t.set %s%d,.+2\\n\", \"LI\",
523: CODE_LABEL_NUMBER (XEXP (labelref, 0)));
524: #endif
525: #else
526: ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, \"LI\",
527: CODE_LABEL_NUMBER (XEXP (labelref, 0)));
528: #endif
529: }
530: return \"move%.w %1,%0\";
531: }")
532:
533: (define_insn "movstricthi"
534: [(set (strict_low_part (match_operand:HI 0 "general_operand" "+dm"))
535: (match_operand:HI 1 "general_operand" "rmn"))]
536: ""
537: "*
538: {
539: if (GET_CODE (operands[1]) == CONST_INT)
540: {
541: if (operands[1] == const0_rtx
542: && (DATA_REG_P (operands[0])
543: || GET_CODE (operands[0]) == MEM))
544: return \"clr%.w %0\";
545: }
546: return \"move%.w %1,%0\";
547: }")
548:
549: (define_insn "movqi"
550: [(set (match_operand:QI 0 "general_operand" "=d,a,m")
551: (match_operand:QI 1 "general_operand" "g,d,dmi"))]
552: ""
553: "*
554: {
555: if (operands[1] == const0_rtx)
556: return \"clr%.b %0\";
557: if (GET_CODE (operands[1]) == CONST_INT
558: && INTVAL (operands[1]) == -1)
559: return \"st %0\";
560: if (GET_CODE (operands[1]) != CONST_INT && CONSTANT_P (operands[1]))
561: return \"move%.l %1,%0\";
562: if (ADDRESS_REG_P (operands[0]) || ADDRESS_REG_P (operands[1]))
563: return \"move%.w %1,%0\";
564: return \"move%.b %1,%0\";
565: }")
566:
567: (define_insn "movstrictqi"
568: [(set (strict_low_part (match_operand:QI 0 "general_operand" "+dm"))
569: (match_operand:QI 1 "general_operand" "dmn"))]
570: ""
571: "*
572: {
573: if (operands[1] == const0_rtx)
574: return \"clr%.b %0\";
575: return \"move%.b %1,%0\";
576: }")
577:
578: (define_insn "movsf"
579: [(set (match_operand:SF 0 "general_operand" "=rmf")
580: (match_operand:SF 1 "general_operand" "rmfF"))]
581: ""
582: "*
583: {
584: if (FP_REG_P (operands[0]))
585: {
586: if (FP_REG_P (operands[1]))
587: return \"fmove%.x %1,%0\";
588: else if (ADDRESS_REG_P (operands[1]))
589: return \"move%.l %1,%-\;fmove%.s %+,%0\";
590: else if (GET_CODE (operands[1]) == CONST_DOUBLE)
591: return output_move_const_single (operands);
592: return \"fmove%.s %f1,%0\";
593: }
594: if (FP_REG_P (operands[1]))
595: {
596: if (ADDRESS_REG_P (operands[0]))
597: return \"fmove%.s %1,%-\;move%.l %+,%0\";
598: return \"fmove%.s %f1,%0\";
599: }
600: return \"move%.l %1,%0\";
601: }")
602:
603: (define_insn "movdf"
604: [(set (match_operand:DF 0 "general_operand" "=rm,&rf,&rof<>")
605: (match_operand:DF 1 "general_operand" "rf,m,rofF<>"))]
606: ""
607: "*
608: {
609: if (FP_REG_P (operands[0]))
610: {
611: if (FP_REG_P (operands[1]))
612: return \"fmove%.x %1,%0\";
613: if (REG_P (operands[1]))
614: {
615: rtx xoperands[2];
616: xoperands[1] = gen_rtx (REG, SImode, REGNO (operands[1]) + 1);
617: output_asm_insn (\"move%.l %1,%-\", xoperands);
618: output_asm_insn (\"move%.l %1,%-\", operands);
619: return \"fmove%.d %+,%0\";
620: }
621: if (GET_CODE (operands[1]) == CONST_DOUBLE)
622: return output_move_const_double (operands);
623: return \"fmove%.d %f1,%0\";
624: }
625: else if (FP_REG_P (operands[1]))
626: {
627: if (REG_P (operands[0]))
628: {
629: output_asm_insn (\"fmove%.d %f1,%-\;move%.l %+,%0\", operands);
630: operands[0] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1);
631: return \"move%.l %+,%0\";
632: }
633: else
634: return \"fmove%.d %f1,%0\";
635: }
636: return output_move_double (operands);
637: }
638: ")
639:
640: ;; movdi can apply to fp regs in some cases
641: (define_insn "movdi"
642: [(set (match_operand:DI 0 "general_operand" "=rm,&rf,&ro<>,!&rm,!&f")
643: (match_operand:DI 1 "general_operand" "r,m,roi<>,fF,rfF"))]
644: ""
645: "*
646: {
647: if (FP_REG_P (operands[0]))
648: {
649: if (FP_REG_P (operands[1]))
650: return \"fmove%.x %1,%0\";
651: if (REG_P (operands[1]))
652: {
653: rtx xoperands[2];
654: xoperands[1] = gen_rtx (REG, SImode, REGNO (operands[1]) + 1);
655: output_asm_insn (\"move%.l %1,%-\", xoperands);
656: output_asm_insn (\"move%.l %1,%-\", operands);
657: return \"fmove%.d %+,%0\";
658: }
659: if (GET_CODE (operands[1]) == CONST_DOUBLE)
660: return output_move_const_double (operands);
661: return \"fmove%.d %f1,%0\";
662: }
663: else if (FP_REG_P (operands[1]))
664: {
665: if (REG_P (operands[0]))
666: {
667: output_asm_insn (\"fmove.d %f1,%-\;move%.l %+,%0\", operands);
668: operands[0] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1);
669: return \"move%.l %+,%0\";
670: }
671: else
672: return \"fmove%.d %f1,%0\";
673: }
674: return output_move_double (operands);
675: }
676: ")
677:
678: ;; These go after the move instructions
679: ;; because the move instructions are better (require no spilling)
680: ;; when they can apply. But these go before the add and subtract insns
681: ;; because it is often shorter to use these when both apply.
682: (define_insn "pushasi"
683: [(set (match_operand:SI 0 "push_operand" "=m")
684: (match_operand:SI 1 "address_operand" "p"))]
685: ""
686: "pea %a1")
687:
688:
689: (define_insn ""
690: [(set (match_operand:SI 0 "general_operand" "=a")
691: (match_operand:QI 1 "address_operand" "p"))]
692: ""
693: "lea %a1,%0")
694:
695: ;; truncation instructions
696: (define_insn "truncsiqi2"
697: [(set (match_operand:QI 0 "general_operand" "=dm,d")
698: (truncate:QI
699: (match_operand:SI 1 "general_operand" "doJ,i")))]
700: ""
701: "*
702: {
703: if (GET_CODE (operands[0]) == REG)
704: return \"move%.l %1,%0\";
705: if (GET_CODE (operands[1]) == MEM)
706: operands[1] = adj_offsetable_operand (operands[1], 3);
707: return \"move%.b %1,%0\";
708: }")
709:
710: (define_insn "trunchiqi2"
711: [(set (match_operand:QI 0 "general_operand" "=dm,d")
712: (truncate:QI
713: (match_operand:HI 1 "general_operand" "doJ,i")))]
714: ""
715: "*
716: {
717: if (GET_CODE (operands[0]) == REG)
718: return \"move%.l %1,%0\";
719: if (GET_CODE (operands[1]) == MEM)
720: operands[1] = adj_offsetable_operand (operands[1], 1);
721: return \"move%.b %1,%0\";
722: }")
723:
724: (define_insn "truncsihi2"
725: [(set (match_operand:HI 0 "general_operand" "=dm,d")
726: (truncate:HI
727: (match_operand:SI 1 "general_operand" "roJ,i")))]
728: ""
729: "*
730: {
731: if (GET_CODE (operands[0]) == REG)
732: return \"move%.l %1,%0\";
733: if (GET_CODE (operands[1]) == MEM)
734: operands[1] = adj_offsetable_operand (operands[1], 2);
735: return \"move%.w %1,%0\";
736: }")
737:
738: ;; zero extension instructions
739:
740: (define_expand "zero_extendhisi2"
741: [(set (match_operand:SI 0 "general_operand" "")
742: (const_int 0))
743: (set (strict_low_part (subreg:HI (match_operand:SI 0 "general_operand" "") 0))
744: (match_operand:HI 1 "general_operand" ""))]
745: ""
746: "operands[1] = make_safe_from (operands[1], operands[0]);")
747:
748: ;; Note that the one starting from HImode comes before those for QImode
749: ;; so that a constant operand will match HImode, not QImode.
750: ;(define_insn "zero_extendhisi2"
751: ; [(set (match_operand:SI 0 "general_operand" "=do<>")
752: ; (zero_extend:SI
753: ; (match_operand:HI 1 "general_operand" "rmn")))]
754: ; ""
755: ; "*
756: ;{
757: ; if (DATA_REG_P (operands[0]))
758: ; {
759: ; if (GET_CODE (operands[1]) == REG
760: ; && REGNO (operands[0]) == REGNO (operands[1]))
761: ; return \"and%.l %#0xFFFF,%0\";
762: ; if (reg_mentioned_p (operands[0], operands[1]))
763: ; return \"move%.w %1,%0\;and%.l %#0xFFFF,%0\";
764: ; return \"clr%.l %0\;move%.w %1,%0\";
765: ; }
766: ; else if (GET_CODE (operands[0]) == MEM
767: ; && GET_CODE (XEXP (operands[0], 0)) == PRE_DEC)
768: ; return \"move%.w %1,%0\;clr%.w %0\";
769: ; else if (GET_CODE (operands[0]) == MEM
770: ; && GET_CODE (XEXP (operands[0], 0)) == POST_INC)
771: ; return \"clr%.w %0\;move%.w %1,%0\";
772: ; else
773: ; {
774: ; output_asm_insn (\"clr%.w %0\", operands);
775: ; operands[0] = adj_offsetable_operand (operands[0], 2);
776: ; return \"move%.w %1,%0\";
777: ; }
778: ;}")
779:
780: (define_expand "zero_extendqihi2"
781: [(set (match_operand:HI 0 "general_operand" "")
782: (const_int 0))
783: (set (strict_low_part (subreg:QI (match_operand:HI 0 "general_operand" "") 0))
784: (match_operand:QI 1 "general_operand" ""))]
785: ""
786: "operands[1] = make_safe_from (operands[1], operands[0]);")
787:
788: ;(define_insn "zero_extendqihi2"
789: ; [(set (match_operand:HI 0 "general_operand" "=do<>")
790: ; (zero_extend:HI
791: ; (match_operand:QI 1 "general_operand" "dmn")))]
792: ; ""
793: ; "*
794: ;{
795: ; if (DATA_REG_P (operands[0]))
796: ; {
797: ; if (GET_CODE (operands[1]) == REG
798: ; && REGNO (operands[0]) == REGNO (operands[1]))
799: ; return \"and%.w %#0xFF,%0\";
800: ; if (reg_mentioned_p (operands[0], operands[1]))
801: ; return \"move%.b %1,%0\;and%.w %#0xFF,%0\";
802: ; return \"clr%.w %0\;move%.b %1,%0\";
803: ; }
804: ; else if (GET_CODE (operands[0]) == MEM
805: ; && GET_CODE (XEXP (operands[0], 0)) == PRE_DEC)
806: ; {
807: ; if (REGNO (XEXP (XEXP (operands[0], 0), 0))
808: ; == STACK_POINTER_REGNUM)
809: ; return \"clr%.w %-\;move%.b %1,%0\";
810: ; else
811: ; return \"move%.b %1,%0\;clr%.b %0\";
812: ; }
813: ; else if (GET_CODE (operands[0]) == MEM
814: ; && GET_CODE (XEXP (operands[0], 0)) == POST_INC)
815: ; return \"clr%.b %0\;move%.b %1,%0\";
816: ; else
817: ; {
818: ; output_asm_insn (\"clr%.b %0\", operands);
819: ; operands[0] = adj_offsetable_operand (operands[0], 1);
820: ; return \"move%.b %1,%0\";
821: ; }
822: ;}")
823:
824: (define_expand "zero_extendqisi2"
825: [(set (match_operand:SI 0 "general_operand" "")
826: (const_int 0))
827: (set (strict_low_part (subreg:QI (match_operand:SI 0 "general_operand" "") 0))
828: (match_operand:QI 1 "general_operand" ""))]
829: ""
830: " operands[1] = make_safe_from (operands[1], operands[0]); ")
831:
832: ;(define_insn "zero_extendqisi2"
833: ; [(set (match_operand:SI 0 "general_operand" "=do<>")
834: ; (zero_extend:SI
835: ; (match_operand:QI 1 "general_operand" "dmn")))]
836: ; ""
837: ; "*
838: ;{
839: ; if (DATA_REG_P (operands[0]))
840: ; {
841: ; if (GET_CODE (operands[1]) == REG
842: ; && REGNO (operands[0]) == REGNO (operands[1]))
843: ; return \"and%.l %#0xFF,%0\";
844: ; if (reg_mentioned_p (operands[0], operands[1]))
845: ; return \"move%.b %1,%0\;and%.l %#0xFF,%0\";
846: ; return \"clr%.l %0\;move%.b %1,%0\";
847: ; }
848: ; else if (GET_CODE (operands[0]) == MEM
849: ; && GET_CODE (XEXP (operands[0], 0)) == PRE_DEC)
850: ; {
851: ; operands[0] = XEXP (XEXP (operands[0], 0), 0);
852: ;#ifdef MOTOROLA
853: ; return \"clr.l -(%0)\;move%.b %1,(3,%0)\";
854: ;#else
855: ; return \"clrl %0@-\;moveb %1,%0@(3)\";
856: ;#endif
857: ; }
858: ; else if (GET_CODE (operands[0]) == MEM
859: ; && GET_CODE (XEXP (operands[0], 0)) == POST_INC)
860: ; {
861: ; operands[0] = XEXP (XEXP (operands[0], 0), 0);
862: ;#ifdef MOTOROLA
863: ; return \"clr.l (%0)+\;move%.b %1,(-1,%0)\";
864: ;#else
865: ; return \"clrl %0@+\;moveb %1,%0@(-1)\";
866: ;#endif
867: ; }
868: ; else
869: ; {
870: ; output_asm_insn (\"clr%.l %0\", operands);
871: ; operands[0] = adj_offsetable_operand (operands[0], 3);
872: ; return \"move%.b %1,%0\";
873: ; }
874: ;}")
875:
876: ;; sign extension instructions
877: ;; Note that the one starting from HImode comes before those for QImode
878: ;; so that a constant operand will match HImode, not QImode.
879:
880: (define_insn "extendhisi2"
881: [(set (match_operand:SI 0 "general_operand" "=*d,a")
882: (sign_extend:SI
883: (match_operand:HI 1 "general_operand" "0,rmn")))]
884: ""
885: "*
886: {
887: if (ADDRESS_REG_P (operands[0]))
888: return \"move%.w %1,%0\";
889: return \"ext%.l %0\";
890: }")
891:
892: (define_insn "extendqihi2"
893: [(set (match_operand:HI 0 "general_operand" "=d")
894: (sign_extend:HI
895: (match_operand:QI 1 "general_operand" "0")))]
896: ""
897: "ext%.w %0")
898:
899: (define_insn "extendqisi2"
900: [(set (match_operand:SI 0 "general_operand" "=d")
901: (sign_extend:SI
902: (match_operand:QI 1 "general_operand" "0")))]
903: "TARGET_68020"
904: "extb%.l %0")
905:
906: ;; Conversions between float and double.
907:
908: (define_insn "extendsfdf2"
909: [(set (match_operand:DF 0 "general_operand" "=*fdm,f")
910: (float_extend:DF
911: (match_operand:SF 1 "general_operand" "f,dmF")))]
912: "TARGET_68881"
913: "*
914: {
915: if (FP_REG_P (operands[0]) && FP_REG_P (operands[1]))
916: {
917: if (REGNO (operands[0]) == REGNO (operands[1]))
918: {
919: /* Extending float to double in an fp-reg is a no-op.
920: NOTICE_UPDATE_CC has already assumed that the
921: cc will be set. So cancel what it did. */
922: cc_status = cc_prev_status;
923: return \"\";
924: }
925: return \"fmove%.x %1,%0\";
926: }
927: if (FP_REG_P (operands[0]))
928: return \"fmove%.s %f1,%0\";
929: if (DATA_REG_P (operands[0]) && FP_REG_P (operands[1]))
930: {
931: output_asm_insn (\"fmove%.d %f1,%-\;move%.l %+,%0\", operands);
932: operands[0] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1);
933: return \"move%.l %+,%0\";
934: }
935: return \"fmove%.d %f1,%0\";
936: }")
937:
938: ;; This cannot output into an f-reg because there is no way to be
939: ;; sure of truncating in that case.
940: (define_insn "truncdfsf2"
941: [(set (match_operand:SF 0 "general_operand" "=dm")
942: (float_truncate:SF
943: (match_operand:DF 1 "general_operand" "f")))]
944: "TARGET_68881"
945: "fmove%.s %f1,%0")
946:
947: ;; Conversion between fixed point and floating point.
948: ;; Note that among the fix-to-float insns
949: ;; the ones that start with SImode come first.
950: ;; That is so that an operand that is a CONST_INT
951: ;; (and therefore lacks a specific machine mode).
952: ;; will be recognized as SImode (which is always valid)
953: ;; rather than as QImode or HImode.
954:
955: (define_insn "floatsisf2"
956: [(set (match_operand:SF 0 "general_operand" "=f")
957: (float:SF (match_operand:SI 1 "general_operand" "dmi")))]
958: "TARGET_68881"
959: "fmove%.l %1,%0")
960:
961: (define_insn "floatsidf2"
962: [(set (match_operand:DF 0 "general_operand" "=f")
963: (float:DF (match_operand:SI 1 "general_operand" "dmi")))]
964: "TARGET_68881"
965: "fmove%.l %1,%0")
966:
967: (define_insn "floathisf2"
968: [(set (match_operand:SF 0 "general_operand" "=f")
969: (float:SF (match_operand:HI 1 "general_operand" "dmn")))]
970: "TARGET_68881"
971: "fmove%.w %1,%0")
972:
973: (define_insn "floathidf2"
974: [(set (match_operand:DF 0 "general_operand" "=f")
975: (float:DF (match_operand:HI 1 "general_operand" "dmn")))]
976: "TARGET_68881"
977: "fmove%.w %1,%0")
978:
979: (define_insn "floatqisf2"
980: [(set (match_operand:SF 0 "general_operand" "=f")
981: (float:SF (match_operand:QI 1 "general_operand" "dmn")))]
982: "TARGET_68881"
983: "fmove%.b %1,%0")
984:
985: (define_insn "floatqidf2"
986: [(set (match_operand:DF 0 "general_operand" "=f")
987: (float:DF (match_operand:QI 1 "general_operand" "dmn")))]
988: "TARGET_68881"
989: "fmove%.b %1,%0")
990:
991: ;; Convert a float to a float whose value is an integer.
992: ;; This is the first stage of converting it to an integer type.
993:
994: (define_insn "ftruncdf2"
995: [(set (match_operand:DF 0 "general_operand" "=f")
996: (fix:DF (match_operand:DF 1 "general_operand" "fFm")))]
997: "TARGET_68881"
998: "*
999: {
1000: if (FP_REG_P (operands[1]))
1001: return \"fintrz%.x %f1,%0\";
1002: return \"fintrz%.d %f1,%0\";
1003: }")
1004:
1005: (define_insn "ftruncsf2"
1006: [(set (match_operand:SF 0 "general_operand" "=f")
1007: (fix:SF (match_operand:SF 1 "general_operand" "dfFm")))]
1008: "TARGET_68881"
1009: "*
1010: {
1011: if (FP_REG_P (operands[1]))
1012: return \"fintrz%.x %f1,%0\";
1013: return \"fintrz%.s %f1,%0\";
1014: }")
1015:
1016: ;; Convert a float whose value is an integer
1017: ;; to an actual integer. Second stage of converting float to integer type.
1018: (define_insn "fixsfqi2"
1019: [(set (match_operand:QI 0 "general_operand" "=dm")
1020: (fix:QI (match_operand:SF 1 "general_operand" "f")))]
1021: "TARGET_68881"
1022: "fmove%.b %1,%0")
1023:
1024: (define_insn "fixsfhi2"
1025: [(set (match_operand:HI 0 "general_operand" "=dm")
1026: (fix:HI (match_operand:SF 1 "general_operand" "f")))]
1027: "TARGET_68881"
1028: "fmove%.w %1,%0")
1029:
1030: (define_insn "fixsfsi2"
1031: [(set (match_operand:SI 0 "general_operand" "=dm")
1032: (fix:SI (match_operand:SF 1 "general_operand" "f")))]
1033: "TARGET_68881"
1034: "fmove%.l %1,%0")
1035:
1036: (define_insn "fixdfqi2"
1037: [(set (match_operand:QI 0 "general_operand" "=dm")
1038: (fix:QI (match_operand:DF 1 "general_operand" "f")))]
1039: "TARGET_68881"
1040: "fmove%.b %1,%0")
1041:
1042: (define_insn "fixdfhi2"
1043: [(set (match_operand:HI 0 "general_operand" "=dm")
1044: (fix:HI (match_operand:DF 1 "general_operand" "f")))]
1045: "TARGET_68881"
1046: "fmove%.w %1,%0")
1047:
1048: (define_insn "fixdfsi2"
1049: [(set (match_operand:SI 0 "general_operand" "=dm")
1050: (fix:SI (match_operand:DF 1 "general_operand" "f")))]
1051: "TARGET_68881"
1052: "fmove%.l %1,%0")
1053:
1054: ;; add instructions
1055:
1056: (define_insn "addsi3"
1057: [(set (match_operand:SI 0 "general_operand" "=m,r,!a")
1058: (plus:SI (match_operand:SI 1 "general_operand" "%0,0,a")
1059: (match_operand:SI 2 "general_operand" "dIKLs,mrIKLs,rJK")))]
1060: ""
1061: "*
1062: {
1063: if (! operands_match_p (operands[0], operands[1]))
1064: {
1065: /* These insns can result from reloads to access
1066: stack slots over 64k from the frame pointer. */
1067: if (GET_CODE (operands[2]) == CONST_INT
1068: && INTVAL (operands[2]) + 0x8000 >= (unsigned) 0x10000)
1069: return \"move%.l %2,%0\;add%.l %1,%0\";
1070: #ifdef SGS
1071: if (GET_CODE (operands[2]) == REG)
1072: return \"lea (%1,%2.l),%0\";
1073: else
1074: return \"lea %c2(%1),%0\";
1075: #else /* not SGS */
1076: #ifdef MOTOROLA
1077: if (GET_CODE (operands[2]) == REG)
1078: return \"lea (%1,%2.l),%0\";
1079: else
1080: return \"lea (%c2,%1),%0\";
1081: #else /* not MOTOROLA (MIT syntax) */
1082: if (GET_CODE (operands[2]) == REG)
1083: return \"lea %1@(0,%2:l),%0\";
1084: else
1085: return \"lea %1@(%c2),%0\";
1086: #endif /* not MOTOROLA */
1087: #endif /* not SGS */
1088: }
1089: if (GET_CODE (operands[2]) == CONST_INT)
1090: {
1091: if (INTVAL (operands[2]) > 0
1092: && INTVAL (operands[2]) <= 8)
1093: return \"addq%.l %2,%0\";
1094: if (INTVAL (operands[2]) < 0
1095: && INTVAL (operands[2]) >= -8)
1096: {
1097: operands[2] = gen_rtx (CONST_INT, VOIDmode,
1098: - INTVAL (operands[2]));
1099: return \"subq%.l %2,%0\";
1100: }
1101: if (ADDRESS_REG_P (operands[0])
1102: && INTVAL (operands[2]) >= -0x8000
1103: && INTVAL (operands[2]) < 0x8000)
1104: return \"add%.w %2,%0\";
1105: }
1106: return \"add%.l %2,%0\";
1107: }")
1108:
1109: (define_insn ""
1110: [(set (match_operand:SI 0 "general_operand" "=a")
1111: (plus:SI (match_operand:SI 1 "general_operand" "0")
1112: (sign_extend:SI (match_operand:HI 2 "general_operand" "rmn"))))]
1113: ""
1114: "add%.w %2,%0")
1115:
1116: (define_insn "addhi3"
1117: [(set (match_operand:HI 0 "general_operand" "=m,r")
1118: (plus:HI (match_operand:HI 1 "general_operand" "%0,0")
1119: (match_operand:HI 2 "general_operand" "dn,rmn")))]
1120: ""
1121: "*
1122: {
1123: if (GET_CODE (operands[2]) == CONST_INT)
1124: {
1125: if (INTVAL (operands[2]) > 0
1126: && INTVAL (operands[2]) <= 8)
1127: return \"addq%.w %2,%0\";
1128: }
1129: if (GET_CODE (operands[2]) == CONST_INT)
1130: {
1131: if (INTVAL (operands[2]) < 0
1132: && INTVAL (operands[2]) >= -8)
1133: {
1134: operands[2] = gen_rtx (CONST_INT, VOIDmode,
1135: - INTVAL (operands[2]));
1136: return \"subq%.w %2,%0\";
1137: }
1138: }
1139: return \"add%.w %2,%0\";
1140: }")
1141:
1142: (define_insn ""
1143: [(set (strict_low_part (match_operand:HI 0 "general_operand" "+m,d"))
1144: (plus:HI (match_dup 0)
1145: (match_operand:HI 1 "general_operand" "dn,rmn")))]
1146: ""
1147: "add%.w %1,%0")
1148:
1149: (define_insn "addqi3"
1150: [(set (match_operand:QI 0 "general_operand" "=m,d")
1151: (plus:QI (match_operand:QI 1 "general_operand" "%0,0")
1152: (match_operand:QI 2 "general_operand" "dn,dmn")))]
1153: ""
1154: "*
1155: {
1156: if (GET_CODE (operands[2]) == CONST_INT)
1157: {
1158: if (INTVAL (operands[2]) > 0
1159: && INTVAL (operands[2]) <= 8)
1160: return \"addq%.b %2,%0\";
1161: }
1162: if (GET_CODE (operands[2]) == CONST_INT)
1163: {
1164: if (INTVAL (operands[2]) < 0 && INTVAL (operands[2]) >= -8)
1165: {
1166: operands[2] = gen_rtx (CONST_INT, VOIDmode, - INTVAL (operands[2]));
1167: return \"subq%.b %2,%0\";
1168: }
1169: }
1170: return \"add%.b %2,%0\";
1171: }")
1172:
1173: (define_insn ""
1174: [(set (strict_low_part (match_operand:QI 0 "general_operand" "+m,d"))
1175: (plus:QI (match_dup 0)
1176: (match_operand:QI 1 "general_operand" "dn,dmn")))]
1177: ""
1178: "add%.b %1,%0")
1179:
1180: (define_insn "adddf3"
1181: [(set (match_operand:DF 0 "general_operand" "=f")
1182: (plus:DF (match_operand:DF 1 "general_operand" "%0")
1183: (match_operand:DF 2 "general_operand" "fmG")))]
1184: "TARGET_68881"
1185: "*
1186: {
1187: if (REG_P (operands[2]))
1188: return \"fadd%.x %2,%0\";
1189: return \"fadd%.d %f2,%0\";
1190: }")
1191:
1192: (define_insn "addsf3"
1193: [(set (match_operand:SF 0 "general_operand" "=f")
1194: (plus:SF (match_operand:SF 1 "general_operand" "%0")
1195: (match_operand:SF 2 "general_operand" "fdmF")))]
1196: "TARGET_68881"
1197: "*
1198: {
1199: if (REG_P (operands[2]) && ! DATA_REG_P (operands[2]))
1200: return \"fadd%.x %2,%0\";
1201: return \"fadd%.s %f2,%0\";
1202: }")
1203:
1204: ;; subtract instructions
1205:
1206: (define_insn "subsi3"
1207: [(set (match_operand:SI 0 "general_operand" "=m,r,!a,?d")
1208: (minus:SI (match_operand:SI 1 "general_operand" "0,0,a,mrIKs")
1209: (match_operand:SI 2 "general_operand" "dIKs,mrIKs,J,0")))]
1210: ""
1211: "*
1212: {
1213: if (! operands_match_p (operands[0], operands[1]))
1214: {
1215: if (operands_match_p (operands[0], operands[2]))
1216: {
1217: if (GET_CODE (operands[1]) == CONST_INT)
1218: {
1219: if (INTVAL (operands[1]) > 0
1220: && INTVAL (operands[1]) <= 8)
1221: return \"subq%.l %1,%0\;neg%.l %0\";
1222: }
1223: return \"sub%.l %1,%0\;neg%.l %0\";
1224: }
1225: /* This case is matched by J, but negating -0x8000
1226: in an lea would give an invalid displacement.
1227: So do this specially. */
1228: if (INTVAL (operands[2]) == -0x8000)
1229: return \"move%.l %1,%0\;sub%.l %2,%0\";
1230: #ifdef SGS
1231: return \"lea %n2(%1),%0\";
1232: #else
1233: #ifdef MOTOROLA
1234: return \"lea (%n2,%1),%0\";
1235: #else /* not MOTOROLA (MIT syntax) */
1236: return \"lea %1@(%n2),%0\";
1237: #endif /* not MOTOROLA */
1238: #endif /* not SGS */
1239: }
1240: if (GET_CODE (operands[2]) == CONST_INT)
1241: {
1242: if (INTVAL (operands[2]) > 0
1243: && INTVAL (operands[2]) <= 8)
1244: return \"subq%.l %2,%0\";
1245: if (ADDRESS_REG_P (operands[0])
1246: && INTVAL (operands[2]) >= -0x8000
1247: && INTVAL (operands[2]) < 0x8000)
1248: return \"sub%.w %2,%0\";
1249: }
1250: return \"sub%.l %2,%0\";
1251: }")
1252:
1253: (define_insn ""
1254: [(set (match_operand:SI 0 "general_operand" "=a")
1255: (minus:SI (match_operand:SI 1 "general_operand" "0")
1256: (sign_extend:SI (match_operand:HI 2 "general_operand" "rmn"))))]
1257: ""
1258: "sub%.w %2,%0")
1259:
1260: (define_insn "subhi3"
1261: [(set (match_operand:HI 0 "general_operand" "=m,r")
1262: (minus:HI (match_operand:HI 1 "general_operand" "0,0")
1263: (match_operand:HI 2 "general_operand" "dn,rmn")))]
1264: ""
1265: "sub%.w %2,%0")
1266:
1267: (define_insn ""
1268: [(set (strict_low_part (match_operand:HI 0 "general_operand" "+m,d"))
1269: (minus:HI (match_dup 0)
1270: (match_operand:HI 1 "general_operand" "dn,rmn")))]
1271: ""
1272: "sub%.w %1,%0")
1273:
1274: (define_insn "subqi3"
1275: [(set (match_operand:QI 0 "general_operand" "=m,d")
1276: (minus:QI (match_operand:QI 1 "general_operand" "0,0")
1277: (match_operand:QI 2 "general_operand" "dn,dmn")))]
1278: ""
1279: "sub%.b %2,%0")
1280:
1281: (define_insn ""
1282: [(set (strict_low_part (match_operand:QI 0 "general_operand" "+m,d"))
1283: (minus:QI (match_dup 0)
1284: (match_operand:QI 1 "general_operand" "dn,dmn")))]
1285: ""
1286: "sub%.b %1,%0")
1287:
1288: (define_insn "subdf3"
1289: [(set (match_operand:DF 0 "general_operand" "=f")
1290: (minus:DF (match_operand:DF 1 "general_operand" "0")
1291: (match_operand:DF 2 "general_operand" "fmG")))]
1292: "TARGET_68881"
1293: "*
1294: {
1295: if (REG_P (operands[2]))
1296: return \"fsub%.x %2,%0\";
1297: return \"fsub%.d %f2,%0\";
1298: }")
1299:
1300: (define_insn "subsf3"
1301: [(set (match_operand:SF 0 "general_operand" "=f")
1302: (minus:SF (match_operand:SF 1 "general_operand" "0")
1303: (match_operand:SF 2 "general_operand" "fdmF")))]
1304: "TARGET_68881"
1305: "*
1306: {
1307: if (REG_P (operands[2]) && ! DATA_REG_P (operands[2]))
1308: return \"fsub%.x %2,%0\";
1309: return \"fsub%.s %f2,%0\";
1310: }")
1311:
1312: ;; multiply instructions
1313:
1314: (define_insn "mulhi3"
1315: [(set (match_operand:HI 0 "general_operand" "=d")
1316: (mult:HI (match_operand:HI 1 "general_operand" "%0")
1317: (match_operand:HI 2 "general_operand" "dmn")))]
1318: ""
1319: "*
1320: {
1321: #ifdef MOTOROLA
1322: return \"muls.w %2,%0\";
1323: #else
1324: return \"muls %2,%0\";
1325: #endif
1326: }")
1327:
1328: (define_insn "mulhisi3"
1329: [(set (match_operand:SI 0 "general_operand" "=d")
1330: (mult:SI (match_operand:HI 1 "general_operand" "%0")
1331: (match_operand:HI 2 "general_operand" "dmn")))]
1332: ""
1333: "*
1334: {
1335: #ifdef MOTOROLA
1336: return \"muls.w %2,%0\";
1337: #else
1338: return \"muls %2,%0\";
1339: #endif
1340: }")
1341:
1342: (define_insn "mulsi3"
1343: [(set (match_operand:SI 0 "general_operand" "=d")
1344: (mult:SI (match_operand:SI 1 "general_operand" "%0")
1345: (match_operand:SI 2 "general_operand" "dmsK")))]
1346: "TARGET_68020"
1347: "muls%.l %2,%0")
1348:
1349: (define_insn "umulhi3"
1350: [(set (match_operand:HI 0 "general_operand" "=d")
1351: (umult:HI (match_operand:HI 1 "general_operand" "%0")
1352: (match_operand:HI 2 "general_operand" "dmn")))]
1353: ""
1354: "*
1355: {
1356: #ifdef MOTOROLA
1357: return \"mulu.w %2,%0\";
1358: #else
1359: return \"mulu %2,%0\";
1360: #endif
1361: }")
1362:
1363: (define_insn "umulhisi3"
1364: [(set (match_operand:SI 0 "general_operand" "=d")
1365: (umult:SI (match_operand:HI 1 "general_operand" "%0")
1366: (match_operand:HI 2 "general_operand" "dmn")))]
1367: ""
1368: "*
1369: {
1370: #ifdef MOTOROLA
1371: return \"mulu.w %2,%0\";
1372: #else
1373: return \"mulu %2,%0\";
1374: #endif
1375: }")
1376:
1377: (define_insn "umulsi3"
1378: [(set (match_operand:SI 0 "general_operand" "=d")
1379: (umult:SI (match_operand:SI 1 "general_operand" "%0")
1380: (match_operand:SI 2 "general_operand" "dmsK")))]
1381: "TARGET_68020"
1382: "mulu%.l %2,%0")
1383:
1384: (define_insn "muldf3"
1385: [(set (match_operand:DF 0 "general_operand" "=f")
1386: (mult:DF (match_operand:DF 1 "general_operand" "%0")
1387: (match_operand:DF 2 "general_operand" "fmG")))]
1388: "TARGET_68881"
1389: "*
1390: {
1391: if (REG_P (operands[2]))
1392: return \"fmul%.x %2,%0\";
1393: return \"fmul%.d %f2,%0\";
1394: }")
1395:
1396: (define_insn "mulsf3"
1397: [(set (match_operand:SF 0 "general_operand" "=f")
1398: (mult:SF (match_operand:SF 1 "general_operand" "%0")
1399: (match_operand:SF 2 "general_operand" "fdmF")))]
1400: "TARGET_68881"
1401: "*
1402: {
1403: if (REG_P (operands[2]) && ! DATA_REG_P (operands[2]))
1404: return \"fsglmul%.x %2,%0\";
1405: return \"fsglmul%.s %f2,%0\";
1406: }")
1407:
1408: ;; divide instructions
1409:
1410: (define_insn "divhi3"
1411: [(set (match_operand:HI 0 "general_operand" "=d")
1412: (div:HI (match_operand:HI 1 "general_operand" "0")
1413: (match_operand:HI 2 "general_operand" "dmn")))]
1414: ""
1415: "*
1416: {
1417: #ifdef MOTOROLA
1418: return \"ext.l %0\;divs.w %2,%0\";
1419: #else
1420: return \"extl %0\;divs %2,%0\";
1421: #endif
1422: }")
1423:
1424: (define_insn "divhisi3"
1425: [(set (match_operand:HI 0 "general_operand" "=d")
1426: (div:HI (match_operand:SI 1 "general_operand" "0")
1427: (match_operand:HI 2 "general_operand" "dmn")))]
1428: ""
1429: "*
1430: {
1431: #ifdef MOTOROLA
1432: return \"divs.w %2,%0\";
1433: #else
1434: return \"divs %2,%0\";
1435: #endif
1436: }")
1437:
1438: (define_insn "divsi3"
1439: [(set (match_operand:SI 0 "general_operand" "=d")
1440: (div:SI (match_operand:SI 1 "general_operand" "0")
1441: (match_operand:SI 2 "general_operand" "dmsK")))]
1442: "TARGET_68020"
1443: "divs%.l %2,%0")
1444:
1445: (define_insn "udivhi3"
1446: [(set (match_operand:HI 0 "general_operand" "=d")
1447: (udiv:HI (match_operand:HI 1 "general_operand" "0")
1448: (match_operand:HI 2 "general_operand" "dmn")))]
1449: ""
1450: "*
1451: {
1452: #ifdef MOTOROLA
1453: return \"and.l %#0xFFFF,%0\;divu.w %2,%0\";
1454: #else
1455: return \"andl %#0xFFFF,%0\;divu %2,%0\";
1456: #endif
1457: }")
1458:
1459: (define_insn "udivhisi3"
1460: [(set (match_operand:HI 0 "general_operand" "=d")
1461: (udiv:HI (match_operand:SI 1 "general_operand" "0")
1462: (match_operand:HI 2 "general_operand" "dmn")))]
1463: ""
1464: "*
1465: {
1466: #ifdef MOTOROLA
1467: return \"divu.w %2,%0\";
1468: #else
1469: return \"divu %2,%0\";
1470: #endif
1471: }")
1472:
1473: (define_insn "udivsi3"
1474: [(set (match_operand:SI 0 "general_operand" "=d")
1475: (udiv:SI (match_operand:SI 1 "general_operand" "0")
1476: (match_operand:SI 2 "general_operand" "dmsK")))]
1477: "TARGET_68020"
1478: "divu%.l %2,%0")
1479:
1480: (define_insn "divdf3"
1481: [(set (match_operand:DF 0 "general_operand" "=f")
1482: (div:DF (match_operand:DF 1 "general_operand" "0")
1483: (match_operand:DF 2 "general_operand" "fmG")))]
1484: "TARGET_68881"
1485: "*
1486: {
1487: if (REG_P (operands[2]))
1488: return \"fdiv%.x %2,%0\";
1489: return \"fdiv%.d %f2,%0\";
1490: }")
1491:
1492: (define_insn "divsf3"
1493: [(set (match_operand:SF 0 "general_operand" "=f")
1494: (div:SF (match_operand:SF 1 "general_operand" "0")
1495: (match_operand:SF 2 "general_operand" "fdmF")))]
1496: "TARGET_68881"
1497: "*
1498: {
1499: if (REG_P (operands[2]) && ! DATA_REG_P (operands[2]))
1500: return \"fsgldiv%.x %2,%0\";
1501: return \"fsgldiv%.s %f2,%0\";
1502: }")
1503:
1504: ;; Remainder instructions.
1505:
1506: (define_insn "modhi3"
1507: [(set (match_operand:HI 0 "general_operand" "=d")
1508: (mod:HI (match_operand:HI 1 "general_operand" "0")
1509: (match_operand:HI 2 "general_operand" "dmn")))]
1510: ""
1511: "*
1512: {
1513: /* The swap insn produces cc's that don't correspond to the result. */
1514: CC_STATUS_INIT;
1515: #ifdef MOTOROLA
1516: return \"ext.l %0\;divs.w %2,%0\;swap %0\";
1517: #else
1518: return \"extl %0\;divs %2,%0\;swap %0\";
1519: #endif
1520: }")
1521:
1522: (define_insn "modhisi3"
1523: [(set (match_operand:HI 0 "general_operand" "=d")
1524: (mod:HI (match_operand:SI 1 "general_operand" "0")
1525: (match_operand:HI 2 "general_operand" "dmn")))]
1526: ""
1527: "*
1528: {
1529: /* The swap insn produces cc's that don't correspond to the result. */
1530: CC_STATUS_INIT;
1531: #ifdef MOTOROLA
1532: return \"divs.w %2,%0\;swap %0\";
1533: #else
1534: return \"divs %2,%0\;swap %0\";
1535: #endif
1536: }")
1537:
1538: (define_insn "umodhi3"
1539: [(set (match_operand:HI 0 "general_operand" "=d")
1540: (umod:HI (match_operand:HI 1 "general_operand" "0")
1541: (match_operand:HI 2 "general_operand" "dmn")))]
1542: ""
1543: "*
1544: {
1545: /* The swap insn produces cc's that don't correspond to the result. */
1546: CC_STATUS_INIT;
1547: #ifdef MOTOROLA
1548: return \"and.l %#0xFFFF,%0\;divu.w %2,%0\;swap %0\";
1549: #else
1550: return \"andl %#0xFFFF,%0\;divu %2,%0\;swap %0\";
1551: #endif
1552: }")
1553:
1554: (define_insn "umodhisi3"
1555: [(set (match_operand:HI 0 "general_operand" "=d")
1556: (umod:HI (match_operand:SI 1 "general_operand" "0")
1557: (match_operand:HI 2 "general_operand" "dmn")))]
1558: ""
1559: "*
1560: {
1561: /* The swap insn produces cc's that don't correspond to the result. */
1562: CC_STATUS_INIT;
1563: #ifdef MOTOROLA
1564: return \"divu.w %2,%0\;swap %0\";
1565: #else
1566: return \"divu %2,%0\;swap %0\";
1567: #endif
1568: }")
1569:
1570: (define_insn "divmodsi4"
1571: [(set (match_operand:SI 0 "general_operand" "=d")
1572: (div:SI (match_operand:SI 1 "general_operand" "0")
1573: (match_operand:SI 2 "general_operand" "dmsK")))
1574: (set (match_operand:SI 3 "general_operand" "=d")
1575: (mod:SI (match_dup 1) (match_dup 2)))]
1576: "TARGET_68020"
1577: "divsl%.l %2,%3:%0")
1578:
1579: (define_insn "udivmodsi4"
1580: [(set (match_operand:SI 0 "general_operand" "=d")
1581: (udiv:SI (match_operand:SI 1 "general_operand" "0")
1582: (match_operand:SI 2 "general_operand" "dmsK")))
1583: (set (match_operand:SI 3 "general_operand" "=d")
1584: (umod:SI (match_dup 1) (match_dup 2)))]
1585: "TARGET_68020"
1586: "divul%.l %2,%3:%0")
1587:
1588: ;; logical-and instructions
1589:
1590: (define_insn "andsi3"
1591: [(set (match_operand:SI 0 "general_operand" "=m,d")
1592: (and:SI (match_operand:SI 1 "general_operand" "%0,0")
1593: (match_operand:SI 2 "general_operand" "dKs,dmKs")))]
1594: ""
1595: "*
1596: {
1597: if (GET_CODE (operands[2]) == CONST_INT
1598: && (INTVAL (operands[2]) | 0xffff) == 0xffffffff
1599: && (DATA_REG_P (operands[0])
1600: || offsetable_memref_p (operands[0])))
1601: {
1602: if (GET_CODE (operands[0]) != REG)
1603: operands[0] = adj_offsetable_operand (operands[0], 2);
1604: operands[2] = gen_rtx (CONST_INT, VOIDmode,
1605: INTVAL (operands[2]) & 0xffff);
1606: /* Do not delete a following tstl %0 insn; that would be incorrect. */
1607: CC_STATUS_INIT;
1608: return \"and%.w %2,%0\";
1609: }
1610: return \"and%.l %2,%0\";
1611: }")
1612:
1613: (define_insn "andhi3"
1614: [(set (match_operand:HI 0 "general_operand" "=m,d")
1615: (and:HI (match_operand:HI 1 "general_operand" "%0,0")
1616: (match_operand:HI 2 "general_operand" "dn,dmn")))]
1617: ""
1618: "and%.w %2,%0")
1619:
1620: (define_insn "andqi3"
1621: [(set (match_operand:QI 0 "general_operand" "=m,d")
1622: (and:QI (match_operand:QI 1 "general_operand" "%0,0")
1623: (match_operand:QI 2 "general_operand" "dn,dmn")))]
1624: ""
1625: "and%.b %2,%0")
1626:
1627: (define_insn ""
1628: [(set (match_operand:SI 0 "general_operand" "=d")
1629: (and:SI (zero_extend:SI (match_operand:HI 1 "general_operand" "dm"))
1630: (match_operand:SI 2 "general_operand" "0")))]
1631: "GET_CODE (operands[2]) == CONST_INT
1632: && (unsigned int) INTVAL (operands[2]) < (1 << GET_MODE_BITSIZE (HImode))"
1633: "and%.w %1,%0")
1634:
1635: (define_insn ""
1636: [(set (match_operand:SI 0 "general_operand" "=d")
1637: (and:SI (zero_extend:SI (match_operand:QI 1 "general_operand" "dm"))
1638: (match_operand:SI 2 "general_operand" "0")))]
1639: "GET_CODE (operands[2]) == CONST_INT
1640: && (unsigned int) INTVAL (operands[2]) < (1 << GET_MODE_BITSIZE (QImode))"
1641: "and%.b %1,%0")
1642:
1643: ;; inclusive-or instructions
1644:
1645: (define_insn "iorsi3"
1646: [(set (match_operand:SI 0 "general_operand" "=m,d")
1647: (ior:SI (match_operand:SI 1 "general_operand" "%0,0")
1648: (match_operand:SI 2 "general_operand" "dKs,dmKs")))]
1649: ""
1650: "*
1651: {
1652: register int logval;
1653: if (GET_CODE (operands[2]) == CONST_INT
1654: && INTVAL (operands[2]) >> 16 == 0
1655: && (DATA_REG_P (operands[0])
1656: || offsetable_memref_p (operands[0])))
1657: {
1658: if (GET_CODE (operands[0]) != REG)
1659: operands[0] = adj_offsetable_operand (operands[0], 2);
1660: /* Do not delete a following tstl %0 insn; that would be incorrect. */
1661: CC_STATUS_INIT;
1662: return \"or%.w %2,%0\";
1663: }
1664: if (GET_CODE (operands[2]) == CONST_INT
1665: && (logval = exact_log2 (INTVAL (operands[2]))) >= 0
1666: && (DATA_REG_P (operands[0])
1667: || offsetable_memref_p (operands[0])))
1668: {
1669: if (DATA_REG_P (operands[0]))
1670: {
1671: operands[1] = gen_rtx (CONST_INT, VOIDmode, logval);
1672: }
1673: else
1674: {
1675: operands[0] = adj_offsetable_operand (operands[0], 3 - (logval / 8));
1676: operands[1] = gen_rtx (CONST_INT, VOIDmode, logval % 8);
1677: }
1678: return \"bset %1,%0\";
1679: }
1680: return \"or%.l %2,%0\";
1681: }")
1682:
1683: (define_insn "iorhi3"
1684: [(set (match_operand:HI 0 "general_operand" "=m,d")
1685: (ior:HI (match_operand:HI 1 "general_operand" "%0,0")
1686: (match_operand:HI 2 "general_operand" "dn,dmn")))]
1687: ""
1688: "or%.w %2,%0")
1689:
1690: (define_insn "iorqi3"
1691: [(set (match_operand:QI 0 "general_operand" "=m,d")
1692: (ior:QI (match_operand:QI 1 "general_operand" "%0,0")
1693: (match_operand:QI 2 "general_operand" "dn,dmn")))]
1694: ""
1695: "or%.b %2,%0")
1696:
1697: ;; xor instructions
1698:
1699: (define_insn "xorsi3"
1700: [(set (match_operand:SI 0 "general_operand" "=do,m")
1701: (xor:SI (match_operand:SI 1 "general_operand" "%0,0")
1702: (match_operand:SI 2 "general_operand" "di,dKs")))]
1703: ""
1704: "*
1705: {
1706: if (GET_CODE (operands[2]) == CONST_INT
1707: && INTVAL (operands[2]) >> 16 == 0
1708: && (offsetable_memref_p (operands[0]) || DATA_REG_P (operands[0])))
1709: {
1710: if (! DATA_REG_P (operands[0]))
1711: operands[0] = adj_offsetable_operand (operands[0], 2);
1712: /* Do not delete a following tstl %0 insn; that would be incorrect. */
1713: CC_STATUS_INIT;
1714: return \"eor%.w %2,%0\";
1715: }
1716: return \"eor%.l %2,%0\";
1717: }")
1718:
1719: (define_insn "xorhi3"
1720: [(set (match_operand:HI 0 "general_operand" "=dm")
1721: (xor:HI (match_operand:HI 1 "general_operand" "%0")
1722: (match_operand:HI 2 "general_operand" "dn")))]
1723: ""
1724: "eor%.w %2,%0")
1725:
1726: (define_insn "xorqi3"
1727: [(set (match_operand:QI 0 "general_operand" "=dm")
1728: (xor:QI (match_operand:QI 1 "general_operand" "%0")
1729: (match_operand:QI 2 "general_operand" "dn")))]
1730: ""
1731: "eor%.b %2,%0")
1732:
1733: ;; negation instructions
1734:
1735: (define_insn "negsi2"
1736: [(set (match_operand:SI 0 "general_operand" "=dm")
1737: (neg:SI (match_operand:SI 1 "general_operand" "0")))]
1738: ""
1739: "neg%.l %0")
1740:
1741: (define_insn "neghi2"
1742: [(set (match_operand:HI 0 "general_operand" "=dm")
1743: (neg:HI (match_operand:HI 1 "general_operand" "0")))]
1744: ""
1745: "neg%.w %0")
1746:
1747: (define_insn "negqi2"
1748: [(set (match_operand:QI 0 "general_operand" "=dm")
1749: (neg:QI (match_operand:QI 1 "general_operand" "0")))]
1750: ""
1751: "neg%.b %0")
1752:
1753: (define_insn "negsf2"
1754: [(set (match_operand:SF 0 "general_operand" "=f")
1755: (neg:SF (match_operand:SF 1 "general_operand" "fdmF")))]
1756: "TARGET_68881"
1757: "*
1758: {
1759: if (REG_P (operands[1]) && ! DATA_REG_P (operands[1]))
1760: return \"fneg%.x %1,%0\";
1761: return \"fneg%.s %f1,%0\";
1762: }")
1763:
1764: (define_insn "negdf2"
1765: [(set (match_operand:DF 0 "general_operand" "=f")
1766: (neg:DF (match_operand:DF 1 "general_operand" "fmF")))]
1767: "TARGET_68881"
1768: "*
1769: {
1770: if (REG_P (operands[1]) && ! DATA_REG_P (operands[1]))
1771: return \"fneg%.x %1,%0\";
1772: return \"fneg%.d %f1,%0\";
1773: }")
1774:
1775: ;; Absolute value instructions
1776:
1777: (define_insn "abssf2"
1778: [(set (match_operand:SF 0 "general_operand" "=f")
1779: (abs:SF (match_operand:SF 1 "general_operand" "fdmF")))]
1780: "TARGET_68881"
1781: "*
1782: {
1783: if (REG_P (operands[1]) && ! DATA_REG_P (operands[1]))
1784: return \"fabs%.x %1,%0\";
1785: return \"fabs%.s %f1,%0\";
1786: }")
1787:
1788: (define_insn "absdf2"
1789: [(set (match_operand:DF 0 "general_operand" "=f")
1790: (abs:DF (match_operand:DF 1 "general_operand" "fmF")))]
1791: "TARGET_68881"
1792: "*
1793: {
1794: if (REG_P (operands[1]) && ! DATA_REG_P (operands[1]))
1795: return \"fabs%.x %1,%0\";
1796: return \"fabs%.d %f1,%0\";
1797: }")
1798:
1799: ;; one complement instructions
1800:
1801: (define_insn "one_cmplsi2"
1802: [(set (match_operand:SI 0 "general_operand" "=dm")
1803: (not:SI (match_operand:SI 1 "general_operand" "0")))]
1804: ""
1805: "not%.l %0")
1806:
1807: (define_insn "one_cmplhi2"
1808: [(set (match_operand:HI 0 "general_operand" "=dm")
1809: (not:HI (match_operand:HI 1 "general_operand" "0")))]
1810: ""
1811: "not%.w %0")
1812:
1813: (define_insn "one_cmplqi2"
1814: [(set (match_operand:QI 0 "general_operand" "=dm")
1815: (not:QI (match_operand:QI 1 "general_operand" "0")))]
1816: ""
1817: "not%.b %0")
1818:
1819: ;; Optimized special case of shifting.
1820: ;; Must precede the general case.
1821:
1822: (define_insn ""
1823: [(set (match_operand:SI 0 "general_operand" "=d")
1824: (ashiftrt:SI (match_operand:SI 1 "memory_operand" "m")
1825: (const_int 24)))]
1826: ""
1827: "*
1828: {
1829: if (TARGET_68020)
1830: return \"move%.b %1,%0\;extb%.l %0\";
1831: return \"move%.b %1,%0\;ext%.w %0\;ext%.l %0\";
1832: }")
1833:
1834: (define_insn ""
1835: [(set (match_operand:SI 0 "general_operand" "=d")
1836: (lshiftrt:SI (match_operand:SI 1 "memory_operand" "m")
1837: (const_int 24)))]
1838: ""
1839: "*
1840: {
1841: if (reg_mentioned_p (operands[0], operands[1]))
1842: return \"move%.b %1,%0\;and%.l %#0xFF,%0\";
1843: return \"clr%.l %0\;move%.b %1,%0\";
1844: }")
1845:
1846: (define_insn ""
1847: [(set (cc0) (minus (match_operand:QI 0 "general_operand" "i")
1848: (lshiftrt:SI (match_operand:SI 1 "memory_operand" "m")
1849: (const_int 24))))]
1850: "(GET_CODE (operands[0]) == CONST_INT
1851: && (INTVAL (operands[0]) & ~0xff) == 0)"
1852: "* cc_status.flags |= CC_REVERSED;
1853: #ifdef HPUX_ASM
1854: return \"cmp%.b %1,%0\";
1855: #else
1856: return \"cmp%.b %0,%1\";
1857: #endif
1858: ")
1859:
1860: (define_insn ""
1861: [(set (cc0) (minus (lshiftrt:SI (match_operand:SI 0 "memory_operand" "m")
1862: (const_int 24))
1863: (match_operand:QI 1 "general_operand" "i")))]
1864: "(GET_CODE (operands[1]) == CONST_INT
1865: && (INTVAL (operands[1]) & ~0xff) == 0)"
1866: "*
1867: #ifdef HPUX_ASM
1868: return \"cmp%.b %0,%1\";
1869: #else
1870: return \"cmp%.b %1,%0\";
1871: #endif
1872: ")
1873:
1874: (define_insn ""
1875: [(set (cc0) (minus (match_operand:QI 0 "general_operand" "i")
1876: (ashiftrt:SI (match_operand:SI 1 "memory_operand" "m")
1877: (const_int 24))))]
1878: "(GET_CODE (operands[0]) == CONST_INT
1879: && ((INTVAL (operands[0]) + 0x80) & ~0xff) == 0)"
1880: "* cc_status.flags |= CC_REVERSED;
1881: #ifdef HPUX_ASM
1882: return \"cmp%.b %1,%0\";
1883: #else
1884: return \"cmp%.b %0,%1\";
1885: #endif
1886: ")
1887:
1888: (define_insn ""
1889: [(set (cc0) (minus (ashiftrt:SI (match_operand:SI 0 "memory_operand" "m")
1890: (const_int 24))
1891: (match_operand:QI 1 "general_operand" "i")))]
1892: "(GET_CODE (operands[1]) == CONST_INT
1893: && ((INTVAL (operands[1]) + 0x80) & ~0xff) == 0)"
1894: "*
1895: #ifdef HPUX_ASM
1896: return \"cmp%.b %0,%1\";
1897: #else
1898: return \"cmp%.b %1,%0\";
1899: #endif
1900: ")
1901:
1902: ;; arithmetic shift instructions
1903: ;; We don't need the shift memory by 1 bit instruction
1904:
1905: (define_insn "ashlsi3"
1906: [(set (match_operand:SI 0 "general_operand" "=d")
1907: (ashift:SI (match_operand:SI 1 "general_operand" "0")
1908: (match_operand:SI 2 "general_operand" "dI")))]
1909: ""
1910: "asl%.l %2,%0")
1911:
1912: (define_insn "ashlhi3"
1913: [(set (match_operand:HI 0 "general_operand" "=d")
1914: (ashift:HI (match_operand:HI 1 "general_operand" "0")
1915: (match_operand:HI 2 "general_operand" "dI")))]
1916: ""
1917: "asl%.w %2,%0")
1918:
1919: (define_insn "ashlqi3"
1920: [(set (match_operand:QI 0 "general_operand" "=d")
1921: (ashift:QI (match_operand:QI 1 "general_operand" "0")
1922: (match_operand:QI 2 "general_operand" "dI")))]
1923: ""
1924: "asl%.b %2,%0")
1925:
1926: (define_insn "ashrsi3"
1927: [(set (match_operand:SI 0 "general_operand" "=d")
1928: (ashiftrt:SI (match_operand:SI 1 "general_operand" "0")
1929: (match_operand:SI 2 "general_operand" "dI")))]
1930: ""
1931: "asr%.l %2,%0")
1932:
1933: (define_insn "ashrhi3"
1934: [(set (match_operand:HI 0 "general_operand" "=d")
1935: (ashiftrt:HI (match_operand:HI 1 "general_operand" "0")
1936: (match_operand:HI 2 "general_operand" "dI")))]
1937: ""
1938: "asr%.w %2,%0")
1939:
1940: (define_insn "ashrqi3"
1941: [(set (match_operand:QI 0 "general_operand" "=d")
1942: (ashiftrt:QI (match_operand:QI 1 "general_operand" "0")
1943: (match_operand:QI 2 "general_operand" "dI")))]
1944: ""
1945: "asr%.b %2,%0")
1946:
1947: ;; logical shift instructions
1948:
1949: (define_insn "lshlsi3"
1950: [(set (match_operand:SI 0 "general_operand" "=d")
1951: (lshift:SI (match_operand:SI 1 "general_operand" "0")
1952: (match_operand:SI 2 "general_operand" "dI")))]
1953: ""
1954: "lsl%.l %2,%0")
1955:
1956: (define_insn "lshlhi3"
1957: [(set (match_operand:HI 0 "general_operand" "=d")
1958: (lshift:HI (match_operand:HI 1 "general_operand" "0")
1959: (match_operand:HI 2 "general_operand" "dI")))]
1960: ""
1961: "lsl%.w %2,%0")
1962:
1963: (define_insn "lshlqi3"
1964: [(set (match_operand:QI 0 "general_operand" "=d")
1965: (lshift:QI (match_operand:QI 1 "general_operand" "0")
1966: (match_operand:QI 2 "general_operand" "dI")))]
1967: ""
1968: "lsl%.b %2,%0")
1969:
1970: (define_insn "lshrsi3"
1971: [(set (match_operand:SI 0 "general_operand" "=d")
1972: (lshiftrt:SI (match_operand:SI 1 "general_operand" "0")
1973: (match_operand:SI 2 "general_operand" "dI")))]
1974: ""
1975: "lsr%.l %2,%0")
1976:
1977: (define_insn "lshrhi3"
1978: [(set (match_operand:HI 0 "general_operand" "=d")
1979: (lshiftrt:HI (match_operand:HI 1 "general_operand" "0")
1980: (match_operand:HI 2 "general_operand" "dI")))]
1981: ""
1982: "lsr%.w %2,%0")
1983:
1984: (define_insn "lshrqi3"
1985: [(set (match_operand:QI 0 "general_operand" "=d")
1986: (lshiftrt:QI (match_operand:QI 1 "general_operand" "0")
1987: (match_operand:QI 2 "general_operand" "dI")))]
1988: ""
1989: "lsr%.b %2,%0")
1990:
1991: ;; rotate instructions
1992:
1993: (define_insn "rotlsi3"
1994: [(set (match_operand:SI 0 "general_operand" "=d")
1995: (rotate:SI (match_operand:SI 1 "general_operand" "0")
1996: (match_operand:SI 2 "general_operand" "dI")))]
1997: ""
1998: "rol%.l %2,%0")
1999:
2000: (define_insn "rotlhi3"
2001: [(set (match_operand:HI 0 "general_operand" "=d")
2002: (rotate:HI (match_operand:HI 1 "general_operand" "0")
2003: (match_operand:HI 2 "general_operand" "dI")))]
2004: ""
2005: "rol%.w %2,%0")
2006:
2007: (define_insn "rotlqi3"
2008: [(set (match_operand:QI 0 "general_operand" "=d")
2009: (rotate:QI (match_operand:QI 1 "general_operand" "0")
2010: (match_operand:QI 2 "general_operand" "dI")))]
2011: ""
2012: "rol%.b %2,%0")
2013:
2014: (define_insn "rotrsi3"
2015: [(set (match_operand:SI 0 "general_operand" "=d")
2016: (rotatert:SI (match_operand:SI 1 "general_operand" "0")
2017: (match_operand:SI 2 "general_operand" "dI")))]
2018: ""
2019: "ror%.l %2,%0")
2020:
2021: (define_insn "rotrhi3"
2022: [(set (match_operand:HI 0 "general_operand" "=d")
2023: (rotatert:HI (match_operand:HI 1 "general_operand" "0")
2024: (match_operand:HI 2 "general_operand" "dI")))]
2025: ""
2026: "ror%.w %2,%0")
2027:
2028: (define_insn "rotrqi3"
2029: [(set (match_operand:QI 0 "general_operand" "=d")
2030: (rotatert:QI (match_operand:QI 1 "general_operand" "0")
2031: (match_operand:QI 2 "general_operand" "dI")))]
2032: ""
2033: "ror%.b %2,%0")
2034:
2035: ;; Special cases of bit-field insns which we should
2036: ;; recognize in preference to the general case.
2037: ;; These handle aligned 8-bit and 16-bit fields,
2038: ;; which can usually be done with move instructions.
2039:
2040: (define_insn ""
2041: [(set (zero_extract:SI (match_operand:SI 0 "general_operand" "+do")
2042: (match_operand:SI 1 "immediate_operand" "i")
2043: (match_operand:SI 2 "immediate_operand" "i"))
2044: (match_operand:SI 3 "general_operand" "d"))]
2045: "TARGET_68020 && TARGET_BITFIELD
2046: && GET_CODE (operands[1]) == CONST_INT
2047: && (INTVAL (operands[1]) == 8 || INTVAL (operands[1]) == 16)
2048: && GET_CODE (operands[2]) == CONST_INT
2049: && INTVAL (operands[2]) % INTVAL (operands[1]) == 0
2050: && (GET_CODE (operands[0]) == REG
2051: || ! mode_dependent_address_p (XEXP (operands[0], 0)))"
2052: "*
2053: {
2054: if (REG_P (operands[0]))
2055: {
2056: if (INTVAL (operands[1]) + INTVAL (operands[2]) != 32)
2057: return \"bfins %3,%0{%b2:%b1}\";
2058: }
2059: else
2060: operands[0]
2061: = adj_offsetable_operand (operands[0], INTVAL (operands[2]) / 8);
2062:
2063: if (GET_CODE (operands[3]) == MEM)
2064: operands[3] = adj_offsetable_operand (operands[3],
2065: (32 - INTVAL (operands[1])) / 8);
2066: if (INTVAL (operands[1]) == 8)
2067: return \"move%.b %3,%0\";
2068: return \"move%.w %3,%0\";
2069: }")
2070:
2071: (define_insn ""
2072: [(set (match_operand:SI 0 "general_operand" "=&d")
2073: (zero_extract:SI (match_operand:SI 1 "general_operand" "do")
2074: (match_operand:SI 2 "immediate_operand" "i")
2075: (match_operand:SI 3 "immediate_operand" "i")))]
2076: "TARGET_68020 && TARGET_BITFIELD
2077: && GET_CODE (operands[2]) == CONST_INT
2078: && (INTVAL (operands[2]) == 8 || INTVAL (operands[2]) == 16)
2079: && GET_CODE (operands[3]) == CONST_INT
2080: && INTVAL (operands[3]) % INTVAL (operands[2]) == 0
2081: && (GET_CODE (operands[1]) == REG
2082: || ! mode_dependent_address_p (XEXP (operands[1], 0)))"
2083: "*
2084: {
2085: if (REG_P (operands[1]))
2086: {
2087: if (INTVAL (operands[2]) + INTVAL (operands[3]) != 32)
2088: return \"bfextu %1{%b3:%b2},%0\";
2089: }
2090: else
2091: operands[1]
2092: = adj_offsetable_operand (operands[1], INTVAL (operands[3]) / 8);
2093:
2094: output_asm_insn (\"clr%.l %0\", operands);
2095: if (GET_CODE (operands[0]) == MEM)
2096: operands[0] = adj_offsetable_operand (operands[0],
2097: (32 - INTVAL (operands[1])) / 8);
2098: if (INTVAL (operands[2]) == 8)
2099: return \"move%.b %1,%0\";
2100: return \"move%.w %1,%0\";
2101: }")
2102:
2103: (define_insn ""
2104: [(set (match_operand:SI 0 "general_operand" "=d")
2105: (sign_extract:SI (match_operand:SI 1 "general_operand" "do")
2106: (match_operand:SI 2 "immediate_operand" "i")
2107: (match_operand:SI 3 "immediate_operand" "i")))]
2108: "TARGET_68020 && TARGET_BITFIELD
2109: && GET_CODE (operands[2]) == CONST_INT
2110: && (INTVAL (operands[2]) == 8 || INTVAL (operands[2]) == 16)
2111: && GET_CODE (operands[3]) == CONST_INT
2112: && INTVAL (operands[3]) % INTVAL (operands[2]) == 0
2113: && (GET_CODE (operands[1]) == REG
2114: || ! mode_dependent_address_p (XEXP (operands[1], 0)))"
2115: "*
2116: {
2117: if (REG_P (operands[1]))
2118: {
2119: if (INTVAL (operands[2]) + INTVAL (operands[3]) != 32)
2120: return \"bfexts %1{%b3:%b2},%0\";
2121: }
2122: else
2123: operands[1]
2124: = adj_offsetable_operand (operands[1], INTVAL (operands[3]) / 8);
2125:
2126: if (INTVAL (operands[2]) == 8)
2127: return \"move%.b %1,%0\;extb%.l %0\";
2128: return \"move%.w %1,%0\;ext%.l %0\";
2129: }")
2130:
2131: ;; Bit field instructions, general cases.
2132: ;; "o,d" constraint causes a nonoffsetable memref to match the "o"
2133: ;; so that its address is reloaded.
2134:
2135: (define_insn "extv"
2136: [(set (match_operand:SI 0 "general_operand" "=d")
2137: (sign_extract:SI (match_operand:QI 1 "general_operand" "o,d")
2138: (match_operand:SI 2 "general_operand" "di,di")
2139: (match_operand:SI 3 "general_operand" "di,di")))]
2140: "TARGET_68020 && TARGET_BITFIELD"
2141: "bfexts %1{%b3:%b2},%0")
2142:
2143: (define_insn "extzv"
2144: [(set (match_operand:SI 0 "general_operand" "=d")
2145: (zero_extract:SI (match_operand:QI 1 "general_operand" "o,d")
2146: (match_operand:SI 2 "general_operand" "di,di")
2147: (match_operand:SI 3 "general_operand" "di,di")))]
2148: "TARGET_68020 && TARGET_BITFIELD"
2149: "bfextu %1{%b3:%b2},%0")
2150:
2151: (define_insn ""
2152: [(set (zero_extract:SI (match_operand:QI 0 "general_operand" "+o,d")
2153: (match_operand:SI 1 "general_operand" "di,di")
2154: (match_operand:SI 2 "general_operand" "di,di"))
2155: (xor:SI (zero_extract:SI (match_dup 0) (match_dup 1) (match_dup 2))
2156: (match_operand 3 "immediate_operand" "i")))]
2157: "TARGET_68020 && TARGET_BITFIELD
2158: && GET_CODE (operands[3]) == CONST_INT
2159: && (INTVAL (operands[3]) == -1
2160: || (GET_CODE (operands[1]) == CONST_INT
2161: && (~ INTVAL (operands[3]) & ((1 << INTVAL (operands[1]))- 1)) == 0))"
2162: "bfchg %0{%b2:%b1}")
2163:
2164: (define_insn ""
2165: [(set (zero_extract:SI (match_operand:QI 0 "general_operand" "+o,d")
2166: (match_operand:SI 1 "general_operand" "di,di")
2167: (match_operand:SI 2 "general_operand" "di,di"))
2168: (const_int 0))]
2169: "TARGET_68020 && TARGET_BITFIELD"
2170: "bfclr %0{%b2:%b1}")
2171:
2172: (define_insn ""
2173: [(set (zero_extract:SI (match_operand:QI 0 "general_operand" "+o,d")
2174: (match_operand:SI 1 "general_operand" "di,di")
2175: (match_operand:SI 2 "general_operand" "di,di"))
2176: (const_int -1))]
2177: "TARGET_68020 && TARGET_BITFIELD"
2178: "bfset %0{%b2:%b1}")
2179:
2180: (define_insn "insv"
2181: [(set (zero_extract:SI (match_operand:QI 0 "general_operand" "+o,d")
2182: (match_operand:SI 1 "general_operand" "di,di")
2183: (match_operand:SI 2 "general_operand" "di,di"))
2184: (match_operand:SI 3 "general_operand" "d"))]
2185: "TARGET_68020 && TARGET_BITFIELD"
2186: "bfins %3,%0{%b2:%b1}")
2187:
2188: ;; Now recognize bit field insns that operate on registers
2189: ;; (or at least were intended to do so).
2190:
2191: (define_insn ""
2192: [(set (match_operand:SI 0 "general_operand" "=d")
2193: (sign_extract:SI (match_operand:SI 1 "general_operand" "d")
2194: (match_operand:SI 2 "general_operand" "di")
2195: (match_operand:SI 3 "general_operand" "di")))]
2196: "TARGET_68020 && TARGET_BITFIELD"
2197: "bfexts %1{%b3:%b2},%0")
2198:
2199: (define_insn ""
2200: [(set (match_operand:SI 0 "general_operand" "=d")
2201: (zero_extract:SI (match_operand:SI 1 "general_operand" "d")
2202: (match_operand:SI 2 "general_operand" "di")
2203: (match_operand:SI 3 "general_operand" "di")))]
2204: "TARGET_68020 && TARGET_BITFIELD"
2205: "bfextu %1{%b3:%b2},%0")
2206:
2207: (define_insn ""
2208: [(set (zero_extract:SI (match_operand:SI 0 "general_operand" "+d")
2209: (match_operand:SI 1 "general_operand" "di")
2210: (match_operand:SI 2 "general_operand" "di"))
2211: (const_int 0))]
2212: "TARGET_68020 && TARGET_BITFIELD"
2213: "bfclr %0{%b2:%b1}")
2214:
2215: (define_insn ""
2216: [(set (zero_extract:SI (match_operand:SI 0 "general_operand" "+d")
2217: (match_operand:SI 1 "general_operand" "di")
2218: (match_operand:SI 2 "general_operand" "di"))
2219: (const_int -1))]
2220: "TARGET_68020 && TARGET_BITFIELD"
2221: "bfset %0{%b2:%b1}")
2222:
2223: (define_insn ""
2224: [(set (zero_extract:SI (match_operand:SI 0 "general_operand" "+d")
2225: (match_operand:SI 1 "general_operand" "di")
2226: (match_operand:SI 2 "general_operand" "di"))
2227: (match_operand:SI 3 "general_operand" "d"))]
2228: "TARGET_68020 && TARGET_BITFIELD"
2229: "*
2230: {
2231: #if 0
2232: /* These special cases are now recognized by a specific pattern. */
2233: if (GET_CODE (operands[1]) == CONST_INT && GET_CODE (operands[2]) == CONST_INT
2234: && INTVAL (operands[1]) == 16 && INTVAL (operands[2]) == 16)
2235: return \"move%.w %3,%0\";
2236: if (GET_CODE (operands[1]) == CONST_INT && GET_CODE (operands[2]) == CONST_INT
2237: && INTVAL (operands[1]) == 24 && INTVAL (operands[2]) == 8)
2238: return \"move%.b %3,%0\";
2239: #endif
2240: return \"bfins %3,%0{%b2:%b1}\";
2241: }")
2242:
2243: ;; Special patterns for optimizing bit-field instructions.
2244:
2245: (define_insn ""
2246: [(set (cc0)
2247: (zero_extract:SI (match_operand:QI 0 "memory_operand" "o")
2248: (match_operand:SI 1 "general_operand" "di")
2249: (match_operand:SI 2 "general_operand" "di")))]
2250: "TARGET_68020 && TARGET_BITFIELD
2251: && GET_CODE (operands[1]) == CONST_INT"
2252: "*
2253: {
2254: if (operands[1] == const1_rtx
2255: && GET_CODE (operands[2]) == CONST_INT)
2256: {
2257: int width = GET_CODE (operands[0]) == REG ? 31 : 7;
2258: return output_btst (operands,
2259: gen_rtx (CONST_INT, VOIDmode,
2260: width - INTVAL (operands[2])),
2261: operands[0],
2262: insn, 1000);
2263: /* Pass 1000 as SIGNPOS argument so that btst will
2264: not think we are testing the sign bit for an `and'
2265: and assume that nonzero implies a negative result. */
2266: }
2267: if (INTVAL (operands[1]) != 32)
2268: cc_status.flags = CC_NOT_NEGATIVE;
2269: return \"bftst %0{%b2:%b1}\";
2270: }")
2271:
2272: (define_insn ""
2273: [(set (cc0)
2274: (subreg:QI
2275: (zero_extract:SI (match_operand:QI 0 "memory_operand" "o")
2276: (match_operand:SI 1 "general_operand" "di")
2277: (match_operand:SI 2 "general_operand" "di"))
2278: 0))]
2279: "TARGET_68020 && TARGET_BITFIELD
2280: && GET_CODE (operands[1]) == CONST_INT"
2281: "*
2282: {
2283: if (operands[1] == const1_rtx
2284: && GET_CODE (operands[2]) == CONST_INT)
2285: {
2286: int width = GET_CODE (operands[0]) == REG ? 31 : 7;
2287: return output_btst (operands,
2288: gen_rtx (CONST_INT, VOIDmode,
2289: width - INTVAL (operands[2])),
2290: operands[0],
2291: insn, 1000);
2292: /* Pass 1000 as SIGNPOS argument so that btst will
2293: not think we are testing the sign bit for an `and'
2294: and assume that nonzero implies a negative result. */
2295: }
2296: if (INTVAL (operands[1]) != 32)
2297: cc_status.flags = CC_NOT_NEGATIVE;
2298: return \"bftst %0{%b2:%b1}\";
2299: }")
2300:
2301: (define_insn ""
2302: [(set (cc0)
2303: (subreg:HI
2304: (zero_extract:SI (match_operand:QI 0 "memory_operand" "o")
2305: (match_operand:SI 1 "general_operand" "di")
2306: (match_operand:SI 2 "general_operand" "di"))
2307: 0))]
2308: "TARGET_68020 && TARGET_BITFIELD
2309: && GET_CODE (operands[1]) == CONST_INT"
2310: "*
2311: {
2312: if (operands[1] == const1_rtx
2313: && GET_CODE (operands[2]) == CONST_INT)
2314: {
2315: int width = GET_CODE (operands[0]) == REG ? 31 : 7;
2316: return output_btst (operands,
2317: gen_rtx (CONST_INT, VOIDmode,
2318: width - INTVAL (operands[2])),
2319: operands[0],
2320: insn, 1000);
2321: /* Pass 1000 as SIGNPOS argument so that btst will
2322: not think we are testing the sign bit for an `and'
2323: and assume that nonzero implies a negative result. */
2324: }
2325: if (INTVAL (operands[1]) != 32)
2326: cc_status.flags = CC_NOT_NEGATIVE;
2327: return \"bftst %0{%b2:%b1}\";
2328: }")
2329:
2330: ;;; now handle the register cases
2331: (define_insn ""
2332: [(set (cc0)
2333: (zero_extract:SI (match_operand:SI 0 "general_operand" "d")
2334: (match_operand:SI 1 "general_operand" "di")
2335: (match_operand:SI 2 "general_operand" "di")))]
2336: "TARGET_68020 && TARGET_BITFIELD
2337: && GET_CODE (operands[1]) == CONST_INT"
2338: "*
2339: {
2340: if (operands[1] == const1_rtx
2341: && GET_CODE (operands[2]) == CONST_INT)
2342: {
2343: int width = GET_CODE (operands[0]) == REG ? 31 : 7;
2344: return output_btst (operands,
2345: gen_rtx (CONST_INT, VOIDmode,
2346: width - INTVAL (operands[2])),
2347: operands[0],
2348: insn, 1000);
2349: /* Pass 1000 as SIGNPOS argument so that btst will
2350: not think we are testing the sign bit for an `and'
2351: and assume that nonzero implies a negative result. */
2352: }
2353: if (INTVAL (operands[1]) != 32)
2354: cc_status.flags = CC_NOT_NEGATIVE;
2355: return \"bftst %0{%b2:%b1}\";
2356: }")
2357:
2358: (define_insn ""
2359: [(set (cc0)
2360: (subreg:QI
2361: (zero_extract:SI (match_operand:SI 0 "general_operand" "d")
2362: (match_operand:SI 1 "general_operand" "di")
2363: (match_operand:SI 2 "general_operand" "di"))
2364: 0))]
2365: "TARGET_68020 && TARGET_BITFIELD
2366: && GET_CODE (operands[1]) == CONST_INT"
2367: "*
2368: {
2369: if (operands[1] == const1_rtx
2370: && GET_CODE (operands[2]) == CONST_INT)
2371: {
2372: int width = GET_CODE (operands[0]) == REG ? 31 : 7;
2373: return output_btst (operands,
2374: gen_rtx (CONST_INT, VOIDmode,
2375: width - INTVAL (operands[2])),
2376: operands[0],
2377: insn, 1000);
2378: /* Pass 1000 as SIGNPOS argument so that btst will
2379: not think we are testing the sign bit for an `and'
2380: and assume that nonzero implies a negative result. */
2381: }
2382: if (INTVAL (operands[1]) != 32)
2383: cc_status.flags = CC_NOT_NEGATIVE;
2384: return \"bftst %0{%b2:%b1}\";
2385: }")
2386:
2387: (define_insn ""
2388: [(set (cc0)
2389: (subreg:HI
2390: (zero_extract:SI (match_operand:SI 0 "general_operand" "d")
2391: (match_operand:SI 1 "general_operand" "di")
2392: (match_operand:SI 2 "general_operand" "di"))
2393: 0))]
2394: "TARGET_68020 && TARGET_BITFIELD
2395: && GET_CODE (operands[1]) == CONST_INT"
2396: "*
2397: {
2398: if (operands[1] == const1_rtx
2399: && GET_CODE (operands[2]) == CONST_INT)
2400: {
2401: int width = GET_CODE (operands[0]) == REG ? 31 : 7;
2402: return output_btst (operands,
2403: gen_rtx (CONST_INT, VOIDmode,
2404: width - INTVAL (operands[2])),
2405: operands[0],
2406: insn, 1000);
2407: /* Pass 1000 as SIGNPOS argument so that btst will
2408: not think we are testing the sign bit for an `and'
2409: and assume that nonzero implies a negative result. */
2410: }
2411: if (INTVAL (operands[1]) != 32)
2412: cc_status.flags = CC_NOT_NEGATIVE;
2413: return \"bftst %0{%b2:%b1}\";
2414: }")
2415:
2416: (define_insn "seq"
2417: [(set (match_operand:QI 0 "general_operand" "=d")
2418: (eq (cc0) (const_int 0)))]
2419: ""
2420: "*
2421: cc_status = cc_prev_status;
2422: if (cc_status.flags & CC_Z_IN_NOT_N)
2423: return \"spl %0\";
2424: OUTPUT_JUMP (\"seq %0\", \"fseq %0\", \"seq %0\");
2425: ")
2426:
2427: (define_insn "sne"
2428: [(set (match_operand:QI 0 "general_operand" "=d")
2429: (ne (cc0) (const_int 0)))]
2430: ""
2431: "*
2432: cc_status = cc_prev_status;
2433: if (cc_status.flags & CC_Z_IN_NOT_N)
2434: return \"smi %0\";
2435: OUTPUT_JUMP (\"sne %0\", \"fsne %0\", \"sne %0\");
2436: ")
2437:
2438: (define_insn "sgt"
2439: [(set (match_operand:QI 0 "general_operand" "=d")
2440: (gt (cc0) (const_int 0)))]
2441: ""
2442: "*
2443: cc_status = cc_prev_status;
2444: OUTPUT_JUMP (\"sgt %0\", \"fsgt %0\", \"and%.b %#0xc,%!\;sgt %0\");
2445: ")
2446:
2447: (define_insn "sgtu"
2448: [(set (match_operand:QI 0 "general_operand" "=d")
2449: (gtu (cc0) (const_int 0)))]
2450: ""
2451: "* cc_status = cc_prev_status;
2452: return \"shi %0\"; ")
2453:
2454: (define_insn "slt"
2455: [(set (match_operand:QI 0 "general_operand" "=d")
2456: (lt (cc0) (const_int 0)))]
2457: ""
2458: "* cc_status = cc_prev_status;
2459: OUTPUT_JUMP (\"slt %0\", \"fslt %0\", \"smi %0\"); ")
2460:
2461: (define_insn "sltu"
2462: [(set (match_operand:QI 0 "general_operand" "=d")
2463: (ltu (cc0) (const_int 0)))]
2464: ""
2465: "* cc_status = cc_prev_status;
2466: return \"scs %0\"; ")
2467:
2468: (define_insn "sge"
2469: [(set (match_operand:QI 0 "general_operand" "=d")
2470: (ge (cc0) (const_int 0)))]
2471: ""
2472: "* cc_status = cc_prev_status;
2473: OUTPUT_JUMP (\"sge %0\", \"fsge %0\", \"spl %0\"); ")
2474:
2475: (define_insn "sgeu"
2476: [(set (match_operand:QI 0 "general_operand" "=d")
2477: (geu (cc0) (const_int 0)))]
2478: ""
2479: "* cc_status = cc_prev_status;
2480: return \"scc %0\"; ")
2481:
2482: (define_insn "sle"
2483: [(set (match_operand:QI 0 "general_operand" "=d")
2484: (le (cc0) (const_int 0)))]
2485: ""
2486: "*
2487: cc_status = cc_prev_status;
2488: OUTPUT_JUMP (\"sle %0\", \"fsle %0\", \"and%.b %#0xc,%!\;sle %0\");
2489: ")
2490:
2491: (define_insn "sleu"
2492: [(set (match_operand:QI 0 "general_operand" "=d")
2493: (leu (cc0) (const_int 0)))]
2494: ""
2495: "* cc_status = cc_prev_status;
2496: return \"sls %0\"; ")
2497:
2498: ;; Basic conditional jump instructions.
2499:
2500: (define_insn "beq"
2501: [(set (pc)
2502: (if_then_else (eq (cc0)
2503: (const_int 0))
2504: (label_ref (match_operand 0 "" ""))
2505: (pc)))]
2506: ""
2507: "*
2508: {
2509: if (cc_status.flags & CC_Z_IN_NOT_N)
2510: #ifdef MOTOROLA
2511: return \"jbpl %l0\";
2512: #else
2513: return \"jpl %l0\";
2514: #endif
2515: #ifdef MOTOROLA
2516: OUTPUT_JUMP (\"jbeq %l0\", \"fbeq %l0\", \"jbeq %l0\");
2517: #else
2518: OUTPUT_JUMP (\"jeq %l0\", \"fjeq %l0\", \"jeq %l0\");
2519: #endif
2520: }")
2521:
2522: (define_insn "bne"
2523: [(set (pc)
2524: (if_then_else (ne (cc0)
2525: (const_int 0))
2526: (label_ref (match_operand 0 "" ""))
2527: (pc)))]
2528: ""
2529: "*
2530: {
2531: if (cc_status.flags & CC_Z_IN_NOT_N)
2532: #ifdef MOTOROLA
2533: return \"jbmi %l0\";
2534: #else
2535: return \"jmi %l0\";
2536: #endif
2537: #ifdef MOTOROLA
2538: OUTPUT_JUMP (\"jbne %l0\", \"fbne %l0\", \"jbne %l0\");
2539: #else
2540: OUTPUT_JUMP (\"jne %l0\", \"fjne %l0\", \"jne %l0\");
2541: #endif
2542: }")
2543:
2544: (define_insn "bgt"
2545: [(set (pc)
2546: (if_then_else (gt (cc0)
2547: (const_int 0))
2548: (label_ref (match_operand 0 "" ""))
2549: (pc)))]
2550: ""
2551: "*
2552: #ifdef MOTOROLA
2553: OUTPUT_JUMP (\"jbgt %l0\", \"fbgt %l0\", \"and%.b %#0xc,%!\;jbgt %l0\");
2554: #else
2555: OUTPUT_JUMP (\"jgt %l0\", \"fjgt %l0\", \"andb %#0xc,%!\;jgt %l0\");
2556: #endif
2557: ")
2558:
2559: (define_insn "bgtu"
2560: [(set (pc)
2561: (if_then_else (gtu (cc0)
2562: (const_int 0))
2563: (label_ref (match_operand 0 "" ""))
2564: (pc)))]
2565: ""
2566: "*
2567: #ifdef MOTOROLA
2568: return \"jbhi %l0\";
2569: #else
2570: return \"jhi %l0\";
2571: #endif
2572: ")
2573:
2574: (define_insn "blt"
2575: [(set (pc)
2576: (if_then_else (lt (cc0)
2577: (const_int 0))
2578: (label_ref (match_operand 0 "" ""))
2579: (pc)))]
2580: ""
2581: "*
2582: #ifdef MOTOROLA
2583: OUTPUT_JUMP (\"jblt %l0\", \"fblt %l0\", \"jbmi %l0\");
2584: #else
2585: OUTPUT_JUMP (\"jlt %l0\", \"fjlt %l0\", \"jmi %l0\");
2586: #endif
2587: ")
2588:
2589: (define_insn "bltu"
2590: [(set (pc)
2591: (if_then_else (ltu (cc0)
2592: (const_int 0))
2593: (label_ref (match_operand 0 "" ""))
2594: (pc)))]
2595: ""
2596: "*
2597: #ifdef MOTOROLA
2598: return \"jbcs %l0\";
2599: #else
2600: return \"jcs %l0\";
2601: #endif
2602: ")
2603:
2604: (define_insn "bge"
2605: [(set (pc)
2606: (if_then_else (ge (cc0)
2607: (const_int 0))
2608: (label_ref (match_operand 0 "" ""))
2609: (pc)))]
2610: ""
2611: "*
2612: #ifdef MOTOROLA
2613: OUTPUT_JUMP (\"jbge %l0\", \"fbge %l0\", \"jbpl %l0\");
2614: #else
2615: OUTPUT_JUMP (\"jge %l0\", \"fjge %l0\", \"jpl %l0\");
2616: #endif
2617: ")
2618:
2619: (define_insn "bgeu"
2620: [(set (pc)
2621: (if_then_else (geu (cc0)
2622: (const_int 0))
2623: (label_ref (match_operand 0 "" ""))
2624: (pc)))]
2625: ""
2626: "*
2627: #ifdef MOTOROLA
2628: return \"jbcc %l0\";
2629: #else
2630: return \"jcc %l0\";
2631: #endif
2632: ")
2633:
2634: (define_insn "ble"
2635: [(set (pc)
2636: (if_then_else (le (cc0)
2637: (const_int 0))
2638: (label_ref (match_operand 0 "" ""))
2639: (pc)))]
2640: ""
2641: "*
2642: #ifdef MOTOROLA
2643: OUTPUT_JUMP (\"jble %l0\", \"fble %l0\", \"and%.b %#0xc,%!\;jble %l0\");
2644: #else
2645: OUTPUT_JUMP (\"jle %l0\", \"fjle %l0\", \"and%.b %#0xc,%!\;jle %l0\");
2646: #endif
2647: ")
2648:
2649: (define_insn "bleu"
2650: [(set (pc)
2651: (if_then_else (leu (cc0)
2652: (const_int 0))
2653: (label_ref (match_operand 0 "" ""))
2654: (pc)))]
2655: ""
2656: "*
2657: #ifdef MOTOROLA
2658: return \"jbls %l0\";
2659: #else
2660: return \"jls %l0\";
2661: #endif
2662: ")
2663:
2664: ;; Negated conditional jump instructions.
2665:
2666: (define_insn ""
2667: [(set (pc)
2668: (if_then_else (eq (cc0)
2669: (const_int 0))
2670: (pc)
2671: (label_ref (match_operand 0 "" ""))))]
2672: ""
2673: "*
2674: {
2675: if (cc_status.flags & CC_Z_IN_NOT_N)
2676: #ifdef MOTOROLA
2677: return \"jbmi %l0\";
2678: #else
2679: return \"jmi %l0\";
2680: #endif
2681: #ifdef MOTOROLA
2682: OUTPUT_JUMP (\"jbne %l0\", \"fbne %l0\", \"jbne %l0\");
2683: #else
2684: OUTPUT_JUMP (\"jne %l0\", \"fjne %l0\", \"jne %l0\");
2685: #endif
2686: }")
2687:
2688: (define_insn ""
2689: [(set (pc)
2690: (if_then_else (ne (cc0)
2691: (const_int 0))
2692: (pc)
2693: (label_ref (match_operand 0 "" ""))))]
2694: ""
2695: "*
2696: {
2697: if (cc_status.flags & CC_Z_IN_NOT_N)
2698: #ifdef MOTOROLA
2699: return \"jbpl %l0\";
2700: #else
2701: return \"jpl %l0\";
2702: #endif
2703: #ifdef MOTOROLA
2704: OUTPUT_JUMP (\"jbeq %l0\", \"fbeq %l0\", \"jbeq %l0\");
2705: #else
2706: OUTPUT_JUMP (\"jeq %l0\", \"fjeq %l0\", \"jeq %l0\");
2707: #endif
2708: }")
2709:
2710: (define_insn ""
2711: [(set (pc)
2712: (if_then_else (gt (cc0)
2713: (const_int 0))
2714: (pc)
2715: (label_ref (match_operand 0 "" ""))))]
2716: ""
2717: "*
2718: #ifdef MOTOROLA
2719: OUTPUT_JUMP (\"jble %l0\", \"fbngt %l0\", \"and%.b %#0xc,%!\;jble %l0\");
2720: #else
2721: OUTPUT_JUMP (\"jle %l0\", \"fjngt %l0\", \"and%.b %#0xc,%!\;jle %l0\");
2722: #endif
2723: ")
2724:
2725: (define_insn ""
2726: [(set (pc)
2727: (if_then_else (gtu (cc0)
2728: (const_int 0))
2729: (pc)
2730: (label_ref (match_operand 0 "" ""))))]
2731: ""
2732: "*
2733: #ifdef MOTOROLA
2734: return \"jbls %l0\";
2735: #else
2736: return \"jls %l0\";
2737: #endif
2738: ")
2739:
2740: (define_insn ""
2741: [(set (pc)
2742: (if_then_else (lt (cc0)
2743: (const_int 0))
2744: (pc)
2745: (label_ref (match_operand 0 "" ""))))]
2746: ""
2747: "*
2748: #ifdef MOTOROLA
2749: OUTPUT_JUMP (\"jbge %l0\", \"fbnlt %l0\", \"jbpl %l0\");
2750: #else
2751: OUTPUT_JUMP (\"jge %l0\", \"fjnlt %l0\", \"jpl %l0\");
2752: #endif
2753: ")
2754:
2755: (define_insn ""
2756: [(set (pc)
2757: (if_then_else (ltu (cc0)
2758: (const_int 0))
2759: (pc)
2760: (label_ref (match_operand 0 "" ""))))]
2761: ""
2762: "*
2763: #ifdef MOTOROLA
2764: return \"jbcc %l0\";
2765: #else
2766: return \"jcc %l0\";
2767: #endif
2768: ")
2769:
2770: (define_insn ""
2771: [(set (pc)
2772: (if_then_else (ge (cc0)
2773: (const_int 0))
2774: (pc)
2775: (label_ref (match_operand 0 "" ""))))]
2776: ""
2777: "*
2778: #ifdef MOTOROLA
2779: OUTPUT_JUMP (\"jblt %l0\", \"fbnge %l0\", \"jbmi %l0\");
2780: #else
2781: OUTPUT_JUMP (\"jlt %l0\", \"fjnge %l0\", \"jmi %l0\");
2782: #endif
2783: ")
2784:
2785: (define_insn ""
2786: [(set (pc)
2787: (if_then_else (geu (cc0)
2788: (const_int 0))
2789: (pc)
2790: (label_ref (match_operand 0 "" ""))))]
2791: ""
2792: "*
2793: #ifdef MOTOROLA
2794: return \"jbcs %l0\";
2795: #else
2796: return \"jcs %l0\";
2797: #endif
2798: ")
2799:
2800: (define_insn ""
2801: [(set (pc)
2802: (if_then_else (le (cc0)
2803: (const_int 0))
2804: (pc)
2805: (label_ref (match_operand 0 "" ""))))]
2806: ""
2807: "*
2808: #ifdef MOTOROLA
2809: OUTPUT_JUMP (\"jbgt %l0\", \"fbnle %l0\", \"and%.b %#0xc,%!\;jbgt %l0\");
2810: #else
2811: OUTPUT_JUMP (\"jgt %l0\", \"fjnle %l0\", \"and%.b %#0xc,%!\;jgt %l0\");
2812: #endif
2813: ")
2814:
2815: (define_insn ""
2816: [(set (pc)
2817: (if_then_else (leu (cc0)
2818: (const_int 0))
2819: (pc)
2820: (label_ref (match_operand 0 "" ""))))]
2821: ""
2822: "*
2823: #ifdef MOTOROLA
2824: return \"jbhi %l0\";
2825: #else
2826: return \"jhi %l0\";
2827: #endif
2828: ")
2829:
2830: ;; Subroutines of "casesi".
2831:
2832: (define_expand "casesi_1"
2833: [(set (match_operand:SI 3 "general_operand" "")
2834: (plus:SI (match_operand:SI 0 "general_operand" "")
2835: ;; Note operand 1 has been negated!
2836: (match_operand:SI 1 "immediate_operand" "")))
2837: (set (cc0) (minus (match_operand:SI 2 "general_operand" "")
2838: (match_dup 3)))
2839: (set (pc) (if_then_else (ltu (cc0) (const_int 0))
2840: (label_ref (match_operand 4 "" "")) (pc)))]
2841: ""
2842: "")
2843:
2844: (define_expand "casesi_2"
2845: [(set (match_operand:SI 0 "" "") (mem:HI (match_operand:SI 1 "" "")))
2846: ;; The USE here is so that at least one jump-insn will refer to the label,
2847: ;; to keep it alive in jump_optimize.
2848: (parallel [(set (pc)
2849: (plus:SI (pc) (match_dup 0)))
2850: (use (label_ref (match_operand 2 "" "")))])]
2851: ""
2852: "")
2853:
2854: ;; Operand 0 is index (in bytes); operand 1 is minimum, operand 2 themaximum;
2855: ;; operand 3 is CODE_LABEL for the table;
2856: ;; operand 4 is the CODE_LABEL to go to if index out of range.
2857: (define_expand "casesi"
2858: ;; We don't use these for generating the RTL, but we must describe
2859: ;; the operands here.
2860: [(match_operand:SI 0 "general_operand" "")
2861: (match_operand:SI 1 "immediate_operand" "")
2862: (match_operand:SI 2 "general_operand" "")
2863: (match_operand 3 "" "")
2864: (match_operand 4 "" "")]
2865: ""
2866: "
2867: {
2868: extern rtx negate_rtx ();
2869: rtx table_elt_addr;
2870: rtx index_diff;
2871:
2872: operands[1] = negate_rtx (operands[1]);
2873: index_diff = gen_reg_rtx (SImode);
2874: /* Emit the first few insns. */
2875: emit_insn (gen_casesi_1 (operands[0], operands[1], operands[2],
2876: index_diff, operands[4]));
2877: /* Construct a memory address. This may emit some insns. */
2878: table_elt_addr
2879: = memory_address (HImode,
2880: gen_rtx (PLUS, Pmode,
2881: gen_rtx (MULT, Pmode, index_diff,
2882: gen_rtx (CONST_INT, VOIDmode, 2)),
2883: gen_rtx (LABEL_REF, VOIDmode, operands[3])));
2884: /* Emit the last few insns. */
2885: emit_insn (gen_casesi_2 (gen_reg_rtx (HImode), table_elt_addr, operands[3]));
2886: DONE;
2887: }")
2888:
2889: ;; Recognize one of the insns resulting from casesi_2.
2890: (define_insn ""
2891: [(set (pc)
2892: (plus:SI (pc) (match_operand:HI 0 "general_operand" "r")))
2893: (use (label_ref (match_operand 1 "" "")))]
2894: ""
2895: "*
2896: #ifdef SGS
2897: #ifdef ASM_OUTPUT_CASE_LABEL
2898: return \"jmp 6(%%pc,%0.w)\";
2899: #else
2900: return \"jmp 2(%%pc,%0.w)\";
2901: #endif
2902: #else
2903: #ifdef MOTOROLA
2904: return \"jmp (2,pc,%0.w)\";
2905: #else
2906: return \"jmp pc@(2,%0:w)\";
2907: #endif
2908: #endif
2909: ")
2910:
2911: ;; Unconditional and other jump instructions
2912: (define_insn "jump"
2913: [(set (pc)
2914: (label_ref (match_operand 0 "" "")))]
2915: ""
2916: "*
2917: #ifdef MOTOROLA
2918: return \"jbra %l0\";
2919: #else
2920: return \"jra %l0\";
2921: #endif
2922: ")
2923:
2924: (define_insn ""
2925: [(set (pc)
2926: (if_then_else
2927: (ne (minus (plus:HI (match_operand:HI 0 "general_operand" "g")
2928: (const_int -1))
2929: (const_int -1))
2930: (const_int 0))
2931: (label_ref (match_operand 1 "" ""))
2932: (pc)))
2933: (set (match_dup 0)
2934: (plus:HI (match_dup 0)
2935: (const_int -1)))]
2936: ""
2937: "*
2938: {
2939: if (DATA_REG_P (operands[0]))
2940: return \"dbra %0,%l1\";
2941: if (GET_CODE (operands[0]) == MEM)
2942: {
2943: #ifdef MOTOROLA
2944: return \"subq%.w %#1,%0\;jbcc %l1\";
2945: #else
2946: return \"subqw %#1,%0\;jcc %l1\";
2947: #endif
2948: }
2949: #ifdef MOTOROLA
2950: #ifdef HPUX_ASM
2951: return \"subq%.w %#1,%0\;cmp%.w %0,%#-1\;jbne %l1\";
2952: #else
2953: return \"subq%.w %#1,%0\;cmp%.w %#-1,%0\;jbne %l1\";
2954: #endif
2955: #else
2956: return \"subqw %#1,%0\;cmpw %#-1,%0\;jne %l1\";
2957: #endif
2958: }")
2959:
2960: (define_insn ""
2961: [(set (pc)
2962: (if_then_else
2963: (ne (minus (plus:SI (match_operand:SI 0 "general_operand" "g")
2964: (const_int -1))
2965: (const_int -1))
2966: (const_int 0))
2967: (label_ref (match_operand 1 "" ""))
2968: (pc)))
2969: (set (match_dup 0)
2970: (plus:SI (match_dup 0)
2971: (const_int -1)))]
2972: ""
2973: "*
2974: {
2975: #ifdef MOTOROLA
2976: if (DATA_REG_P (operands[0]))
2977: return \"dbra %0,%l1\;clr.w %0\;subq.l %#1,%0\;jbcc %l1\";
2978: if (GET_CODE (operands[0]) == MEM)
2979: return \"subq.l %#1,%0\;jbcc %l1\";
2980: #ifdef HPUX_ASM
2981: return \"subq.l %#1,%0\;cmp.l %0,%#-1\;jbne %l1\";
2982: #else
2983: return \"subq.l %#1,%0\;cmp.l %#-1,%0\;jbne %l1\";
2984: #endif
2985: #else
2986: if (DATA_REG_P (operands[0]))
2987: return \"dbra %0,%l1\;clrw %0\;subql %#1,%0\;jcc %l1\";
2988: if (GET_CODE (operands[0]) == MEM)
2989: return \"subql %#1,%0\;jcc %l1\";
2990: return \"subql %#1,%0\;cmpl %#-1,%0\;jne %l1\";
2991: #endif
2992: }")
2993:
2994: ;; Call subroutine with no return value.
2995: (define_insn "call"
2996: [(call (match_operand:QI 0 "general_operand" "m")
2997: (match_operand:SI 1 "general_operand" "g"))]
2998: ;; Operand 1 not really used on the m68000.
2999:
3000: ""
3001: "*
3002: #ifdef MOTOROLA
3003: return \"jsr %0\";
3004: #else
3005: return \"jbsr %0\";
3006: #endif
3007: ")
3008:
3009: ;; Call subroutine, returning value in operand 0
3010: ;; (which must be a hard register).
3011: (define_insn "call_value"
3012: [(set (match_operand 0 "" "rf")
3013: (call (match_operand:QI 1 "general_operand" "m")
3014: (match_operand:SI 2 "general_operand" "g")))]
3015: ;; Operand 2 not really used on the m68000.
3016: ""
3017: "*
3018: #ifdef MOTOROLA
3019: return \"jsr %1\";
3020: #else
3021: return \"jbsr %1\";
3022: #endif
3023: ")
3024:
3025: (define_insn "return"
3026: [(return)]
3027: ""
3028: "rts")
3029:
3030: ;; This is the first machine-dependent peephole optimization.
3031: ;; It is useful when a floating value is returned from a function call
3032: ;; and then is moved into an FP register.
3033: ;; But it is mainly intended to test the support for these optimizations.
3034:
3035: (define_peephole
3036: [(set (reg:SI 15) (plus:SI (reg:SI 15) (const_int 4)))
3037: (set (match_operand:DF 0 "register_operand" "f")
3038: (match_operand:DF 1 "register_operand" "ad"))]
3039: "FP_REG_P (operands[0]) && ! FP_REG_P (operands[1])"
3040: "*
3041: {
3042: rtx xoperands[2];
3043: xoperands[1] = gen_rtx (REG, SImode, REGNO (operands[1]) + 1);
3044: output_asm_insn (\"move%.l %1,%s\", xoperands);
3045: output_asm_insn (\"move%.l %1,%-\", operands);
3046: return \"fmove%.d %+,%0\";
3047: }
3048: ")
3049:
3050: ;;- Local variables:
3051: ;;- mode:emacs-lisp
3052: ;;- comment-start: ";;- "
3053: ;;- eval: (set-syntax-table (copy-sequence (syntax-table)))
3054: ;;- eval: (modify-syntax-entry ?[ "(]")
3055: ;;- eval: (modify-syntax-entry ?] ")[")
3056: ;;- eval: (modify-syntax-entry ?{ "(}")
3057: ;;- eval: (modify-syntax-entry ?} "){")
3058: ;;- End:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.