]> gcc.gnu.org Git - gcc.git/blob - gcc/config/i960/i960.c
2cde31ab087181051d6ddbac2e7c4e579ffd73b7
[gcc.git] / gcc / config / i960 / i960.c
1 /* Subroutines used for code generation on intel 80960.
2 Copyright (C) 1992, 1995, 1996, 1997, 1998, 1999, 2000
3 Free Software Foundation, Inc.
4 Contributed by Steven McGeady, Intel Corp.
5 Additional Work by Glenn Colon-Bonet, Jonathan Shapiro, Andy Wilson
6 Converted to GCC 2.0 by Jim Wilson and Michael Tiemann, Cygnus Support.
7
8 This file is part of GNU CC.
9
10 GNU CC is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 2, or (at your option)
13 any later version.
14
15 GNU CC is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
19
20 You should have received a copy of the GNU General Public License
21 along with GNU CC; see the file COPYING. If not, write to
22 the Free Software Foundation, 59 Temple Place - Suite 330,
23 Boston, MA 02111-1307, USA. */
24
25 #include "config.h"
26 #include "system.h"
27 #include <math.h>
28 #include "rtl.h"
29 #include "regs.h"
30 #include "hard-reg-set.h"
31 #include "real.h"
32 #include "insn-config.h"
33 #include "conditions.h"
34 #include "insn-flags.h"
35 #include "output.h"
36 #include "insn-attr.h"
37 #include "flags.h"
38 #include "tree.h"
39 #include "insn-codes.h"
40 #include "expr.h"
41 #include "except.h"
42 #include "function.h"
43 #include "recog.h"
44 #include "toplev.h"
45 #include "tm_p.h"
46
47 /* Save the operands last given to a compare for use when we
48 generate a scc or bcc insn. */
49
50 rtx i960_compare_op0, i960_compare_op1;
51
52 /* Used to implement #pragma align/noalign. Initialized by OVERRIDE_OPTIONS
53 macro in i960.h. */
54
55 static int i960_maxbitalignment;
56 static int i960_last_maxbitalignment;
57
58 /* Used to implement switching between MEM and ALU insn types, for better
59 C series performance. */
60
61 enum insn_types i960_last_insn_type;
62
63 /* The leaf-procedure return register. Set only if this is a leaf routine. */
64
65 static int i960_leaf_ret_reg;
66
67 /* True if replacing tail calls with jumps is OK. */
68
69 static int tail_call_ok;
70
71 /* A string containing a list of insns to emit in the epilogue so as to
72 restore all registers saved by the prologue. Created by the prologue
73 code as it saves registers away. */
74
75 char epilogue_string[1000];
76
77 /* A unique number (per function) for return labels. */
78
79 static int ret_label = 0;
80
81 /* This is true if FNDECL is either a varargs or a stdarg function.
82 This is used to help identify functions that use an argument block. */
83
84 #define VARARGS_STDARG_FUNCTION(FNDECL) \
85 ((TYPE_ARG_TYPES (TREE_TYPE (FNDECL)) != 0 \
86 && (TREE_VALUE (tree_last (TYPE_ARG_TYPES (TREE_TYPE (FNDECL)))) != void_type_node)) \
87 || current_function_varargs)
88
89 /* Handle pragmas for compatibility with Intel's compilers. */
90
91 /* ??? This is incomplete, since it does not handle all pragmas that the
92 intel compilers understand. */
93
94 int
95 process_pragma (p_getc, p_ungetc, pname)
96 int (* p_getc) PARAMS ((void));
97 void (* p_ungetc) PARAMS ((int));
98 const char *pname;
99 {
100 register int c;
101 char buf[20];
102 char *s = buf;
103 int align;
104
105 /* Should be pragma 'far' or equivalent for callx/balx here. */
106 if (strcmp (pname, "align") != 0)
107 return 0;
108
109 do
110 {
111 c = p_getc ();
112 }
113 while (c == ' ' || c == '\t');
114
115 if (c == '(')
116 c = p_getc ();
117
118 while (c >= '0' && c <= '9')
119 {
120 if (s < buf + sizeof buf - 1)
121 *s++ = c;
122 c = p_getc ();
123 }
124
125 *s = '\0';
126
127 /* We had to read a non-numerical character to get out of the
128 while loop---often a newline. So, we have to put it back to
129 make sure we continue to parse everything properly. */
130
131 p_ungetc (c);
132
133 align = atoi (buf);
134
135 switch (align)
136 {
137 case 0:
138 /* Return to last alignment. */
139 align = i960_last_maxbitalignment / 8;
140 /* Fall through. */
141 case 16:
142 case 8:
143 case 4:
144 case 2:
145 case 1:
146 i960_last_maxbitalignment = i960_maxbitalignment;
147 i960_maxbitalignment = align * 8;
148 break;
149
150 default:
151 /* Silently ignore bad values. */
152 break;
153 }
154
155 /* NOTE: ic960 R3.0 pragma align definition:
156
157 #pragma align [(size)] | (identifier=size[,...])
158 #pragma noalign [(identifier)[,...]]
159
160 (all parens are optional)
161
162 - size is [1,2,4,8,16]
163 - noalign means size==1
164 - applies only to component elements of a struct (and union?)
165 - identifier applies to structure tag (only)
166 - missing identifier means next struct
167
168 - alignment rules for bitfields need more investigation */
169
170 return 1;
171 }
172
173 /* Initialize variables before compiling any files. */
174
175 void
176 i960_initialize ()
177 {
178 if (TARGET_IC_COMPAT2_0)
179 {
180 i960_maxbitalignment = 8;
181 i960_last_maxbitalignment = 128;
182 }
183 else
184 {
185 i960_maxbitalignment = 128;
186 i960_last_maxbitalignment = 8;
187 }
188 }
189 \f
190 /* Return true if OP can be used as the source of an fp move insn. */
191
192 int
193 fpmove_src_operand (op, mode)
194 rtx op;
195 enum machine_mode mode;
196 {
197 return (GET_CODE (op) == CONST_DOUBLE || general_operand (op, mode));
198 }
199
200 #if 0
201 /* Return true if OP is a register or zero. */
202
203 int
204 reg_or_zero_operand (op, mode)
205 rtx op;
206 enum machine_mode mode;
207 {
208 return register_operand (op, mode) || op == const0_rtx;
209 }
210 #endif
211
212 /* Return truth value of whether OP can be used as an operands in a three
213 address arithmetic insn (such as add %o1,7,%l2) of mode MODE. */
214
215 int
216 arith_operand (op, mode)
217 rtx op;
218 enum machine_mode mode;
219 {
220 return (register_operand (op, mode) || literal (op, mode));
221 }
222
223 /* Return truth value of whether OP can be used as an operands in a three
224 address logic insn, possibly complementing OP, of mode MODE. */
225
226 int
227 logic_operand (op, mode)
228 rtx op;
229 enum machine_mode mode;
230 {
231 return (register_operand (op, mode)
232 || (GET_CODE (op) == CONST_INT
233 && INTVAL(op) >= -32 && INTVAL(op) < 32));
234 }
235
236 /* Return true if OP is a register or a valid floating point literal. */
237
238 int
239 fp_arith_operand (op, mode)
240 rtx op;
241 enum machine_mode mode;
242 {
243 return (register_operand (op, mode) || fp_literal (op, mode));
244 }
245
246 /* Return true is OP is a register or a valid signed integer literal. */
247
248 int
249 signed_arith_operand (op, mode)
250 rtx op;
251 enum machine_mode mode;
252 {
253 return (register_operand (op, mode) || signed_literal (op, mode));
254 }
255
256 /* Return truth value of whether OP is a integer which fits the
257 range constraining immediate operands in three-address insns. */
258
259 int
260 literal (op, mode)
261 rtx op;
262 enum machine_mode mode ATTRIBUTE_UNUSED;
263 {
264 return ((GET_CODE (op) == CONST_INT) && INTVAL(op) >= 0 && INTVAL(op) < 32);
265 }
266
267 /* Return true if OP is a float constant of 1. */
268
269 int
270 fp_literal_one (op, mode)
271 rtx op;
272 enum machine_mode mode;
273 {
274 return (TARGET_NUMERICS && mode == GET_MODE (op) && op == CONST1_RTX (mode));
275 }
276
277 /* Return true if OP is a float constant of 0. */
278
279 int
280 fp_literal_zero (op, mode)
281 rtx op;
282 enum machine_mode mode;
283 {
284 return (TARGET_NUMERICS && mode == GET_MODE (op) && op == CONST0_RTX (mode));
285 }
286
287 /* Return true if OP is a valid floating point literal. */
288
289 int
290 fp_literal(op, mode)
291 rtx op;
292 enum machine_mode mode;
293 {
294 return fp_literal_zero (op, mode) || fp_literal_one (op, mode);
295 }
296
297 /* Return true if OP is a valid signed immediate constant. */
298
299 int
300 signed_literal(op, mode)
301 rtx op;
302 enum machine_mode mode ATTRIBUTE_UNUSED;
303 {
304 return ((GET_CODE (op) == CONST_INT) && INTVAL(op) > -32 && INTVAL(op) < 32);
305 }
306
307 /* Return truth value of statement that OP is a symbolic memory
308 operand of mode MODE. */
309
310 int
311 symbolic_memory_operand (op, mode)
312 rtx op;
313 enum machine_mode mode ATTRIBUTE_UNUSED;
314 {
315 if (GET_CODE (op) == SUBREG)
316 op = SUBREG_REG (op);
317 if (GET_CODE (op) != MEM)
318 return 0;
319 op = XEXP (op, 0);
320 return (GET_CODE (op) == SYMBOL_REF || GET_CODE (op) == CONST
321 || GET_CODE (op) == HIGH || GET_CODE (op) == LABEL_REF);
322 }
323
324 /* Return truth value of whether OP is EQ or NE. */
325
326 int
327 eq_or_neq (op, mode)
328 rtx op;
329 enum machine_mode mode ATTRIBUTE_UNUSED;
330 {
331 return (GET_CODE (op) == EQ || GET_CODE (op) == NE);
332 }
333
334 /* OP is an integer register or a constant. */
335
336 int
337 arith32_operand (op, mode)
338 rtx op;
339 enum machine_mode mode;
340 {
341 if (register_operand (op, mode))
342 return 1;
343 return (CONSTANT_P (op));
344 }
345
346 /* Return true if OP is an integer constant which is a power of 2. */
347
348 int
349 power2_operand (op,mode)
350 rtx op;
351 enum machine_mode mode ATTRIBUTE_UNUSED;
352 {
353 if (GET_CODE (op) != CONST_INT)
354 return 0;
355
356 return exact_log2 (INTVAL (op)) >= 0;
357 }
358
359 /* Return true if OP is an integer constant which is the complement of a
360 power of 2. */
361
362 int
363 cmplpower2_operand (op, mode)
364 rtx op;
365 enum machine_mode mode ATTRIBUTE_UNUSED;
366 {
367 if (GET_CODE (op) != CONST_INT)
368 return 0;
369
370 return exact_log2 (~ INTVAL (op)) >= 0;
371 }
372
373 /* If VAL has only one bit set, return the index of that bit. Otherwise
374 return -1. */
375
376 int
377 bitpos (val)
378 unsigned int val;
379 {
380 register int i;
381
382 for (i = 0; val != 0; i++, val >>= 1)
383 {
384 if (val & 1)
385 {
386 if (val != 1)
387 return -1;
388 return i;
389 }
390 }
391 return -1;
392 }
393
394 /* Return non-zero if OP is a mask, i.e. all one bits are consecutive.
395 The return value indicates how many consecutive non-zero bits exist
396 if this is a mask. This is the same as the next function, except that
397 it does not indicate what the start and stop bit positions are. */
398
399 int
400 is_mask (val)
401 unsigned int val;
402 {
403 register int start, end, i;
404
405 start = -1;
406 for (i = 0; val != 0; val >>= 1, i++)
407 {
408 if (val & 1)
409 {
410 if (start < 0)
411 start = i;
412
413 end = i;
414 continue;
415 }
416 /* Still looking for the first bit. */
417 if (start < 0)
418 continue;
419
420 /* We've seen the start of a bit sequence, and now a zero. There
421 must be more one bits, otherwise we would have exited the loop.
422 Therefore, it is not a mask. */
423 if (val)
424 return 0;
425 }
426
427 /* The bit string has ones from START to END bit positions only. */
428 return end - start + 1;
429 }
430
431 /* If VAL is a mask, then return nonzero, with S set to the starting bit
432 position and E set to the ending bit position of the mask. The return
433 value indicates how many consecutive bits exist in the mask. This is
434 the same as the previous function, except that it also indicates the
435 start and end bit positions of the mask. */
436
437 int
438 bitstr (val, s, e)
439 unsigned int val;
440 int *s, *e;
441 {
442 register int start, end, i;
443
444 start = -1;
445 end = -1;
446 for (i = 0; val != 0; val >>= 1, i++)
447 {
448 if (val & 1)
449 {
450 if (start < 0)
451 start = i;
452
453 end = i;
454 continue;
455 }
456
457 /* Still looking for the first bit. */
458 if (start < 0)
459 continue;
460
461 /* We've seen the start of a bit sequence, and now a zero. There
462 must be more one bits, otherwise we would have exited the loop.
463 Therefor, it is not a mask. */
464 if (val)
465 {
466 start = -1;
467 end = -1;
468 break;
469 }
470 }
471
472 /* The bit string has ones from START to END bit positions only. */
473 *s = start;
474 *e = end;
475 return ((start < 0) ? 0 : end - start + 1);
476 }
477 \f
478 /* Return the machine mode to use for a comparison. */
479
480 enum machine_mode
481 select_cc_mode (op, x)
482 RTX_CODE op;
483 rtx x ATTRIBUTE_UNUSED;
484 {
485 if (op == GTU || op == LTU || op == GEU || op == LEU)
486 return CC_UNSmode;
487 return CCmode;
488 }
489
490 /* X and Y are two things to compare using CODE. Emit the compare insn and
491 return the rtx for register 36 in the proper mode. */
492
493 rtx
494 gen_compare_reg (code, x, y)
495 enum rtx_code code;
496 rtx x, y;
497 {
498 rtx cc_reg;
499 enum machine_mode ccmode = SELECT_CC_MODE (code, x, y);
500 enum machine_mode mode
501 = GET_MODE (x) == VOIDmode ? GET_MODE (y) : GET_MODE (x);
502
503 if (mode == SImode)
504 {
505 if (! arith_operand (x, mode))
506 x = force_reg (SImode, x);
507 if (! arith_operand (y, mode))
508 y = force_reg (SImode, y);
509 }
510
511 cc_reg = gen_rtx_REG (ccmode, 36);
512 emit_insn (gen_rtx_SET (VOIDmode, cc_reg,
513 gen_rtx_COMPARE (ccmode, x, y)));
514
515 return cc_reg;
516 }
517
518 /* For the i960, REG is cost 1, REG+immed CONST is cost 2, REG+REG is cost 2,
519 REG+nonimmed CONST is cost 4. REG+SYMBOL_REF, SYMBOL_REF, and similar
520 are 4. Indexed addresses are cost 6. */
521
522 /* ??? Try using just RTX_COST, i.e. not defining ADDRESS_COST. */
523
524 int
525 i960_address_cost (x)
526 rtx x;
527 {
528 #if 0
529 /* Handled before calling here. */
530 if (GET_CODE (x) == REG)
531 return 1;
532 #endif
533 /* This is a MEMA operand -- it's free. */
534 if (GET_CODE (x) == CONST_INT
535 && INTVAL (x) >= 0
536 && INTVAL (x) < 4096)
537 return 0;
538
539 if (GET_CODE (x) == PLUS)
540 {
541 rtx base = XEXP (x, 0);
542 rtx offset = XEXP (x, 1);
543
544 if (GET_CODE (base) == SUBREG)
545 base = SUBREG_REG (base);
546 if (GET_CODE (offset) == SUBREG)
547 offset = SUBREG_REG (offset);
548
549 if (GET_CODE (base) == REG)
550 {
551 if (GET_CODE (offset) == REG)
552 return 2;
553 if (GET_CODE (offset) == CONST_INT)
554 {
555 if ((unsigned)INTVAL (offset) < 2047)
556 return 2;
557 return 4;
558 }
559 if (CONSTANT_P (offset))
560 return 4;
561 }
562 if (GET_CODE (base) == PLUS || GET_CODE (base) == MULT)
563 return 6;
564
565 /* This is an invalid address. The return value doesn't matter, but
566 for convenience we make this more expensive than anything else. */
567 return 12;
568 }
569 if (GET_CODE (x) == MULT)
570 return 6;
571
572 /* Symbol_refs and other unrecognized addresses are cost 4. */
573 return 4;
574 }
575 \f
576 /* Emit insns to move operands[1] into operands[0].
577
578 Return 1 if we have written out everything that needs to be done to
579 do the move. Otherwise, return 0 and the caller will emit the move
580 normally. */
581
582 int
583 emit_move_sequence (operands, mode)
584 rtx *operands;
585 enum machine_mode mode;
586 {
587 /* We can only store registers to memory. */
588
589 if (GET_CODE (operands[0]) == MEM && GET_CODE (operands[1]) != REG
590 && (operands[1] != const0_rtx || current_function_args_size
591 || current_function_varargs || current_function_stdarg
592 || rtx_equal_function_value_matters))
593 /* Here we use the same test as movsi+1 pattern -- see i960.md. */
594 operands[1] = force_reg (mode, operands[1]);
595
596 /* Storing multi-word values in unaligned hard registers to memory may
597 require a scratch since we have to store them a register at a time and
598 adding 4 to the memory address may not yield a valid insn. */
599 /* ??? We don't always need the scratch, but that would complicate things.
600 Maybe later. */
601 /* ??? We must also handle stores to pseudos here, because the pseudo may be
602 replaced with a MEM later. This would be cleaner if we didn't have
603 a separate pattern for unaligned DImode/TImode stores. */
604 if (GET_MODE_SIZE (mode) > UNITS_PER_WORD
605 && (GET_CODE (operands[0]) == MEM
606 || (GET_CODE (operands[0]) == REG
607 && REGNO (operands[0]) >= FIRST_PSEUDO_REGISTER))
608 && GET_CODE (operands[1]) == REG
609 && REGNO (operands[1]) < FIRST_PSEUDO_REGISTER
610 && ! HARD_REGNO_MODE_OK (REGNO (operands[1]), mode))
611 {
612 emit_insn (gen_rtx_PARALLEL
613 (VOIDmode,
614 gen_rtvec (2,
615 gen_rtx_SET (VOIDmode, operands[0], operands[1]),
616 gen_rtx_CLOBBER (VOIDmode,
617 gen_rtx_SCRATCH (Pmode)))));
618 return 1;
619 }
620
621 return 0;
622 }
623
624 /* Output assembler to move a double word value. */
625
626 const char *
627 i960_output_move_double (dst, src)
628 rtx dst, src;
629 {
630 rtx operands[5];
631
632 if (GET_CODE (dst) == REG
633 && GET_CODE (src) == REG)
634 {
635 if ((REGNO (src) & 1)
636 || (REGNO (dst) & 1))
637 {
638 /* We normally copy the low-numbered register first. However, if
639 the second source register is the same as the first destination
640 register, we must copy in the opposite order. */
641 if (REGNO (src) + 1 == REGNO (dst))
642 return "mov %D1,%D0\n\tmov %1,%0";
643 else
644 return "mov %1,%0\n\tmov %D1,%D0";
645 }
646 else
647 return "movl %1,%0";
648 }
649 else if (GET_CODE (dst) == REG
650 && GET_CODE (src) == CONST_INT
651 && CONST_OK_FOR_LETTER_P (INTVAL (src), 'I'))
652 {
653 if (REGNO (dst) & 1)
654 return "mov %1,%0\n\tmov 0,%D0";
655 else
656 return "movl %1,%0";
657 }
658 else if (GET_CODE (dst) == REG
659 && GET_CODE (src) == MEM)
660 {
661 if (REGNO (dst) & 1)
662 {
663 /* One can optimize a few cases here, but you have to be
664 careful of clobbering registers used in the address and
665 edge conditions. */
666 operands[0] = dst;
667 operands[1] = src;
668 operands[2] = gen_rtx_REG (Pmode, REGNO (dst) + 1);
669 operands[3] = gen_rtx_MEM (word_mode, operands[2]);
670 operands[4] = adj_offsettable_operand (operands[3], UNITS_PER_WORD);
671 output_asm_insn ("lda %1,%2\n\tld %3,%0\n\tld %4,%D0", operands);
672 return "";
673 }
674 else
675 return "ldl %1,%0";
676 }
677 else if (GET_CODE (dst) == MEM
678 && GET_CODE (src) == REG)
679 {
680 if (REGNO (src) & 1)
681 {
682 operands[0] = dst;
683 operands[1] = adj_offsettable_operand (dst, UNITS_PER_WORD);
684 if (! memory_address_p (word_mode, XEXP (operands[1], 0)))
685 abort ();
686 operands[2] = src;
687 output_asm_insn ("st %2,%0\n\tst %D2,%1", operands);
688 return "";
689 }
690 return "stl %1,%0";
691 }
692 else
693 abort ();
694 }
695
696 /* Output assembler to move a double word zero. */
697
698 const char *
699 i960_output_move_double_zero (dst)
700 rtx dst;
701 {
702 rtx operands[2];
703
704 operands[0] = dst;
705 {
706 operands[1] = adj_offsettable_operand (dst, 4);
707 output_asm_insn ("st g14,%0\n\tst g14,%1", operands);
708 }
709 return "";
710 }
711
712 /* Output assembler to move a quad word value. */
713
714 const char *
715 i960_output_move_quad (dst, src)
716 rtx dst, src;
717 {
718 rtx operands[7];
719
720 if (GET_CODE (dst) == REG
721 && GET_CODE (src) == REG)
722 {
723 if ((REGNO (src) & 3)
724 || (REGNO (dst) & 3))
725 {
726 /* We normally copy starting with the low numbered register.
727 However, if there is an overlap such that the first dest reg
728 is <= the last source reg but not < the first source reg, we
729 must copy in the opposite order. */
730 if (REGNO (dst) <= REGNO (src) + 3
731 && REGNO (dst) >= REGNO (src))
732 return "mov %F1,%F0\n\tmov %E1,%E0\n\tmov %D1,%D0\n\tmov %1,%0";
733 else
734 return "mov %1,%0\n\tmov %D1,%D0\n\tmov %E1,%E0\n\tmov %F1,%F0";
735 }
736 else
737 return "movq %1,%0";
738 }
739 else if (GET_CODE (dst) == REG
740 && GET_CODE (src) == CONST_INT
741 && CONST_OK_FOR_LETTER_P (INTVAL (src), 'I'))
742 {
743 if (REGNO (dst) & 3)
744 return "mov %1,%0\n\tmov 0,%D0\n\tmov 0,%E0\n\tmov 0,%F0";
745 else
746 return "movq %1,%0";
747 }
748 else if (GET_CODE (dst) == REG
749 && GET_CODE (src) == MEM)
750 {
751 if (REGNO (dst) & 3)
752 {
753 /* One can optimize a few cases here, but you have to be
754 careful of clobbering registers used in the address and
755 edge conditions. */
756 operands[0] = dst;
757 operands[1] = src;
758 operands[2] = gen_rtx_REG (Pmode, REGNO (dst) + 3);
759 operands[3] = gen_rtx_MEM (word_mode, operands[2]);
760 operands[4] = adj_offsettable_operand (operands[3], UNITS_PER_WORD);
761 operands[5] = adj_offsettable_operand (operands[4], UNITS_PER_WORD);
762 operands[6] = adj_offsettable_operand (operands[5], UNITS_PER_WORD);
763 output_asm_insn ("lda %1,%2\n\tld %3,%0\n\tld %4,%D0\n\tld %5,%E0\n\tld %6,%F0", operands);
764 return "";
765 }
766 else
767 return "ldq %1,%0";
768 }
769 else if (GET_CODE (dst) == MEM
770 && GET_CODE (src) == REG)
771 {
772 if (REGNO (src) & 3)
773 {
774 operands[0] = dst;
775 operands[1] = adj_offsettable_operand (dst, UNITS_PER_WORD);
776 operands[2] = adj_offsettable_operand (dst, 2*UNITS_PER_WORD);
777 operands[3] = adj_offsettable_operand (dst, 3*UNITS_PER_WORD);
778 if (! memory_address_p (word_mode, XEXP (operands[3], 0)))
779 abort ();
780 operands[4] = src;
781 output_asm_insn ("st %4,%0\n\tst %D4,%1\n\tst %E4,%2\n\tst %F4,%3", operands);
782 return "";
783 }
784 return "stq %1,%0";
785 }
786 else
787 abort ();
788 }
789
790 /* Output assembler to move a quad word zero. */
791
792 const char *
793 i960_output_move_quad_zero (dst)
794 rtx dst;
795 {
796 rtx operands[4];
797
798 operands[0] = dst;
799 {
800 operands[1] = adj_offsettable_operand (dst, 4);
801 operands[2] = adj_offsettable_operand (dst, 8);
802 operands[3] = adj_offsettable_operand (dst, 12);
803 output_asm_insn ("st g14,%0\n\tst g14,%1\n\tst g14,%2\n\tst g14,%3", operands);
804 }
805 return "";
806 }
807
808 \f
809 /* Emit insns to load a constant to non-floating point registers.
810 Uses several strategies to try to use as few insns as possible. */
811
812 const char *
813 i960_output_ldconst (dst, src)
814 register rtx dst, src;
815 {
816 register int rsrc1;
817 register unsigned rsrc2;
818 enum machine_mode mode = GET_MODE (dst);
819 rtx operands[4];
820
821 operands[0] = operands[2] = dst;
822 operands[1] = operands[3] = src;
823
824 /* Anything that isn't a compile time constant, such as a SYMBOL_REF,
825 must be a ldconst insn. */
826
827 if (GET_CODE (src) != CONST_INT && GET_CODE (src) != CONST_DOUBLE)
828 {
829 output_asm_insn ("ldconst %1,%0", operands);
830 return "";
831 }
832 else if (mode == XFmode)
833 {
834 REAL_VALUE_TYPE d;
835 long value_long[3];
836 int i;
837
838 if (fp_literal_zero (src, XFmode))
839 return "movt 0,%0";
840
841 REAL_VALUE_FROM_CONST_DOUBLE (d, src);
842 REAL_VALUE_TO_TARGET_LONG_DOUBLE (d, value_long);
843
844 output_asm_insn ("# ldconst %1,%0",operands);
845
846 for (i = 0; i < 3; i++)
847 {
848 operands[0] = gen_rtx_REG (SImode, REGNO (dst) + i);
849 operands[1] = GEN_INT (value_long[i]);
850 output_asm_insn (i960_output_ldconst (operands[0], operands[1]),
851 operands);
852 }
853
854 return "";
855 }
856 else if (mode == DFmode)
857 {
858 rtx first, second;
859
860 if (fp_literal_zero (src, DFmode))
861 return "movl 0,%0";
862
863 split_double (src, &first, &second);
864
865 output_asm_insn ("# ldconst %1,%0",operands);
866
867 operands[0] = gen_rtx_REG (SImode, REGNO (dst));
868 operands[1] = first;
869 output_asm_insn (i960_output_ldconst (operands[0], operands[1]),
870 operands);
871 operands[0] = gen_rtx_REG (SImode, REGNO (dst) + 1);
872 operands[1] = second;
873 output_asm_insn (i960_output_ldconst (operands[0], operands[1]),
874 operands);
875 return "";
876 }
877 else if (mode == SFmode)
878 {
879 REAL_VALUE_TYPE d;
880 long value;
881
882 REAL_VALUE_FROM_CONST_DOUBLE (d, src);
883 REAL_VALUE_TO_TARGET_SINGLE (d, value);
884
885 output_asm_insn ("# ldconst %1,%0",operands);
886 operands[0] = gen_rtx_REG (SImode, REGNO (dst));
887 operands[1] = GEN_INT (value);
888 output_asm_insn (i960_output_ldconst (operands[0], operands[1]),
889 operands);
890 return "";
891 }
892 else if (mode == TImode)
893 {
894 /* ??? This is currently not handled at all. */
895 abort ();
896
897 /* Note: lowest order word goes in lowest numbered reg. */
898 rsrc1 = INTVAL (src);
899 if (rsrc1 >= 0 && rsrc1 < 32)
900 return "movq %1,%0";
901 else
902 output_asm_insn ("movq\t0,%0\t# ldconstq %1,%0",operands);
903 /* Go pick up the low-order word. */
904 }
905 else if (mode == DImode)
906 {
907 rtx upperhalf, lowerhalf, xoperands[2];
908
909 if (GET_CODE (src) == CONST_DOUBLE || GET_CODE (src) == CONST_INT)
910 split_double (src, &lowerhalf, &upperhalf);
911
912 else
913 abort ();
914
915 /* Note: lowest order word goes in lowest numbered reg. */
916 /* Numbers from 0 to 31 can be handled with a single insn. */
917 rsrc1 = INTVAL (lowerhalf);
918 if (upperhalf == const0_rtx && rsrc1 >= 0 && rsrc1 < 32)
919 return "movl %1,%0";
920
921 /* Output the upper half with a recursive call. */
922 xoperands[0] = gen_rtx_REG (SImode, REGNO (dst) + 1);
923 xoperands[1] = upperhalf;
924 output_asm_insn (i960_output_ldconst (xoperands[0], xoperands[1]),
925 xoperands);
926 /* The lower word is emitted as normally. */
927 }
928 else
929 {
930 rsrc1 = INTVAL (src);
931 if (mode == QImode)
932 {
933 if (rsrc1 > 0xff)
934 rsrc1 &= 0xff;
935 }
936 else if (mode == HImode)
937 {
938 if (rsrc1 > 0xffff)
939 rsrc1 &= 0xffff;
940 }
941 }
942
943 if (rsrc1 >= 0)
944 {
945 /* ldconst 0..31,X -> mov 0..31,X */
946 if (rsrc1 < 32)
947 {
948 if (i960_last_insn_type == I_TYPE_REG && TARGET_C_SERIES)
949 return "lda %1,%0";
950 return "mov %1,%0";
951 }
952
953 /* ldconst 32..63,X -> add 31,nn,X */
954 if (rsrc1 < 63)
955 {
956 if (i960_last_insn_type == I_TYPE_REG && TARGET_C_SERIES)
957 return "lda %1,%0";
958 operands[1] = GEN_INT (rsrc1 - 31);
959 output_asm_insn ("addo\t31,%1,%0\t# ldconst %3,%0", operands);
960 return "";
961 }
962 }
963 else if (rsrc1 < 0)
964 {
965 /* ldconst -1..-31 -> sub 0,0..31,X */
966 if (rsrc1 >= -31)
967 {
968 /* return 'sub -(%1),0,%0' */
969 operands[1] = GEN_INT (- rsrc1);
970 output_asm_insn ("subo\t%1,0,%0\t# ldconst %3,%0", operands);
971 return "";
972 }
973
974 /* ldconst -32 -> not 31,X */
975 if (rsrc1 == -32)
976 {
977 operands[1] = GEN_INT (~rsrc1);
978 output_asm_insn ("not\t%1,%0 # ldconst %3,%0", operands);
979 return "";
980 }
981 }
982
983 /* If const is a single bit. */
984 if (bitpos (rsrc1) >= 0)
985 {
986 operands[1] = GEN_INT (bitpos (rsrc1));
987 output_asm_insn ("setbit\t%1,0,%0\t# ldconst %3,%0", operands);
988 return "";
989 }
990
991 /* If const is a bit string of less than 6 bits (1..31 shifted). */
992 if (is_mask (rsrc1))
993 {
994 int s, e;
995
996 if (bitstr (rsrc1, &s, &e) < 6)
997 {
998 rsrc2 = ((unsigned int) rsrc1) >> s;
999 operands[1] = GEN_INT (rsrc2);
1000 operands[2] = GEN_INT (s);
1001 output_asm_insn ("shlo\t%2,%1,%0\t# ldconst %3,%0", operands);
1002 return "";
1003 }
1004 }
1005
1006 /* Unimplemented cases:
1007 const is in range 0..31 but rotated around end of word:
1008 ror 31,3,g0 -> ldconst 0xe0000003,g0
1009
1010 and any 2 instruction cases that might be worthwhile */
1011
1012 output_asm_insn ("ldconst %1,%0", operands);
1013 return "";
1014 }
1015
1016 /* Determine if there is an opportunity for a bypass optimization.
1017 Bypass succeeds on the 960K* if the destination of the previous
1018 instruction is the second operand of the current instruction.
1019 Bypass always succeeds on the C*.
1020
1021 Return 1 if the pattern should interchange the operands.
1022
1023 CMPBR_FLAG is true if this is for a compare-and-branch insn.
1024 OP1 and OP2 are the two source operands of a 3 operand insn. */
1025
1026 int
1027 i960_bypass (insn, op1, op2, cmpbr_flag)
1028 register rtx insn, op1, op2;
1029 int cmpbr_flag;
1030 {
1031 register rtx prev_insn, prev_dest;
1032
1033 if (TARGET_C_SERIES)
1034 return 0;
1035
1036 /* Can't do this if op1 isn't a register. */
1037 if (! REG_P (op1))
1038 return 0;
1039
1040 /* Can't do this for a compare-and-branch if both ops aren't regs. */
1041 if (cmpbr_flag && ! REG_P (op2))
1042 return 0;
1043
1044 prev_insn = prev_real_insn (insn);
1045
1046 if (prev_insn && GET_CODE (prev_insn) == INSN
1047 && GET_CODE (PATTERN (prev_insn)) == SET)
1048 {
1049 prev_dest = SET_DEST (PATTERN (prev_insn));
1050 if ((GET_CODE (prev_dest) == REG && REGNO (prev_dest) == REGNO (op1))
1051 || (GET_CODE (prev_dest) == SUBREG
1052 && GET_CODE (SUBREG_REG (prev_dest)) == REG
1053 && REGNO (SUBREG_REG (prev_dest)) == REGNO (op1)))
1054 return 1;
1055 }
1056 return 0;
1057 }
1058 \f
1059 /* Output the code which declares the function name. This also handles
1060 leaf routines, which have special requirements, and initializes some
1061 global variables. */
1062
1063 void
1064 i960_function_name_declare (file, name, fndecl)
1065 FILE *file;
1066 const char *name;
1067 tree fndecl;
1068 {
1069 register int i, j;
1070 int leaf_proc_ok;
1071 rtx insn;
1072
1073 /* Increment global return label. */
1074
1075 ret_label++;
1076
1077 /* Compute whether tail calls and leaf routine optimizations can be performed
1078 for this function. */
1079
1080 if (TARGET_TAILCALL)
1081 tail_call_ok = 1;
1082 else
1083 tail_call_ok = 0;
1084
1085 if (TARGET_LEAFPROC)
1086 leaf_proc_ok = 1;
1087 else
1088 leaf_proc_ok = 0;
1089
1090 /* Even if nobody uses extra parms, can't have leafproc or tail calls if
1091 argblock, because argblock uses g14 implicitly. */
1092
1093 if (current_function_args_size != 0 || VARARGS_STDARG_FUNCTION (fndecl))
1094 {
1095 tail_call_ok = 0;
1096 leaf_proc_ok = 0;
1097 }
1098
1099 /* See if caller passes in an address to return value. */
1100
1101 if (aggregate_value_p (DECL_RESULT (fndecl)))
1102 {
1103 tail_call_ok = 0;
1104 leaf_proc_ok = 0;
1105 }
1106
1107 /* Can not use tail calls or make this a leaf routine if there is a non
1108 zero frame size. */
1109
1110 if (get_frame_size () != 0)
1111 leaf_proc_ok = 0;
1112
1113 /* I don't understand this condition, and do not think that it is correct.
1114 Apparently this is just checking whether the frame pointer is used, and
1115 we can't trust regs_ever_live[fp] since it is (almost?) always set. */
1116
1117 if (tail_call_ok)
1118 for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
1119 if (GET_CODE (insn) == INSN
1120 && reg_mentioned_p (frame_pointer_rtx, insn))
1121 {
1122 tail_call_ok = 0;
1123 break;
1124 }
1125
1126 /* Check for CALL insns. Can not be a leaf routine if there are any. */
1127
1128 if (leaf_proc_ok)
1129 for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
1130 if (GET_CODE (insn) == CALL_INSN)
1131 {
1132 leaf_proc_ok = 0;
1133 break;
1134 }
1135
1136 /* Can not be a leaf routine if any non-call clobbered registers are
1137 used in this function. */
1138
1139 if (leaf_proc_ok)
1140 for (i = 0, j = 0; i < FIRST_PSEUDO_REGISTER; i++)
1141 if (regs_ever_live[i]
1142 && ((! call_used_regs[i]) || (i > 7 && i < 12)))
1143 {
1144 /* Global registers. */
1145 if (i < 16 && i > 7 && i != 13)
1146 leaf_proc_ok = 0;
1147 /* Local registers. */
1148 else if (i < 32)
1149 leaf_proc_ok = 0;
1150 }
1151
1152 /* Now choose a leaf return register, if we can find one, and if it is
1153 OK for this to be a leaf routine. */
1154
1155 i960_leaf_ret_reg = -1;
1156
1157 if (optimize && leaf_proc_ok)
1158 {
1159 for (i960_leaf_ret_reg = -1, i = 0; i < 8; i++)
1160 if (regs_ever_live[i] == 0)
1161 {
1162 i960_leaf_ret_reg = i;
1163 regs_ever_live[i] = 1;
1164 break;
1165 }
1166 }
1167
1168 /* Do this after choosing the leaf return register, so it will be listed
1169 if one was chosen. */
1170
1171 fprintf (file, "\t# Function '%s'\n", (name[0] == '*' ? &name[1] : name));
1172 fprintf (file, "\t# Registers used: ");
1173
1174 for (i = 0, j = 0; i < FIRST_PSEUDO_REGISTER; i++)
1175 {
1176 if (regs_ever_live[i])
1177 {
1178 fprintf (file, "%s%s ", reg_names[i], call_used_regs[i] ? "" : "*");
1179
1180 if (i > 15 && j == 0)
1181 {
1182 fprintf (file,"\n\t#\t\t ");
1183 j++;
1184 }
1185 }
1186 }
1187
1188 fprintf (file, "\n");
1189
1190 if (i960_leaf_ret_reg >= 0)
1191 {
1192 /* Make it a leaf procedure. */
1193
1194 if (TREE_PUBLIC (fndecl))
1195 fprintf (file,"\t.globl\t%s.lf\n", (name[0] == '*' ? &name[1] : name));
1196
1197 fprintf (file, "\t.leafproc\t");
1198 assemble_name (file, name);
1199 fprintf (file, ",%s.lf\n", (name[0] == '*' ? &name[1] : name));
1200 ASM_OUTPUT_LABEL (file, name);
1201 fprintf (file, "\tlda Li960R%d,g14\n", ret_label);
1202 fprintf (file, "%s.lf:\n", (name[0] == '*' ? &name[1] : name));
1203 fprintf (file, "\tmov g14,g%d\n", i960_leaf_ret_reg);
1204
1205 if (TARGET_C_SERIES)
1206 {
1207 fprintf (file, "\tlda 0,g14\n");
1208 i960_last_insn_type = I_TYPE_MEM;
1209 }
1210 else
1211 {
1212 fprintf (file, "\tmov 0,g14\n");
1213 i960_last_insn_type = I_TYPE_REG;
1214 }
1215 }
1216 else
1217 {
1218 ASM_OUTPUT_LABEL (file, name);
1219 i960_last_insn_type = I_TYPE_CTRL;
1220 }
1221 }
1222 \f
1223 /* Compute and return the frame size. */
1224
1225 int
1226 compute_frame_size (size)
1227 int size;
1228 {
1229 int actual_fsize;
1230 int outgoing_args_size = current_function_outgoing_args_size;
1231
1232 /* The STARTING_FRAME_OFFSET is totally hidden to us as far
1233 as size is concerned. */
1234 actual_fsize = (size + 15) & -16;
1235 actual_fsize += (outgoing_args_size + 15) & -16;
1236
1237 return actual_fsize;
1238 }
1239
1240 /* Here register group is range of registers which can be moved by
1241 one i960 instruction. */
1242
1243 struct reg_group
1244 {
1245 char start_reg;
1246 char length;
1247 };
1248
1249 static int i960_form_reg_groups PARAMS ((int, int, int *, int, struct reg_group *));
1250 static int i960_reg_group_compare PARAMS ((const void *, const void *));
1251 static int i960_split_reg_group PARAMS ((struct reg_group *, int, int));
1252 static void i960_arg_size_and_align PARAMS ((enum machine_mode, tree, int *, int *));
1253
1254 /* The following functions forms the biggest as possible register
1255 groups with registers in STATE. REGS contain states of the
1256 registers in range [start, finish_reg). The function returns the
1257 number of groups formed. */
1258 static int
1259 i960_form_reg_groups (start_reg, finish_reg, regs, state, reg_groups)
1260 int start_reg;
1261 int finish_reg;
1262 int *regs;
1263 int state;
1264 struct reg_group *reg_groups;
1265 {
1266 int i;
1267 int nw = 0;
1268
1269 for (i = start_reg; i < finish_reg; )
1270 {
1271 if (regs [i] != state)
1272 {
1273 i++;
1274 continue;
1275 }
1276 else if (i % 2 != 0 || regs [i + 1] != state)
1277 reg_groups [nw].length = 1;
1278 else if (i % 4 != 0 || regs [i + 2] != state)
1279 reg_groups [nw].length = 2;
1280 else if (regs [i + 3] != state)
1281 reg_groups [nw].length = 3;
1282 else
1283 reg_groups [nw].length = 4;
1284 reg_groups [nw].start_reg = i;
1285 i += reg_groups [nw].length;
1286 nw++;
1287 }
1288 return nw;
1289 }
1290
1291 /* We sort register winodws in descending order by length. */
1292 static int
1293 i960_reg_group_compare (group1, group2)
1294 const void *group1;
1295 const void *group2;
1296 {
1297 const struct reg_group *w1 = group1;
1298 const struct reg_group *w2 = group2;
1299
1300 if (w1->length > w2->length)
1301 return -1;
1302 else if (w1->length < w2->length)
1303 return 1;
1304 else
1305 return 0;
1306 }
1307
1308 /* Split the first register group in REG_GROUPS on subgroups one of
1309 which will contain SUBGROUP_LENGTH registers. The function
1310 returns new number of winodws. */
1311 static int
1312 i960_split_reg_group (reg_groups, nw, subgroup_length)
1313 struct reg_group *reg_groups;
1314 int nw;
1315 int subgroup_length;
1316 {
1317 if (subgroup_length < reg_groups->length - subgroup_length)
1318 /* This guarantees correct alignments of the two subgroups for
1319 i960 (see spliting for the group length 2, 3, 4). More
1320 generalized algorithm would require splitting the group more
1321 two subgroups. */
1322 subgroup_length = reg_groups->length - subgroup_length;
1323 /* More generalized algorithm would require to try merging
1324 subgroups here. But in case i960 it always results in failure
1325 because of register group alignment. */
1326 reg_groups[nw].length = reg_groups->length - subgroup_length;
1327 reg_groups[nw].start_reg = reg_groups->start_reg + subgroup_length;
1328 nw++;
1329 reg_groups->length = subgroup_length;
1330 qsort (reg_groups, nw, sizeof (struct reg_group), i960_reg_group_compare);
1331 return nw;
1332 }
1333
1334 /* Output code for the function prologue. */
1335
1336 void
1337 i960_function_prologue (file, size)
1338 FILE *file;
1339 unsigned int size;
1340 {
1341 register int i, j, nr;
1342 int n_saved_regs = 0;
1343 int n_remaining_saved_regs;
1344 int lvar_size;
1345 int actual_fsize, offset;
1346 int gnw, lnw;
1347 struct reg_group *g, *l;
1348 char tmpstr[1000];
1349 /* -1 if reg must be saved on proc entry, 0 if available, 1 if saved
1350 somewhere. */
1351 int regs[FIRST_PSEUDO_REGISTER];
1352 /* All global registers (which must be saved) divided by groups. */
1353 struct reg_group global_reg_groups [16];
1354 /* All local registers (which are available) divided by groups. */
1355 struct reg_group local_reg_groups [16];
1356
1357
1358 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
1359 if (regs_ever_live[i]
1360 && ((! call_used_regs[i]) || (i > 7 && i < 12))
1361 /* No need to save the static chain pointer. */
1362 && ! (i == STATIC_CHAIN_REGNUM && current_function_needs_context))
1363 {
1364 regs[i] = -1;
1365 /* Count global registers that need saving. */
1366 if (i < 16)
1367 n_saved_regs++;
1368 }
1369 else
1370 regs[i] = 0;
1371
1372 n_remaining_saved_regs = n_saved_regs;
1373
1374 epilogue_string[0] = '\0';
1375
1376 if (profile_flag || profile_block_flag)
1377 {
1378 /* When profiling, we may use registers 20 to 27 to save arguments, so
1379 they can't be used here for saving globals. J is the number of
1380 argument registers the mcount call will save. */
1381 for (j = 7; j >= 0 && ! regs_ever_live[j]; j--)
1382 ;
1383
1384 for (i = 20; i <= j + 20; i++)
1385 regs[i] = -1;
1386 }
1387
1388 gnw = i960_form_reg_groups (0, 16, regs, -1, global_reg_groups);
1389 lnw = i960_form_reg_groups (19, 32, regs, 0, local_reg_groups);
1390 qsort (global_reg_groups, gnw, sizeof (struct reg_group),
1391 i960_reg_group_compare);
1392 qsort (local_reg_groups, lnw, sizeof (struct reg_group),
1393 i960_reg_group_compare);
1394 for (g = global_reg_groups, l = local_reg_groups; lnw != 0 && gnw != 0;)
1395 {
1396 if (g->length == l->length)
1397 {
1398 fprintf (file, "\tmov%s %s,%s\n",
1399 ((g->length == 4) ? "q" :
1400 (g->length == 3) ? "t" :
1401 (g->length == 2) ? "l" : ""),
1402 reg_names[(unsigned char) g->start_reg],
1403 reg_names[(unsigned char) l->start_reg]);
1404 sprintf (tmpstr, "\tmov%s %s,%s\n",
1405 ((g->length == 4) ? "q" :
1406 (g->length == 3) ? "t" :
1407 (g->length == 2) ? "l" : ""),
1408 reg_names[(unsigned char) l->start_reg],
1409 reg_names[(unsigned char) g->start_reg]);
1410 strcat (epilogue_string, tmpstr);
1411 n_remaining_saved_regs -= g->length;
1412 for (i = 0; i < g->length; i++)
1413 {
1414 regs [i + g->start_reg] = 1;
1415 regs [i + l->start_reg] = -1;
1416 regs_ever_live [i + l->start_reg] = 1;
1417 }
1418 g++;
1419 l++;
1420 gnw--;
1421 lnw--;
1422 }
1423 else if (g->length > l->length)
1424 gnw = i960_split_reg_group (g, gnw, l->length);
1425 else
1426 lnw = i960_split_reg_group (l, lnw, g->length);
1427 }
1428
1429 actual_fsize = compute_frame_size (size);
1430 #if 0
1431 /* ??? The 1.2.1 compiler does this also. This is meant to round the frame
1432 size up to the nearest multiple of 16. I don't know whether this is
1433 necessary, or even desirable.
1434
1435 The frame pointer must be aligned, but the call instruction takes care of
1436 that. If we leave the stack pointer unaligned, we may save a little on
1437 dynamic stack allocation. And we don't lose, at least according to the
1438 i960CA manual. */
1439 actual_fsize = (actual_fsize + 15) & ~0xF;
1440 #endif
1441
1442 /* Check stack limit if necessary. */
1443 if (current_function_limit_stack)
1444 {
1445 rtx min_stack = stack_limit_rtx;
1446 if (actual_fsize != 0)
1447 min_stack = plus_constant (stack_limit_rtx, -actual_fsize);
1448
1449 /* Now, emulate a little bit of reload. We want to turn 'min_stack'
1450 into an arith_operand. Use register 20 as the temporary. */
1451 if (legitimate_address_p (Pmode, min_stack, 1)
1452 && !arith_operand (min_stack, Pmode))
1453 {
1454 rtx tmp = gen_rtx_MEM (Pmode, min_stack);
1455 fputs ("\tlda\t", file);
1456 i960_print_operand (file, tmp, 0);
1457 fputs (",r4\n", file);
1458 min_stack = gen_rtx_REG (Pmode, 20);
1459 }
1460 if (arith_operand (min_stack, Pmode))
1461 {
1462 fputs ("\tcmpo\tsp,", file);
1463 i960_print_operand (file, min_stack, 0);
1464 fputs ("\n\tfaultge.f\n", file);
1465 }
1466 else
1467 warning ("stack limit expression is not supported");
1468 }
1469
1470 /* Allocate space for register save and locals. */
1471 if (actual_fsize > 0)
1472 {
1473 if (actual_fsize < 32)
1474 fprintf (file, "\taddo %d,sp,sp\n", actual_fsize);
1475 else
1476 fprintf (file, "\tlda\t%d(sp),sp\n", actual_fsize);
1477 }
1478
1479 /* Take hardware register save area created by the call instruction
1480 into account, but store them before the argument block area. */
1481 lvar_size = actual_fsize - compute_frame_size (0) - n_saved_regs * 4;
1482 offset = STARTING_FRAME_OFFSET + lvar_size;
1483 /* Save registers on stack if needed. */
1484 /* ??? Is it worth to use the same algorithm as one for saving
1485 global registers in local registers? */
1486 for (i = 0, j = n_remaining_saved_regs; j > 0 && i < 16; i++)
1487 {
1488 if (regs[i] != -1)
1489 continue;
1490
1491 nr = 1;
1492
1493 if (i <= 14 && i % 2 == 0 && regs[i+1] == -1 && offset % 2 == 0)
1494 nr = 2;
1495
1496 if (nr == 2 && i <= 12 && i % 4 == 0 && regs[i+2] == -1
1497 && offset % 4 == 0)
1498 nr = 3;
1499
1500 if (nr == 3 && regs[i+3] == -1)
1501 nr = 4;
1502
1503 fprintf (file,"\tst%s %s,%d(fp)\n",
1504 ((nr == 4) ? "q" :
1505 (nr == 3) ? "t" :
1506 (nr == 2) ? "l" : ""),
1507 reg_names[i], offset);
1508 sprintf (tmpstr,"\tld%s %d(fp),%s\n",
1509 ((nr == 4) ? "q" :
1510 (nr == 3) ? "t" :
1511 (nr == 2) ? "l" : ""),
1512 offset, reg_names[i]);
1513 strcat (epilogue_string, tmpstr);
1514 i += nr-1;
1515 j -= nr;
1516 offset += nr * 4;
1517 }
1518
1519 if (actual_fsize == 0)
1520 return;
1521
1522 fprintf (file, "\t#Prologue stats:\n");
1523 fprintf (file, "\t# Total Frame Size: %d bytes\n", actual_fsize);
1524
1525 if (lvar_size)
1526 fprintf (file, "\t# Local Variable Size: %d bytes\n", lvar_size);
1527 if (n_saved_regs)
1528 fprintf (file, "\t# Register Save Size: %d regs, %d bytes\n",
1529 n_saved_regs, n_saved_regs * 4);
1530 fprintf (file, "\t#End Prologue#\n");
1531 }
1532
1533 /* Output code for the function profiler. */
1534
1535 void
1536 output_function_profiler (file, labelno)
1537 FILE *file;
1538 int labelno;
1539 {
1540 /* The last used parameter register. */
1541 int last_parm_reg;
1542 int i, j, increment;
1543 int varargs_stdarg_function
1544 = VARARGS_STDARG_FUNCTION (current_function_decl);
1545
1546 /* Figure out the last used parameter register. The proper thing to do
1547 is to walk incoming args of the function. A function might have live
1548 parameter registers even if it has no incoming args. Note that we
1549 don't have to save parameter registers g8 to g11 because they are
1550 call preserved. */
1551
1552 /* See also output_function_prologue, which tries to use local registers
1553 for preserved call-saved global registers. */
1554
1555 for (last_parm_reg = 7;
1556 last_parm_reg >= 0 && ! regs_ever_live[last_parm_reg];
1557 last_parm_reg--)
1558 ;
1559
1560 /* Save parameter registers in regs r4 (20) to r11 (27). */
1561
1562 for (i = 0, j = 4; i <= last_parm_reg; i += increment, j += increment)
1563 {
1564 if (i % 4 == 0 && (last_parm_reg - i) >= 3)
1565 increment = 4;
1566 else if (i % 4 == 0 && (last_parm_reg - i) >= 2)
1567 increment = 3;
1568 else if (i % 2 == 0 && (last_parm_reg - i) >= 1)
1569 increment = 2;
1570 else
1571 increment = 1;
1572
1573 fprintf (file, "\tmov%s g%d,r%d\n",
1574 (increment == 4 ? "q" : increment == 3 ? "t"
1575 : increment == 2 ? "l": ""), i, j);
1576 }
1577
1578 /* If this function uses the arg pointer, then save it in r3 and then
1579 set it to zero. */
1580
1581 if (current_function_args_size != 0 || varargs_stdarg_function)
1582 fprintf (file, "\tmov g14,r3\n\tmov 0,g14\n");
1583
1584 /* Load location address into g0 and call mcount. */
1585
1586 fprintf (file, "\tlda\tLP%d,g0\n\tcallx\tmcount\n", labelno);
1587
1588 /* If this function uses the arg pointer, restore it. */
1589
1590 if (current_function_args_size != 0 || varargs_stdarg_function)
1591 fprintf (file, "\tmov r3,g14\n");
1592
1593 /* Restore parameter registers. */
1594
1595 for (i = 0, j = 4; i <= last_parm_reg; i += increment, j += increment)
1596 {
1597 if (i % 4 == 0 && (last_parm_reg - i) >= 3)
1598 increment = 4;
1599 else if (i % 4 == 0 && (last_parm_reg - i) >= 2)
1600 increment = 3;
1601 else if (i % 2 == 0 && (last_parm_reg - i) >= 1)
1602 increment = 2;
1603 else
1604 increment = 1;
1605
1606 fprintf (file, "\tmov%s r%d,g%d\n",
1607 (increment == 4 ? "q" : increment == 3 ? "t"
1608 : increment == 2 ? "l": ""), j, i);
1609 }
1610 }
1611
1612 /* Output code for the function epilogue. */
1613
1614 void
1615 i960_function_epilogue (file, size)
1616 FILE *file;
1617 unsigned int size ATTRIBUTE_UNUSED;
1618 {
1619 if (i960_leaf_ret_reg >= 0)
1620 {
1621 fprintf (file, "Li960R%d: ret\n", ret_label);
1622 return;
1623 }
1624
1625 if (*epilogue_string == 0)
1626 {
1627 register rtx tmp;
1628
1629 /* Emit a return insn, but only if control can fall through to here. */
1630
1631 tmp = get_last_insn ();
1632 while (tmp)
1633 {
1634 if (GET_CODE (tmp) == BARRIER)
1635 return;
1636 if (GET_CODE (tmp) == CODE_LABEL)
1637 break;
1638 if (GET_CODE (tmp) == JUMP_INSN)
1639 {
1640 if (GET_CODE (PATTERN (tmp)) == RETURN)
1641 return;
1642 break;
1643 }
1644 if (GET_CODE (tmp) == NOTE)
1645 {
1646 tmp = PREV_INSN (tmp);
1647 continue;
1648 }
1649 break;
1650 }
1651 fprintf (file, "Li960R%d: ret\n", ret_label);
1652 return;
1653 }
1654
1655 fprintf (file, "Li960R%d:\n", ret_label);
1656
1657 fprintf (file, "\t#EPILOGUE#\n");
1658
1659 /* Output the string created by the prologue which will restore all
1660 registers saved by the prologue. */
1661
1662 if (epilogue_string[0] != '\0')
1663 fprintf (file, "%s", epilogue_string);
1664
1665 /* Must clear g14 on return if this function set it.
1666 Only varargs/stdarg functions modify g14. */
1667
1668 if (VARARGS_STDARG_FUNCTION (current_function_decl))
1669 fprintf (file, "\tmov 0,g14\n");
1670
1671 fprintf (file, "\tret\n");
1672 fprintf (file, "\t#End Epilogue#\n");
1673 }
1674
1675 /* Output code for a call insn. */
1676
1677 const char *
1678 i960_output_call_insn (target, argsize_rtx, arg_pointer, insn)
1679 register rtx target, argsize_rtx, arg_pointer, insn;
1680 {
1681 int argsize = INTVAL (argsize_rtx);
1682 rtx nexti = next_real_insn (insn);
1683 rtx operands[2];
1684 int varargs_stdarg_function
1685 = VARARGS_STDARG_FUNCTION (current_function_decl);
1686
1687 operands[0] = target;
1688 operands[1] = arg_pointer;
1689
1690 if (current_function_args_size != 0 || varargs_stdarg_function)
1691 output_asm_insn ("mov g14,r3", operands);
1692
1693 if (argsize > 48)
1694 output_asm_insn ("lda %a1,g14", operands);
1695 else if (current_function_args_size != 0 || varargs_stdarg_function)
1696 output_asm_insn ("mov 0,g14", operands);
1697
1698 /* The code used to assume that calls to SYMBOL_REFs could not be more
1699 than 24 bits away (b vs bx, callj vs callx). This is not true. This
1700 feature is now implemented by relaxing in the GNU linker. It can convert
1701 bx to b if in range, and callx to calls/call/balx/bal as appropriate. */
1702
1703 /* Nexti could be zero if the called routine is volatile. */
1704 if (optimize && (*epilogue_string == 0) && argsize == 0 && tail_call_ok
1705 && (nexti == 0 || GET_CODE (PATTERN (nexti)) == RETURN))
1706 {
1707 /* Delete following return insn. */
1708 if (nexti && no_labels_between_p (insn, nexti))
1709 delete_insn (nexti);
1710 output_asm_insn ("bx %0", operands);
1711 return "# notreached";
1712 }
1713
1714 output_asm_insn ("callx %0", operands);
1715
1716 /* If the caller sets g14 to the address of the argblock, then the caller
1717 must clear it after the return. */
1718
1719 if (current_function_args_size != 0 || varargs_stdarg_function)
1720 output_asm_insn ("mov r3,g14", operands);
1721 else if (argsize > 48)
1722 output_asm_insn ("mov 0,g14", operands);
1723
1724 return "";
1725 }
1726
1727 /* Output code for a return insn. */
1728
1729 const char *
1730 i960_output_ret_insn (insn)
1731 register rtx insn;
1732 {
1733 static char lbuf[20];
1734
1735 if (*epilogue_string != 0)
1736 {
1737 if (! TARGET_CODE_ALIGN && next_real_insn (insn) == 0)
1738 return "";
1739
1740 sprintf (lbuf, "b Li960R%d", ret_label);
1741 return lbuf;
1742 }
1743
1744 /* Must clear g14 on return if this function set it.
1745 Only varargs/stdarg functions modify g14. */
1746
1747 if (VARARGS_STDARG_FUNCTION (current_function_decl))
1748 output_asm_insn ("mov 0,g14", 0);
1749
1750 if (i960_leaf_ret_reg >= 0)
1751 {
1752 sprintf (lbuf, "bx (%s)", reg_names[i960_leaf_ret_reg]);
1753 return lbuf;
1754 }
1755 return "ret";
1756 }
1757 \f
1758 #if 0
1759 /* Return a character string representing the branch prediction
1760 opcode to be tacked on an instruction. This must at least
1761 return a null string. */
1762
1763 const char *
1764 i960_br_predict_opcode (lab_ref, insn)
1765 rtx lab_ref, insn;
1766 {
1767 if (TARGET_BRANCH_PREDICT)
1768 {
1769 unsigned long label_uid;
1770
1771 if (GET_CODE (lab_ref) == CODE_LABEL)
1772 label_uid = INSN_UID (lab_ref);
1773 else if (GET_CODE (lab_ref) == LABEL_REF)
1774 label_uid = INSN_UID (XEXP (lab_ref, 0));
1775 else
1776 return ".f";
1777
1778 /* If not optimizing, then the insn_addresses array will not be
1779 valid. In this case, always return ".t" since most branches
1780 are taken. If optimizing, return .t for backward branches
1781 and .f for forward branches. */
1782 if (! optimize
1783 || insn_addresses[label_uid] < insn_addresses[INSN_UID (insn)])
1784 return ".t";
1785 return ".f";
1786 }
1787
1788 return "";
1789 }
1790 #endif
1791
1792 /* Print the operand represented by rtx X formatted by code CODE. */
1793
1794 void
1795 i960_print_operand (file, x, code)
1796 FILE *file;
1797 rtx x;
1798 int code;
1799 {
1800 enum rtx_code rtxcode = GET_CODE (x);
1801
1802 if (rtxcode == REG)
1803 {
1804 switch (code)
1805 {
1806 case 'D':
1807 /* Second reg of a double or quad. */
1808 fprintf (file, "%s", reg_names[REGNO (x)+1]);
1809 break;
1810
1811 case 'E':
1812 /* Third reg of a quad. */
1813 fprintf (file, "%s", reg_names[REGNO (x)+2]);
1814 break;
1815
1816 case 'F':
1817 /* Fourth reg of a quad. */
1818 fprintf (file, "%s", reg_names[REGNO (x)+3]);
1819 break;
1820
1821 case 0:
1822 fprintf (file, "%s", reg_names[REGNO (x)]);
1823 break;
1824
1825 default:
1826 abort ();
1827 }
1828 return;
1829 }
1830 else if (rtxcode == MEM)
1831 {
1832 output_address (XEXP (x, 0));
1833 return;
1834 }
1835 else if (rtxcode == CONST_INT)
1836 {
1837 HOST_WIDE_INT val = INTVAL (x);
1838 if (code == 'C')
1839 val = ~val;
1840 if (val > 9999 || val < -999)
1841 fprintf (file, "0x%x", val);
1842 else
1843 fprintf (file, "%d", val);
1844 return;
1845 }
1846 else if (rtxcode == CONST_DOUBLE)
1847 {
1848 REAL_VALUE_TYPE d;
1849 char dstr[30];
1850
1851 if (x == CONST0_RTX (GET_MODE (x)))
1852 {
1853 fprintf (file, "0f0.0");
1854 return;
1855 }
1856 else if (x == CONST1_RTX (GET_MODE (x)))
1857 {
1858 fprintf (file, "0f1.0");
1859 return;
1860 }
1861
1862 REAL_VALUE_FROM_CONST_DOUBLE (d, x);
1863 REAL_VALUE_TO_DECIMAL (d, "%#g", dstr);
1864 fprintf (file, "0f%s", dstr);
1865 return;
1866 }
1867
1868 switch(code)
1869 {
1870 case 'B':
1871 /* Branch or jump, depending on assembler. */
1872 if (TARGET_ASM_COMPAT)
1873 fputs ("j", file);
1874 else
1875 fputs ("b", file);
1876 break;
1877
1878 case 'S':
1879 /* Sign of condition. */
1880 if ((rtxcode == EQ) || (rtxcode == NE) || (rtxcode == GTU)
1881 || (rtxcode == LTU) || (rtxcode == GEU) || (rtxcode == LEU))
1882 fputs ("o", file);
1883 else if ((rtxcode == GT) || (rtxcode == LT)
1884 || (rtxcode == GE) || (rtxcode == LE))
1885 fputs ("i", file);
1886 else
1887 abort();
1888 break;
1889
1890 case 'I':
1891 /* Inverted condition. */
1892 rtxcode = reverse_condition (rtxcode);
1893 goto normal;
1894
1895 case 'X':
1896 /* Inverted condition w/ reversed operands. */
1897 rtxcode = reverse_condition (rtxcode);
1898 /* Fallthrough. */
1899
1900 case 'R':
1901 /* Reversed operand condition. */
1902 rtxcode = swap_condition (rtxcode);
1903 /* Fallthrough. */
1904
1905 case 'C':
1906 /* Normal condition. */
1907 normal:
1908 if (rtxcode == EQ) { fputs ("e", file); return; }
1909 else if (rtxcode == NE) { fputs ("ne", file); return; }
1910 else if (rtxcode == GT) { fputs ("g", file); return; }
1911 else if (rtxcode == GTU) { fputs ("g", file); return; }
1912 else if (rtxcode == LT) { fputs ("l", file); return; }
1913 else if (rtxcode == LTU) { fputs ("l", file); return; }
1914 else if (rtxcode == GE) { fputs ("ge", file); return; }
1915 else if (rtxcode == GEU) { fputs ("ge", file); return; }
1916 else if (rtxcode == LE) { fputs ("le", file); return; }
1917 else if (rtxcode == LEU) { fputs ("le", file); return; }
1918 else abort ();
1919 break;
1920
1921 case 0:
1922 output_addr_const (file, x);
1923 break;
1924
1925 default:
1926 abort ();
1927 }
1928
1929 return;
1930 }
1931 \f
1932 /* Print a memory address as an operand to reference that memory location.
1933
1934 This is exactly the same as legitimate_address_p, except that it the prints
1935 addresses instead of recognizing them. */
1936
1937 void
1938 i960_print_operand_addr (file, addr)
1939 FILE *file;
1940 register rtx addr;
1941 {
1942 rtx breg, ireg;
1943 rtx scale, offset;
1944
1945 ireg = 0;
1946 breg = 0;
1947 offset = 0;
1948 scale = const1_rtx;
1949
1950 if (GET_CODE (addr) == REG)
1951 breg = addr;
1952 else if (CONSTANT_P (addr))
1953 offset = addr;
1954 else if (GET_CODE (addr) == PLUS)
1955 {
1956 rtx op0, op1;
1957
1958 op0 = XEXP (addr, 0);
1959 op1 = XEXP (addr, 1);
1960
1961 if (GET_CODE (op0) == REG)
1962 {
1963 breg = op0;
1964 if (GET_CODE (op1) == REG)
1965 ireg = op1;
1966 else if (CONSTANT_P (op1))
1967 offset = op1;
1968 else
1969 abort ();
1970 }
1971 else if (GET_CODE (op0) == PLUS)
1972 {
1973 if (GET_CODE (XEXP (op0, 0)) == MULT)
1974 {
1975 ireg = XEXP (XEXP (op0, 0), 0);
1976 scale = XEXP (XEXP (op0, 0), 1);
1977 if (GET_CODE (XEXP (op0, 1)) == REG)
1978 {
1979 breg = XEXP (op0, 1);
1980 offset = op1;
1981 }
1982 else
1983 abort ();
1984 }
1985 else if (GET_CODE (XEXP (op0, 0)) == REG)
1986 {
1987 breg = XEXP (op0, 0);
1988 if (GET_CODE (XEXP (op0, 1)) == REG)
1989 {
1990 ireg = XEXP (op0, 1);
1991 offset = op1;
1992 }
1993 else
1994 abort ();
1995 }
1996 else
1997 abort ();
1998 }
1999 else if (GET_CODE (op0) == MULT)
2000 {
2001 ireg = XEXP (op0, 0);
2002 scale = XEXP (op0, 1);
2003 if (GET_CODE (op1) == REG)
2004 breg = op1;
2005 else if (CONSTANT_P (op1))
2006 offset = op1;
2007 else
2008 abort ();
2009 }
2010 else
2011 abort ();
2012 }
2013 else if (GET_CODE (addr) == MULT)
2014 {
2015 ireg = XEXP (addr, 0);
2016 scale = XEXP (addr, 1);
2017 }
2018 else
2019 abort ();
2020
2021 if (offset)
2022 output_addr_const (file, offset);
2023 if (breg)
2024 fprintf (file, "(%s)", reg_names[REGNO (breg)]);
2025 if (ireg)
2026 fprintf (file, "[%s*%d]", reg_names[REGNO (ireg)], INTVAL (scale));
2027 }
2028 \f
2029 /* GO_IF_LEGITIMATE_ADDRESS recognizes an RTL expression
2030 that is a valid memory address for an instruction.
2031 The MODE argument is the machine mode for the MEM expression
2032 that wants to use this address.
2033
2034 On 80960, legitimate addresses are:
2035 base ld (g0),r0
2036 disp (12 or 32 bit) ld foo,r0
2037 base + index ld (g0)[g1*1],r0
2038 base + displ ld 0xf00(g0),r0
2039 base + index*scale + displ ld 0xf00(g0)[g1*4],r0
2040 index*scale + base ld (g0)[g1*4],r0
2041 index*scale + displ ld 0xf00[g1*4],r0
2042 index*scale ld [g1*4],r0
2043 index + base + displ ld 0xf00(g0)[g1*1],r0
2044
2045 In each case, scale can be 1, 2, 4, 8, or 16. */
2046
2047 /* This is exactly the same as i960_print_operand_addr, except that
2048 it recognizes addresses instead of printing them.
2049
2050 It only recognizes address in canonical form. LEGITIMIZE_ADDRESS should
2051 convert common non-canonical forms to canonical form so that they will
2052 be recognized. */
2053
2054 /* These two macros allow us to accept either a REG or a SUBREG anyplace
2055 where a register is valid. */
2056
2057 #define RTX_OK_FOR_BASE_P(X, STRICT) \
2058 ((GET_CODE (X) == REG \
2059 && (STRICT ? REG_OK_FOR_BASE_P_STRICT (X) : REG_OK_FOR_BASE_P (X))) \
2060 || (GET_CODE (X) == SUBREG \
2061 && GET_CODE (SUBREG_REG (X)) == REG \
2062 && (STRICT ? REG_OK_FOR_BASE_P_STRICT (SUBREG_REG (X)) \
2063 : REG_OK_FOR_BASE_P (SUBREG_REG (X)))))
2064
2065 #define RTX_OK_FOR_INDEX_P(X, STRICT) \
2066 ((GET_CODE (X) == REG \
2067 && (STRICT ? REG_OK_FOR_INDEX_P_STRICT (X) : REG_OK_FOR_INDEX_P (X)))\
2068 || (GET_CODE (X) == SUBREG \
2069 && GET_CODE (SUBREG_REG (X)) == REG \
2070 && (STRICT ? REG_OK_FOR_INDEX_P_STRICT (SUBREG_REG (X)) \
2071 : REG_OK_FOR_INDEX_P (SUBREG_REG (X)))))
2072
2073 int
2074 legitimate_address_p (mode, addr, strict)
2075 enum machine_mode mode ATTRIBUTE_UNUSED;
2076 register rtx addr;
2077 int strict;
2078 {
2079 if (RTX_OK_FOR_BASE_P (addr, strict))
2080 return 1;
2081 else if (CONSTANT_P (addr))
2082 return 1;
2083 else if (GET_CODE (addr) == PLUS)
2084 {
2085 rtx op0, op1;
2086
2087 if (! TARGET_COMPLEX_ADDR && ! reload_completed)
2088 return 0;
2089
2090 op0 = XEXP (addr, 0);
2091 op1 = XEXP (addr, 1);
2092
2093 if (RTX_OK_FOR_BASE_P (op0, strict))
2094 {
2095 if (RTX_OK_FOR_INDEX_P (op1, strict))
2096 return 1;
2097 else if (CONSTANT_P (op1))
2098 return 1;
2099 else
2100 return 0;
2101 }
2102 else if (GET_CODE (op0) == PLUS)
2103 {
2104 if (GET_CODE (XEXP (op0, 0)) == MULT)
2105 {
2106 if (! (RTX_OK_FOR_INDEX_P (XEXP (XEXP (op0, 0), 0), strict)
2107 && SCALE_TERM_P (XEXP (XEXP (op0, 0), 1))))
2108 return 0;
2109
2110 if (RTX_OK_FOR_BASE_P (XEXP (op0, 1), strict)
2111 && CONSTANT_P (op1))
2112 return 1;
2113 else
2114 return 0;
2115 }
2116 else if (RTX_OK_FOR_BASE_P (XEXP (op0, 0), strict))
2117 {
2118 if (RTX_OK_FOR_INDEX_P (XEXP (op0, 1), strict)
2119 && CONSTANT_P (op1))
2120 return 1;
2121 else
2122 return 0;
2123 }
2124 else
2125 return 0;
2126 }
2127 else if (GET_CODE (op0) == MULT)
2128 {
2129 if (! (RTX_OK_FOR_INDEX_P (XEXP (op0, 0), strict)
2130 && SCALE_TERM_P (XEXP (op0, 1))))
2131 return 0;
2132
2133 if (RTX_OK_FOR_BASE_P (op1, strict))
2134 return 1;
2135 else if (CONSTANT_P (op1))
2136 return 1;
2137 else
2138 return 0;
2139 }
2140 else
2141 return 0;
2142 }
2143 else if (GET_CODE (addr) == MULT)
2144 {
2145 if (! TARGET_COMPLEX_ADDR && ! reload_completed)
2146 return 0;
2147
2148 return (RTX_OK_FOR_INDEX_P (XEXP (addr, 0), strict)
2149 && SCALE_TERM_P (XEXP (addr, 1)));
2150 }
2151 else
2152 return 0;
2153 }
2154
2155 /* Try machine-dependent ways of modifying an illegitimate address
2156 to be legitimate. If we find one, return the new, valid address.
2157 This macro is used in only one place: `memory_address' in explow.c.
2158
2159 This converts some non-canonical addresses to canonical form so they
2160 can be recognized. */
2161
2162 rtx
2163 legitimize_address (x, oldx, mode)
2164 register rtx x;
2165 register rtx oldx ATTRIBUTE_UNUSED;
2166 enum machine_mode mode ATTRIBUTE_UNUSED;
2167 {
2168 if (GET_CODE (x) == SYMBOL_REF)
2169 {
2170 abort ();
2171 x = copy_to_reg (x);
2172 }
2173
2174 if (! TARGET_COMPLEX_ADDR && ! reload_completed)
2175 return x;
2176
2177 /* Canonicalize (plus (mult (reg) (const)) (plus (reg) (const)))
2178 into (plus (plus (mult (reg) (const)) (reg)) (const)). This can be
2179 created by virtual register instantiation, register elimination, and
2180 similar optimizations. */
2181 if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 0)) == MULT
2182 && GET_CODE (XEXP (x, 1)) == PLUS)
2183 x = gen_rtx_PLUS (Pmode,
2184 gen_rtx_PLUS (Pmode, XEXP (x, 0), XEXP (XEXP (x, 1), 0)),
2185 XEXP (XEXP (x, 1), 1));
2186
2187 /* Canonicalize (plus (plus (mult (reg) (const)) (plus (reg) (const))) const)
2188 into (plus (plus (mult (reg) (const)) (reg)) (const)). */
2189 else if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 0)) == PLUS
2190 && GET_CODE (XEXP (XEXP (x, 0), 0)) == MULT
2191 && GET_CODE (XEXP (XEXP (x, 0), 1)) == PLUS
2192 && CONSTANT_P (XEXP (x, 1)))
2193 {
2194 rtx constant, other;
2195
2196 if (GET_CODE (XEXP (x, 1)) == CONST_INT)
2197 {
2198 constant = XEXP (x, 1);
2199 other = XEXP (XEXP (XEXP (x, 0), 1), 1);
2200 }
2201 else if (GET_CODE (XEXP (XEXP (XEXP (x, 0), 1), 1)) == CONST_INT)
2202 {
2203 constant = XEXP (XEXP (XEXP (x, 0), 1), 1);
2204 other = XEXP (x, 1);
2205 }
2206 else
2207 constant = 0;
2208
2209 if (constant)
2210 x = gen_rtx_PLUS (Pmode,
2211 gen_rtx_PLUS (Pmode, XEXP (XEXP (x, 0), 0),
2212 XEXP (XEXP (XEXP (x, 0), 1), 0)),
2213 plus_constant (other, INTVAL (constant)));
2214 }
2215
2216 return x;
2217 }
2218 \f
2219 #if 0
2220 /* Return the most stringent alignment that we are willing to consider
2221 objects of size SIZE and known alignment ALIGN as having. */
2222
2223 int
2224 i960_alignment (size, align)
2225 int size;
2226 int align;
2227 {
2228 int i;
2229
2230 if (! TARGET_STRICT_ALIGN)
2231 if (TARGET_IC_COMPAT2_0 || align >= 4)
2232 {
2233 i = i960_object_bytes_bitalign (size) / BITS_PER_UNIT;
2234 if (i > align)
2235 align = i;
2236 }
2237
2238 return align;
2239 }
2240 #endif
2241 \f
2242
2243 int
2244 hard_regno_mode_ok (regno, mode)
2245 int regno;
2246 enum machine_mode mode;
2247 {
2248 if (regno < 32)
2249 {
2250 switch (mode)
2251 {
2252 case CCmode: case CC_UNSmode: case CC_CHKmode:
2253 return 0;
2254
2255 case DImode: case DFmode:
2256 return (regno & 1) == 0;
2257
2258 case TImode: case XFmode:
2259 return (regno & 3) == 0;
2260
2261 default:
2262 return 1;
2263 }
2264 }
2265 else if (regno >= 32 && regno < 36)
2266 {
2267 switch (mode)
2268 {
2269 case SFmode: case DFmode: case XFmode:
2270 case SCmode: case DCmode:
2271 return 1;
2272
2273 default:
2274 return 0;
2275 }
2276 }
2277 else if (regno == 36)
2278 {
2279 switch (mode)
2280 {
2281 case CCmode: case CC_UNSmode: case CC_CHKmode:
2282 return 1;
2283
2284 default:
2285 return 0;
2286 }
2287 }
2288 else if (regno == 37)
2289 return 0;
2290
2291 abort ();
2292 }
2293
2294 \f
2295 /* Return the minimum alignment of an expression rtx X in bytes. This takes
2296 advantage of machine specific facts, such as knowing that the frame pointer
2297 is always 16 byte aligned. */
2298
2299 int
2300 i960_expr_alignment (x, size)
2301 rtx x;
2302 int size;
2303 {
2304 int align = 1;
2305
2306 if (x == 0)
2307 return 1;
2308
2309 switch (GET_CODE(x))
2310 {
2311 case CONST_INT:
2312 align = INTVAL(x);
2313
2314 if ((align & 0xf) == 0)
2315 align = 16;
2316 else if ((align & 0x7) == 0)
2317 align = 8;
2318 else if ((align & 0x3) == 0)
2319 align = 4;
2320 else if ((align & 0x1) == 0)
2321 align = 2;
2322 else
2323 align = 1;
2324 break;
2325
2326 case PLUS:
2327 align = MIN (i960_expr_alignment (XEXP (x, 0), size),
2328 i960_expr_alignment (XEXP (x, 1), size));
2329 break;
2330
2331 case SYMBOL_REF:
2332 /* If this is a valid program, objects are guaranteed to be
2333 correctly aligned for whatever size the reference actually is. */
2334 align = i960_object_bytes_bitalign (size) / BITS_PER_UNIT;
2335 break;
2336
2337 case REG:
2338 if (REGNO (x) == FRAME_POINTER_REGNUM)
2339 align = 16;
2340 break;
2341
2342 case ASHIFT:
2343 align = i960_expr_alignment (XEXP (x, 0), size);
2344
2345 if (GET_CODE (XEXP (x, 1)) == CONST_INT)
2346 {
2347 align = align << INTVAL (XEXP (x, 1));
2348 align = MIN (align, 16);
2349 }
2350 break;
2351
2352 case MULT:
2353 align = (i960_expr_alignment (XEXP (x, 0), size) *
2354 i960_expr_alignment (XEXP (x, 1), size));
2355
2356 align = MIN (align, 16);
2357 break;
2358 default:
2359 break;
2360 }
2361
2362 return align;
2363 }
2364
2365 /* Return true if it is possible to reference both BASE and OFFSET, which
2366 have alignment at least as great as 4 byte, as if they had alignment valid
2367 for an object of size SIZE. */
2368
2369 int
2370 i960_improve_align (base, offset, size)
2371 rtx base;
2372 rtx offset;
2373 int size;
2374 {
2375 int i, j;
2376
2377 /* We have at least a word reference to the object, so we know it has to
2378 be aligned at least to 4 bytes. */
2379
2380 i = MIN (i960_expr_alignment (base, 4),
2381 i960_expr_alignment (offset, 4));
2382
2383 i = MAX (i, 4);
2384
2385 /* We know the size of the request. If strict align is not enabled, we
2386 can guess that the alignment is OK for the requested size. */
2387
2388 if (! TARGET_STRICT_ALIGN)
2389 if ((j = (i960_object_bytes_bitalign (size) / BITS_PER_UNIT)) > i)
2390 i = j;
2391
2392 return (i >= size);
2393 }
2394
2395 /* Return true if it is possible to access BASE and OFFSET, which have 4 byte
2396 (SImode) alignment as if they had 16 byte (TImode) alignment. */
2397
2398 int
2399 i960_si_ti (base, offset)
2400 rtx base;
2401 rtx offset;
2402 {
2403 return i960_improve_align (base, offset, 16);
2404 }
2405
2406 /* Return true if it is possible to access BASE and OFFSET, which have 4 byte
2407 (SImode) alignment as if they had 8 byte (DImode) alignment. */
2408
2409 int
2410 i960_si_di (base, offset)
2411 rtx base;
2412 rtx offset;
2413 {
2414 return i960_improve_align (base, offset, 8);
2415 }
2416 \f
2417 /* Return raw values of size and alignment (in words) for the data
2418 type being accessed. These values will be rounded by the caller. */
2419
2420 static void
2421 i960_arg_size_and_align (mode, type, size_out, align_out)
2422 enum machine_mode mode;
2423 tree type;
2424 int *size_out;
2425 int *align_out;
2426 {
2427 int size, align;
2428
2429 /* Use formal alignment requirements of type being passed, except make
2430 it at least a word. If we don't have a type, this is a library call,
2431 and the parm has to be of scalar type. In this case, consider its
2432 formal alignment requirement to be its size in words. */
2433
2434 if (mode == BLKmode)
2435 size = (int_size_in_bytes (type) + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
2436 else if (mode == VOIDmode)
2437 {
2438 /* End of parm list. */
2439 if (type == 0 || TYPE_MODE (type) != VOIDmode)
2440 abort ();
2441 size = 1;
2442 }
2443 else
2444 size = (GET_MODE_SIZE (mode) + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
2445
2446 if (type == 0)
2447 {
2448 /* ??? This is a hack to properly correct the alignment of XFmode
2449 values without affecting anything else. */
2450 if (size == 3)
2451 align = 4;
2452 else
2453 align = size;
2454 }
2455 else if (TYPE_ALIGN (type) >= BITS_PER_WORD)
2456 align = TYPE_ALIGN (type) / BITS_PER_WORD;
2457 else
2458 align = 1;
2459
2460 *size_out = size;
2461 *align_out = align;
2462 }
2463
2464 /* On the 80960 the first 12 args are in registers and the rest are pushed.
2465 Any arg that is bigger than 4 words is placed on the stack and all
2466 subsequent arguments are placed on the stack.
2467
2468 Additionally, parameters with an alignment requirement stronger than
2469 a word must be aligned appropriately. Note that this means that a
2470 64 bit object with a 32 bit alignment is not 64 bit aligned and may be
2471 passed in an odd/even register pair. */
2472
2473 /* Update CUM to advance past an argument described by MODE and TYPE. */
2474
2475 void
2476 i960_function_arg_advance (cum, mode, type, named)
2477 CUMULATIVE_ARGS *cum;
2478 enum machine_mode mode;
2479 tree type;
2480 int named ATTRIBUTE_UNUSED;
2481 {
2482 int size, align;
2483
2484 i960_arg_size_and_align (mode, type, &size, &align);
2485
2486 if (size > 4 || cum->ca_nstackparms != 0
2487 || (size + ROUND_PARM (cum->ca_nregparms, align)) > NPARM_REGS
2488 || MUST_PASS_IN_STACK (mode, type))
2489 {
2490 /* Indicate that all the registers are in use, even if all are not,
2491 so va_start will compute the right value. */
2492 cum->ca_nregparms = NPARM_REGS;
2493 cum->ca_nstackparms = ROUND_PARM (cum->ca_nstackparms, align) + size;
2494 }
2495 else
2496 cum->ca_nregparms = ROUND_PARM (cum->ca_nregparms, align) + size;
2497 }
2498
2499 /* Return the register that the argument described by MODE and TYPE is
2500 passed in, or else return 0 if it is passed on the stack. */
2501
2502 rtx
2503 i960_function_arg (cum, mode, type, named)
2504 CUMULATIVE_ARGS *cum;
2505 enum machine_mode mode;
2506 tree type;
2507 int named ATTRIBUTE_UNUSED;
2508 {
2509 rtx ret;
2510 int size, align;
2511
2512 i960_arg_size_and_align (mode, type, &size, &align);
2513
2514 if (size > 4 || cum->ca_nstackparms != 0
2515 || (size + ROUND_PARM (cum->ca_nregparms, align)) > NPARM_REGS
2516 || MUST_PASS_IN_STACK (mode, type))
2517 {
2518 cum->ca_nstackparms = ROUND_PARM (cum->ca_nstackparms, align);
2519 ret = 0;
2520 }
2521 else
2522 {
2523 cum->ca_nregparms = ROUND_PARM (cum->ca_nregparms, align);
2524 ret = gen_rtx_REG (mode, cum->ca_nregparms);
2525 }
2526
2527 return ret;
2528 }
2529 \f
2530 /* Floating-point support. */
2531
2532 void
2533 i960_output_long_double (file, value)
2534 FILE *file;
2535 REAL_VALUE_TYPE value;
2536 {
2537 long value_long[3];
2538 char dstr[30];
2539
2540 REAL_VALUE_TO_TARGET_LONG_DOUBLE (value, value_long);
2541 REAL_VALUE_TO_DECIMAL (value, "%.20g", dstr);
2542
2543 fprintf (file,
2544 "\t.word\t0x%08lx\t\t# %s\n\t.word\t0x%08lx\n\t.word\t0x%08lx\n",
2545 value_long[0], dstr, value_long[1], value_long[2]);
2546 fprintf (file, "\t.word\t0x0\n");
2547 }
2548
2549 void
2550 i960_output_double (file, value)
2551 FILE *file;
2552 REAL_VALUE_TYPE value;
2553 {
2554 long value_long[2];
2555 char dstr[30];
2556
2557 REAL_VALUE_TO_TARGET_DOUBLE (value, value_long);
2558 REAL_VALUE_TO_DECIMAL (value, "%.20g", dstr);
2559
2560 fprintf (file, "\t.word\t0x%08lx\t\t# %s\n\t.word\t0x%08lx\n",
2561 value_long[0], dstr, value_long[1]);
2562 }
2563
2564 void
2565 i960_output_float (file, value)
2566 FILE *file;
2567 REAL_VALUE_TYPE value;
2568 {
2569 long value_long;
2570 char dstr[30];
2571
2572 REAL_VALUE_TO_TARGET_SINGLE (value, value_long);
2573 REAL_VALUE_TO_DECIMAL (value, "%.12g", dstr);
2574
2575 fprintf (file, "\t.word\t0x%08lx\t\t# %s (float)\n", value_long, dstr);
2576 }
2577 \f
2578 /* Return the number of bits that an object of size N bytes is aligned to. */
2579
2580 int
2581 i960_object_bytes_bitalign (n)
2582 int n;
2583 {
2584 if (n > 8) n = 128;
2585 else if (n > 4) n = 64;
2586 else if (n > 2) n = 32;
2587 else if (n > 1) n = 16;
2588 else n = 8;
2589
2590 return n;
2591 }
2592
2593 /* Compute the alignment for an aggregate type TSIZE.
2594 Alignment is MAX (greatest member alignment,
2595 MIN (pragma align, structure size alignment)). */
2596
2597 int
2598 i960_round_align (align, tsize)
2599 int align;
2600 tree tsize;
2601 {
2602 int new_align;
2603
2604 if (TREE_CODE (tsize) != INTEGER_CST)
2605 return align;
2606
2607 new_align = i960_object_bytes_bitalign (TREE_INT_CST_LOW (tsize)
2608 / BITS_PER_UNIT);
2609 /* Handle #pragma align. */
2610 if (new_align > i960_maxbitalignment)
2611 new_align = i960_maxbitalignment;
2612
2613 if (align < new_align)
2614 align = new_align;
2615
2616 return align;
2617 }
2618 \f
2619 /* Do any needed setup for a varargs function. For the i960, we must
2620 create a register parameter block if one doesn't exist, and then copy
2621 all register parameters to memory. */
2622
2623 void
2624 i960_setup_incoming_varargs (cum, mode, type, pretend_size, no_rtl)
2625 CUMULATIVE_ARGS *cum;
2626 enum machine_mode mode ATTRIBUTE_UNUSED;
2627 tree type ATTRIBUTE_UNUSED;
2628 int *pretend_size ATTRIBUTE_UNUSED;
2629 int no_rtl;
2630 {
2631 /* Note: for a varargs fn with only a va_alist argument, this is 0. */
2632 int first_reg = cum->ca_nregparms;
2633
2634 /* Copy only unnamed register arguments to memory. If there are
2635 any stack parms, there are no unnamed arguments in registers, and
2636 an argument block was already allocated by the caller.
2637 Remember that any arg bigger than 4 words is passed on the stack as
2638 are all subsequent args.
2639
2640 If there are no stack arguments but there are exactly NPARM_REGS
2641 registers, either there were no extra arguments or the caller
2642 allocated an argument block. */
2643
2644 if (cum->ca_nstackparms == 0 && first_reg < NPARM_REGS && !no_rtl)
2645 {
2646 rtx label = gen_label_rtx ();
2647 rtx regblock;
2648
2649 /* If arg_pointer_rtx == 0, no arguments were passed on the stack
2650 and we need to allocate a chunk to save the registers (if any
2651 arguments were passed on the stack the caller would allocate the
2652 48 bytes as well). We must allocate all 48 bytes (12*4) because
2653 va_start assumes it. */
2654 emit_insn (gen_cmpsi (arg_pointer_rtx, const0_rtx));
2655 emit_jump_insn (gen_bne (label));
2656 emit_insn (gen_rtx_SET (VOIDmode, arg_pointer_rtx,
2657 stack_pointer_rtx));
2658 emit_insn (gen_rtx_SET (VOIDmode, stack_pointer_rtx,
2659 memory_address (SImode,
2660 plus_constant (stack_pointer_rtx,
2661 48))));
2662 emit_label (label);
2663
2664 /* ??? Note that we unnecessarily store one extra register for stdarg
2665 fns. We could optimize this, but it's kept as for now. */
2666 regblock = gen_rtx_MEM (BLKmode,
2667 plus_constant (arg_pointer_rtx,
2668 first_reg * 4));
2669 MEM_ALIAS_SET (regblock) = get_varargs_alias_set ();
2670 move_block_from_reg (first_reg, regblock,
2671 NPARM_REGS - first_reg,
2672 (NPARM_REGS - first_reg) * UNITS_PER_WORD);
2673 }
2674 }
2675
2676 /* Define the `__builtin_va_list' type for the ABI. */
2677
2678 tree
2679 i960_build_va_list ()
2680 {
2681 return build_array_type (unsigned_type_node,
2682 build_index_type (size_one_node));
2683 }
2684
2685 /* Implement `va_start' for varargs and stdarg. */
2686
2687 void
2688 i960_va_start (stdarg_p, valist, nextarg)
2689 int stdarg_p ATTRIBUTE_UNUSED;
2690 tree valist;
2691 rtx nextarg ATTRIBUTE_UNUSED;
2692 {
2693 tree s, t, base, num;
2694
2695 /* The array type always decays to a pointer before we get here, so we
2696 can't use ARRAY_REF. */
2697 base = build1 (INDIRECT_REF, unsigned_type_node, valist);
2698 num = build1 (INDIRECT_REF, unsigned_type_node,
2699 build (PLUS_EXPR, unsigned_type_node, valist,
2700 TYPE_SIZE_UNIT (TREE_TYPE (valist))));
2701
2702 s = make_tree (unsigned_type_node, arg_pointer_rtx);
2703 t = build (MODIFY_EXPR, unsigned_type_node, base, s);
2704 TREE_SIDE_EFFECTS (t) = 1;
2705 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
2706
2707 s = build_int_2 ((current_function_args_info.ca_nregparms
2708 + current_function_args_info.ca_nstackparms) * 4, 0);
2709 t = build (MODIFY_EXPR, unsigned_type_node, num, s);
2710 TREE_SIDE_EFFECTS (t) = 1;
2711 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
2712 }
2713
2714 /* Implement `va_arg'. */
2715
2716 rtx
2717 i960_va_arg (valist, type)
2718 tree valist, type;
2719 {
2720 HOST_WIDE_INT siz, ali;
2721 tree base, num, pad, next, this, t1, t2, int48;
2722 rtx addr_rtx;
2723
2724 /* The array type always decays to a pointer before we get here, so we
2725 can't use ARRAY_REF. */
2726 base = build1 (INDIRECT_REF, unsigned_type_node, valist);
2727 num = build1 (INDIRECT_REF, unsigned_type_node,
2728 build (PLUS_EXPR, unsigned_type_node, valist,
2729 TYPE_SIZE_UNIT (TREE_TYPE (valist))));
2730
2731 /* Round up sizeof(type) to a word. */
2732 siz = (int_size_in_bytes (type) + UNITS_PER_WORD - 1) & -UNITS_PER_WORD;
2733
2734 /* Round up alignment to a word. */
2735 ali = TYPE_ALIGN (type);
2736 if (ali < BITS_PER_WORD)
2737 ali = BITS_PER_WORD;
2738 ali /= BITS_PER_UNIT;
2739
2740 /* Align NUM appropriate for the argument. */
2741 pad = fold (build (PLUS_EXPR, unsigned_type_node, num,
2742 build_int_2 (ali - 1, 0)));
2743 pad = fold (build (BIT_AND_EXPR, unsigned_type_node, pad,
2744 build_int_2 (-ali, -1)));
2745 pad = save_expr (pad);
2746
2747 /* Increment VPAD past this argument. */
2748 next = fold (build (PLUS_EXPR, unsigned_type_node, pad,
2749 build_int_2 (siz, 0)));
2750 next = save_expr (next);
2751
2752 /* Find the offset for the current argument. Mind peculiar overflow
2753 from registers to stack. */
2754 int48 = build_int_2 (48, 0);
2755 if (siz > 16)
2756 t2 = integer_one_node;
2757 else
2758 t2 = fold (build (GT_EXPR, integer_type_node, next, int48));
2759 t1 = fold (build (LE_EXPR, integer_type_node, num, int48));
2760 t1 = fold (build (TRUTH_AND_EXPR, integer_type_node, t1, t2));
2761 this = fold (build (COND_EXPR, unsigned_type_node, t1, int48, pad));
2762
2763 /* Find the address for the current argument. */
2764 t1 = fold (build (PLUS_EXPR, unsigned_type_node, base, this));
2765 t1 = build1 (NOP_EXPR, ptr_type_node, t1);
2766 addr_rtx = expand_expr (t1, NULL_RTX, Pmode, EXPAND_NORMAL);
2767
2768 /* Increment NUM. */
2769 t1 = build (MODIFY_EXPR, unsigned_type_node, num, next);
2770 TREE_SIDE_EFFECTS (t1) = 1;
2771 expand_expr (t1, const0_rtx, VOIDmode, EXPAND_NORMAL);
2772
2773 return addr_rtx;
2774 }
2775
2776 /* Calculate the final size of the reg parm stack space for the current
2777 function, based on how many bytes would be allocated on the stack. */
2778
2779 int
2780 i960_final_reg_parm_stack_space (const_size, var_size)
2781 int const_size;
2782 tree var_size;
2783 {
2784 if (var_size || const_size > 48)
2785 return 48;
2786 else
2787 return 0;
2788 }
2789
2790 /* Calculate the size of the reg parm stack space. This is a bit complicated
2791 on the i960. */
2792
2793 int
2794 i960_reg_parm_stack_space (fndecl)
2795 tree fndecl;
2796 {
2797 /* In this case, we are called from emit_library_call, and we don't need
2798 to pretend we have more space for parameters than what's apparent. */
2799 if (fndecl == 0)
2800 return 0;
2801
2802 /* In this case, we are called from locate_and_pad_parms when we're
2803 not IN_REGS, so we have an arg block. */
2804 if (fndecl != current_function_decl)
2805 return 48;
2806
2807 /* Otherwise, we have an arg block if the current function has more than
2808 48 bytes of parameters. */
2809 if (current_function_args_size != 0 || VARARGS_STDARG_FUNCTION (fndecl))
2810 return 48;
2811 else
2812 return 0;
2813 }
2814 \f
2815 /* Return the register class of a scratch register needed to copy IN into
2816 or out of a register in CLASS in MODE. If it can be done directly,
2817 NO_REGS is returned. */
2818
2819 enum reg_class
2820 secondary_reload_class (class, mode, in)
2821 enum reg_class class;
2822 enum machine_mode mode;
2823 rtx in;
2824 {
2825 int regno = -1;
2826
2827 if (GET_CODE (in) == REG || GET_CODE (in) == SUBREG)
2828 regno = true_regnum (in);
2829
2830 /* We can place anything into LOCAL_OR_GLOBAL_REGS and can put
2831 LOCAL_OR_GLOBAL_REGS into anything. */
2832 if (class == LOCAL_OR_GLOBAL_REGS || class == LOCAL_REGS
2833 || class == GLOBAL_REGS || (regno >= 0 && regno < 32))
2834 return NO_REGS;
2835
2836 /* We can place any hard register, 0.0, and 1.0 into FP_REGS. */
2837 if (class == FP_REGS
2838 && ((regno >= 0 && regno < FIRST_PSEUDO_REGISTER)
2839 || in == CONST0_RTX (mode) || in == CONST1_RTX (mode)))
2840 return NO_REGS;
2841
2842 return LOCAL_OR_GLOBAL_REGS;
2843 }
2844 \f
2845 /* Look at the opcode P, and set i96_last_insn_type to indicate which
2846 function unit it executed on. */
2847
2848 /* ??? This would make more sense as an attribute. */
2849
2850 void
2851 i960_scan_opcode (p)
2852 const char *p;
2853 {
2854 switch (*p)
2855 {
2856 case 'a':
2857 case 'd':
2858 case 'e':
2859 case 'm':
2860 case 'n':
2861 case 'o':
2862 case 'r':
2863 /* Ret is not actually of type REG, but it won't matter, because no
2864 insn will ever follow it. */
2865 case 'u':
2866 case 'x':
2867 i960_last_insn_type = I_TYPE_REG;
2868 break;
2869
2870 case 'b':
2871 if (p[1] == 'x' || p[3] == 'x')
2872 i960_last_insn_type = I_TYPE_MEM;
2873 i960_last_insn_type = I_TYPE_CTRL;
2874 break;
2875
2876 case 'f':
2877 case 't':
2878 i960_last_insn_type = I_TYPE_CTRL;
2879 break;
2880
2881 case 'c':
2882 if (p[1] == 'a')
2883 {
2884 if (p[4] == 'x')
2885 i960_last_insn_type = I_TYPE_MEM;
2886 else
2887 i960_last_insn_type = I_TYPE_CTRL;
2888 }
2889 else if (p[1] == 'm')
2890 {
2891 if (p[3] == 'd')
2892 i960_last_insn_type = I_TYPE_REG;
2893 else if (p[4] == 'b' || p[4] == 'j')
2894 i960_last_insn_type = I_TYPE_CTRL;
2895 else
2896 i960_last_insn_type = I_TYPE_REG;
2897 }
2898 else
2899 i960_last_insn_type = I_TYPE_REG;
2900 break;
2901
2902 case 'l':
2903 i960_last_insn_type = I_TYPE_MEM;
2904 break;
2905
2906 case 's':
2907 if (p[1] == 't')
2908 i960_last_insn_type = I_TYPE_MEM;
2909 else
2910 i960_last_insn_type = I_TYPE_REG;
2911 break;
2912 }
2913 }
This page took 0.31134 seconds and 4 git commands to generate.