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