|
|
1.1 root 1: ;;- Machine description for the pdp11 for GNU C compiler
2: ;; Copyright (C) 1994 Free Software Foundation, Inc.
3: ;; Contributed by Michael K. Gschwind ([email protected]).
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: ;; HI is 16 bit
23: ;; QI is 8 bit
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: ;;- Operand classes for the register allocator:
31:
32: ;; Compare instructions.
33:
34: ;; currently we only support df floats, which saves us quite some
35: ;; hassle switching the FP mode!
36: ;; we assume that CPU is always in long float mode, and
37: ;; 16 bit integer mode - currently, the prologue for main does this,
38: ;; but maybe we should just set up a NEW crt0 properly,
39: ;; -- and what about signal handling code?
40: ;; (we don't even let sf floats in the register file, so
41: ;; we only should have to worry about truncating and widening
42: ;; when going to memory)
43:
44: ;; abort() call by g++ - must define libfunc for cmp_optab
45: ;; and ucmp_optab for mode SImode, because we don't have that!!!
46: ;; - yet since no libfunc is there, we abort ()
47:
48: ;; The only thing that remains to be done then is output
49: ;; the floats in a way the assembler can handle it (and
50: ;; if you're really into it, use a PDP11 float emulation
51: ;; libary to do floating point constant folding - but
52: ;; I guess you'll get reasonable results even when not
53: ;; doing this)
54: ;; the last thing to do is fix the UPDATE_CC macro to check
55: ;; for floating point condition codes, and set cc_status
56: ;; properly, also setting the CC_IN_FCCR flag.
57:
58: ;; define attributes
59: ;; currently type is only fpu or arith or unknown, maybe branch later ?
60: ;; default is arith
61: (define_attr "type" "unknown,arith,fp" (const_string "arith"))
62:
63: ;; length default is 1 word each
64: (define_attr "length" "" (const_int 1))
65:
66: ;; a users asm staement
67: (define_asm_attributes
68: [(set_attr "type" "unknown")
69: ; all bets are off how long it is - make it 256, forces long jumps
70: ; whenever jumping around it !!!
71: (set_attr "length" "256")])
72:
73: ;; define function units
74:
75: ;; arithmetic - values here immediately when next insn issued
76: ;; or does it mean the number of cycles after this insn was issued?
77: ;; how do I say that fpu insns use cpu also? (pre-interaction phase)
78:
79: ;(define_function_unit "cpu" 1 1 (eq_attr "type" "arith") 0 0)
80: ;(define_function_unit "fpu" 1 1 (eq_attr "type" "fp") 0 0)
81:
82: ;; compare
83: (define_insn "cmpdf"
84: [(set (cc0)
85: (compare (match_operand:DF 0 "general_operand" "fR,Q,F")
86: (match_operand:DF 1 "register_operand" "a,a,a")))]
87: "TARGET_FPU"
88: "*
89: {
90: cc_status.flags = CC_IN_FPU;
91: return \"cmpd %0, %1\;cfcc\";
92: }"
93: [(set_attr "length" "2,3,6")])
94:
95: ;; a bit of brain damage, maybe inline later -
96: ;; problem is - gcc seems to NEED SImode because
97: ;; of the cmp weirdness - maybe change gcc to handle this?
98:
99: (define_expand "cmpsi"
100: [(set (reg:SI 0)
101: (match_operand:SI 0 "general_operand" "g"))
102: (set (reg:SI 2)
103: (match_operand:SI 1 "general_operand" "g"))
104: (parallel [(set (cc0)
105: (compare (reg:SI 0)
106: (reg:SI 2)))
107: (clobber (reg:SI 0))])]
108: "0" ;; disable for test
109: "")
110:
111: ;; check for next insn for branch code - does this still
112: ;; work in gcc 2.* ?
113:
114: (define_insn ""
115: [(set (cc0)
116: (compare (reg:SI 0)
117: (reg:SI 2)))
118: (clobber (reg:SI 0))]
119: ""
120: "*
121: {
122: rtx br_insn = NEXT_INSN (insn);
123: RTX_CODE br_code;
124:
125: if (GET_CODE (br_insn) != JUMP_INSN)
126: abort();
127: br_code = GET_CODE (XEXP (XEXP (PATTERN (br_insn), 1), 0));
128:
129: switch(br_code)
130: {
131: case GEU:
132: case LTU:
133: case GTU:
134: case LEU:
135:
136: return \"jsr pc, ___ucmpsi\;cmp $1,r0\";
137:
138: case GE:
139: case LT:
140: case GT:
141: case LE:
142: case EQ:
143: case NE:
144:
145: return \"jsr pc, ___cmpsi\;tst r0\";
146:
147: default:
148:
149: abort();
150: }
151: }"
152: [(set_attr "length" "4")])
153:
154:
155: (define_insn "cmphi"
156: [(set (cc0)
157: (compare (match_operand:HI 0 "general_operand" "rR,rR,Qi,Qi")
158: (match_operand:HI 1 "general_operand" "rR,Qi,rR,Qi")))]
159: ""
160: "cmp %0,%1"
161: [(set_attr "length" "1,2,2,3")])
162:
163: (define_insn "cmpqi"
164: [(set (cc0)
165: (compare (match_operand:QI 0 "general_operand" "rR,rR,Qi,Qi")
166: (match_operand:QI 1 "general_operand" "rR,Qi,rR,Qi")))]
167: ""
168: "cmpb %0,%1"
169: [(set_attr "length" "1,2,2,3")])
170:
171:
172: ;; We have to have this because cse can optimize the previous pattern
173: ;; into this one.
174:
175: (define_insn "tstdf"
176: [(set (cc0)
177: (match_operand:DF 0 "general_operand" "fR,Q"))]
178: "TARGET_FPU"
179: "*
180: {
181: cc_status.flags = CC_IN_FPU;
182: return \"tstd %0\;cfcc\";
183: }"
184: [(set_attr "length" "2,3")])
185:
186:
187: (define_expand "tstsi"
188: [(set (reg:SI 0)
189: (match_operand:SI 0 "general_operand" "g"))
190: (parallel [(set (cc0)
191: (reg:SI 0))
192: (clobber (reg:SI 0))])]
193: "0" ;; disable for test
194: "")
195:
196: (define_insn ""
197: [(set (cc0)
198: (reg:SI 0))
199: (clobber (reg:SI 0))]
200: ""
201: "jsr pc, ___tstsi\;tst r0"
202: [(set_attr "length" "3")])
203:
204:
205: (define_insn "tsthi"
206: [(set (cc0)
207: (match_operand:HI 0 "general_operand" "rR,Q"))]
208: ""
209: "tst %0"
210: [(set_attr "length" "1,2")])
211:
212: (define_insn "tstqi"
213: [(set (cc0)
214: (match_operand:QI 0 "general_operand" "rR,Q"))]
215: ""
216: "tstb %0"
217: [(set_attr "length" "1,2")])
218:
219: ;; sob instruction - we need an assembler which can make this instruction
220: ;; valid under _all_ circumstances!
221:
222: (define_insn ""
223: [(set (pc)
224: (if_then_else
225: (ne (plus:HI (match_operand:HI 0 "register_operand" "r")
226: (const_int -1))
227: (const_int 0))
228: (label_ref (match_operand 1 "" ""))
229: (pc)))
230: (set (match_dup 0)
231: (plus:HI (match_dup 0)
232: (const_int -1)))]
233: "TARGET_40_PLUS"
234: "*
235: {
236: static int labelcount = 0;
237: static char buf[1000];
238:
239: if (get_attr_length (insn) == 1)
240: return \"sob %0, %l1\";
241:
242: /* emulate sob */
243: output_asm_insn (\"dec %0\", operands);
244:
245: sprintf (buf, \"bge LONG_SOB%d\", labelcount);
246: output_asm_insn (buf, NULL);
247:
248: output_asm_insn (\"jmp %l1\", operands);
249:
250: sprintf (buf, \"LONG_SOB%d:\", labelcount++);
251: output_asm_insn (buf, NULL);
252:
253: return \"\";
254: }"
255: [(set (attr "length") (if_then_else (ior (le (minus (match_dup 0)
256: (pc))
257: (const_int -256))
258: (ge (minus (match_dup 0)
259: (pc))
260: (const_int 0)))
261: (const_int 4)
262: (const_int 1)))])
263:
264: ;; These control RTL generation for conditional jump insns
265: ;; and match them for register allocation.
266:
267: ;; problem with too short jump distance! we need an assembler which can
268: ;; make this legal for all jump distances!
269: ;; e.g. gas!
270:
271: ;; these must be changed to check for CC_IN_FCCR if float is to be
272: ;; enabled
273:
274: (define_insn "beq"
275: [(set (pc)
276: (if_then_else (eq (cc0)
277: (const_int 0))
278: (label_ref (match_operand 0 "" ""))
279: (pc)))]
280: ""
281: "* return output_jump(\"beq\", \"bne\", get_attr_length(insn));"
282: [(set (attr "length") (if_then_else (ior (le (minus (match_dup 0)
283: (pc))
284: (const_int -128))
285: (ge (minus (match_dup 0)
286: (pc))
287: (const_int 128)))
288: (const_int 3)
289: (const_int 1)))])
290:
291:
292: (define_insn "bne"
293: [(set (pc)
294: (if_then_else (ne (cc0)
295: (const_int 0))
296: (label_ref (match_operand 0 "" ""))
297: (pc)))]
298: ""
299: "* return output_jump(\"bne\", \"beq\", get_attr_length(insn));"
300: [(set (attr "length") (if_then_else (ior (le (minus (match_dup 0)
301: (pc))
302: (const_int -128))
303: (ge (minus (match_dup 0)
304: (pc))
305: (const_int 128)))
306: (const_int 3)
307: (const_int 1)))])
308:
309: (define_insn "bgt"
310: [(set (pc)
311: (if_then_else (gt (cc0)
312: (const_int 0))
313: (label_ref (match_operand 0 "" ""))
314: (pc)))]
315: ""
316: "* return output_jump(\"bgt\", \"ble\", get_attr_length(insn));"
317: [(set (attr "length") (if_then_else (ior (le (minus (match_dup 0)
318: (pc))
319: (const_int -128))
320: (ge (minus (match_dup 0)
321: (pc))
322: (const_int 128)))
323: (const_int 3)
324: (const_int 1)))])
325:
326: (define_insn "bgtu"
327: [(set (pc)
328: (if_then_else (gtu (cc0)
329: (const_int 0))
330: (label_ref (match_operand 0 "" ""))
331: (pc)))]
332: ""
333: "* return output_jump(\"bhi\", \"blos\", get_attr_length(insn));"
334: [(set (attr "length") (if_then_else (ior (le (minus (match_dup 0)
335: (pc))
336: (const_int -128))
337: (ge (minus (match_dup 0)
338: (pc))
339: (const_int 128)))
340: (const_int 3)
341: (const_int 1)))])
342:
343: (define_insn "blt"
344: [(set (pc)
345: (if_then_else (lt (cc0)
346: (const_int 0))
347: (label_ref (match_operand 0 "" ""))
348: (pc)))]
349: ""
350: "* return output_jump(\"blt\", \"bge\", get_attr_length(insn));"
351: [(set (attr "length") (if_then_else (ior (le (minus (match_dup 0)
352: (pc))
353: (const_int -128))
354: (ge (minus (match_dup 0)
355: (pc))
356: (const_int 128)))
357: (const_int 3)
358: (const_int 1)))])
359:
360:
361: (define_insn "bltu"
362: [(set (pc)
363: (if_then_else (ltu (cc0)
364: (const_int 0))
365: (label_ref (match_operand 0 "" ""))
366: (pc)))]
367: ""
368: "* return output_jump(\"blo\", \"bhos\", get_attr_length(insn));"
369: [(set (attr "length") (if_then_else (ior (le (minus (match_dup 0)
370: (pc))
371: (const_int -128))
372: (ge (minus (match_dup 0)
373: (pc))
374: (const_int 128)))
375: (const_int 3)
376: (const_int 1)))])
377:
378: (define_insn "bge"
379: [(set (pc)
380: (if_then_else (ge (cc0)
381: (const_int 0))
382: (label_ref (match_operand 0 "" ""))
383: (pc)))]
384: ""
385: "* return output_jump(\"bge\", \"blt\", get_attr_length(insn));"
386: [(set (attr "length") (if_then_else (ior (le (minus (match_dup 0)
387: (pc))
388: (const_int -128))
389: (ge (minus (match_dup 0)
390: (pc))
391: (const_int 128)))
392: (const_int 3)
393: (const_int 1)))])
394:
395: (define_insn "bgeu"
396: [(set (pc)
397: (if_then_else (geu (cc0)
398: (const_int 0))
399: (label_ref (match_operand 0 "" ""))
400: (pc)))]
401: ""
402: "* return output_jump(\"bhis\", \"blo\", get_attr_length(insn));"
403: [(set (attr "length") (if_then_else (ior (le (minus (match_dup 0)
404: (pc))
405: (const_int -128))
406: (ge (minus (match_dup 0)
407: (pc))
408: (const_int 128)))
409: (const_int 3)
410: (const_int 1)))])
411:
412: (define_insn "ble"
413: [(set (pc)
414: (if_then_else (le (cc0)
415: (const_int 0))
416: (label_ref (match_operand 0 "" ""))
417: (pc)))]
418: ""
419: "* return output_jump(\"ble\", \"bgt\", get_attr_length(insn));"
420: [(set (attr "length") (if_then_else (ior (le (minus (match_dup 0)
421: (pc))
422: (const_int -128))
423: (ge (minus (match_dup 0)
424: (pc))
425: (const_int 128)))
426: (const_int 3)
427: (const_int 1)))])
428:
429: (define_insn "bleu"
430: [(set (pc)
431: (if_then_else (leu (cc0)
432: (const_int 0))
433: (label_ref (match_operand 0 "" ""))
434: (pc)))]
435: ""
436: "* return output_jump(\"blos\", \"bhi\", get_attr_length(insn));"
437: [(set (attr "length") (if_then_else (ior (le (minus (match_dup 0)
438: (pc))
439: (const_int -128))
440: (ge (minus (match_dup 0)
441: (pc))
442: (const_int 128)))
443: (const_int 3)
444: (const_int 1)))])
445:
446:
447: ;; These match inverted jump insns for register allocation.
448:
449: (define_insn ""
450: [(set (pc)
451: (if_then_else (eq (cc0)
452: (const_int 0))
453: (pc)
454: (label_ref (match_operand 0 "" ""))))]
455: ""
456: "* return output_jump(\"bne\", \"beq\", get_attr_length(insn));"
457: [(set (attr "length") (if_then_else (ior (le (minus (match_dup 0)
458: (pc))
459: (const_int -128))
460: (ge (minus (match_dup 0)
461: (pc))
462: (const_int 128)))
463: (const_int 3)
464: (const_int 1)))])
465:
466: (define_insn ""
467: [(set (pc)
468: (if_then_else (ne (cc0)
469: (const_int 0))
470: (pc)
471: (label_ref (match_operand 0 "" ""))))]
472: ""
473: "* return output_jump(\"beq\", \"bne\", get_attr_length(insn));"
474: [(set (attr "length") (if_then_else (ior (le (minus (match_dup 0)
475: (pc))
476: (const_int -128))
477: (ge (minus (match_dup 0)
478: (pc))
479: (const_int 128)))
480: (const_int 3)
481: (const_int 1)))])
482:
483: (define_insn ""
484: [(set (pc)
485: (if_then_else (gt (cc0)
486: (const_int 0))
487: (pc)
488: (label_ref (match_operand 0 "" ""))))]
489: ""
490: "* return output_jump(\"ble\", \"bgt\", get_attr_length(insn));"
491: [(set (attr "length") (if_then_else (ior (le (minus (match_dup 0)
492: (pc))
493: (const_int -128))
494: (ge (minus (match_dup 0)
495: (pc))
496: (const_int 128)))
497: (const_int 3)
498: (const_int 1)))])
499:
500: (define_insn ""
501: [(set (pc)
502: (if_then_else (gtu (cc0)
503: (const_int 0))
504: (pc)
505: (label_ref (match_operand 0 "" ""))))]
506: ""
507: "* return output_jump(\"blos\", \"bhi\", get_attr_length(insn));"
508: [(set (attr "length") (if_then_else (ior (le (minus (match_dup 0)
509: (pc))
510: (const_int -128))
511: (ge (minus (match_dup 0)
512: (pc))
513: (const_int 128)))
514: (const_int 3)
515: (const_int 1)))])
516:
517: (define_insn ""
518: [(set (pc)
519: (if_then_else (lt (cc0)
520: (const_int 0))
521: (pc)
522: (label_ref (match_operand 0 "" ""))))]
523: ""
524: "* return output_jump(\"bge\", \"blt\", get_attr_length(insn));"
525: [(set (attr "length") (if_then_else (ior (le (minus (match_dup 0)
526: (pc))
527: (const_int -128))
528: (ge (minus (match_dup 0)
529: (pc))
530: (const_int 128)))
531: (const_int 3)
532: (const_int 1)))])
533:
534: (define_insn ""
535: [(set (pc)
536: (if_then_else (ltu (cc0)
537: (const_int 0))
538: (pc)
539: (label_ref (match_operand 0 "" ""))))]
540: ""
541: "* return output_jump(\"bhos\", \"blo\", get_attr_length(insn));"
542: [(set (attr "length") (if_then_else (ior (le (minus (match_dup 0)
543: (pc))
544: (const_int -128))
545: (ge (minus (match_dup 0)
546: (pc))
547: (const_int 128)))
548: (const_int 3)
549: (const_int 1)))])
550:
551: (define_insn ""
552: [(set (pc)
553: (if_then_else (ge (cc0)
554: (const_int 0))
555: (pc)
556: (label_ref (match_operand 0 "" ""))))]
557: ""
558: "* return output_jump(\"blt\", \"bge\", get_attr_length(insn));"
559: [(set (attr "length") (if_then_else (ior (le (minus (match_dup 0)
560: (pc))
561: (const_int -128))
562: (ge (minus (match_dup 0)
563: (pc))
564: (const_int 128)))
565: (const_int 3)
566: (const_int 1)))])
567:
568: (define_insn ""
569: [(set (pc)
570: (if_then_else (geu (cc0)
571: (const_int 0))
572: (pc)
573: (label_ref (match_operand 0 "" ""))))]
574: ""
575: "* return output_jump(\"blo\", \"bhos\", get_attr_length(insn));"
576: [(set (attr "length") (if_then_else (ior (le (minus (match_dup 0)
577: (pc))
578: (const_int -128))
579: (ge (minus (match_dup 0)
580: (pc))
581: (const_int 128)))
582: (const_int 3)
583: (const_int 1)))])
584:
585: (define_insn ""
586: [(set (pc)
587: (if_then_else (le (cc0)
588: (const_int 0))
589: (pc)
590: (label_ref (match_operand 0 "" ""))))]
591: ""
592: "* return output_jump(\"bgt\", \"ble\", get_attr_length(insn));"
593: [(set (attr "length") (if_then_else (ior (le (minus (match_dup 0)
594: (pc))
595: (const_int -128))
596: (ge (minus (match_dup 0)
597: (pc))
598: (const_int 128)))
599: (const_int 3)
600: (const_int 1)))])
601:
602: (define_insn ""
603: [(set (pc)
604: (if_then_else (leu (cc0)
605: (const_int 0))
606: (pc)
607: (label_ref (match_operand 0 "" ""))))]
608: ""
609: "* return output_jump(\"bhi\", \"blos\", get_attr_length(insn));"
610: [(set (attr "length") (if_then_else (ior (le (minus (match_dup 0)
611: (pc))
612: (const_int -128))
613: (ge (minus (match_dup 0)
614: (pc))
615: (const_int 128)))
616: (const_int 3)
617: (const_int 1)))])
618:
619: ;; Move instructions
620:
621: (define_insn "movdi"
622: [(set (match_operand:DI 0 "general_operand" "=g")
623: (match_operand:DI 1 "general_operand" "g"))]
624: ""
625: "* return output_move_quad (operands);"
626: ;; what's the mose expensive code - say twice movsi = 16
627: [(set_attr "length" "16")])
628:
629: (define_insn "movsi"
630: [(set (match_operand:SI 0 "general_operand" "=r,r,r,rm,m")
631: (match_operand:SI 1 "general_operand" "rN,IJ,K,m,r"))]
632: ""
633: "* return output_move_double (operands);"
634: ;; what's the most expensive code ? - I think 8!
635: ;; we could split it up and make several sub-cases...
636: [(set_attr "length" "2,3,4,8,8")])
637:
638: (define_insn "movhi"
639: [(set (match_operand:HI 0 "general_operand" "=rR,rR,Q,Q")
640: (match_operand:HI 1 "general_operand" "rRN,Qi,rRN,Qi"))]
641: ""
642: "*
643: {
644: if (operands[1] == const0_rtx)
645: return \"clr %0\";
646:
647: return \"mov %1, %0\";
648: }"
649: [(set_attr "length" "1,2,2,3")])
650:
651: (define_insn "movqi"
652: [(set (match_operand:QI 0 "general_operand" "=rR,rR,Q,Q")
653: (match_operand:QI 1 "general_operand" "rRN,Qi,rRN,Qi"))]
654: ""
655: "*
656: {
657: if (operands[1] == const0_rtx)
658: return \"clrb %0\";
659:
660: return \"movb %1, %0\";
661: }"
662: [(set_attr "length" "1,2,2,3")])
663:
664: ;; do we have to supply all these moves? e.g. to
665: ;; NO_LOAD_FPU_REGs ?
666: (define_insn "movdf"
667: [(set (match_operand:DF 0 "general_operand" "=f,R,f,Q,f,m")
668: (match_operand:DF 1 "general_operand" "fR,f,Q,f,F,m"))]
669: ""
670: "* return output_move_quad (operands);"
671: ;; just a guess..
672: [(set_attr "length" "1,1,2,2,5,16")])
673:
674: (define_insn "movsf"
675: [(set (match_operand:SF 0 "general_operand" "=g,r,g")
676: (match_operand:SF 1 "general_operand" "r,rmF,g"))]
677: "TARGET_FPU"
678: "* return output_move_double (operands);"
679: [(set_attr "length" "8,8,8")])
680:
681: ;; maybe fiddle a bit with move_ratio, then
682: ;; let contraints only accept a register ...
683:
684: (define_expand "movstrhi"
685: [(parallel [(set (mem:BLK (match_operand:BLK 0 "general_operand" "=g,g"))
686: (mem:BLK (match_operand:BLK 1 "general_operand" "g,g")))
687: (use (match_operand:HI 2 "arith_operand" "n,&mr"))
688: (use (match_operand:HI 3 "immediate_operand" "i,i"))
689: (clobber (match_scratch:HI 4 "=&r,X"))
690: (clobber (match_dup 0))
691: (clobber (match_dup 1))
692: (clobber (match_dup 2))])]
693: "(TARGET_BCOPY_BUILTIN)"
694: "
695: {
696: operands[0] = copy_to_mode_reg (Pmode, XEXP (operands[0], 0));
697: operands[1] = copy_to_mode_reg (Pmode, XEXP (operands[1], 0));
698: operands[2] = force_not_mem (operands[2]);
699: }")
700:
701:
702: (define_insn "" ; "movstrhi"
703: [(set (mem:BLK (match_operand:HI 0 "general_operand" "=r,r"))
704: (mem:BLK (match_operand:HI 1 "general_operand" "r,r")))
705: (use (match_operand:HI 2 "arith_operand" "n,&r"))
706: (use (match_operand:HI 3 "immediate_operand" "i,i"))
707: (clobber (match_scratch:HI 4 "=&r,X"))
708: (clobber (match_dup 0))
709: (clobber (match_dup 1))
710: (clobber (match_dup 2))]
711: "(TARGET_BCOPY_BUILTIN)"
712: "* return output_block_move (operands);"
713: ;;; just a guess
714: [(set_attr "length" "40")])
715:
716:
717:
718: ;;- truncation instructions
719:
720: (define_insn "truncdfsf2"
721: [(set (match_operand:SF 0 "memory_operand" "=R,Q")
722: (float_truncate:SF (match_operand:DF 1 "register_operand" "a,a")))]
723: "TARGET_FPU"
724: "stcdf %1, %0"
725: [(set_attr "length" "1,2")])
726:
727: (define_expand "truncsihi2"
728: [(set (match_operand:HI 0 "general_operand" "=g")
729: (subreg:HI
730: (match_operand:SI 1 "general_operand" "or")
731: 0))]
732: ""
733: "")
734:
735:
736: ;;- zero extension instructions
737:
738: (define_insn "zero_extendqihi2"
739: [(set (match_operand:HI 0 "general_operand" "=r")
740: (zero_extend:HI (match_operand:QI 1 "general_operand" "0")))]
741: ""
742: "bic $(256*255), %0"
743: [(set_attr "length" "2")])
744:
745: (define_expand "zero_extendhisi2"
746: [(set (subreg:HI
747: (match_dup 0)
748: 1)
749: (match_operand:HI 1 "register_operand" "r"))
750: (set (subreg:HI
751: (match_operand:SI 0 "register_operand" "=r")
752: 0)
753: (const_int 0))]
754: ""
755: "/* operands[1] = make_safe_from (operands[1], operands[0]); */")
756:
757:
758: ;;- sign extension instructions
759:
760: (define_insn "extendsfdf2"
761: [(set (match_operand:DF 0 "register_operand" "=a,a")
762: (float_extend:SF (match_operand:SF 1 "memory_operand" "R,Q")))]
763: "TARGET_FPU"
764: "ldcfd %1, %0"
765: [(set_attr "length" "1,2")])
766:
767: ;; does movb sign extend in register-to-register move?
768: (define_insn "extendqihi2"
769: [(set (match_operand:HI 0 "register_operand" "=r,r")
770: (sign_extend:HI (match_operand:QI 1 "general_operand" "rR,Q")))]
771: ""
772: "movb %1, %0"
773: [(set_attr "length" "1,2")])
774:
775: (define_insn "extendqisi2"
776: [(set (match_operand:SI 0 "register_operand" "=r,r")
777: (sign_extend:SI (match_operand:QI 1 "general_operand" "rR,Q")))]
778: "TARGET_40_PLUS"
779: "*
780: {
781: rtx latehalf[2];
782:
783: /* make register pair available */
784: latehalf[0] = operands[0];
785: operands[0] = gen_rtx(REG, HImode, REGNO (operands[0])+1);
786:
787: output_asm_insn(\"movb %1, %0\", operands);
788: output_asm_insn(\"sxt %0\", latehalf);
789:
790: return \"\";
791: }"
792: [(set_attr "length" "2,3")])
793:
794: ;; maybe we have to use define_expand to say that we have the instruction,
795: ;; unconditionally, and then match dependent on CPU type:
796:
797: (define_expand "extendhisi2"
798: [(set (match_operand:SI 0 "general_operand" "=g")
799: (sign_extend:SI (match_operand:HI 1 "general_operand" "g")))]
800: ""
801: "")
802:
803: (define_insn "" ; "extendhisi2"
804: [(set (match_operand:SI 0 "general_operand" "=o,<,r")
805: (sign_extend:SI (match_operand:HI 1 "general_operand" "g,g,g")))]
806: "TARGET_40_PLUS"
807: "*
808: {
809: rtx latehalf[2];
810:
811: /* we don't want to mess with auto increment */
812:
813: switch(which_alternative)
814: {
815: case 0:
816:
817: latehalf[0] = operands[0];
818: operands[0] = adj_offsettable_operand(operands[0], 2);
819:
820: output_asm_insn(\"mov %1, %0\", operands);
821: output_asm_insn(\"sxt %0\", latehalf);
822:
823: return \"\";
824:
825: case 1:
826:
827: /* - auto-decrement - right direction ;-) */
828: output_asm_insn(\"mov %1, %0\", operands);
829: output_asm_insn(\"sxt %0\", operands);
830:
831: return \"\";
832:
833: case 2:
834:
835: /* make register pair available */
836: latehalf[0] = operands[0];
837: operands[0] = gen_rtx(REG, HImode, REGNO (operands[0])+1);
838:
839: output_asm_insn(\"mov %1, %0\", operands);
840: output_asm_insn(\"sxt %0\", latehalf);
841:
842: return \"\";
843:
844: default:
845:
846: abort();
847: }
848: }"
849: [(set_attr "length" "5,3,3")])
850:
851:
852: (define_insn ""
853: [(set (match_operand:SI 0 "register_operand" "=r")
854: (sign_extend:SI (match_operand:HI 1 "general_operand" "0")))]
855: "(! TARGET_40_PLUS)"
856: "*
857: {
858: static count = 0;
859: char buf[100];
860: rtx lateoperands[2];
861:
862: lateoperands[0] = operands[0];
863: operands[0] = gen_rtx(REG, HImode, REGNO (operands[0])+1);
864:
865: output_asm_insn(\"tst %0\", operands);
866: sprintf(buf, \"bge extendhisi%d\", count);
867: output_asm_insn(buf, NULL);
868: output_asm_insn(\"mov -1, %0\", lateoperands);
869: sprintf(buf, \"bne extendhisi%d\", count+1);
870: output_asm_insn(buf, NULL);
871: sprintf(buf, \"\\nextendhisi%d:\", count);
872: output_asm_insn(buf, NULL);
873: output_asm_insn(\"clr %0\", lateoperands);
874: sprintf(buf, \"\\nextendhisi%d:\", count+1);
875: output_asm_insn(buf, NULL);
876:
877: count += 2;
878:
879: return \"\";
880: }"
881: [(set_attr "length" "6")])
882:
883: ;; make float to int and vice versa
884: ;; using the cc_status.flag field we coulf probably cut down
885: ;; on seti and setl
886: ;; assume that we are normally in double and integer mode -
887: ;; what do pdp library routines do to fpu mode ?
888:
889: (define_insn "floatsidf2"
890: [(set (match_operand:DF 0 "register_operand" "=a,a")
891: (float:DF (match_operand:SI 1 "memory_operand" "R,Q")))]
892: "TARGET_FPU"
893: "setl\;ldcld %1, %0\;seti"
894: [(set_attr "length" "3,4")])
895:
896: (define_insn "floathidf2"
897: [(set (match_operand:DF 0 "register_operand" "=a,a")
898: (float:DF (match_operand:HI 1 "general_operand" "rR,Qi")))]
899: "TARGET_FPU"
900: "ldcid %1, %0"
901: [(set_attr "length" "1,2")])
902:
903: ;; cut float to int
904: (define_insn "fix_truncdfsi2"
905: [(set (match_operand:SI 0 "memory_operand" "=R,Q")
906: (fix:SI (fix:DF (match_operand:DF 1 "register_operand" "a,a"))))]
907: "TARGET_FPU"
908: "setl\;stcdl %1, %0\;seti"
909: [(set_attr "length" "3,4")])
910:
911: (define_insn "fix_truncdfhi2"
912: [(set (match_operand:HI 0 "general_operand" "=rR,Q")
913: (fix:HI (fix:DF (match_operand:DF 1 "register_operand" "a,a"))))]
914: "TARGET_FPU"
915: "stcdi %1, %0"
916: [(set_attr "length" "1,2")])
917:
918:
919: ;;- arithmetic instructions
920: ;;- add instructions
921:
922: (define_insn "adddf3"
923: [(set (match_operand:DF 0 "register_operand" "=a,a,a")
924: (plus:DF (match_operand:DF 1 "register_operand" "%0,0,0")
925: (match_operand:DF 2 "general_operand" "fR,Q,F")))]
926: "TARGET_FPU"
927: "addd %2, %0"
928: [(set_attr "length" "1,2,5")])
929:
930: (define_insn "addsi3"
931: [(set (match_operand:SI 0 "general_operand" "=r,r,o,o,r,r,r,o,o,o")
932: (plus:SI (match_operand:SI 1 "general_operand" "%0,0,0,0,0,0,0,0,0,0")
933: (match_operand:SI 2 "general_operand" "r,o,r,o,I,J,K,I,J,K")))]
934: ""
935: "*
936: { /* Here we trust that operands don't overlap
937:
938: or is lateoperands the low word?? - looks like it! */
939:
940: unsigned int i;
941: rtx lateoperands[3];
942:
943: lateoperands[0] = operands[0];
944:
945: if (REG_P (operands[0]))
946: operands[0] = gen_rtx(REG, HImode, REGNO(operands[0]) + 1);
947: else
948: operands[0] = adj_offsettable_operand (operands[0], 2);
949:
950: if (! CONSTANT_P(operands[2]))
951: {
952: lateoperands[2] = operands[2];
953:
954: if (REG_P (operands[2]))
955: operands[2] = gen_rtx(REG, HImode, REGNO(operands[2]) + 1);
956: else
957: operands[2] = adj_offsettable_operand(operands[2], 2);
958:
959: output_asm_insn (\"add %2, %0\", operands);
960: output_asm_insn (\"adc %0\", lateoperands);
961: output_asm_insn (\"add %2, %0\", lateoperands);
962: return \"\";
963: }
964:
965: lateoperands[2] = gen_rtx(CONST_INT, VOIDmode, (INTVAL(operands[2]) >> 16) & 0xffff);
966: operands[2] = gen_rtx(CONST_INT, VOIDmode, INTVAL(operands[2]) & 0xffff);
967:
968: if (INTVAL(operands[2]))
969: {
970: output_asm_insn (\"add %2, %0\", operands);
971: output_asm_insn (\"adc %0\", lateoperands);
972: }
973:
974: if (INTVAL(lateoperands[2]))
975: output_asm_insn (\"add %2, %0\", lateoperands);
976:
977: return \"\";
978: }"
979: [(set_attr "length" "3,5,6,8,3,1,5,5,3,8")])
980:
981: (define_insn "addhi3"
982: [(set (match_operand:HI 0 "general_operand" "=rR,rR,Q,Q")
983: (plus:HI (match_operand:HI 1 "general_operand" "%0,0,0,0")
984: (match_operand:HI 2 "general_operand" "rRLM,Qi,rRLM,Qi")))]
985: ""
986: "*
987: {
988: if (GET_CODE (operands[2]) == CONST_INT)
989: if (INTVAL(operands[2]) == 1)
990: return \"inc %0\";
991: else if (INTVAL(operands[2]) == -1)
992: return \"dec %0\";
993:
994: return \"add %2, %0\";
995: }"
996: [(set_attr "length" "1,2,2,3")])
997:
998: (define_insn "addqi3"
999: [(set (match_operand:QI 0 "general_operand" "=rR,rR,Q,Q")
1000: (plus:QI (match_operand:QI 1 "general_operand" "%0,0,0,0")
1001: (match_operand:QI 2 "general_operand" "rRLM,Qi,rRLM,Qi")))]
1002: ""
1003: "*
1004: {
1005: if (GET_CODE (operands[2]) == CONST_INT)
1006: if (INTVAL(operands[2]) == 1)
1007: return \"incb %0\";
1008: else if (INTVAL(operands[2]) == -1)
1009: return \"decb %0\";
1010:
1011: return \"addb %2, %0\";
1012: }"
1013: [(set_attr "length" "1,2,2,3")])
1014:
1015:
1016: ;;- subtract instructions
1017: ;; we don't have to care for constant second
1018: ;; args, since they are cononical plus:xx now!
1019: ;; also for minus:DF ??
1020:
1021: (define_insn "subdf3"
1022: [(set (match_operand:DF 0 "register_operand" "=a,a")
1023: (minus:DF (match_operand:DF 1 "register_operand" "0,0")
1024: (match_operand:DF 2 "general_operand" "fR,Q")))]
1025: "TARGET_FPU"
1026: "subd %2, %0"
1027: [(set_attr "length" "1,2")])
1028:
1029: (define_insn "subsi3"
1030: [(set (match_operand:SI 0 "general_operand" "=r,r,o,o")
1031: (minus:SI (match_operand:SI 1 "general_operand" "0,0,0,0")
1032: (match_operand:SI 2 "general_operand" "r,o,r,o")))]
1033: ""
1034: "*
1035: { /* Here we trust that operands don't overlap
1036:
1037: or is lateoperands the low word?? - looks like it! */
1038:
1039: unsigned int i;
1040: rtx lateoperands[3];
1041:
1042: lateoperands[0] = operands[0];
1043:
1044: if (REG_P (operands[0]))
1045: operands[0] = gen_rtx(REG, HImode, REGNO(operands[0]) + 1);
1046: else
1047: operands[0] = adj_offsettable_operand (operands[0], 2);
1048:
1049: lateoperands[2] = operands[2];
1050:
1051: if (REG_P (operands[2]))
1052: operands[2] = gen_rtx(REG, HImode, REGNO(operands[2]) + 1);
1053: else
1054: operands[2] = adj_offsettable_operand(operands[2], 2);
1055:
1056: output_asm_insn (\"sub %2, %0\", operands);
1057: output_asm_insn (\"sbc %0\", lateoperands);
1058: output_asm_insn (\"sub %2, %0\", lateoperands);
1059: return \"\";
1060: }"
1061: ;; offsetable memory addresses always are expensive!!!
1062: [(set_attr "length" "3,5,6,8")])
1063:
1064: (define_insn "subhi3"
1065: [(set (match_operand:HI 0 "general_operand" "=rR,rR,Q,Q")
1066: (minus:HI (match_operand:HI 1 "general_operand" "0,0,0,0")
1067: (match_operand:HI 2 "general_operand" "rR,Qi,rR,Qi")))]
1068: ""
1069: "*
1070: {
1071: if (GET_CODE (operands[2]) == CONST_INT)
1072: abort();
1073:
1074: return \"sub %2, %0\";
1075: }"
1076: [(set_attr "length" "1,2,2,3")])
1077:
1078: (define_insn "subqi3"
1079: [(set (match_operand:QI 0 "general_operand" "=rR,rR,Q,Q")
1080: (minus:QI (match_operand:QI 1 "general_operand" "0,0,0,0")
1081: (match_operand:QI 2 "general_operand" "rR,Qi,rR,Qi")))]
1082: ""
1083: "*
1084: {
1085: if (GET_CODE (operands[2]) == CONST_INT)
1086: abort();
1087:
1088: return \"subb %2, %0\";
1089: }"
1090: [(set_attr "length" "1,2,2,3")])
1091:
1092: ;;;;- and instructions
1093: ;; Bit-and on the pdp (like on the vax) is done with a clear-bits insn.
1094: (define_expand "andsi3"
1095: [(set (match_operand:SI 0 "general_operand" "=g")
1096: (and:SI (match_operand:SI 1 "general_operand" "0")
1097: (not:SI (match_operand:SI 2 "general_operand" "g"))))]
1098: ""
1099: "
1100: {
1101: extern rtx expand_unop ();
1102: if (GET_CODE (operands[2]) == CONST_INT)
1103: operands[2] = gen_rtx (CONST_INT, VOIDmode, ~INTVAL (operands[2]));
1104: else
1105: operands[2] = expand_unop (SImode, one_cmpl_optab, operands[2], 0, 1);
1106: }")
1107:
1108: (define_expand "andhi3"
1109: [(set (match_operand:HI 0 "general_operand" "=g")
1110: (and:HI (match_operand:HI 1 "general_operand" "0")
1111: (not:HI (match_operand:HI 2 "general_operand" "g"))))]
1112: ""
1113: "
1114: {
1115: extern rtx expand_unop ();
1116: if (GET_CODE (operands[2]) == CONST_INT)
1117: operands[2] = gen_rtx (CONST_INT, VOIDmode, ~INTVAL (operands[2]));
1118: else
1119: operands[2] = expand_unop (HImode, one_cmpl_optab, operands[2], 0, 1);
1120: }")
1121:
1122: (define_expand "andqi3"
1123: [(set (match_operand:QI 0 "general_operand" "=g")
1124: (and:QI (match_operand:QI 1 "general_operand" "0")
1125: (not:QI (match_operand:QI 2 "general_operand" "g"))))]
1126: ""
1127: "
1128: {
1129: extern rtx expand_unop ();
1130: rtx op = operands[2];
1131: if (GET_CODE (op) == CONST_INT)
1132: operands[2] = gen_rtx (CONST_INT, VOIDmode,
1133: ((1 << 8) - 1) & ~INTVAL (op));
1134: else
1135: operands[2] = expand_unop (QImode, one_cmpl_optab, op, 0, 1);
1136: }")
1137:
1138: (define_insn "andcbsi3"
1139: [(set (match_operand:SI 0 "general_operand" "=r,r,o,o,r,r,r,o,o,o")
1140: (and:SI (match_operand:SI 1 "general_operand" "%0,0,0,0,0,0,0,0,0,0")
1141: (not:SI (match_operand:SI 2 "general_operand" "r,o,r,o,I,J,K,I,J,K"))))]
1142: ""
1143: "*
1144: { /* Here we trust that operands don't overlap
1145:
1146: or is lateoperands the low word?? - looks like it! */
1147:
1148: unsigned int i;
1149: rtx lateoperands[3];
1150:
1151: lateoperands[0] = operands[0];
1152:
1153: if (REG_P (operands[0]))
1154: operands[0] = gen_rtx(REG, HImode, REGNO(operands[0]) + 1);
1155: else
1156: operands[0] = adj_offsettable_operand (operands[0], 2);
1157:
1158: if (! CONSTANT_P(operands[2]))
1159: {
1160: lateoperands[2] = operands[2];
1161:
1162: if (REG_P (operands[2]))
1163: operands[2] = gen_rtx(REG, HImode, REGNO(operands[2]) + 1);
1164: else
1165: operands[2] = adj_offsettable_operand(operands[2], 2);
1166:
1167: output_asm_insn (\"bic %2, %0\", operands);
1168: output_asm_insn (\"bic %2, %0\", lateoperands);
1169: return \"\";
1170: }
1171:
1172: lateoperands[2] = gen_rtx(CONST_INT, VOIDmode, (INTVAL(operands[2]) >> 16) & 0xffff);
1173: operands[2] = gen_rtx(CONST_INT, VOIDmode, INTVAL(operands[2]) & 0xffff);
1174:
1175: /* these have different lengths, so we should have
1176: different constraints! */
1177: if (INTVAL(operands[2]))
1178: output_asm_insn (\"bic %2, %0\", operands);
1179:
1180: if (INTVAL(lateoperands[2]))
1181: output_asm_insn (\"bic %2, %0\", lateoperands);
1182:
1183: return \"\";
1184: }"
1185: [(set_attr "length" "2,4,4,6,2,2,4,3,3,6")])
1186:
1187: (define_insn "andcbhi3"
1188: [(set (match_operand:HI 0 "general_operand" "=rR,rR,Q,Q")
1189: (and:HI (match_operand:HI 1 "general_operand" "0,0,0,0")
1190: (not:HI (match_operand:HI 2 "general_operand" "rR,Qi,rR,Qi"))))]
1191: ""
1192: "bic %2, %0"
1193: [(set_attr "length" "1,2,2,3")])
1194:
1195: (define_insn "andcbqi3"
1196: [(set (match_operand:QI 0 "general_operand" "=rR,rR,Q,Q")
1197: (and:QI (match_operand:QI 1 "general_operand" "0,0,0,0")
1198: (not:QI (match_operand:QI 2 "general_operand" "rR,Qi,rR,Qi"))))]
1199: ""
1200: "bicb %2, %0"
1201: [(set_attr "length" "1,2,2,3")])
1202:
1203: ;;- Bit set (inclusive or) instructions
1204: (define_insn "iorsi3"
1205: [(set (match_operand:SI 0 "general_operand" "=r,r,o,o,r,r,r,o,o,o")
1206: (ior:SI (match_operand:SI 1 "general_operand" "%0,0,0,0,0,0,0,0,0,0")
1207: (match_operand:SI 2 "general_operand" "r,o,r,o,I,J,K,I,J,K")))]
1208: ""
1209: "*
1210: { /* Here we trust that operands don't overlap
1211:
1212: or is lateoperands the low word?? - looks like it! */
1213:
1214: unsigned int i;
1215: rtx lateoperands[3];
1216:
1217: lateoperands[0] = operands[0];
1218:
1219: if (REG_P (operands[0]))
1220: operands[0] = gen_rtx(REG, HImode, REGNO(operands[0]) + 1);
1221: else
1222: operands[0] = adj_offsettable_operand (operands[0], 2);
1223:
1224: if (! CONSTANT_P(operands[2]))
1225: {
1226: lateoperands[2] = operands[2];
1227:
1228: if (REG_P (operands[2]))
1229: operands[2] = gen_rtx(REG, HImode, REGNO(operands[2]) + 1);
1230: else
1231: operands[2] = adj_offsettable_operand(operands[2], 2);
1232:
1233: output_asm_insn (\"bis %2, %0\", operands);
1234: output_asm_insn (\"bis %2, %0\", lateoperands);
1235: return \"\";
1236: }
1237:
1238: lateoperands[2] = gen_rtx(CONST_INT, VOIDmode, (INTVAL(operands[2]) >> 16) & 0xffff);
1239: operands[2] = gen_rtx(CONST_INT, VOIDmode, INTVAL(operands[2]) & 0xffff);
1240:
1241: /* these have different lengths, so we should have
1242: different constraints! */
1243: if (INTVAL(operands[2]))
1244: output_asm_insn (\"bis %2, %0\", operands);
1245:
1246: if (INTVAL(lateoperands[2]))
1247: output_asm_insn (\"bis %2, %0\", lateoperands);
1248:
1249: return \"\";
1250: }"
1251: [(set_attr "length" "2,4,4,6,2,2,4,3,3,6")])
1252:
1253: (define_insn "iorhi3"
1254: [(set (match_operand:HI 0 "general_operand" "=rR,rR,Q,Q")
1255: (ior:HI (match_operand:HI 1 "general_operand" "%0,0,0,0")
1256: (match_operand:HI 2 "general_operand" "rR,Qi,rR,Qi")))]
1257: ""
1258: "bis %2, %0"
1259: [(set_attr "length" "1,2,2,3")])
1260:
1261: (define_insn "iorqi3"
1262: [(set (match_operand:QI 0 "general_operand" "=rR,rR,Q,Q")
1263: (ior:QI (match_operand:QI 1 "general_operand" "%0,0,0,0")
1264: (match_operand:QI 2 "general_operand" "rR,Qi,rR,Qi")))]
1265: ""
1266: "bisb %2, %0")
1267:
1268: ;;- xor instructions
1269: (define_insn "xorsi3"
1270: [(set (match_operand:SI 0 "register_operand" "=r,r,r,r")
1271: (xor:SI (match_operand:SI 1 "register_operand" "%0,0,0,0")
1272: (match_operand:SI 2 "arith_operand" "r,I,J,K")))]
1273: "TARGET_40_PLUS"
1274: "*
1275: { /* Here we trust that operands don't overlap */
1276:
1277: unsigned int i;
1278: rtx lateoperands[3];
1279:
1280: lateoperands[0] = operands[0];
1281: operands[0] = gen_rtx(REG, HImode, REGNO(operands[0]) + 1);
1282:
1283: if (REG_P(operands[2]))
1284: {
1285: lateoperands[2] = operands[2];
1286: operands[2] = gen_rtx(REG, HImode, REGNO(operands[2]) + 1);
1287:
1288: output_asm_insn (\"xor %2, %0\", operands);
1289: output_asm_insn (\"xor %2, %0\", lateoperands);
1290:
1291: return \"\";
1292: }
1293:
1294: lateoperands[2] = gen_rtx(CONST_INT, VOIDmode, (INTVAL(operands[2]) >> 16) & 0xffff);
1295: operands[2] = gen_rtx(CONST_INT, VOIDmode, INTVAL(operands[2]) & 0xffff);
1296:
1297: if (INTVAL(operands[2]))
1298: output_asm_insn (\"xor %2, %0\", operands);
1299:
1300: if (INTVAL(lateoperands[2]))
1301: output_asm_insn (\"xor %2, %0\", lateoperands);
1302:
1303: return \"\";
1304: }"
1305: [(set_attr "length" "2,1,1,2")])
1306:
1307: (define_insn "xorhi3"
1308: [(set (match_operand:HI 0 "general_operand" "=rR,Q")
1309: (xor:HI (match_operand:HI 1 "general_operand" "%0,0")
1310: (match_operand:HI 2 "register_operand" "r,r")))]
1311: "TARGET_40_PLUS"
1312: "xor %2, %0"
1313: [(set_attr "length" "1,2")])
1314:
1315: ;;- one complement instructions
1316:
1317: (define_insn "one_cmplhi2"
1318: [(set (match_operand:HI 0 "general_operand" "=rR,Q")
1319: (not:HI (match_operand:HI 1 "general_operand" "0,0")))]
1320: ""
1321: "com %0"
1322: [(set_attr "length" "1,2")])
1323:
1324: (define_insn "one_cmplqi2"
1325: [(set (match_operand:QI 0 "general_operand" "=rR,Q")
1326: (not:QI (match_operand:QI 1 "general_operand" "0,0")))]
1327: ""
1328: "comb %0"
1329: [(set_attr "length" "1,2")])
1330:
1331: ;;- arithmetic shift instructions
1332: (define_insn "ashlsi3"
1333: [(set (match_operand:SI 0 "register_operand" "=r,r")
1334: (ashift:SI (match_operand:SI 1 "register_operand" "0,0")
1335: (match_operand:HI 2 "general_operand" "rR,Qi")))]
1336: "TARGET_45"
1337: "ashc %2,%0"
1338: [(set_attr "length" "1,2")])
1339:
1340: ;; Arithmetic right shift on the pdp works by negating the shift count.
1341: (define_expand "ashrsi3"
1342: [(set (match_operand:SI 0 "register_operand" "=r")
1343: (ashift:SI (match_operand:SI 1 "register_operand" "0")
1344: (match_operand:HI 2 "general_operand" "g")))]
1345: ""
1346: "
1347: {
1348: operands[2] = negate_rtx (HImode, operands[2]);
1349: }")
1350:
1351: ;; define asl aslb asr asrb - ashc missing!
1352:
1353: ;; asl
1354: (define_insn ""
1355: [(set (match_operand:HI 0 "general_operand" "=rR,Q")
1356: (ashift:HI (match_operand:HI 1 "general_operand" "0,0")
1357: (const_int 1)))]
1358: ""
1359: "asl %0"
1360: [(set_attr "length" "1,2")])
1361:
1362: ;; and another possibility for asr is << -1
1363: ;; might cause problems since -1 can also be encoded as 65535!
1364: ;; not in gcc2 ???
1365:
1366: ;; asr
1367: (define_insn ""
1368: [(set (match_operand:HI 0 "general_operand" "=rR,Q")
1369: (ashift:HI (match_operand:HI 1 "general_operand" "0,0")
1370: (const_int -1)))]
1371: ""
1372: "asr %0"
1373: [(set_attr "length" "1,2")])
1374:
1375: ;; shift is by arbitrary count is expensive,
1376: ;; shift by one cheap - so let's do that, if
1377: ;; space doesn't matter
1378: (define_insn ""
1379: [(set (match_operand:HI 0 "general_operand" "=r")
1380: (ashift:HI (match_operand:HI 1 "general_operand" "0")
1381: (match_operand:HI 2 "expand_shift_operand" "O")))]
1382: "TARGET_TIME"
1383: "*
1384: {
1385: register int i;
1386:
1387: for (i = 1; i <= abs(INTVAL(operands[2])); i++)
1388: if (INTVAL(operands[2]) < 0)
1389: output_asm_insn(\"asr %0\", operands);
1390: else
1391: output_asm_insn(\"asl %0\", operands);
1392:
1393: return \"\";
1394: }"
1395: ;; longest is 4
1396: [(set (attr "length") (const_int 4))])
1397:
1398: ;; aslb
1399: (define_insn ""
1400: [(set (match_operand:QI 0 "general_operand" "=r,o")
1401: (ashift:QI (match_operand:QI 1 "general_operand" "0,0")
1402: (match_operand:HI 2 "const_immediate_operand" "n,n")))]
1403: ""
1404: "*
1405: { /* allowing predec or post_inc is possible, but hairy! */
1406: int i, cnt;
1407:
1408: cnt = INTVAL(operands[2]) & 0x0007;
1409:
1410: for (i=0 ; i < cnt ; i++)
1411: output_asm_insn(\"aslb %0\", operands);
1412:
1413: return \"\";
1414: }"
1415: ;; set attribute length ( match_dup 2 & 7 ) *(1 or 2) !!!
1416: [(set_attr_alternative "length"
1417: [(const_int 7)
1418: (const_int 14)])])
1419:
1420: ;;; asr
1421: ;(define_insn ""
1422: ; [(set (match_operand:HI 0 "general_operand" "=rR,Q")
1423: ; (ashiftrt:HI (match_operand:HI 1 "general_operand" "0,0")
1424: ; (const_int 1)))]
1425: ; ""
1426: ; "asr %0"
1427: ; [(set_attr "length" "1,2")])
1428:
1429: ;; asrb
1430: (define_insn ""
1431: [(set (match_operand:QI 0 "general_operand" "=r,o")
1432: (ashiftrt:QI (match_operand:QI 1 "general_operand" "0,0")
1433: (match_operand:HI 2 "const_immediate_operand" "n,n")))]
1434: ""
1435: "*
1436: { /* allowing predec or post_inc is possible, but hairy! */
1437: int i, cnt;
1438:
1439: cnt = INTVAL(operands[2]) & 0x0007;
1440:
1441: for (i=0 ; i < cnt ; i++)
1442: output_asm_insn(\"asrb %0\", operands);
1443:
1444: return \"\";
1445: }"
1446: [(set_attr_alternative "length"
1447: [(const_int 7)
1448: (const_int 14)])])
1449:
1450: ;; the following is illegal - too complex!!! - just say 14 !!!
1451: ; [(set (attr "length") (plus (and (match_dup 2)
1452: ; (const_int 7))
1453: ; (and (match_dup 2)
1454: ; (const_int 7))))])
1455:
1456:
1457:
1458: ;; can we get +-1 in the next pattern? should
1459: ;; have been caught by previous patterns!
1460:
1461: (define_insn "ashlhi3"
1462: [(set (match_operand:HI 0 "register_operand" "=r,r")
1463: (ashift:HI (match_operand:HI 1 "register_operand" "0,0")
1464: (match_operand:HI 2 "general_operand" "rR,Qi")))]
1465: ""
1466: "*
1467: {
1468: if (GET_CODE(operands[2]) == CONST_INT)
1469: if (INTVAL(operands[2]) == 1)
1470: return \"asl %0\";
1471: else if (INTVAL(operands[2]) == -1)
1472: return \"asr %0\";
1473:
1474: return \"ash %2,%0\";
1475: }"
1476: [(set_attr "length" "1,2")])
1477:
1478: ;; Arithmetic right shift on the pdp works by negating the shift count.
1479: (define_expand "ashrhi3"
1480: [(set (match_operand:HI 0 "register_operand" "=r")
1481: (ashift:HI (match_operand:HI 1 "register_operand" "0")
1482: (match_operand:HI 2 "general_operand" "g")))]
1483: ""
1484: "
1485: {
1486: operands[2] = negate_rtx (HImode, operands[2]);
1487: }")
1488:
1489: ;;;;- logical shift instructions
1490: ;;(define_insn "lshrsi3"
1491: ;; [(set (match_operand:HI 0 "register_operand" "=r")
1492: ;; (lshiftrt:HI (match_operand:HI 1 "register_operand" "0")
1493: ;; (match_operand:HI 2 "arith_operand" "rI")))]
1494: ;; ""
1495: ;; "srl %0,%2")
1496:
1497: ;; absolute
1498:
1499: (define_insn "absdf2"
1500: [(set (match_operand:DF 0 "general_operand" "=fR,Q")
1501: (abs:DF (match_operand:DF 1 "general_operand" "0,0")))]
1502: "TARGET_FPU"
1503: "absd %0"
1504: [(set_attr "length" "1,2")])
1505:
1506: (define_insn "abshi2"
1507: [(set (match_operand:HI 0 "general_operand" "=r,o")
1508: (abs:HI (match_operand:HI 1 "general_operand" "0,0")))]
1509: "TARGET_ABSHI_BUILTIN"
1510: "*
1511: {
1512: static count = 0;
1513: char buf[200];
1514:
1515: output_asm_insn(\"tst %0\", operands);
1516: sprintf(buf, \"bge abshi%d\", count);
1517: output_asm_insn(buf, NULL);
1518: output_asm_insn(\"neg %0\", operands);
1519: sprintf(buf, \"\\nabshi%d:\", count++);
1520: output_asm_insn(buf, NULL);
1521:
1522: return \"\";
1523: }"
1524: [(set_attr "length" "3,5")])
1525:
1526:
1527: ;; define expand abshi - is much better !!! - but
1528: ;; will it be optimized into an abshi2 ?
1529: ;; it will leave better code, because the tsthi might be
1530: ;; optimized away!!
1531: ; -- just a thought - don't have time to check
1532: ;
1533: ;(define_expand "abshi2"
1534: ; [(match_operand:HI 0 "general_operand" "")
1535: ; (match_operand:HI 1 "general_operand" "")]
1536: ; ""
1537: ; "
1538: ;{
1539: ; rtx label = gen_label_rtx ();
1540: ;
1541: ; /* do I need this? */
1542: ; do_pending_stack_adjust ();
1543: ;
1544: ; emit_move_insn (operands[0], operands[1]);
1545: ;
1546: ; emit_insn (gen_tsthi (operands[0]));
1547: ; emit_insn (gen_bge (label1));
1548: ;
1549: ; emit_insn (gen_neghi(operands[0], operands[0])
1550: ;
1551: ; emit_barrier ();
1552: ;
1553: ; emit_label (label);
1554: ;
1555: ; /* allow REG_NOTES to be set on last insn (labels don't have enough
1556: ; fields, and can't be used for REG_NOTES anyway). */
1557: ; emit_insn (gen_rtx (USE, VOIDmode, stack_pointer_rtx));
1558: ; DONE;
1559: ;}")
1560:
1561: ;; negate insns
1562:
1563: (define_insn "negdf2"
1564: [(set (match_operand:DF 0 "general_operand" "=fR,Q")
1565: (neg:DF (match_operand:DF 1 "register_operand" "0,0")))]
1566: "TARGET_FPU"
1567: "negd %0"
1568: [(set_attr "length" "1,2")])
1569:
1570: (define_insn "neghi2"
1571: [(set (match_operand:HI 0 "general_operand" "=rR,Q")
1572: (neg:HI (match_operand:HI 1 "general_operand" "0,0")))]
1573: ""
1574: "neg %0"
1575: [(set_attr "length" "1,2")])
1576:
1577: (define_insn "negqi2"
1578: [(set (match_operand:QI 0 "general_operand" "=rR,Q")
1579: (neg:QI (match_operand:QI 1 "general_operand" "0,0")))]
1580: ""
1581: "negb %0"
1582: [(set_attr "length" "1,2")])
1583:
1584:
1585: ;; Unconditional and other jump instructions
1586: (define_insn "jump"
1587: [(set (pc)
1588: (label_ref (match_operand 0 "" "")))]
1589: ""
1590: "jmp %l0"
1591: [(set_attr "length" "2")])
1592:
1593: (define_insn ""
1594: [(set (pc)
1595: (label_ref (match_operand 0 "" "")))
1596: (clobber (const_int 1))]
1597: ""
1598: "jmp %l0"
1599: [(set_attr "length" "2")])
1600:
1601: (define_insn "tablejump"
1602: [(set (pc) (match_operand:HI 0 "general_operand" "rR,Q"))
1603: (use (label_ref (match_operand 1 "" "")))]
1604: ""
1605: "jmp %0"
1606: [(set_attr "length" "1,2")])
1607:
1608: ;; indirect jump - let's be conservative!
1609: ;; allow only register_operand, even though we could also
1610: ;; allow labels etc.
1611:
1612: (define_insn "indirect_jump"
1613: [(set (pc) (match_operand:HI 0 "register_operand" "r"))]
1614: ""
1615: "jmp (%0)")
1616:
1617: ;;- jump to subroutine
1618:
1619: (define_insn "call"
1620: [(call (match_operand:HI 0 "general_operand" "R,Q")
1621: (match_operand:HI 1 "general_operand" "g,g"))
1622: ;; (use (reg:HI 0)) what was that ???
1623: ]
1624: ;;- Don't use operand 1 for most machines.
1625: ""
1626: "jsr pc, %0"
1627: [(set_attr "length" "1,2")])
1628:
1629: ;;- jump to subroutine
1630: (define_insn "call_value"
1631: [(set (match_operand 0 "" "")
1632: (call (match_operand:HI 1 "general_operand" "R,Q")
1633: (match_operand:HI 2 "general_operand" "g,g")))
1634: ;; (use (reg:HI 0)) - what was that ????
1635: ]
1636: ;;- Don't use operand 2 for most machines.
1637: ""
1638: "jsr pc, %1"
1639: [(set_attr "length" "1,2")])
1640:
1641: ;;- nop instruction
1642: (define_insn "nop"
1643: [(const_int 0)]
1644: ""
1645: "nop")
1646:
1647:
1648: ;;- multiply
1649:
1650: (define_insn "muldf3"
1651: [(set (match_operand:DF 0 "register_operand" "=a,a,a")
1652: (mult:DF (match_operand:DF 1 "register_operand" "%0,0,0")
1653: (match_operand:DF 2 "general_operand" "fR,Q,F")))]
1654: "TARGET_FPU"
1655: "muld %2, %0"
1656: [(set_attr "length" "1,2,5")])
1657:
1658: ;; 16 bit result multiply:
1659: ;; currently we multiply only into odd registers, so we don't use two
1660: ;; registers - but this is a bit inefficient at times. If we define
1661: ;; a register class for each register, then we can specify properly
1662: ;; which register need which scratch register ....
1663:
1664: (define_insn "mulhi3"
1665: [(set (match_operand:HI 0 "register_operand" "=d,d") ; multiply regs
1666: (mult:HI (match_operand:HI 1 "register_operand" "%0,0")
1667: (match_operand:HI 2 "general_operand" "rR,Qi")))]
1668: "TARGET_45"
1669: "mul %2, %0"
1670: [(set_attr "length" "1,2")])
1671:
1672: ;; 32 bit result
1673: (define_insn "mulhisi3"
1674: [(set (match_operand:SI 0 "register_operand" "=r,r") ; even numbered!
1675: (mult:SI (match_operand:HI 1 "register_operand" "%0,0")
1676: (match_operand:HI 2 "general_operand" "rR,Qi")))]
1677: "TARGET_45"
1678: "mul %2, %0"
1679: [(set_attr "length" "1,2")])
1680:
1681: ;;- divide
1682: ;; how can I use the remainder ? -
1683: ;; modsidi and move upper register to lower ????
1684:
1685: (define_insn "divdf3"
1686: [(set (match_operand:DF 0 "register_operand" "=a,a,a")
1687: (div:DF (match_operand:DF 1 "register_operand" "0,0,0")
1688: (match_operand:DF 2 "general_operand" "fR,Q,F")))]
1689: "TARGET_FPU"
1690: "divd %2, %0"
1691: [(set_attr "length" "1,2,5")])
1692:
1693: (define_insn ""
1694: [(set (match_operand:HI 0 "general_operand" "=r,r")
1695: (truncate:HI
1696: (div:SI
1697: (match_operand:SI 1 "general_operand" "0,0")
1698: (sign_extend:SI (match_operand:HI 2 "general_operand" "rR,Q")))))]
1699: "TARGET_45"
1700: "div %2,%0"
1701: [(set_attr "length" "1,2")])
1702:
1703: ;; - problem matching the (sign_extend:SI (const_int ...))
1704: ; used without -O
1705: (define_insn ""
1706: [(set (match_operand:HI 0 "general_operand" "=r")
1707: (truncate:HI
1708: (div:SI
1709: (match_operand:SI 1 "general_operand" "0")
1710: (sign_extend:SI (match_operand 2 "immediate_operand" "n")))))]
1711: "TARGET_45"
1712: "div %2,%0"
1713: [(set_attr "length" "2")])
1714:
1715: ; used with -O
1716: (define_insn ""
1717: [(set (match_operand:HI 0 "general_operand" "=r")
1718: (truncate:HI
1719: (div:SI
1720: (match_operand:SI 1 "general_operand" "0")
1721: (match_operand:SI 2 "immediate_operand" "i"))))]
1722: "TARGET_45"
1723: "div %2,%0"
1724: [(set_attr "length" "2")])
1725:
1726: (define_expand "divhi3"
1727: [(set (match_dup 3)
1728: (sign_extend:SI (match_operand:HI 1 "general_operand" "g")))
1729: (set (match_operand:HI 0 "general_operand" "g")
1730: (truncate:HI
1731: (div:SI
1732: (match_dup 3)
1733: (sign_extend:SI (match_operand:HI 2 "general_operand" "g")))))]
1734: "TARGET_45"
1735: "operands[3] = gen_reg_rtx (SImode);")
1736:
1737: (define_expand "udivqi"
1738: [(set (subreg:HI (match_dup 3) 1)
1739: (zero_extend:HI (match_operand:QI 1 "general_operand" "g")))
1740: (set (subreg:HI (match_dup 3) 0)
1741: (const_int 0))
1742: (set (match_dup 4)
1743: (sign_extend:HI (match_operand:QI 2 "general_operand" "g")))
1744: (set (match_dup 5)
1745: (and:HI (match_dup 4)
1746: (const_int 255)))
1747: (set (match_dup 6)
1748: (truncate:HI
1749: (div:SI
1750: (match_dup 3)
1751: (sign_extend:SI (match_dup 5)))))
1752: (set (match_operand:QI 0 "general_operand" "g")
1753: (truncate:QI (match_dup 6)))]
1754: "TARGET_45"
1755: "
1756: {
1757: operands[3] = gen_reg_rtx (SImode);
1758: operands[4] = gen_reg_rtx (HImode);
1759: operands[5] = gen_reg_rtx (HImode);
1760: operands[6] = gen_reg_rtx (HImode);
1761: }")
1762:
1763: ;; we must restrict it to divide by 15-bit constant...
1764: (define_expand "udivhi3"
1765: [(set (subreg:HI (match_dup 3) 1)
1766: (match_operand:HI 1 "general_operand" "g"))
1767: (set (subreg:HI (match_dup 3) 0)
1768: (const_int 0))
1769: (set (match_operand:HI 0 "general_operand" "g")
1770: (truncate:HI
1771: (div:SI
1772: (match_dup 3)
1773: (sign_extend:SI (match_operand:HI 2 "immediate15_operand" "n")))))]
1774: "TARGET_45"
1775: "
1776: {
1777: operands[3] = gen_reg_rtx (SImode);
1778:
1779: if (GET_CODE (operands[2]) != CONST_INT
1780: || ((INTVAL (operands[2]) & 0x8000) != 0x0000))
1781: FAIL;
1782: }")
1783:
1784: (define_insn ""
1785: [(set (subreg:HI (match_operand:SI 0 "general_operand" "=r,r") 1)
1786: (truncate:HI
1787: (mod:SI
1788: (match_operand:SI 1 "general_operand" "0,0")
1789: (sign_extend:SI (match_operand:HI 2 "nonimmediate_operand" "rR,Q")))))]
1790: "TARGET_45"
1791: "div %2,%0"
1792: [(set_attr "length" "1,2")])
1793:
1794: ;; (sign_extend:SI (const_int ))
1795: ; w/o -O
1796: (define_insn ""
1797: [(set (subreg:HI (match_operand:SI 0 "general_operand" "=r") 1)
1798: (truncate:HI
1799: (mod:SI
1800: (match_operand:SI 1 "general_operand" "0")
1801: (sign_extend:SI (match_operand 2 "immediate_operand" "i")))))]
1802: "TARGET_45"
1803: "div %2,%0"
1804: [(set_attr "length" "2")])
1805: ; w/ -O
1806: (define_insn ""
1807: [(set (subreg:HI (match_operand:SI 0 "general_operand" "=r") 1)
1808: (truncate:HI
1809: (mod:SI
1810: (match_operand:SI 1 "general_operand" "0")
1811: (match_operand:SI 2 "immediate_operand" "i"))))]
1812: "TARGET_45"
1813: "div %2,%0"
1814: [(set_attr "length" "2")])
1815:
1816: (define_expand "modhi3"
1817: [(set (match_dup 3)
1818: (sign_extend:SI (match_operand:HI 1 "general_operand" "g")))
1819: (set (subreg:HI (match_dup 3) 1)
1820: (truncate:HI
1821: (mod:SI
1822: (match_dup 3)
1823: (sign_extend:SI (match_operand:HI 2 "general_operand" "g")))))
1824: (set (match_operand:HI 0 "general_operand" "g")
1825: (subreg:HI (match_dup 3) 1))]
1826: "TARGET_45"
1827: "operands[3] = gen_reg_rtx (SImode);")
1828:
1829: ;; we must restrict it to mod by 15 bit constant
1830: (define_expand "umodhi3"
1831: [(set (subreg:HI (match_dup 3) 0)
1832: (match_operand:HI 1 "general_operand" "g"))
1833: (set (subreg:HI (match_dup 3) 1)
1834: (const_int 0))
1835: (set (subreg:HI (match_dup 3) 1)
1836: (truncate:HI
1837: (mod:SI
1838: (match_dup 3)
1839: (sign_extend:SI (match_operand:HI 2 "immediate15_operand" "n")))))
1840: (set (match_operand:HI 0 "general_operand" "g")
1841: (subreg:HI (match_dup 3) 1))]
1842: "TARGET_45"
1843: "
1844: {
1845: operands[3] = gen_reg_rtx (SImode);
1846:
1847: if (GET_CODE (operands[2]) != CONST_INT
1848: || ((INTVAL (operands[2]) & 0x8000) != 0x0000))
1849: FAIL;
1850: }")
1851:
1852: (define_insn ""
1853: [(set (subreg:HI (match_operand:SI 0 "general_operand" "=r,r") 0)
1854: (truncate:HI
1855: (div:SI
1856: (match_operand:SI 1 "general_operand" "0,0")
1857: (sign_extend:SI (match_operand:HI 2 "nonimmediate_operand" "rR,Q")))))
1858: (set (subreg:HI (match_dup 0) 1)
1859: (truncate:HI
1860: (mod:SI
1861: (match_dup 1)
1862: (sign_extend:SI (match_dup 2)))))]
1863: "TARGET_45"
1864: "div %2, %0"
1865: [(set_attr "length" "1,2")])
1866:
1867: ;; (sign_extend:SI (const_int))
1868: ; w/o -O
1869: (define_insn ""
1870: [(set (subreg:HI (match_operand:SI 0 "general_operand" "=r") 0)
1871: (truncate:HI
1872: (div:SI
1873: (match_operand:SI 1 "general_operand" "0")
1874: (sign_extend:SI (match_operand 2 "immediate_operand" "i")))))
1875: (set (subreg:HI (match_dup 0) 1)
1876: (truncate:HI
1877: (mod:SI
1878: (match_dup 1)
1879: (sign_extend:SI (match_dup 2)))))]
1880: "TARGET_45"
1881: "div %2, %0"
1882: [(set_attr "length" "2")])
1883: ; w/ -O
1884: (define_insn ""
1885: [(set (subreg:HI (match_operand:SI 0 "general_operand" "=r") 0)
1886: (truncate:HI
1887: (div:SI
1888: (match_operand:SI 1 "general_operand" "0")
1889: (match_operand:SI 2 "immediate_operand" "i"))))
1890: (set (subreg:HI (match_dup 0) 1)
1891: (truncate:HI
1892: (mod:SI
1893: (match_dup 1)
1894: (match_dup 2))))]
1895: "TARGET_45"
1896: "div %2, %0"
1897: [(set_attr "length" "2")])
1898:
1899: (define_expand "divmodhi4"
1900: [(set (match_dup 4)
1901: (sign_extend:SI (match_operand:HI 1 "general_operand" "g")))
1902: (set (subreg:HI (match_dup 4) 0)
1903: (truncate:HI
1904: (div:SI
1905: (match_dup 4)
1906: (sign_extend:SI (match_operand:HI 2 "general_operand" "g")))))
1907: (set (subreg:HI (match_dup 4) 1)
1908: (truncate:HI
1909: (mod:SI
1910: (match_dup 4)
1911: (sign_extend:SI (match_dup 2)))))
1912: (set (match_operand:HI 0 "general_operand" "g")
1913: (subreg:HI (match_dup 4) 0))
1914: (set (match_operand:HI 3 "general_operand" "g")
1915: (subreg:HI (match_dup 4) 1))]
1916: "TARGET_45"
1917: "operands[4] = gen_reg_rtx(SImode);")
1918:
1919: (define_expand "udivmodhi4"
1920: [(set (subreg:HI (match_dup 3) 1)
1921: (match_operand:HI 1 "general_operand" "g"))
1922: (set (subreg:HI (match_dup 3) 0)
1923: (const_int 0))
1924: (set (subreg:HI (match_dup 4) 0)
1925: (truncate:HI
1926: (div:SI
1927: (match_dup 4)
1928: (sign_extend:SI (match_operand:HI 2 "immediate15_operand" "n")))))
1929: (set (subreg:HI (match_dup 4) 1)
1930: (truncate:HI
1931: (mod:SI
1932: (match_dup 4)
1933: (sign_extend:SI (match_dup 2)))))
1934: (set (match_operand:HI 0 "general_operand" "g")
1935: (subreg:HI (match_dup 4) 0))
1936: (set (match_operand:HI 3 "general_operand" "g")
1937: (subreg:HI (match_dup 4) 1))]
1938: "TARGET_45"
1939: "
1940: {
1941: operands[3] = gen_reg_rtx (SImode);
1942:
1943: if (GET_CODE (operands[2]) != CONST_INT
1944: || ((INTVAL (operands[2]) & 0x8000) != 0x0000))
1945: FAIL;
1946: }")
1947:
1948: ;; truncate used in div/mod patterns
1949: (define_insn ""
1950: [(set (match_operand:QI 0 "general_operand" "=r,r")
1951: (truncate:QI (match_operand:HI 1 "general_operand" "0,r")))]
1952: "TARGET_45"
1953: "@
1954: ; nop
1955: movb %1, %0"
1956: [(set_attr "length" "0,1")])
1957:
1958: ;; is rotate doing the right thing to be included here ????
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.