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