*** empty log message ***
[gcc.git] / gcc / config / i960 / i960.c
1 /* Subroutines used for code generation on intel 80960.
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 #include <stdio.h>
24
25 #include "config.h"
26 #include "rtl.h"
27 #include "regs.h"
28 #include "hard-reg-set.h"
29 #include "real.h"
30 #include "insn-config.h"
31 #include "conditions.h"
32 #include "insn-flags.h"
33 #include "output.h"
34 #include "insn-attr.h"
35 #include "flags.h"
36 #include "tree.h"
37 #include "insn-codes.h"
38 #include "assert.h"
39 #include "expr.h"
40 #include "function.h"
41 #include "recog.h"
42 #include <math.h>
43
44 /* Save the operands last given to a compare for use when we
45 generate a scc or bcc insn. */
46
47 rtx i960_compare_op0, i960_compare_op1;
48
49 /* Used to implement #pragma align/noalign. Initialized by OVERRIDE_OPTIONS
50 macro in i960.h. */
51
52 static int i960_maxbitalignment;
53 static int i960_last_maxbitalignment;
54
55 /* Used to implement switching between MEM and ALU insn types, for better
56 C series performance. */
57
58 enum insn_types i960_last_insn_type;
59
60 /* Where to save/restore register 14 to/from before/after a procedure call
61 when it holds an argument block pointer. */
62
63 static rtx g14_save_reg;
64
65 /* The leaf-procedure return register. Set only if this is a leaf routine. */
66
67 static int i960_leaf_ret_reg;
68
69 /* True if replacing tail calls with jumps is OK. */
70
71 static int tail_call_ok;
72
73 /* A string containing a list of insns to emit in the epilogue so as to
74 restore all registers saved by the prologue. Created by the prologue
75 code as it saves registers away. */
76
77 char epilogue_string[1000];
78
79 /* A unique number (per function) for return labels. */
80
81 static int ret_label = 0;
82
83 #if 0
84 /* Handle pragmas for compatibility with Intel's compilers. */
85
86 /* ??? This is incomplete, since it does not handle all pragmas that the
87 intel compilers understand. Also, it needs to be rewritten to accept
88 a stream instead of a string for GCC 2. */
89
90 void
91 process_pragma(str)
92 char *str;
93 {
94 int align;
95 int i;
96
97 if ((i = sscanf (str, " align %d", &align)) == 1)
98 switch (align)
99 {
100 case 0: /* Return to last alignment. */
101 align = i960_last_maxbitalignment / 8;
102
103 case 16: /* Byte alignments. */
104 case 8:
105 case 4:
106 case 2:
107 case 1:
108 i960_last_maxbitalignment = i960_maxbitalignment;
109 i960_maxbitalignment = align * 8;
110 break;
111
112 default: /* Unknown, silently ignore. */
113 break;
114 }
115
116 /* NOTE: ic960 R3.0 pragma align definition:
117
118 #pragma align [(size)] | (identifier=size[,...])
119 #pragma noalign [(identifier)[,...]]
120
121 (all parens are optional)
122
123 - size is [1,2,4,8,16]
124 - noalign means size==1
125 - applies only to component elements of a struct (and union?)
126 - identifier applies to structure tag (only)
127 - missing identifier means next struct
128
129 - alignment rules for bitfields need more investigation */
130
131 /* Should be pragma 'far' or equivalent for callx/balx here. */
132 }
133 #endif
134
135 /* Initialize variables before compiling any files. */
136
137 void
138 i960_initialize ()
139 {
140 if (TARGET_IC_COMPAT2_0)
141 {
142 i960_maxbitalignment = 8;
143 i960_last_maxbitalignment = 128;
144 }
145 else
146 {
147 i960_maxbitalignment = 128;
148 i960_last_maxbitalignment = 8;
149 }
150 }
151 \f
152 /* Return true if OP can be used as the source of an fp move insn. */
153
154 int
155 fpmove_src_operand (op, mode)
156 rtx op;
157 enum machine_mode mode;
158 {
159 return (GET_CODE (op) == CONST_DOUBLE || general_operand (op, mode));
160 }
161
162 #if 0
163 /* Return true if OP is a register or zero. */
164
165 int
166 reg_or_zero_operand (op, mode)
167 rtx op;
168 enum machine_mode mode;
169 {
170 return register_operand (op, mode) || op == const0_rtx;
171 }
172 #endif
173
174 /* Return truth value of whether OP can be used as an operands in a three
175 address arithmetic insn (such as add %o1,7,%l2) of mode MODE. */
176
177 int
178 arith_operand (op, mode)
179 rtx op;
180 enum machine_mode mode;
181 {
182 return (register_operand (op, mode) || literal (op, mode));
183 }
184
185 /* Return true if OP is a register or a valid floating point literal. */
186
187 int
188 fp_arith_operand (op, mode)
189 rtx op;
190 enum machine_mode mode;
191 {
192 return (register_operand (op, mode) || fp_literal (op, mode));
193 }
194
195 /* Return true is OP is a register or a valid signed integer literal. */
196
197 int
198 signed_arith_operand (op, mode)
199 rtx op;
200 enum machine_mode mode;
201 {
202 return (register_operand (op, mode) || signed_literal (op, mode));
203 }
204
205 /* Return truth value of whether OP is a integer which fits the
206 range constraining immediate operands in three-address insns. */
207
208 int
209 literal (op, mode)
210 rtx op;
211 enum machine_mode mode;
212 {
213 return ((GET_CODE (op) == CONST_INT) && INTVAL(op) >= 0 && INTVAL(op) < 32);
214 }
215
216 /* Return true if OP is a float constant of 1. */
217
218 int
219 fp_literal_one (op, mode)
220 rtx op;
221 enum machine_mode mode;
222 {
223 return (TARGET_NUMERICS && (mode == VOIDmode || mode == GET_MODE (op))
224 && (op == CONST1_RTX (mode)));
225 }
226
227 /* Return true if OP is a float constant of 0. */
228
229 int
230 fp_literal_zero (op, mode)
231 rtx op;
232 enum machine_mode mode;
233 {
234 return (TARGET_NUMERICS && (mode == VOIDmode || mode == GET_MODE (op))
235 && (op == CONST0_RTX (mode)));
236 }
237
238 /* Return true if OP is a valid floating point literal. */
239
240 int
241 fp_literal(op, mode)
242 rtx op;
243 enum machine_mode mode;
244 {
245 return fp_literal_zero (op, mode) || fp_literal_one (op, mode);
246 }
247
248 /* Return true if OP is a valid signed immediate constant. */
249
250 int
251 signed_literal(op, mode)
252 rtx op;
253 enum machine_mode mode;
254 {
255 return ((GET_CODE (op) == CONST_INT) && INTVAL(op) > -32 && INTVAL(op) < 32);
256 }
257
258 /* Return truth value of statement that OP is a symbolic memory
259 operand of mode MODE. */
260
261 int
262 symbolic_memory_operand (op, mode)
263 rtx op;
264 enum machine_mode mode;
265 {
266 if (GET_CODE (op) == SUBREG)
267 op = SUBREG_REG (op);
268 if (GET_CODE (op) != MEM)
269 return 0;
270 op = XEXP (op, 0);
271 return (GET_CODE (op) == SYMBOL_REF || GET_CODE (op) == CONST
272 || GET_CODE (op) == HIGH || GET_CODE (op) == LABEL_REF);
273 }
274
275 /* Return truth value of whether OP is EQ or NE. */
276
277 int
278 eq_or_neq (op, mode)
279 rtx op;
280 enum machine_mode mode;
281 {
282 return (GET_CODE (op) == EQ || GET_CODE (op) == NE);
283 }
284
285 /* OP is an integer register or a constant. */
286
287 int
288 arith32_operand (op, mode)
289 rtx op;
290 enum machine_mode mode;
291 {
292 if (register_operand (op, mode))
293 return 1;
294 return (CONSTANT_P (op));
295 }
296
297 /* Return true if OP is an integer constant which is a power of 2. */
298
299 int
300 power2_operand (op,mode)
301 rtx op;
302 enum machine_mode mode;
303 {
304 if (GET_CODE(op) != CONST_INT)
305 return 0;
306
307 return exact_log2 (INTVAL (op)) >= 0;
308 }
309
310 /* If VAL has only one bit set, return the index of that bit. Otherwise
311 return -1. */
312
313 int
314 bitpos (val)
315 unsigned int val;
316 {
317 register int i;
318
319 for (i = 0; val != 0; i++, val >>= 1)
320 {
321 if (val & 1)
322 {
323 if (val != 1)
324 return -1;
325 return i;
326 }
327 }
328 return -1;
329 }
330
331 /* Return non-zero if OP is a mask, i.e. all one bits are consecutive.
332 The return value indicates how many consecutive non-zero bits exist
333 if this is a mask. This is the same as the next function, except that
334 it does not indicate what the start and stop bit positions are. */
335
336 int
337 is_mask (val)
338 unsigned int val;
339 {
340 register int start, end, i;
341
342 start = -1;
343 for (i = 0; val != 0; val >>= 1, i++)
344 {
345 if (val & 1)
346 {
347 if (start < 0)
348 start = i;
349
350 end = i;
351 continue;
352 }
353 /* Still looking for the first bit. */
354 if (start < 0)
355 continue;
356
357 /* We've seen the start of a bit sequence, and now a zero. There
358 must be more one bits, otherwise we would have exited the loop.
359 Therefore, it is not a mask. */
360 if (val)
361 return 0;
362 }
363
364 /* The bit string has ones from START to END bit positions only. */
365 return end - start + 1;
366 }
367
368 /* If VAL is a mask, then return nonzero, with S set to the starting bit
369 position and E set to the ending bit position of the mask. The return
370 value indicates how many consecutive bits exist in the mask. This is
371 the same as the previous function, except that it also indicates the
372 start and end bit positions of the mask. */
373
374 int
375 bitstr (val, s, e)
376 unsigned int val;
377 int *s, *e;
378 {
379 register int start, end, i;
380
381 start = -1;
382 end = -1;
383 for (i = 0; val != 0; val >>= 1, i++)
384 {
385 if (val & 1)
386 {
387 if (start < 0)
388 start = i;
389
390 end = i;
391 continue;
392 }
393
394 /* Still looking for the first bit. */
395 if (start < 0)
396 continue;
397
398 /* We've seen the start of a bit sequence, and now a zero. There
399 must be more one bits, otherwise we would have exited the loop.
400 Therefor, it is not a mask. */
401 if (val)
402 {
403 start = -1;
404 end = -1;
405 break;
406 }
407 }
408
409 /* The bit string has ones from START to END bit positions only. */
410 *s = start;
411 *e = end;
412 return ((start < 0) ? 0 : end - start + 1);
413 }
414 \f
415 /* Return the machine mode to use for a comparison. */
416
417 enum machine_mode
418 select_cc_mode (op, x)
419 RTX_CODE op;
420 rtx x;
421 {
422 if (op == GTU || op == LTU || op == GEU || op == LEU)
423 return CC_UNSmode;
424 return CCmode;
425 }
426
427 /* X and Y are two things to compare using CODE. Emit the compare insn and
428 return the rtx for register 36 in the proper mode. */
429
430 rtx
431 gen_compare_reg (code, x, y)
432 enum rtx_code code;
433 rtx x, y;
434 {
435 rtx cc_reg;
436 enum machine_mode ccmode = SELECT_CC_MODE (code, x);
437 enum machine_mode mode
438 = GET_MODE (x) == VOIDmode ? GET_MODE (y) : GET_MODE (x);
439
440 if (mode == SImode)
441 {
442 if (! arith_operand (x, mode))
443 x = force_reg (SImode, x);
444 if (! arith_operand (y, mode))
445 y = force_reg (SImode, y);
446 }
447
448 cc_reg = gen_rtx (REG, ccmode, 36);
449 emit_insn (gen_rtx (SET, VOIDmode, cc_reg,
450 gen_rtx (COMPARE, ccmode, x, y)));
451
452 return cc_reg;
453 }
454
455 /* For the i960, REG is cost 1, REG+immed CONST is cost 2, REG+REG is cost 2,
456 REG+nonimmed CONST is cost 4. REG+SYMBOL_REF, SYMBOL_REF, and similar
457 are 4. Indexed addresses are cost 6. */
458
459 /* ??? Try using just RTX_COST, i.e. not defining ADDRESS_COST. */
460
461 int
462 i960_address_cost (x)
463 rtx x;
464 {
465 #if 0
466 /* Handled before calling here. */
467 if (GET_CODE (x) == REG)
468 return 1;
469 #endif
470 if (GET_CODE (x) == PLUS)
471 {
472 rtx base = XEXP (x, 0);
473 rtx offset = XEXP (x, 1);
474
475 if (GET_CODE (base) == SUBREG)
476 base = SUBREG_REG (base);
477 if (GET_CODE (offset) == SUBREG)
478 offset = SUBREG_REG (offset);
479
480 if (GET_CODE (base) == REG)
481 {
482 if (GET_CODE (offset) == REG)
483 return 2;
484 if (GET_CODE (offset) == CONST_INT)
485 {
486 if ((unsigned)INTVAL (offset) < 2047)
487 return 2;
488 return 4;
489 }
490 if (CONSTANT_P (offset))
491 return 4;
492 }
493 if (GET_CODE (base) == PLUS || GET_CODE (base) == MULT)
494 return 6;
495
496 abort ();
497 }
498 if (GET_CODE (x) == MULT)
499 return 6;
500
501 /* Symbol_refs and other unrecognized addresses are cost 4. */
502 return 4;
503 }
504 \f
505 /* Emit insns to move operands[1] into operands[0].
506
507 Return 1 if we have written out everything that needs to be done to
508 do the move. Otherwise, return 0 and the caller will emit the move
509 normally. */
510
511 int
512 emit_move_sequence (operands, mode)
513 rtx *operands;
514 enum machine_mode mode;
515 {
516 register rtx operand0 = operands[0];
517 register rtx operand1 = operands[1];
518
519 /* We can only store registers to memory. */
520
521 if (GET_CODE (operand0) == MEM && GET_CODE (operand1) != REG)
522 operands[1] = force_reg (mode, operand1);
523
524 return 0;
525 }
526 \f
527 /* Emit insns to load a constant. Uses several strategies to try to use
528 as few insns as possible. */
529
530 char *
531 i960_output_ldconst (dst, src)
532 register rtx dst, src;
533 {
534 register int rsrc1;
535 register unsigned rsrc2;
536 enum machine_mode mode = GET_MODE (dst);
537 rtx operands[4];
538 union { long l[2]; double d; } x;
539
540 operands[0] = operands[2] = dst;
541 operands[1] = operands[3] = src;
542
543 /* Anything that isn't a compile time constant, such as a SYMBOL_REF,
544 must be a ldconst insn. */
545
546 if (GET_CODE (src) != CONST_INT && GET_CODE (src) != CONST_DOUBLE)
547 {
548 output_asm_insn ("ldconst %1,%0", operands);
549 return "";
550 }
551 else if (mode == DFmode)
552 {
553 rtx first, second;
554
555 if (fp_literal_zero (src, VOIDmode))
556 {
557 if (FP_REG_P (dst))
558 return "movrl %1,%0";
559 else
560 return "movl 0,%0";
561 }
562
563 #if HOST_FLOAT_FORMAT == TARGET_FLOAT_FORMAT
564 split_double (src, &first, &second);
565
566 output_asm_insn ("# ldconst %1,%0",operands);
567
568 operands[0] = gen_rtx (REG, SImode, REGNO (dst));
569 operands[1] = first;
570 output_asm_insn (i960_output_ldconst (operands[0], operands[1]),
571 operands);
572 operands[0] = gen_rtx (REG, SImode, REGNO (dst) + 1);
573 operands[1] = second;
574 output_asm_insn (i960_output_ldconst (operands[0], operands[1]),
575 operands);
576 return "";
577 #else
578 if (fp_literal_one (src, VOIDmode))
579 return "movrl 0f1.0,%0";
580 fatal ("inline double constants not supported on this host");
581 #endif
582 }
583 else if (mode == TImode)
584 {
585 /* ??? This is currently not handled at all. */
586 abort ();
587
588 /* Note: lowest order word goes in lowest numbered reg. */
589 rsrc1 = INTVAL (src);
590 if (rsrc1 >= 0 && rsrc1 < 32)
591 return "movq %1,%0";
592 else
593 output_asm_insn ("movq\t0,%0\t# ldconstq %1,%0",operands);
594 /* Go pick up the low-order word. */
595 }
596 else if (mode == DImode)
597 {
598 rtx upperhalf, lowerhalf;
599 char *string;
600
601 if (GET_CODE (src) == CONST_DOUBLE)
602 {
603 upperhalf = gen_rtx (CONST_INT, VOIDmode, CONST_DOUBLE_HIGH (src));
604 lowerhalf = gen_rtx (CONST_INT, VOIDmode, CONST_DOUBLE_LOW (src));
605 }
606 else if (GET_CODE (src) == CONST_INT)
607 {
608 lowerhalf = src;
609 upperhalf = INTVAL (src) < 0 ? constm1_rtx : const0_rtx;
610 }
611 else
612 abort ();
613
614 /* Note: lowest order word goes in lowest numbered reg. */
615 /* Numbers from 0 to 31 can be handled with a single insn. */
616 rsrc1 = INTVAL (lowerhalf);
617 if (upperhalf == const0_rtx && rsrc1 >= 0 && rsrc1 < 32)
618 return "movl %1,%0";
619
620 /* Output the upper half with a recursive call. */
621 string = i960_output_ldconst (gen_rtx (REG, SImode, REGNO (dst) + 1),
622 upperhalf);
623 output_asm_insn (string);
624 /* The lower word is emitted as normally. */
625 }
626 else if (mode == SFmode)
627 {
628 #if HOST_FLOAT_FORMAT == TARGET_FLOAT_FORMAT
629 union { long l; float f; } flt;
630
631 flt.f = (float) *((double *) &CONST_DOUBLE_LOW (src));
632
633 output_asm_insn ("# ldconst %1,%0",operands);
634 operands[0] = gen_rtx (REG, SImode, REGNO (dst));
635 operands[1] = gen_rtx (CONST_INT, VOIDmode, flt.l);
636 output_asm_insn (i960_output_ldconst (operands[0], operands[1]),
637 operands);
638 #else
639 if (fp_literal_zero (src, VOIDmode))
640 return "movr 0f0.0,%0";
641 if (fp_literal_one (src, VOIDmode))
642 return "movr 0f1.0,%0";
643 fatal ("inline float constants not supported on this host");
644 #endif
645 return "";
646 }
647 else
648 {
649 rsrc1 = INTVAL (src);
650 if (mode == QImode)
651 {
652 if (rsrc1 > 0xff)
653 rsrc1 &= 0xff;
654 }
655 else if (mode == HImode)
656 {
657 if (rsrc1 > 0xffff)
658 rsrc1 &= 0xffff;
659 }
660 }
661
662 if (rsrc1 >= 0)
663 {
664 /* ldconst 0..31,X -> mov 0..31,X */
665 if (rsrc1 < 32)
666 {
667 if (i960_last_insn_type == I_TYPE_REG && TARGET_C_SERIES)
668 return "lda %1,%0";
669 return "mov %1,%0";
670 }
671
672 /* ldconst 32..63,X -> add 31,nn,X */
673 if (rsrc1 < 63)
674 {
675 if (i960_last_insn_type == I_TYPE_REG && TARGET_C_SERIES)
676 return "lda %1,%0";
677 operands[1] = gen_rtx (CONST_INT, VOIDmode, rsrc1 - 31);
678 output_asm_insn ("addo\t31,%1,%0\t# ldconst %3,%0", operands);
679 return "";
680 }
681 }
682 else if (rsrc1 < 0)
683 {
684 /* ldconst -1..-31 -> sub 0,0..31,X */
685 if (rsrc1 >= -31)
686 {
687 /* return 'sub -(%1),0,%0' */
688 operands[1] = gen_rtx (CONST_INT, VOIDmode, - rsrc1);
689 output_asm_insn ("subo\t%1,0,%0\t# ldconst %3,%0", operands);
690 return "";
691 }
692
693 /* ldconst -32 -> not 31,X */
694 if (rsrc1 == -32)
695 {
696 operands[1] = gen_rtx (CONST_INT, VOIDmode, ~rsrc1);
697 output_asm_insn ("not\t%1,%0 # ldconst %3,%0", operands);
698 return "";
699 }
700 }
701
702 /* If const is a single bit. */
703 if (bitpos (rsrc1) >= 0)
704 {
705 operands[1] = gen_rtx (CONST_INT, VOIDmode, bitpos (rsrc1));
706 output_asm_insn ("setbit\t%1,0,%0\t# ldconst %3,%0", operands);
707 return "";
708 }
709
710 /* If const is a bit string of less than 6 bits (1..31 shifted). */
711 if (is_mask (rsrc1))
712 {
713 int s, e;
714
715 if (bitstr (rsrc1, &s, &e) < 6)
716 {
717 rsrc2 = ((unsigned int) rsrc1) >> s;
718 operands[1] = gen_rtx (CONST_INT, VOIDmode, rsrc2);
719 operands[2] = gen_rtx (CONST_INT, VOIDmode, s);
720 output_asm_insn ("shlo\t%2,%1,%0\t# ldconst %3,%0", operands);
721 return "";
722 }
723 }
724
725 /* Unimplemented cases:
726 const is in range 0..31 but rotated around end of word:
727 ror 31,3,g0 -> ldconst 0xe0000003,g0
728
729 and any 2 instruction cases that might be worthwhile */
730
731 output_asm_insn ("ldconst %1,%0", operands);
732 return "";
733 }
734
735 /* Determine if there is an opportunity for a bypass optimization.
736 Bypass suceeds on the 960K* if the destination of the previous
737 instruction is the second operand of the current instruction.
738 Bypass always succeeds on the C*.
739
740 Return 1 if the pattern should interchange the operands.
741
742 CMPBR_FLAG is true if this is for a compare-and-branch insn.
743 OP1 and OP2 are the two source operands of a 3 operand insn. */
744
745 int
746 i960_bypass (insn, op1, op2, cmpbr_flag)
747 register rtx insn, op1, op2;
748 int cmpbr_flag;
749 {
750 register rtx prev_insn, prev_dest;
751
752 if (TARGET_C_SERIES)
753 return 0;
754
755 /* Can't do this if op1 isn't a register. */
756 if (! REG_P (op1))
757 return 0;
758
759 /* Can't do this for a compare-and-branch if both ops aren't regs. */
760 if (cmpbr_flag && ! REG_P (op2))
761 return 0;
762
763 prev_insn = prev_real_insn (insn);
764
765 if (prev_insn && GET_CODE (prev_insn) == INSN
766 && GET_CODE (PATTERN (prev_insn)) == SET)
767 {
768 prev_dest = SET_DEST (PATTERN (prev_insn));
769 if ((GET_CODE (prev_dest) == REG && REGNO (prev_dest) == REGNO (op1))
770 || (GET_CODE (prev_dest) == SUBREG
771 && GET_CODE (SUBREG_REG (prev_dest)) == REG
772 && REGNO (SUBREG_REG (prev_dest)) == REGNO (op1)))
773 return 1;
774 }
775 return 0;
776 }
777 \f
778 /* Output the code which declares the function name. This also handles
779 leaf routines, which have special requirements, and initializes some
780 global variables. */
781
782 void
783 i960_function_name_declare (file, name, fndecl)
784 FILE *file;
785 char *name;
786 tree fndecl;
787 {
788 register int i, j;
789 int leaf_proc_ok;
790 rtx insn;
791
792 /* Increment global return label. */
793
794 ret_label++;
795
796 /* Compute whether tail calls and leaf routine optimizations can be performed
797 for this function. */
798
799 if (TARGET_TAILCALL)
800 tail_call_ok = 1;
801 else
802 tail_call_ok = 0;
803
804 if (TARGET_LEAFPROC)
805 leaf_proc_ok = 1;
806 else
807 leaf_proc_ok = 0;
808
809 /* Even if nobody uses extra parms, can't have leafroc or tail calls if
810 argblock, because argblock uses g14 implicitly. */
811
812 if (current_function_args_size > 48)
813 {
814 tail_call_ok = 0;
815 leaf_proc_ok = 0;
816 }
817
818 /* See if caller passes in an address to return value. */
819
820 if (aggregate_value_p (DECL_RESULT (fndecl)))
821 {
822 tail_call_ok = 0;
823 leaf_proc_ok = 0;
824 }
825
826 /* Can not use tail calls or make this a leaf routine if there is a non
827 zero frame size. */
828
829 if (get_frame_size () != 0)
830 leaf_proc_ok = 0;
831
832 /* I don't understand this condition, and do not think that it is correct.
833 Apparently this is just checking whether the frame pointer is used, and
834 we can't trust regs_ever_live[fp] since it is (almost?) always set. */
835
836 if (tail_call_ok)
837 for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
838 if (GET_CODE (insn) == INSN
839 && reg_mentioned_p (frame_pointer_rtx, insn))
840 {
841 tail_call_ok = 0;
842 break;
843 }
844
845 /* Check for CALL insns. Can not be a leaf routine if there are any. */
846
847 if (leaf_proc_ok)
848 for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
849 if (GET_CODE (insn) == CALL_INSN)
850 {
851 leaf_proc_ok = 0;
852 break;
853 }
854
855 /* Can not be a leaf routine if any non-call clobbered registers are
856 used in this function. */
857
858 if (leaf_proc_ok)
859 for (i = 0, j = 0; i < FIRST_PSEUDO_REGISTER; i++)
860 if (regs_ever_live[i]
861 && ((! call_used_regs[i]) || (i > 7 && i < 12)))
862 {
863 /* Global registers. */
864 if (i < 16 && i > 7 && i != 13)
865 leaf_proc_ok = 0;
866 /* Local registers. */
867 else if (i < 32)
868 leaf_proc_ok = 0;
869 }
870
871 /* Now choose a leaf return register, if we can find one, and if it is
872 OK for this to be a leaf routine. */
873
874 i960_leaf_ret_reg = -1;
875
876 if (optimize && leaf_proc_ok)
877 {
878 for (i960_leaf_ret_reg = -1, i = 0; i < 8; i++)
879 if (regs_ever_live[i] == 0)
880 {
881 i960_leaf_ret_reg = i;
882 regs_ever_live[i] = 1;
883 break;
884 }
885 }
886
887 /* Do this after choosing the leaf return register, so it will be listed
888 if one was chosen. */
889
890 fprintf (file, "\t# Function '%s'\n", name);
891 fprintf (file, "\t# Registers used: ");
892
893 for (i = 0, j = 0; i < FIRST_PSEUDO_REGISTER; i++)
894 {
895 if (regs_ever_live[i])
896 {
897 fprintf (file, "%s%s ", reg_names[i], call_used_regs[i] ? "" : "*");
898
899 if (i > 15 && j == 0)
900 {
901 fprintf (file,"\n\t#\t\t ");
902 j++;
903 }
904 }
905 }
906
907 fprintf (file, "\n");
908
909 if (i960_leaf_ret_reg >= 0)
910 {
911 /* Make it a leaf procedure. */
912
913 if (TREE_PUBLIC (fndecl))
914 fprintf (file,"\t.globl %s.lf\n", name);
915
916 fprintf (file, "\t.leafproc\t_%s,%s.lf\n", name, name);
917 fprintf (file, "_%s:\n", name);
918 fprintf (file, "\tlda LR%d,g14\n", ret_label);
919 fprintf (file, "%s.lf:\n", name);
920 fprintf (file, "\tmov g14,g%d\n", i960_leaf_ret_reg);
921
922 if (TARGET_C_SERIES)
923 {
924 fprintf (file, "\tlda 0,g14\n");
925 i960_last_insn_type = I_TYPE_MEM;
926 }
927 else
928 {
929 fprintf (file, "\tmov 0,g14\n");
930 i960_last_insn_type = I_TYPE_REG;
931 }
932 }
933 else
934 {
935 ASM_OUTPUT_LABEL (file, name);
936 i960_last_insn_type = I_TYPE_CTRL;
937 }
938 }
939 \f
940 /* Compute and return the frame size. */
941
942 int
943 compute_frame_size (size)
944 int size;
945 {
946 int actual_fsize;
947 int outgoing_args_size
948 = current_function_outgoing_args_size + current_function_pretend_args_size;
949
950 /* The STARTING_FRAME_OFFSET is totally hidden to us as far
951 as size is concerned. */
952 actual_fsize = (size + 15) & -16;
953 actual_fsize += (outgoing_args_size + 15) & -16;
954
955 return actual_fsize;
956 }
957
958 /* Output code for the function prologue. */
959
960 void
961 i960_function_prologue (file, size)
962 FILE *file;
963 unsigned int size;
964 {
965 register int i, j, nr;
966 int n_iregs = 0;
967 int rsize = 0;
968 int actual_fsize;
969 char tmpstr[1000];
970 /* -1 if reg must be saved on proc entry, 0 if available, 1 if saved
971 somewhere. */
972 int regs[FIRST_PSEUDO_REGISTER];
973
974 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
975 if (regs_ever_live[i]
976 && ((! call_used_regs[i]) || (i > 7 && i < 12)))
977 {
978 regs[i] = -1;
979 /* Count global registers that need saving. */
980 if (i < 16)
981 n_iregs++;
982 }
983 else
984 regs[i] = 0;
985
986 epilogue_string[0] = '\0';
987
988 /* First look for local registers to save globals in. */
989 for (i = 0; i < 16; i++)
990 {
991 if (regs[i] == 0)
992 continue;
993
994 /* Start at r4, not r3. */
995 for (j = 20; j < 32; j++)
996 {
997 if (regs[j] != 0)
998 continue;
999
1000 regs[i] = 1;
1001 regs[j] = -1;
1002 regs_ever_live[j] = 1;
1003 nr = 1;
1004 if (i <= 14 && i % 2 == 0 && j <= 30 && j % 2 == 0
1005 && regs[i+1] != 0 && regs[j+1] == 0)
1006 {
1007 nr = 2;
1008 regs[i+1] = 1;
1009 regs[j+1] = -1;
1010 regs_ever_live[j+1] = 1;
1011 }
1012 if (nr == 2 && i <= 12 && i % 4 == 0 && j <= 28 && j % 4 == 0
1013 && regs[i+2] != 0 && regs[j+2] == 0)
1014 {
1015 nr = 3;
1016 regs[i+2] = 1;
1017 regs[j+2] = -1;
1018 regs_ever_live[j+2] = 1;
1019 }
1020 if (nr == 3 && regs[i+3] != 0 && regs[j+3] == 0)
1021 {
1022 nr = 4;
1023 regs[i+3] = 1;
1024 regs[j+3] = -1;
1025 regs_ever_live[j+3] = 1;
1026 }
1027
1028 fprintf (file, "\tmov%s %s,%s\n",
1029 ((nr == 4) ? "q" :
1030 (nr == 3) ? "t" :
1031 (nr == 2) ? "l" : ""),
1032 reg_names[i], reg_names[j]);
1033 sprintf (tmpstr, "\tmov%s %s,%s\n",
1034 ((nr == 4) ? "q" :
1035 (nr == 3) ? "t" :
1036 (nr == 2) ? "l" : ""),
1037 reg_names[j], reg_names[i]);
1038 strcat (epilogue_string, tmpstr);
1039
1040 n_iregs -= nr;
1041 i += nr-1;
1042 break;
1043 }
1044 }
1045
1046 /* N_iregs is now the number of global registers that haven't been saved
1047 yet. */
1048
1049 rsize = (n_iregs * 4);
1050 actual_fsize = compute_frame_size (size) + rsize;
1051 #if 0
1052 /* ??? The 1.2.1 compiler does this also. This is meant to round the frame
1053 size up to the nearest multiple of 16. I don't know whether this is
1054 necessary, or even desirable. */
1055 actual_fsize = (actual_fsize + 15) & ~0xF;
1056 #endif
1057
1058 /* Allocate space for register save and locals. */
1059 if (actual_fsize > 0)
1060 {
1061 if (actual_fsize < 32)
1062 fprintf (file, "\taddo %d,sp,sp\n", actual_fsize);
1063 else
1064 fprintf (file, "\tlda\t%d(sp),sp\n", actual_fsize);
1065 }
1066
1067 /* Save registers on stack if needed. */
1068 for (i = 0, j = n_iregs; j > 0 && i < 16; i++)
1069 {
1070 if (regs[i] != -1)
1071 continue;
1072
1073 nr = 1;
1074
1075 if (i <= 14 && i % 2 == 0 && regs[i+1] == -1)
1076 nr = 2;
1077
1078 if (nr == 2 && i <= 12 && i % 4 == 0 && regs[i+2] == -1)
1079 nr = 3;
1080
1081 if (nr == 3 && regs[i+3] == -1)
1082 nr = 4;
1083
1084 fprintf (file,"\tst%s %s,%d(fp)\n",
1085 ((nr == 4) ? "q" :
1086 (nr == 3) ? "t" :
1087 (nr == 2) ? "l" : ""),
1088 reg_names[i], size+(nr*4));
1089 sprintf (tmpstr,"\tld%s %d(fp),%s\n",
1090 ((nr == 4) ? "q" :
1091 (nr == 3) ? "t" :
1092 (nr == 2) ? "l" : ""),
1093 size+(nr*4), reg_names[i]);
1094 strcat (epilogue_string, tmpstr);
1095 i += nr-1;
1096 j -= nr;
1097 }
1098
1099 if (actual_fsize == 0 && size == 0 && rsize == 0)
1100 return;
1101
1102 fprintf (file, "\t#Prologue stats:\n");
1103 fprintf (file, "\t# Total Frame Size: %d bytes\n", actual_fsize);
1104
1105 if (size)
1106 fprintf (file, "\t# Local Variable Size: %d bytes\n", size);
1107 if (rsize)
1108 fprintf (file, "\t# Register Save Size: %d regs, %d bytes\n",
1109 n_iregs, rsize);
1110 fprintf (file, "\t#End Prologue#\n");
1111 }
1112
1113 /* Output code for the function epilogue. */
1114
1115 void
1116 i960_function_epilogue (file, size)
1117 FILE *file;
1118 unsigned int size;
1119 {
1120 if (i960_leaf_ret_reg >= 0)
1121 {
1122 fprintf (file, "LR%d: ret\n", ret_label);
1123 return;
1124 }
1125
1126 if (*epilogue_string == 0)
1127 {
1128 register rtx tmp;
1129
1130 /* Emit a return insn, but only if control can fall through to here. */
1131
1132 tmp = get_last_insn ();
1133 while (tmp)
1134 {
1135 if (GET_CODE (tmp) == BARRIER)
1136 return;
1137 if (GET_CODE (tmp) == CODE_LABEL)
1138 break;
1139 if (GET_CODE (tmp) == JUMP_INSN)
1140 {
1141 if (GET_CODE (PATTERN (tmp)) == RETURN)
1142 return;
1143 break;
1144 }
1145 if (GET_CODE (tmp) == NOTE)
1146 {
1147 tmp = PREV_INSN (tmp);
1148 continue;
1149 }
1150 break;
1151 }
1152 fprintf (file, "LR%d: ret\n", ret_label);
1153 return;
1154 }
1155
1156 fprintf (file, "LR%d:\n", ret_label);
1157
1158 fprintf (file, "\t#EPILOGUE#\n");
1159
1160 /* Output the string created by the prologue which will restore all
1161 registers saved by the prologue. */
1162
1163 if (epilogue_string[0] != '\0')
1164 fprintf (file, "%s", epilogue_string);
1165
1166 /* Must clear g14 on return. */
1167
1168 if (current_function_args_size > 48)
1169 fprintf (file, "\tmov 0,g14\n");
1170
1171 fprintf (file, "\tret\n");
1172 fprintf (file, "\t#End Epilogue#\n");
1173 }
1174
1175 /* Output code for a call insn. */
1176
1177 char *
1178 i960_output_call_insn (target, argsize_rtx, insn)
1179 register rtx target, argsize_rtx, insn;
1180 {
1181 int non_indirect;
1182 int argsize = INTVAL (argsize_rtx);
1183 rtx nexti = next_real_insn (insn);
1184 rtx operands[1];
1185
1186 operands[0] = target;
1187
1188 non_indirect = ((GET_CODE (target) == MEM)
1189 && (GET_CODE (XEXP (target, 0)) == SYMBOL_REF));
1190
1191 /* Nexti could be zero if the called routine is volatile. */
1192 if (optimize && (*epilogue_string == 0) && argsize == 0 && tail_call_ok
1193 && (nexti == 0 || GET_CODE (PATTERN (nexti)) == RETURN))
1194 {
1195 /* Delete following return insn. */
1196 if (nexti && no_labels_between_p (insn, nexti))
1197 delete_insn (nexti);
1198 output_asm_insn (non_indirect ? "b %0" : "bx %0",
1199 operands);
1200 return "# notreached";
1201 }
1202
1203 output_asm_insn (non_indirect ? "callj %0" : "callx %0", operands);
1204 return "";
1205 }
1206
1207 /* Output code for a return insn. */
1208
1209 char *
1210 i960_output_ret_insn (insn)
1211 register rtx insn;
1212 {
1213 static char lbuf[20];
1214
1215 if (*epilogue_string != 0)
1216 {
1217 if (! TARGET_CODE_ALIGN && next_real_insn (insn) == 0)
1218 return "";
1219
1220 sprintf (lbuf, "b LR%d", ret_label);
1221 return lbuf;
1222 }
1223
1224 if (current_function_args_size > 48)
1225 output_asm_insn ("mov 0,g14", 0);
1226
1227 if (i960_leaf_ret_reg >= 0)
1228 {
1229 sprintf (lbuf, "bx (%s)", reg_names[i960_leaf_ret_reg]);
1230 return lbuf;
1231 }
1232 return "ret";
1233 }
1234 \f
1235 #if 0
1236 /* Return a character string representing the branch prediction
1237 opcode to be tacked on an instruction. This must at least
1238 return a null string. */
1239
1240 char *
1241 i960_br_predict_opcode (lab_ref, insn)
1242 rtx lab_ref, insn;
1243 {
1244 if (TARGET_BRANCH_PREDICT)
1245 {
1246 unsigned long label_uid;
1247
1248 if (GET_CODE (lab_ref) == CODE_LABEL)
1249 label_uid = INSN_UID (lab_ref);
1250 else if (GET_CODE (lab_ref) == LABEL_REF)
1251 label_uid = INSN_UID (XEXP (lab_ref, 0));
1252 else
1253 return ".f";
1254
1255 /* If not optimizing, then the insn_addresses array will not be
1256 valid. In this case, always return ".t" since most branches
1257 are taken. If optimizing, return .t for backward branches
1258 and .f for forward branches. */
1259 if (! optimize
1260 || insn_addresses[label_uid] < insn_addresses[INSN_UID (insn)])
1261 return ".t";
1262 return ".f";
1263 }
1264
1265 return "";
1266 }
1267 #endif
1268
1269 /* Print the operand represented by rtx X formatted by code CODE. */
1270
1271 void
1272 i960_print_operand (file, x, code)
1273 FILE *file;
1274 rtx x;
1275 char code;
1276 {
1277 enum rtx_code rtxcode = GET_CODE (x);
1278
1279 if (rtxcode == REG)
1280 {
1281 switch (code)
1282 {
1283 case 'D':
1284 /* Second reg of a double. */
1285 fprintf (file, "%s", reg_names[REGNO (x)+1]);
1286 break;
1287
1288 case 0:
1289 fprintf (file, "%s", reg_names[REGNO (x)]);
1290 break;
1291
1292 default:
1293 abort ();
1294 }
1295 return;
1296 }
1297 else if (rtxcode == MEM)
1298 {
1299 output_address (XEXP (x, 0));
1300 return;
1301 }
1302 else if (rtxcode == CONST_INT)
1303 {
1304 if (INTVAL (x) > 9999 || INTVAL (x) < -999)
1305 fprintf (file, "0x%x", INTVAL (x));
1306 else
1307 fprintf (file, "%d", INTVAL (x));
1308 return;
1309 }
1310 else if (rtxcode == CONST_DOUBLE)
1311 {
1312 double d;
1313
1314 if (x == CONST0_RTX (DFmode) || x == CONST0_RTX (SFmode))
1315 {
1316 fprintf (file, "0f0.0");
1317 return;
1318 }
1319 else if (x == CONST1_RTX (DFmode) || x == CONST1_RTX (SFmode))
1320 {
1321 fprintf (file, "0f1.0");
1322 return;
1323 }
1324
1325 /* This better be a comment. */
1326 REAL_VALUE_FROM_CONST_DOUBLE (d, x);
1327 fprintf (file, "%#g", d);
1328 return;
1329 }
1330
1331 switch(code)
1332 {
1333 case 'B':
1334 /* Branch or jump, depending on assembler. */
1335 if (TARGET_ASM_COMPAT)
1336 fputs ("j", file);
1337 else
1338 fputs ("b", file);
1339 break;
1340
1341 case 'S':
1342 /* Sign of condition. */
1343 if ((rtxcode == EQ) || (rtxcode == NE) || (rtxcode == GTU)
1344 || (rtxcode == LTU) || (rtxcode == GEU) || (rtxcode == LEU))
1345 fputs ("o", file);
1346 else if ((rtxcode == GT) || (rtxcode == LT)
1347 || (rtxcode == GE) || (rtxcode == LE))
1348 fputs ("i", file);
1349 else
1350 abort();
1351 break;
1352
1353 case 'I':
1354 /* Inverted condition. */
1355 rtxcode = reverse_condition (rtxcode);
1356 goto normal;
1357
1358 case 'X':
1359 /* Inverted condition w/ reversed operands. */
1360 rtxcode = reverse_condition (rtxcode);
1361 /* Fallthrough. */
1362
1363 case 'R':
1364 /* Reversed operand condition. */
1365 rtxcode = swap_condition (rtxcode);
1366 /* Fallthrough. */
1367
1368 case 'C':
1369 /* Normal condition. */
1370 normal:
1371 if (rtxcode == EQ) { fputs ("e", file); return; }
1372 else if (rtxcode == NE) { fputs ("ne", file); return; }
1373 else if (rtxcode == GT) { fputs ("g", file); return; }
1374 else if (rtxcode == GTU) { fputs ("g", file); return; }
1375 else if (rtxcode == LT) { fputs ("l", file); return; }
1376 else if (rtxcode == LTU) { fputs ("l", file); return; }
1377 else if (rtxcode == GE) { fputs ("ge", file); return; }
1378 else if (rtxcode == GEU) { fputs ("ge", file); return; }
1379 else if (rtxcode == LE) { fputs ("le", file); return; }
1380 else if (rtxcode == LEU) { fputs ("le", file); return; }
1381 else abort ();
1382 break;
1383
1384 case 0:
1385 output_addr_const (file, x);
1386 break;
1387
1388 default:
1389 abort ();
1390 }
1391
1392 return;
1393 }
1394 \f
1395 /* Print a memory address as an operand to reference that memory location.
1396
1397 This is exactly the same as legitimate_address_p, except that it the prints
1398 addresses instead of recognizing them. */
1399
1400 void
1401 i960_print_operand_addr (file, addr)
1402 FILE *file;
1403 register rtx addr;
1404 {
1405 rtx breg, ireg;
1406 rtx scale, offset;
1407
1408 ireg = 0;
1409 breg = 0;
1410 offset = 0;
1411 scale = const1_rtx;
1412
1413 if (GET_CODE (addr) == REG)
1414 breg = addr;
1415 else if (CONSTANT_P (addr))
1416 offset = addr;
1417 else if (GET_CODE (addr) == PLUS)
1418 {
1419 rtx op0, op1;
1420
1421 op0 = XEXP (addr, 0);
1422 op1 = XEXP (addr, 1);
1423
1424 if (GET_CODE (op0) == REG)
1425 {
1426 breg = op0;
1427 if (GET_CODE (op1) == REG)
1428 ireg = op1;
1429 else if (CONSTANT_P (op1))
1430 offset = op1;
1431 else
1432 abort ();
1433 }
1434 else if (GET_CODE (op0) == PLUS)
1435 {
1436 if (GET_CODE (XEXP (op0, 0)) == MULT)
1437 {
1438 ireg = XEXP (XEXP (op0, 0), 0);
1439 scale = XEXP (XEXP (op0, 0), 1);
1440 if (GET_CODE (XEXP (op0, 1)) == REG)
1441 {
1442 breg = XEXP (op0, 1);
1443 offset = op1;
1444 }
1445 else
1446 abort ();
1447 }
1448 else if (GET_CODE (XEXP (op0, 0)) == REG)
1449 {
1450 breg = XEXP (op0, 0);
1451 if (GET_CODE (XEXP (op0, 1)) == REG)
1452 {
1453 ireg = XEXP (op0, 1);
1454 offset = op1;
1455 }
1456 else
1457 abort ();
1458 }
1459 else
1460 abort ();
1461 }
1462 else if (GET_CODE (op0) == MULT)
1463 {
1464 ireg = XEXP (op0, 0);
1465 scale = XEXP (op0, 1);
1466 if (GET_CODE (op1) == REG)
1467 breg = op1;
1468 else if (CONSTANT_P (op1))
1469 offset = op1;
1470 else
1471 abort ();
1472 }
1473 else
1474 abort ();
1475 }
1476 else if (GET_CODE (addr) == MULT)
1477 {
1478 breg = XEXP (addr, 0);
1479 scale = XEXP (addr, 1);
1480 }
1481 else
1482 abort ();
1483
1484 if (offset)
1485 output_addr_const (file, offset);
1486 if (breg)
1487 fprintf (file, "(%s)", reg_names[REGNO (breg)]);
1488 if (ireg)
1489 fprintf (file, "[%s*%d]", reg_names[REGNO (ireg)], INTVAL (scale));
1490 }
1491 \f
1492 /* GO_IF_LEGITIMATE_ADDRESS recognizes an RTL expression
1493 that is a valid memory address for an instruction.
1494 The MODE argument is the machine mode for the MEM expression
1495 that wants to use this address.
1496
1497 On 80960, legitimate addresses are:
1498 base ld (g0),r0
1499 disp (12 or 32 bit) ld foo,r0
1500 base + index ld (g0)[g1*1],r0
1501 base + displ ld 0xf00(g0),r0
1502 base + index*scale + displ ld 0xf00(g0)[g1*4],r0
1503 index*scale + base ld (g0)[g1*4],r0
1504 index*scale + displ ld 0xf00[g1*4],r0
1505 index*scale ld [g1*4],r0
1506 index + base + displ ld 0xf00(g0)[g1*1],r0
1507
1508 In each case, scale can be 1, 2, 4, 8, or 16. */
1509
1510 /* This is exactly the same as i960_print_operand_addr, except that
1511 it recognizes addresses instead of printing them.
1512
1513 It only recognizes address in canonical form. LEGITIMIZE_ADDRESS should
1514 convert common non-canonical forms to canonical form so that they will
1515 be recognized. */
1516
1517 int
1518 legitimate_address_p (mode, addr, strict)
1519 enum machine_mode mode;
1520 register rtx addr;
1521 int strict;
1522 {
1523 if (GET_CODE (addr) == REG)
1524 return (strict ? REG_OK_FOR_BASE_P_STRICT (addr)
1525 : REG_OK_FOR_BASE_P (addr));
1526 else if (CONSTANT_P (addr))
1527 return 1;
1528 else if (GET_CODE (addr) == PLUS)
1529 {
1530 rtx op0, op1;
1531
1532 if (! TARGET_COMPLEX_ADDR && ! reload_completed)
1533 return 0;
1534
1535 op0 = XEXP (addr, 0);
1536 op1 = XEXP (addr, 1);
1537
1538 if (GET_CODE (op0) == REG)
1539 {
1540 if (! (strict ? REG_OK_FOR_BASE_P_STRICT (op0)
1541 : REG_OK_FOR_BASE_P (op0)))
1542 return 0;
1543
1544 if (GET_CODE (op1) == REG)
1545 return (strict ? REG_OK_FOR_INDEX_P_STRICT (op1)
1546 : REG_OK_FOR_INDEX_P (op1));
1547 else if (CONSTANT_P (op1))
1548 return 1;
1549 else
1550 return 0;
1551 }
1552 else if (GET_CODE (op0) == PLUS)
1553 {
1554 if (GET_CODE (XEXP (op0, 0)) == MULT)
1555 {
1556 if (! (GET_CODE (XEXP (XEXP (op0, 0), 0)) == REG
1557 && (strict ? REG_OK_FOR_INDEX_P_STRICT (XEXP (XEXP (op0, 0), 0))
1558 : REG_OK_FOR_INDEX_P (XEXP (XEXP (op0, 0), 0)))
1559 && SCALE_TERM_P (XEXP (XEXP (op0, 0), 1))))
1560 return 0;
1561
1562 if (GET_CODE (XEXP (op0, 1)) == REG)
1563 return ((strict ? REG_OK_FOR_BASE_P_STRICT (XEXP (op0, 1))
1564 : REG_OK_FOR_BASE_P (XEXP (op0, 1)))
1565 && CONSTANT_P (op1));
1566 else
1567 return 0;
1568 }
1569 else if (GET_CODE (XEXP (op0, 0)) == REG)
1570 {
1571 if (! (strict ? REG_OK_FOR_BASE_P_STRICT (XEXP (op0, 0))
1572 : REG_OK_FOR_BASE_P (XEXP (op0, 0))))
1573 return 0;
1574
1575 if (GET_CODE (XEXP (op0, 1)) == REG)
1576 return ((strict ? REG_OK_FOR_INDEX_P_STRICT (XEXP (op0, 1))
1577 : REG_OK_FOR_INDEX_P (XEXP (op0, 1)))
1578 && CONSTANT_P (op1));
1579 else
1580 return 0;
1581 }
1582 else
1583 return 0;
1584 }
1585 else if (GET_CODE (op0) == MULT)
1586 {
1587 if (! (GET_CODE (XEXP (op0, 0)) == REG
1588 && (strict ? REG_OK_FOR_INDEX_P_STRICT (XEXP (op0, 0))
1589 : REG_OK_FOR_INDEX_P (XEXP (op0, 0)))
1590 && SCALE_TERM_P (XEXP (op0, 1))))
1591 return 0;
1592
1593 if (GET_CODE (op1) == REG)
1594 return (strict ? REG_OK_FOR_BASE_P_STRICT (op1)
1595 : REG_OK_FOR_BASE_P (op1));
1596 else if (CONSTANT_P (op1))
1597 return 1;
1598 else
1599 return 0;
1600 }
1601 else
1602 return 0;
1603 }
1604 else if (GET_CODE (addr) == MULT)
1605 {
1606 if (! TARGET_COMPLEX_ADDR && ! reload_completed)
1607 return 0;
1608
1609 return (GET_CODE (XEXP (addr, 0)) == REG
1610 && (strict ? REG_OK_FOR_INDEX_P_STRICT (XEXP (addr, 0))
1611 : REG_OK_FOR_INDEX_P (XEXP (addr, 0)))
1612 && SCALE_TERM_P (XEXP (addr, 1)));
1613 }
1614 else
1615 return 0;
1616 }
1617
1618 /* Try machine-dependent ways of modifying an illegitimate address
1619 to be legitimate. If we find one, return the new, valid address.
1620 This macro is used in only one place: `memory_address' in explow.c.
1621
1622 This converts some non-canonical addresses to canonical form so they
1623 can be recognized. */
1624
1625 rtx
1626 legitimize_address (x, oldx, mode)
1627 register rtx x;
1628 register rtx oldx;
1629 enum machine_mode mode;
1630 {
1631 if (GET_CODE (x) == SYMBOL_REF)
1632 {
1633 abort ();
1634 x = copy_to_reg (x);
1635 }
1636
1637 if (! TARGET_COMPLEX_ADDR && ! reload_completed)
1638 return x;
1639
1640 /* Canonicalize (plus (mult (reg) (const)) (plus (reg) (const)))
1641 into (plus (plus (mult (reg) (const)) (reg)) (const)). This can be
1642 created by virtual register instantiation, register elimination, and
1643 similar optimizations. */
1644 if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 0)) == MULT
1645 && GET_CODE (XEXP (x, 1)) == PLUS)
1646 x = gen_rtx (PLUS, Pmode,
1647 gen_rtx (PLUS, Pmode, XEXP (x, 0), XEXP (XEXP (x, 1), 0)),
1648 XEXP (XEXP (x, 1), 1));
1649
1650 /* Canonicalize (plus (plus (mult (reg) (const)) (plus (reg) (const))) const)
1651 into (plus (plus (mult (reg) (const)) (reg)) (const)). */
1652 else if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 0)) == PLUS
1653 && GET_CODE (XEXP (XEXP (x, 0), 0)) == MULT
1654 && GET_CODE (XEXP (XEXP (x, 0), 1)) == PLUS
1655 && CONSTANT_P (XEXP (x, 1)))
1656 {
1657 rtx constant, other;
1658
1659 if (GET_CODE (XEXP (x, 1)) == CONST_INT)
1660 {
1661 constant = XEXP (x, 1);
1662 other = XEXP (XEXP (XEXP (x, 0), 1), 1);
1663 }
1664 else if (GET_CODE (XEXP (XEXP (XEXP (x, 0), 1), 1)) == CONST_INT)
1665 {
1666 constant = XEXP (XEXP (XEXP (x, 0), 1), 1);
1667 other = XEXP (x, 1);
1668 }
1669 else
1670 constant = 0;
1671
1672 if (constant)
1673 x = gen_rtx (PLUS, Pmode,
1674 gen_rtx (PLUS, Pmode, XEXP (XEXP (x, 0), 0),
1675 XEXP (XEXP (XEXP (x, 0), 1), 0)),
1676 plus_constant (other, INTVAL (constant)));
1677 }
1678
1679 return x;
1680 }
1681 \f
1682 #if 0
1683 /* Return the most stringent alignment that we are willing to consider
1684 objects of size SIZE and known alignment ALIGN as having. */
1685
1686 int
1687 i960_alignment (size, align)
1688 int size;
1689 int align;
1690 {
1691 int i;
1692
1693 if (! TARGET_STRICT_ALIGN)
1694 if (TARGET_IC_COMPAT2_0 || align >= 4)
1695 {
1696 i = i960_object_bytes_bitalign (size) / BITS_PER_UNIT;
1697 if (i > align)
1698 align = i;
1699 }
1700
1701 return align;
1702 }
1703 #endif
1704 \f
1705 /* Modes for condition codes. */
1706 #define C_MODES \
1707 ((1 << (int) CCmode) | (1 << (int) CC_UNSmode) | (1<< (int) CC_CHKmode))
1708
1709 /* Modes for single-word (and smaller) quantities. */
1710 #define S_MODES \
1711 (~C_MODES \
1712 & ~ ((1 << (int) DImode) | (1 << (int) TImode) \
1713 | (1 << (int) DFmode) | (1 << (int) TFmode)))
1714
1715 /* Modes for double-word (and smaller) quantities. */
1716 #define D_MODES \
1717 (~C_MODES \
1718 & ~ ((1 << (int) TImode) | (1 << (int) TFmode)))
1719
1720 /* Modes for quad-word quantities. */
1721 #define T_MODES (~C_MODES)
1722
1723 /* Modes for single-float quantities. */
1724 #define SF_MODES ((1 << (int) SFmode))
1725
1726 /* Modes for double-float quantities. */
1727 #define DF_MODES (SF_MODES | (1 << (int) DFmode) | (1 << (int) SCmode))
1728
1729 /* Modes for quad-float quantities. */
1730 #define TF_MODES (DF_MODES | (1 << (int) TFmode) | (1 << (int) DCmode))
1731
1732 unsigned int hard_regno_mode_ok[FIRST_PSEUDO_REGISTER] = {
1733 T_MODES, S_MODES, D_MODES, S_MODES, T_MODES, S_MODES, D_MODES, S_MODES,
1734 T_MODES, S_MODES, D_MODES, S_MODES, T_MODES, S_MODES, D_MODES, S_MODES,
1735 T_MODES, S_MODES, D_MODES, S_MODES, T_MODES, S_MODES, D_MODES, S_MODES,
1736 T_MODES, S_MODES, D_MODES, S_MODES, T_MODES, S_MODES, D_MODES, S_MODES,
1737
1738 TF_MODES, TF_MODES, TF_MODES, TF_MODES, C_MODES};
1739
1740 \f
1741 /* Return the minimum alignment of an expression rtx X in bytes. This takes
1742 advantage of machine specific facts, such as knowing that the frame pointer
1743 is always 16 byte aligned. */
1744
1745 int
1746 i960_expr_alignment (x, size)
1747 rtx x;
1748 int size;
1749 {
1750 int align = 1;
1751
1752 if (x == 0)
1753 return 1;
1754
1755 switch (GET_CODE(x))
1756 {
1757 case CONST_INT:
1758 align = INTVAL(x);
1759
1760 if ((align & 0xf) == 0)
1761 align = 16;
1762 else if ((align & 0x7) == 0)
1763 align = 8;
1764 else if ((align & 0x3) == 0)
1765 align = 4;
1766 else if ((align & 0x1) == 0)
1767 align = 2;
1768 else
1769 align = 1;
1770 break;
1771
1772 case PLUS:
1773 align = MIN (i960_expr_alignment (XEXP (x, 0), size),
1774 i960_expr_alignment (XEXP (x, 1), size));
1775 break;
1776
1777 case SYMBOL_REF:
1778 /* If this is a valid program, objects are guaranteed to be
1779 correctly aligned for whatever size the reference actually is. */
1780 align = i960_object_bytes_bitalign (size) / BITS_PER_UNIT;
1781 break;
1782
1783 case REG:
1784 if (REGNO (x) == FRAME_POINTER_REGNUM)
1785 align = 16;
1786 break;
1787
1788 case ASHIFT:
1789 case LSHIFT:
1790 align = i960_expr_alignment (XEXP (x, 0));
1791
1792 if (GET_CODE (XEXP (x, 1)) == CONST_INT)
1793 {
1794 align = align << INTVAL (XEXP (x, 1));
1795 align = MIN (align, 16);
1796 }
1797 break;
1798
1799 case MULT:
1800 align = (i960_expr_alignment (XEXP (x, 0), size) *
1801 i960_expr_alignment (XEXP (x, 1), size));
1802
1803 align = MIN (align, 16);
1804 break;
1805 }
1806
1807 return align;
1808 }
1809
1810 /* Return true if it is possible to reference both BASE and OFFSET, which
1811 have alignment at least as great as 4 byte, as if they had alignment valid
1812 for an object of size SIZE. */
1813
1814 int
1815 i960_improve_align (base, offset, size)
1816 rtx base;
1817 rtx offset;
1818 int size;
1819 {
1820 int i, j;
1821
1822 /* We have at least a word reference to the object, so we know it has to
1823 be aligned at least to 4 bytes. */
1824
1825 i = MIN (i960_expr_alignment (base, 4),
1826 i960_expr_alignment (offset, 4));
1827
1828 i = MAX (i, 4);
1829
1830 /* We know the size of the request. If strict align is not enabled, we
1831 can guess that the alignment is OK for the requested size. */
1832
1833 if (! TARGET_STRICT_ALIGN)
1834 if ((j = (i960_object_bytes_bitalign (size) / BITS_PER_UNIT)) > i)
1835 i = j;
1836
1837 return (i >= size);
1838 }
1839
1840 /* Return true if it is possible to access BASE and OFFSET, which have 4 byte
1841 (SImode) alignment as if they had 16 byte (TImode) alignment. */
1842
1843 int
1844 i960_si_ti (base, offset)
1845 rtx base;
1846 rtx offset;
1847 {
1848 return i960_improve_align (base, offset, 16);
1849 }
1850
1851 /* Return true if it is possible to access BASE and OFFSET, which have 4 byte
1852 (SImode) alignment as if they had 8 byte (DImode) alignment. */
1853
1854 int
1855 i960_si_di (base, offset)
1856 rtx base;
1857 rtx offset;
1858 {
1859 return i960_improve_align (base, offset, 8);
1860 }
1861 \f
1862 /* Return raw values of size and alignment (in words) for the data
1863 type being accessed. These values will be rounded by the caller. */
1864
1865 static void
1866 i960_arg_size_and_align (mode, type, size_out, align_out)
1867 enum machine_mode mode;
1868 tree type;
1869 int *size_out;
1870 int *align_out;
1871 {
1872 int size, align;
1873
1874 /* Use formal alignment requirements of type being passed, except make
1875 it at least a word. If we don't have a type, this is a library call,
1876 and the parm has to be of scalar type. In this case, consider its
1877 formal alignment requirement to be its size in words. */
1878
1879 if (mode == BLKmode)
1880 size = (int_size_in_bytes (type) + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
1881 else if (mode == VOIDmode)
1882 {
1883 /* End of parm list. */
1884 assert (type != 0 && TYPE_MODE (type) == VOIDmode);
1885 size = 1;
1886 }
1887 else
1888 size = (GET_MODE_SIZE (mode) + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
1889
1890 if (type == 0)
1891 align = size;
1892 else if (TYPE_ALIGN (type) >= BITS_PER_WORD)
1893 align = TYPE_ALIGN (type) / BITS_PER_WORD;
1894 else
1895 align = 1;
1896
1897 *size_out = size;
1898 *align_out = align;
1899 }
1900
1901 /* On the 80960 the first 12 args are in registers and the rest are pushed.
1902 Any arg that is bigger than 4 words is placed on the stack and all
1903 subsequent arguments are placed on the stack.
1904
1905 Additionally, parameters with an alignment requirement stronger than
1906 a word must be be aligned appropriately. */
1907
1908 /* Update CUM to advance past an argument described by MODE and TYPE. */
1909
1910 void
1911 i960_function_arg_advance (cum, mode, type, named)
1912 CUMULATIVE_ARGS *cum;
1913 enum machine_mode mode;
1914 tree type;
1915 int named;
1916 {
1917 int size, align;
1918
1919 i960_arg_size_and_align (mode, type, &size, &align);
1920
1921 if (named == 0 || size > 4 || cum->ca_nstackparms != 0
1922 || (size + ROUND (cum->ca_nregparms, align)) > NPARM_REGS
1923 || MUST_PASS_IN_STACK (mode, type))
1924 cum->ca_nstackparms = ROUND (cum->ca_nstackparms, align) + size;
1925 else
1926 cum->ca_nregparms = ROUND (cum->ca_nregparms, align) + size;
1927 }
1928
1929 /* Return the register that the argument described by MODE and TYPE is
1930 passed in, or else return 0 if it is passed on the stack. */
1931
1932 rtx
1933 i960_function_arg (cum, mode, type, named)
1934 CUMULATIVE_ARGS *cum;
1935 enum machine_mode mode;
1936 tree type;
1937 int named;
1938 {
1939 rtx ret;
1940 int size, align;
1941
1942 i960_arg_size_and_align (mode, type, &size, &align);
1943
1944 if (named == 0 || size > 4 || cum->ca_nstackparms != 0
1945 || (size + ROUND (cum->ca_nregparms, align)) > NPARM_REGS
1946 || MUST_PASS_IN_STACK (mode, type))
1947 {
1948 cum->ca_nstackparms = ROUND (cum->ca_nstackparms, align);
1949 ret = 0;
1950 }
1951 else
1952 {
1953 cum->ca_nregparms = ROUND (cum->ca_nregparms, align);
1954 ret = gen_rtx (REG, mode, cum->ca_nregparms);
1955 }
1956
1957 return ret;
1958 }
1959
1960 /* Return the rtx for the register representing the return value, or 0
1961 if the return value must be passed through the stack. */
1962
1963 rtx
1964 i960_function_value (type)
1965 tree type;
1966 {
1967 int mode = TYPE_MODE (type);
1968
1969 if (mode == BLKmode)
1970 {
1971 unsigned int size = int_size_in_bytes (type);
1972
1973 if (size <= 16)
1974 mode = mode_for_size (i960_object_bytes_bitalign (size), MODE_INT, 0);
1975 }
1976
1977 if (mode == BLKmode || mode == VOIDmode)
1978 /* Tell stmt.c and expr.c to pass in address */
1979 return 0;
1980 else
1981 return gen_rtx (REG, mode, 0);
1982 }
1983 \f
1984 /* Floating-point support. */
1985
1986 void
1987 i960_output_double (file, value)
1988 FILE *file;
1989 double value;
1990 {
1991 if (REAL_VALUE_ISINF (value))
1992 {
1993 fprintf (file, "\t.word 0\n");
1994 fprintf (file, "\t.word 0x7ff00000 # Infinity\n");
1995 }
1996 else
1997 fprintf (file, "\t.double 0d%.17e\n", (value));
1998 }
1999
2000 void
2001 i960_output_float (file, value)
2002 FILE *file;
2003 double value;
2004 {
2005 if (REAL_VALUE_ISINF (value))
2006 fprintf (file, "\t.word 0x7f800000 # Infinity\n");
2007 else
2008 fprintf (file, "\t.float 0f%.12e\n", (value));
2009 }
2010 \f
2011 /* Return the number of bits that an object of size N bytes is aligned to. */
2012
2013 int
2014 i960_object_bytes_bitalign (n)
2015 int n;
2016 {
2017 if (n > 8) n = 128;
2018 else if (n > 4) n = 64;
2019 else if (n > 2) n = 32;
2020 else if (n > 1) n = 16;
2021 else n = 8;
2022
2023 return n;
2024 }
2025
2026 /* Compute the size of an aggregate type TSIZE. */
2027
2028 tree
2029 i960_round_size (tsize)
2030 tree tsize;
2031 {
2032 int size, align;
2033
2034 if (TREE_CODE (tsize) != INTEGER_CST)
2035 return tsize;
2036
2037 size = TREE_INT_CST_LOW (tsize);
2038 align = i960_object_bytes_bitalign (size / BITS_PER_UNIT);
2039
2040 /* Handle #pragma align. */
2041 if (align > i960_maxbitalignment)
2042 align = i960_maxbitalignment;
2043
2044 if (size % align)
2045 size = ((size / align) + 1) * align;
2046
2047 return size_int (size);
2048 }
2049
2050 /* Compute the alignment for an aggregate type TSIZE. */
2051
2052 int
2053 i960_round_align (align, tsize)
2054 int align;
2055 tree tsize;
2056 {
2057 if (TREE_CODE (tsize) != INTEGER_CST)
2058 return align;
2059
2060 align = i960_object_bytes_bitalign (TREE_INT_CST_LOW (tsize)
2061 / BITS_PER_UNIT);
2062 return align;
2063 }
2064 \f
2065 /* Do any needed setup for a varargs function. For the i960, we must
2066 create a register paramter block if one doesn't exist, and then copy
2067 all register parameters to memory. */
2068
2069 void
2070 i960_setup_incoming_varargs (cum, mode, type, pretend_size, no_rtl)
2071 CUMULATIVE_ARGS *cum;
2072 enum machine_mode mode;
2073 tree type;
2074 int *pretend_size;
2075 int no_rtl;
2076 {
2077 if (cum->ca_nregparms < NPARM_REGS)
2078 {
2079 int first_reg_offset = cum->ca_nregparms;
2080
2081 if (first_reg_offset > NPARM_REGS)
2082 first_reg_offset = NPARM_REGS;
2083
2084 if (! (no_rtl) && first_reg_offset != NPARM_REGS)
2085 {
2086 rtx label = gen_label_rtx ();
2087 emit_insn (gen_cmpsi (arg_pointer_rtx, const0_rtx));
2088 emit_jump_insn (gen_bne (label));
2089 emit_insn (gen_rtx (SET, VOIDmode, arg_pointer_rtx,
2090 stack_pointer_rtx));
2091 emit_insn (gen_rtx (SET, VOIDmode, stack_pointer_rtx,
2092 memory_address (SImode,
2093 plus_constant (stack_pointer_rtx,
2094 48))));
2095 emit_label (label);
2096 move_block_from_reg
2097 (first_reg_offset,
2098 gen_rtx (MEM, BLKmode, virtual_incoming_args_rtx),
2099 NPARM_REGS - first_reg_offset);
2100 }
2101 *pretend_size = (NPARM_REGS - first_reg_offset) * UNITS_PER_WORD;
2102 }
2103 }
2104
2105 /* Calculate the final size of the reg parm stack space for the current
2106 function, based on how many bytes would be allocated on the stack. */
2107
2108 int
2109 i960_final_reg_parm_stack_space (const_size, var_size)
2110 int const_size;
2111 tree var_size;
2112 {
2113 if (var_size || const_size > 48)
2114 return 48;
2115 else
2116 return 0;
2117 }
2118
2119 /* Calculate the size of the reg parm stack space. This is a bit complicated
2120 on the i960. */
2121
2122 int
2123 i960_reg_parm_stack_space (fndecl)
2124 tree fndecl;
2125 {
2126 /* In this case, we are called from emit_library_call, and we don't need
2127 to pretend we have more space for parameters than what's apparent. */
2128 if (fndecl == 0)
2129 return 0;
2130
2131 /* In this case, we are called from locate_and_pad_parms when we're
2132 not IN_REGS, so we have an arg block. */
2133 if (fndecl != current_function_decl)
2134 return 48;
2135
2136 /* Otherwise, we have an arg block if the current function has more than
2137 48 bytes of parameters. */
2138 if (current_function_args_size > 48)
2139 return 48;
2140 else
2141 return 0;
2142 }
2143 \f
2144 /* Return the register class of a scratch register needed to copy IN into
2145 or out of a register in CLASS in MODE. If it can be done directly,
2146 NO_REGS is returned. */
2147
2148 enum reg_class
2149 secondary_reload_class (class, mode, in)
2150 enum reg_class class;
2151 enum machine_mode mode;
2152 rtx in;
2153 {
2154 int regno = -1;
2155
2156 if (GET_CODE (in) == REG || GET_CODE (in) == SUBREG)
2157 regno = true_regnum (in);
2158
2159 /* We can place anything into LOCAL_OR_GLOBAL_REGS and can put
2160 LOCAL_OR_GLOBAL_REGS into anything. */
2161 if (class == LOCAL_OR_GLOBAL_REGS || class == LOCAL_REGS
2162 || class == GLOBAL_REGS || (regno >= 0 && regno < 32))
2163 return NO_REGS;
2164
2165 /* We can place any hard register, 0.0, and 1.0 into FP_REGS. */
2166 if (class == FP_REGS
2167 && ((regno >= 0 && regno <= FIRST_PSEUDO_REGISTER)
2168 || in == CONST0_RTX (mode) || in == CONST1_RTX (mode)))
2169 return NO_REGS;
2170
2171 return LOCAL_OR_GLOBAL_REGS;
2172 }
2173 \f
2174 /* Emit the code necessary for a procedure call. Return value is needed
2175 after the call if target is non-zero. */
2176
2177 void
2178 i960_expand_call (first_operand, second_operand, target)
2179 rtx first_operand, second_operand, target;
2180 {
2181 /* Used to ensure that g14_save_reg is initialized once and only once
2182 for each function if it is needed. */
2183 static char *this_function_name = 0;
2184 int frob_g14 = 0;
2185
2186 if (this_function_name != current_function_name)
2187 {
2188 rtx seq, first;
2189 struct sequence_stack *seq_stack;
2190
2191 this_function_name = current_function_name;
2192
2193 /* If the current function has an argument block, then save g14 into
2194 a pseudo at the top of the function and restore it after this
2195 function call. If the current function has no argument block,
2196 then g14 is zero before and after the call. */
2197
2198 if (current_function_args_size > 48)
2199 {
2200 start_sequence ();
2201 seq_stack = sequence_stack;
2202 while (seq_stack->next)
2203 seq_stack = seq_stack->next;
2204 first = seq_stack->first;
2205 g14_save_reg = copy_to_reg (arg_pointer_rtx);
2206 seq = gen_sequence ();
2207 end_sequence ();
2208 emit_insn_after (seq, first);
2209 }
2210 }
2211
2212 if (current_function_args_size > 48)
2213 frob_g14 = 1;
2214
2215 if (GET_CODE (second_operand) != CONST_INT || INTVAL (second_operand) > 48)
2216 {
2217 /* Calling a function needing an argument block. */
2218 emit_insn (gen_rtx (SET, VOIDmode, arg_pointer_rtx,
2219 virtual_outgoing_args_rtx));
2220 }
2221 else
2222 {
2223 /* Calling a normal function -- only set to zero if we know our g14
2224 is nonzero. */
2225 if (frob_g14)
2226 emit_insn (gen_rtx (SET, VOIDmode, arg_pointer_rtx, const0_rtx));
2227 }
2228
2229 if (target)
2230 emit_call_insn (gen_rtx (SET, VOIDmode, target,
2231 gen_rtx (CALL, VOIDmode, first_operand,
2232 second_operand)));
2233 else
2234 emit_call_insn (gen_rtx (CALL, VOIDmode, first_operand, second_operand));
2235
2236 if (frob_g14)
2237 emit_insn (gen_rtx (SET, VOIDmode, arg_pointer_rtx, g14_save_reg));
2238 else if (GET_CODE (second_operand) != CONST_INT
2239 || INTVAL (second_operand) > 48)
2240 {
2241 /* Calling a function needing an argument block. It will have set
2242 reg14 back to zero before returning, so we must emit a clobber here
2243 to tell cse that g14 has changed. */
2244 emit_insn (gen_rtx (CLOBBER, VOIDmode, arg_pointer_rtx));
2245 }
2246 }
2247 \f
2248 /* Look at the opcode P, and set i96_last_insn_type to indicate which
2249 function unit it executed on. */
2250
2251 /* ??? This would make more sense as an attribute. */
2252
2253 void
2254 i960_scan_opcode (p)
2255 char *p;
2256 {
2257 switch (*p)
2258 {
2259 case 'a':
2260 case 'd':
2261 case 'e':
2262 case 'm':
2263 case 'n':
2264 case 'o':
2265 case 'r':
2266 /* Ret is not actually of type REG, but it won't matter, because no
2267 insn will ever follow it. */
2268 case 'u':
2269 case 'x':
2270 i960_last_insn_type = I_TYPE_REG;
2271 break;
2272
2273 case 'b':
2274 if (p[1] == 'x' || p[3] == 'x')
2275 i960_last_insn_type = I_TYPE_MEM;
2276 i960_last_insn_type = I_TYPE_CTRL;
2277 break;
2278
2279 case 'f':
2280 case 't':
2281 i960_last_insn_type = I_TYPE_CTRL;
2282 break;
2283
2284 case 'c':
2285 if (p[1] == 'a')
2286 {
2287 if (p[4] == 'x')
2288 i960_last_insn_type = I_TYPE_MEM;
2289 else
2290 i960_last_insn_type = I_TYPE_CTRL;
2291 }
2292 else if (p[1] == 'm')
2293 {
2294 if (p[3] == 'd')
2295 i960_last_insn_type = I_TYPE_REG;
2296 else if (p[4] == 'b' || p[4] == 'j')
2297 i960_last_insn_type = I_TYPE_CTRL;
2298 else
2299 i960_last_insn_type = I_TYPE_REG;
2300 }
2301 else
2302 i960_last_insn_type = I_TYPE_REG;
2303 break;
2304
2305 case 'l':
2306 i960_last_insn_type = I_TYPE_MEM;
2307 break;
2308
2309 case 's':
2310 if (p[1] == 't')
2311 i960_last_insn_type = I_TYPE_MEM;
2312 else
2313 i960_last_insn_type = I_TYPE_REG;
2314 break;
2315 }
2316 }