|
|
1.1 root 1: ;;- Machine description for GNU compiler
2: ;;- Convex Version
3: ;; Copyright (C) 1989 Free Software Foundation, Inc.
4:
5: ;; This file is part of GNU CC.
6:
7: ;; GNU CC is free software; you can redistribute it and/or modify
8: ;; it under the terms of the GNU General Public License as published by
9: ;; the Free Software Foundation; either version 1, or (at your option)
10: ;; any later version.
11:
12: ;; GNU CC is distributed in the hope that it will be useful,
13: ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
14: ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15: ;; GNU General Public License for more details.
16:
17: ;; You should have received a copy of the GNU General Public License
18: ;; along with GNU CC; see the file COPYING. If not, write to
19: ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
20:
21:
22: ;;- Instruction patterns. When multiple patterns apply,
23: ;;- the first one in the file is chosen.
24: ;;-
25: ;;- See file "rtl.def" for documentation on define_insn, match_*, et. al.
26: ;;-
27: ;;- cpp macro #define NOTICE_UPDATE_CC in file tm.h handles condition code
28: ;;- updates for most instructions.
29:
30: ;; Put tstsi first among test insns so it matches a CONST_INT operand.
31:
32: (define_insn "tstsi"
33: [(set (cc0)
34: (match_operand:SI 0 "register_operand" "r"))]
35: ""
36: "* return set_cmp (operands[0], const0_rtx, 'w');")
37:
38: (define_insn "tsthi"
39: [(set (cc0)
40: (match_operand:HI 0 "register_operand" "r"))]
41: ""
42: "* return set_cmp (operands[0], const0_rtx, 'h');")
43:
44: (define_expand "tstqi"
45: [(set (match_dup 1)
46: (sign_extend:SI (match_operand:QI 0 "register_operand" "r")))
47: (set (cc0)
48: (match_dup 1))]
49: ""
50: "operands[1] = gen_reg_rtx (SImode);")
51:
52: (define_insn "tstdi"
53: [(set (cc0)
54: (match_operand:DI 0 "register_operand" "d"))
55: (clobber (reg:DI 1))]
56: ""
57: "*
58: {
59: output_asm_insn (\"ld.l #0,s1\");
60: return set_cmp (operands[0], gen_rtx (REG, DImode, 1), 'l');
61: }")
62:
63: (define_expand "tstdf"
64: [(set (cc0)
65: (compare (match_operand:DF 0 "register_operand" "d")
66: (match_dup 1)))]
67: ""
68: "operands[1] = force_reg (DFmode, dconst0_rtx);")
69:
70: (define_insn "tstsf"
71: [(set (cc0)
72: (match_operand:SF 0 "register_operand" "d"))]
73: ""
74: "* return set_cmp (operands[0], fconst0_rtx, 's');")
75:
76: ;; Put cmpsi first among compare insns so it matches two CONST_INT operands.
77:
78: (define_insn "cmpsi"
79: [(set (cc0)
80: (compare (match_operand:SI 0 "nonmemory_operand" "d,a,i,r")
81: (match_operand:SI 1 "nonmemory_operand" "d,a,r,i")))]
82: ""
83: "* return set_cmp (operands[0], operands[1], 'w');")
84:
85: (define_insn "cmphi"
86: [(set (cc0)
87: (compare (match_operand:HI 0 "nonmemory_operand" "d,a,r,i")
88: (match_operand:HI 1 "nonmemory_operand" "d,a,i,r")))]
89: ""
90: "* return set_cmp (operands[0], operands[1], 'h');")
91:
92: (define_insn ""
93: [(set (cc0)
94: (compare (sign_extend:SI (match_operand:QI 0 "register_operand" "d"))
95: (sign_extend:SI (match_operand:QI 1 "register_operand" "d"))))]
96: ""
97: "* return set_cmp (operands[0], operands[1], 'b');")
98:
99: (define_insn "cmpdi"
100: [(set (cc0)
101: (compare (match_operand:DI 0 "register_operand" "d")
102: (match_operand:DI 1 "register_operand" "d")))]
103: ""
104: "* return set_cmp (operands[0], operands[1], 'l');")
105:
106: (define_insn "cmpdf"
107: [(set (cc0)
108: (compare (match_operand:DF 0 "register_operand" "d")
109: (match_operand:DF 1 "register_operand" "d")))]
110: ""
111: "* return set_cmp (operands[0], operands[1], 'd');")
112:
113: (define_insn "cmpsf"
114: [(set (cc0)
115: (compare (match_operand:SF 0 "nonmemory_operand" "dF,d")
116: (match_operand:SF 1 "nonmemory_operand" "d,F")))]
117: ""
118: "* return set_cmp (operands[0], operands[1], 's');")
119:
120: (define_insn "movdf"
121: [(set (match_operand:DF 0 "general_operand" "=g,d")
122: (match_operand:DF 1 "general_operand" "d,gG"))]
123: ""
124: "*
125: {
126: if (push_operand (operands[0], DFmode))
127: return \"psh.l %1\";
128: else if (GET_CODE (operands[0]) == MEM)
129: return \"st.l %1,%0\";
130: else if (GET_CODE (operands[1]) == REG)
131: return \"mov %1,%0\";
132: else if (GET_CODE (operands[1]) == CONST_DOUBLE && LD_D_P (operands[1]))
133: {
134: operands[1] = gen_rtx (CONST_INT, VOIDmode,
135: const_double_high_int (operands[1]));
136: return \"ld.d %1,%0\";
137: }
138: else
139: return \"ld.l %1,%0\";
140: }")
141:
142: (define_insn "movsf"
143: [(set (match_operand:SF 0 "general_operand" "=g,d")
144: (match_operand:SF 1 "general_operand" "d,gF"))]
145: ""
146: "*
147: {
148: if (push_operand (operands[0], SFmode))
149: return \"psh.w %1\";
150: else if (GET_CODE (operands[0]) == MEM)
151: return \"st.s %1,%0\";
152: else if (GET_CODE (operands[1]) == REG)
153: return \"mov.s %1,%0\";
154: else
155: return \"ld.s %1,%0\";
156: }")
157:
158: (define_insn "movdi"
159: [(set (match_operand:DI 0 "general_operand" "=g,d")
160: (match_operand:DI 1 "general_operand" "d,gG"))]
161: ""
162: "*
163: {
164: if (push_operand (operands[0], DImode))
165: return \"psh.l %1\";
166: else if (GET_CODE (operands[0]) == MEM)
167: return \"st.l %1,%0\";
168: else if (GET_CODE (operands[1]) == REG)
169: return \"mov %1,%0\";
170: else if (GET_CODE (operands[1]) == CONST_DOUBLE && LD_D_P (operands[1]))
171: {
172: operands[1] = gen_rtx (CONST_INT, VOIDmode,
173: const_double_high_int (operands[1]));
174: return \"ld.d %1,%0\";
175: }
176: else
177: return \"ld.l %1,%0\";
178: }")
179:
180: ;; Special case of movsi, needed to express A-reg preference.
181:
182: (define_insn ""
183: [(set (match_operand:SI 0 "push_operand" "=<")
184: (plus:SI (match_operand:SI 1 "register_operand" "a")
185: (match_operand:SI 2 "immediate_operand" "i")))]
186: "operands[1] != stack_pointer_rtx"
187: "pshea %a2(%1)")
188:
189: (define_insn "movsi"
190: [(set (match_operand:SI 0 "general_operand" "=g,r,<")
191: (match_operand:SI 1 "general_operand" "r,g,io"))]
192: ""
193: "*
194: {
195: if (push_operand (operands[0], SImode))
196: {
197: if (GET_CODE (operands[1]) == REG)
198: return \"psh.w %1\";
199: else
200: return \"pshea %a1\";
201: }
202: if (GET_CODE (operands[0]) == MEM)
203: return \"st.w %1,%0\";
204: if (GET_CODE (operands[1]) != REG)
205: return \"ld.w %1,%0\";
206: if (S_REG_P (operands[0]) && S_REG_P (operands[1]))
207: return \"mov.w %1,%0\";
208: return \"mov %1,%0\";
209: }")
210:
211: (define_insn "movhi"
212: [(set (match_operand:HI 0 "general_operand" "=g,r")
213: (match_operand:HI 1 "general_operand" "r,g"))]
214: ""
215: "*
216: {
217: if (push_operand (operands[0], HImode))
218: abort ();
219: else if (GET_CODE (operands[0]) == MEM)
220: return \"st.h %1,%0\";
221: else if (GET_CODE (operands[1]) == REG)
222: {
223: if (S_REG_P (operands[0]) && S_REG_P (operands[1]))
224: return \"mov.w %1,%0\";
225: else
226: return \"mov %1,%0\";
227: }
228: else if (GET_CODE (operands[1]) == CONST_INT)
229: return \"ld.w %1,%0\";
230: else
231: return \"ld.h %1,%0\";
232: }")
233:
234: (define_insn "movqi"
235: [(set (match_operand:QI 0 "general_operand" "=g,r")
236: (match_operand:QI 1 "general_operand" "r,g"))]
237: ""
238: "*
239: {
240: if (push_operand (operands[0], QImode))
241: abort ();
242: else if (GET_CODE (operands[0]) == MEM)
243: return \"st.b %1,%0\";
244: else if (GET_CODE (operands[1]) == REG)
245: {
246: if (S_REG_P (operands[0]) && S_REG_P (operands[1]))
247: return \"mov.w %1,%0\";
248: else
249: return \"mov %1,%0\";
250: }
251: else if (GET_CODE (operands[1]) == CONST_INT)
252: return \"ld.w %1,%0\";
253: else
254: return \"ld.b %1,%0\";
255: }")
256:
257: ;; Extension and truncation insns.
258: ;; Those for integer source operand
259: ;; are ordered widest source type first.
260:
261: (define_insn "truncsiqi2"
262: [(set (match_operand:QI 0 "register_operand" "=d,a")
263: (truncate:QI (match_operand:SI 1 "register_operand" "d,a")))]
264: ""
265: "cvtw.b %1,%0")
266:
267: (define_insn "truncsihi2"
268: [(set (match_operand:HI 0 "register_operand" "=d,a")
269: (truncate:HI (match_operand:SI 1 "register_operand" "d,a")))]
270: ""
271: "cvtw.h %1,%0")
272:
273: (define_insn "trunchiqi2"
274: [(set (match_operand:QI 0 "register_operand" "=r")
275: (truncate:QI (match_operand:HI 1 "register_operand" "0")))]
276: ""
277: "")
278:
279: (define_insn "truncdisi2"
280: [(set (match_operand:SI 0 "register_operand" "=d")
281: (truncate:SI (match_operand:DI 1 "register_operand" "d")))]
282: ""
283: "cvtl.w %1,%0")
284:
285: (define_insn "extendsidi2"
286: [(set (match_operand:DI 0 "register_operand" "=d")
287: (sign_extend:DI (match_operand:SI 1 "register_operand" "d")))]
288: ""
289: "cvtw.l %1,%0")
290:
291: (define_insn "extendhisi2"
292: [(set (match_operand:SI 0 "register_operand" "=d,a")
293: (sign_extend:SI (match_operand:HI 1 "register_operand" "d,a")))]
294: ""
295: "cvth.w %1,%0")
296:
297: (define_insn "extendqihi2"
298: [(set (match_operand:HI 0 "register_operand" "=d,a")
299: (sign_extend:HI (match_operand:QI 1 "register_operand" "d,a")))]
300: ""
301: "cvtb.w %1,%0")
302:
303: (define_insn "extendqisi2"
304: [(set (match_operand:SI 0 "register_operand" "=d,a")
305: (sign_extend:SI (match_operand:QI 1 "register_operand" "d,a")))]
306: ""
307: "cvtb.w %1,%0")
308:
309: (define_insn "extendsfdf2"
310: [(set (match_operand:DF 0 "register_operand" "=d")
311: (float_extend:DF (match_operand:SF 1 "register_operand" "d")))]
312: ""
313: "cvts.d %1,%0")
314:
315: (define_insn "truncdfsf2"
316: [(set (match_operand:SF 0 "register_operand" "=d")
317: (float_truncate:SF (match_operand:DF 1 "register_operand" "d")))]
318: ""
319: "cvtd.s %1,%0")
320:
321: (define_insn "zero_extendhisi2"
322: [(set (match_operand:SI 0 "register_operand" "=r")
323: (zero_extend:SI (match_operand:HI 1 "register_operand" "0")))]
324: ""
325: "and #0xffff,%0")
326:
327: (define_insn "zero_extendqihi2"
328: [(set (match_operand:HI 0 "register_operand" "=r")
329: (zero_extend:HI (match_operand:QI 1 "register_operand" "0")))]
330: ""
331: "and #0xff,%0")
332:
333: (define_insn "zero_extendqisi2"
334: [(set (match_operand:SI 0 "register_operand" "=r")
335: (zero_extend:SI (match_operand:QI 1 "register_operand" "0")))]
336: ""
337: "and #0xff,%0")
338:
339: (define_insn "zero_extendsidi2"
340: [(set (match_operand:DI 0 "register_operand" "=d")
341: (zero_extend:DI (match_operand:SI 1 "register_operand" "0")))]
342: ""
343: "ld.u #0,%0")
344:
345: ;; Fix-to-float conversion insns.
346: ;; Note that the ones that start with SImode come first.
347: ;; That is so that an operand that is a CONST_INT
348: ;; (and therefore lacks a specific machine mode).
349: ;; will be recognized as SImode (which is always valid)
350: ;; rather than as QImode or HImode.
351:
352: (define_insn "floatsisf2"
353: [(set (match_operand:SF 0 "register_operand" "=d")
354: (float:SF (match_operand:SI 1 "register_operand" "d")))]
355: ""
356: "cvtw.s %1,%0")
357:
358: (define_insn "floatdisf2"
359: [(set (match_operand:SF 0 "register_operand" "=d")
360: (float:SF (match_operand:DI 1 "register_operand" "d")))]
361: ""
362: "cvtl.s %1,%0")
363:
364: (define_insn "floatsidf2"
365: [(set (match_operand:DF 0 "register_operand" "=d")
366: (float:DF (match_operand:SI 1 "register_operand" "d")))]
367: "TARGET_C2"
368: "cvtw.d %1,%0")
369:
370: (define_insn "floatdidf2"
371: [(set (match_operand:DF 0 "register_operand" "=d")
372: (float:DF (match_operand:DI 1 "register_operand" "d")))]
373: ""
374: "cvtl.d %1,%0")
375:
376: ;; Float-to-fix conversion insns.
377:
378: (define_insn "fix_truncsfsi2"
379: [(set (match_operand:SI 0 "register_operand" "=d")
380: (fix:SI (fix:SF (match_operand:SF 1 "register_operand" "d"))))]
381: ""
382: "cvts.w %1,%0")
383:
384: (define_insn "fix_truncsfdi2"
385: [(set (match_operand:DI 0 "register_operand" "=d")
386: (fix:DI (fix:SF (match_operand:SF 1 "register_operand" "d"))))]
387: ""
388: "cvts.l %1,%0")
389:
390: (define_insn "fix_truncdfsi2"
391: [(set (match_operand:SI 0 "register_operand" "=d")
392: (fix:SI (fix:DF (match_operand:DF 1 "register_operand" "d"))))]
393: ""
394: "*
395: {
396: if (TARGET_C2)
397: return \"cvtd.w %1,%0\";
398: return \"cvtd.l %1,%0\";
399: }")
400:
401: (define_insn "fix_truncdfdi2"
402: [(set (match_operand:DI 0 "register_operand" "=d")
403: (fix:DI (fix:DF (match_operand:DF 1 "register_operand" "d"))))]
404: ""
405: "cvtd.l %1,%0")
406:
407: ;;- All kinds of add instructions.
408:
409: (define_insn "adddf3"
410: [(set (match_operand:DF 0 "register_operand" "=d")
411: (plus:DF (match_operand:DF 1 "register_operand" "%0")
412: (match_operand:DF 2 "register_operand" "d")))]
413: ""
414: "add.d %2,%0")
415:
416: (define_insn "addsf3"
417: [(set (match_operand:SF 0 "register_operand" "=d")
418: (plus:SF (match_operand:SF 1 "register_operand" "%0")
419: (match_operand:SF 2 "nonmemory_operand" "dF")))]
420: ""
421: "add.s %2,%0")
422:
423: (define_insn "adddi3"
424: [(set (match_operand:DI 0 "register_operand" "=d")
425: (plus:DI (match_operand:DI 1 "register_operand" "%0")
426: (match_operand:DI 2 "register_operand" "d")))]
427: ""
428: "add.l %2,%0")
429:
430: ;; special case of addsi3, needed to specify an A reg for the destination
431: ;; when the source is a sum involving FP or AP.
432:
433: (define_insn ""
434: [(set (match_operand:SI 0 "register_operand" "=a")
435: (plus:SI (match_operand:SI 1 "register_operand" "%a")
436: (match_operand:SI 2 "immediate_operand" "i")))]
437: "operands[1] == frame_pointer_rtx || operands[1] == arg_pointer_rtx"
438: "ldea %a2(%1),%0")
439:
440: (define_insn "addsi3"
441: [(set (match_operand:SI 0 "register_operand" "=d,a,a")
442: (plus:SI (match_operand:SI 1 "nonmemory_operand" "%0,0,a")
443: (match_operand:SI 2 "nonmemory_operand" "di,ri,i")))]
444: ""
445: "* switch (which_alternative)
446: {
447: case 0:
448: case 1:
449: return \"add.w %2,%0\";
450: case 2:
451: if ((TARGET_C2 || A_REG_P (operands[0]))
452: && operands[1] != stack_pointer_rtx)
453: return \"ldea %a2(%1),%0\";
454: else
455: return \"mov %1,%0\;add.w %2,%0\";
456: }")
457:
458: (define_insn "addhi3"
459: [(set (match_operand:HI 0 "register_operand" "=d,a")
460: (plus:HI (match_operand:HI 1 "register_operand" "%0,0")
461: (match_operand:HI 2 "nonmemory_operand" "di,ai")))]
462: ""
463: "add.h %2,%0")
464:
465: (define_insn "addqi3"
466: [(set (match_operand:QI 0 "register_operand" "=d")
467: (plus:QI (match_operand:QI 1 "register_operand" "%0")
468: (match_operand:QI 2 "register_operand" "d")))]
469: ""
470: "add.b %2,%0")
471:
472: ;;- All kinds of subtract instructions.
473:
474: (define_insn "subdf3"
475: [(set (match_operand:DF 0 "register_operand" "=d")
476: (minus:DF (match_operand:DF 1 "register_operand" "0")
477: (match_operand:DF 2 "register_operand" "d")))]
478: ""
479: "sub.d %2,%0")
480:
481: (define_insn "subsf3"
482: [(set (match_operand:SF 0 "register_operand" "=d")
483: (minus:SF (match_operand:SF 1 "register_operand" "0")
484: (match_operand:SF 2 "nonmemory_operand" "dF")))]
485: ""
486: "sub.s %2,%0")
487:
488: (define_insn "subdi3"
489: [(set (match_operand:DI 0 "register_operand" "=d")
490: (minus:DI (match_operand:DI 1 "register_operand" "0")
491: (match_operand:DI 2 "register_operand" "d")))]
492: ""
493: "sub.l %2,%0")
494:
495: (define_insn "subsi3"
496: [(set (match_operand:SI 0 "register_operand" "=d,a")
497: (minus:SI (match_operand:SI 1 "register_operand" "0,0")
498: (match_operand:SI 2 "nonmemory_operand" "di,ai")))]
499: ""
500: "sub.w %2,%0")
501:
502: (define_insn "subhi3"
503: [(set (match_operand:HI 0 "register_operand" "=d,a")
504: (minus:HI (match_operand:HI 1 "register_operand" "0,0")
505: (match_operand:HI 2 "nonmemory_operand" "di,ai")))]
506: ""
507: "sub.h %2,%0")
508:
509: (define_insn "subqi3"
510: [(set (match_operand:QI 0 "register_operand" "=d")
511: (minus:QI (match_operand:QI 1 "register_operand" "0")
512: (match_operand:QI 2 "register_operand" "d")))]
513: ""
514: "sub.b %2,%0")
515:
516: ;;- Multiply instructions.
517:
518: (define_insn "muldf3"
519: [(set (match_operand:DF 0 "register_operand" "=d")
520: (mult:DF (match_operand:DF 1 "register_operand" "%0")
521: (match_operand:DF 2 "register_operand" "d")))]
522: ""
523: "mul.d %2,%0")
524:
525: (define_insn "mulsf3"
526: [(set (match_operand:SF 0 "register_operand" "=d")
527: (mult:SF (match_operand:SF 1 "register_operand" "%0")
528: (match_operand:SF 2 "nonmemory_operand" "dF")))]
529: ""
530: "mul.s %2,%0")
531:
532: (define_insn "muldi3"
533: [(set (match_operand:DI 0 "register_operand" "=d")
534: (mult:DI (match_operand:DI 1 "register_operand" "%0")
535: (match_operand:DI 2 "register_operand" "d")))]
536: ""
537: "mul.l %2,%0")
538:
539: (define_insn "mulsi3"
540: [(set (match_operand:SI 0 "register_operand" "=d,a")
541: (mult:SI (match_operand:SI 1 "register_operand" "%0,0")
542: (match_operand:SI 2 "nonmemory_operand" "di,ai")))]
543: ""
544: "mul.w %2,%0")
545:
546: (define_insn "mulhi3"
547: [(set (match_operand:HI 0 "register_operand" "=d,a")
548: (mult:HI (match_operand:HI 1 "register_operand" "%0,0")
549: (match_operand:HI 2 "nonmemory_operand" "di,ai")))]
550: ""
551: "mul.h %2,%0")
552:
553: (define_insn "mulqi3"
554: [(set (match_operand:QI 0 "register_operand" "=d")
555: (mult:QI (match_operand:QI 1 "register_operand" "%0")
556: (match_operand:QI 2 "register_operand" "d")))]
557: ""
558: "mul.b %2,%0")
559:
560: ;;- Divide instructions.
561:
562: (define_insn "divdf3"
563: [(set (match_operand:DF 0 "register_operand" "=d")
564: (div:DF (match_operand:DF 1 "register_operand" "0")
565: (match_operand:DF 2 "register_operand" "d")))]
566: ""
567: "div.d %2,%0")
568:
569: (define_insn "divsf3"
570: [(set (match_operand:SF 0 "register_operand" "=d")
571: (div:SF (match_operand:SF 1 "register_operand" "0")
572: (match_operand:SF 2 "nonmemory_operand" "dF")))]
573: ""
574: "div.s %2,%0")
575:
576: (define_insn "divdi3"
577: [(set (match_operand:DI 0 "register_operand" "=d")
578: (div:DI (match_operand:DI 1 "register_operand" "0")
579: (match_operand:DI 2 "register_operand" "d")))]
580: ""
581: "div.l %2,%0")
582:
583: (define_insn "udivdi3"
584: [(set (match_operand:DI 0 "register_operand" "=d")
585: (udiv:DI (match_operand:DI 1 "register_operand" "d")
586: (match_operand:DI 2 "register_operand" "d")))]
587: ""
588: "psh.l %2\;psh.l %1\;callq udiv64\;pop.l %0\;add.w #8,sp")
589:
590: (define_insn "divsi3"
591: [(set (match_operand:SI 0 "register_operand" "=d,a")
592: (div:SI (match_operand:SI 1 "register_operand" "0,0")
593: (match_operand:SI 2 "nonmemory_operand" "di,ai")))]
594: ""
595: "div.w %2,%0")
596:
597: (define_insn "divhi3"
598: [(set (match_operand:HI 0 "register_operand" "=d,a")
599: (div:HI (match_operand:HI 1 "register_operand" "0,0")
600: (match_operand:HI 2 "nonmemory_operand" "di,ai")))]
601: ""
602: "div.h %2,%0")
603:
604: (define_insn "divqi3"
605: [(set (match_operand:QI 0 "register_operand" "=d")
606: (div:QI (match_operand:QI 1 "register_operand" "0")
607: (match_operand:QI 2 "register_operand" "d")))]
608: ""
609: "div.b %2,%0")
610:
611: ;; - and, or, xor
612:
613: (define_insn "anddi3"
614: [(set (match_operand:DI 0 "register_operand" "=d")
615: (and:DI (match_operand:DI 1 "register_operand" "%0")
616: (match_operand:DI 2 "register_operand" "d")))]
617: ""
618: "and %2,%0")
619:
620: (define_insn "andsi3"
621: [(set (match_operand:SI 0 "register_operand" "=d,a")
622: (and:SI (match_operand:SI 1 "register_operand" "%0,0")
623: (match_operand:SI 2 "nonmemory_operand" "di,ai")))]
624: ""
625: "and %2,%0")
626:
627: (define_insn "andhi3"
628: [(set (match_operand:HI 0 "register_operand" "=d,a")
629: (and:HI (match_operand:HI 1 "register_operand" "%0,0")
630: (match_operand:HI 2 "nonmemory_operand" "di,ai")))]
631: ""
632: "and %2,%0")
633:
634: (define_insn "andqi3"
635: [(set (match_operand:QI 0 "register_operand" "=d,a")
636: (and:QI (match_operand:QI 1 "register_operand" "%0,0")
637: (match_operand:QI 2 "nonmemory_operand" "di,ai")))]
638: ""
639: "and %2,%0")
640:
641: ;;- Bit set instructions.
642:
643: (define_insn "iordi3"
644: [(set (match_operand:DI 0 "register_operand" "=d")
645: (ior:DI (match_operand:DI 1 "register_operand" "%0")
646: (match_operand:DI 2 "register_operand" "d")))]
647: ""
648: "or %2,%0")
649:
650: (define_insn "iorsi3"
651: [(set (match_operand:SI 0 "register_operand" "=d,a")
652: (ior:SI (match_operand:SI 1 "register_operand" "%0,0")
653: (match_operand:SI 2 "nonmemory_operand" "di,ai")))]
654: ""
655: "or %2,%0")
656:
657: (define_insn "iorhi3"
658: [(set (match_operand:HI 0 "register_operand" "=d,a")
659: (ior:HI (match_operand:HI 1 "register_operand" "%0,0")
660: (match_operand:HI 2 "nonmemory_operand" "di,ai")))]
661: ""
662: "or %2,%0")
663:
664: (define_insn "iorqi3"
665: [(set (match_operand:QI 0 "register_operand" "=d,a")
666: (ior:QI (match_operand:QI 1 "register_operand" "%0,0")
667: (match_operand:QI 2 "nonmemory_operand" "di,ai")))]
668: ""
669: "or %2,%0")
670:
671: ;;- xor instructions.
672:
673: (define_insn "xordi3"
674: [(set (match_operand:DI 0 "register_operand" "=d")
675: (xor:DI (match_operand:DI 1 "register_operand" "%0")
676: (match_operand:DI 2 "register_operand" "d")))]
677: ""
678: "xor %2,%0")
679:
680: (define_insn "xorsi3"
681: [(set (match_operand:SI 0 "register_operand" "=d,a")
682: (xor:SI (match_operand:SI 1 "register_operand" "%0,0")
683: (match_operand:SI 2 "nonmemory_operand" "di,ai")))]
684: ""
685: "xor %2,%0")
686:
687: (define_insn "xorhi3"
688: [(set (match_operand:HI 0 "register_operand" "=d,a")
689: (xor:HI (match_operand:HI 1 "register_operand" "%0,0")
690: (match_operand:HI 2 "nonmemory_operand" "di,ai")))]
691: ""
692: "xor %2,%0")
693:
694: (define_insn "xorqi3"
695: [(set (match_operand:QI 0 "register_operand" "=d,a")
696: (xor:QI (match_operand:QI 1 "register_operand" "%0,0")
697: (match_operand:QI 2 "nonmemory_operand" "di,ai")))]
698: ""
699: "xor %2,%0")
700:
701: (define_insn "negdf2"
702: [(set (match_operand:DF 0 "register_operand" "=d")
703: (neg:DF (match_operand:DF 1 "register_operand" "d")))]
704: ""
705: "neg.d %1,%0")
706:
707: (define_insn "negsf2"
708: [(set (match_operand:SF 0 "register_operand" "=d")
709: (neg:SF (match_operand:SF 1 "register_operand" "d")))]
710: ""
711: "neg.s %1,%0")
712:
713: (define_insn "negdi2"
714: [(set (match_operand:DI 0 "register_operand" "=d")
715: (neg:DI (match_operand:DI 1 "register_operand" "d")))]
716: ""
717: "neg.l %1,%0")
718:
719: (define_insn "negsi2"
720: [(set (match_operand:SI 0 "register_operand" "=d,a")
721: (neg:SI (match_operand:SI 1 "register_operand" "d,a")))]
722: ""
723: "neg.w %1,%0")
724:
725: (define_insn "neghi2"
726: [(set (match_operand:HI 0 "register_operand" "=d,a")
727: (neg:HI (match_operand:HI 1 "register_operand" "d,a")))]
728: ""
729: "neg.h %1,%0")
730:
731: (define_insn "negqi2"
732: [(set (match_operand:QI 0 "register_operand" "=d")
733: (neg:QI (match_operand:QI 1 "register_operand" "d")))]
734: ""
735: "neg.b %1,%0")
736:
737: (define_insn "one_cmpldi2"
738: [(set (match_operand:DI 0 "register_operand" "=d")
739: (not:DI (match_operand:DI 1 "register_operand" "d")))]
740: ""
741: "not %1,%0")
742:
743: (define_insn "one_cmplsi2"
744: [(set (match_operand:SI 0 "register_operand" "=d,a")
745: (not:SI (match_operand:SI 1 "register_operand" "d,a")))]
746: ""
747: "not %1,%0")
748:
749: (define_insn "one_cmplhi2"
750: [(set (match_operand:HI 0 "register_operand" "=d,a")
751: (not:HI (match_operand:HI 1 "register_operand" "d,a")))]
752: ""
753: "not %1,%0")
754:
755: (define_insn "one_cmplqi2"
756: [(set (match_operand:QI 0 "register_operand" "=d,a")
757: (not:QI (match_operand:QI 1 "register_operand" "d,a")))]
758: ""
759: "not %1,%0")
760:
761: ;;- shifts
762: ;;
763: ;; Convex shift instructions are unsigned.
764: ;; To make signed right shifts:
765: ;; for SImode, sign extend to DImode and shift, works for 0..32
766: ;; for DImode, shift and then extend the sign, works for 0..63
767: ;;
768: ;; It is very sad that DImode right shift 64 fails, but I don't see
769: ;; any reasonable way to handle it. ANSI only requires up to 63.
770:
771: (define_insn ""
772: [(set (match_operand:SI 0 "register_operand" "=r")
773: (ashift:SI (match_operand:SI 1 "register_operand" "0")
774: (match_operand:SI 2 "immediate_operand" "i")))]
775: "INTVAL (operands[2]) >= 0"
776: "*
777: {
778: if (operands[2] == const1_rtx)
779: return \"add.w %0,%0\";
780: else if (TARGET_C2 && S_REG_P (operands[0]))
781: return \"shf.w %2,%0\";
782: else
783: return \"shf %2,%0\";
784: }")
785:
786: (define_insn "ashlsi3"
787: [(set (match_operand:SI 0 "register_operand" "=d")
788: (ashift:SI (match_operand:SI 1 "register_operand" "0")
789: (match_operand:SI 2 "nonmemory_operand" "di")))]
790: ""
791: "*
792: {
793: if (operands[2] == const1_rtx)
794: return \"add.w %0,%0\";
795: else if (GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) >= 0)
796: return TARGET_C2 ? \"shf.w %2,%0\" : \"shf %2,%0\";
797: else
798: return \"cvtw.l %0,%0\;shf %2,%0\";
799: }")
800:
801: (define_expand "ashrsi3"
802: [(set (match_operand:SI 0 "register_operand" "=d")
803: (ashift:SI (match_operand:SI 1 "register_operand" "0")
804: (match_operand:SI 2 "nonmemory_operand" "di")))]
805: ""
806: "operands[2] = negate_rtx (SImode, operands[2]);")
807:
808: (define_insn "lshlsi3"
809: [(set (match_operand:SI 0 "register_operand" "=d,a")
810: (lshift:SI (match_operand:SI 1 "register_operand" "0,0")
811: (match_operand:SI 2 "nonmemory_operand" "di,ai")))]
812: ""
813: "*
814: {
815: if (operands[2] == const1_rtx)
816: return \"add.w %0,%0\";
817: if (S_REG_P (operands[0]))
818: {
819: if (TARGET_C2)
820: return \"shf.w %2,%0\";
821: else if (GET_CODE (operands[2]) == CONST_INT
822: && INTVAL (operands[2]) >= 0)
823: return \"shf %2,%0\";
824: else
825: return \"ld.u #0,%0\;shf %2,%0\";
826: }
827: return \"shf %2,%0\";
828: }")
829:
830: (define_expand "lshrsi3"
831: [(set (match_operand:SI 0 "register_operand" "=d")
832: (lshift:SI (match_operand:SI 1 "register_operand" "0")
833: (match_operand:SI 2 "nonmemory_operand" "di")))]
834: ""
835: "operands[2] = negate_rtx (SImode, operands[2]);")
836:
837: ;; signed a >> b is
838: ;; ((a >> b) ^ signbit) - signbit
839: ;; where signbit is (1 << 63) >> b
840:
841: (define_expand "ashldi3"
842: [(match_operand:DI 0 "register_operand" "=d")
843: (match_operand:DI 1 "register_operand" "0")
844: (match_operand:SI 2 "nonmemory_operand" "di")
845: (match_dup 3)]
846: ""
847: "
848: {
849: if (GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) >= 0)
850: emit_insn (gen_rtx (SET, VOIDmode, operands[0],
851: gen_rtx (LSHIFT, DImode, operands[1], operands[2])));
852: else if (GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) < 0)
853: {
854: int rshift = - INTVAL (operands[2]);
855: operands[3] = force_reg
856: (DImode,
857: immed_double_const (1 << (63 - rshift), 1 << (31 - rshift), DImode));
858: emit_insn (gen_rtx (SET, VOIDmode, operands[0],
859: gen_rtx (LSHIFT, DImode, operands[1], operands[2])));
860: emit_insn (gen_rtx (SET, VOIDmode, operands[0],
861: gen_rtx (XOR, DImode, operands[0], operands[3])));
862: emit_insn (gen_rtx (SET, VOIDmode, operands[0],
863: gen_rtx (MINUS, DImode, operands[0], operands[3])));
864: }
865: else
866: {
867: operands[3] =
868: force_reg (DImode, immed_double_const (0, 1 << 31, DImode));
869: emit_insn (gen_rtx (SET, VOIDmode, operands[0],
870: gen_rtx (LSHIFT, DImode, operands[1], operands[2])));
871: emit_insn (gen_rtx (SET, VOIDmode, operands[3],
872: gen_rtx (LSHIFT, DImode, operands[3], operands[2])));
873: emit_insn (gen_rtx (SET, VOIDmode, operands[0],
874: gen_rtx (XOR, DImode, operands[0], operands[3])));
875: emit_insn (gen_rtx (SET, VOIDmode, operands[0],
876: gen_rtx (MINUS, DImode, operands[0], operands[3])));
877: }
878: DONE;
879: }")
880:
881: (define_expand "ashrdi3"
882: [(match_operand:DI 0 "register_operand" "=d")
883: (match_operand:DI 1 "register_operand" "0")
884: (match_operand:SI 2 "nonmemory_operand" "di")]
885: ""
886: "
887: {
888: emit_insn (gen_ashldi3 (operands[0], operands[1],
889: negate_rtx (SImode, operands[2])));
890: DONE;
891: }")
892:
893: (define_insn "lshldi3"
894: [(set (match_operand:DI 0 "register_operand" "=d")
895: (lshift:DI (match_operand:DI 1 "register_operand" "0")
896: (match_operand:SI 2 "nonmemory_operand" "di")))]
897: ""
898: "shf %2,%0")
899:
900: (define_expand "lshrdi3"
901: [(set (match_operand:DI 0 "register_operand" "=d")
902: (lshift:DI (match_operand:DI 1 "register_operand" "0")
903: (match_operand:SI 2 "nonmemory_operand" "di")))]
904: ""
905: "operands[2] = negate_rtx (SImode, operands[2]);")
906:
907: ;; __builtin instructions
908:
909: (define_insn "sqrtdf2"
910: [(set (match_operand:DF 0 "register_operand" "=d")
911: (sqrt:DF (match_operand:DF 1 "register_operand" "0")))]
912: "TARGET_C2"
913: "sqrt.d %0")
914:
915: (define_insn "sqrtsf2"
916: [(set (match_operand:SF 0 "register_operand" "=d")
917: (sqrt:SF (match_operand:SF 1 "register_operand" "0")))]
918: "TARGET_C2"
919: "sqrt.s %0")
920:
921: (define_insn ""
922: [(set (match_operand:SI 0 "register_operand" "=d")
923: (minus:SI (ffs:SI (match_operand:SI 1 "register_operand" "d"))
924: (const_int 1)))]
925: ""
926: "tzc %1,%0\;le.w #32,%0\;jbrs.f .+6\;ld.w #-1,%0")
927:
928: (define_expand "ffssi2"
929: [(set (match_operand:SI 0 "register_operand" "=d")
930: (minus:SI (ffs:SI (match_operand:SI 1 "register_operand" "d"))
931: (const_int 1)))
932: (set (match_dup 0)
933: (plus:SI (match_dup 0)
934: (const_int 1)))]
935: ""
936: "")
937:
938: (define_insn "abssf2"
939: [(set (match_operand:SF 0 "register_operand" "=d")
940: (abs:SF (match_operand:SF 1 "register_operand" "0")))]
941: ""
942: "and #0x7fffffff,%0")
943:
944: (define_expand "absdf2"
945: [(set (subreg:DI (match_operand:DF 0 "register_operand" "=d") 0)
946: (and:DI (subreg:DI (match_operand:DF 1 "register_operand" "d") 0)
947: (match_dup 2)))]
948: ""
949: "operands[2] = force_reg (DImode,
950: immed_double_const (-1, 0x7fffffff, DImode));")
951:
952: (define_insn "jump"
953: [(set (pc)
954: (label_ref (match_operand 0 "" "")))]
955: ""
956: "jbr %l0")
957:
958: (define_insn "beq"
959: [(set (pc)
960: (if_then_else (eq (cc0)
961: (const_int 0))
962: (label_ref (match_operand 0 "" ""))
963: (pc)))]
964: ""
965: "* return gen_cmp (operands[0], \"eq\", 't'); ")
966:
967: (define_insn "bne"
968: [(set (pc)
969: (if_then_else (ne (cc0)
970: (const_int 0))
971: (label_ref (match_operand 0 "" ""))
972: (pc)))]
973: ""
974: "* return gen_cmp (operands[0], \"eq\", 'f'); ")
975:
976: (define_insn "bgt"
977: [(set (pc)
978: (if_then_else (gt (cc0)
979: (const_int 0))
980: (label_ref (match_operand 0 "" ""))
981: (pc)))]
982: ""
983: "* return gen_cmp (operands[0], \"le\", 'f'); ")
984:
985: (define_insn "bgtu"
986: [(set (pc)
987: (if_then_else (gtu (cc0)
988: (const_int 0))
989: (label_ref (match_operand 0 "" ""))
990: (pc)))]
991: ""
992: "* return gen_cmp (operands[0], \"leu\", 'f'); ")
993:
994: (define_insn "blt"
995: [(set (pc)
996: (if_then_else (lt (cc0)
997: (const_int 0))
998: (label_ref (match_operand 0 "" ""))
999: (pc)))]
1000: ""
1001: "* return gen_cmp (operands[0], \"lt\", 't'); ")
1002:
1003: (define_insn "bltu"
1004: [(set (pc)
1005: (if_then_else (ltu (cc0)
1006: (const_int 0))
1007: (label_ref (match_operand 0 "" ""))
1008: (pc)))]
1009: ""
1010: "* return gen_cmp (operands[0], \"ltu\", 't'); ")
1011:
1012: (define_insn "bge"
1013: [(set (pc)
1014: (if_then_else (ge (cc0)
1015: (const_int 0))
1016: (label_ref (match_operand 0 "" ""))
1017: (pc)))]
1018: ""
1019: "* return gen_cmp (operands[0], \"lt\", 'f'); ")
1020:
1021: (define_insn "bgeu"
1022: [(set (pc)
1023: (if_then_else (geu (cc0)
1024: (const_int 0))
1025: (label_ref (match_operand 0 "" ""))
1026: (pc)))]
1027: ""
1028: "* return gen_cmp (operands[0], \"ltu\", 'f'); ")
1029:
1030: (define_insn "ble"
1031: [(set (pc)
1032: (if_then_else (le (cc0)
1033: (const_int 0))
1034: (label_ref (match_operand 0 "" ""))
1035: (pc)))]
1036: ""
1037: "* return gen_cmp (operands[0], \"le\", 't'); ")
1038:
1039: (define_insn "bleu"
1040: [(set (pc)
1041: (if_then_else (leu (cc0)
1042: (const_int 0))
1043: (label_ref (match_operand 0 "" ""))
1044: (pc)))]
1045: ""
1046: "* return gen_cmp (operands[0], \"leu\", 't'); ")
1047:
1048: (define_insn ""
1049: [(set (pc)
1050: (if_then_else (eq (cc0)
1051: (const_int 0))
1052: (pc)
1053: (label_ref (match_operand 0 "" ""))))]
1054: ""
1055: "* return gen_cmp (operands[0], \"eq\", 'f'); ")
1056:
1057: (define_insn ""
1058: [(set (pc)
1059: (if_then_else (ne (cc0)
1060: (const_int 0))
1061: (pc)
1062: (label_ref (match_operand 0 "" ""))))]
1063: ""
1064: "* return gen_cmp (operands[0], \"eq\", 't'); ")
1065:
1066: (define_insn ""
1067: [(set (pc)
1068: (if_then_else (gt (cc0)
1069: (const_int 0))
1070: (pc)
1071: (label_ref (match_operand 0 "" ""))))]
1072: ""
1073: "* return gen_cmp (operands[0], \"le\", 't'); ")
1074:
1075: (define_insn ""
1076: [(set (pc)
1077: (if_then_else (gtu (cc0)
1078: (const_int 0))
1079: (pc)
1080: (label_ref (match_operand 0 "" ""))))]
1081: ""
1082: "* return gen_cmp (operands[0], \"leu\", 't'); ")
1083:
1084: (define_insn ""
1085: [(set (pc)
1086: (if_then_else (lt (cc0)
1087: (const_int 0))
1088: (pc)
1089: (label_ref (match_operand 0 "" ""))))]
1090: ""
1091: "* return gen_cmp (operands[0], \"lt\", 'f'); ")
1092:
1093: (define_insn ""
1094: [(set (pc)
1095: (if_then_else (ltu (cc0)
1096: (const_int 0))
1097: (pc)
1098: (label_ref (match_operand 0 "" ""))))]
1099: ""
1100: "* return gen_cmp (operands[0], \"ltu\", 'f'); ")
1101:
1102: (define_insn ""
1103: [(set (pc)
1104: (if_then_else (ge (cc0)
1105: (const_int 0))
1106: (pc)
1107: (label_ref (match_operand 0 "" ""))))]
1108: ""
1109: "* return gen_cmp (operands[0], \"lt\", 't'); ")
1110:
1111: (define_insn ""
1112: [(set (pc)
1113: (if_then_else (geu (cc0)
1114: (const_int 0))
1115: (pc)
1116: (label_ref (match_operand 0 "" ""))))]
1117: ""
1118: "* return gen_cmp (operands[0], \"ltu\", 't'); ")
1119:
1120: (define_insn ""
1121: [(set (pc)
1122: (if_then_else (le (cc0)
1123: (const_int 0))
1124: (pc)
1125: (label_ref (match_operand 0 "" ""))))]
1126: ""
1127: "* return gen_cmp (operands[0], \"le\", 'f'); ")
1128:
1129: (define_insn ""
1130: [(set (pc)
1131: (if_then_else (leu (cc0)
1132: (const_int 0))
1133: (pc)
1134: (label_ref (match_operand 0 "" ""))))]
1135: ""
1136: "* return gen_cmp (operands[0], \"leu\", 'f'); ")
1137:
1138: ;; - Calls
1139: ;;
1140: ;; arg count word may be omitted to save a push and let gcc try to
1141: ;; combine the arg list pop. RETURN_POPS_ARGS from tm.h decides this.
1142:
1143: (define_insn "call"
1144: [(call (match_operand:QI 0 "general_operand" "g")
1145: (match_operand:SI 1 "general_operand" "g"))]
1146: ""
1147: "*
1148: {
1149: if (! RETURN_POPS_ARGS (ignoreme))
1150: {
1151: if (operands[1] == const0_rtx)
1152: return \"calls %0\";
1153: if (! reg_mentioned_p (arg_pointer_rtx, operands[0]))
1154: return \"mov sp,ap\;calls %0\;ld.w 12(fp),ap\";
1155: operands[0] = XEXP (operands[0], 0);
1156: return \"ld.w %0,a1\;mov sp,ap\;calls (a1)\;ld.w 12(fp),ap\";
1157: }
1158: operands[1] = gen_rtx (CONST_INT, VOIDmode, (INTVAL (operands[1]) + 3)/ 4);
1159: if (! reg_mentioned_p (arg_pointer_rtx, operands[0]))
1160: return \"mov sp,ap\;pshea %a1\;calls %0\;ld.w 12(fp),ap\;add.w #4*%a1+4,sp\";
1161: operands[0] = XEXP (operands[0], 0);
1162: return \"ld.w %0,a1\;mov sp,ap\;pshea %a1\;calls (a1)\;ld.w 12(fp),ap\;add.w #4*%a1+4,sp\";
1163: }")
1164:
1165: (define_insn "call_value"
1166: [(set (match_operand 0 "" "=g")
1167: (call (match_operand:QI 1 "general_operand" "g")
1168: (match_operand:SI 2 "general_operand" "g")))]
1169: ""
1170: "*
1171: {
1172: if (! RETURN_POPS_ARGS (ignoreme))
1173: {
1174: if (operands[2] == const0_rtx)
1175: return \"calls %1\";
1176: if (! reg_mentioned_p (arg_pointer_rtx, operands[1]))
1177: return \"mov sp,ap\;calls %1\;ld.w 12(fp),ap\";
1178: operands[1] = XEXP (operands[1], 0);
1179: return \"ld.w %1,a1\;mov sp,ap\;calls (a1)\;ld.w 12(fp),ap\";
1180: }
1181: operands[2] = gen_rtx (CONST_INT, VOIDmode, (INTVAL (operands[2]) + 3) / 4);
1182: if (! reg_mentioned_p (arg_pointer_rtx, operands[1]))
1183: return \"mov sp,ap\;pshea %a2\;calls %1\;ld.w 12(fp),ap\;add.w #4*%a2+4,sp\";
1184: operands[1] = XEXP (operands[1], 0);
1185: return \"ld.w %1,a1\;mov sp,ap\;pshea %a2\;calls (a1)\;ld.w 12(fp),ap\;add.w #4*%a2+4,sp\";
1186: }")
1187:
1188: (define_insn "return"
1189: [(return)]
1190: ""
1191: "rtn")
1192:
1193: (define_insn "nop"
1194: [(const_int 0)]
1195: ""
1196: "nop")
1197:
1198: (define_insn "tablejump"
1199: [(set (pc) (match_operand:SI 0 "address_operand" "p"))
1200: (use (label_ref (match_operand 1 "" "")))]
1201: ""
1202: "jmp %a0")
1203:
1204: ;; - fix up the code generated for bit field tests
1205:
1206: ;; cc0 = (x >> k1) & k2 --> cc0 = x & (k2 << k1)
1207: ;; cc0 = (x << k1) & k2 --> cc0 = x & (k2 >> k1)
1208: ;; provided k2 and (k2 << k1) don't include the sign bit
1209:
1210: (define_peephole
1211: [(set (match_operand:SI 0 "register_operand" "r")
1212: (lshift:SI (match_dup 0)
1213: (match_operand 1 "immediate_operand" "i")))
1214: (set (match_dup 0)
1215: (and:SI (match_dup 0)
1216: (match_operand 2 "immediate_operand" "i")))
1217: (set (cc0) (match_dup 0))]
1218: "dead_or_set_p (insn, operands[0])
1219: && GET_CODE (operands[1]) == CONST_INT
1220: && GET_CODE (operands[2]) == CONST_INT
1221: && INTVAL (operands[2]) >= 0
1222: && (INTVAL (operands[2]) << INTVAL (operands[1])) >= 0"
1223: "*
1224: {
1225: operands[2] = gen_rtx (CONST_INT, VOIDmode,
1226: INTVAL (operands[2]) >> INTVAL (operands[1]));
1227: output_asm_insn (\"and %2,%0\", operands);
1228: return set_cmp (operands[0], const0_rtx, 'w');
1229: }")
1230:
1231: ;; same as above where x is (y & 0xff...) caused by a zero extend
1232:
1233: (define_peephole
1234: [(set (match_operand:SI 0 "register_operand" "r")
1235: (zero_extend:SI (match_operand 1 "register_operand" "0")))
1236: (set (match_dup 0)
1237: (lshift:SI (match_dup 0)
1238: (match_operand 2 "immediate_operand" "i")))
1239: (set (match_dup 0)
1240: (and:SI (match_dup 0)
1241: (match_operand 3 "immediate_operand" "i")))
1242: (set (cc0) (match_dup 0))]
1243: "dead_or_set_p (insn, operands[0])
1244: && REGNO (operands[0]) == REGNO (operands[1])
1245: && GET_CODE (operands[2]) == CONST_INT
1246: && GET_CODE (operands[3]) == CONST_INT
1247: && (INTVAL (operands[3]) << INTVAL (operands[2])) >= 0"
1248: "*
1249: {
1250: operands[3] = gen_rtx (CONST_INT, VOIDmode,
1251: (INTVAL (operands[3]) >> INTVAL (operands[2])) &
1252: ~((-1) << GET_MODE_BITSIZE (GET_MODE (operands[1]))));
1253: output_asm_insn (\"and %3,%0\", operands);
1254: return set_cmp (operands[0], const0_rtx, 'w');
1255: }")
1256:
1257: ;;- Local variables:
1258: ;;- mode:emacs-lisp
1259: ;;- comment-start: ";;- "
1260: ;;- eval: (set-syntax-table (copy-sequence (syntax-table)))
1261: ;;- eval: (modify-syntax-entry ?[ "(]")
1262: ;;- eval: (modify-syntax-entry ?] ")[")
1263: ;;- eval: (modify-syntax-entry ?{ "(}")
1264: ;;- eval: (modify-syntax-entry ?} "){")
1265: ;;- End:
1266:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.