1 /* Subroutines for insn-output.c for NEC V850 series
2 Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
3 Free Software Foundation, Inc.
4 Contributed by Jeff Law (law@cygnus.com).
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it
9 under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2, or (at your option)
13 GCC is distributed in the hope that it will be useful, but WITHOUT
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING. If not, write to the Free
20 Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
25 #include "coretypes.h"
30 #include "hard-reg-set.h"
32 #include "insn-config.h"
33 #include "conditions.h"
35 #include "insn-attr.h"
42 #include "integrate.h"
45 #include "target-def.h"
48 #define streq(a,b) (strcmp (a, b) == 0)
51 /* Function prototypes for stupid compilers: */
52 static bool v850_handle_option (size_t, const char *, int);
53 static void const_double_split (rtx
, HOST_WIDE_INT
*, HOST_WIDE_INT
*);
54 static int const_costs_int (HOST_WIDE_INT
, int);
55 static int const_costs (rtx
, enum rtx_code
);
56 static bool v850_rtx_costs (rtx
, int, int, int *);
57 static void substitute_ep_register (rtx
, rtx
, int, int, rtx
*, rtx
*);
58 static void v850_reorg (void);
59 static int ep_memory_offset (enum machine_mode
, int);
60 static void v850_set_data_area (tree
, v850_data_area
);
61 const struct attribute_spec v850_attribute_table
[];
62 static tree
v850_handle_interrupt_attribute (tree
*, tree
, tree
, int, bool *);
63 static tree
v850_handle_data_area_attribute (tree
*, tree
, tree
, int, bool *);
64 static void v850_insert_attributes (tree
, tree
*);
65 static void v850_select_section (tree
, int, unsigned HOST_WIDE_INT
);
66 static void v850_encode_data_area (tree
, rtx
);
67 static void v850_encode_section_info (tree
, rtx
, int);
68 static bool v850_return_in_memory (tree
, tree
);
69 static void v850_setup_incoming_varargs (CUMULATIVE_ARGS
*, enum machine_mode
,
71 static bool v850_pass_by_reference (CUMULATIVE_ARGS
*, enum machine_mode
,
73 static int v850_arg_partial_bytes (CUMULATIVE_ARGS
*, enum machine_mode
,
76 /* Information about the various small memory areas. */
77 struct small_memory_info small_memory
[ (int)SMALL_MEMORY_max
] =
79 /* name max physical max */
85 /* Names of the various data areas used on the v850. */
86 tree GHS_default_section_names
[(int) COUNT_OF_GHS_SECTION_KINDS
];
87 tree GHS_current_section_names
[(int) COUNT_OF_GHS_SECTION_KINDS
];
89 /* Track the current data area set by the data area pragma (which
90 can be nested). Tested by check_default_data_area. */
91 data_area_stack_element
* data_area_stack
= NULL
;
93 /* True if we don't need to check any more if the current
94 function is an interrupt handler. */
95 static int v850_interrupt_cache_p
= FALSE
;
97 /* Whether current function is an interrupt handler. */
98 static int v850_interrupt_p
= FALSE
;
100 /* Initialize the GCC target structure. */
101 #undef TARGET_ASM_ALIGNED_HI_OP
102 #define TARGET_ASM_ALIGNED_HI_OP "\t.hword\t"
104 #undef TARGET_ATTRIBUTE_TABLE
105 #define TARGET_ATTRIBUTE_TABLE v850_attribute_table
107 #undef TARGET_INSERT_ATTRIBUTES
108 #define TARGET_INSERT_ATTRIBUTES v850_insert_attributes
110 #undef TARGET_ASM_SELECT_SECTION
111 #define TARGET_ASM_SELECT_SECTION v850_select_section
113 #undef TARGET_ENCODE_SECTION_INFO
114 #define TARGET_ENCODE_SECTION_INFO v850_encode_section_info
116 #undef TARGET_ASM_FILE_START_FILE_DIRECTIVE
117 #define TARGET_ASM_FILE_START_FILE_DIRECTIVE true
119 #undef TARGET_DEFAULT_TARGET_FLAGS
120 #define TARGET_DEFAULT_TARGET_FLAGS (MASK_DEFAULT | MASK_APP_REGS)
121 #undef TARGET_HANDLE_OPTION
122 #define TARGET_HANDLE_OPTION v850_handle_option
124 #undef TARGET_RTX_COSTS
125 #define TARGET_RTX_COSTS v850_rtx_costs
127 #undef TARGET_ADDRESS_COST
128 #define TARGET_ADDRESS_COST hook_int_rtx_0
130 #undef TARGET_MACHINE_DEPENDENT_REORG
131 #define TARGET_MACHINE_DEPENDENT_REORG v850_reorg
133 #undef TARGET_PROMOTE_PROTOTYPES
134 #define TARGET_PROMOTE_PROTOTYPES hook_bool_tree_true
136 #undef TARGET_RETURN_IN_MEMORY
137 #define TARGET_RETURN_IN_MEMORY v850_return_in_memory
139 #undef TARGET_PASS_BY_REFERENCE
140 #define TARGET_PASS_BY_REFERENCE v850_pass_by_reference
142 #undef TARGET_CALLEE_COPIES
143 #define TARGET_CALLEE_COPIES hook_bool_CUMULATIVE_ARGS_mode_tree_bool_true
145 #undef TARGET_SETUP_INCOMING_VARARGS
146 #define TARGET_SETUP_INCOMING_VARARGS v850_setup_incoming_varargs
148 #undef TARGET_ARG_PARTIAL_BYTES
149 #define TARGET_ARG_PARTIAL_BYTES v850_arg_partial_bytes
151 struct gcc_target targetm
= TARGET_INITIALIZER
;
153 /* Set the maximum size of small memory area TYPE to the value given
154 by VALUE. Return true if VALUE was syntactically correct. VALUE
155 starts with the argument separator: either "-" or "=". */
158 v850_handle_memory_option (enum small_memory_type type
, const char *value
)
162 if (*value
!= '-' && *value
!= '=')
166 for (i
= 0; value
[i
]; i
++)
167 if (!ISDIGIT (value
[i
]))
171 if (size
> small_memory
[type
].physical_max
)
172 error ("value passed to %<-m%s%> is too large", small_memory
[type
].name
);
174 small_memory
[type
].max
= size
;
178 /* Implement TARGET_HANDLE_OPTION. */
181 v850_handle_option (size_t code
, const char *arg
, int value ATTRIBUTE_UNUSED
)
186 target_flags
|= MASK_EP
| MASK_PROLOG_FUNCTION
;
190 target_flags
&= ~(MASK_CPU
^ MASK_V850
);
195 target_flags
&= ~(MASK_CPU
^ MASK_V850E
);
199 return v850_handle_memory_option (SMALL_MEMORY_TDA
, arg
);
202 return v850_handle_memory_option (SMALL_MEMORY_SDA
, arg
);
205 return v850_handle_memory_option (SMALL_MEMORY_ZDA
, arg
);
213 v850_pass_by_reference (CUMULATIVE_ARGS
*cum ATTRIBUTE_UNUSED
,
214 enum machine_mode mode
, tree type
,
215 bool named ATTRIBUTE_UNUSED
)
217 unsigned HOST_WIDE_INT size
;
220 size
= int_size_in_bytes (type
);
222 size
= GET_MODE_SIZE (mode
);
227 /* Return an RTX to represent where a value with mode MODE will be returned
228 from a function. If the result is 0, the argument is pushed. */
231 function_arg (CUMULATIVE_ARGS
* cum
,
232 enum machine_mode mode
,
239 if (TARGET_GHS
&& !named
)
243 size
= int_size_in_bytes (type
);
245 size
= GET_MODE_SIZE (mode
);
251 align
= TYPE_ALIGN (type
) / BITS_PER_UNIT
;
255 cum
->nbytes
= (cum
->nbytes
+ align
- 1) &~(align
- 1);
257 if (cum
->nbytes
> 4 * UNITS_PER_WORD
)
260 if (type
== NULL_TREE
261 && cum
->nbytes
+ size
> 4 * UNITS_PER_WORD
)
264 switch (cum
->nbytes
/ UNITS_PER_WORD
)
267 result
= gen_rtx_REG (mode
, 6);
270 result
= gen_rtx_REG (mode
, 7);
273 result
= gen_rtx_REG (mode
, 8);
276 result
= gen_rtx_REG (mode
, 9);
286 /* Return the number of bytes which must be put into registers
287 for values which are part in registers and part in memory. */
290 v850_arg_partial_bytes (CUMULATIVE_ARGS
* cum
, enum machine_mode mode
,
291 tree type
, bool named
)
295 if (TARGET_GHS
&& !named
)
299 size
= int_size_in_bytes (type
);
301 size
= GET_MODE_SIZE (mode
);
304 align
= TYPE_ALIGN (type
) / BITS_PER_UNIT
;
308 cum
->nbytes
= (cum
->nbytes
+ align
- 1) &~(align
- 1);
310 if (cum
->nbytes
> 4 * UNITS_PER_WORD
)
313 if (cum
->nbytes
+ size
<= 4 * UNITS_PER_WORD
)
316 if (type
== NULL_TREE
317 && cum
->nbytes
+ size
> 4 * UNITS_PER_WORD
)
320 return 4 * UNITS_PER_WORD
- cum
->nbytes
;
324 /* Return the high and low words of a CONST_DOUBLE */
327 const_double_split (rtx x
, HOST_WIDE_INT
* p_high
, HOST_WIDE_INT
* p_low
)
329 if (GET_CODE (x
) == CONST_DOUBLE
)
334 switch (GET_MODE (x
))
337 REAL_VALUE_FROM_CONST_DOUBLE (rv
, x
);
338 REAL_VALUE_TO_TARGET_DOUBLE (rv
, t
);
339 *p_high
= t
[1]; /* since v850 is little endian */
340 *p_low
= t
[0]; /* high is second word */
344 REAL_VALUE_FROM_CONST_DOUBLE (rv
, x
);
345 REAL_VALUE_TO_TARGET_SINGLE (rv
, *p_high
);
351 *p_high
= CONST_DOUBLE_HIGH (x
);
352 *p_low
= CONST_DOUBLE_LOW (x
);
360 fatal_insn ("const_double_split got a bad insn:", x
);
364 /* Return the cost of the rtx R with code CODE. */
367 const_costs_int (HOST_WIDE_INT value
, int zero_cost
)
369 if (CONST_OK_FOR_I (value
))
371 else if (CONST_OK_FOR_J (value
))
373 else if (CONST_OK_FOR_K (value
))
380 const_costs (rtx r
, enum rtx_code c
)
382 HOST_WIDE_INT high
, low
;
387 return const_costs_int (INTVAL (r
), 0);
390 const_double_split (r
, &high
, &low
);
391 if (GET_MODE (r
) == SFmode
)
392 return const_costs_int (high
, 1);
394 return const_costs_int (high
, 1) + const_costs_int (low
, 1);
410 v850_rtx_costs (rtx x
,
412 int outer_code ATTRIBUTE_UNUSED
,
422 *total
= COSTS_N_INSNS (const_costs (x
, code
));
429 if (TARGET_V850E
&& optimize_size
)
437 && ( GET_MODE (x
) == SImode
438 || GET_MODE (x
) == HImode
439 || GET_MODE (x
) == QImode
))
441 if (GET_CODE (XEXP (x
, 1)) == REG
)
443 else if (GET_CODE (XEXP (x
, 1)) == CONST_INT
)
445 if (CONST_OK_FOR_O (INTVAL (XEXP (x
, 1))))
447 else if (CONST_OK_FOR_K (INTVAL (XEXP (x
, 1))))
460 /* Print operand X using operand code CODE to assembly language output file
464 print_operand (FILE * file
, rtx x
, int code
)
466 HOST_WIDE_INT high
, low
;
471 /* We use 'c' operands with symbols for .vtinherit */
472 if (GET_CODE (x
) == SYMBOL_REF
)
474 output_addr_const(file
, x
);
481 switch ((code
== 'B' || code
== 'C')
482 ? reverse_condition (GET_CODE (x
)) : GET_CODE (x
))
485 if (code
== 'c' || code
== 'C')
486 fprintf (file
, "nz");
488 fprintf (file
, "ne");
491 if (code
== 'c' || code
== 'C')
497 fprintf (file
, "ge");
500 fprintf (file
, "gt");
503 fprintf (file
, "le");
506 fprintf (file
, "lt");
509 fprintf (file
, "nl");
515 fprintf (file
, "nh");
524 case 'F': /* high word of CONST_DOUBLE */
525 switch (GET_CODE (x
))
528 fprintf (file
, "%d", (INTVAL (x
) >= 0) ? 0 : -1);
532 const_double_split (x
, &high
, &low
);
533 fprintf (file
, "%ld", (long) high
);
540 case 'G': /* low word of CONST_DOUBLE */
541 switch (GET_CODE (x
))
544 fprintf (file
, "%ld", (long) INTVAL (x
));
548 const_double_split (x
, &high
, &low
);
549 fprintf (file
, "%ld", (long) low
);
557 fprintf (file
, "%d\n", (int)(INTVAL (x
) & 0xffff));
560 fprintf (file
, "%d", exact_log2 (INTVAL (x
)));
563 gcc_assert (special_symbolref_operand (x
, VOIDmode
));
565 if (GET_CODE (x
) == CONST
)
566 x
= XEXP (XEXP (x
, 0), 0);
568 gcc_assert (GET_CODE (x
) == SYMBOL_REF
);
570 if (SYMBOL_REF_ZDA_P (x
))
571 fprintf (file
, "zdaoff");
572 else if (SYMBOL_REF_SDA_P (x
))
573 fprintf (file
, "sdaoff");
574 else if (SYMBOL_REF_TDA_P (x
))
575 fprintf (file
, "tdaoff");
580 gcc_assert (special_symbolref_operand (x
, VOIDmode
));
581 output_addr_const (file
, x
);
584 gcc_assert (special_symbolref_operand (x
, VOIDmode
));
586 if (GET_CODE (x
) == CONST
)
587 x
= XEXP (XEXP (x
, 0), 0);
589 gcc_assert (GET_CODE (x
) == SYMBOL_REF
);
591 if (SYMBOL_REF_ZDA_P (x
))
592 fprintf (file
, "r0");
593 else if (SYMBOL_REF_SDA_P (x
))
594 fprintf (file
, "gp");
595 else if (SYMBOL_REF_TDA_P (x
))
596 fprintf (file
, "ep");
600 case 'R': /* 2nd word of a double. */
601 switch (GET_CODE (x
))
604 fprintf (file
, reg_names
[REGNO (x
) + 1]);
607 x
= XEXP (adjust_address (x
, SImode
, 4), 0);
608 print_operand_address (file
, x
);
609 if (GET_CODE (x
) == CONST_INT
)
610 fprintf (file
, "[r0]");
619 /* If it's a reference to a TDA variable, use sst/sld vs. st/ld. */
620 if (GET_CODE (x
) == MEM
&& ep_memory_operand (x
, GET_MODE (x
), FALSE
))
627 /* Like an 'S' operand above, but for unsigned loads only. */
628 if (GET_CODE (x
) == MEM
&& ep_memory_operand (x
, GET_MODE (x
), TRUE
))
633 case 'W': /* print the instruction suffix */
634 switch (GET_MODE (x
))
639 case QImode
: fputs (".b", file
); break;
640 case HImode
: fputs (".h", file
); break;
641 case SImode
: fputs (".w", file
); break;
642 case SFmode
: fputs (".w", file
); break;
645 case '.': /* register r0 */
646 fputs (reg_names
[0], file
);
648 case 'z': /* reg or zero */
649 if (GET_CODE (x
) == REG
)
650 fputs (reg_names
[REGNO (x
)], file
);
653 gcc_assert (x
== const0_rtx
);
654 fputs (reg_names
[0], file
);
658 switch (GET_CODE (x
))
661 if (GET_CODE (XEXP (x
, 0)) == CONST_INT
)
662 output_address (gen_rtx_PLUS (SImode
, gen_rtx_REG (SImode
, 0),
665 output_address (XEXP (x
, 0));
669 fputs (reg_names
[REGNO (x
)], file
);
672 fputs (reg_names
[subreg_regno (x
)], file
);
679 print_operand_address (file
, x
);
690 /* Output assembly language output for the address ADDR to FILE. */
693 print_operand_address (FILE * file
, rtx addr
)
695 switch (GET_CODE (addr
))
698 fprintf (file
, "0[");
699 print_operand (file
, addr
, 0);
703 if (GET_CODE (XEXP (addr
, 0)) == REG
)
706 fprintf (file
, "lo(");
707 print_operand (file
, XEXP (addr
, 1), 0);
708 fprintf (file
, ")[");
709 print_operand (file
, XEXP (addr
, 0), 0);
714 if (GET_CODE (XEXP (addr
, 0)) == REG
715 || GET_CODE (XEXP (addr
, 0)) == SUBREG
)
718 print_operand (file
, XEXP (addr
, 1), 0);
720 print_operand (file
, XEXP (addr
, 0), 0);
725 print_operand (file
, XEXP (addr
, 0), 0);
727 print_operand (file
, XEXP (addr
, 1), 0);
732 const char *off_name
= NULL
;
733 const char *reg_name
= NULL
;
735 if (SYMBOL_REF_ZDA_P (addr
))
740 else if (SYMBOL_REF_SDA_P (addr
))
745 else if (SYMBOL_REF_TDA_P (addr
))
752 fprintf (file
, "%s(", off_name
);
753 output_addr_const (file
, addr
);
755 fprintf (file
, ")[%s]", reg_name
);
759 if (special_symbolref_operand (addr
, VOIDmode
))
761 rtx x
= XEXP (XEXP (addr
, 0), 0);
762 const char *off_name
;
763 const char *reg_name
;
765 if (SYMBOL_REF_ZDA_P (x
))
770 else if (SYMBOL_REF_SDA_P (x
))
775 else if (SYMBOL_REF_TDA_P (x
))
783 fprintf (file
, "%s(", off_name
);
784 output_addr_const (file
, addr
);
785 fprintf (file
, ")[%s]", reg_name
);
788 output_addr_const (file
, addr
);
791 output_addr_const (file
, addr
);
796 /* When assemble_integer is used to emit the offsets for a switch
797 table it can encounter (TRUNCATE:HI (MINUS:SI (LABEL_REF:SI) (LABEL_REF:SI))).
798 output_addr_const will normally barf at this, but it is OK to omit
799 the truncate and just emit the difference of the two labels. The
800 .hword directive will automatically handle the truncation for us.
802 Returns 1 if rtx was handled, 0 otherwise. */
805 v850_output_addr_const_extra (FILE * file
, rtx x
)
807 if (GET_CODE (x
) != TRUNCATE
)
812 /* We must also handle the case where the switch table was passed a
813 constant value and so has been collapsed. In this case the first
814 label will have been deleted. In such a case it is OK to emit
815 nothing, since the table will not be used.
816 (cf gcc.c-torture/compile/990801-1.c). */
817 if (GET_CODE (x
) == MINUS
818 && GET_CODE (XEXP (x
, 0)) == LABEL_REF
819 && GET_CODE (XEXP (XEXP (x
, 0), 0)) == CODE_LABEL
820 && INSN_DELETED_P (XEXP (XEXP (x
, 0), 0)))
823 output_addr_const (file
, x
);
827 /* Return appropriate code to load up a 1, 2, or 4 integer/floating
831 output_move_single (rtx
* operands
)
833 rtx dst
= operands
[0];
834 rtx src
= operands
[1];
841 else if (GET_CODE (src
) == CONST_INT
)
843 HOST_WIDE_INT value
= INTVAL (src
);
845 if (CONST_OK_FOR_J (value
)) /* Signed 5 bit immediate. */
848 else if (CONST_OK_FOR_K (value
)) /* Signed 16 bit immediate. */
849 return "movea lo(%1),%.,%0";
851 else if (CONST_OK_FOR_L (value
)) /* Upper 16 bits were set. */
852 return "movhi hi(%1),%.,%0";
854 /* A random constant. */
855 else if (TARGET_V850E
)
858 return "movhi hi(%1),%.,%0\n\tmovea lo(%1),%0,%0";
861 else if (GET_CODE (src
) == CONST_DOUBLE
&& GET_MODE (src
) == SFmode
)
863 HOST_WIDE_INT high
, low
;
865 const_double_split (src
, &high
, &low
);
867 if (CONST_OK_FOR_J (high
)) /* Signed 5 bit immediate. */
870 else if (CONST_OK_FOR_K (high
)) /* Signed 16 bit immediate. */
871 return "movea lo(%F1),%.,%0";
873 else if (CONST_OK_FOR_L (high
)) /* Upper 16 bits were set. */
874 return "movhi hi(%F1),%.,%0";
876 /* A random constant. */
877 else if (TARGET_V850E
)
881 return "movhi hi(%F1),%.,%0\n\tmovea lo(%F1),%0,%0";
884 else if (GET_CODE (src
) == MEM
)
885 return "%S1ld%W1 %1,%0";
887 else if (special_symbolref_operand (src
, VOIDmode
))
888 return "movea %O1(%P1),%Q1,%0";
890 else if (GET_CODE (src
) == LABEL_REF
891 || GET_CODE (src
) == SYMBOL_REF
892 || GET_CODE (src
) == CONST
)
895 return "mov hilo(%1),%0";
897 return "movhi hi(%1),%.,%0\n\tmovea lo(%1),%0,%0";
900 else if (GET_CODE (src
) == HIGH
)
901 return "movhi hi(%1),%.,%0";
903 else if (GET_CODE (src
) == LO_SUM
)
905 operands
[2] = XEXP (src
, 0);
906 operands
[3] = XEXP (src
, 1);
907 return "movea lo(%3),%2,%0";
911 else if (GET_CODE (dst
) == MEM
)
914 return "%S0st%W0 %1,%0";
916 else if (GET_CODE (src
) == CONST_INT
&& INTVAL (src
) == 0)
917 return "%S0st%W0 %.,%0";
919 else if (GET_CODE (src
) == CONST_DOUBLE
920 && CONST0_RTX (GET_MODE (dst
)) == src
)
921 return "%S0st%W0 %.,%0";
924 fatal_insn ("output_move_single:", gen_rtx_SET (VOIDmode
, dst
, src
));
929 /* Return appropriate code to load up an 8 byte integer or
930 floating point value */
933 output_move_double (rtx
* operands
)
935 enum machine_mode mode
= GET_MODE (operands
[0]);
936 rtx dst
= operands
[0];
937 rtx src
= operands
[1];
939 if (register_operand (dst
, mode
)
940 && register_operand (src
, mode
))
942 if (REGNO (src
) + 1 == REGNO (dst
))
943 return "mov %R1,%R0\n\tmov %1,%0";
945 return "mov %1,%0\n\tmov %R1,%R0";
949 if (GET_CODE (dst
) == MEM
950 && ((GET_CODE (src
) == CONST_INT
&& INTVAL (src
) == 0)
951 || (GET_CODE (src
) == CONST_DOUBLE
&& CONST_DOUBLE_OK_FOR_G (src
))))
952 return "st.w %.,%0\n\tst.w %.,%R0";
954 if (GET_CODE (src
) == CONST_INT
|| GET_CODE (src
) == CONST_DOUBLE
)
956 HOST_WIDE_INT high_low
[2];
960 if (GET_CODE (src
) == CONST_DOUBLE
)
961 const_double_split (src
, &high_low
[1], &high_low
[0]);
964 high_low
[0] = INTVAL (src
);
965 high_low
[1] = (INTVAL (src
) >= 0) ? 0 : -1;
968 for (i
= 0; i
< 2; i
++)
970 xop
[0] = gen_rtx_REG (SImode
, REGNO (dst
)+i
);
971 xop
[1] = GEN_INT (high_low
[i
]);
972 output_asm_insn (output_move_single (xop
), xop
);
978 if (GET_CODE (src
) == MEM
)
981 int dreg
= REGNO (dst
);
982 rtx inside
= XEXP (src
, 0);
984 if (GET_CODE (inside
) == REG
)
985 ptrreg
= REGNO (inside
);
986 else if (GET_CODE (inside
) == SUBREG
)
987 ptrreg
= subreg_regno (inside
);
988 else if (GET_CODE (inside
) == PLUS
)
989 ptrreg
= REGNO (XEXP (inside
, 0));
990 else if (GET_CODE (inside
) == LO_SUM
)
991 ptrreg
= REGNO (XEXP (inside
, 0));
994 return "ld.w %R1,%R0\n\tld.w %1,%0";
997 if (GET_CODE (src
) == MEM
)
998 return "ld.w %1,%0\n\tld.w %R1,%R0";
1000 if (GET_CODE (dst
) == MEM
)
1001 return "st.w %1,%0\n\tst.w %R1,%R0";
1003 return "mov %1,%0\n\tmov %R1,%R0";
1007 /* Return maximum offset supported for a short EP memory reference of mode
1008 MODE and signedness UNSIGNEDP. */
1011 ep_memory_offset (enum machine_mode mode
, int unsignedp ATTRIBUTE_UNUSED
)
1018 if (TARGET_SMALL_SLD
)
1019 max_offset
= (1 << 4);
1020 else if (TARGET_V850E
1021 && ( ( unsignedp
&& ! TARGET_US_BIT_SET
)
1022 || (! unsignedp
&& TARGET_US_BIT_SET
)))
1023 max_offset
= (1 << 4);
1025 max_offset
= (1 << 7);
1029 if (TARGET_SMALL_SLD
)
1030 max_offset
= (1 << 5);
1031 else if (TARGET_V850E
1032 && ( ( unsignedp
&& ! TARGET_US_BIT_SET
)
1033 || (! unsignedp
&& TARGET_US_BIT_SET
)))
1034 max_offset
= (1 << 5);
1036 max_offset
= (1 << 8);
1041 max_offset
= (1 << 8);
1051 /* Return true if OP is a valid short EP memory reference */
1054 ep_memory_operand (rtx op
, enum machine_mode mode
, int unsigned_load
)
1060 /* If we are not using the EP register on a per-function basis
1061 then do not allow this optimisation at all. This is to
1062 prevent the use of the SLD/SST instructions which cannot be
1063 guaranteed to work properly due to a hardware bug. */
1067 if (GET_CODE (op
) != MEM
)
1070 max_offset
= ep_memory_offset (mode
, unsigned_load
);
1072 mask
= GET_MODE_SIZE (mode
) - 1;
1074 addr
= XEXP (op
, 0);
1075 if (GET_CODE (addr
) == CONST
)
1076 addr
= XEXP (addr
, 0);
1078 switch (GET_CODE (addr
))
1084 return SYMBOL_REF_TDA_P (addr
);
1087 return REGNO (addr
) == EP_REGNUM
;
1090 op0
= XEXP (addr
, 0);
1091 op1
= XEXP (addr
, 1);
1092 if (GET_CODE (op1
) == CONST_INT
1093 && INTVAL (op1
) < max_offset
1094 && INTVAL (op1
) >= 0
1095 && (INTVAL (op1
) & mask
) == 0)
1097 if (GET_CODE (op0
) == REG
&& REGNO (op0
) == EP_REGNUM
)
1100 if (GET_CODE (op0
) == SYMBOL_REF
&& SYMBOL_REF_TDA_P (op0
))
1109 /* Substitute memory references involving a pointer, to use the ep pointer,
1110 taking care to save and preserve the ep. */
1113 substitute_ep_register (rtx first_insn
,
1120 rtx reg
= gen_rtx_REG (Pmode
, regno
);
1125 regs_ever_live
[1] = 1;
1126 *p_r1
= gen_rtx_REG (Pmode
, 1);
1127 *p_ep
= gen_rtx_REG (Pmode
, 30);
1132 Saved %d bytes (%d uses of register %s) in function %s, starting as insn %d, ending at %d\n",
1133 2 * (uses
- 3), uses
, reg_names
[regno
],
1134 IDENTIFIER_POINTER (DECL_NAME (current_function_decl
)),
1135 INSN_UID (first_insn
), INSN_UID (last_insn
));
1137 if (GET_CODE (first_insn
) == NOTE
)
1138 first_insn
= next_nonnote_insn (first_insn
);
1140 last_insn
= next_nonnote_insn (last_insn
);
1141 for (insn
= first_insn
; insn
&& insn
!= last_insn
; insn
= NEXT_INSN (insn
))
1143 if (GET_CODE (insn
) == INSN
)
1145 rtx pattern
= single_set (insn
);
1147 /* Replace the memory references. */
1151 /* Memory operands are signed by default. */
1152 int unsignedp
= FALSE
;
1154 if (GET_CODE (SET_DEST (pattern
)) == MEM
1155 && GET_CODE (SET_SRC (pattern
)) == MEM
)
1158 else if (GET_CODE (SET_DEST (pattern
)) == MEM
)
1159 p_mem
= &SET_DEST (pattern
);
1161 else if (GET_CODE (SET_SRC (pattern
)) == MEM
)
1162 p_mem
= &SET_SRC (pattern
);
1164 else if (GET_CODE (SET_SRC (pattern
)) == SIGN_EXTEND
1165 && GET_CODE (XEXP (SET_SRC (pattern
), 0)) == MEM
)
1166 p_mem
= &XEXP (SET_SRC (pattern
), 0);
1168 else if (GET_CODE (SET_SRC (pattern
)) == ZERO_EXTEND
1169 && GET_CODE (XEXP (SET_SRC (pattern
), 0)) == MEM
)
1171 p_mem
= &XEXP (SET_SRC (pattern
), 0);
1179 rtx addr
= XEXP (*p_mem
, 0);
1181 if (GET_CODE (addr
) == REG
&& REGNO (addr
) == (unsigned) regno
)
1182 *p_mem
= change_address (*p_mem
, VOIDmode
, *p_ep
);
1184 else if (GET_CODE (addr
) == PLUS
1185 && GET_CODE (XEXP (addr
, 0)) == REG
1186 && REGNO (XEXP (addr
, 0)) == (unsigned) regno
1187 && GET_CODE (XEXP (addr
, 1)) == CONST_INT
1188 && ((INTVAL (XEXP (addr
, 1)))
1189 < ep_memory_offset (GET_MODE (*p_mem
),
1191 && ((INTVAL (XEXP (addr
, 1))) >= 0))
1192 *p_mem
= change_address (*p_mem
, VOIDmode
,
1193 gen_rtx_PLUS (Pmode
,
1201 /* Optimize back to back cases of ep <- r1 & r1 <- ep. */
1202 insn
= prev_nonnote_insn (first_insn
);
1203 if (insn
&& GET_CODE (insn
) == INSN
1204 && GET_CODE (PATTERN (insn
)) == SET
1205 && SET_DEST (PATTERN (insn
)) == *p_ep
1206 && SET_SRC (PATTERN (insn
)) == *p_r1
)
1209 emit_insn_before (gen_rtx_SET (Pmode
, *p_r1
, *p_ep
), first_insn
);
1211 emit_insn_before (gen_rtx_SET (Pmode
, *p_ep
, reg
), first_insn
);
1212 emit_insn_before (gen_rtx_SET (Pmode
, *p_ep
, *p_r1
), last_insn
);
1216 /* TARGET_MACHINE_DEPENDENT_REORG. On the 850, we use it to implement
1217 the -mep mode to copy heavily used pointers to ep to use the implicit
1229 regs
[FIRST_PSEUDO_REGISTER
];
1238 /* If not ep mode, just return now. */
1242 for (i
= 0; i
< FIRST_PSEUDO_REGISTER
; i
++)
1245 regs
[i
].first_insn
= NULL_RTX
;
1246 regs
[i
].last_insn
= NULL_RTX
;
1249 for (insn
= get_insns (); insn
!= NULL_RTX
; insn
= NEXT_INSN (insn
))
1251 switch (GET_CODE (insn
))
1253 /* End of basic block */
1260 for (i
= 0; i
< FIRST_PSEUDO_REGISTER
; i
++)
1262 if (max_uses
< regs
[i
].uses
)
1264 max_uses
= regs
[i
].uses
;
1270 substitute_ep_register (regs
[max_regno
].first_insn
,
1271 regs
[max_regno
].last_insn
,
1272 max_uses
, max_regno
, &r1
, &ep
);
1276 for (i
= 0; i
< FIRST_PSEUDO_REGISTER
; i
++)
1279 regs
[i
].first_insn
= NULL_RTX
;
1280 regs
[i
].last_insn
= NULL_RTX
;
1288 pattern
= single_set (insn
);
1290 /* See if there are any memory references we can shorten */
1293 rtx src
= SET_SRC (pattern
);
1294 rtx dest
= SET_DEST (pattern
);
1296 /* Memory operands are signed by default. */
1297 int unsignedp
= FALSE
;
1299 /* We might have (SUBREG (MEM)) here, so just get rid of the
1300 subregs to make this code simpler. */
1301 if (GET_CODE (dest
) == SUBREG
1302 && (GET_CODE (SUBREG_REG (dest
)) == MEM
1303 || GET_CODE (SUBREG_REG (dest
)) == REG
))
1304 alter_subreg (&dest
);
1305 if (GET_CODE (src
) == SUBREG
1306 && (GET_CODE (SUBREG_REG (src
)) == MEM
1307 || GET_CODE (SUBREG_REG (src
)) == REG
))
1308 alter_subreg (&src
);
1310 if (GET_CODE (dest
) == MEM
&& GET_CODE (src
) == MEM
)
1313 else if (GET_CODE (dest
) == MEM
)
1316 else if (GET_CODE (src
) == MEM
)
1319 else if (GET_CODE (src
) == SIGN_EXTEND
1320 && GET_CODE (XEXP (src
, 0)) == MEM
)
1321 mem
= XEXP (src
, 0);
1323 else if (GET_CODE (src
) == ZERO_EXTEND
1324 && GET_CODE (XEXP (src
, 0)) == MEM
)
1326 mem
= XEXP (src
, 0);
1332 if (mem
&& ep_memory_operand (mem
, GET_MODE (mem
), unsignedp
))
1335 else if (!use_ep
&& mem
1336 && GET_MODE_SIZE (GET_MODE (mem
)) <= UNITS_PER_WORD
)
1338 rtx addr
= XEXP (mem
, 0);
1342 if (GET_CODE (addr
) == REG
)
1345 regno
= REGNO (addr
);
1348 else if (GET_CODE (addr
) == PLUS
1349 && GET_CODE (XEXP (addr
, 0)) == REG
1350 && GET_CODE (XEXP (addr
, 1)) == CONST_INT
1351 && ((INTVAL (XEXP (addr
, 1)))
1352 < ep_memory_offset (GET_MODE (mem
), unsignedp
))
1353 && ((INTVAL (XEXP (addr
, 1))) >= 0))
1356 regno
= REGNO (XEXP (addr
, 0));
1365 regs
[regno
].last_insn
= insn
;
1366 if (!regs
[regno
].first_insn
)
1367 regs
[regno
].first_insn
= insn
;
1371 /* Loading up a register in the basic block zaps any savings
1373 if (GET_CODE (dest
) == REG
)
1375 enum machine_mode mode
= GET_MODE (dest
);
1379 regno
= REGNO (dest
);
1380 endregno
= regno
+ HARD_REGNO_NREGS (regno
, mode
);
1384 /* See if we can use the pointer before this
1389 for (i
= 0; i
< FIRST_PSEUDO_REGISTER
; i
++)
1391 if (max_uses
< regs
[i
].uses
)
1393 max_uses
= regs
[i
].uses
;
1399 && max_regno
>= regno
1400 && max_regno
< endregno
)
1402 substitute_ep_register (regs
[max_regno
].first_insn
,
1403 regs
[max_regno
].last_insn
,
1404 max_uses
, max_regno
, &r1
,
1407 /* Since we made a substitution, zap all remembered
1409 for (i
= 0; i
< FIRST_PSEUDO_REGISTER
; i
++)
1412 regs
[i
].first_insn
= NULL_RTX
;
1413 regs
[i
].last_insn
= NULL_RTX
;
1418 for (i
= regno
; i
< endregno
; i
++)
1421 regs
[i
].first_insn
= NULL_RTX
;
1422 regs
[i
].last_insn
= NULL_RTX
;
1431 /* # of registers saved by the interrupt handler. */
1432 #define INTERRUPT_FIXED_NUM 4
1434 /* # of bytes for registers saved by the interrupt handler. */
1435 #define INTERRUPT_FIXED_SAVE_SIZE (4 * INTERRUPT_FIXED_NUM)
1437 /* # of registers saved in register parameter area. */
1438 #define INTERRUPT_REGPARM_NUM 4
1439 /* # of words saved for other registers. */
1440 #define INTERRUPT_ALL_SAVE_NUM \
1441 (30 - INTERRUPT_FIXED_NUM + INTERRUPT_REGPARM_NUM)
1443 #define INTERRUPT_ALL_SAVE_SIZE (4 * INTERRUPT_ALL_SAVE_NUM)
1446 compute_register_save_size (long * p_reg_saved
)
1450 int interrupt_handler
= v850_interrupt_function_p (current_function_decl
);
1451 int call_p
= regs_ever_live
[LINK_POINTER_REGNUM
];
1454 /* Count the return pointer if we need to save it. */
1455 if (current_function_profile
&& !call_p
)
1456 regs_ever_live
[LINK_POINTER_REGNUM
] = call_p
= 1;
1458 /* Count space for the register saves. */
1459 if (interrupt_handler
)
1461 for (i
= 0; i
<= 31; i
++)
1465 if (regs_ever_live
[i
] || call_p
)
1468 reg_saved
|= 1L << i
;
1472 /* We don't save/restore r0 or the stack pointer */
1474 case STACK_POINTER_REGNUM
:
1477 /* For registers with fixed use, we save them, set them to the
1478 appropriate value, and then restore them.
1479 These registers are handled specially, so don't list them
1480 on the list of registers to save in the prologue. */
1481 case 1: /* temp used to hold ep */
1483 case 10: /* temp used to call interrupt save/restore */
1484 case EP_REGNUM
: /* ep */
1491 /* Find the first register that needs to be saved. */
1492 for (i
= 0; i
<= 31; i
++)
1493 if (regs_ever_live
[i
] && ((! call_used_regs
[i
])
1494 || i
== LINK_POINTER_REGNUM
))
1497 /* If it is possible that an out-of-line helper function might be
1498 used to generate the prologue for the current function, then we
1499 need to cover the possibility that such a helper function will
1500 be used, despite the fact that there might be gaps in the list of
1501 registers that need to be saved. To detect this we note that the
1502 helper functions always push at least register r29 (provided
1503 that the function is not an interrupt handler). */
1505 if (TARGET_PROLOG_FUNCTION
1506 && (i
== 2 || ((i
>= 20) && (i
< 30))))
1511 reg_saved
|= 1L << i
;
1516 /* Helper functions save all registers between the starting
1517 register and the last register, regardless of whether they
1518 are actually used by the function or not. */
1519 for (; i
<= 29; i
++)
1522 reg_saved
|= 1L << i
;
1525 if (regs_ever_live
[LINK_POINTER_REGNUM
])
1528 reg_saved
|= 1L << LINK_POINTER_REGNUM
;
1533 for (; i
<= 31; i
++)
1534 if (regs_ever_live
[i
] && ((! call_used_regs
[i
])
1535 || i
== LINK_POINTER_REGNUM
))
1538 reg_saved
|= 1L << i
;
1544 *p_reg_saved
= reg_saved
;
1550 compute_frame_size (int size
, long * p_reg_saved
)
1553 + compute_register_save_size (p_reg_saved
)
1554 + current_function_outgoing_args_size
);
1559 expand_prologue (void)
1563 unsigned int size
= get_frame_size ();
1564 unsigned int actual_fsize
;
1565 unsigned int init_stack_alloc
= 0;
1568 unsigned int num_save
;
1569 unsigned int default_stack
;
1571 int interrupt_handler
= v850_interrupt_function_p (current_function_decl
);
1574 actual_fsize
= compute_frame_size (size
, ®_saved
);
1576 /* Save/setup global registers for interrupt functions right now. */
1577 if (interrupt_handler
)
1579 if (TARGET_V850E
&& ! TARGET_DISABLE_CALLT
)
1580 emit_insn (gen_callt_save_interrupt ());
1582 emit_insn (gen_save_interrupt ());
1584 actual_fsize
-= INTERRUPT_FIXED_SAVE_SIZE
;
1586 if (((1L << LINK_POINTER_REGNUM
) & reg_saved
) != 0)
1587 actual_fsize
-= INTERRUPT_ALL_SAVE_SIZE
;
1590 /* Save arg registers to the stack if necessary. */
1591 else if (current_function_args_info
.anonymous_args
)
1593 if (TARGET_PROLOG_FUNCTION
&& TARGET_V850E
&& !TARGET_DISABLE_CALLT
)
1594 emit_insn (gen_save_r6_r9_v850e ());
1595 else if (TARGET_PROLOG_FUNCTION
&& ! TARGET_LONG_CALLS
)
1596 emit_insn (gen_save_r6_r9 ());
1600 for (i
= 6; i
< 10; i
++)
1602 emit_move_insn (gen_rtx_MEM (SImode
,
1603 plus_constant (stack_pointer_rtx
,
1605 gen_rtx_REG (SImode
, i
));
1611 /* Identify all of the saved registers. */
1614 for (i
= 1; i
< 31; i
++)
1616 if (((1L << i
) & reg_saved
) != 0)
1617 save_regs
[num_save
++] = gen_rtx_REG (Pmode
, i
);
1620 /* If the return pointer is saved, the helper functions also allocate
1621 16 bytes of stack for arguments to be saved in. */
1622 if (((1L << LINK_POINTER_REGNUM
) & reg_saved
) != 0)
1624 save_regs
[num_save
++] = gen_rtx_REG (Pmode
, LINK_POINTER_REGNUM
);
1628 /* See if we have an insn that allocates stack space and saves the particular
1629 registers we want to. */
1630 save_all
= NULL_RTX
;
1631 if (TARGET_PROLOG_FUNCTION
&& num_save
> 0 && actual_fsize
>= default_stack
)
1633 int alloc_stack
= (4 * num_save
) + default_stack
;
1634 int unalloc_stack
= actual_fsize
- alloc_stack
;
1635 int save_func_len
= 4;
1636 int save_normal_len
;
1639 save_func_len
+= CONST_OK_FOR_J (unalloc_stack
) ? 2 : 4;
1641 /* see if we would have used ep to save the stack */
1642 if (TARGET_EP
&& num_save
> 3 && (unsigned)actual_fsize
< 255)
1643 save_normal_len
= (3 * 2) + (2 * num_save
);
1645 save_normal_len
= 4 * num_save
;
1647 save_normal_len
+= CONST_OK_FOR_J (actual_fsize
) ? 2 : 4;
1649 /* Don't bother checking if we don't actually save any space.
1650 This happens for instance if one register is saved and additional
1651 stack space is allocated. */
1652 if (save_func_len
< save_normal_len
)
1654 save_all
= gen_rtx_PARALLEL
1656 rtvec_alloc (num_save
+ 1
1657 + (TARGET_V850
? (TARGET_LONG_CALLS
? 2 : 1) : 0)));
1659 XVECEXP (save_all
, 0, 0)
1660 = gen_rtx_SET (VOIDmode
,
1662 plus_constant (stack_pointer_rtx
, -alloc_stack
));
1664 offset
= - default_stack
;
1665 for (i
= 0; i
< num_save
; i
++)
1667 XVECEXP (save_all
, 0, i
+1)
1668 = gen_rtx_SET (VOIDmode
,
1670 plus_constant (stack_pointer_rtx
,
1678 XVECEXP (save_all
, 0, num_save
+ 1)
1679 = gen_rtx_CLOBBER (VOIDmode
, gen_rtx_REG (Pmode
, 10));
1681 if (TARGET_LONG_CALLS
)
1682 XVECEXP (save_all
, 0, num_save
+ 2)
1683 = gen_rtx_CLOBBER (VOIDmode
, gen_rtx_REG (Pmode
, 11));
1686 code
= recog (save_all
, NULL_RTX
, NULL
);
1689 rtx insn
= emit_insn (save_all
);
1690 INSN_CODE (insn
) = code
;
1691 actual_fsize
-= alloc_stack
;
1695 Saved %d bytes via prologue function (%d vs. %d) for function %s\n",
1696 save_normal_len
- save_func_len
,
1697 save_normal_len
, save_func_len
,
1698 IDENTIFIER_POINTER (DECL_NAME (current_function_decl
)));
1701 save_all
= NULL_RTX
;
1705 /* If no prolog save function is available, store the registers the old
1706 fashioned way (one by one). */
1709 /* Special case interrupt functions that save all registers for a call. */
1710 if (interrupt_handler
&& ((1L << LINK_POINTER_REGNUM
) & reg_saved
) != 0)
1712 if (TARGET_V850E
&& ! TARGET_DISABLE_CALLT
)
1713 emit_insn (gen_callt_save_all_interrupt ());
1715 emit_insn (gen_save_all_interrupt ());
1719 /* If the stack is too big, allocate it in chunks so we can do the
1720 register saves. We use the register save size so we use the ep
1722 if (actual_fsize
&& !CONST_OK_FOR_K (-actual_fsize
))
1723 init_stack_alloc
= compute_register_save_size (NULL
);
1725 init_stack_alloc
= actual_fsize
;
1727 /* Save registers at the beginning of the stack frame. */
1728 offset
= init_stack_alloc
- 4;
1730 if (init_stack_alloc
)
1731 emit_insn (gen_addsi3 (stack_pointer_rtx
,
1733 GEN_INT (-init_stack_alloc
)));
1735 /* Save the return pointer first. */
1736 if (num_save
> 0 && REGNO (save_regs
[num_save
-1]) == LINK_POINTER_REGNUM
)
1738 emit_move_insn (gen_rtx_MEM (SImode
,
1739 plus_constant (stack_pointer_rtx
,
1741 save_regs
[--num_save
]);
1745 for (i
= 0; i
< num_save
; i
++)
1747 emit_move_insn (gen_rtx_MEM (SImode
,
1748 plus_constant (stack_pointer_rtx
,
1756 /* Allocate the rest of the stack that was not allocated above (either it is
1757 > 32K or we just called a function to save the registers and needed more
1759 if (actual_fsize
> init_stack_alloc
)
1761 int diff
= actual_fsize
- init_stack_alloc
;
1762 if (CONST_OK_FOR_K (diff
))
1763 emit_insn (gen_addsi3 (stack_pointer_rtx
,
1768 rtx reg
= gen_rtx_REG (Pmode
, 12);
1769 emit_move_insn (reg
, GEN_INT (-diff
));
1770 emit_insn (gen_addsi3 (stack_pointer_rtx
, stack_pointer_rtx
, reg
));
1774 /* If we need a frame pointer, set it up now. */
1775 if (frame_pointer_needed
)
1776 emit_move_insn (hard_frame_pointer_rtx
, stack_pointer_rtx
);
1781 expand_epilogue (void)
1785 unsigned int size
= get_frame_size ();
1787 unsigned int actual_fsize
= compute_frame_size (size
, ®_saved
);
1788 unsigned int init_stack_free
= 0;
1789 rtx restore_regs
[32];
1791 unsigned int num_restore
;
1792 unsigned int default_stack
;
1794 int interrupt_handler
= v850_interrupt_function_p (current_function_decl
);
1796 /* Eliminate the initial stack stored by interrupt functions. */
1797 if (interrupt_handler
)
1799 actual_fsize
-= INTERRUPT_FIXED_SAVE_SIZE
;
1800 if (((1L << LINK_POINTER_REGNUM
) & reg_saved
) != 0)
1801 actual_fsize
-= INTERRUPT_ALL_SAVE_SIZE
;
1804 /* Cut off any dynamic stack created. */
1805 if (frame_pointer_needed
)
1806 emit_move_insn (stack_pointer_rtx
, hard_frame_pointer_rtx
);
1808 /* Identify all of the saved registers. */
1811 for (i
= 1; i
< 31; i
++)
1813 if (((1L << i
) & reg_saved
) != 0)
1814 restore_regs
[num_restore
++] = gen_rtx_REG (Pmode
, i
);
1817 /* If the return pointer is saved, the helper functions also allocate
1818 16 bytes of stack for arguments to be saved in. */
1819 if (((1L << LINK_POINTER_REGNUM
) & reg_saved
) != 0)
1821 restore_regs
[num_restore
++] = gen_rtx_REG (Pmode
, LINK_POINTER_REGNUM
);
1825 /* See if we have an insn that restores the particular registers we
1827 restore_all
= NULL_RTX
;
1829 if (TARGET_PROLOG_FUNCTION
1831 && actual_fsize
>= default_stack
1832 && !interrupt_handler
)
1834 int alloc_stack
= (4 * num_restore
) + default_stack
;
1835 int unalloc_stack
= actual_fsize
- alloc_stack
;
1836 int restore_func_len
= 4;
1837 int restore_normal_len
;
1840 restore_func_len
+= CONST_OK_FOR_J (unalloc_stack
) ? 2 : 4;
1842 /* See if we would have used ep to restore the registers. */
1843 if (TARGET_EP
&& num_restore
> 3 && (unsigned)actual_fsize
< 255)
1844 restore_normal_len
= (3 * 2) + (2 * num_restore
);
1846 restore_normal_len
= 4 * num_restore
;
1848 restore_normal_len
+= (CONST_OK_FOR_J (actual_fsize
) ? 2 : 4) + 2;
1850 /* Don't bother checking if we don't actually save any space. */
1851 if (restore_func_len
< restore_normal_len
)
1853 restore_all
= gen_rtx_PARALLEL (VOIDmode
,
1854 rtvec_alloc (num_restore
+ 2));
1855 XVECEXP (restore_all
, 0, 0) = gen_rtx_RETURN (VOIDmode
);
1856 XVECEXP (restore_all
, 0, 1)
1857 = gen_rtx_SET (VOIDmode
, stack_pointer_rtx
,
1858 gen_rtx_PLUS (Pmode
,
1860 GEN_INT (alloc_stack
)));
1862 offset
= alloc_stack
- 4;
1863 for (i
= 0; i
< num_restore
; i
++)
1865 XVECEXP (restore_all
, 0, i
+2)
1866 = gen_rtx_SET (VOIDmode
,
1869 plus_constant (stack_pointer_rtx
,
1874 code
= recog (restore_all
, NULL_RTX
, NULL
);
1880 actual_fsize
-= alloc_stack
;
1883 if (CONST_OK_FOR_K (actual_fsize
))
1884 emit_insn (gen_addsi3 (stack_pointer_rtx
,
1886 GEN_INT (actual_fsize
)));
1889 rtx reg
= gen_rtx_REG (Pmode
, 12);
1890 emit_move_insn (reg
, GEN_INT (actual_fsize
));
1891 emit_insn (gen_addsi3 (stack_pointer_rtx
,
1897 insn
= emit_jump_insn (restore_all
);
1898 INSN_CODE (insn
) = code
;
1902 Saved %d bytes via epilogue function (%d vs. %d) in function %s\n",
1903 restore_normal_len
- restore_func_len
,
1904 restore_normal_len
, restore_func_len
,
1905 IDENTIFIER_POINTER (DECL_NAME (current_function_decl
)));
1908 restore_all
= NULL_RTX
;
1912 /* If no epilog save function is available, restore the registers the
1913 old fashioned way (one by one). */
1916 /* If the stack is large, we need to cut it down in 2 pieces. */
1917 if (actual_fsize
&& !CONST_OK_FOR_K (-actual_fsize
))
1918 init_stack_free
= 4 * num_restore
;
1920 init_stack_free
= actual_fsize
;
1922 /* Deallocate the rest of the stack if it is > 32K. */
1923 if (actual_fsize
> init_stack_free
)
1927 diff
= actual_fsize
- ((interrupt_handler
) ? 0 : init_stack_free
);
1929 if (CONST_OK_FOR_K (diff
))
1930 emit_insn (gen_addsi3 (stack_pointer_rtx
,
1935 rtx reg
= gen_rtx_REG (Pmode
, 12);
1936 emit_move_insn (reg
, GEN_INT (diff
));
1937 emit_insn (gen_addsi3 (stack_pointer_rtx
,
1943 /* Special case interrupt functions that save all registers
1945 if (interrupt_handler
&& ((1L << LINK_POINTER_REGNUM
) & reg_saved
) != 0)
1947 if (TARGET_V850E
&& ! TARGET_DISABLE_CALLT
)
1948 emit_insn (gen_callt_restore_all_interrupt ());
1950 emit_insn (gen_restore_all_interrupt ());
1954 /* Restore registers from the beginning of the stack frame. */
1955 offset
= init_stack_free
- 4;
1957 /* Restore the return pointer first. */
1959 && REGNO (restore_regs
[num_restore
- 1]) == LINK_POINTER_REGNUM
)
1961 emit_move_insn (restore_regs
[--num_restore
],
1962 gen_rtx_MEM (SImode
,
1963 plus_constant (stack_pointer_rtx
,
1968 for (i
= 0; i
< num_restore
; i
++)
1970 emit_move_insn (restore_regs
[i
],
1971 gen_rtx_MEM (SImode
,
1972 plus_constant (stack_pointer_rtx
,
1975 emit_insn (gen_rtx_USE (VOIDmode
, restore_regs
[i
]));
1979 /* Cut back the remainder of the stack. */
1980 if (init_stack_free
)
1981 emit_insn (gen_addsi3 (stack_pointer_rtx
,
1983 GEN_INT (init_stack_free
)));
1986 /* And return or use reti for interrupt handlers. */
1987 if (interrupt_handler
)
1989 if (TARGET_V850E
&& ! TARGET_DISABLE_CALLT
)
1990 emit_insn (gen_callt_return_interrupt ());
1992 emit_jump_insn (gen_return_interrupt ());
1994 else if (actual_fsize
)
1995 emit_jump_insn (gen_return_internal ());
1997 emit_jump_insn (gen_return ());
2000 v850_interrupt_cache_p
= FALSE
;
2001 v850_interrupt_p
= FALSE
;
2005 /* Update the condition code from the insn. */
2008 notice_update_cc (rtx body
, rtx insn
)
2010 switch (get_attr_cc (insn
))
2013 /* Insn does not affect CC at all. */
2017 /* Insn does not change CC, but the 0'th operand has been changed. */
2018 if (cc_status
.value1
!= 0
2019 && reg_overlap_mentioned_p (recog_data
.operand
[0], cc_status
.value1
))
2020 cc_status
.value1
= 0;
2024 /* Insn sets the Z,N flags of CC to recog_data.operand[0].
2025 V,C is in an unusable state. */
2027 cc_status
.flags
|= CC_OVERFLOW_UNUSABLE
| CC_NO_CARRY
;
2028 cc_status
.value1
= recog_data
.operand
[0];
2032 /* Insn sets the Z,N,V flags of CC to recog_data.operand[0].
2033 C is in an unusable state. */
2035 cc_status
.flags
|= CC_NO_CARRY
;
2036 cc_status
.value1
= recog_data
.operand
[0];
2040 /* The insn is a compare instruction. */
2042 cc_status
.value1
= SET_SRC (body
);
2046 /* Insn doesn't leave CC in a usable state. */
2052 /* Retrieve the data area that has been chosen for the given decl. */
2055 v850_get_data_area (tree decl
)
2057 if (lookup_attribute ("sda", DECL_ATTRIBUTES (decl
)) != NULL_TREE
)
2058 return DATA_AREA_SDA
;
2060 if (lookup_attribute ("tda", DECL_ATTRIBUTES (decl
)) != NULL_TREE
)
2061 return DATA_AREA_TDA
;
2063 if (lookup_attribute ("zda", DECL_ATTRIBUTES (decl
)) != NULL_TREE
)
2064 return DATA_AREA_ZDA
;
2066 return DATA_AREA_NORMAL
;
2069 /* Store the indicated data area in the decl's attributes. */
2072 v850_set_data_area (tree decl
, v850_data_area data_area
)
2078 case DATA_AREA_SDA
: name
= get_identifier ("sda"); break;
2079 case DATA_AREA_TDA
: name
= get_identifier ("tda"); break;
2080 case DATA_AREA_ZDA
: name
= get_identifier ("zda"); break;
2085 DECL_ATTRIBUTES (decl
) = tree_cons
2086 (name
, NULL
, DECL_ATTRIBUTES (decl
));
2089 const struct attribute_spec v850_attribute_table
[] =
2091 /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler } */
2092 { "interrupt_handler", 0, 0, true, false, false, v850_handle_interrupt_attribute
},
2093 { "interrupt", 0, 0, true, false, false, v850_handle_interrupt_attribute
},
2094 { "sda", 0, 0, true, false, false, v850_handle_data_area_attribute
},
2095 { "tda", 0, 0, true, false, false, v850_handle_data_area_attribute
},
2096 { "zda", 0, 0, true, false, false, v850_handle_data_area_attribute
},
2097 { NULL
, 0, 0, false, false, false, NULL
}
2100 /* Handle an "interrupt" attribute; arguments as in
2101 struct attribute_spec.handler. */
2103 v850_handle_interrupt_attribute (tree
* node
,
2105 tree args ATTRIBUTE_UNUSED
,
2106 int flags ATTRIBUTE_UNUSED
,
2107 bool * no_add_attrs
)
2109 if (TREE_CODE (*node
) != FUNCTION_DECL
)
2111 warning (OPT_Wattributes
, "%qs attribute only applies to functions",
2112 IDENTIFIER_POINTER (name
));
2113 *no_add_attrs
= true;
2119 /* Handle a "sda", "tda" or "zda" attribute; arguments as in
2120 struct attribute_spec.handler. */
2122 v850_handle_data_area_attribute (tree
* node
,
2124 tree args ATTRIBUTE_UNUSED
,
2125 int flags ATTRIBUTE_UNUSED
,
2126 bool * no_add_attrs
)
2128 v850_data_area data_area
;
2129 v850_data_area area
;
2132 /* Implement data area attribute. */
2133 if (is_attribute_p ("sda", name
))
2134 data_area
= DATA_AREA_SDA
;
2135 else if (is_attribute_p ("tda", name
))
2136 data_area
= DATA_AREA_TDA
;
2137 else if (is_attribute_p ("zda", name
))
2138 data_area
= DATA_AREA_ZDA
;
2142 switch (TREE_CODE (decl
))
2145 if (current_function_decl
!= NULL_TREE
)
2147 error ("%Jdata area attributes cannot be specified for "
2148 "local variables", decl
);
2149 *no_add_attrs
= true;
2155 area
= v850_get_data_area (decl
);
2156 if (area
!= DATA_AREA_NORMAL
&& data_area
!= area
)
2158 error ("data area of %q+D conflicts with previous declaration",
2160 *no_add_attrs
= true;
2172 /* Return nonzero if FUNC is an interrupt function as specified
2173 by the "interrupt" attribute. */
2176 v850_interrupt_function_p (tree func
)
2181 if (v850_interrupt_cache_p
)
2182 return v850_interrupt_p
;
2184 if (TREE_CODE (func
) != FUNCTION_DECL
)
2187 a
= lookup_attribute ("interrupt_handler", DECL_ATTRIBUTES (func
));
2193 a
= lookup_attribute ("interrupt", DECL_ATTRIBUTES (func
));
2194 ret
= a
!= NULL_TREE
;
2197 /* Its not safe to trust global variables until after function inlining has
2199 if (reload_completed
| reload_in_progress
)
2200 v850_interrupt_p
= ret
;
2207 v850_encode_data_area (tree decl
, rtx symbol
)
2211 /* Map explicit sections into the appropriate attribute */
2212 if (v850_get_data_area (decl
) == DATA_AREA_NORMAL
)
2214 if (DECL_SECTION_NAME (decl
))
2216 const char *name
= TREE_STRING_POINTER (DECL_SECTION_NAME (decl
));
2218 if (streq (name
, ".zdata") || streq (name
, ".zbss"))
2219 v850_set_data_area (decl
, DATA_AREA_ZDA
);
2221 else if (streq (name
, ".sdata") || streq (name
, ".sbss"))
2222 v850_set_data_area (decl
, DATA_AREA_SDA
);
2224 else if (streq (name
, ".tdata"))
2225 v850_set_data_area (decl
, DATA_AREA_TDA
);
2228 /* If no attribute, support -m{zda,sda,tda}=n */
2231 int size
= int_size_in_bytes (TREE_TYPE (decl
));
2235 else if (size
<= small_memory
[(int) SMALL_MEMORY_TDA
].max
)
2236 v850_set_data_area (decl
, DATA_AREA_TDA
);
2238 else if (size
<= small_memory
[(int) SMALL_MEMORY_SDA
].max
)
2239 v850_set_data_area (decl
, DATA_AREA_SDA
);
2241 else if (size
<= small_memory
[(int) SMALL_MEMORY_ZDA
].max
)
2242 v850_set_data_area (decl
, DATA_AREA_ZDA
);
2245 if (v850_get_data_area (decl
) == DATA_AREA_NORMAL
)
2249 flags
= SYMBOL_REF_FLAGS (symbol
);
2250 switch (v850_get_data_area (decl
))
2252 case DATA_AREA_ZDA
: flags
|= SYMBOL_FLAG_ZDA
; break;
2253 case DATA_AREA_TDA
: flags
|= SYMBOL_FLAG_TDA
; break;
2254 case DATA_AREA_SDA
: flags
|= SYMBOL_FLAG_SDA
; break;
2255 default: gcc_unreachable ();
2257 SYMBOL_REF_FLAGS (symbol
) = flags
;
2261 v850_encode_section_info (tree decl
, rtx rtl
, int first
)
2263 default_encode_section_info (decl
, rtl
, first
);
2265 if (TREE_CODE (decl
) == VAR_DECL
2266 && (TREE_STATIC (decl
) || DECL_EXTERNAL (decl
)))
2267 v850_encode_data_area (decl
, XEXP (rtl
, 0));
2270 /* Construct a JR instruction to a routine that will perform the equivalent of
2271 the RTL passed in as an argument. This RTL is a function epilogue that
2272 pops registers off the stack and possibly releases some extra stack space
2273 as well. The code has already verified that the RTL matches these
2276 construct_restore_jr (rtx op
)
2278 int count
= XVECLEN (op
, 0);
2280 unsigned long int mask
;
2281 unsigned long int first
;
2282 unsigned long int last
;
2284 static char buff
[100]; /* XXX */
2288 error ("bogus JR construction: %d", count
);
2292 /* Work out how many bytes to pop off the stack before retrieving
2294 gcc_assert (GET_CODE (XVECEXP (op
, 0, 1)) == SET
);
2295 gcc_assert (GET_CODE (SET_SRC (XVECEXP (op
, 0, 1))) == PLUS
);
2296 gcc_assert (GET_CODE (XEXP (SET_SRC (XVECEXP (op
, 0, 1)), 1)) == CONST_INT
);
2298 stack_bytes
= INTVAL (XEXP (SET_SRC (XVECEXP (op
, 0, 1)), 1));
2300 /* Each pop will remove 4 bytes from the stack.... */
2301 stack_bytes
-= (count
- 2) * 4;
2303 /* Make sure that the amount we are popping either 0 or 16 bytes. */
2304 if (stack_bytes
!= 0 && stack_bytes
!= 16)
2306 error ("bad amount of stack space removal: %d", stack_bytes
);
2310 /* Now compute the bit mask of registers to push. */
2312 for (i
= 2; i
< count
; i
++)
2314 rtx vector_element
= XVECEXP (op
, 0, i
);
2316 gcc_assert (GET_CODE (vector_element
) == SET
);
2317 gcc_assert (GET_CODE (SET_DEST (vector_element
)) == REG
);
2318 gcc_assert (register_is_ok_for_epilogue (SET_DEST (vector_element
),
2321 mask
|= 1 << REGNO (SET_DEST (vector_element
));
2324 /* Scan for the first register to pop. */
2325 for (first
= 0; first
< 32; first
++)
2327 if (mask
& (1 << first
))
2331 gcc_assert (first
< 32);
2333 /* Discover the last register to pop. */
2334 if (mask
& (1 << LINK_POINTER_REGNUM
))
2336 gcc_assert (stack_bytes
== 16);
2338 last
= LINK_POINTER_REGNUM
;
2342 gcc_assert (!stack_bytes
);
2343 gcc_assert (mask
& (1 << 29));
2348 /* Note, it is possible to have gaps in the register mask.
2349 We ignore this here, and generate a JR anyway. We will
2350 be popping more registers than is strictly necessary, but
2351 it does save code space. */
2353 if (TARGET_LONG_CALLS
)
2358 sprintf (name
, "__return_%s", reg_names
[first
]);
2360 sprintf (name
, "__return_%s_%s", reg_names
[first
], reg_names
[last
]);
2362 sprintf (buff
, "movhi hi(%s), r0, r6\n\tmovea lo(%s), r6, r6\n\tjmp r6",
2368 sprintf (buff
, "jr __return_%s", reg_names
[first
]);
2370 sprintf (buff
, "jr __return_%s_%s", reg_names
[first
], reg_names
[last
]);
2377 /* Construct a JARL instruction to a routine that will perform the equivalent
2378 of the RTL passed as a parameter. This RTL is a function prologue that
2379 saves some of the registers r20 - r31 onto the stack, and possibly acquires
2380 some stack space as well. The code has already verified that the RTL
2381 matches these requirements. */
2383 construct_save_jarl (rtx op
)
2385 int count
= XVECLEN (op
, 0);
2387 unsigned long int mask
;
2388 unsigned long int first
;
2389 unsigned long int last
;
2391 static char buff
[100]; /* XXX */
2395 error ("bogus JARL construction: %d\n", count
);
2400 gcc_assert (GET_CODE (XVECEXP (op
, 0, 0)) == SET
);
2401 gcc_assert (GET_CODE (SET_SRC (XVECEXP (op
, 0, 0))) == PLUS
);
2402 gcc_assert (GET_CODE (XEXP (SET_SRC (XVECEXP (op
, 0, 0)), 0)) == REG
);
2403 gcc_assert (GET_CODE (XEXP (SET_SRC (XVECEXP (op
, 0, 0)), 1)) == CONST_INT
);
2405 /* Work out how many bytes to push onto the stack after storing the
2407 stack_bytes
= INTVAL (XEXP (SET_SRC (XVECEXP (op
, 0, 0)), 1));
2409 /* Each push will put 4 bytes from the stack.... */
2410 stack_bytes
+= (count
- (TARGET_LONG_CALLS
? 3 : 2)) * 4;
2412 /* Make sure that the amount we are popping either 0 or 16 bytes. */
2413 if (stack_bytes
!= 0 && stack_bytes
!= -16)
2415 error ("bad amount of stack space removal: %d", stack_bytes
);
2419 /* Now compute the bit mask of registers to push. */
2421 for (i
= 1; i
< count
- (TARGET_LONG_CALLS
? 2 : 1); i
++)
2423 rtx vector_element
= XVECEXP (op
, 0, i
);
2425 gcc_assert (GET_CODE (vector_element
) == SET
);
2426 gcc_assert (GET_CODE (SET_SRC (vector_element
)) == REG
);
2427 gcc_assert (register_is_ok_for_epilogue (SET_SRC (vector_element
),
2430 mask
|= 1 << REGNO (SET_SRC (vector_element
));
2433 /* Scan for the first register to push. */
2434 for (first
= 0; first
< 32; first
++)
2436 if (mask
& (1 << first
))
2440 gcc_assert (first
< 32);
2442 /* Discover the last register to push. */
2443 if (mask
& (1 << LINK_POINTER_REGNUM
))
2445 gcc_assert (stack_bytes
== -16);
2447 last
= LINK_POINTER_REGNUM
;
2451 gcc_assert (!stack_bytes
);
2452 gcc_assert (mask
& (1 << 29));
2457 /* Note, it is possible to have gaps in the register mask.
2458 We ignore this here, and generate a JARL anyway. We will
2459 be pushing more registers than is strictly necessary, but
2460 it does save code space. */
2462 if (TARGET_LONG_CALLS
)
2467 sprintf (name
, "__save_%s", reg_names
[first
]);
2469 sprintf (name
, "__save_%s_%s", reg_names
[first
], reg_names
[last
]);
2471 sprintf (buff
, "movhi hi(%s), r0, r11\n\tmovea lo(%s), r11, r11\n\tjarl .+4, r10\n\tadd 4, r10\n\tjmp r11",
2477 sprintf (buff
, "jarl __save_%s, r10", reg_names
[first
]);
2479 sprintf (buff
, "jarl __save_%s_%s, r10", reg_names
[first
],
2486 extern tree last_assemble_variable_decl
;
2487 extern int size_directive_output
;
2489 /* A version of asm_output_aligned_bss() that copes with the special
2490 data areas of the v850. */
2492 v850_output_aligned_bss (FILE * file
,
2495 unsigned HOST_WIDE_INT size
,
2498 switch (v850_get_data_area (decl
))
2516 ASM_OUTPUT_ALIGN (file
, floor_log2 (align
/ BITS_PER_UNIT
));
2517 #ifdef ASM_DECLARE_OBJECT_NAME
2518 last_assemble_variable_decl
= decl
;
2519 ASM_DECLARE_OBJECT_NAME (file
, name
, decl
);
2521 /* Standard thing is just output label for the object. */
2522 ASM_OUTPUT_LABEL (file
, name
);
2523 #endif /* ASM_DECLARE_OBJECT_NAME */
2524 ASM_OUTPUT_SKIP (file
, size
? size
: 1);
2527 /* Called via the macro ASM_OUTPUT_DECL_COMMON */
2529 v850_output_common (FILE * file
,
2535 if (decl
== NULL_TREE
)
2537 fprintf (file
, "%s", COMMON_ASM_OP
);
2541 switch (v850_get_data_area (decl
))
2544 fprintf (file
, "%s", ZCOMMON_ASM_OP
);
2548 fprintf (file
, "%s", SCOMMON_ASM_OP
);
2552 fprintf (file
, "%s", TCOMMON_ASM_OP
);
2556 fprintf (file
, "%s", COMMON_ASM_OP
);
2561 assemble_name (file
, name
);
2562 fprintf (file
, ",%u,%u\n", size
, align
/ BITS_PER_UNIT
);
2565 /* Called via the macro ASM_OUTPUT_DECL_LOCAL */
2567 v850_output_local (FILE * file
,
2573 fprintf (file
, "%s", LOCAL_ASM_OP
);
2574 assemble_name (file
, name
);
2575 fprintf (file
, "\n");
2577 ASM_OUTPUT_ALIGNED_DECL_COMMON (file
, decl
, name
, size
, align
);
2580 /* Add data area to the given declaration if a ghs data area pragma is
2581 currently in effect (#pragma ghs startXXX/endXXX). */
2583 v850_insert_attributes (tree decl
, tree
* attr_ptr ATTRIBUTE_UNUSED
)
2586 && data_area_stack
->data_area
2587 && current_function_decl
== NULL_TREE
2588 && (TREE_CODE (decl
) == VAR_DECL
|| TREE_CODE (decl
) == CONST_DECL
)
2589 && v850_get_data_area (decl
) == DATA_AREA_NORMAL
)
2590 v850_set_data_area (decl
, data_area_stack
->data_area
);
2592 /* Initialize the default names of the v850 specific sections,
2593 if this has not been done before. */
2595 if (GHS_default_section_names
[(int) GHS_SECTION_KIND_SDATA
] == NULL
)
2597 GHS_default_section_names
[(int) GHS_SECTION_KIND_SDATA
]
2598 = build_string (sizeof (".sdata")-1, ".sdata");
2600 GHS_default_section_names
[(int) GHS_SECTION_KIND_ROSDATA
]
2601 = build_string (sizeof (".rosdata")-1, ".rosdata");
2603 GHS_default_section_names
[(int) GHS_SECTION_KIND_TDATA
]
2604 = build_string (sizeof (".tdata")-1, ".tdata");
2606 GHS_default_section_names
[(int) GHS_SECTION_KIND_ZDATA
]
2607 = build_string (sizeof (".zdata")-1, ".zdata");
2609 GHS_default_section_names
[(int) GHS_SECTION_KIND_ROZDATA
]
2610 = build_string (sizeof (".rozdata")-1, ".rozdata");
2613 if (current_function_decl
== NULL_TREE
2614 && (TREE_CODE (decl
) == VAR_DECL
2615 || TREE_CODE (decl
) == CONST_DECL
2616 || TREE_CODE (decl
) == FUNCTION_DECL
)
2617 && (!DECL_EXTERNAL (decl
) || DECL_INITIAL (decl
))
2618 && !DECL_SECTION_NAME (decl
))
2620 enum GHS_section_kind kind
= GHS_SECTION_KIND_DEFAULT
;
2621 tree chosen_section
;
2623 if (TREE_CODE (decl
) == FUNCTION_DECL
)
2624 kind
= GHS_SECTION_KIND_TEXT
;
2627 /* First choose a section kind based on the data area of the decl. */
2628 switch (v850_get_data_area (decl
))
2634 kind
= ((TREE_READONLY (decl
))
2635 ? GHS_SECTION_KIND_ROSDATA
2636 : GHS_SECTION_KIND_SDATA
);
2640 kind
= GHS_SECTION_KIND_TDATA
;
2644 kind
= ((TREE_READONLY (decl
))
2645 ? GHS_SECTION_KIND_ROZDATA
2646 : GHS_SECTION_KIND_ZDATA
);
2649 case DATA_AREA_NORMAL
: /* default data area */
2650 if (TREE_READONLY (decl
))
2651 kind
= GHS_SECTION_KIND_RODATA
;
2652 else if (DECL_INITIAL (decl
))
2653 kind
= GHS_SECTION_KIND_DATA
;
2655 kind
= GHS_SECTION_KIND_BSS
;
2659 /* Now, if the section kind has been explicitly renamed,
2660 then attach a section attribute. */
2661 chosen_section
= GHS_current_section_names
[(int) kind
];
2663 /* Otherwise, if this kind of section needs an explicit section
2664 attribute, then also attach one. */
2665 if (chosen_section
== NULL
)
2666 chosen_section
= GHS_default_section_names
[(int) kind
];
2670 /* Only set the section name if specified by a pragma, because
2671 otherwise it will force those variables to get allocated storage
2672 in this module, rather than by the linker. */
2673 DECL_SECTION_NAME (decl
) = chosen_section
;
2678 /* Construct a DISPOSE instruction that is the equivalent of
2679 the given RTX. We have already verified that this should
2683 construct_dispose_instruction (rtx op
)
2685 int count
= XVECLEN (op
, 0);
2687 unsigned long int mask
;
2689 static char buff
[ 100 ]; /* XXX */
2694 error ("bogus DISPOSE construction: %d", count
);
2698 /* Work out how many bytes to pop off the
2699 stack before retrieving registers. */
2700 gcc_assert (GET_CODE (XVECEXP (op
, 0, 1)) == SET
);
2701 gcc_assert (GET_CODE (SET_SRC (XVECEXP (op
, 0, 1))) == PLUS
);
2702 gcc_assert (GET_CODE (XEXP (SET_SRC (XVECEXP (op
, 0, 1)), 1)) == CONST_INT
);
2704 stack_bytes
= INTVAL (XEXP (SET_SRC (XVECEXP (op
, 0, 1)), 1));
2706 /* Each pop will remove 4 bytes from the stack.... */
2707 stack_bytes
-= (count
- 2) * 4;
2709 /* Make sure that the amount we are popping
2710 will fit into the DISPOSE instruction. */
2711 if (stack_bytes
> 128)
2713 error ("too much stack space to dispose of: %d", stack_bytes
);
2717 /* Now compute the bit mask of registers to push. */
2720 for (i
= 2; i
< count
; i
++)
2722 rtx vector_element
= XVECEXP (op
, 0, i
);
2724 gcc_assert (GET_CODE (vector_element
) == SET
);
2725 gcc_assert (GET_CODE (SET_DEST (vector_element
)) == REG
);
2726 gcc_assert (register_is_ok_for_epilogue (SET_DEST (vector_element
),
2729 if (REGNO (SET_DEST (vector_element
)) == 2)
2732 mask
|= 1 << REGNO (SET_DEST (vector_element
));
2735 if (! TARGET_DISABLE_CALLT
2736 && (use_callt
|| stack_bytes
== 0 || stack_bytes
== 16))
2740 sprintf (buff
, "callt ctoff(__callt_return_r2_r%d)", (mask
& (1 << 31)) ? 31 : 29);
2745 for (i
= 20; i
< 32; i
++)
2746 if (mask
& (1 << i
))
2750 sprintf (buff
, "callt ctoff(__callt_return_r31c)");
2752 sprintf (buff
, "callt ctoff(__callt_return_r%d_r%d%s)",
2753 i
, (mask
& (1 << 31)) ? 31 : 29, stack_bytes
? "c" : "");
2758 static char regs
[100]; /* XXX */
2761 /* Generate the DISPOSE instruction. Note we could just issue the
2762 bit mask as a number as the assembler can cope with this, but for
2763 the sake of our readers we turn it into a textual description. */
2767 for (i
= 20; i
< 32; i
++)
2769 if (mask
& (1 << i
))
2774 strcat (regs
, ", ");
2779 strcat (regs
, reg_names
[ first
]);
2781 for (i
++; i
< 32; i
++)
2782 if ((mask
& (1 << i
)) == 0)
2787 strcat (regs
, " - ");
2788 strcat (regs
, reg_names
[ i
- 1 ] );
2793 sprintf (buff
, "dispose %d {%s}, r31", stack_bytes
/ 4, regs
);
2799 /* Construct a PREPARE instruction that is the equivalent of
2800 the given RTL. We have already verified that this should
2804 construct_prepare_instruction (rtx op
)
2806 int count
= XVECLEN (op
, 0);
2808 unsigned long int mask
;
2810 static char buff
[ 100 ]; /* XXX */
2815 error ("bogus PREPEARE construction: %d", count
);
2819 /* Work out how many bytes to push onto
2820 the stack after storing the registers. */
2821 gcc_assert (GET_CODE (XVECEXP (op
, 0, 0)) == SET
);
2822 gcc_assert (GET_CODE (SET_SRC (XVECEXP (op
, 0, 0))) == PLUS
);
2823 gcc_assert (GET_CODE (XEXP (SET_SRC (XVECEXP (op
, 0, 0)), 1)) == CONST_INT
);
2825 stack_bytes
= INTVAL (XEXP (SET_SRC (XVECEXP (op
, 0, 0)), 1));
2827 /* Each push will put 4 bytes from the stack. */
2828 stack_bytes
+= (count
- 1) * 4;
2830 /* Make sure that the amount we are popping
2831 will fit into the DISPOSE instruction. */
2832 if (stack_bytes
< -128)
2834 error ("too much stack space to prepare: %d", stack_bytes
);
2838 /* Now compute the bit mask of registers to push. */
2840 for (i
= 1; i
< count
; i
++)
2842 rtx vector_element
= XVECEXP (op
, 0, i
);
2844 gcc_assert (GET_CODE (vector_element
) == SET
);
2845 gcc_assert (GET_CODE (SET_SRC (vector_element
)) == REG
);
2846 gcc_assert (register_is_ok_for_epilogue (SET_SRC (vector_element
),
2849 if (REGNO (SET_SRC (vector_element
)) == 2)
2852 mask
|= 1 << REGNO (SET_SRC (vector_element
));
2855 if ((! TARGET_DISABLE_CALLT
)
2856 && (use_callt
|| stack_bytes
== 0 || stack_bytes
== -16))
2860 sprintf (buff
, "callt ctoff(__callt_save_r2_r%d)", (mask
& (1 << 31)) ? 31 : 29 );
2864 for (i
= 20; i
< 32; i
++)
2865 if (mask
& (1 << i
))
2869 sprintf (buff
, "callt ctoff(__callt_save_r31c)");
2871 sprintf (buff
, "callt ctoff(__callt_save_r%d_r%d%s)",
2872 i
, (mask
& (1 << 31)) ? 31 : 29, stack_bytes
? "c" : "");
2876 static char regs
[100]; /* XXX */
2880 /* Generate the PREPARE instruction. Note we could just issue the
2881 bit mask as a number as the assembler can cope with this, but for
2882 the sake of our readers we turn it into a textual description. */
2886 for (i
= 20; i
< 32; i
++)
2888 if (mask
& (1 << i
))
2893 strcat (regs
, ", ");
2898 strcat (regs
, reg_names
[ first
]);
2900 for (i
++; i
< 32; i
++)
2901 if ((mask
& (1 << i
)) == 0)
2906 strcat (regs
, " - ");
2907 strcat (regs
, reg_names
[ i
- 1 ] );
2912 sprintf (buff
, "prepare {%s}, %d", regs
, (- stack_bytes
) / 4);
2918 /* Return an RTX indicating where the return address to the
2919 calling function can be found. */
2922 v850_return_addr (int count
)
2927 return get_hard_reg_initial_val (Pmode
, LINK_POINTER_REGNUM
);
2931 v850_select_section (tree exp
,
2932 int reloc ATTRIBUTE_UNUSED
,
2933 unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED
)
2935 if (TREE_CODE (exp
) == VAR_DECL
)
2938 if (!TREE_READONLY (exp
)
2939 || TREE_SIDE_EFFECTS (exp
)
2940 || !DECL_INITIAL (exp
)
2941 || (DECL_INITIAL (exp
) != error_mark_node
2942 && !TREE_CONSTANT (DECL_INITIAL (exp
))))
2947 switch (v850_get_data_area (exp
))
2969 readonly_data_section ();
2976 readonly_data_section ();
2979 /* Worker function for TARGET_RETURN_IN_MEMORY. */
2982 v850_return_in_memory (tree type
, tree fntype ATTRIBUTE_UNUSED
)
2984 /* Return values > 8 bytes in length in memory. */
2985 return int_size_in_bytes (type
) > 8 || TYPE_MODE (type
) == BLKmode
;
2988 /* Worker function for TARGET_SETUP_INCOMING_VARARGS. */
2991 v850_setup_incoming_varargs (CUMULATIVE_ARGS
*ca
,
2992 enum machine_mode mode ATTRIBUTE_UNUSED
,
2993 tree type ATTRIBUTE_UNUSED
,
2994 int *pretend_arg_size ATTRIBUTE_UNUSED
,
2995 int second_time ATTRIBUTE_UNUSED
)
2997 ca
->anonymous_args
= (!TARGET_GHS
? 1 : 0);