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