OSDN Git Service

(i960_function_prologue): Put register save area before outgoing arg block.
[pf3gnuchains/gcc-fork.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     case LSHIFT:
1918       align = i960_expr_alignment (XEXP (x, 0));
1919
1920       if (GET_CODE (XEXP (x, 1)) == CONST_INT)
1921         {
1922           align = align << INTVAL (XEXP (x, 1));
1923           align = MIN (align, 16);
1924         }
1925       break;
1926
1927     case MULT:
1928       align = (i960_expr_alignment (XEXP (x, 0), size) *
1929                i960_expr_alignment (XEXP (x, 1), size));
1930
1931       align = MIN (align, 16);
1932       break;
1933     }
1934
1935   return align;
1936 }
1937
1938 /* Return true if it is possible to reference both BASE and OFFSET, which
1939    have alignment at least as great as 4 byte, as if they had alignment valid
1940    for an object of size SIZE.  */
1941
1942 int
1943 i960_improve_align (base, offset, size)
1944      rtx base;
1945      rtx offset;
1946      int size;
1947 {
1948   int i, j;
1949
1950   /* We have at least a word reference to the object, so we know it has to
1951      be aligned at least to 4 bytes.  */
1952
1953   i = MIN (i960_expr_alignment (base, 4),
1954            i960_expr_alignment (offset, 4));
1955
1956   i = MAX (i, 4);
1957
1958   /* We know the size of the request.  If strict align is not enabled, we
1959      can guess that the alignment is OK for the requested size.  */
1960
1961   if (! TARGET_STRICT_ALIGN)
1962     if ((j = (i960_object_bytes_bitalign (size) / BITS_PER_UNIT)) > i)
1963       i = j;
1964
1965   return (i >= size);
1966 }
1967
1968 /* Return true if it is possible to access BASE and OFFSET, which have 4 byte
1969    (SImode) alignment as if they had 16 byte (TImode) alignment.  */
1970
1971 int
1972 i960_si_ti (base, offset)
1973      rtx base;
1974      rtx offset;
1975 {
1976   return i960_improve_align (base, offset, 16);
1977 }
1978
1979 /* Return true if it is possible to access BASE and OFFSET, which have 4 byte
1980    (SImode) alignment as if they had 8 byte (DImode) alignment.  */
1981
1982 int
1983 i960_si_di (base, offset)
1984      rtx base;
1985      rtx offset;
1986 {
1987   return i960_improve_align (base, offset, 8);
1988 }
1989 \f
1990 /* Return raw values of size and alignment (in words) for the data
1991    type being accessed.  These values will be rounded by the caller.  */
1992
1993 static void 
1994 i960_arg_size_and_align (mode, type, size_out, align_out)
1995      enum machine_mode mode;
1996      tree type;
1997      int *size_out;
1998      int *align_out;
1999 {
2000   int size, align;
2001
2002   /* Use formal alignment requirements of type being passed, except make
2003      it at least a word.  If we don't have a type, this is a library call,
2004      and the parm has to be of scalar type.  In this case, consider its
2005      formal alignment requirement to be its size in words.  */
2006
2007   if (mode == BLKmode)
2008     size = (int_size_in_bytes (type) + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
2009   else if (mode == VOIDmode)
2010     {
2011       /* End of parm list.  */
2012       assert (type != 0 && TYPE_MODE (type) == VOIDmode);
2013       size = 1;
2014     }
2015   else
2016     size = (GET_MODE_SIZE (mode) + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
2017
2018   if (type == 0)
2019     align = size;
2020   else if (TYPE_ALIGN (type) >= BITS_PER_WORD)
2021     align = TYPE_ALIGN (type) / BITS_PER_WORD;
2022   else
2023     align = 1;
2024
2025   *size_out  = size;
2026   *align_out = align;
2027 }
2028
2029 /* On the 80960 the first 12 args are in registers and the rest are pushed.
2030    Any arg that is bigger than 4 words is placed on the stack and all
2031    subsequent arguments are placed on the stack.
2032
2033    Additionally, parameters with an alignment requirement stronger than
2034    a word must be be aligned appropriately.  */
2035
2036 /* Update CUM to advance past an argument described by MODE and TYPE.  */
2037
2038 void
2039 i960_function_arg_advance (cum, mode, type, named)
2040      CUMULATIVE_ARGS *cum;
2041      enum machine_mode mode;
2042      tree type;
2043      int named;
2044 {
2045   int size, align;
2046
2047   i960_arg_size_and_align (mode, type, &size, &align);
2048
2049   if (named == 0 || size > 4 || cum->ca_nstackparms != 0
2050       || (size + ROUND_PARM (cum->ca_nregparms, align)) > NPARM_REGS
2051       || MUST_PASS_IN_STACK (mode, type))
2052     cum->ca_nstackparms = ROUND_PARM (cum->ca_nstackparms, align) + size;
2053   else
2054     cum->ca_nregparms = ROUND_PARM (cum->ca_nregparms, align) + size;
2055 }
2056
2057 /* Return the register that the argument described by MODE and TYPE is
2058    passed in, or else return 0 if it is passed on the stack.  */
2059
2060 rtx
2061 i960_function_arg (cum, mode, type, named)
2062      CUMULATIVE_ARGS *cum;
2063      enum machine_mode mode;
2064      tree type;
2065      int named;
2066 {
2067   rtx ret;
2068   int size, align;
2069
2070   i960_arg_size_and_align (mode, type, &size, &align);
2071
2072   if (named == 0 || size > 4 || cum->ca_nstackparms != 0
2073       || (size + ROUND_PARM (cum->ca_nregparms, align)) > NPARM_REGS
2074       || MUST_PASS_IN_STACK (mode, type))
2075     {
2076       cum->ca_nstackparms = ROUND_PARM (cum->ca_nstackparms, align);
2077       ret = 0;
2078     }
2079   else
2080     {
2081       cum->ca_nregparms = ROUND_PARM (cum->ca_nregparms, align);
2082       ret = gen_rtx (REG, mode, cum->ca_nregparms);
2083     }
2084
2085   return ret;
2086 }
2087 \f
2088 /* Floating-point support.  */
2089
2090 void
2091 i960_output_double (file, value)
2092      FILE *file;
2093      double value;
2094 {
2095   if (REAL_VALUE_ISINF (value))
2096     {
2097       fprintf (file, "\t.word   0\n");
2098       fprintf (file, "\t.word   0x7ff00000      # Infinity\n");
2099     }
2100   else
2101     fprintf (file, "\t.double 0d%.17e\n", (value));
2102 }
2103
2104 void
2105 i960_output_float (file, value)
2106      FILE *file;
2107      double value;
2108 {
2109   if (REAL_VALUE_ISINF (value))
2110     fprintf (file, "\t.word     0x7f800000      # Infinity\n");
2111   else
2112     fprintf (file, "\t.float 0f%.12e\n", (value));
2113 }
2114 \f
2115 /* Return the number of bits that an object of size N bytes is aligned to.  */
2116
2117 int
2118 i960_object_bytes_bitalign (n)
2119      int n;
2120 {
2121   if (n > 8)      n = 128;
2122   else if (n > 4) n = 64;
2123   else if (n > 2) n = 32;
2124   else if (n > 1) n = 16;
2125   else            n = 8;
2126
2127   return n;
2128 }
2129
2130 /* Compute the size of an aggregate type TSIZE.  */
2131
2132 tree
2133 i960_round_size (tsize)
2134      tree tsize;
2135 {
2136   int size, byte_size, align;
2137
2138   if (TREE_CODE (tsize) != INTEGER_CST)
2139     return tsize;
2140
2141   size = TREE_INT_CST_LOW (tsize);
2142   byte_size = (size + BITS_PER_UNIT - 1) / BITS_PER_UNIT;
2143   align = i960_object_bytes_bitalign (byte_size);
2144
2145   /* Handle #pragma align.  */
2146   if (align > i960_maxbitalignment)
2147     align = i960_maxbitalignment;
2148
2149   if (size % align)
2150     size = ((size / align) + 1) * align;
2151
2152   return size_int (size);
2153 }
2154
2155 /* Compute the alignment for an aggregate type TSIZE.  */
2156
2157 int
2158 i960_round_align (align, tsize)
2159      int align;
2160      tree tsize;
2161 {
2162   int byte_size;
2163
2164   if (TREE_CODE (tsize) != INTEGER_CST)
2165     return align;
2166
2167   byte_size = (TREE_INT_CST_LOW (tsize) + BITS_PER_UNIT - 1) / BITS_PER_UNIT;
2168   align = i960_object_bytes_bitalign (byte_size);
2169   return align;
2170 }
2171 \f
2172 /* Do any needed setup for a varargs function.  For the i960, we must
2173    create a register parameter block if one doesn't exist, and then copy
2174    all register parameters to memory.  */
2175
2176 void
2177 i960_setup_incoming_varargs (cum, mode, type, pretend_size, no_rtl)
2178      CUMULATIVE_ARGS *cum;
2179      enum machine_mode mode;
2180      tree type;
2181      int *pretend_size;
2182      int no_rtl;
2183 {
2184   if (cum->ca_nregparms < NPARM_REGS)
2185     {
2186       int first_reg_offset = cum->ca_nregparms;
2187
2188       if (first_reg_offset > NPARM_REGS)
2189         first_reg_offset = NPARM_REGS;
2190
2191       if (! (no_rtl) && first_reg_offset != NPARM_REGS)
2192         {
2193           rtx label = gen_label_rtx ();
2194           emit_insn (gen_cmpsi (arg_pointer_rtx, const0_rtx));
2195           emit_jump_insn (gen_bne (label));
2196           emit_insn (gen_rtx (SET, VOIDmode, arg_pointer_rtx,
2197                               stack_pointer_rtx));
2198           emit_insn (gen_rtx (SET, VOIDmode, stack_pointer_rtx,
2199                               memory_address (SImode,
2200                                               plus_constant (stack_pointer_rtx,
2201                                                              48))));
2202           emit_label (label);
2203           move_block_from_reg
2204             (first_reg_offset,
2205              gen_rtx (MEM, BLKmode, virtual_incoming_args_rtx),
2206              NPARM_REGS - first_reg_offset,
2207              (NPARM_REGS - first_reg_offset) * UNITS_PER_WORD);
2208         }
2209       *pretend_size = (NPARM_REGS - first_reg_offset) * UNITS_PER_WORD;
2210     }
2211 }
2212
2213 /* Calculate the final size of the reg parm stack space for the current
2214    function, based on how many bytes would be allocated on the stack.  */
2215
2216 int
2217 i960_final_reg_parm_stack_space (const_size, var_size)
2218      int const_size;
2219      tree var_size;
2220 {
2221   if (var_size || const_size > 48)
2222     return 48;
2223   else
2224     return 0;
2225 }
2226
2227 /* Calculate the size of the reg parm stack space.  This is a bit complicated
2228    on the i960.  */
2229
2230 int
2231 i960_reg_parm_stack_space (fndecl)
2232      tree fndecl;
2233 {
2234   /* In this case, we are called from emit_library_call, and we don't need
2235      to pretend we have more space for parameters than what's apparent.  */
2236   if (fndecl == 0)
2237     return 0;
2238
2239   /* In this case, we are called from locate_and_pad_parms when we're
2240      not IN_REGS, so we have an arg block.  */
2241   if (fndecl != current_function_decl)
2242     return 48;
2243
2244   /* Otherwise, we have an arg block if the current function has more than
2245      48 bytes of parameters.  */
2246   if (current_function_args_size != 0)
2247     return 48;
2248   else
2249     return 0;
2250 }
2251 \f
2252 /* Return the register class of a scratch register needed to copy IN into
2253    or out of a register in CLASS in MODE.  If it can be done directly,
2254    NO_REGS is returned.  */
2255
2256 enum reg_class
2257 secondary_reload_class (class, mode, in)
2258      enum reg_class class;
2259      enum machine_mode mode;
2260      rtx in;
2261 {
2262   int regno = -1;
2263
2264   if (GET_CODE (in) == REG || GET_CODE (in) == SUBREG)
2265     regno = true_regnum (in);
2266
2267   /* We can place anything into LOCAL_OR_GLOBAL_REGS and can put
2268      LOCAL_OR_GLOBAL_REGS into anything.  */
2269   if (class == LOCAL_OR_GLOBAL_REGS || class == LOCAL_REGS
2270       || class == GLOBAL_REGS || (regno >= 0 && regno < 32))
2271     return NO_REGS;
2272
2273   /* We can place any hard register, 0.0, and 1.0 into FP_REGS.  */
2274   if (class == FP_REGS
2275       && ((regno >= 0 && regno < FIRST_PSEUDO_REGISTER)
2276           || in == CONST0_RTX (mode) || in == CONST1_RTX (mode)))
2277     return NO_REGS;
2278
2279   return LOCAL_OR_GLOBAL_REGS;
2280 }
2281 \f
2282 /* Look at the opcode P, and set i96_last_insn_type to indicate which
2283    function unit it executed on.  */
2284
2285 /* ??? This would make more sense as an attribute.  */
2286
2287 void
2288 i960_scan_opcode (p)
2289      char *p;
2290 {
2291   switch (*p)
2292     {
2293     case 'a':
2294     case 'd':
2295     case 'e':
2296     case 'm':
2297     case 'n':
2298     case 'o':
2299     case 'r':
2300       /* Ret is not actually of type REG, but it won't matter, because no
2301          insn will ever follow it.  */
2302     case 'u':
2303     case 'x':
2304       i960_last_insn_type = I_TYPE_REG;
2305       break;
2306
2307     case 'b':
2308       if (p[1] == 'x' || p[3] == 'x')
2309         i960_last_insn_type = I_TYPE_MEM;
2310       i960_last_insn_type = I_TYPE_CTRL;
2311       break;
2312
2313     case 'f':
2314     case 't':
2315       i960_last_insn_type = I_TYPE_CTRL;
2316       break;
2317
2318     case 'c':
2319       if (p[1] == 'a')
2320         {
2321           if (p[4] == 'x')
2322             i960_last_insn_type = I_TYPE_MEM;
2323           else
2324             i960_last_insn_type = I_TYPE_CTRL;
2325         }
2326       else if (p[1] == 'm')
2327         {
2328           if (p[3] == 'd')
2329             i960_last_insn_type = I_TYPE_REG;
2330           else if (p[4] == 'b' || p[4] == 'j')
2331             i960_last_insn_type = I_TYPE_CTRL;
2332           else
2333             i960_last_insn_type = I_TYPE_REG;
2334         }
2335       else
2336         i960_last_insn_type = I_TYPE_REG;
2337       break;
2338
2339     case 'l':
2340       i960_last_insn_type = I_TYPE_MEM;
2341       break;
2342
2343     case 's':
2344       if (p[1] == 't')
2345         i960_last_insn_type = I_TYPE_MEM;
2346       else
2347         i960_last_insn_type = I_TYPE_REG;
2348       break;
2349     }
2350 }