|
|
1.1 root 1: ;;- Machine description for Intel 80960 chip for GNU C compiler
2: ;; Copyright (C) 1992 Free Software Foundation, Inc.
3: ;; Contributed by Steven McGeady, Intel Corp.
4: ;; Additional work by Glenn Colon-Bonet, Jonathan Shapiro, Andy Wilson
5: ;; Converted to GCC 2.0 by Jim Wilson and Michael Tiemann, Cygnus Support.
6:
7: ;; This file is part of GNU CC.
8:
9: ;; GNU CC is free software; you can redistribute it and/or modify
10: ;; it under the terms of the GNU General Public License as published by
11: ;; the Free Software Foundation; either version 2, or (at your option)
12: ;; any later version.
13:
14: ;; GNU CC is distributed in the hope that it will be useful,
15: ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
16: ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17: ;; GNU General Public License for more details.
18:
19: ;; You should have received a copy of the GNU General Public License
20: ;; along with GNU CC; see the file COPYING. If not, write to
21: ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
22:
23: ;;- See file "rtl.def" for documentation on define_insn, match_*, et. al.
24:
25: ;; Insn attributes which describe the i960.
26:
27: ;; Modscan is not used, since the compiler never emits any of these insns.
28: (define_attr "type"
29: "move,arith,alu2,mult,div,modscan,load,store,branch,call,address,compare,fpload,fpstore,fpmove,fpcvt,fpcc,fpadd,fpmul,fpdiv,multi,misc"
30: (const_string "arith"))
31:
32: ;; Length (in # of insns).
33: (define_attr "length" ""
34: (cond [(eq_attr "type" "load,fpload")
35: (if_then_else (match_operand 1 "symbolic_memory_operand" "")
36: (const_int 2)
37: (const_int 1))
38: (eq_attr "type" "store,fpstore")
39: (if_then_else (match_operand 0 "symbolic_memory_operand" "")
40: (const_int 2)
41: (const_int 1))
42: (eq_attr "type" "address")
43: (const_int 2)]
44: (const_int 1)))
45:
46: (define_asm_attributes
47: [(set_attr "length" "1")
48: (set_attr "type" "multi")])
49:
50: ;; (define_function_unit {name} {num-units} {n-users} {test}
51: ;; {ready-delay} {busy-delay} [{conflict-list}])
52:
53: ;; The integer ALU
54: (define_function_unit "alu" 2 0 (eq_attr "type" "arith,compare,move,address") 1 0)
55: (define_function_unit "alu" 2 0 (eq_attr "type" "alu2") 2 0)
56: (define_function_unit "alu" 2 0 (eq_attr "type" "mult") 5 0)
57: (define_function_unit "alu" 2 0 (eq_attr "type" "div") 35 0)
58: (define_function_unit "alu" 2 0 (eq_attr "type" "modscan") 3 0)
59:
60: ;; Memory with load-delay of 1 (i.e., 2 cycle load).
61: (define_function_unit "memory" 1 0 (eq_attr "type" "load,fpload") 2 0)
62:
63: ;; Floating point operations.
64: (define_function_unit "fp" 1 2 (eq_attr "type" "fpmove") 5 0)
65: (define_function_unit "fp" 1 2 (eq_attr "type" "fpcvt") 35 0)
66: (define_function_unit "fp" 1 2 (eq_attr "type" "fpcc") 10 0)
67: (define_function_unit "fp" 1 2 (eq_attr "type" "fpadd") 10 0)
68: (define_function_unit "fp" 1 2 (eq_attr "type" "fpmul") 20 0)
69: (define_function_unit "fp" 1 2 (eq_attr "type" "fpdiv") 35 0)
70:
71: ;; Compare instructions.
72: ;; This controls RTL generation and register allocation.
73:
74: ;; We generate RTL for comparisons and branches by having the cmpxx
75: ;; patterns store away the operands. Then, the scc and bcc patterns
76: ;; emit RTL for both the compare and the branch.
77: ;;
78: ;; We start with the DEFINE_EXPANDs, then then DEFINE_INSNs to match
79: ;; the patterns. Finally, we have the DEFINE_SPLITs for some of the scc
80: ;; insns that actually require more than one machine instruction.
81:
82: ;; Put cmpsi first because it is expected to be the most common.
83:
84: (define_expand "cmpsi"
85: [(set (reg:CC 36)
86: (compare:CC (match_operand:SI 0 "nonimmediate_operand" "")
87: (match_operand:SI 1 "general_operand" "")))]
88: ""
89: "
90: {
91: i960_compare_op0 = operands[0];
92: i960_compare_op1 = operands[1];
93: DONE;
94: }")
95:
96: (define_expand "cmpdf"
97: [(set (reg:CC 36)
98: (compare:CC (match_operand:DF 0 "register_operand" "r")
99: (match_operand:DF 1 "nonmemory_operand" "rGH")))]
100: "TARGET_NUMERICS"
101: "
102: {
103: i960_compare_op0 = operands[0];
104: i960_compare_op1 = operands[1];
105: DONE;
106: }")
107:
108: (define_expand "cmpsf"
109: [(set (reg:CC 36)
110: (compare:CC (match_operand:SF 0 "register_operand" "r")
111: (match_operand:SF 1 "nonmemory_operand" "rGH")))]
112: "TARGET_NUMERICS"
113: "
114: {
115: i960_compare_op0 = operands[0];
116: i960_compare_op1 = operands[1];
117: DONE;
118: }")
119:
120: ;; Now the DEFINE_INSNs for the compare and scc cases. First the compares.
121:
122: (define_insn ""
123: [(set (reg:CC 36)
124: (compare:CC (match_operand:SI 0 "register_operand" "d")
125: (match_operand:SI 1 "arith_operand" "dI")))]
126: ""
127: "cmpi %0,%1"
128: [(set_attr "type" "compare")])
129:
130: (define_insn ""
131: [(set (reg:CC_UNS 36)
132: (compare:CC_UNS (match_operand:SI 0 "register_operand" "d")
133: (match_operand:SI 1 "arith_operand" "dI")))]
134: ""
135: "cmpo %0,%1"
136: [(set_attr "type" "compare")])
137:
138: (define_insn ""
139: [(set (reg:CC 36)
140: (compare:CC (match_operand:DF 0 "register_operand" "r")
141: (match_operand:DF 1 "nonmemory_operand" "rGH")))]
142: "TARGET_NUMERICS"
143: "cmprl %0,%1"
144: [(set_attr "type" "fpcc")])
145:
146: (define_insn ""
147: [(set (reg:CC 36)
148: (compare:CC (match_operand:SF 0 "register_operand" "r")
149: (match_operand:SF 1 "nonmemory_operand" "rGH")))]
150: "TARGET_NUMERICS"
151: "cmpr %0,%1"
152: [(set_attr "type" "fpcc")])
153:
154: ;; Instruction definitions for branch-on-bit-set and clear insns.
155:
156: (define_insn ""
157: [(set (pc)
158: (if_then_else
159: (ne (sign_extract:SI (match_operand:SI 1 "register_operand" "d")
160: (const_int 1)
161: (match_operand:SI 2 "arith_operand" "dI"))
162: (const_int 0))
163: (label_ref (match_operand 3 "" ""))
164: (pc)))]
165: ""
166: "bbs %2,%1,%l3"
167: [(set_attr "type" "branch")])
168:
169: (define_insn ""
170: [(set (pc)
171: (if_then_else
172: (eq (sign_extract:SI (match_operand:SI 1 "register_operand" "d")
173: (const_int 1)
174: (match_operand:SI 2 "arith_operand" "dI"))
175: (const_int 0))
176: (label_ref (match_operand 3 "" ""))
177: (pc)))]
178: ""
179: "bbc %2,%1,%l3"
180: [(set_attr "type" "branch")])
181:
182: (define_insn ""
183: [(set (pc)
184: (if_then_else
185: (ne (zero_extract:SI (match_operand:SI 1 "register_operand" "d")
186: (const_int 1)
187: (match_operand:SI 2 "arith_operand" "dI"))
188: (const_int 0))
189: (label_ref (match_operand 3 "" ""))
190: (pc)))]
191: ""
192: "bbs %2,%1,%l3"
193: [(set_attr "type" "branch")])
194:
195: (define_insn ""
196: [(set (pc)
197: (if_then_else
198: (eq (zero_extract:SI (match_operand:SI 1 "register_operand" "d")
199: (const_int 1)
200: (match_operand:SI 2 "arith_operand" "dI"))
201: (const_int 0))
202: (label_ref (match_operand 3 "" ""))
203: (pc)))]
204: ""
205: "bbc %2,%1,%l3"
206: [(set_attr "type" "branch")])
207:
208: ;; ??? These will never match. The LOG_LINKs necessary to make these match
209: ;; are not created by flow. These remain as a reminder to make this work
210: ;; some day.
211:
212: (define_insn ""
213: [(set (reg:CC 36)
214: (compare (match_operand:SI 0 "arith_operand" "d")
215: (match_operand:SI 1 "arith_operand" "d")))
216: (set (match_dup 1) (plus:SI (match_dup 1) (const_int 1)))]
217: "0"
218: "cmpinci %0,%1"
219: [(set_attr "type" "compare")])
220:
221: (define_insn ""
222: [(set (reg:CC_UNS 36)
223: (compare (match_operand:SI 0 "arith_operand" "d")
224: (match_operand:SI 1 "arith_operand" "d")))
225: (set (match_dup 1) (plus:SI (match_dup 1) (const_int 1)))]
226: "0"
227: "cmpinco %0,%1"
228: [(set_attr "type" "compare")])
229:
230: (define_insn ""
231: [(set (reg:CC 36)
232: (compare (match_operand:SI 0 "arith_operand" "d")
233: (match_operand:SI 1 "arith_operand" "d")))
234: (set (match_dup 1) (minus:SI (match_dup 1) (const_int 1)))]
235: "0"
236: "cmpdeci %0,%1"
237: [(set_attr "type" "compare")])
238:
239: (define_insn ""
240: [(set (reg:CC_UNS 36)
241: (compare (match_operand:SI 0 "arith_operand" "d")
242: (match_operand:SI 1 "arith_operand" "d")))
243: (set (match_dup 1) (minus:SI (match_dup 1) (const_int 1)))]
244: "0"
245: "cmpdeco %0,%1"
246: [(set_attr "type" "compare")])
247:
248: ;; Templates to store result of condition.
249: ;; '1' is stored if condition is true.
250: ;; '0' is stored if condition is false.
251: ;; These should use predicate "general_operand", since
252: ;; gcc seems to be creating mem references which use these
253: ;; templates.
254:
255: (define_expand "seq"
256: [(set (match_operand:SI 0 "general_operand" "=d")
257: (eq (match_dup 1) (const_int 0)))]
258: ""
259: "
260: {
261: operands[1] = gen_compare_reg (EQ, i960_compare_op0, i960_compare_op1);
262: }")
263:
264: (define_expand "sne"
265: [(set (match_operand:SI 0 "general_operand" "=d")
266: (ne (match_dup 1) (const_int 0)))]
267: ""
268: "
269: {
270: operands[1] = gen_compare_reg (NE, i960_compare_op0, i960_compare_op1);
271: }")
272:
273: (define_expand "sgt"
274: [(set (match_operand:SI 0 "general_operand" "=d")
275: (gt (match_dup 1) (const_int 0)))]
276: ""
277: "
278: {
279: operands[1] = gen_compare_reg (GT, i960_compare_op0, i960_compare_op1);
280: }")
281:
282: (define_expand "sgtu"
283: [(set (match_operand:SI 0 "general_operand" "=d")
284: (gtu (match_dup 1) (const_int 0)))]
285: ""
286: "
287: {
288: operands[1] = gen_compare_reg (GTU, i960_compare_op0, i960_compare_op1);
289: }")
290:
291: (define_expand "slt"
292: [(set (match_operand:SI 0 "general_operand" "=d")
293: (lt (match_dup 1) (const_int 0)))]
294: ""
295: "
296: {
297: operands[1] = gen_compare_reg (LT, i960_compare_op0, i960_compare_op1);
298: }")
299:
300: (define_expand "sltu"
301: [(set (match_operand:SI 0 "general_operand" "=d")
302: (ltu (match_dup 1) (const_int 0)))]
303: ""
304: "
305: {
306: operands[1] = gen_compare_reg (LTU, i960_compare_op0, i960_compare_op1);
307: }")
308:
309: (define_expand "sge"
310: [(set (match_operand:SI 0 "general_operand" "=d")
311: (ge (match_dup 1) (const_int 0)))]
312: ""
313: "
314: {
315: operands[1] = gen_compare_reg (GE, i960_compare_op0, i960_compare_op1);
316: }")
317:
318: (define_expand "sgeu"
319: [(set (match_operand:SI 0 "general_operand" "=d")
320: (geu (match_dup 1) (const_int 0)))]
321: ""
322: "
323: {
324: operands[1] = gen_compare_reg (GEU, i960_compare_op0, i960_compare_op1);
325: }")
326:
327: (define_expand "sle"
328: [(set (match_operand:SI 0 "general_operand" "=d")
329: (le (match_dup 1) (const_int 0)))]
330: ""
331: "
332: {
333: operands[1] = gen_compare_reg (LE, i960_compare_op0, i960_compare_op1);
334: }")
335:
336: (define_expand "sleu"
337: [(set (match_operand:SI 0 "general_operand" "=d")
338: (leu (match_dup 1) (const_int 0)))]
339: ""
340: "
341: {
342: operands[1] = gen_compare_reg (LEU, i960_compare_op0, i960_compare_op1);
343: }")
344:
345: (define_insn ""
346: [(set (match_operand:SI 0 "general_operand" "=d")
347: (match_operator 1 "comparison_operator" [(reg:CC 36) (const_int 0)]))]
348: ""
349: "test%C1 %0"
350: [(set_attr "type" "compare")])
351:
352: (define_insn ""
353: [(set (match_operand:SI 0 "general_operand" "=d")
354: (match_operator 1 "comparison_operator" [(reg:CC_UNS 36) (const_int 0)]))]
355: ""
356: "test%C1 %0"
357: [(set_attr "type" "compare")])
358:
359: ;; These control RTL generation for conditional jump insns
360: ;; and match them for register allocation.
361:
362: (define_expand "beq"
363: [(set (pc)
364: (if_then_else (eq (match_dup 1)
365: (const_int 0))
366: (label_ref (match_operand 0 "" ""))
367: (pc)))]
368: ""
369: "
370: { operands[1] = gen_compare_reg (EQ, i960_compare_op0, i960_compare_op1); }")
371:
372: (define_expand "bne"
373: [(set (pc)
374: (if_then_else (ne (match_dup 1)
375: (const_int 0))
376: (label_ref (match_operand 0 "" ""))
377: (pc)))]
378: ""
379: "
380: { operands[1] = gen_compare_reg (NE, i960_compare_op0, i960_compare_op1); }")
381:
382: (define_expand "bgt"
383: [(set (pc)
384: (if_then_else (gt (match_dup 1)
385: (const_int 0))
386: (label_ref (match_operand 0 "" ""))
387: (pc)))]
388: ""
389: "
390: { operands[1] = gen_compare_reg (GT, i960_compare_op0, i960_compare_op1); }")
391:
392: (define_expand "bgtu"
393: [(set (pc)
394: (if_then_else (gtu (match_dup 1)
395: (const_int 0))
396: (label_ref (match_operand 0 "" ""))
397: (pc)))]
398: ""
399: "
400: { operands[1] = gen_compare_reg (GTU, i960_compare_op0, i960_compare_op1); }")
401:
402: (define_expand "blt"
403: [(set (pc)
404: (if_then_else (lt (match_dup 1)
405: (const_int 0))
406: (label_ref (match_operand 0 "" ""))
407: (pc)))]
408: ""
409: "
410: { operands[1] = gen_compare_reg (LT, i960_compare_op0, i960_compare_op1); }")
411:
412: (define_expand "bltu"
413: [(set (pc)
414: (if_then_else (ltu (match_dup 1)
415: (const_int 0))
416: (label_ref (match_operand 0 "" ""))
417: (pc)))]
418: ""
419: "
420: { operands[1] = gen_compare_reg (LTU, i960_compare_op0, i960_compare_op1); }")
421:
422: (define_expand "bge"
423: [(set (pc)
424: (if_then_else (ge (match_dup 1)
425: (const_int 0))
426: (label_ref (match_operand 0 "" ""))
427: (pc)))]
428: ""
429: "
430: { operands[1] = gen_compare_reg (GE, i960_compare_op0, i960_compare_op1); }")
431:
432: (define_expand "bgeu"
433: [(set (pc)
434: (if_then_else (geu (match_dup 1)
435: (const_int 0))
436: (label_ref (match_operand 0 "" ""))
437: (pc)))]
438: ""
439: "
440: { operands[1] = gen_compare_reg (GEU, i960_compare_op0, i960_compare_op1); }")
441:
442: (define_expand "ble"
443: [(set (pc)
444: (if_then_else (le (match_dup 1)
445: (const_int 0))
446: (label_ref (match_operand 0 "" ""))
447: (pc)))]
448: ""
449: "
450: { operands[1] = gen_compare_reg (LE, i960_compare_op0, i960_compare_op1); }")
451:
452: (define_expand "bleu"
453: [(set (pc)
454: (if_then_else (leu (match_dup 1)
455: (const_int 0))
456: (label_ref (match_operand 0 "" ""))
457: (pc)))]
458: ""
459: "
460: { operands[1] = gen_compare_reg (LEU, i960_compare_op0, i960_compare_op1); }")
461:
462: ;; Now the normal branch insns (forward and reverse).
463:
464: (define_insn ""
465: [(set (pc)
466: (if_then_else (match_operator 0 "comparison_operator"
467: [(reg:CC 36) (const_int 0)])
468: (label_ref (match_operand 1 "" ""))
469: (pc)))]
470: ""
471: "b%C0 %l1"
472: [(set_attr "type" "branch")])
473:
474: (define_insn ""
475: [(set (pc)
476: (if_then_else (match_operator 0 "comparison_operator"
477: [(reg:CC 36) (const_int 0)])
478: (pc)
479: (label_ref (match_operand 1 "" ""))))]
480: ""
481: "b%I0 %l1"
482: [(set_attr "type" "branch")])
483:
484: (define_insn ""
485: [(set (pc)
486: (if_then_else (match_operator 0 "comparison_operator"
487: [(reg:CC_UNS 36) (const_int 0)])
488: (label_ref (match_operand 1 "" ""))
489: (pc)))]
490: ""
491: "b%C0 %l1"
492: [(set_attr "type" "branch")])
493:
494: (define_insn ""
495: [(set (pc)
496: (if_then_else (match_operator 0 "comparison_operator"
497: [(reg:CC_UNS 36) (const_int 0)])
498: (pc)
499: (label_ref (match_operand 1 "" ""))))]
500: ""
501: "b%I0 %l1"
502: [(set_attr "type" "branch")])
503:
504: (define_insn ""
505: [(set (pc)
506: (if_then_else
507: (match_operator 0 "comparison_operator"
508: [(match_operand:SI 1 "arith_operand" "d")
509: (match_operand:SI 2 "arith_operand" "dI")])
510: (label_ref (match_operand 3 "" ""))
511: (pc)))]
512: ""
513: "cmp%S0%B0%R0 %2,%1,%l3"
514: [(set_attr "type" "branch")])
515:
516: (define_insn ""
517: [(set (pc)
518: (if_then_else
519: (match_operator 0 "comparison_operator"
520: [(match_operand:SI 1 "arith_operand" "d")
521: (match_operand:SI 2 "arith_operand" "dI")])
522: (pc)
523: (label_ref (match_operand 3 "" ""))))]
524: ""
525: "cmp%S0%B0%X0 %2,%1,%l3"
526: [(set_attr "type" "branch")])
527:
528: ;; Normal move instructions.
529: ;; This code is based on the sparc machine desciption.
530:
531: (define_expand "movsi"
532: [(set (match_operand:SI 0 "general_operand" "")
533: (match_operand:SI 1 "general_operand" ""))]
534: ""
535: "
536: {
537: if (emit_move_sequence (operands, SImode))
538: DONE;
539: }")
540:
541: ;; The store case can not be separate, because reload may convert a register
542: ;; to register move insn to a store (or load) insn without rerecognizing
543: ;; the insn.
544:
545: ;; Special pattern for zero stores to memory for functions which don't use
546: ;; the arg pointer.
547:
548: (define_insn ""
549: [(set (match_operand:SI 0 "general_operand" "=d,d,d,m")
550: (match_operand:SI 1 "general_operand" "dI,i,m,dJ"))]
551: "current_function_args_size == 0
552: && (register_operand (operands[0], SImode)
553: || register_operand (operands[1], SImode)
554: || operands[1] == const0_rtx)"
555: "*
556: {
557: switch (which_alternative)
558: {
559: case 0:
560: if (i960_last_insn_type == I_TYPE_REG && TARGET_C_SERIES)
561: {
562: if (GET_CODE (operands[1]) == REG)
563: return \"lda (%1),%0\";
564: else
565: return \"lda %1,%0\";
566: }
567: return \"mov %1,%0\";
568: case 1:
569: return i960_output_ldconst (operands[0], operands[1]);
570: case 2:
571: return \"ld %1,%0\";
572: case 3:
573: if (operands[1] == const0_rtx)
574: return \"st g14,%0\";
575: return \"st %1,%0\";
576: }
577: }"
578: [(set_attr "type" "move,address,load,store")
579: (set_attr "length" "*,3,*,*")])
580:
581: (define_insn ""
582: [(set (match_operand:SI 0 "general_operand" "=d,d,d,m")
583: (match_operand:SI 1 "general_operand" "dI,i,m,d"))]
584: "current_function_args_size != 0
585: && (register_operand (operands[0], SImode)
586: || register_operand (operands[1], SImode))"
587: "*
588: {
589: switch (which_alternative)
590: {
591: case 0:
592: if (i960_last_insn_type == I_TYPE_REG && TARGET_C_SERIES)
593: {
594: if (GET_CODE (operands[1]) == REG)
595: return \"lda (%1),%0\";
596: else
597: return \"lda %1,%0\";
598: }
599: return \"mov %1,%0\";
600: case 1:
601: return i960_output_ldconst (operands[0], operands[1]);
602: case 2:
603: return \"ld %1,%0\";
604: case 3:
605: return \"st %1,%0\";
606: }
607: }"
608: [(set_attr "type" "move,address,load,store")
609: (set_attr "length" "*,3,*,*")])
610:
611: (define_expand "movhi"
612: [(set (match_operand:HI 0 "general_operand" "")
613: (match_operand:HI 1 "general_operand" ""))]
614: ""
615: "
616: {
617: if (emit_move_sequence (operands, HImode))
618: DONE;
619: }")
620:
621: ;; Special pattern for zero stores to memory for functions which don't use
622: ;; the arg pointer.
623:
624: ;; The store case can not be separate. See above.
625: (define_insn ""
626: [(set (match_operand:HI 0 "general_operand" "=d,d,d,m")
627: (match_operand:HI 1 "general_operand" "dI,i,m,dJ"))]
628: "current_function_args_size == 0
629: && (register_operand (operands[0], HImode)
630: || register_operand (operands[1], HImode)
631: || operands[1] == const0_rtx)"
632: "*
633: {
634: switch (which_alternative)
635: {
636: case 0:
637: if (i960_last_insn_type == I_TYPE_REG && TARGET_C_SERIES)
638: {
639: if (GET_CODE (operands[1]) == REG)
640: return \"lda (%1),%0\";
641: else
642: return \"lda %1,%0\";
643: }
644: return \"mov %1,%0\";
645: case 1:
646: return i960_output_ldconst (operands[0], operands[1]);
647: case 2:
648: return \"ldos %1,%0\";
649: case 3:
650: if (operands[1] == const0_rtx)
651: return \"stos g14,%0\";
652: return \"stos %1,%0\";
653: }
654: }"
655: [(set_attr "type" "move,misc,load,store")
656: (set_attr "length" "*,3,*,*")])
657:
658: ;; The store case can not be separate. See above.
659: (define_insn ""
660: [(set (match_operand:HI 0 "general_operand" "=d,d,d,m")
661: (match_operand:HI 1 "general_operand" "dI,i,m,d"))]
662: "current_function_args_size != 0
663: && (register_operand (operands[0], HImode)
664: || register_operand (operands[1], HImode))"
665: "*
666: {
667: switch (which_alternative)
668: {
669: case 0:
670: if (i960_last_insn_type == I_TYPE_REG && TARGET_C_SERIES)
671: {
672: if (GET_CODE (operands[1]) == REG)
673: return \"lda (%1),%0\";
674: else
675: return \"lda %1,%0\";
676: }
677: return \"mov %1,%0\";
678: case 1:
679: return i960_output_ldconst (operands[0], operands[1]);
680: case 2:
681: return \"ldos %1,%0\";
682: case 3:
683: return \"stos %1,%0\";
684: }
685: }"
686: [(set_attr "type" "move,misc,load,store")
687: (set_attr "length" "*,3,*,*")])
688:
689: (define_expand "movqi"
690: [(set (match_operand:QI 0 "general_operand" "")
691: (match_operand:QI 1 "general_operand" ""))]
692: ""
693: "
694: {
695: if (emit_move_sequence (operands, QImode))
696: DONE;
697: }")
698:
699: ;; The store case can not be separate. See comment above.
700: (define_insn ""
701: [(set (match_operand:QI 0 "general_operand" "=d,d,d,m")
702: (match_operand:QI 1 "general_operand" "dI,i,m,dJ"))]
703: "current_function_args_size == 0
704: && (register_operand (operands[0], QImode)
705: || register_operand (operands[1], QImode)
706: || operands[1] == const0_rtx)"
707: "*
708: {
709: switch (which_alternative)
710: {
711: case 0:
712: if (i960_last_insn_type == I_TYPE_REG && TARGET_C_SERIES)
713: {
714: if (GET_CODE (operands[1]) == REG)
715: return \"lda (%1),%0\";
716: else
717: return \"lda %1,%0\";
718: }
719: return \"mov %1,%0\";
720: case 1:
721: return i960_output_ldconst (operands[0], operands[1]);
722: case 2:
723: return \"ldob %1,%0\";
724: case 3:
725: if (operands[1] == const0_rtx)
726: return \"stob g14,%0\";
727: return \"stob %1,%0\";
728: }
729: }"
730: [(set_attr "type" "move,misc,load,store")
731: (set_attr "length" "*,3,*,*")])
732:
733: ;; The store case can not be separate. See comment above.
734: (define_insn ""
735: [(set (match_operand:QI 0 "general_operand" "=d,d,d,m")
736: (match_operand:QI 1 "general_operand" "dI,i,m,d"))]
737: "current_function_args_size != 0
738: && (register_operand (operands[0], QImode)
739: || register_operand (operands[1], QImode))"
740: "*
741: {
742: switch (which_alternative)
743: {
744: case 0:
745: if (i960_last_insn_type == I_TYPE_REG && TARGET_C_SERIES)
746: {
747: if (GET_CODE (operands[1]) == REG)
748: return \"lda (%1),%0\";
749: else
750: return \"lda %1,%0\";
751: }
752: return \"mov %1,%0\";
753: case 1:
754: return i960_output_ldconst (operands[0], operands[1]);
755: case 2:
756: return \"ldob %1,%0\";
757: case 3:
758: return \"stob %1,%0\";
759: }
760: }"
761: [(set_attr "type" "move,misc,load,store")
762: (set_attr "length" "*,3,*,*")])
763:
764: (define_expand "movdi"
765: [(set (match_operand:DI 0 "general_operand" "")
766: (match_operand:DI 1 "general_operand" ""))]
767: ""
768: "
769: {
770: if (emit_move_sequence (operands, DImode))
771: DONE;
772: }")
773:
774: ;; The store case can not be separate. See comment above.
775: (define_insn ""
776: [(set (match_operand:DI 0 "general_operand" "=d,d,d,m")
777: (match_operand:DI 1 "general_operand" "dI,i,m,dJ"))]
778: "current_function_args_size == 0
779: && (register_operand (operands[0], DImode)
780: || register_operand (operands[1], DImode)
781: || operands[1] == const0_rtx)"
782: "*
783: {
784: switch (which_alternative)
785: {
786: case 0:
787: return \"movl %1,%0\";
788: case 1:
789: return i960_output_ldconst (operands[0], operands[1]);
790: case 2:
791: return \"ldl %1,%0\";
792: case 3:
793: if (operands[1] == const0_rtx)
794: return \"st g14,%0\;st g14,4(%0)\";
795: return \"stl %1,%0\";
796: }
797: }"
798: [(set_attr "type" "move,load,load,store")])
799:
800: ;; The store case can not be separate. See comment above.
801: (define_insn ""
802: [(set (match_operand:DI 0 "general_operand" "=d,d,d,m")
803: (match_operand:DI 1 "general_operand" "dI,i,m,d"))]
804: "current_function_args_size != 0
805: && (register_operand (operands[0], DImode)
806: || register_operand (operands[1], DImode))"
807: "*
808: {
809: switch (which_alternative)
810: {
811: case 0:
812: return \"movl %1,%0\";
813: case 1:
814: return i960_output_ldconst (operands[0], operands[1]);
815: case 2:
816: return \"ldl %1,%0\";
817: case 3:
818: return \"stl %1,%0\";
819: }
820: }"
821: [(set_attr "type" "move,load,load,store")])
822:
823: (define_expand "movti"
824: [(set (match_operand:TI 0 "general_operand" "")
825: (match_operand:TI 1 "general_operand" ""))]
826: ""
827: "
828: {
829: if (emit_move_sequence (operands, TImode))
830: DONE;
831: }")
832:
833: ;; The store case can not be separate. See comment above.
834: (define_insn ""
835: [(set (match_operand:TI 0 "general_operand" "=d,d,d,m")
836: (match_operand:TI 1 "general_operand" "dI,i,m,dJ"))]
837: "current_function_args_size == 0
838: && (register_operand (operands[0], TImode)
839: || register_operand (operands[1], TImode)
840: || operands[1] == const0_rtx)"
841: "*
842: {
843: switch (which_alternative)
844: {
845: case 0:
846: return \"movq %1,%0\";
847: case 1:
848: return i960_output_ldconst (operands[0], operands[1]);
849: case 2:
850: return \"ldq %1,%0\";
851: case 3:
852: if (operands[1] == const0_rtx)
853: return \"st g14,%0\;st g14,4(%0)\;st g14,8(%0)\;st g14,12(%0)\";
854: return \"stq %1,%0\";
855: }
856: }"
857: [(set_attr "type" "move,load,load,store")])
858:
859: ;; The store case can not be separate. See comment above.
860: (define_insn ""
861: [(set (match_operand:TI 0 "general_operand" "=d,d,d,m")
862: (match_operand:TI 1 "general_operand" "dI,i,m,d"))]
863: "current_function_args_size != 0
864: && (register_operand (operands[0], TImode)
865: || register_operand (operands[1], TImode))"
866: "*
867: {
868: switch (which_alternative)
869: {
870: case 0:
871: return \"movq %1,%0\";
872: case 1:
873: return i960_output_ldconst (operands[0], operands[1]);
874: case 2:
875: return \"ldq %1,%0\";
876: case 3:
877: return \"stq %1,%0\";
878: }
879: }"
880: [(set_attr "type" "move,load,load,store")])
881:
882: (define_expand "store_multiple"
883: [(set (match_operand:SI 0 "" "") ;;- dest
884: (match_operand:SI 1 "" "")) ;;- src
885: (use (match_operand:SI 2 "" ""))] ;;- nregs
886: ""
887: "
888: {
889: int regno;
890: int count;
891: rtx from;
892: int i;
893:
894: if (GET_CODE (operands[0]) != MEM
895: || GET_CODE (operands[1]) != REG
896: || GET_CODE (operands[2]) != CONST_INT)
897: FAIL;
898:
899: count = INTVAL (operands[2]);
900: if (count > 12)
901: FAIL;
902:
903: regno = REGNO (operands[1]);
904: from = memory_address (SImode, XEXP (operands[0], 0));
905: while (count >= 4 && ((regno & 3) == 0))
906: {
907: emit_insn (gen_rtx (SET, VOIDmode,
908: gen_rtx (MEM, TImode, from),
909: gen_rtx (REG, TImode, regno)));
910: count -= 4;
911: regno += 4;
912: from = memory_address (TImode, plus_constant (from, 16));
913: }
914: while (count >= 2 && ((regno & 1) == 0))
915: {
916: emit_insn (gen_rtx (SET, VOIDmode,
917: gen_rtx (MEM, DImode, from),
918: gen_rtx (REG, DImode, regno)));
919: count -= 2;
920: regno += 2;
921: from = memory_address (DImode, plus_constant (from, 8));
922: }
923: while (count > 0)
924: {
925: emit_insn (gen_rtx (SET, VOIDmode,
926: gen_rtx (MEM, SImode, from),
927: gen_rtx (REG, SImode, regno)));
928: count -= 1;
929: regno += 1;
930: from = memory_address (SImode, plus_constant (from, 4));
931: }
932: DONE;
933: }")
934:
935: ;; Floating point move insns
936:
937: (define_expand "movdf"
938: [(set (match_operand:DF 0 "general_operand" "")
939: (match_operand:DF 1 "fpmove_src_operand" ""))]
940: ""
941: "
942: {
943: if (emit_move_sequence (operands, DFmode))
944: DONE;
945: }")
946:
947: (define_insn ""
948: [(set (match_operand:DF 0 "general_operand" "=r,f,d,d,m")
949: (match_operand:DF 1 "fpmove_src_operand" "r,GH,F,m,dG"))]
950: "current_function_args_size == 0
951: && (register_operand (operands[0], DFmode)
952: || register_operand (operands[1], DFmode)
953: || operands[1] == CONST0_RTX (DFmode))"
954: "*
955: {
956: switch (which_alternative)
957: {
958: case 0:
959: if (FP_REG_P (operands[0]) || FP_REG_P (operands[1]))
960: return \"movrl %1,%0\";
961: else
962: return \"movl %1,%0\";
963: case 1:
964: return \"movrl %1,%0\";
965: case 2:
966: return i960_output_ldconst (operands[0], operands[1]);
967: case 3:
968: return \"ldl %1,%0\";
969: case 4:
970: if (operands[1] == CONST0_RTX (DFmode))
971: return \"st g14,%0\;st g14,4(%0)\";
972: return \"stl %1,%0\";
973: }
974: }"
975: [(set_attr "type" "move,move,load,fpload,fpstore")])
976:
977: (define_insn ""
978: [(set (match_operand:DF 0 "general_operand" "=r,f,d,d,m")
979: (match_operand:DF 1 "fpmove_src_operand" "r,GH,F,m,d"))]
980: "current_function_args_size != 0
981: && (register_operand (operands[0], DFmode)
982: || register_operand (operands[1], DFmode))"
983: "*
984: {
985: switch (which_alternative)
986: {
987: case 0:
988: if (FP_REG_P (operands[0]) || FP_REG_P (operands[1]))
989: return \"movrl %1,%0\";
990: else
991: return \"movl %1,%0\";
992: case 1:
993: return \"movrl %1,%0\";
994: case 2:
995: return i960_output_ldconst (operands[0], operands[1]);
996: case 3:
997: return \"ldl %1,%0\";
998: case 4:
999: return \"stl %1,%0\";
1000: }
1001: }"
1002: [(set_attr "type" "move,move,load,fpload,fpstore")])
1003:
1004: (define_expand "movsf"
1005: [(set (match_operand:SF 0 "general_operand" "")
1006: (match_operand:SF 1 "fpmove_src_operand" ""))]
1007: ""
1008: "
1009: {
1010: if (emit_move_sequence (operands, SFmode))
1011: DONE;
1012: }")
1013:
1014: (define_insn ""
1015: [(set (match_operand:SF 0 "general_operand" "=r,f,d,d,m")
1016: (match_operand:SF 1 "fpmove_src_operand" "r,GH,F,m,dG"))]
1017: "current_function_args_size == 0
1018: && (register_operand (operands[0], SFmode)
1019: || register_operand (operands[1], SFmode)
1020: || operands[1] == CONST0_RTX (SFmode))"
1021: "*
1022: {
1023: switch (which_alternative)
1024: {
1025: case 0:
1026: if (FP_REG_P (operands[0]) || FP_REG_P (operands[1]))
1027: return \"movr %1,%0\";
1028: else
1029: return \"mov %1,%0\";
1030: case 1:
1031: return \"movr %1,%0\";
1032: case 2:
1033: return i960_output_ldconst (operands[0], operands[1]);
1034: case 3:
1035: return \"ld %1,%0\";
1036: case 4:
1037: if (operands[1] == CONST0_RTX (SFmode))
1038: return \"st g14,%0\";
1039: return \"st %1,%0\";
1040: }
1041: }"
1042: [(set_attr "type" "move,move,load,fpload,fpstore")])
1043:
1044: (define_insn ""
1045: [(set (match_operand:SF 0 "general_operand" "=r,f,d,d,m")
1046: (match_operand:SF 1 "fpmove_src_operand" "r,GH,F,m,d"))]
1047: "current_function_args_size != 0
1048: && (register_operand (operands[0], SFmode)
1049: || register_operand (operands[1], SFmode))"
1050: "*
1051: {
1052: switch (which_alternative)
1053: {
1054: case 0:
1055: if (FP_REG_P (operands[0]) || FP_REG_P (operands[1]))
1056: return \"movr %1,%0\";
1057: else
1058: return \"mov %1,%0\";
1059: case 1:
1060: return \"movr %1,%0\";
1061: case 2:
1062: return i960_output_ldconst (operands[0], operands[1]);
1063: case 3:
1064: return \"ld %1,%0\";
1065: case 4:
1066: return \"st %1,%0\";
1067: }
1068: }"
1069: [(set_attr "type" "move,move,load,fpload,fpstore")])
1070:
1071: ;; Mixed-mode moves with sign and zero-extension.
1072:
1073: ;; Note that the one starting from HImode comes before those for QImode
1074: ;; so that a constant operand will match HImode, not QImode.
1075:
1076: (define_expand "extendhisi2"
1077: [(set (match_operand:SI 0 "register_operand" "")
1078: (sign_extend:SI
1079: (match_operand:HI 1 "nonimmediate_operand" "")))]
1080: ""
1081: "
1082: {
1083: if (GET_CODE (operand1) == REG
1084: || (GET_CODE (operand1) == SUBREG
1085: && GET_CODE (XEXP (operand1, 0)) == REG))
1086: {
1087: rtx temp = gen_reg_rtx (SImode);
1088: rtx shift_16 = gen_rtx (CONST_INT, VOIDmode, 16);
1089: int op1_subreg_word = 0;
1090:
1091: if (GET_CODE (operand1) == SUBREG)
1092: {
1093: op1_subreg_word = SUBREG_WORD (operand1);
1094: operand1 = SUBREG_REG (operand1);
1095: }
1096: operand1 = gen_rtx (SUBREG, SImode, operand1, op1_subreg_word);
1097:
1098: emit_insn (gen_ashlsi3 (temp, operand1, shift_16));
1099: emit_insn (gen_ashrsi3 (operand0, temp, shift_16));
1100: DONE;
1101: }
1102: }")
1103:
1104: (define_insn ""
1105: [(set (match_operand:SI 0 "register_operand" "=d")
1106: (sign_extend:SI (match_operand:HI 1 "memory_operand" "m")))]
1107: ""
1108: "ldis %1,%0"
1109: [(set_attr "type" "load")])
1110:
1111: (define_expand "extendqisi2"
1112: [(set (match_operand:SI 0 "register_operand" "")
1113: (sign_extend:SI (match_operand:QI 1 "nonimmediate_operand" "")))]
1114: ""
1115: "
1116: {
1117: if (GET_CODE (operand1) == REG
1118: || (GET_CODE (operand1) == SUBREG
1119: && GET_CODE (XEXP (operand1, 0)) == REG))
1120: {
1121: rtx temp = gen_reg_rtx (SImode);
1122: rtx shift_24 = gen_rtx (CONST_INT, VOIDmode, 24);
1123: int op1_subreg_word = 0;
1124:
1125: if (GET_CODE (operand1) == SUBREG)
1126: {
1127: op1_subreg_word = SUBREG_WORD (operand1);
1128: operand1 = SUBREG_REG (operand1);
1129: }
1130: operand1 = gen_rtx (SUBREG, SImode, operand1, op1_subreg_word),
1131:
1132: emit_insn (gen_ashlsi3 (temp, operand1, shift_24));
1133: emit_insn (gen_ashrsi3 (operand0, temp, shift_24));
1134: DONE;
1135: }
1136: }")
1137:
1138: (define_insn ""
1139: [(set (match_operand:SI 0 "register_operand" "=d")
1140: (sign_extend:SI (match_operand:QI 1 "memory_operand" "m")))]
1141: ""
1142: "ldib %1,%0"
1143: [(set_attr "type" "load")])
1144:
1145: (define_expand "extendqihi2"
1146: [(set (match_operand:HI 0 "register_operand" "")
1147: (sign_extend:HI
1148: (match_operand:QI 1 "nonimmediate_operand" "")))]
1149: ""
1150: "
1151: {
1152: if (GET_CODE (operand1) == REG
1153: || (GET_CODE (operand1) == SUBREG
1154: && GET_CODE (XEXP (operand1, 0)) == REG))
1155: {
1156: rtx temp = gen_reg_rtx (SImode);
1157: rtx shift_24 = gen_rtx (CONST_INT, VOIDmode, 24);
1158: int op0_subreg_word = 0;
1159: int op1_subreg_word = 0;
1160:
1161: if (GET_CODE (operand1) == SUBREG)
1162: {
1163: op1_subreg_word = SUBREG_WORD (operand1);
1164: operand1 = SUBREG_REG (operand1);
1165: }
1166: operand1 = gen_rtx (SUBREG, SImode, operand1, op1_subreg_word);
1167:
1168: if (GET_CODE (operand0) == SUBREG)
1169: {
1170: op0_subreg_word = SUBREG_WORD (operand0);
1171: operand0 = SUBREG_REG (operand0);
1172: }
1173: if (GET_MODE (operand0) != SImode)
1174: operand0 = gen_rtx (SUBREG, SImode, operand0, op0_subreg_word);
1175:
1176: emit_insn (gen_ashlsi3 (temp, operand1, shift_24));
1177: emit_insn (gen_ashrsi3 (operand0, temp, shift_24));
1178: DONE;
1179: }
1180: }")
1181:
1182: (define_insn ""
1183: [(set (match_operand:HI 0 "register_operand" "=d")
1184: (sign_extend:HI (match_operand:QI 1 "memory_operand" "m")))]
1185: ""
1186: "ldib %1,%0"
1187: [(set_attr "type" "load")])
1188:
1189: (define_expand "zero_extendhisi2"
1190: [(set (match_operand:SI 0 "register_operand" "")
1191: (zero_extend:SI
1192: (match_operand:HI 1 "nonimmediate_operand" "")))]
1193: ""
1194: "
1195: {
1196: if (GET_CODE (operand1) == REG
1197: || (GET_CODE (operand1) == SUBREG
1198: && GET_CODE (XEXP (operand1, 0)) == REG))
1199: {
1200: rtx temp = gen_reg_rtx (SImode);
1201: rtx shift_16 = gen_rtx (CONST_INT, VOIDmode, 16);
1202: int op1_subreg_word = 0;
1203:
1204: if (GET_CODE (operand1) == SUBREG)
1205: {
1206: op1_subreg_word = SUBREG_WORD (operand1);
1207: operand1 = SUBREG_REG (operand1);
1208: }
1209: operand1 = gen_rtx (SUBREG, SImode, operand1, op1_subreg_word);
1210:
1211: emit_insn (gen_ashlsi3 (temp, operand1, shift_16));
1212: emit_insn (gen_lshrsi3 (operand0, temp, shift_16));
1213: DONE;
1214: }
1215: }")
1216:
1217: (define_insn ""
1218: [(set (match_operand:SI 0 "register_operand" "=d")
1219: (zero_extend:SI (match_operand:HI 1 "memory_operand" "m")))]
1220: ""
1221: "ldos %1,%0"
1222: [(set_attr "type" "load")])
1223:
1224: ;; Using shifts here generates much better code than doing an `and 255'.
1225: ;; This is mainly because the `and' requires loading the constant separately,
1226: ;; the constant is likely to get optimized, and then the compiler can't
1227: ;; optimize the `and' because it doesn't know that one operand is a constant.
1228:
1229: (define_expand "zero_extendqisi2"
1230: [(set (match_operand:SI 0 "register_operand" "")
1231: (zero_extend:SI (match_operand:QI 1 "nonimmediate_operand" "")))]
1232: ""
1233: "
1234: {
1235: if (GET_CODE (operand1) == REG
1236: || (GET_CODE (operand1) == SUBREG
1237: && GET_CODE (XEXP (operand1, 0)) == REG))
1238: {
1239: rtx temp = gen_reg_rtx (SImode);
1240: rtx shift_24 = gen_rtx (CONST_INT, VOIDmode, 24);
1241: int op1_subreg_word = 0;
1242:
1243: if (GET_CODE (operand1) == SUBREG)
1244: {
1245: op1_subreg_word = SUBREG_WORD (operand1);
1246: operand1 = SUBREG_REG (operand1);
1247: }
1248: operand1 = gen_rtx (SUBREG, SImode, operand1, op1_subreg_word);
1249:
1250: emit_insn (gen_ashlsi3 (temp, operand1, shift_24));
1251: emit_insn (gen_lshrsi3 (operand0, temp, shift_24));
1252: DONE;
1253: }
1254: }")
1255:
1256: (define_insn ""
1257: [(set (match_operand:SI 0 "register_operand" "=d")
1258: (zero_extend:SI (match_operand:QI 1 "memory_operand" "m")))]
1259: ""
1260: "ldob %1,%0"
1261: [(set_attr "type" "load")])
1262:
1263: (define_expand "zero_extendqihi2"
1264: [(set (match_operand:HI 0 "register_operand" "")
1265: (zero_extend:HI
1266: (match_operand:QI 1 "nonimmediate_operand" "")))]
1267: ""
1268: "
1269: {
1270: if (GET_CODE (operand1) == REG
1271: || (GET_CODE (operand1) == SUBREG
1272: && GET_CODE (XEXP (operand1, 0)) == REG))
1273: {
1274: rtx temp = gen_reg_rtx (SImode);
1275: rtx shift_24 = gen_rtx (CONST_INT, VOIDmode, 24);
1276: int op0_subreg_word = 0;
1277: int op1_subreg_word = 0;
1278:
1279: if (GET_CODE (operand1) == SUBREG)
1280: {
1281: op1_subreg_word = SUBREG_WORD (operand1);
1282: operand1 = SUBREG_REG (operand1);
1283: }
1284: operand1 = gen_rtx (SUBREG, SImode, operand1, op1_subreg_word);
1285:
1286: if (GET_CODE (operand0) == SUBREG)
1287: {
1288: op0_subreg_word = SUBREG_WORD (operand0);
1289: operand0 = SUBREG_REG (operand0);
1290: }
1291: if (GET_MODE (operand0) != SImode)
1292: operand0 = gen_rtx (SUBREG, SImode, operand0, op0_subreg_word);
1293:
1294: emit_insn (gen_ashlsi3 (temp, operand1, shift_24));
1295: emit_insn (gen_lshrsi3 (operand0, temp, shift_24));
1296: DONE;
1297: }
1298: }")
1299:
1300: (define_insn ""
1301: [(set (match_operand:HI 0 "register_operand" "=d")
1302: (zero_extend:HI (match_operand:QI 1 "memory_operand" "m")))]
1303: ""
1304: "ldob %1,%0"
1305: [(set_attr "type" "load")])
1306:
1307: ;; Conversions between float and double.
1308:
1309: (define_insn "extendsfdf2"
1310: [(set (match_operand:DF 0 "register_operand" "=f,d")
1311: (float_extend:DF (match_operand:SF 1 "fp_arith_operand" "dGH,fGH")))]
1312: "TARGET_NUMERICS"
1313: "@
1314: movr %1,%0
1315: movrl %1,%0"
1316: [(set_attr "type" "fpmove")])
1317:
1318: (define_insn "truncdfsf2"
1319: [(set (match_operand:SF 0 "register_operand" "=d")
1320: (float_truncate:SF
1321: (match_operand:DF 1 "fp_arith_operand" "fGH")))]
1322: "TARGET_NUMERICS"
1323: "movr %1,%0"
1324: [(set_attr "type" "fpmove")])
1325:
1326: ;; Conversion between fixed point and floating point.
1327:
1328: (define_insn "floatsidf2"
1329: [(set (match_operand:DF 0 "register_operand" "=f")
1330: (float:DF (match_operand:SI 1 "register_operand" "d")))]
1331: "TARGET_NUMERICS"
1332: "cvtir %1,%0"
1333: [(set_attr "type" "fpcvt")])
1334:
1335: (define_insn "floatsisf2"
1336: [(set (match_operand:SF 0 "register_operand" "=df")
1337: (float:SF (match_operand:SI 1 "register_operand" "d")))]
1338: "TARGET_NUMERICS"
1339: "cvtir %1,%0"
1340: [(set_attr "type" "fpcvt")])
1341:
1342: ;; Convert a float to an actual integer.
1343: ;; Truncation is performed as part of the conversion.
1344: ;; The i960 requires conversion from DFmode to DImode to make
1345: ;; unsigned conversions work properly.
1346:
1347: (define_insn "fixuns_truncdfdi2"
1348: [(set (match_operand:DI 0 "register_operand" "=d")
1349: (unsigned_fix:DI (fix:DF (match_operand:DF 1 "fp_arith_operand" "fGH"))))]
1350: "TARGET_NUMERICS"
1351: "cvtzril %1,%0"
1352: [(set_attr "type" "fpcvt")])
1353:
1354: (define_insn "fixuns_truncsfdi2"
1355: [(set (match_operand:DI 0 "register_operand" "=d")
1356: (unsigned_fix:DI (fix:SF (match_operand:SF 1 "fp_arith_operand" "fGH"))))]
1357: "TARGET_NUMERICS"
1358: "cvtzril %1,%0"
1359: [(set_attr "type" "fpcvt")])
1360:
1361: (define_insn "fix_truncdfsi2"
1362: [(set (match_operand:SI 0 "register_operand" "=d")
1363: (fix:SI (fix:DF (match_operand:DF 1 "fp_arith_operand" "fGH"))))]
1364: "TARGET_NUMERICS"
1365: "cvtzri %1,%0"
1366: [(set_attr "type" "fpcvt")])
1367:
1368: (define_expand "fixuns_truncdfsi2"
1369: [(set (match_operand:SI 0 "register_operand" "")
1370: (unsigned_fix:SI (fix:DF (match_operand:DF 1 "fp_arith_operand" ""))))]
1371: "TARGET_NUMERICS"
1372: "
1373: {
1374: rtx temp = gen_reg_rtx (DImode);
1375: emit_insn (gen_rtx (SET, VOIDmode, temp,
1376: gen_rtx (UNSIGNED_FIX, DImode,
1377: gen_rtx (FIX, DFmode, operands[1]))));
1378: emit_insn (gen_rtx (SET, VOIDmode, operands[0],
1379: gen_rtx (SUBREG, SImode, temp, 0)));
1380: DONE;
1381: }")
1382:
1383: (define_insn "fix_truncsfsi2"
1384: [(set (match_operand:SI 0 "register_operand" "=d")
1385: (fix:SI (fix:SF (match_operand:SF 1 "fp_arith_operand" "dfGH"))))]
1386: "TARGET_NUMERICS"
1387: "cvtzri %1,%0"
1388: [(set_attr "type" "fpcvt")])
1389:
1390: (define_expand "fixuns_truncsfsi2"
1391: [(set (match_operand:SI 0 "register_operand" "")
1392: (unsigned_fix:SI (fix:SF (match_operand:SF 1 "fp_arith_operand" ""))))]
1393: "TARGET_NUMERICS"
1394: "
1395: {
1396: rtx temp = gen_reg_rtx (DImode);
1397: emit_insn (gen_rtx (SET, VOIDmode, temp,
1398: gen_rtx (UNSIGNED_FIX, DImode,
1399: gen_rtx (FIX, SFmode, operands[1]))));
1400: emit_insn (gen_rtx (SET, VOIDmode, operands[0],
1401: gen_rtx (SUBREG, SImode, temp, 0)));
1402: DONE;
1403: }")
1404:
1405: ;; Arithmetic instructions.
1406:
1407: (define_insn "subsi3"
1408: [(set (match_operand:SI 0 "register_operand" "=d")
1409: (minus:SI (match_operand:SI 1 "arith_operand" "dI")
1410: (match_operand:SI 2 "arith_operand" "dI")))]
1411: ""
1412: "subo %2,%1,%0")
1413:
1414: ;; Try to generate an lda instruction when it would be faster than an
1415: ;; add instruction.
1416: ;; Some assemblers apparently won't accept two addresses added together.
1417:
1418: (define_insn ""
1419: [(set (match_operand:SI 0 "register_operand" "=d,d,d")
1420: (plus:SI (match_operand:SI 1 "arith32_operand" "%dn,i,dn")
1421: (match_operand:SI 2 "arith32_operand" "dn,dn,i")))]
1422: "(TARGET_C_SERIES) && (CONSTANT_P (operands[1]) || CONSTANT_P (operands[2]))"
1423: "*
1424: {
1425: if (GET_CODE (operands[1]) == CONST_INT)
1426: {
1427: rtx tmp = operands[1];
1428: operands[1] = operands[2];
1429: operands[2] = tmp;
1430: }
1431: if (GET_CODE (operands[2]) == CONST_INT
1432: && GET_CODE (operands[1]) == REG
1433: && i960_last_insn_type != I_TYPE_REG)
1434: {
1435: if (INTVAL (operands[2]) < 0 && INTVAL (operands[2]) > -32)
1436: return \"subo %n2,%1,%0\";
1437: else if (INTVAL (operands[2]) >= 0 && INTVAL (operands[2]) < 32)
1438: return \"addo %1,%2,%0\";
1439: }
1440: if (CONSTANT_P (operands[1]))
1441: return \"lda %1+%2,%0\";
1442: return \"lda %2(%1),%0\";
1443: }")
1444:
1445: (define_insn "addsi3"
1446: [(set (match_operand:SI 0 "register_operand" "=d")
1447: (plus:SI (match_operand:SI 1 "signed_arith_operand" "%dI")
1448: (match_operand:SI 2 "signed_arith_operand" "dIK")))]
1449: ""
1450: "*
1451: {
1452: if (GET_CODE (operands[2]) == CONST_INT
1453: && INTVAL (operands[2]) < 0 && INTVAL (operands[2]) > -32)
1454: return \"subo %n2,%1,%0\";
1455: if (i960_bypass (insn, operands[1], operands[2], 0))
1456: return \"addo %2,%1,%0\";
1457: return \"addo %1,%2,%0\";
1458: }")
1459:
1460: (define_insn "mulsi3"
1461: [(set (match_operand:SI 0 "register_operand" "=d")
1462: (mult:SI (match_operand:SI 1 "arith_operand" "%dI")
1463: (match_operand:SI 2 "arith_operand" "dI")))]
1464: ""
1465: "*
1466: {
1467: if (i960_bypass (insn, operands[1], operands[2], 0))
1468: return \"mulo %2,%1,%0\";
1469: return \"mulo %1,%2,%0\";
1470: }"
1471: [(set_attr "type" "mult")])
1472:
1473: ;; This goes after the move/add/sub/mul instructions
1474: ;; because those instructions are better when they apply.
1475:
1476: (define_insn ""
1477: [(set (match_operand:SI 0 "register_operand" "=d")
1478: (match_operand:SI 1 "address_operand" "p"))]
1479: ""
1480: "lda %a1,%0"
1481: [(set_attr "type" "load")])
1482:
1483: ;; This will never be selected because of an "optimization" that GCC does.
1484: ;; It always converts divides by a power of 2 into a sequence of instructions
1485: ;; that does a right shift, and then corrects the result if it was negative.
1486:
1487: ;; (define_insn ""
1488: ;; [(set (match_operand:SI 0 "register_operand" "=d")
1489: ;; (div:SI (match_operand:SI 1 "arith_operand" "dI")
1490: ;; (match_operand:SI 2 "power2_operand" "nI")))]
1491: ;; ""
1492: ;; "*{
1493: ;; operands[2] = gen_rtx(CONST_INT, VOIDmode,bitpos (INTVAL (operands[2])));
1494: ;; return \"shrdi %2,%1,%0\";
1495: ;; }"
1496:
1497: (define_insn "divsi3"
1498: [(set (match_operand:SI 0 "register_operand" "=d")
1499: (div:SI (match_operand:SI 1 "arith_operand" "dI")
1500: (match_operand:SI 2 "arith_operand" "dI")))]
1501: ""
1502: "divi %2,%1,%0"
1503: [(set_attr "type" "div")])
1504:
1505: (define_insn "udivsi3"
1506: [(set (match_operand:SI 0 "register_operand" "=d")
1507: (udiv:SI (match_operand:SI 1 "arith_operand" "dI")
1508: (match_operand:SI 2 "arith_operand" "dI")))]
1509: ""
1510: "divo %2,%1,%0"
1511: [(set_attr "type" "div")])
1512:
1513: ;; We must use `remi' not `modi' here, to ensure that `%' has the effects
1514: ;; specified by the ANSI C standard.
1515:
1516: (define_insn "modsi3"
1517: [(set (match_operand:SI 0 "register_operand" "=d")
1518: (mod:SI (match_operand:SI 1 "arith_operand" "dI")
1519: (match_operand:SI 2 "arith_operand" "dI")))]
1520: ""
1521: "remi %2,%1,%0"
1522: [(set_attr "type" "div")])
1523:
1524: (define_insn "umodsi3"
1525: [(set (match_operand:SI 0 "register_operand" "=d")
1526: (umod:SI (match_operand:SI 1 "arith_operand" "dI")
1527: (match_operand:SI 2 "arith_operand" "dI")))]
1528: ""
1529: "remo %2,%1,%0"
1530: [(set_attr "type" "div")])
1531:
1532: ;; And instructions (with complement also).
1533:
1534: (define_insn "andsi3"
1535: [(set (match_operand:SI 0 "register_operand" "=d")
1536: (and:SI (match_operand:SI 1 "arith_operand" "%dI")
1537: (match_operand:SI 2 "arith_operand" "dI")))]
1538: ""
1539: "*
1540: {
1541: if (i960_bypass (insn, operands[1], operands[2], 0))
1542: return \"and %2,%1,%0\";
1543: return \"and %1,%2,%0\";
1544: }")
1545:
1546: (define_insn ""
1547: [(set (match_operand:SI 0 "register_operand" "=d")
1548: (and:SI (not:SI (match_operand:SI 1 "arith_operand" "dI"))
1549: (match_operand:SI 2 "arith_operand" "dI")))]
1550: ""
1551: "*
1552: {
1553: if (i960_bypass (insn, operands[1], operands[2], 0))
1554: return \"notand %2,%1,%0\";
1555: return \"andnot %1,%2,%0\";
1556: }")
1557:
1558: (define_insn ""
1559: [(set (match_operand:SI 0 "register_operand" "=d")
1560: (ior:SI (not:SI (match_operand:SI 1 "arith_operand" "%dI"))
1561: (not:SI (match_operand:SI 2 "arith_operand" "dI"))))]
1562: ""
1563: "*
1564: {
1565: if (i960_bypass (insn, operands[1], operands[2], 0))
1566: return \"nand %2,%1,%0\";
1567: return \"nand %1,%2,%0\";
1568: }")
1569:
1570: (define_insn ""
1571: [(set (match_operand:SI 0 "register_operand" "=d")
1572: (not:SI (and:SI (match_operand:SI 1 "arith_operand" "%dI")
1573: (match_operand:SI 2 "arith_operand" "dI"))))]
1574: ""
1575: "*
1576: {
1577: if (i960_bypass (insn, operands[1], operands[2], 0))
1578: return \"nand %2,%1,%0\";
1579: return \"nand %1,%2,%0\";
1580: }")
1581:
1582: (define_insn ""
1583: [(set (match_operand:SI 0 "register_operand" "=d")
1584: (ior:SI (match_operand:SI 1 "arith_operand" "dI")
1585: (match_operand:SI 2 "power2_operand" "n")))]
1586: ""
1587: "*
1588: {
1589: operands[2] = gen_rtx (CONST_INT, VOIDmode,
1590: bitpos (INTVAL (operands[2])));
1591: return \"setbit %2,%1,%0\";
1592: }")
1593:
1594: (define_insn ""
1595: [(set (match_operand:SI 0 "register_operand" "=d")
1596: (ior:SI (match_operand:SI 1 "power2_operand" "n")
1597: (match_operand:SI 2 "arith_operand" "dI")))]
1598: ""
1599: "*
1600: {
1601: operands[1] = gen_rtx (CONST_INT, VOIDmode,
1602: bitpos (INTVAL (operands[1])));
1603: return \"setbit %1,%2,%0\";
1604: }")
1605:
1606: (define_insn "iorsi3"
1607: [(set (match_operand:SI 0 "register_operand" "=d")
1608: (ior:SI (match_operand:SI 1 "arith_operand" "%dI")
1609: (match_operand:SI 2 "arith_operand" "dI")))]
1610: ""
1611: "*
1612: {
1613: if (i960_bypass (insn, operands[1], operands[2], 0))
1614: return \"or %2,%1,%0\";
1615: return \"or %1,%2,%0\";
1616: }")
1617:
1618: (define_insn ""
1619: [(set (match_operand:SI 0 "register_operand" "=d")
1620: (ior:SI (not:SI (match_operand:SI 1 "arith_operand" "dI"))
1621: (match_operand:SI 2 "arith_operand" "dI")))]
1622: ""
1623: "*
1624: {
1625: if (i960_bypass (insn, operands[1], operands[2], 0))
1626: return \"notor %2,%1,%0\";
1627: return \"ornot %1,%2,%0\";
1628: }")
1629:
1630: (define_insn ""
1631: [(set (match_operand:SI 0 "register_operand" "=d")
1632: (and:SI (not:SI (match_operand:SI 1 "arith_operand" "%dI"))
1633: (not:SI (match_operand:SI 2 "arith_operand" "dI"))))]
1634: ""
1635: "*
1636: {
1637: if (i960_bypass (insn, operands[1], operands[2], 0))
1638: return \"nor %2,%1,%0\";
1639: return \"nor %1,%2,%0\";
1640: }")
1641:
1642: (define_insn ""
1643: [(set (match_operand:SI 0 "register_operand" "=d")
1644: (not:SI (ior:SI (match_operand:SI 1 "arith_operand" "%dI")
1645: (match_operand:SI 2 "arith_operand" "dI"))))]
1646: ""
1647: "*
1648: {
1649: if (i960_bypass (insn, operands[1], operands[2], 0))
1650: return \"nor %2,%1,%0\";
1651: return \"nor %1,%2,%0\";
1652: }")
1653:
1654: (define_insn "xorsi3"
1655: [(set (match_operand:SI 0 "register_operand" "=d")
1656: (xor:SI (match_operand:SI 1 "arith_operand" "%dI")
1657: (match_operand:SI 2 "arith_operand" "dI")))]
1658: ""
1659: "*
1660: {
1661: if (i960_bypass (insn, operands[1], operands[2], 0))
1662: return \"xor %2,%1,%0\";
1663: return \"xor %1,%2,%0\";
1664: }")
1665:
1666: (define_insn ""
1667: [(set (match_operand:SI 0 "register_operand" "=d")
1668: (not:SI (xor:SI (match_operand:SI 1 "arith_operand" "%dI")
1669: (match_operand:SI 2 "arith_operand" "dI"))))]
1670: ""
1671: "*
1672: {
1673: if (i960_bypass (insn, operands[1], operands[2], 0))
1674: return \"xnor %2,%1,%0\";
1675: return \"xnor %2,%1,%0\";
1676: }")
1677:
1678: (define_insn "negsi2"
1679: [(set (match_operand:SI 0 "register_operand" "=d")
1680: (neg:SI (match_operand:SI 1 "arith_operand" "dI")))]
1681: ""
1682: "subo %1,0,%0"
1683: [(set_attr "length" "1")])
1684:
1685: (define_insn "one_cmplsi2"
1686: [(set (match_operand:SI 0 "register_operand" "=d")
1687: (not:SI (match_operand:SI 1 "arith_operand" "dI")))]
1688: ""
1689: "not %1,%0"
1690: [(set_attr "length" "1")])
1691:
1692: ;; Floating point arithmetic instructions.
1693:
1694: (define_insn "adddf3"
1695: [(set (match_operand:DF 0 "register_operand" "=d")
1696: (plus:DF (match_operand:DF 1 "fp_arith_operand" "%rGH")
1697: (match_operand:DF 2 "fp_arith_operand" "rGH")))]
1698: "TARGET_NUMERICS"
1699: "addrl %1,%2,%0"
1700: [(set_attr "type" "fpadd")])
1701:
1702: (define_insn "addsf3"
1703: [(set (match_operand:SF 0 "register_operand" "=d")
1704: (plus:SF (match_operand:SF 1 "fp_arith_operand" "%rGH")
1705: (match_operand:SF 2 "fp_arith_operand" "rGH")))]
1706: "TARGET_NUMERICS"
1707: "addr %1,%2,%0"
1708: [(set_attr "type" "fpadd")])
1709:
1710:
1711: (define_insn "subdf3"
1712: [(set (match_operand:DF 0 "register_operand" "=d")
1713: (minus:DF (match_operand:DF 1 "fp_arith_operand" "rGH")
1714: (match_operand:DF 2 "fp_arith_operand" "rGH")))]
1715: "TARGET_NUMERICS"
1716: "subrl %2,%1,%0"
1717: [(set_attr "type" "fpadd")])
1718:
1719: (define_insn "subsf3"
1720: [(set (match_operand:SF 0 "register_operand" "=d")
1721: (minus:SF (match_operand:SF 1 "fp_arith_operand" "rGH")
1722: (match_operand:SF 2 "fp_arith_operand" "rGH")))]
1723: "TARGET_NUMERICS"
1724: "subr %2,%1,%0"
1725: [(set_attr "type" "fpadd")])
1726:
1727:
1728: (define_insn "muldf3"
1729: [(set (match_operand:DF 0 "register_operand" "=d")
1730: (mult:DF (match_operand:DF 1 "fp_arith_operand" "rGH")
1731: (match_operand:DF 2 "fp_arith_operand" "rGH")))]
1732: "TARGET_NUMERICS"
1733: "mulrl %1,%2,%0"
1734: [(set_attr "type" "fpmul")])
1735:
1736: (define_insn "mulsf3"
1737: [(set (match_operand:SF 0 "register_operand" "=d")
1738: (mult:SF (match_operand:SF 1 "fp_arith_operand" "rGH")
1739: (match_operand:SF 2 "fp_arith_operand" "rGH")))]
1740: "TARGET_NUMERICS"
1741: "mulr %1,%2,%0"
1742: [(set_attr "type" "fpmul")])
1743:
1744:
1745: (define_insn "divdf3"
1746: [(set (match_operand:DF 0 "register_operand" "=d")
1747: (div:DF (match_operand:DF 1 "fp_arith_operand" "rGH")
1748: (match_operand:DF 2 "fp_arith_operand" "rGH")))]
1749: "TARGET_NUMERICS"
1750: "divrl %2,%1,%0"
1751: [(set_attr "type" "fpdiv")])
1752:
1753: (define_insn "divsf3"
1754: [(set (match_operand:SF 0 "register_operand" "=d")
1755: (div:SF (match_operand:SF 1 "fp_arith_operand" "rGH")
1756: (match_operand:SF 2 "fp_arith_operand" "rGH")))]
1757: "TARGET_NUMERICS"
1758: "divr %2,%1,%0"
1759: [(set_attr "type" "fpdiv")])
1760:
1761: (define_insn "negdf2"
1762: [(set (match_operand:DF 0 "register_operand" "=d,f")
1763: (neg:DF (match_operand:DF 1 "register_operand" "d,r")))]
1764: ""
1765: "*
1766: {
1767: if (which_alternative == 0)
1768: {
1769: if (REGNO (operands[0]) == REGNO (operands[1]))
1770: return \"notbit 31,%D1,%D0\";
1771: return \"mov %1,%0\;notbit 31,%D1,%D0\";
1772: }
1773: return \"subrl %1,0f0.0,%0\";
1774: }"
1775: [(set_attr "type" "fpadd")])
1776:
1777: (define_insn "negsf2"
1778: [(set (match_operand:SF 0 "register_operand" "=d,f")
1779: (neg:SF (match_operand:SF 1 "register_operand" "d,r")))]
1780: ""
1781: "@
1782: notbit 31,%1,%0
1783: subr %1,0f0.0,%0"
1784: [(set_attr "type" "fpadd")])
1785:
1786: ;;; The abs patterns also work even if the target machine doesn't have
1787: ;;; floating point, because in that case dstreg and srcreg will always be
1788: ;;; less than 32.
1789:
1790: (define_insn "absdf2"
1791: [(set (match_operand:DF 0 "register_operand" "=df")
1792: (abs:DF (match_operand:DF 1 "register_operand" "df")))]
1793: ""
1794: "*
1795: {
1796: int dstreg = REGNO (operands[0]);
1797: int srcreg = REGNO (operands[1]);
1798:
1799: if (dstreg < 32)
1800: {
1801: if (srcreg < 32)
1802: {
1803: if (dstreg != srcreg)
1804: output_asm_insn (\"mov %1,%0\", operands);
1805: return \"clrbit 31,%D1,%D0\";
1806: }
1807: /* Src is an fp reg. */
1808: return \"movrl %1,%0\;clrbit 31,%D1,%D0\";
1809: }
1810: if (srcreg >= 32)
1811: return \"cpysre %1,0f0.0,%0\";
1812: return \"movrl %1,%0\;cpysre %0,0f0.0,%0\";
1813: }"
1814: [(set_attr "type" "multi")])
1815:
1816: (define_insn "abssf2"
1817: [(set (match_operand:SF 0 "register_operand" "=df")
1818: (abs:SF (match_operand:SF 1 "register_operand" "df")))]
1819: ""
1820: "*
1821: {
1822: int dstreg = REGNO (operands[0]);
1823: int srcreg = REGNO (operands[1]);
1824:
1825: if (dstreg < 32 && srcreg < 32)
1826: return \"clrbit 31,%1,%0\";
1827:
1828: if (dstreg >= 32 && srcreg >= 32)
1829: return \"cpysre %1,0f0.0,%0\";
1830:
1831: if (dstreg < 32)
1832: return \"movr %1,%0\;clrbit 31,%0,%0\";
1833:
1834: return \"movr %1,%0\;cpysre %0,0f0.0,%0\";
1835: }"
1836: [(set_attr "type" "multi")])
1837:
1838: ;; Tetra (16 byte) float support.
1839:
1840: (define_insn "cmptf"
1841: [(set (reg:CC 36)
1842: (compare:CC (match_operand:TF 0 "register_operand" "f")
1843: (match_operand:TF 1 "nonmemory_operand" "fG")))]
1844: "TARGET_NUMERICS"
1845: "cmpr %0,%1"
1846: [(set_attr "type" "fpcc")])
1847:
1848: (define_expand "movtf"
1849: [(set (match_operand:TF 0 "general_operand" "")
1850: (match_operand:TF 1 "fpmove_src_operand" ""))]
1851: ""
1852: "
1853: {
1854: if (emit_move_sequence (operands, TFmode))
1855: DONE;
1856: }")
1857:
1858: (define_insn ""
1859: [(set (match_operand:TF 0 "general_operand" "=r,f,d,d,m")
1860: (match_operand:TF 1 "fpmove_src_operand" "r,GH,F,m,dG"))]
1861: "current_function_args_size == 0
1862: && (register_operand (operands[0], TFmode)
1863: || register_operand (operands[1], TFmode)
1864: || operands[1] == CONST0_RTX (TFmode))"
1865: "*
1866: {
1867: switch (which_alternative)
1868: {
1869: case 0:
1870: if (FP_REG_P (operands[0]) || FP_REG_P (operands[1]))
1871: return \"movre %1,%0\";
1872: else
1873: return \"movq %1,%0\";
1874: case 1:
1875: return \"movre %1,%0\";
1876: case 2:
1877: return i960_output_ldconst (operands[0], operands[1]);
1878: case 3:
1879: return \"ldq %1,%0\";
1880: case 4:
1881: if (operands[1] == CONST0_RTX (TFmode))
1882: return \"st g14,%0\;st g14,4(%0)\;st g14,8(%0)\;st g14,12(%0)\";
1883: return \"stq %1,%0\";
1884: }
1885: }"
1886: [(set_attr "type" "move,move,load,fpload,fpstore")])
1887:
1888: (define_insn ""
1889: [(set (match_operand:TF 0 "general_operand" "=r,f,d,d,m")
1890: (match_operand:TF 1 "fpmove_src_operand" "r,GH,F,m,d"))]
1891: "current_function_args_size != 0
1892: && (register_operand (operands[0], TFmode)
1893: || register_operand (operands[1], TFmode))"
1894: "*
1895: {
1896: switch (which_alternative)
1897: {
1898: case 0:
1899: if (FP_REG_P (operands[0]) || FP_REG_P (operands[1]))
1900: return \"movre %1,%0\";
1901: else
1902: return \"movq %1,%0\";
1903: case 1:
1904: return \"movre %1,%0\";
1905: case 2:
1906: return i960_output_ldconst (operands[0], operands[1]);
1907: case 3:
1908: return \"ldq %1,%0\";
1909: case 4:
1910: return \"stq %1,%0\";
1911: }
1912: }"
1913: [(set_attr "type" "move,move,load,fpload,fpstore")])
1914:
1915: (define_insn "extendsftf2"
1916: [(set (match_operand:TF 0 "register_operand" "=f,d")
1917: (float_extend:TF
1918: (match_operand:SF 1 "register_operand" "d,f")))]
1919: "TARGET_NUMERICS"
1920: "@
1921: movr %1,%0
1922: movre %1,%0"
1923: [(set_attr "type" "fpmove")])
1924:
1925: (define_insn "extenddftf2"
1926: [(set (match_operand:TF 0 "register_operand" "=f,d")
1927: (float_extend:TF
1928: (match_operand:DF 1 "register_operand" "d,f")))]
1929: "TARGET_NUMERICS"
1930: "@
1931: movrl %1,%0
1932: movre %1,%0"
1933: [(set_attr "type" "fpmove")])
1934:
1935: (define_insn "trunctfdf2"
1936: [(set (match_operand:DF 0 "register_operand" "=d")
1937: (float_truncate:DF
1938: (match_operand:TF 1 "register_operand" "f")))]
1939: "TARGET_NUMERICS"
1940: "movrl %1,%0"
1941: [(set_attr "type" "fpmove")])
1942:
1943: (define_insn "trunctfsf2"
1944: [(set (match_operand:SF 0 "register_operand" "=d")
1945: (float_truncate:SF
1946: (match_operand:TF 1 "register_operand" "f")))]
1947: "TARGET_NUMERICS"
1948: "movr %1,%0"
1949: [(set_attr "type" "fpmove")])
1950:
1951: (define_insn "floatsitf2"
1952: [(set (match_operand:TF 0 "register_operand" "=f")
1953: (float:TF (match_operand:SI 1 "register_operand" "d")))]
1954: "TARGET_NUMERICS"
1955: "cvtir %1,%0"
1956: [(set_attr "type" "fpcvt")])
1957:
1958: (define_insn "fix_trunctfsi2"
1959: [(set (match_operand:SI 0 "register_operand" "=d")
1960: (fix:SI (fix:TF (match_operand:TF 1 "register_operand" "f"))))]
1961: "TARGET_NUMERICS"
1962: "cvtzri %1,%0"
1963: [(set_attr "type" "fpcvt")])
1964:
1965: (define_insn "fixuns_trunctfsi2"
1966: [(set (match_operand:SI 0 "register_operand" "=d")
1967: (unsigned_fix:SI (fix:TF (match_operand:TF 1 "register_operand" "f"))))]
1968: "TARGET_NUMERICS"
1969: "cvtzri %1,%0"
1970: [(set_attr "type" "fpcvt")])
1971:
1972: (define_insn "addtf3"
1973: [(set (match_operand:TF 0 "register_operand" "=f")
1974: (plus:TF (match_operand:TF 1 "nonmemory_operand" "%fG")
1975: (match_operand:TF 2 "nonmemory_operand" "fG")))]
1976: "TARGET_NUMERICS"
1977: "addr %1,%2,%0"
1978: [(set_attr "type" "fpadd")])
1979:
1980: (define_insn "subtf3"
1981: [(set (match_operand:TF 0 "register_operand" "=f")
1982: (minus:TF (match_operand:TF 1 "nonmemory_operand" "fG")
1983: (match_operand:TF 2 "nonmemory_operand" "fG")))]
1984: "TARGET_NUMERICS"
1985: "subr %2,%1,%0"
1986: [(set_attr "type" "fpadd")])
1987:
1988: (define_insn "multf3"
1989: [(set (match_operand:TF 0 "register_operand" "=f")
1990: (mult:TF (match_operand:TF 1 "nonmemory_operand" "fG")
1991: (match_operand:TF 2 "nonmemory_operand" "fG")))]
1992: "TARGET_NUMERICS"
1993: "mulr %1,%2,%0"
1994: [(set_attr "type" "fpmul")])
1995:
1996: (define_insn "divtf3"
1997: [(set (match_operand:TF 0 "register_operand" "=f")
1998: (div:TF (match_operand:TF 1 "nonmemory_operand" "fG")
1999: (match_operand:TF 2 "nonmemory_operand" "fG")))]
2000: "TARGET_NUMERICS"
2001: "divr %2,%1,%0"
2002: [(set_attr "type" "fpdiv")])
2003:
2004: (define_insn "negtf2"
2005: [(set (match_operand:TF 0 "register_operand" "=f")
2006: (neg:TF (match_operand:TF 1 "register_operand" "f")))]
2007: "TARGET_NUMERICS"
2008: "subr %1,0f0.0,%0"
2009: [(set_attr "type" "fpadd")])
2010:
2011: (define_insn "abstf2"
2012: [(set (match_operand:TF 0 "register_operand" "=f")
2013: (abs:TF (match_operand:TF 1 "register_operand" "f")))]
2014: "(TARGET_NUMERICS)"
2015: "cpysre %1,0f0.0,%0"
2016: [(set_attr "type" "fpmove")])
2017:
2018: ;; Arithmetic shift instructions.
2019:
2020: (define_insn "ashlsi3"
2021: [(set (match_operand:SI 0 "register_operand" "=d")
2022: (ashift:SI (match_operand:SI 1 "arith_operand" "dI")
2023: (match_operand:SI 2 "arith_operand" "dI")))]
2024: ""
2025: "shli %2,%1,%0"
2026: [(set_attr "type" "alu2")])
2027:
2028: (define_insn "ashrsi3"
2029: [(set (match_operand:SI 0 "register_operand" "=d")
2030: (ashiftrt:SI (match_operand:SI 1 "arith_operand" "dI")
2031: (match_operand:SI 2 "arith_operand" "dI")))]
2032: ""
2033: "shri %2,%1,%0"
2034: [(set_attr "type" "alu2")])
2035:
2036: (define_insn "lshrsi3"
2037: [(set (match_operand:SI 0 "register_operand" "=d")
2038: (lshiftrt:SI (match_operand:SI 1 "arith_operand" "dI")
2039: (match_operand:SI 2 "arith_operand" "dI")))]
2040: ""
2041: "shro %2,%1,%0"
2042: [(set_attr "type" "alu2")])
2043:
2044: ;; Unconditional and other jump instructions.
2045:
2046: (define_insn "jump"
2047: [(set (pc)
2048: (label_ref (match_operand 0 "" "")))]
2049: ""
2050: "b %l0"
2051: [(set_attr "type" "branch")])
2052:
2053: (define_insn "indirect_jump"
2054: [(set (pc) (match_operand:SI 0 "register_operand" "r"))]
2055: ""
2056: "b* %0"
2057: [(set_attr "type" "branch")])
2058:
2059: (define_insn "tablejump"
2060: [(set (pc) (match_operand:SI 0 "register_operand" "d"))
2061: (use (label_ref (match_operand 1 "" "")))]
2062: ""
2063: "bx (%0)"
2064: [(set_attr "type" "branch")])
2065:
2066: ;;- jump to subroutine
2067:
2068: (define_expand "call"
2069: [(call (match_operand:SI 0 "general_operand" "")
2070: (match_operand:SI 1 "immediate_operand" ""))]
2071: ""
2072: "
2073: {
2074: i960_expand_call (operand0, operand1, 0);
2075: DONE;
2076: }")
2077:
2078: (define_insn ""
2079: [(call (match_operand:SI 0 "general_operand" "g")
2080: (match_operand:SI 1 "immediate_operand" "i"))]
2081: ""
2082: "* return i960_output_call_insn (operands[0], operands[1], insn);"
2083: [(set_attr "type" "call")])
2084:
2085: (define_expand "call_value"
2086: [(set (match_operand 0 "register_operand" "=d")
2087: (call (match_operand:SI 1 "general_operand" "g")
2088: (match_operand:SI 2 "immediate_operand" "i")))]
2089: ""
2090: "
2091: {
2092: i960_expand_call (operand1, operand2, operand0);
2093: DONE;
2094: }")
2095:
2096: (define_insn ""
2097: [(set (match_operand 0 "register_operand" "=d")
2098: (call (match_operand:SI 1 "general_operand" "g")
2099: (match_operand:SI 2 "immediate_operand" "i")))]
2100: ""
2101: "* return i960_output_call_insn (operands[1], operands[2], insn);"
2102: [(set_attr "type" "call")])
2103:
2104: (define_insn "return"
2105: [(return)]
2106: ""
2107: "* return i960_output_ret_insn (insn);"
2108: [(set_attr "type" "branch")])
2109:
2110: (define_insn "nop"
2111: [(const_int 0)]
2112: ""
2113: "")
2114:
2115: ;; Various peephole optimizations for multiple-word moves, loads, and stores.
2116: ;; Multiple register moves.
2117:
2118: ;; Matched 5/28/91
2119: (define_peephole
2120: [(set (match_operand:SI 0 "register_operand" "=r")
2121: (match_operand:SI 1 "register_operand" "r"))
2122: (set (match_operand:SI 2 "register_operand" "=r")
2123: (match_operand:SI 3 "register_operand" "r"))
2124: (set (match_operand:SI 4 "register_operand" "=r")
2125: (match_operand:SI 5 "register_operand" "r"))
2126: (set (match_operand:SI 6 "register_operand" "=r")
2127: (match_operand:SI 7 "register_operand" "r"))]
2128: "((REGNO (operands[0]) & 3) == 0)
2129: && ((REGNO (operands[1]) & 3) == 0)
2130: && (REGNO (operands[0]) + 1 == REGNO (operands[2]))
2131: && (REGNO (operands[1]) + 1 == REGNO (operands[3]))
2132: && (REGNO (operands[0]) + 2 == REGNO (operands[4]))
2133: && (REGNO (operands[1]) + 2 == REGNO (operands[5]))
2134: && (REGNO (operands[0]) + 3 == REGNO (operands[6]))
2135: && (REGNO (operands[1]) + 3 == REGNO (operands[7]))"
2136: "movq %1,%0")
2137:
2138: ;; Matched 4/17/92
2139: (define_peephole
2140: [(set (match_operand:DI 0 "register_operand" "=r")
2141: (match_operand:DI 1 "register_operand" "r"))
2142: (set (match_operand:DI 2 "register_operand" "=r")
2143: (match_operand:DI 3 "register_operand" "r"))]
2144: "((REGNO (operands[0]) & 3) == 0)
2145: && ((REGNO (operands[1]) & 3) == 0)
2146: && (REGNO (operands[0]) + 2 == REGNO (operands[2]))
2147: && (REGNO (operands[1]) + 2 == REGNO (operands[3]))"
2148: "movq %1,%0")
2149:
2150: ;; Matched 4/17/92
2151: (define_peephole
2152: [(set (match_operand:DI 0 "register_operand" "=r")
2153: (match_operand:DI 1 "register_operand" "r"))
2154: (set (match_operand:SI 2 "register_operand" "=r")
2155: (match_operand:SI 3 "register_operand" "r"))
2156: (set (match_operand:SI 4 "register_operand" "=r")
2157: (match_operand:SI 5 "register_operand" "r"))]
2158: "((REGNO (operands[0]) & 3) == 0)
2159: && ((REGNO (operands[1]) & 3) == 0)
2160: && (REGNO (operands[0]) + 2 == REGNO (operands[2]))
2161: && (REGNO (operands[1]) + 2 == REGNO (operands[3]))
2162: && (REGNO (operands[0]) + 3 == REGNO (operands[4]))
2163: && (REGNO (operands[1]) + 3 == REGNO (operands[5]))"
2164: "movq %1,%0")
2165:
2166: ;; Matched 4/17/92
2167: (define_peephole
2168: [(set (match_operand:SI 0 "register_operand" "=r")
2169: (match_operand:SI 1 "register_operand" "r"))
2170: (set (match_operand:SI 2 "register_operand" "=r")
2171: (match_operand:SI 3 "register_operand" "r"))
2172: (set (match_operand:DI 4 "register_operand" "=r")
2173: (match_operand:DI 5 "register_operand" "r"))]
2174: "((REGNO (operands[0]) & 3) == 0)
2175: && ((REGNO (operands[1]) & 3) == 0)
2176: && (REGNO (operands[0]) + 1 == REGNO (operands[2]))
2177: && (REGNO (operands[1]) + 1 == REGNO (operands[3]))
2178: && (REGNO (operands[0]) + 2 == REGNO (operands[4]))
2179: && (REGNO (operands[1]) + 2 == REGNO (operands[5]))"
2180: "movq %1,%0")
2181:
2182: ;; Matched 4/17/92
2183: (define_peephole
2184: [(set (match_operand:DI 0 "register_operand" "=r")
2185: (match_operand:DI 1 "register_operand" "r"))
2186: (set (match_operand:SI 2 "register_operand" "=r")
2187: (match_operand:SI 3 "register_operand" "r"))]
2188: "((REGNO (operands[0]) & 3) == 0)
2189: && ((REGNO (operands[1]) & 3) == 0)
2190: && (REGNO (operands[0]) + 2 == REGNO (operands[2]))
2191: && (REGNO (operands[1]) + 2 == REGNO (operands[3]))"
2192: "movt %1,%0")
2193:
2194: ;; Matched 5/28/91
2195: (define_peephole
2196: [(set (match_operand:SI 0 "register_operand" "=r")
2197: (match_operand:SI 1 "register_operand" "r"))
2198: (set (match_operand:SI 2 "register_operand" "=r")
2199: (match_operand:SI 3 "register_operand" "r"))
2200: (set (match_operand:SI 4 "register_operand" "=r")
2201: (match_operand:SI 5 "register_operand" "r"))]
2202: "((REGNO (operands[0]) & 3) == 0)
2203: && ((REGNO (operands[1]) & 3) == 0)
2204: && (REGNO (operands[0]) + 1 == REGNO (operands[2]))
2205: && (REGNO (operands[1]) + 1 == REGNO (operands[3]))
2206: && (REGNO (operands[0]) + 2 == REGNO (operands[4]))
2207: && (REGNO (operands[1]) + 2 == REGNO (operands[5]))"
2208: "movt %1,%0")
2209:
2210: ;; Matched 5/28/91
2211: (define_peephole
2212: [(set (match_operand:SI 0 "register_operand" "=r")
2213: (match_operand:SI 1 "register_operand" "r"))
2214: (set (match_operand:SI 2 "register_operand" "=r")
2215: (match_operand:SI 3 "register_operand" "r"))]
2216: "((REGNO (operands[0]) & 1) == 0)
2217: && ((REGNO (operands[1]) & 1) == 0)
2218: && (REGNO (operands[0]) + 1 == REGNO (operands[2]))
2219: && (REGNO (operands[1]) + 1 == REGNO (operands[3]))"
2220: "movl %1,%0")
2221:
2222: ; Multiple register loads.
2223:
2224: ;; Matched 6/15/91
2225: (define_peephole
2226: [(set (match_operand:SI 0 "register_operand" "=r")
2227: (mem:SI (plus:SI (match_operand:SI 1 "register_operand" "r")
2228: (match_operand:SI 2 "immediate_operand" "n"))))
2229: (set (match_operand:SI 3 "register_operand" "=r")
2230: (mem:SI (plus:SI (match_dup 1)
2231: (match_operand:SI 4 "immediate_operand" "n"))))
2232: (set (match_operand:SI 5 "register_operand" "=r")
2233: (mem:SI (plus:SI (match_dup 1)
2234: (match_operand:SI 6 "immediate_operand" "n"))))
2235: (set (match_operand:SI 7 "register_operand" "=r")
2236: (mem:SI (plus:SI (match_dup 1)
2237: (match_operand:SI 8 "immediate_operand" "n"))))]
2238: "(i960_si_ti (operands[1], operands[2]) && ((REGNO (operands[0]) & 3) == 0)
2239: && (REGNO (operands[1]) != REGNO (operands[0]))
2240: && (REGNO (operands[0]) + 1 == REGNO (operands[3]))
2241: && (REGNO (operands[1]) != REGNO (operands[3]))
2242: && (REGNO (operands[0]) + 2 == REGNO (operands[5]))
2243: && (REGNO (operands[1]) != REGNO (operands[5]))
2244: && (REGNO (operands[0]) + 3 == REGNO (operands[7]))
2245: && (INTVAL (operands[2]) + 4 == INTVAL (operands[4]))
2246: && (INTVAL (operands[2]) + 8 == INTVAL (operands[6]))
2247: && (INTVAL (operands[2]) + 12 == INTVAL (operands[8])))"
2248: "ldq %2(%1),%0")
2249:
2250: ;; Matched 5/28/91
2251: (define_peephole
2252: [(set (match_operand:DF 0 "register_operand" "=d")
2253: (mem:DF (plus:SI (match_operand:SI 1 "register_operand" "d")
2254: (match_operand:SI 2 "immediate_operand" "n"))))
2255: (set (match_operand:DF 3 "register_operand" "=d")
2256: (mem:DF (plus:SI (match_dup 1)
2257: (match_operand:SI 4 "immediate_operand" "n"))))]
2258: "(i960_si_ti (operands[1], operands[2]) && ((REGNO (operands[0]) & 3) == 0)
2259: && (REGNO (operands[1]) != REGNO (operands[0]))
2260: && (REGNO (operands[0]) + 2 == REGNO (operands[3]))
2261: && (REGNO (operands[1]) != REGNO (operands[3]))
2262: && (INTVAL (operands[2]) + 8 == INTVAL (operands[4])))"
2263: "ldq %2(%1),%0")
2264:
2265: ;; Matched 1/24/92
2266: (define_peephole
2267: [(set (match_operand:DI 0 "register_operand" "=d")
2268: (mem:DI (plus:SI (match_operand:SI 1 "register_operand" "d")
2269: (match_operand:SI 2 "immediate_operand" "n"))))
2270: (set (match_operand:DI 3 "register_operand" "=d")
2271: (mem:DI (plus:SI (match_dup 1)
2272: (match_operand:SI 4 "immediate_operand" "n"))))]
2273: "(i960_si_ti (operands[1], operands[2]) && ((REGNO (operands[0]) & 3) == 0)
2274: && (REGNO (operands[1]) != REGNO (operands[0]))
2275: && (REGNO (operands[0]) + 2 == REGNO (operands[3]))
2276: && (REGNO (operands[1]) != REGNO (operands[3]))
2277: && (INTVAL (operands[2]) + 8 == INTVAL (operands[4])))"
2278: "ldq %2(%1),%0")
2279:
2280: ;; Matched 4/17/92
2281: (define_peephole
2282: [(set (match_operand:SI 0 "register_operand" "=d")
2283: (mem:SI (match_operand:SI 1 "register_operand" "d")))
2284: (set (match_operand:SI 2 "register_operand" "=d")
2285: (mem:SI (plus:SI (match_dup 1)
2286: (match_operand:SI 3 "immediate_operand" "n"))))
2287: (set (match_operand:SI 4 "register_operand" "=d")
2288: (mem:SI (plus:SI (match_dup 1)
2289: (match_operand:SI 5 "immediate_operand" "n"))))
2290: (set (match_operand:SI 6 "register_operand" "=d")
2291: (mem:SI (plus:SI (match_dup 1)
2292: (match_operand:SI 7 "immediate_operand" "n"))))]
2293: "(i960_si_ti (operands[1], 0) && ((REGNO (operands[0]) & 3) == 0)
2294: && (REGNO (operands[1]) != REGNO (operands[0]))
2295: && (REGNO (operands[0]) + 1 == REGNO (operands[2]))
2296: && (REGNO (operands[1]) != REGNO (operands[2]))
2297: && (REGNO (operands[0]) + 2 == REGNO (operands[4]))
2298: && (REGNO (operands[1]) != REGNO (operands[4]))
2299: && (REGNO (operands[0]) + 3 == REGNO (operands[6]))
2300: && (INTVAL (operands[3]) == 4)
2301: && (INTVAL (operands[5]) == 8)
2302: && (INTVAL (operands[7]) == 12))"
2303: "ldq (%1),%0")
2304:
2305: ;; Matched 5/28/91
2306: (define_peephole
2307: [(set (match_operand:SI 0 "register_operand" "=d")
2308: (mem:SI (plus:SI (match_operand:SI 1 "register_operand" "d")
2309: (match_operand:SI 2 "immediate_operand" "n"))))
2310: (set (match_operand:SI 3 "register_operand" "=d")
2311: (mem:SI (plus:SI (match_dup 1)
2312: (match_operand:SI 4 "immediate_operand" "n"))))
2313: (set (match_operand:SI 5 "register_operand" "=d")
2314: (mem:SI (plus:SI (match_dup 1)
2315: (match_operand:SI 6 "immediate_operand" "n"))))]
2316: "(i960_si_ti (operands[1], operands[2]) && ((REGNO (operands[0]) & 3) == 0)
2317: && (REGNO (operands[1]) != REGNO (operands[0]))
2318: && (REGNO (operands[0]) + 1 == REGNO (operands[3]))
2319: && (REGNO (operands[1]) != REGNO (operands[3]))
2320: && (REGNO (operands[0]) + 2 == REGNO (operands[5]))
2321: && (INTVAL (operands[2]) + 4 == INTVAL (operands[4]))
2322: && (INTVAL (operands[2]) + 8 == INTVAL (operands[6])))"
2323: "ldt %2(%1),%0")
2324:
2325: ;; Matched 6/15/91
2326: (define_peephole
2327: [(set (match_operand:SI 0 "register_operand" "=d")
2328: (mem:SI (match_operand:SI 1 "register_operand" "d")))
2329: (set (match_operand:SI 2 "register_operand" "=d")
2330: (mem:SI (plus:SI (match_dup 1)
2331: (match_operand:SI 3 "immediate_operand" "n"))))
2332: (set (match_operand:SI 4 "register_operand" "=d")
2333: (mem:SI (plus:SI (match_dup 1)
2334: (match_operand:SI 5 "immediate_operand" "n"))))]
2335: "(i960_si_ti (operands[1], 0) && ((REGNO (operands[0]) & 3) == 0)
2336: && (REGNO (operands[1]) != REGNO (operands[0]))
2337: && (REGNO (operands[0]) + 1 == REGNO (operands[2]))
2338: && (REGNO (operands[1]) != REGNO (operands[2]))
2339: && (REGNO (operands[0]) + 2 == REGNO (operands[4]))
2340: && (INTVAL (operands[3]) == 4)
2341: && (INTVAL (operands[5]) == 8))"
2342: "ldt (%1),%0")
2343:
2344: ;; Matched 5/28/91
2345: (define_peephole
2346: [(set (match_operand:SI 0 "register_operand" "=d")
2347: (mem:SI (plus:SI (match_operand:SI 1 "register_operand" "d")
2348: (match_operand:SI 2 "immediate_operand" "n"))))
2349: (set (match_operand:SI 3 "register_operand" "=d")
2350: (mem:SI (plus:SI (match_dup 1)
2351: (match_operand:SI 4 "immediate_operand" "n"))))]
2352: "(i960_si_di (operands[1], operands[2]) && ((REGNO (operands[0]) & 1) == 0)
2353: && (REGNO (operands[1]) != REGNO (operands[0]))
2354: && (REGNO (operands[0]) + 1 == REGNO (operands[3]))
2355: && (INTVAL (operands[2]) + 4 == INTVAL (operands[4])))"
2356: "ldl %2(%1),%0")
2357:
2358: ;; Matched 5/28/91
2359: (define_peephole
2360: [(set (match_operand:SI 0 "register_operand" "=d")
2361: (mem:SI (match_operand:SI 1 "register_operand" "d")))
2362: (set (match_operand:SI 2 "register_operand" "=d")
2363: (mem:SI (plus:SI (match_dup 1)
2364: (match_operand:SI 3 "immediate_operand" "n"))))]
2365: "(i960_si_di (operands[1], 0) && ((REGNO (operands[0]) & 1) == 0)
2366: && (REGNO (operands[1]) != REGNO (operands[0]))
2367: && (REGNO (operands[0]) + 1 == REGNO (operands[2]))
2368: && (INTVAL (operands[3]) == 4))"
2369: "ldl (%1),%0")
2370:
2371: ; Multiple register stores.
2372:
2373: ;; Matched 5/28/91
2374: (define_peephole
2375: [(set (mem:SI (plus:SI (match_operand:SI 0 "register_operand" "d")
2376: (match_operand:SI 1 "immediate_operand" "n")))
2377: (match_operand:SI 2 "register_operand" "d"))
2378: (set (mem:SI (plus:SI (match_dup 0)
2379: (match_operand:SI 3 "immediate_operand" "n")))
2380: (match_operand:SI 4 "register_operand" "d"))
2381: (set (mem:SI (plus:SI (match_dup 0)
2382: (match_operand:SI 5 "immediate_operand" "n")))
2383: (match_operand:SI 6 "register_operand" "d"))
2384: (set (mem:SI (plus:SI (match_dup 0)
2385: (match_operand:SI 7 "immediate_operand" "n")))
2386: (match_operand:SI 8 "register_operand" "d"))]
2387: "(i960_si_ti (operands[0], operands[1]) && ((REGNO (operands[2]) & 3) == 0)
2388: && (REGNO (operands[2]) + 1 == REGNO (operands[4]))
2389: && (REGNO (operands[2]) + 2 == REGNO (operands[6]))
2390: && (REGNO (operands[2]) + 3 == REGNO (operands[8]))
2391: && (INTVAL (operands[1]) + 4 == INTVAL (operands[3]))
2392: && (INTVAL (operands[1]) + 8 == INTVAL (operands[5]))
2393: && (INTVAL (operands[1]) + 12 == INTVAL (operands[7])))"
2394: "stq %2,%1(%0)")
2395:
2396: ;; Matched 6/16/91
2397: (define_peephole
2398: [(set (mem:DF (plus:SI (match_operand:SI 0 "register_operand" "d")
2399: (match_operand:SI 1 "immediate_operand" "n")))
2400: (match_operand:DF 2 "register_operand" "d"))
2401: (set (mem:DF (plus:SI (match_dup 0)
2402: (match_operand:SI 3 "immediate_operand" "n")))
2403: (match_operand:DF 4 "register_operand" "d"))]
2404: "(i960_si_ti (operands[0], operands[1]) && ((REGNO (operands[2]) & 3) == 0)
2405: && (REGNO (operands[2]) + 2 == REGNO (operands[4]))
2406: && (INTVAL (operands[1]) + 8 == INTVAL (operands[3])))"
2407: "stq %2,%1(%0)")
2408:
2409: ;; Matched 4/17/92
2410: (define_peephole
2411: [(set (mem:DI (plus:SI (match_operand:SI 0 "register_operand" "d")
2412: (match_operand:SI 1 "immediate_operand" "n")))
2413: (match_operand:DI 2 "register_operand" "d"))
2414: (set (mem:DI (plus:SI (match_dup 0)
2415: (match_operand:SI 3 "immediate_operand" "n")))
2416: (match_operand:DI 4 "register_operand" "d"))]
2417: "(i960_si_ti (operands[0], operands[1]) && ((REGNO (operands[2]) & 3) == 0)
2418: && (REGNO (operands[2]) + 2 == REGNO (operands[4]))
2419: && (INTVAL (operands[1]) + 8 == INTVAL (operands[3])))"
2420: "stq %2,%1(%0)")
2421:
2422: ;; Matched 1/23/92
2423: (define_peephole
2424: [(set (mem:SI (match_operand:SI 0 "register_operand" "d"))
2425: (match_operand:SI 1 "register_operand" "d"))
2426: (set (mem:SI (plus:SI (match_dup 0)
2427: (match_operand:SI 2 "immediate_operand" "n")))
2428: (match_operand:SI 3 "register_operand" "d"))
2429: (set (mem:SI (plus:SI (match_dup 0)
2430: (match_operand:SI 4 "immediate_operand" "n")))
2431: (match_operand:SI 5 "register_operand" "d"))
2432: (set (mem:SI (plus:SI (match_dup 0)
2433: (match_operand:SI 6 "immediate_operand" "n")))
2434: (match_operand:SI 7 "register_operand" "d"))]
2435: "(i960_si_ti (operands[0], 0) && ((REGNO (operands[1]) & 3) == 0)
2436: && (REGNO (operands[1]) + 1 == REGNO (operands[3]))
2437: && (REGNO (operands[1]) + 2 == REGNO (operands[5]))
2438: && (REGNO (operands[1]) + 3 == REGNO (operands[7]))
2439: && (INTVAL (operands[2]) == 4)
2440: && (INTVAL (operands[4]) == 8)
2441: && (INTVAL (operands[6]) == 12))"
2442: "stq %1,(%0)")
2443:
2444: ;; Matched 5/29/91
2445: (define_peephole
2446: [(set (mem:SI (plus:SI (match_operand:SI 0 "register_operand" "d")
2447: (match_operand:SI 1 "immediate_operand" "n")))
2448: (match_operand:SI 2 "register_operand" "d"))
2449: (set (mem:SI (plus:SI (match_dup 0)
2450: (match_operand:SI 3 "immediate_operand" "n")))
2451: (match_operand:SI 4 "register_operand" "d"))
2452: (set (mem:SI (plus:SI (match_dup 0)
2453: (match_operand:SI 5 "immediate_operand" "n")))
2454: (match_operand:SI 6 "register_operand" "d"))]
2455: "(i960_si_ti (operands[0], operands[1]) && ((REGNO (operands[2]) & 3) == 0)
2456: && (REGNO (operands[2]) + 1 == REGNO (operands[4]))
2457: && (REGNO (operands[2]) + 2 == REGNO (operands[6]))
2458: && (INTVAL (operands[1]) + 4 == INTVAL (operands[3]))
2459: && (INTVAL (operands[1]) + 8 == INTVAL (operands[5])))"
2460: "stt %2,%1(%0)")
2461:
2462: ;; Matched 5/29/91
2463: (define_peephole
2464: [(set (mem:SI (match_operand:SI 0 "register_operand" "d"))
2465: (match_operand:SI 1 "register_operand" "d"))
2466: (set (mem:SI (plus:SI (match_dup 0)
2467: (match_operand:SI 2 "immediate_operand" "n")))
2468: (match_operand:SI 3 "register_operand" "d"))
2469: (set (mem:SI (plus:SI (match_dup 0)
2470: (match_operand:SI 4 "immediate_operand" "n")))
2471: (match_operand:SI 5 "register_operand" "d"))]
2472: "(i960_si_ti (operands[0], 0) && ((REGNO (operands[1]) & 3) == 0)
2473: && (REGNO (operands[1]) + 1 == REGNO (operands[3]))
2474: && (REGNO (operands[1]) + 2 == REGNO (operands[5]))
2475: && (INTVAL (operands[2]) == 4)
2476: && (INTVAL (operands[4]) == 8))"
2477: "stt %1,(%0)")
2478:
2479: ;; Matched 5/28/91
2480: (define_peephole
2481: [(set (mem:SI (plus:SI (match_operand:SI 0 "register_operand" "d")
2482: (match_operand:SI 1 "immediate_operand" "n")))
2483: (match_operand:SI 2 "register_operand" "d"))
2484: (set (mem:SI (plus:SI (match_dup 0)
2485: (match_operand:SI 3 "immediate_operand" "n")))
2486: (match_operand:SI 4 "register_operand" "d"))]
2487: "(i960_si_di (operands[0], operands[1]) && ((REGNO (operands[2]) & 1) == 0)
2488: && (REGNO (operands[2]) + 1 == REGNO (operands[4]))
2489: && (INTVAL (operands[1]) + 4 == INTVAL (operands[3])))"
2490: "stl %2,%1(%0)")
2491:
2492: ;; Matched 5/28/91
2493: (define_peephole
2494: [(set (mem:SI (match_operand:SI 0 "register_operand" "d"))
2495: (match_operand:SI 1 "register_operand" "d"))
2496: (set (mem:SI (plus:SI (match_dup 0)
2497: (match_operand:SI 2 "immediate_operand" "n")))
2498: (match_operand:SI 3 "register_operand" "d"))]
2499: "(i960_si_di (operands[0], 0) && ((REGNO (operands[1]) & 1) == 0)
2500: && (REGNO (operands[1]) + 1 == REGNO (operands[3]))
2501: && (INTVAL (operands[2]) == 4))"
2502: "stl %1,(%0)")
2503:
2504: ;;- Local variables:
2505: ;;- mode:emacs-lisp
2506: ;;- comment-start: ";;- "
2507: ;;- eval: (set-syntax-table (copy-sequence (syntax-table)))
2508: ;;- eval: (modify-syntax-entry ?[ "(]")
2509: ;;- eval: (modify-syntax-entry ?] ")[")
2510: ;;- eval: (modify-syntax-entry ?{ "(}")
2511: ;;- eval: (modify-syntax-entry ?} "){")
2512: ;;- End:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.