m32r.cc revision 1.1 1 1.1 mrg /* Subroutines used for code generation on the Renesas M32R cpu.
2 1.1 mrg Copyright (C) 1996-2022 Free Software Foundation, Inc.
3 1.1 mrg
4 1.1 mrg This file is part of GCC.
5 1.1 mrg
6 1.1 mrg GCC is free software; you can redistribute it and/or modify it
7 1.1 mrg under the terms of the GNU General Public License as published
8 1.1 mrg by the Free Software Foundation; either version 3, or (at your
9 1.1 mrg option) any later version.
10 1.1 mrg
11 1.1 mrg GCC is distributed in the hope that it will be useful, but WITHOUT
12 1.1 mrg ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13 1.1 mrg or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
14 1.1 mrg License for more details.
15 1.1 mrg
16 1.1 mrg You should have received a copy of the GNU General Public License
17 1.1 mrg along with GCC; see the file COPYING3. If not see
18 1.1 mrg <http://www.gnu.org/licenses/>. */
19 1.1 mrg
20 1.1 mrg #define IN_TARGET_CODE 1
21 1.1 mrg
22 1.1 mrg #include "config.h"
23 1.1 mrg #include "system.h"
24 1.1 mrg #include "coretypes.h"
25 1.1 mrg #include "backend.h"
26 1.1 mrg #include "target.h"
27 1.1 mrg #include "rtl.h"
28 1.1 mrg #include "tree.h"
29 1.1 mrg #include "df.h"
30 1.1 mrg #include "memmodel.h"
31 1.1 mrg #include "tm_p.h"
32 1.1 mrg #include "stringpool.h"
33 1.1 mrg #include "attribs.h"
34 1.1 mrg #include "insn-config.h"
35 1.1 mrg #include "emit-rtl.h"
36 1.1 mrg #include "recog.h"
37 1.1 mrg #include "diagnostic-core.h"
38 1.1 mrg #include "alias.h"
39 1.1 mrg #include "stor-layout.h"
40 1.1 mrg #include "varasm.h"
41 1.1 mrg #include "calls.h"
42 1.1 mrg #include "output.h"
43 1.1 mrg #include "insn-attr.h"
44 1.1 mrg #include "explow.h"
45 1.1 mrg #include "expr.h"
46 1.1 mrg #include "tm-constrs.h"
47 1.1 mrg #include "builtins.h"
48 1.1 mrg #include "opts.h"
49 1.1 mrg
50 1.1 mrg /* This file should be included last. */
51 1.1 mrg #include "target-def.h"
52 1.1 mrg
53 1.1 mrg /* Array of valid operand punctuation characters. */
54 1.1 mrg static char m32r_punct_chars[256];
55 1.1 mrg
56 1.1 mrg /* Machine-specific symbol_ref flags. */
57 1.1 mrg #define SYMBOL_FLAG_MODEL_SHIFT SYMBOL_FLAG_MACH_DEP_SHIFT
58 1.1 mrg #define SYMBOL_REF_MODEL(X) \
59 1.1 mrg ((enum m32r_model) ((SYMBOL_REF_FLAGS (X) >> SYMBOL_FLAG_MODEL_SHIFT) & 3))
60 1.1 mrg
61 1.1 mrg /* For string literals, etc. */
62 1.1 mrg #define LIT_NAME_P(NAME) ((NAME)[0] == '*' && (NAME)[1] == '.')
63 1.1 mrg
64 1.1 mrg /* Forward declaration. */
65 1.1 mrg static void m32r_option_override (void);
66 1.1 mrg static void init_reg_tables (void);
67 1.1 mrg static void block_move_call (rtx, rtx, rtx);
68 1.1 mrg static int m32r_is_insn (rtx);
69 1.1 mrg static bool m32r_legitimate_address_p (machine_mode, rtx, bool);
70 1.1 mrg static rtx m32r_legitimize_address (rtx, rtx, machine_mode);
71 1.1 mrg static bool m32r_mode_dependent_address_p (const_rtx, addr_space_t);
72 1.1 mrg static tree m32r_handle_model_attribute (tree *, tree, tree, int, bool *);
73 1.1 mrg static void m32r_print_operand (FILE *, rtx, int);
74 1.1 mrg static void m32r_print_operand_address (FILE *, machine_mode, rtx);
75 1.1 mrg static bool m32r_print_operand_punct_valid_p (unsigned char code);
76 1.1 mrg static void m32r_output_function_prologue (FILE *);
77 1.1 mrg static void m32r_output_function_epilogue (FILE *);
78 1.1 mrg
79 1.1 mrg static void m32r_file_start (void);
80 1.1 mrg
81 1.1 mrg static int m32r_adjust_priority (rtx_insn *, int);
82 1.1 mrg static int m32r_issue_rate (void);
83 1.1 mrg
84 1.1 mrg static void m32r_encode_section_info (tree, rtx, int);
85 1.1 mrg static bool m32r_in_small_data_p (const_tree);
86 1.1 mrg static bool m32r_return_in_memory (const_tree, const_tree);
87 1.1 mrg static rtx m32r_function_value (const_tree, const_tree, bool);
88 1.1 mrg static rtx m32r_libcall_value (machine_mode, const_rtx);
89 1.1 mrg static bool m32r_function_value_regno_p (const unsigned int);
90 1.1 mrg static void m32r_setup_incoming_varargs (cumulative_args_t,
91 1.1 mrg const function_arg_info &,
92 1.1 mrg int *, int);
93 1.1 mrg static void init_idents (void);
94 1.1 mrg static bool m32r_rtx_costs (rtx, machine_mode, int, int, int *, bool speed);
95 1.1 mrg static int m32r_memory_move_cost (machine_mode, reg_class_t, bool);
96 1.1 mrg static bool m32r_pass_by_reference (cumulative_args_t,
97 1.1 mrg const function_arg_info &arg);
98 1.1 mrg static int m32r_arg_partial_bytes (cumulative_args_t,
99 1.1 mrg const function_arg_info &);
100 1.1 mrg static rtx m32r_function_arg (cumulative_args_t, const function_arg_info &);
101 1.1 mrg static void m32r_function_arg_advance (cumulative_args_t,
102 1.1 mrg const function_arg_info &);
103 1.1 mrg static bool m32r_can_eliminate (const int, const int);
104 1.1 mrg static void m32r_conditional_register_usage (void);
105 1.1 mrg static void m32r_trampoline_init (rtx, tree, rtx);
106 1.1 mrg static bool m32r_legitimate_constant_p (machine_mode, rtx);
107 1.1 mrg static bool m32r_attribute_identifier (const_tree);
108 1.1 mrg static bool m32r_hard_regno_mode_ok (unsigned int, machine_mode);
109 1.1 mrg static bool m32r_modes_tieable_p (machine_mode, machine_mode);
110 1.1 mrg static HOST_WIDE_INT m32r_starting_frame_offset (void);
111 1.1 mrg
112 1.1 mrg /* M32R specific attributes. */
114 1.1 mrg
115 1.1 mrg static const struct attribute_spec m32r_attribute_table[] =
116 1.1 mrg {
117 1.1 mrg /* { name, min_len, max_len, decl_req, type_req, fn_type_req,
118 1.1 mrg affects_type_identity, handler, exclude } */
119 1.1 mrg { "interrupt", 0, 0, true, false, false, false, NULL, NULL },
120 1.1 mrg { "model", 1, 1, true, false, false, false, m32r_handle_model_attribute,
121 1.1 mrg NULL },
122 1.1 mrg { NULL, 0, 0, false, false, false, false, NULL, NULL }
123 1.1 mrg };
124 1.1 mrg
125 1.1 mrg /* Initialize the GCC target structure. */
127 1.1 mrg #undef TARGET_ATTRIBUTE_TABLE
128 1.1 mrg #define TARGET_ATTRIBUTE_TABLE m32r_attribute_table
129 1.1 mrg #undef TARGET_ATTRIBUTE_TAKES_IDENTIFIER_P
130 1.1 mrg #define TARGET_ATTRIBUTE_TAKES_IDENTIFIER_P m32r_attribute_identifier
131 1.1 mrg
132 1.1 mrg #undef TARGET_LRA_P
133 1.1 mrg #define TARGET_LRA_P hook_bool_void_false
134 1.1 mrg
135 1.1 mrg #undef TARGET_LEGITIMATE_ADDRESS_P
136 1.1 mrg #define TARGET_LEGITIMATE_ADDRESS_P m32r_legitimate_address_p
137 1.1 mrg #undef TARGET_LEGITIMIZE_ADDRESS
138 1.1 mrg #define TARGET_LEGITIMIZE_ADDRESS m32r_legitimize_address
139 1.1 mrg #undef TARGET_MODE_DEPENDENT_ADDRESS_P
140 1.1 mrg #define TARGET_MODE_DEPENDENT_ADDRESS_P m32r_mode_dependent_address_p
141 1.1 mrg
142 1.1 mrg #undef TARGET_ASM_ALIGNED_HI_OP
143 1.1 mrg #define TARGET_ASM_ALIGNED_HI_OP "\t.hword\t"
144 1.1 mrg #undef TARGET_ASM_ALIGNED_SI_OP
145 1.1 mrg #define TARGET_ASM_ALIGNED_SI_OP "\t.word\t"
146 1.1 mrg
147 1.1 mrg #undef TARGET_PRINT_OPERAND
148 1.1 mrg #define TARGET_PRINT_OPERAND m32r_print_operand
149 1.1 mrg #undef TARGET_PRINT_OPERAND_ADDRESS
150 1.1 mrg #define TARGET_PRINT_OPERAND_ADDRESS m32r_print_operand_address
151 1.1 mrg #undef TARGET_PRINT_OPERAND_PUNCT_VALID_P
152 1.1 mrg #define TARGET_PRINT_OPERAND_PUNCT_VALID_P m32r_print_operand_punct_valid_p
153 1.1 mrg
154 1.1 mrg #undef TARGET_ASM_FUNCTION_PROLOGUE
155 1.1 mrg #define TARGET_ASM_FUNCTION_PROLOGUE m32r_output_function_prologue
156 1.1 mrg #undef TARGET_ASM_FUNCTION_EPILOGUE
157 1.1 mrg #define TARGET_ASM_FUNCTION_EPILOGUE m32r_output_function_epilogue
158 1.1 mrg
159 1.1 mrg #undef TARGET_ASM_FILE_START
160 1.1 mrg #define TARGET_ASM_FILE_START m32r_file_start
161 1.1 mrg
162 1.1 mrg #undef TARGET_SCHED_ADJUST_PRIORITY
163 1.1 mrg #define TARGET_SCHED_ADJUST_PRIORITY m32r_adjust_priority
164 1.1 mrg #undef TARGET_SCHED_ISSUE_RATE
165 1.1 mrg #define TARGET_SCHED_ISSUE_RATE m32r_issue_rate
166 1.1 mrg
167 1.1 mrg #undef TARGET_OPTION_OVERRIDE
168 1.1 mrg #define TARGET_OPTION_OVERRIDE m32r_option_override
169 1.1 mrg
170 1.1 mrg #undef TARGET_ENCODE_SECTION_INFO
171 1.1 mrg #define TARGET_ENCODE_SECTION_INFO m32r_encode_section_info
172 1.1 mrg #undef TARGET_IN_SMALL_DATA_P
173 1.1 mrg #define TARGET_IN_SMALL_DATA_P m32r_in_small_data_p
174 1.1 mrg
175 1.1 mrg
176 1.1 mrg #undef TARGET_MEMORY_MOVE_COST
177 1.1 mrg #define TARGET_MEMORY_MOVE_COST m32r_memory_move_cost
178 1.1 mrg #undef TARGET_RTX_COSTS
179 1.1 mrg #define TARGET_RTX_COSTS m32r_rtx_costs
180 1.1 mrg #undef TARGET_ADDRESS_COST
181 1.1 mrg #define TARGET_ADDRESS_COST hook_int_rtx_mode_as_bool_0
182 1.1 mrg
183 1.1 mrg #undef TARGET_PROMOTE_PROTOTYPES
184 1.1 mrg #define TARGET_PROMOTE_PROTOTYPES hook_bool_const_tree_true
185 1.1 mrg #undef TARGET_RETURN_IN_MEMORY
186 1.1 mrg #define TARGET_RETURN_IN_MEMORY m32r_return_in_memory
187 1.1 mrg
188 1.1 mrg #undef TARGET_FUNCTION_VALUE
189 1.1 mrg #define TARGET_FUNCTION_VALUE m32r_function_value
190 1.1 mrg #undef TARGET_LIBCALL_VALUE
191 1.1 mrg #define TARGET_LIBCALL_VALUE m32r_libcall_value
192 1.1 mrg #undef TARGET_FUNCTION_VALUE_REGNO_P
193 1.1 mrg #define TARGET_FUNCTION_VALUE_REGNO_P m32r_function_value_regno_p
194 1.1 mrg
195 1.1 mrg #undef TARGET_SETUP_INCOMING_VARARGS
196 1.1 mrg #define TARGET_SETUP_INCOMING_VARARGS m32r_setup_incoming_varargs
197 1.1 mrg #undef TARGET_MUST_PASS_IN_STACK
198 1.1 mrg #define TARGET_MUST_PASS_IN_STACK must_pass_in_stack_var_size
199 1.1 mrg #undef TARGET_PASS_BY_REFERENCE
200 1.1 mrg #define TARGET_PASS_BY_REFERENCE m32r_pass_by_reference
201 1.1 mrg #undef TARGET_ARG_PARTIAL_BYTES
202 1.1 mrg #define TARGET_ARG_PARTIAL_BYTES m32r_arg_partial_bytes
203 1.1 mrg #undef TARGET_FUNCTION_ARG
204 1.1 mrg #define TARGET_FUNCTION_ARG m32r_function_arg
205 1.1 mrg #undef TARGET_FUNCTION_ARG_ADVANCE
206 1.1 mrg #define TARGET_FUNCTION_ARG_ADVANCE m32r_function_arg_advance
207 1.1 mrg
208 1.1 mrg #undef TARGET_CAN_ELIMINATE
209 1.1 mrg #define TARGET_CAN_ELIMINATE m32r_can_eliminate
210 1.1 mrg
211 1.1 mrg #undef TARGET_CONDITIONAL_REGISTER_USAGE
212 1.1 mrg #define TARGET_CONDITIONAL_REGISTER_USAGE m32r_conditional_register_usage
213 1.1 mrg
214 1.1 mrg #undef TARGET_TRAMPOLINE_INIT
215 1.1 mrg #define TARGET_TRAMPOLINE_INIT m32r_trampoline_init
216 1.1 mrg
217 1.1 mrg #undef TARGET_LEGITIMATE_CONSTANT_P
218 1.1 mrg #define TARGET_LEGITIMATE_CONSTANT_P m32r_legitimate_constant_p
219 1.1 mrg
220 1.1 mrg #undef TARGET_HARD_REGNO_MODE_OK
221 1.1 mrg #define TARGET_HARD_REGNO_MODE_OK m32r_hard_regno_mode_ok
222 1.1 mrg
223 1.1 mrg #undef TARGET_MODES_TIEABLE_P
224 1.1 mrg #define TARGET_MODES_TIEABLE_P m32r_modes_tieable_p
225 1.1 mrg
226 1.1 mrg #undef TARGET_CONSTANT_ALIGNMENT
227 1.1 mrg #define TARGET_CONSTANT_ALIGNMENT constant_alignment_word_strings
228 1.1 mrg
229 1.1 mrg #undef TARGET_STARTING_FRAME_OFFSET
230 1.1 mrg #define TARGET_STARTING_FRAME_OFFSET m32r_starting_frame_offset
231 1.1 mrg
232 1.1 mrg #undef TARGET_HAVE_SPECULATION_SAFE_VALUE
233 1.1 mrg #define TARGET_HAVE_SPECULATION_SAFE_VALUE speculation_safe_value_not_needed
234 1.1 mrg
235 1.1 mrg struct gcc_target targetm = TARGET_INITIALIZER;
236 1.1 mrg
237 1.1 mrg /* Called by m32r_option_override to initialize various things. */
239 1.1 mrg
240 1.1 mrg void
241 1.1 mrg m32r_init (void)
242 1.1 mrg {
243 1.1 mrg init_reg_tables ();
244 1.1 mrg
245 1.1 mrg /* Initialize array for TARGET_PRINT_OPERAND_PUNCT_VALID_P. */
246 1.1 mrg memset (m32r_punct_chars, 0, sizeof (m32r_punct_chars));
247 1.1 mrg m32r_punct_chars['#'] = 1;
248 1.1 mrg m32r_punct_chars['@'] = 1; /* ??? no longer used */
249 1.1 mrg
250 1.1 mrg /* Provide default value if not specified. */
251 1.1 mrg if (!OPTION_SET_P (g_switch_value))
252 1.1 mrg g_switch_value = SDATA_DEFAULT_SIZE;
253 1.1 mrg }
254 1.1 mrg
255 1.1 mrg static void
256 1.1 mrg m32r_option_override (void)
257 1.1 mrg {
258 1.1 mrg /* These need to be done at start up.
259 1.1 mrg It's convenient to do them here. */
260 1.1 mrg m32r_init ();
261 1.1 mrg SUBTARGET_OVERRIDE_OPTIONS;
262 1.1 mrg }
263 1.1 mrg
264 1.1 mrg /* Vectors to keep interesting information about registers where it can easily
265 1.1 mrg be got. We use to use the actual mode value as the bit number, but there
266 1.1 mrg is (or may be) more than 32 modes now. Instead we use two tables: one
267 1.1 mrg indexed by hard register number, and one indexed by mode. */
268 1.1 mrg
269 1.1 mrg /* The purpose of m32r_mode_class is to shrink the range of modes so that
270 1.1 mrg they all fit (as bit numbers) in a 32-bit word (again). Each real mode is
271 1.1 mrg mapped into one m32r_mode_class mode. */
272 1.1 mrg
273 1.1 mrg enum m32r_mode_class
274 1.1 mrg {
275 1.1 mrg C_MODE,
276 1.1 mrg S_MODE, D_MODE, T_MODE, O_MODE,
277 1.1 mrg SF_MODE, DF_MODE, TF_MODE, OF_MODE, A_MODE
278 1.1 mrg };
279 1.1 mrg
280 1.1 mrg /* Modes for condition codes. */
281 1.1 mrg #define C_MODES (1 << (int) C_MODE)
282 1.1 mrg
283 1.1 mrg /* Modes for single-word and smaller quantities. */
284 1.1 mrg #define S_MODES ((1 << (int) S_MODE) | (1 << (int) SF_MODE))
285 1.1 mrg
286 1.1 mrg /* Modes for double-word and smaller quantities. */
287 1.1 mrg #define D_MODES (S_MODES | (1 << (int) D_MODE) | (1 << DF_MODE))
288 1.1 mrg
289 1.1 mrg /* Modes for quad-word and smaller quantities. */
290 1.1 mrg #define T_MODES (D_MODES | (1 << (int) T_MODE) | (1 << (int) TF_MODE))
291 1.1 mrg
292 1.1 mrg /* Modes for accumulators. */
293 1.1 mrg #define A_MODES (1 << (int) A_MODE)
294 1.1 mrg
295 1.1 mrg /* Value is 1 if register/mode pair is acceptable on arc. */
296 1.1 mrg
297 1.1 mrg static const unsigned int m32r_hard_regno_modes[FIRST_PSEUDO_REGISTER] =
298 1.1 mrg {
299 1.1 mrg T_MODES, T_MODES, T_MODES, T_MODES, T_MODES, T_MODES, T_MODES, T_MODES,
300 1.1 mrg T_MODES, T_MODES, T_MODES, T_MODES, T_MODES, S_MODES, S_MODES, S_MODES,
301 1.1 mrg S_MODES, C_MODES, A_MODES, A_MODES
302 1.1 mrg };
303 1.1 mrg
304 1.1 mrg static unsigned int m32r_mode_class [NUM_MACHINE_MODES];
305 1.1 mrg
306 1.1 mrg enum reg_class m32r_regno_reg_class[FIRST_PSEUDO_REGISTER];
307 1.1 mrg
308 1.1 mrg static void
309 1.1 mrg init_reg_tables (void)
310 1.1 mrg {
311 1.1 mrg int i;
312 1.1 mrg
313 1.1 mrg for (i = 0; i < NUM_MACHINE_MODES; i++)
314 1.1 mrg {
315 1.1 mrg machine_mode m = (machine_mode) i;
316 1.1 mrg
317 1.1 mrg switch (GET_MODE_CLASS (m))
318 1.1 mrg {
319 1.1 mrg case MODE_INT:
320 1.1 mrg case MODE_PARTIAL_INT:
321 1.1 mrg case MODE_COMPLEX_INT:
322 1.1 mrg if (GET_MODE_SIZE (m) <= 4)
323 1.1 mrg m32r_mode_class[i] = 1 << (int) S_MODE;
324 1.1 mrg else if (GET_MODE_SIZE (m) == 8)
325 1.1 mrg m32r_mode_class[i] = 1 << (int) D_MODE;
326 1.1 mrg else if (GET_MODE_SIZE (m) == 16)
327 1.1 mrg m32r_mode_class[i] = 1 << (int) T_MODE;
328 1.1 mrg else if (GET_MODE_SIZE (m) == 32)
329 1.1 mrg m32r_mode_class[i] = 1 << (int) O_MODE;
330 1.1 mrg else
331 1.1 mrg m32r_mode_class[i] = 0;
332 1.1 mrg break;
333 1.1 mrg case MODE_FLOAT:
334 1.1 mrg case MODE_COMPLEX_FLOAT:
335 1.1 mrg if (GET_MODE_SIZE (m) <= 4)
336 1.1 mrg m32r_mode_class[i] = 1 << (int) SF_MODE;
337 1.1 mrg else if (GET_MODE_SIZE (m) == 8)
338 1.1 mrg m32r_mode_class[i] = 1 << (int) DF_MODE;
339 1.1 mrg else if (GET_MODE_SIZE (m) == 16)
340 1.1 mrg m32r_mode_class[i] = 1 << (int) TF_MODE;
341 1.1 mrg else if (GET_MODE_SIZE (m) == 32)
342 1.1 mrg m32r_mode_class[i] = 1 << (int) OF_MODE;
343 1.1 mrg else
344 1.1 mrg m32r_mode_class[i] = 0;
345 1.1 mrg break;
346 1.1 mrg case MODE_CC:
347 1.1 mrg m32r_mode_class[i] = 1 << (int) C_MODE;
348 1.1 mrg break;
349 1.1 mrg default:
350 1.1 mrg m32r_mode_class[i] = 0;
351 1.1 mrg break;
352 1.1 mrg }
353 1.1 mrg }
354 1.1 mrg
355 1.1 mrg for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
356 1.1 mrg {
357 1.1 mrg if (GPR_P (i))
358 1.1 mrg m32r_regno_reg_class[i] = GENERAL_REGS;
359 1.1 mrg else if (i == ARG_POINTER_REGNUM)
360 1.1 mrg m32r_regno_reg_class[i] = GENERAL_REGS;
361 1.1 mrg else
362 1.1 mrg m32r_regno_reg_class[i] = NO_REGS;
363 1.1 mrg }
364 1.1 mrg }
365 1.1 mrg
366 1.1 mrg /* M32R specific attribute support.
368 1.1 mrg
369 1.1 mrg interrupt - for interrupt functions
370 1.1 mrg
371 1.1 mrg model - select code model used to access object
372 1.1 mrg
373 1.1 mrg small: addresses use 24 bits, use bl to make calls
374 1.1 mrg medium: addresses use 32 bits, use bl to make calls
375 1.1 mrg large: addresses use 32 bits, use seth/add3/jl to make calls
376 1.1 mrg
377 1.1 mrg Grep for MODEL in m32r.h for more info. */
378 1.1 mrg
379 1.1 mrg static tree small_ident1;
380 1.1 mrg static tree small_ident2;
381 1.1 mrg static tree medium_ident1;
382 1.1 mrg static tree medium_ident2;
383 1.1 mrg static tree large_ident1;
384 1.1 mrg static tree large_ident2;
385 1.1 mrg
386 1.1 mrg static void
387 1.1 mrg init_idents (void)
388 1.1 mrg {
389 1.1 mrg if (small_ident1 == 0)
390 1.1 mrg {
391 1.1 mrg small_ident1 = get_identifier ("small");
392 1.1 mrg small_ident2 = get_identifier ("__small__");
393 1.1 mrg medium_ident1 = get_identifier ("medium");
394 1.1 mrg medium_ident2 = get_identifier ("__medium__");
395 1.1 mrg large_ident1 = get_identifier ("large");
396 1.1 mrg large_ident2 = get_identifier ("__large__");
397 1.1 mrg }
398 1.1 mrg }
399 1.1 mrg
400 1.1 mrg /* Handle an "model" attribute; arguments as in
401 1.1 mrg struct attribute_spec.handler. */
402 1.1 mrg static tree
403 1.1 mrg m32r_handle_model_attribute (tree *node ATTRIBUTE_UNUSED, tree name,
404 1.1 mrg tree args, int flags ATTRIBUTE_UNUSED,
405 1.1 mrg bool *no_add_attrs)
406 1.1 mrg {
407 1.1 mrg tree arg;
408 1.1 mrg
409 1.1 mrg init_idents ();
410 1.1 mrg arg = TREE_VALUE (args);
411 1.1 mrg
412 1.1 mrg if (arg != small_ident1
413 1.1 mrg && arg != small_ident2
414 1.1 mrg && arg != medium_ident1
415 1.1 mrg && arg != medium_ident2
416 1.1 mrg && arg != large_ident1
417 1.1 mrg && arg != large_ident2)
418 1.1 mrg {
419 1.1 mrg warning (OPT_Wattributes, "invalid argument of %qs attribute",
420 1.1 mrg IDENTIFIER_POINTER (name));
421 1.1 mrg *no_add_attrs = true;
422 1.1 mrg }
423 1.1 mrg
424 1.1 mrg return NULL_TREE;
425 1.1 mrg }
426 1.1 mrg
427 1.1 mrg static bool
428 1.1 mrg m32r_attribute_identifier (const_tree name)
429 1.1 mrg {
430 1.1 mrg return strcmp (IDENTIFIER_POINTER (name), "model") == 0
431 1.1 mrg || strcmp (IDENTIFIER_POINTER (name), "__model__") == 0;
432 1.1 mrg }
433 1.1 mrg
434 1.1 mrg /* Encode section information of DECL, which is either a VAR_DECL,
436 1.1 mrg FUNCTION_DECL, STRING_CST, CONSTRUCTOR, or ???.
437 1.1 mrg
438 1.1 mrg For the M32R we want to record:
439 1.1 mrg
440 1.1 mrg - whether the object lives in .sdata/.sbss.
441 1.1 mrg - what code model should be used to access the object
442 1.1 mrg */
443 1.1 mrg
444 1.1 mrg static void
445 1.1 mrg m32r_encode_section_info (tree decl, rtx rtl, int first)
446 1.1 mrg {
447 1.1 mrg int extra_flags = 0;
448 1.1 mrg tree model_attr;
449 1.1 mrg enum m32r_model model;
450 1.1 mrg
451 1.1 mrg default_encode_section_info (decl, rtl, first);
452 1.1 mrg
453 1.1 mrg if (!DECL_P (decl))
454 1.1 mrg return;
455 1.1 mrg
456 1.1 mrg model_attr = lookup_attribute ("model", DECL_ATTRIBUTES (decl));
457 1.1 mrg if (model_attr)
458 1.1 mrg {
459 1.1 mrg tree id;
460 1.1 mrg
461 1.1 mrg init_idents ();
462 1.1 mrg
463 1.1 mrg id = TREE_VALUE (TREE_VALUE (model_attr));
464 1.1 mrg
465 1.1 mrg if (id == small_ident1 || id == small_ident2)
466 1.1 mrg model = M32R_MODEL_SMALL;
467 1.1 mrg else if (id == medium_ident1 || id == medium_ident2)
468 1.1 mrg model = M32R_MODEL_MEDIUM;
469 1.1 mrg else if (id == large_ident1 || id == large_ident2)
470 1.1 mrg model = M32R_MODEL_LARGE;
471 1.1 mrg else
472 1.1 mrg gcc_unreachable (); /* shouldn't happen */
473 1.1 mrg }
474 1.1 mrg else
475 1.1 mrg {
476 1.1 mrg if (TARGET_MODEL_SMALL)
477 1.1 mrg model = M32R_MODEL_SMALL;
478 1.1 mrg else if (TARGET_MODEL_MEDIUM)
479 1.1 mrg model = M32R_MODEL_MEDIUM;
480 1.1 mrg else if (TARGET_MODEL_LARGE)
481 1.1 mrg model = M32R_MODEL_LARGE;
482 1.1 mrg else
483 1.1 mrg gcc_unreachable (); /* shouldn't happen */
484 1.1 mrg }
485 1.1 mrg extra_flags |= model << SYMBOL_FLAG_MODEL_SHIFT;
486 1.1 mrg
487 1.1 mrg if (extra_flags)
488 1.1 mrg SYMBOL_REF_FLAGS (XEXP (rtl, 0)) |= extra_flags;
489 1.1 mrg }
490 1.1 mrg
491 1.1 mrg /* Only mark the object as being small data area addressable if
492 1.1 mrg it hasn't been explicitly marked with a code model.
493 1.1 mrg
494 1.1 mrg The user can explicitly put an object in the small data area with the
495 1.1 mrg section attribute. If the object is in sdata/sbss and marked with a
496 1.1 mrg code model do both [put the object in .sdata and mark it as being
497 1.1 mrg addressed with a specific code model - don't mark it as being addressed
498 1.1 mrg with an SDA reloc though]. This is ok and might be useful at times. If
499 1.1 mrg the object doesn't fit the linker will give an error. */
500 1.1 mrg
501 1.1 mrg static bool
502 1.1 mrg m32r_in_small_data_p (const_tree decl)
503 1.1 mrg {
504 1.1 mrg const char *section;
505 1.1 mrg
506 1.1 mrg if (TREE_CODE (decl) != VAR_DECL)
507 1.1 mrg return false;
508 1.1 mrg
509 1.1 mrg if (lookup_attribute ("model", DECL_ATTRIBUTES (decl)))
510 1.1 mrg return false;
511 1.1 mrg
512 1.1 mrg section = DECL_SECTION_NAME (decl);
513 1.1 mrg if (section)
514 1.1 mrg {
515 1.1 mrg if (strcmp (section, ".sdata") == 0 || strcmp (section, ".sbss") == 0)
516 1.1 mrg return true;
517 1.1 mrg }
518 1.1 mrg else
519 1.1 mrg {
520 1.1 mrg if (! TREE_READONLY (decl) && ! TARGET_SDATA_NONE)
521 1.1 mrg {
522 1.1 mrg int size = int_size_in_bytes (TREE_TYPE (decl));
523 1.1 mrg
524 1.1 mrg if (size > 0 && size <= g_switch_value)
525 1.1 mrg return true;
526 1.1 mrg }
527 1.1 mrg }
528 1.1 mrg
529 1.1 mrg return false;
530 1.1 mrg }
531 1.1 mrg
532 1.1 mrg /* Do anything needed before RTL is emitted for each function. */
533 1.1 mrg
534 1.1 mrg void
535 1.1 mrg m32r_init_expanders (void)
536 1.1 mrg {
537 1.1 mrg /* ??? At one point there was code here. The function is left in
538 1.1 mrg to make it easy to experiment. */
539 1.1 mrg }
540 1.1 mrg
541 1.1 mrg bool
543 1.1 mrg call_operand (rtx op, machine_mode mode)
544 1.1 mrg {
545 1.1 mrg if (!MEM_P (op))
546 1.1 mrg return 0;
547 1.1 mrg op = XEXP (op, 0);
548 1.1 mrg return call_address_operand (op, mode);
549 1.1 mrg }
550 1.1 mrg
551 1.1 mrg /* Return 1 if OP is a reference to an object in .sdata/.sbss. */
552 1.1 mrg
553 1.1 mrg bool
554 1.1 mrg small_data_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
555 1.1 mrg {
556 1.1 mrg if (! TARGET_SDATA_USE)
557 1.1 mrg return 0;
558 1.1 mrg
559 1.1 mrg if (GET_CODE (op) == SYMBOL_REF)
560 1.1 mrg return SYMBOL_REF_SMALL_P (op);
561 1.1 mrg
562 1.1 mrg if (GET_CODE (op) == CONST
563 1.1 mrg && GET_CODE (XEXP (op, 0)) == PLUS
564 1.1 mrg && GET_CODE (XEXP (XEXP (op, 0), 0)) == SYMBOL_REF
565 1.1 mrg && satisfies_constraint_J (XEXP (XEXP (op, 0), 1)))
566 1.1 mrg return SYMBOL_REF_SMALL_P (XEXP (XEXP (op, 0), 0));
567 1.1 mrg
568 1.1 mrg return 0;
569 1.1 mrg }
570 1.1 mrg
571 1.1 mrg /* Return 1 if OP is a symbol that can use 24-bit addressing. */
572 1.1 mrg
573 1.1 mrg int
574 1.1 mrg addr24_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
575 1.1 mrg {
576 1.1 mrg rtx sym;
577 1.1 mrg
578 1.1 mrg if (flag_pic)
579 1.1 mrg return 0;
580 1.1 mrg
581 1.1 mrg if (GET_CODE (op) == LABEL_REF)
582 1.1 mrg return TARGET_ADDR24;
583 1.1 mrg
584 1.1 mrg if (GET_CODE (op) == SYMBOL_REF)
585 1.1 mrg sym = op;
586 1.1 mrg else if (GET_CODE (op) == CONST
587 1.1 mrg && GET_CODE (XEXP (op, 0)) == PLUS
588 1.1 mrg && GET_CODE (XEXP (XEXP (op, 0), 0)) == SYMBOL_REF
589 1.1 mrg && satisfies_constraint_M (XEXP (XEXP (op, 0), 1)))
590 1.1 mrg sym = XEXP (XEXP (op, 0), 0);
591 1.1 mrg else
592 1.1 mrg return 0;
593 1.1 mrg
594 1.1 mrg if (SYMBOL_REF_MODEL (sym) == M32R_MODEL_SMALL)
595 1.1 mrg return 1;
596 1.1 mrg
597 1.1 mrg if (TARGET_ADDR24
598 1.1 mrg && (CONSTANT_POOL_ADDRESS_P (sym)
599 1.1 mrg || LIT_NAME_P (XSTR (sym, 0))))
600 1.1 mrg return 1;
601 1.1 mrg
602 1.1 mrg return 0;
603 1.1 mrg }
604 1.1 mrg
605 1.1 mrg /* Return 1 if OP is a symbol that needs 32-bit addressing. */
606 1.1 mrg
607 1.1 mrg int
608 1.1 mrg addr32_operand (rtx op, machine_mode mode)
609 1.1 mrg {
610 1.1 mrg rtx sym;
611 1.1 mrg
612 1.1 mrg if (GET_CODE (op) == LABEL_REF)
613 1.1 mrg return TARGET_ADDR32;
614 1.1 mrg
615 1.1 mrg if (GET_CODE (op) == SYMBOL_REF)
616 1.1 mrg sym = op;
617 1.1 mrg else if (GET_CODE (op) == CONST
618 1.1 mrg && GET_CODE (XEXP (op, 0)) == PLUS
619 1.1 mrg && GET_CODE (XEXP (XEXP (op, 0), 0)) == SYMBOL_REF
620 1.1 mrg && CONST_INT_P (XEXP (XEXP (op, 0), 1))
621 1.1 mrg && ! flag_pic)
622 1.1 mrg sym = XEXP (XEXP (op, 0), 0);
623 1.1 mrg else
624 1.1 mrg return 0;
625 1.1 mrg
626 1.1 mrg return (! addr24_operand (sym, mode)
627 1.1 mrg && ! small_data_operand (sym, mode));
628 1.1 mrg }
629 1.1 mrg
630 1.1 mrg /* Return 1 if OP is a function that can be called with the `bl' insn. */
631 1.1 mrg
632 1.1 mrg int
633 1.1 mrg call26_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
634 1.1 mrg {
635 1.1 mrg if (flag_pic)
636 1.1 mrg return 1;
637 1.1 mrg
638 1.1 mrg if (GET_CODE (op) == SYMBOL_REF)
639 1.1 mrg return SYMBOL_REF_MODEL (op) != M32R_MODEL_LARGE;
640 1.1 mrg
641 1.1 mrg return TARGET_CALL26;
642 1.1 mrg }
643 1.1 mrg
644 1.1 mrg /* Return 1 if OP is a DImode const we want to handle inline.
645 1.1 mrg This must match the code in the movdi pattern.
646 1.1 mrg It is used by the 'G' constraint. */
647 1.1 mrg
648 1.1 mrg int
649 1.1 mrg easy_di_const (rtx op)
650 1.1 mrg {
651 1.1 mrg rtx high_rtx, low_rtx;
652 1.1 mrg HOST_WIDE_INT high, low;
653 1.1 mrg
654 1.1 mrg split_double (op, &high_rtx, &low_rtx);
655 1.1 mrg high = INTVAL (high_rtx);
656 1.1 mrg low = INTVAL (low_rtx);
657 1.1 mrg /* Pick constants loadable with 2 16-bit `ldi' insns. */
658 1.1 mrg if (high >= -128 && high <= 127
659 1.1 mrg && low >= -128 && low <= 127)
660 1.1 mrg return 1;
661 1.1 mrg return 0;
662 1.1 mrg }
663 1.1 mrg
664 1.1 mrg /* Return 1 if OP is a DFmode const we want to handle inline.
665 1.1 mrg This must match the code in the movdf pattern.
666 1.1 mrg It is used by the 'H' constraint. */
667 1.1 mrg
668 1.1 mrg int
669 1.1 mrg easy_df_const (rtx op)
670 1.1 mrg {
671 1.1 mrg long l[2];
672 1.1 mrg
673 1.1 mrg REAL_VALUE_TO_TARGET_DOUBLE (*CONST_DOUBLE_REAL_VALUE (op), l);
674 1.1 mrg if (l[0] == 0 && l[1] == 0)
675 1.1 mrg return 1;
676 1.1 mrg if ((l[0] & 0xffff) == 0 && l[1] == 0)
677 1.1 mrg return 1;
678 1.1 mrg return 0;
679 1.1 mrg }
680 1.1 mrg
681 1.1 mrg /* Return 1 if OP is (mem (reg ...)).
682 1.1 mrg This is used in insn length calcs. */
683 1.1 mrg
684 1.1 mrg bool
685 1.1 mrg memreg_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
686 1.1 mrg {
687 1.1 mrg return MEM_P (op) && REG_P (XEXP (op, 0));
688 1.1 mrg }
689 1.1 mrg
690 1.1 mrg /* Return nonzero if ARG must be passed by indirect reference. */
691 1.1 mrg
692 1.1 mrg static bool
693 1.1 mrg m32r_pass_by_reference (cumulative_args_t, const function_arg_info &arg)
694 1.1 mrg {
695 1.1 mrg int size = arg.type_size_in_bytes ();
696 1.1 mrg return (size < 0 || size > 8);
697 1.1 mrg }
698 1.1 mrg
699 1.1 mrg /* Comparisons. */
701 1.1 mrg
702 1.1 mrg /* X and Y are two things to compare using CODE. Emit the compare insn and
703 1.1 mrg return the rtx for compare [arg0 of the if_then_else].
704 1.1 mrg If need_compare is true then the comparison insn must be generated, rather
705 1.1 mrg than being subsumed into the following branch instruction. */
706 1.1 mrg
707 1.1 mrg rtx
708 1.1 mrg gen_compare (enum rtx_code code, rtx x, rtx y, int need_compare)
709 1.1 mrg {
710 1.1 mrg enum rtx_code compare_code;
711 1.1 mrg enum rtx_code branch_code;
712 1.1 mrg rtx cc_reg = gen_rtx_REG (CCmode, CARRY_REGNUM);
713 1.1 mrg int must_swap = 0;
714 1.1 mrg
715 1.1 mrg switch (code)
716 1.1 mrg {
717 1.1 mrg case EQ: compare_code = EQ; branch_code = NE; break;
718 1.1 mrg case NE: compare_code = EQ; branch_code = EQ; break;
719 1.1 mrg case LT: compare_code = LT; branch_code = NE; break;
720 1.1 mrg case LE: compare_code = LT; branch_code = EQ; must_swap = 1; break;
721 1.1 mrg case GT: compare_code = LT; branch_code = NE; must_swap = 1; break;
722 1.1 mrg case GE: compare_code = LT; branch_code = EQ; break;
723 1.1 mrg case LTU: compare_code = LTU; branch_code = NE; break;
724 1.1 mrg case LEU: compare_code = LTU; branch_code = EQ; must_swap = 1; break;
725 1.1 mrg case GTU: compare_code = LTU; branch_code = NE; must_swap = 1; break;
726 1.1 mrg case GEU: compare_code = LTU; branch_code = EQ; break;
727 1.1 mrg
728 1.1 mrg default:
729 1.1 mrg gcc_unreachable ();
730 1.1 mrg }
731 1.1 mrg
732 1.1 mrg if (need_compare)
733 1.1 mrg {
734 1.1 mrg switch (compare_code)
735 1.1 mrg {
736 1.1 mrg case EQ:
737 1.1 mrg if (satisfies_constraint_P (y) /* Reg equal to small const. */
738 1.1 mrg && y != const0_rtx)
739 1.1 mrg {
740 1.1 mrg rtx tmp = gen_reg_rtx (SImode);
741 1.1 mrg
742 1.1 mrg emit_insn (gen_addsi3 (tmp, x, GEN_INT (-INTVAL (y))));
743 1.1 mrg x = tmp;
744 1.1 mrg y = const0_rtx;
745 1.1 mrg }
746 1.1 mrg else if (CONSTANT_P (y)) /* Reg equal to const. */
747 1.1 mrg {
748 1.1 mrg rtx tmp = force_reg (GET_MODE (x), y);
749 1.1 mrg y = tmp;
750 1.1 mrg }
751 1.1 mrg
752 1.1 mrg if (register_operand (y, SImode) /* Reg equal to reg. */
753 1.1 mrg || y == const0_rtx) /* Reg equal to zero. */
754 1.1 mrg {
755 1.1 mrg emit_insn (gen_cmp_eqsi_insn (x, y));
756 1.1 mrg
757 1.1 mrg return gen_rtx_fmt_ee (code, CCmode, cc_reg, const0_rtx);
758 1.1 mrg }
759 1.1 mrg break;
760 1.1 mrg
761 1.1 mrg case LT:
762 1.1 mrg if (register_operand (y, SImode)
763 1.1 mrg || satisfies_constraint_P (y))
764 1.1 mrg {
765 1.1 mrg rtx tmp = gen_reg_rtx (SImode); /* Reg compared to reg. */
766 1.1 mrg
767 1.1 mrg switch (code)
768 1.1 mrg {
769 1.1 mrg case LT:
770 1.1 mrg emit_insn (gen_cmp_ltsi_insn (x, y));
771 1.1 mrg code = EQ;
772 1.1 mrg break;
773 1.1 mrg case LE:
774 1.1 mrg if (y == const0_rtx)
775 1.1 mrg tmp = const1_rtx;
776 1.1 mrg else
777 1.1 mrg emit_insn (gen_addsi3 (tmp, y, constm1_rtx));
778 1.1 mrg emit_insn (gen_cmp_ltsi_insn (x, tmp));
779 1.1 mrg code = EQ;
780 1.1 mrg break;
781 1.1 mrg case GT:
782 1.1 mrg if (CONST_INT_P (y))
783 1.1 mrg tmp = gen_rtx_PLUS (SImode, y, const1_rtx);
784 1.1 mrg else
785 1.1 mrg emit_insn (gen_addsi3 (tmp, y, constm1_rtx));
786 1.1 mrg emit_insn (gen_cmp_ltsi_insn (x, tmp));
787 1.1 mrg code = NE;
788 1.1 mrg break;
789 1.1 mrg case GE:
790 1.1 mrg emit_insn (gen_cmp_ltsi_insn (x, y));
791 1.1 mrg code = NE;
792 1.1 mrg break;
793 1.1 mrg default:
794 1.1 mrg gcc_unreachable ();
795 1.1 mrg }
796 1.1 mrg
797 1.1 mrg return gen_rtx_fmt_ee (code, CCmode, cc_reg, const0_rtx);
798 1.1 mrg }
799 1.1 mrg break;
800 1.1 mrg
801 1.1 mrg case LTU:
802 1.1 mrg if (register_operand (y, SImode)
803 1.1 mrg || satisfies_constraint_P (y))
804 1.1 mrg {
805 1.1 mrg rtx tmp = gen_reg_rtx (SImode); /* Reg (unsigned) compared to reg. */
806 1.1 mrg
807 1.1 mrg switch (code)
808 1.1 mrg {
809 1.1 mrg case LTU:
810 1.1 mrg emit_insn (gen_cmp_ltusi_insn (x, y));
811 1.1 mrg code = EQ;
812 1.1 mrg break;
813 1.1 mrg case LEU:
814 1.1 mrg if (y == const0_rtx)
815 1.1 mrg tmp = const1_rtx;
816 1.1 mrg else
817 1.1 mrg emit_insn (gen_addsi3 (tmp, y, constm1_rtx));
818 1.1 mrg emit_insn (gen_cmp_ltusi_insn (x, tmp));
819 1.1 mrg code = EQ;
820 1.1 mrg break;
821 1.1 mrg case GTU:
822 1.1 mrg if (CONST_INT_P (y))
823 1.1 mrg tmp = gen_rtx_PLUS (SImode, y, const1_rtx);
824 1.1 mrg else
825 1.1 mrg emit_insn (gen_addsi3 (tmp, y, constm1_rtx));
826 1.1 mrg emit_insn (gen_cmp_ltusi_insn (x, tmp));
827 1.1 mrg code = NE;
828 1.1 mrg break;
829 1.1 mrg case GEU:
830 1.1 mrg emit_insn (gen_cmp_ltusi_insn (x, y));
831 1.1 mrg code = NE;
832 1.1 mrg break;
833 1.1 mrg default:
834 1.1 mrg gcc_unreachable ();
835 1.1 mrg }
836 1.1 mrg
837 1.1 mrg return gen_rtx_fmt_ee (code, CCmode, cc_reg, const0_rtx);
838 1.1 mrg }
839 1.1 mrg break;
840 1.1 mrg
841 1.1 mrg default:
842 1.1 mrg gcc_unreachable ();
843 1.1 mrg }
844 1.1 mrg }
845 1.1 mrg else
846 1.1 mrg {
847 1.1 mrg /* Reg/reg equal comparison. */
848 1.1 mrg if (compare_code == EQ
849 1.1 mrg && register_operand (y, SImode))
850 1.1 mrg return gen_rtx_fmt_ee (code, CCmode, x, y);
851 1.1 mrg
852 1.1 mrg /* Reg/zero signed comparison. */
853 1.1 mrg if ((compare_code == EQ || compare_code == LT)
854 1.1 mrg && y == const0_rtx)
855 1.1 mrg return gen_rtx_fmt_ee (code, CCmode, x, y);
856 1.1 mrg
857 1.1 mrg /* Reg/smallconst equal comparison. */
858 1.1 mrg if (compare_code == EQ
859 1.1 mrg && satisfies_constraint_P (y))
860 1.1 mrg {
861 1.1 mrg rtx tmp = gen_reg_rtx (SImode);
862 1.1 mrg
863 1.1 mrg emit_insn (gen_addsi3 (tmp, x, GEN_INT (-INTVAL (y))));
864 1.1 mrg return gen_rtx_fmt_ee (code, CCmode, tmp, const0_rtx);
865 1.1 mrg }
866 1.1 mrg
867 1.1 mrg /* Reg/const equal comparison. */
868 1.1 mrg if (compare_code == EQ
869 1.1 mrg && CONSTANT_P (y))
870 1.1 mrg {
871 1.1 mrg rtx tmp = force_reg (GET_MODE (x), y);
872 1.1 mrg
873 1.1 mrg return gen_rtx_fmt_ee (code, CCmode, x, tmp);
874 1.1 mrg }
875 1.1 mrg }
876 1.1 mrg
877 1.1 mrg if (CONSTANT_P (y))
878 1.1 mrg {
879 1.1 mrg if (must_swap)
880 1.1 mrg y = force_reg (GET_MODE (x), y);
881 1.1 mrg else
882 1.1 mrg {
883 1.1 mrg int ok_const = reg_or_int16_operand (y, GET_MODE (y));
884 1.1 mrg
885 1.1 mrg if (! ok_const)
886 1.1 mrg y = force_reg (GET_MODE (x), y);
887 1.1 mrg }
888 1.1 mrg }
889 1.1 mrg
890 1.1 mrg switch (compare_code)
891 1.1 mrg {
892 1.1 mrg case EQ :
893 1.1 mrg emit_insn (gen_cmp_eqsi_insn (must_swap ? y : x, must_swap ? x : y));
894 1.1 mrg break;
895 1.1 mrg case LT :
896 1.1 mrg emit_insn (gen_cmp_ltsi_insn (must_swap ? y : x, must_swap ? x : y));
897 1.1 mrg break;
898 1.1 mrg case LTU :
899 1.1 mrg emit_insn (gen_cmp_ltusi_insn (must_swap ? y : x, must_swap ? x : y));
900 1.1 mrg break;
901 1.1 mrg
902 1.1 mrg default:
903 1.1 mrg gcc_unreachable ();
904 1.1 mrg }
905 1.1 mrg
906 1.1 mrg return gen_rtx_fmt_ee (branch_code, VOIDmode, cc_reg, CONST0_RTX (CCmode));
907 1.1 mrg }
908 1.1 mrg
909 1.1 mrg bool
910 1.1 mrg gen_cond_store (enum rtx_code code, rtx op0, rtx op1, rtx op2)
911 1.1 mrg {
912 1.1 mrg machine_mode mode = GET_MODE (op0);
913 1.1 mrg
914 1.1 mrg gcc_assert (mode == SImode);
915 1.1 mrg switch (code)
916 1.1 mrg {
917 1.1 mrg case EQ:
918 1.1 mrg if (!register_operand (op1, mode))
919 1.1 mrg op1 = force_reg (mode, op1);
920 1.1 mrg
921 1.1 mrg if (TARGET_M32RX || TARGET_M32R2)
922 1.1 mrg {
923 1.1 mrg if (!reg_or_zero_operand (op2, mode))
924 1.1 mrg op2 = force_reg (mode, op2);
925 1.1 mrg
926 1.1 mrg emit_insn (gen_seq_insn_m32rx (op0, op1, op2));
927 1.1 mrg return true;
928 1.1 mrg }
929 1.1 mrg if (CONST_INT_P (op2) && INTVAL (op2) == 0)
930 1.1 mrg {
931 1.1 mrg emit_insn (gen_seq_zero_insn (op0, op1));
932 1.1 mrg return true;
933 1.1 mrg }
934 1.1 mrg
935 1.1 mrg if (!reg_or_eq_int16_operand (op2, mode))
936 1.1 mrg op2 = force_reg (mode, op2);
937 1.1 mrg
938 1.1 mrg emit_insn (gen_seq_insn (op0, op1, op2));
939 1.1 mrg return true;
940 1.1 mrg
941 1.1 mrg case NE:
942 1.1 mrg if (!CONST_INT_P (op2)
943 1.1 mrg || (INTVAL (op2) != 0 && satisfies_constraint_K (op2)))
944 1.1 mrg {
945 1.1 mrg rtx reg;
946 1.1 mrg
947 1.1 mrg if (reload_completed || reload_in_progress)
948 1.1 mrg return false;
949 1.1 mrg
950 1.1 mrg reg = gen_reg_rtx (SImode);
951 1.1 mrg emit_insn (gen_xorsi3 (reg, op1, op2));
952 1.1 mrg op1 = reg;
953 1.1 mrg
954 1.1 mrg if (!register_operand (op1, mode))
955 1.1 mrg op1 = force_reg (mode, op1);
956 1.1 mrg
957 1.1 mrg emit_insn (gen_sne_zero_insn (op0, op1));
958 1.1 mrg return true;
959 1.1 mrg }
960 1.1 mrg return false;
961 1.1 mrg
962 1.1 mrg case LT:
963 1.1 mrg case GT:
964 1.1 mrg if (code == GT)
965 1.1 mrg {
966 1.1 mrg rtx tmp = op2;
967 1.1 mrg op2 = op1;
968 1.1 mrg op1 = tmp;
969 1.1 mrg code = LT;
970 1.1 mrg }
971 1.1 mrg
972 1.1 mrg if (!register_operand (op1, mode))
973 1.1 mrg op1 = force_reg (mode, op1);
974 1.1 mrg
975 1.1 mrg if (!reg_or_int16_operand (op2, mode))
976 1.1 mrg op2 = force_reg (mode, op2);
977 1.1 mrg
978 1.1 mrg emit_insn (gen_slt_insn (op0, op1, op2));
979 1.1 mrg return true;
980 1.1 mrg
981 1.1 mrg case LTU:
982 1.1 mrg case GTU:
983 1.1 mrg if (code == GTU)
984 1.1 mrg {
985 1.1 mrg rtx tmp = op2;
986 1.1 mrg op2 = op1;
987 1.1 mrg op1 = tmp;
988 1.1 mrg code = LTU;
989 1.1 mrg }
990 1.1 mrg
991 1.1 mrg if (!register_operand (op1, mode))
992 1.1 mrg op1 = force_reg (mode, op1);
993 1.1 mrg
994 1.1 mrg if (!reg_or_int16_operand (op2, mode))
995 1.1 mrg op2 = force_reg (mode, op2);
996 1.1 mrg
997 1.1 mrg emit_insn (gen_sltu_insn (op0, op1, op2));
998 1.1 mrg return true;
999 1.1 mrg
1000 1.1 mrg case GE:
1001 1.1 mrg case GEU:
1002 1.1 mrg if (!register_operand (op1, mode))
1003 1.1 mrg op1 = force_reg (mode, op1);
1004 1.1 mrg
1005 1.1 mrg if (!reg_or_int16_operand (op2, mode))
1006 1.1 mrg op2 = force_reg (mode, op2);
1007 1.1 mrg
1008 1.1 mrg if (code == GE)
1009 1.1 mrg emit_insn (gen_sge_insn (op0, op1, op2));
1010 1.1 mrg else
1011 1.1 mrg emit_insn (gen_sgeu_insn (op0, op1, op2));
1012 1.1 mrg return true;
1013 1.1 mrg
1014 1.1 mrg case LE:
1015 1.1 mrg case LEU:
1016 1.1 mrg if (!register_operand (op1, mode))
1017 1.1 mrg op1 = force_reg (mode, op1);
1018 1.1 mrg
1019 1.1 mrg if (CONST_INT_P (op2))
1020 1.1 mrg {
1021 1.1 mrg HOST_WIDE_INT value = INTVAL (op2);
1022 1.1 mrg if (value >= 2147483647)
1023 1.1 mrg {
1024 1.1 mrg emit_move_insn (op0, const1_rtx);
1025 1.1 mrg return true;
1026 1.1 mrg }
1027 1.1 mrg
1028 1.1 mrg op2 = GEN_INT (value + 1);
1029 1.1 mrg if (value < -32768 || value >= 32767)
1030 1.1 mrg op2 = force_reg (mode, op2);
1031 1.1 mrg
1032 1.1 mrg if (code == LEU)
1033 1.1 mrg emit_insn (gen_sltu_insn (op0, op1, op2));
1034 1.1 mrg else
1035 1.1 mrg emit_insn (gen_slt_insn (op0, op1, op2));
1036 1.1 mrg return true;
1037 1.1 mrg }
1038 1.1 mrg
1039 1.1 mrg if (!register_operand (op2, mode))
1040 1.1 mrg op2 = force_reg (mode, op2);
1041 1.1 mrg
1042 1.1 mrg if (code == LEU)
1043 1.1 mrg emit_insn (gen_sleu_insn (op0, op1, op2));
1044 1.1 mrg else
1045 1.1 mrg emit_insn (gen_sle_insn (op0, op1, op2));
1046 1.1 mrg return true;
1047 1.1 mrg
1048 1.1 mrg default:
1049 1.1 mrg gcc_unreachable ();
1050 1.1 mrg }
1051 1.1 mrg }
1052 1.1 mrg
1053 1.1 mrg
1054 1.1 mrg /* Split a 2 word move (DI or DF) into component parts. */
1056 1.1 mrg
1057 1.1 mrg rtx
1058 1.1 mrg gen_split_move_double (rtx operands[])
1059 1.1 mrg {
1060 1.1 mrg machine_mode mode = GET_MODE (operands[0]);
1061 1.1 mrg rtx dest = operands[0];
1062 1.1 mrg rtx src = operands[1];
1063 1.1 mrg rtx val;
1064 1.1 mrg
1065 1.1 mrg /* We might have (SUBREG (MEM)) here, so just get rid of the
1066 1.1 mrg subregs to make this code simpler. It is safe to call
1067 1.1 mrg alter_subreg any time after reload. */
1068 1.1 mrg if (GET_CODE (dest) == SUBREG)
1069 1.1 mrg alter_subreg (&dest, true);
1070 1.1 mrg if (GET_CODE (src) == SUBREG)
1071 1.1 mrg alter_subreg (&src, true);
1072 1.1 mrg
1073 1.1 mrg start_sequence ();
1074 1.1 mrg if (REG_P (dest))
1075 1.1 mrg {
1076 1.1 mrg int dregno = REGNO (dest);
1077 1.1 mrg
1078 1.1 mrg /* Reg = reg. */
1079 1.1 mrg if (REG_P (src))
1080 1.1 mrg {
1081 1.1 mrg int sregno = REGNO (src);
1082 1.1 mrg
1083 1.1 mrg int reverse = (dregno == sregno + 1);
1084 1.1 mrg
1085 1.1 mrg /* We normally copy the low-numbered register first. However, if
1086 1.1 mrg the first register operand 0 is the same as the second register of
1087 1.1 mrg operand 1, we must copy in the opposite order. */
1088 1.1 mrg emit_insn (gen_rtx_SET (operand_subword (dest, reverse, TRUE, mode),
1089 1.1 mrg operand_subword (src, reverse, TRUE, mode)));
1090 1.1 mrg
1091 1.1 mrg emit_insn (gen_rtx_SET (operand_subword (dest, !reverse, TRUE, mode),
1092 1.1 mrg operand_subword (src, !reverse, TRUE, mode)));
1093 1.1 mrg }
1094 1.1 mrg
1095 1.1 mrg /* Reg = constant. */
1096 1.1 mrg else if (CONST_INT_P (src) || GET_CODE (src) == CONST_DOUBLE)
1097 1.1 mrg {
1098 1.1 mrg rtx words[2];
1099 1.1 mrg split_double (src, &words[0], &words[1]);
1100 1.1 mrg emit_insn (gen_rtx_SET (operand_subword (dest, 0, TRUE, mode),
1101 1.1 mrg words[0]));
1102 1.1 mrg
1103 1.1 mrg emit_insn (gen_rtx_SET (operand_subword (dest, 1, TRUE, mode),
1104 1.1 mrg words[1]));
1105 1.1 mrg }
1106 1.1 mrg
1107 1.1 mrg /* Reg = mem. */
1108 1.1 mrg else if (MEM_P (src))
1109 1.1 mrg {
1110 1.1 mrg /* If the high-address word is used in the address, we must load it
1111 1.1 mrg last. Otherwise, load it first. */
1112 1.1 mrg int reverse = refers_to_regno_p (dregno, XEXP (src, 0));
1113 1.1 mrg
1114 1.1 mrg /* We used to optimize loads from single registers as
1115 1.1 mrg
1116 1.1 mrg ld r1,r3+; ld r2,r3
1117 1.1 mrg
1118 1.1 mrg if r3 were not used subsequently. However, the REG_NOTES aren't
1119 1.1 mrg propagated correctly by the reload phase, and it can cause bad
1120 1.1 mrg code to be generated. We could still try:
1121 1.1 mrg
1122 1.1 mrg ld r1,r3+; ld r2,r3; addi r3,-4
1123 1.1 mrg
1124 1.1 mrg which saves 2 bytes and doesn't force longword alignment. */
1125 1.1 mrg emit_insn (gen_rtx_SET (operand_subword (dest, reverse, TRUE, mode),
1126 1.1 mrg adjust_address (src, SImode,
1127 1.1 mrg reverse * UNITS_PER_WORD)));
1128 1.1 mrg
1129 1.1 mrg emit_insn (gen_rtx_SET (operand_subword (dest, !reverse, TRUE, mode),
1130 1.1 mrg adjust_address (src, SImode,
1131 1.1 mrg !reverse * UNITS_PER_WORD)));
1132 1.1 mrg }
1133 1.1 mrg else
1134 1.1 mrg gcc_unreachable ();
1135 1.1 mrg }
1136 1.1 mrg
1137 1.1 mrg /* Mem = reg. */
1138 1.1 mrg /* We used to optimize loads from single registers as
1139 1.1 mrg
1140 1.1 mrg st r1,r3; st r2,+r3
1141 1.1 mrg
1142 1.1 mrg if r3 were not used subsequently. However, the REG_NOTES aren't
1143 1.1 mrg propagated correctly by the reload phase, and it can cause bad
1144 1.1 mrg code to be generated. We could still try:
1145 1.1 mrg
1146 1.1 mrg st r1,r3; st r2,+r3; addi r3,-4
1147 1.1 mrg
1148 1.1 mrg which saves 2 bytes and doesn't force longword alignment. */
1149 1.1 mrg else if (MEM_P (dest) && REG_P (src))
1150 1.1 mrg {
1151 1.1 mrg emit_insn (gen_rtx_SET (adjust_address (dest, SImode, 0),
1152 1.1 mrg operand_subword (src, 0, TRUE, mode)));
1153 1.1 mrg
1154 1.1 mrg emit_insn (gen_rtx_SET (adjust_address (dest, SImode, UNITS_PER_WORD),
1155 1.1 mrg operand_subword (src, 1, TRUE, mode)));
1156 1.1 mrg }
1157 1.1 mrg
1158 1.1 mrg else
1159 1.1 mrg gcc_unreachable ();
1160 1.1 mrg
1161 1.1 mrg val = get_insns ();
1162 1.1 mrg end_sequence ();
1163 1.1 mrg return val;
1164 1.1 mrg }
1165 1.1 mrg
1166 1.1 mrg
1167 1.1 mrg static int
1169 1.1 mrg m32r_arg_partial_bytes (cumulative_args_t cum_v, const function_arg_info &arg)
1170 1.1 mrg {
1171 1.1 mrg CUMULATIVE_ARGS *cum = get_cumulative_args (cum_v);
1172 1.1 mrg
1173 1.1 mrg int words;
1174 1.1 mrg unsigned int size =
1175 1.1 mrg (arg.promoted_size_in_bytes () + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
1176 1.1 mrg
1177 1.1 mrg if (*cum >= M32R_MAX_PARM_REGS)
1178 1.1 mrg words = 0;
1179 1.1 mrg else if (*cum + size > M32R_MAX_PARM_REGS)
1180 1.1 mrg words = (*cum + size) - M32R_MAX_PARM_REGS;
1181 1.1 mrg else
1182 1.1 mrg words = 0;
1183 1.1 mrg
1184 1.1 mrg return words * UNITS_PER_WORD;
1185 1.1 mrg }
1186 1.1 mrg
1187 1.1 mrg /* The ROUND_ADVANCE* macros are local to this file. */
1188 1.1 mrg /* Round SIZE up to a word boundary. */
1189 1.1 mrg #define ROUND_ADVANCE(SIZE) \
1190 1.1 mrg (((SIZE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
1191 1.1 mrg
1192 1.1 mrg /* Round arg MODE/TYPE up to the next word boundary. */
1193 1.1 mrg #define ROUND_ADVANCE_ARG(MODE, TYPE) \
1194 1.1 mrg ((MODE) == BLKmode \
1195 1.1 mrg ? ROUND_ADVANCE ((unsigned int) int_size_in_bytes (TYPE)) \
1196 1.1 mrg : ROUND_ADVANCE ((unsigned int) GET_MODE_SIZE (MODE)))
1197 1.1 mrg
1198 1.1 mrg /* Round CUM up to the necessary point for argument MODE/TYPE. */
1199 1.1 mrg #define ROUND_ADVANCE_CUM(CUM, MODE, TYPE) (CUM)
1200 1.1 mrg
1201 1.1 mrg /* Return boolean indicating arg of type TYPE and mode MODE will be passed in
1202 1.1 mrg a reg. This includes arguments that have to be passed by reference as the
1203 1.1 mrg pointer to them is passed in a reg if one is available (and that is what
1204 1.1 mrg we're given).
1205 1.1 mrg This macro is only used in this file. */
1206 1.1 mrg #define PASS_IN_REG_P(CUM, MODE, TYPE) \
1207 1.1 mrg (ROUND_ADVANCE_CUM ((CUM), (MODE), (TYPE)) < M32R_MAX_PARM_REGS)
1208 1.1 mrg
1209 1.1 mrg /* Determine where to put an argument to a function.
1210 1.1 mrg Value is zero to push the argument on the stack,
1211 1.1 mrg or a hard register in which to store the argument.
1212 1.1 mrg
1213 1.1 mrg CUM is a variable of type CUMULATIVE_ARGS which gives info about
1214 1.1 mrg the preceding args and about the function being called.
1215 1.1 mrg ARG is a description of the argument. */
1216 1.1 mrg /* On the M32R the first M32R_MAX_PARM_REGS args are normally in registers
1217 1.1 mrg and the rest are pushed. */
1218 1.1 mrg
1219 1.1 mrg static rtx
1220 1.1 mrg m32r_function_arg (cumulative_args_t cum_v, const function_arg_info &arg)
1221 1.1 mrg {
1222 1.1 mrg CUMULATIVE_ARGS *cum = get_cumulative_args (cum_v);
1223 1.1 mrg
1224 1.1 mrg return (PASS_IN_REG_P (*cum, arg.mode, arg.type)
1225 1.1 mrg ? gen_rtx_REG (arg.mode,
1226 1.1 mrg ROUND_ADVANCE_CUM (*cum, arg.mode, arg.type))
1227 1.1 mrg : NULL_RTX);
1228 1.1 mrg }
1229 1.1 mrg
1230 1.1 mrg /* Update the data in CUM to advance over argument ARG. */
1231 1.1 mrg
1232 1.1 mrg static void
1233 1.1 mrg m32r_function_arg_advance (cumulative_args_t cum_v,
1234 1.1 mrg const function_arg_info &arg)
1235 1.1 mrg {
1236 1.1 mrg CUMULATIVE_ARGS *cum = get_cumulative_args (cum_v);
1237 1.1 mrg
1238 1.1 mrg *cum = (ROUND_ADVANCE_CUM (*cum, arg.mode, arg.type)
1239 1.1 mrg + ROUND_ADVANCE_ARG (arg.mode, arg.type));
1240 1.1 mrg }
1241 1.1 mrg
1242 1.1 mrg /* Worker function for TARGET_RETURN_IN_MEMORY. */
1243 1.1 mrg
1244 1.1 mrg static bool
1245 1.1 mrg m32r_return_in_memory (const_tree type, const_tree fntype ATTRIBUTE_UNUSED)
1246 1.1 mrg {
1247 1.1 mrg cumulative_args_t dummy = pack_cumulative_args (NULL);
1248 1.1 mrg function_arg_info arg (const_cast<tree> (type), /*named=*/false);
1249 1.1 mrg return m32r_pass_by_reference (dummy, arg);
1250 1.1 mrg }
1251 1.1 mrg
1252 1.1 mrg /* Worker function for TARGET_FUNCTION_VALUE. */
1253 1.1 mrg
1254 1.1 mrg static rtx
1255 1.1 mrg m32r_function_value (const_tree valtype,
1256 1.1 mrg const_tree fn_decl_or_type ATTRIBUTE_UNUSED,
1257 1.1 mrg bool outgoing ATTRIBUTE_UNUSED)
1258 1.1 mrg {
1259 1.1 mrg return gen_rtx_REG (TYPE_MODE (valtype), 0);
1260 1.1 mrg }
1261 1.1 mrg
1262 1.1 mrg /* Worker function for TARGET_LIBCALL_VALUE. */
1263 1.1 mrg
1264 1.1 mrg static rtx
1265 1.1 mrg m32r_libcall_value (machine_mode mode,
1266 1.1 mrg const_rtx fun ATTRIBUTE_UNUSED)
1267 1.1 mrg {
1268 1.1 mrg return gen_rtx_REG (mode, 0);
1269 1.1 mrg }
1270 1.1 mrg
1271 1.1 mrg /* Worker function for TARGET_FUNCTION_VALUE_REGNO_P.
1272 1.1 mrg
1273 1.1 mrg ??? What about r1 in DI/DF values. */
1274 1.1 mrg
1275 1.1 mrg static bool
1276 1.1 mrg m32r_function_value_regno_p (const unsigned int regno)
1277 1.1 mrg {
1278 1.1 mrg return (regno == 0);
1279 1.1 mrg }
1280 1.1 mrg
1281 1.1 mrg /* Do any needed setup for a variadic function. For the M32R, we must
1282 1.1 mrg create a register parameter block, and then copy any anonymous arguments
1283 1.1 mrg in registers to memory.
1284 1.1 mrg
1285 1.1 mrg CUM has not been updated for the last named argument (which is given
1286 1.1 mrg by ARG), and we rely on this fact. */
1287 1.1 mrg
1288 1.1 mrg static void
1289 1.1 mrg m32r_setup_incoming_varargs (cumulative_args_t cum,
1290 1.1 mrg const function_arg_info &arg,
1291 1.1 mrg int *pretend_size, int no_rtl)
1292 1.1 mrg {
1293 1.1 mrg int first_anon_arg;
1294 1.1 mrg
1295 1.1 mrg if (no_rtl)
1296 1.1 mrg return;
1297 1.1 mrg
1298 1.1 mrg /* All BLKmode values are passed by reference. */
1299 1.1 mrg gcc_assert (arg.mode != BLKmode);
1300 1.1 mrg
1301 1.1 mrg first_anon_arg = (ROUND_ADVANCE_CUM (*get_cumulative_args (cum),
1302 1.1 mrg arg.mode, arg.type)
1303 1.1 mrg + ROUND_ADVANCE_ARG (arg.mode, arg.type));
1304 1.1 mrg
1305 1.1 mrg if (first_anon_arg < M32R_MAX_PARM_REGS)
1306 1.1 mrg {
1307 1.1 mrg /* Note that first_reg_offset < M32R_MAX_PARM_REGS. */
1308 1.1 mrg int first_reg_offset = first_anon_arg;
1309 1.1 mrg /* Size in words to "pretend" allocate. */
1310 1.1 mrg int size = M32R_MAX_PARM_REGS - first_reg_offset;
1311 1.1 mrg rtx regblock;
1312 1.1 mrg
1313 1.1 mrg regblock = gen_frame_mem (BLKmode,
1314 1.1 mrg plus_constant (Pmode, arg_pointer_rtx,
1315 1.1 mrg FIRST_PARM_OFFSET (0)));
1316 1.1 mrg set_mem_alias_set (regblock, get_varargs_alias_set ());
1317 1.1 mrg move_block_from_reg (first_reg_offset, regblock, size);
1318 1.1 mrg
1319 1.1 mrg *pretend_size = (size * UNITS_PER_WORD);
1320 1.1 mrg }
1321 1.1 mrg }
1322 1.1 mrg
1323 1.1 mrg
1324 1.1 mrg /* Return true if INSN is real instruction bearing insn. */
1326 1.1 mrg
1327 1.1 mrg static int
1328 1.1 mrg m32r_is_insn (rtx insn)
1329 1.1 mrg {
1330 1.1 mrg return (NONDEBUG_INSN_P (insn)
1331 1.1 mrg && GET_CODE (PATTERN (insn)) != USE
1332 1.1 mrg && GET_CODE (PATTERN (insn)) != CLOBBER);
1333 1.1 mrg }
1334 1.1 mrg
1335 1.1 mrg /* Increase the priority of long instructions so that the
1336 1.1 mrg short instructions are scheduled ahead of the long ones. */
1337 1.1 mrg
1338 1.1 mrg static int
1339 1.1 mrg m32r_adjust_priority (rtx_insn *insn, int priority)
1340 1.1 mrg {
1341 1.1 mrg if (m32r_is_insn (insn)
1342 1.1 mrg && get_attr_insn_size (insn) != INSN_SIZE_SHORT)
1343 1.1 mrg priority <<= 3;
1344 1.1 mrg
1345 1.1 mrg return priority;
1346 1.1 mrg }
1347 1.1 mrg
1348 1.1 mrg
1349 1.1 mrg /* Indicate how many instructions can be issued at the same time.
1351 1.1 mrg This is sort of a lie. The m32r can issue only 1 long insn at
1352 1.1 mrg once, but it can issue 2 short insns. The default therefore is
1353 1.1 mrg set at 2, but this can be overridden by the command line option
1354 1.1 mrg -missue-rate=1. */
1355 1.1 mrg
1356 1.1 mrg static int
1357 1.1 mrg m32r_issue_rate (void)
1358 1.1 mrg {
1359 1.1 mrg return ((TARGET_LOW_ISSUE_RATE) ? 1 : 2);
1360 1.1 mrg }
1361 1.1 mrg
1362 1.1 mrg /* Cost functions. */
1364 1.1 mrg /* Memory is 3 times as expensive as registers.
1365 1.1 mrg ??? Is that the right way to look at it? */
1366 1.1 mrg
1367 1.1 mrg static int
1368 1.1 mrg m32r_memory_move_cost (machine_mode mode,
1369 1.1 mrg reg_class_t rclass ATTRIBUTE_UNUSED,
1370 1.1 mrg bool in ATTRIBUTE_UNUSED)
1371 1.1 mrg {
1372 1.1 mrg if (GET_MODE_SIZE (mode) <= UNITS_PER_WORD)
1373 1.1 mrg return 6;
1374 1.1 mrg else
1375 1.1 mrg return 12;
1376 1.1 mrg }
1377 1.1 mrg
1378 1.1 mrg static bool
1379 1.1 mrg m32r_rtx_costs (rtx x, machine_mode mode ATTRIBUTE_UNUSED,
1380 1.1 mrg int outer_code ATTRIBUTE_UNUSED,
1381 1.1 mrg int opno ATTRIBUTE_UNUSED, int *total,
1382 1.1 mrg bool speed ATTRIBUTE_UNUSED)
1383 1.1 mrg {
1384 1.1 mrg int code = GET_CODE (x);
1385 1.1 mrg
1386 1.1 mrg switch (code)
1387 1.1 mrg {
1388 1.1 mrg /* Small integers are as cheap as registers. 4 byte values can be
1389 1.1 mrg fetched as immediate constants - let's give that the cost of an
1390 1.1 mrg extra insn. */
1391 1.1 mrg case CONST_INT:
1392 1.1 mrg if (INT16_P (INTVAL (x)))
1393 1.1 mrg {
1394 1.1 mrg *total = 0;
1395 1.1 mrg return true;
1396 1.1 mrg }
1397 1.1 mrg /* FALLTHRU */
1398 1.1 mrg
1399 1.1 mrg case CONST:
1400 1.1 mrg case LABEL_REF:
1401 1.1 mrg case SYMBOL_REF:
1402 1.1 mrg *total = COSTS_N_INSNS (1);
1403 1.1 mrg return true;
1404 1.1 mrg
1405 1.1 mrg case CONST_DOUBLE:
1406 1.1 mrg {
1407 1.1 mrg rtx high, low;
1408 1.1 mrg
1409 1.1 mrg split_double (x, &high, &low);
1410 1.1 mrg *total = COSTS_N_INSNS (!INT16_P (INTVAL (high))
1411 1.1 mrg + !INT16_P (INTVAL (low)));
1412 1.1 mrg return true;
1413 1.1 mrg }
1414 1.1 mrg
1415 1.1 mrg case MULT:
1416 1.1 mrg *total = COSTS_N_INSNS (3);
1417 1.1 mrg return true;
1418 1.1 mrg
1419 1.1 mrg case DIV:
1420 1.1 mrg case UDIV:
1421 1.1 mrg case MOD:
1422 1.1 mrg case UMOD:
1423 1.1 mrg *total = COSTS_N_INSNS (10);
1424 1.1 mrg return true;
1425 1.1 mrg
1426 1.1 mrg default:
1427 1.1 mrg return false;
1428 1.1 mrg }
1429 1.1 mrg }
1430 1.1 mrg
1431 1.1 mrg /* Type of function DECL.
1433 1.1 mrg
1434 1.1 mrg The result is cached. To reset the cache at the end of a function,
1435 1.1 mrg call with DECL = NULL_TREE. */
1436 1.1 mrg
1437 1.1 mrg enum m32r_function_type
1438 1.1 mrg m32r_compute_function_type (tree decl)
1439 1.1 mrg {
1440 1.1 mrg /* Cached value. */
1441 1.1 mrg static enum m32r_function_type fn_type = M32R_FUNCTION_UNKNOWN;
1442 1.1 mrg /* Last function we were called for. */
1443 1.1 mrg static tree last_fn = NULL_TREE;
1444 1.1 mrg
1445 1.1 mrg /* Resetting the cached value? */
1446 1.1 mrg if (decl == NULL_TREE)
1447 1.1 mrg {
1448 1.1 mrg fn_type = M32R_FUNCTION_UNKNOWN;
1449 1.1 mrg last_fn = NULL_TREE;
1450 1.1 mrg return fn_type;
1451 1.1 mrg }
1452 1.1 mrg
1453 1.1 mrg if (decl == last_fn && fn_type != M32R_FUNCTION_UNKNOWN)
1454 1.1 mrg return fn_type;
1455 1.1 mrg
1456 1.1 mrg /* Compute function type. */
1457 1.1 mrg fn_type = (lookup_attribute ("interrupt", DECL_ATTRIBUTES (current_function_decl)) != NULL_TREE
1458 1.1 mrg ? M32R_FUNCTION_INTERRUPT
1459 1.1 mrg : M32R_FUNCTION_NORMAL);
1460 1.1 mrg
1461 1.1 mrg last_fn = decl;
1462 1.1 mrg return fn_type;
1463 1.1 mrg }
1464 1.1 mrg /* Function prologue/epilogue handlers. */
1466 1.1 mrg
1467 1.1 mrg /* M32R stack frames look like:
1468 1.1 mrg
1469 1.1 mrg Before call After call
1470 1.1 mrg +-----------------------+ +-----------------------+
1471 1.1 mrg | | | |
1472 1.1 mrg high | local variables, | | local variables, |
1473 1.1 mrg mem | reg save area, etc. | | reg save area, etc. |
1474 1.1 mrg | | | |
1475 1.1 mrg +-----------------------+ +-----------------------+
1476 1.1 mrg | | | |
1477 1.1 mrg | arguments on stack. | | arguments on stack. |
1478 1.1 mrg | | | |
1479 1.1 mrg SP+0->+-----------------------+ +-----------------------+
1480 1.1 mrg | reg parm save area, |
1481 1.1 mrg | only created for |
1482 1.1 mrg | variable argument |
1483 1.1 mrg | functions |
1484 1.1 mrg +-----------------------+
1485 1.1 mrg | previous frame ptr |
1486 1.1 mrg +-----------------------+
1487 1.1 mrg | |
1488 1.1 mrg | register save area |
1489 1.1 mrg | |
1490 1.1 mrg +-----------------------+
1491 1.1 mrg | return address |
1492 1.1 mrg +-----------------------+
1493 1.1 mrg | |
1494 1.1 mrg | local variables |
1495 1.1 mrg | |
1496 1.1 mrg +-----------------------+
1497 1.1 mrg | |
1498 1.1 mrg | alloca allocations |
1499 1.1 mrg | |
1500 1.1 mrg +-----------------------+
1501 1.1 mrg | |
1502 1.1 mrg low | arguments on stack |
1503 1.1 mrg memory | |
1504 1.1 mrg SP+0->+-----------------------+
1505 1.1 mrg
1506 1.1 mrg Notes:
1507 1.1 mrg 1) The "reg parm save area" does not exist for non variable argument fns.
1508 1.1 mrg 2) The "reg parm save area" can be eliminated completely if we saved regs
1509 1.1 mrg containing anonymous args separately but that complicates things too
1510 1.1 mrg much (so it's not done).
1511 1.1 mrg 3) The return address is saved after the register save area so as to have as
1512 1.1 mrg many insns as possible between the restoration of `lr' and the `jmp lr'. */
1513 1.1 mrg
1514 1.1 mrg /* Structure to be filled in by m32r_compute_frame_size with register
1515 1.1 mrg save masks, and offsets for the current function. */
1516 1.1 mrg struct m32r_frame_info
1517 1.1 mrg {
1518 1.1 mrg unsigned int total_size; /* # bytes that the entire frame takes up. */
1519 1.1 mrg unsigned int extra_size; /* # bytes of extra stuff. */
1520 1.1 mrg unsigned int pretend_size; /* # bytes we push and pretend caller did. */
1521 1.1 mrg unsigned int args_size; /* # bytes that outgoing arguments take up. */
1522 1.1 mrg unsigned int reg_size; /* # bytes needed to store regs. */
1523 1.1 mrg unsigned int var_size; /* # bytes that variables take up. */
1524 1.1 mrg unsigned int gmask; /* Mask of saved gp registers. */
1525 1.1 mrg unsigned int save_fp; /* Nonzero if fp must be saved. */
1526 1.1 mrg unsigned int save_lr; /* Nonzero if lr (return addr) must be saved. */
1527 1.1 mrg int initialized; /* Nonzero if frame size already calculated. */
1528 1.1 mrg };
1529 1.1 mrg
1530 1.1 mrg /* Current frame information calculated by m32r_compute_frame_size. */
1531 1.1 mrg static struct m32r_frame_info current_frame_info;
1532 1.1 mrg
1533 1.1 mrg /* Zero structure to initialize current_frame_info. */
1534 1.1 mrg static struct m32r_frame_info zero_frame_info;
1535 1.1 mrg
1536 1.1 mrg #define FRAME_POINTER_MASK (1 << (FRAME_POINTER_REGNUM))
1537 1.1 mrg #define RETURN_ADDR_MASK (1 << (RETURN_ADDR_REGNUM))
1538 1.1 mrg
1539 1.1 mrg /* Tell prologue and epilogue if register REGNO should be saved / restored.
1540 1.1 mrg The return address and frame pointer are treated separately.
1541 1.1 mrg Don't consider them here. */
1542 1.1 mrg #define MUST_SAVE_REGISTER(regno, interrupt_p) \
1543 1.1 mrg ((regno) != RETURN_ADDR_REGNUM && (regno) != FRAME_POINTER_REGNUM \
1544 1.1 mrg && (df_regs_ever_live_p (regno) && (!call_used_regs[regno] || interrupt_p)))
1545 1.1 mrg
1546 1.1 mrg #define MUST_SAVE_FRAME_POINTER (df_regs_ever_live_p (FRAME_POINTER_REGNUM))
1547 1.1 mrg #define MUST_SAVE_RETURN_ADDR (df_regs_ever_live_p (RETURN_ADDR_REGNUM) || crtl->profile)
1548 1.1 mrg
1549 1.1 mrg #define SHORT_INSN_SIZE 2 /* Size of small instructions. */
1550 1.1 mrg #define LONG_INSN_SIZE 4 /* Size of long instructions. */
1551 1.1 mrg
1552 1.1 mrg /* Return the bytes needed to compute the frame pointer from the current
1553 1.1 mrg stack pointer.
1554 1.1 mrg
1555 1.1 mrg SIZE is the size needed for local variables. */
1556 1.1 mrg
1557 1.1 mrg unsigned int
1558 1.1 mrg m32r_compute_frame_size (poly_int64 size) /* # of var. bytes allocated. */
1559 1.1 mrg {
1560 1.1 mrg unsigned int regno;
1561 1.1 mrg unsigned int total_size, var_size, args_size, pretend_size, extra_size;
1562 1.1 mrg unsigned int reg_size;
1563 1.1 mrg unsigned int gmask;
1564 1.1 mrg enum m32r_function_type fn_type;
1565 1.1 mrg int interrupt_p;
1566 1.1 mrg int pic_reg_used = flag_pic && (crtl->uses_pic_offset_table
1567 1.1 mrg | crtl->profile);
1568 1.1 mrg
1569 1.1 mrg var_size = M32R_STACK_ALIGN (size);
1570 1.1 mrg args_size = M32R_STACK_ALIGN (crtl->outgoing_args_size);
1571 1.1 mrg pretend_size = crtl->args.pretend_args_size;
1572 1.1 mrg extra_size = FIRST_PARM_OFFSET (0);
1573 1.1 mrg total_size = extra_size + pretend_size + args_size + var_size;
1574 1.1 mrg reg_size = 0;
1575 1.1 mrg gmask = 0;
1576 1.1 mrg
1577 1.1 mrg /* See if this is an interrupt handler. Call used registers must be saved
1578 1.1 mrg for them too. */
1579 1.1 mrg fn_type = m32r_compute_function_type (current_function_decl);
1580 1.1 mrg interrupt_p = M32R_INTERRUPT_P (fn_type);
1581 1.1 mrg
1582 1.1 mrg /* Calculate space needed for registers. */
1583 1.1 mrg for (regno = 0; regno < M32R_MAX_INT_REGS; regno++)
1584 1.1 mrg {
1585 1.1 mrg if (MUST_SAVE_REGISTER (regno, interrupt_p)
1586 1.1 mrg || (regno == PIC_OFFSET_TABLE_REGNUM && pic_reg_used))
1587 1.1 mrg {
1588 1.1 mrg reg_size += UNITS_PER_WORD;
1589 1.1 mrg gmask |= 1 << regno;
1590 1.1 mrg }
1591 1.1 mrg }
1592 1.1 mrg
1593 1.1 mrg current_frame_info.save_fp = MUST_SAVE_FRAME_POINTER;
1594 1.1 mrg current_frame_info.save_lr = MUST_SAVE_RETURN_ADDR || pic_reg_used;
1595 1.1 mrg
1596 1.1 mrg reg_size += ((current_frame_info.save_fp + current_frame_info.save_lr)
1597 1.1 mrg * UNITS_PER_WORD);
1598 1.1 mrg total_size += reg_size;
1599 1.1 mrg
1600 1.1 mrg /* ??? Not sure this is necessary, and I don't think the epilogue
1601 1.1 mrg handler will do the right thing if this changes total_size. */
1602 1.1 mrg total_size = M32R_STACK_ALIGN (total_size);
1603 1.1 mrg
1604 1.1 mrg /* frame_size = total_size - (pretend_size + reg_size); */
1605 1.1 mrg
1606 1.1 mrg /* Save computed information. */
1607 1.1 mrg current_frame_info.total_size = total_size;
1608 1.1 mrg current_frame_info.extra_size = extra_size;
1609 1.1 mrg current_frame_info.pretend_size = pretend_size;
1610 1.1 mrg current_frame_info.var_size = var_size;
1611 1.1 mrg current_frame_info.args_size = args_size;
1612 1.1 mrg current_frame_info.reg_size = reg_size;
1613 1.1 mrg current_frame_info.gmask = gmask;
1614 1.1 mrg current_frame_info.initialized = reload_completed;
1615 1.1 mrg
1616 1.1 mrg /* Ok, we're done. */
1617 1.1 mrg return total_size;
1618 1.1 mrg }
1619 1.1 mrg
1620 1.1 mrg /* Worker function for TARGET_CAN_ELIMINATE. */
1621 1.1 mrg
1622 1.1 mrg bool
1623 1.1 mrg m32r_can_eliminate (const int from, const int to)
1624 1.1 mrg {
1625 1.1 mrg return (from == ARG_POINTER_REGNUM && to == STACK_POINTER_REGNUM
1626 1.1 mrg ? ! frame_pointer_needed
1627 1.1 mrg : true);
1628 1.1 mrg }
1629 1.1 mrg
1630 1.1 mrg
1631 1.1 mrg /* The table we use to reference PIC data. */
1633 1.1 mrg static rtx global_offset_table;
1634 1.1 mrg
1635 1.1 mrg static void
1636 1.1 mrg m32r_reload_lr (rtx sp, int size)
1637 1.1 mrg {
1638 1.1 mrg rtx lr = gen_rtx_REG (Pmode, RETURN_ADDR_REGNUM);
1639 1.1 mrg
1640 1.1 mrg if (size == 0)
1641 1.1 mrg emit_insn (gen_movsi (lr, gen_frame_mem (Pmode, sp)));
1642 1.1 mrg else if (size < 32768)
1643 1.1 mrg emit_insn (gen_movsi (lr, gen_frame_mem (Pmode,
1644 1.1 mrg gen_rtx_PLUS (Pmode, sp,
1645 1.1 mrg GEN_INT (size)))));
1646 1.1 mrg else
1647 1.1 mrg {
1648 1.1 mrg rtx tmp = gen_rtx_REG (Pmode, PROLOGUE_TMP_REGNUM);
1649 1.1 mrg
1650 1.1 mrg emit_insn (gen_movsi (tmp, GEN_INT (size)));
1651 1.1 mrg emit_insn (gen_addsi3 (tmp, tmp, sp));
1652 1.1 mrg emit_insn (gen_movsi (lr, gen_frame_mem (Pmode, tmp)));
1653 1.1 mrg }
1654 1.1 mrg
1655 1.1 mrg emit_use (lr);
1656 1.1 mrg }
1657 1.1 mrg
1658 1.1 mrg void
1659 1.1 mrg m32r_load_pic_register (void)
1660 1.1 mrg {
1661 1.1 mrg global_offset_table = gen_rtx_SYMBOL_REF (Pmode, "_GLOBAL_OFFSET_TABLE_");
1662 1.1 mrg emit_insn (gen_get_pc (pic_offset_table_rtx, global_offset_table,
1663 1.1 mrg GEN_INT (TARGET_MODEL_SMALL)));
1664 1.1 mrg
1665 1.1 mrg /* Need to emit this whether or not we obey regdecls,
1666 1.1 mrg since setjmp/longjmp can cause life info to screw up. */
1667 1.1 mrg emit_use (pic_offset_table_rtx);
1668 1.1 mrg }
1669 1.1 mrg
1670 1.1 mrg /* Expand the m32r prologue as a series of insns. */
1671 1.1 mrg
1672 1.1 mrg void
1673 1.1 mrg m32r_expand_prologue (void)
1674 1.1 mrg {
1675 1.1 mrg int regno;
1676 1.1 mrg int frame_size;
1677 1.1 mrg unsigned int gmask;
1678 1.1 mrg int pic_reg_used = flag_pic && (crtl->uses_pic_offset_table
1679 1.1 mrg | crtl->profile);
1680 1.1 mrg
1681 1.1 mrg if (! current_frame_info.initialized)
1682 1.1 mrg m32r_compute_frame_size (get_frame_size ());
1683 1.1 mrg
1684 1.1 mrg if (flag_stack_usage_info)
1685 1.1 mrg current_function_static_stack_size = current_frame_info.total_size;
1686 1.1 mrg
1687 1.1 mrg gmask = current_frame_info.gmask;
1688 1.1 mrg
1689 1.1 mrg /* These cases shouldn't happen. Catch them now. */
1690 1.1 mrg gcc_assert (current_frame_info.total_size || !gmask);
1691 1.1 mrg
1692 1.1 mrg /* Allocate space for register arguments if this is a variadic function. */
1693 1.1 mrg if (current_frame_info.pretend_size != 0)
1694 1.1 mrg {
1695 1.1 mrg /* Use a HOST_WIDE_INT temporary, since negating an unsigned int gives
1696 1.1 mrg the wrong result on a 64-bit host. */
1697 1.1 mrg HOST_WIDE_INT pretend_size = current_frame_info.pretend_size;
1698 1.1 mrg emit_insn (gen_addsi3 (stack_pointer_rtx,
1699 1.1 mrg stack_pointer_rtx,
1700 1.1 mrg GEN_INT (-pretend_size)));
1701 1.1 mrg }
1702 1.1 mrg
1703 1.1 mrg /* Save any registers we need to and set up fp. */
1704 1.1 mrg if (current_frame_info.save_fp)
1705 1.1 mrg emit_insn (gen_movsi_push (stack_pointer_rtx, frame_pointer_rtx));
1706 1.1 mrg
1707 1.1 mrg gmask &= ~(FRAME_POINTER_MASK | RETURN_ADDR_MASK);
1708 1.1 mrg
1709 1.1 mrg /* Save any needed call-saved regs (and call-used if this is an
1710 1.1 mrg interrupt handler). */
1711 1.1 mrg for (regno = 0; regno <= M32R_MAX_INT_REGS; ++regno)
1712 1.1 mrg {
1713 1.1 mrg if ((gmask & (1 << regno)) != 0)
1714 1.1 mrg emit_insn (gen_movsi_push (stack_pointer_rtx,
1715 1.1 mrg gen_rtx_REG (Pmode, regno)));
1716 1.1 mrg }
1717 1.1 mrg
1718 1.1 mrg if (current_frame_info.save_lr)
1719 1.1 mrg emit_insn (gen_movsi_push (stack_pointer_rtx,
1720 1.1 mrg gen_rtx_REG (Pmode, RETURN_ADDR_REGNUM)));
1721 1.1 mrg
1722 1.1 mrg /* Allocate the stack frame. */
1723 1.1 mrg frame_size = (current_frame_info.total_size
1724 1.1 mrg - (current_frame_info.pretend_size
1725 1.1 mrg + current_frame_info.reg_size));
1726 1.1 mrg
1727 1.1 mrg if (frame_size == 0)
1728 1.1 mrg ; /* Nothing to do. */
1729 1.1 mrg else if (frame_size <= 32768)
1730 1.1 mrg emit_insn (gen_addsi3 (stack_pointer_rtx, stack_pointer_rtx,
1731 1.1 mrg GEN_INT (-frame_size)));
1732 1.1 mrg else
1733 1.1 mrg {
1734 1.1 mrg rtx tmp = gen_rtx_REG (Pmode, PROLOGUE_TMP_REGNUM);
1735 1.1 mrg
1736 1.1 mrg emit_insn (gen_movsi (tmp, GEN_INT (frame_size)));
1737 1.1 mrg emit_insn (gen_subsi3 (stack_pointer_rtx, stack_pointer_rtx, tmp));
1738 1.1 mrg }
1739 1.1 mrg
1740 1.1 mrg if (frame_pointer_needed)
1741 1.1 mrg emit_insn (gen_movsi (frame_pointer_rtx, stack_pointer_rtx));
1742 1.1 mrg
1743 1.1 mrg if (crtl->profile)
1744 1.1 mrg /* Push lr for mcount (form_pc, x). */
1745 1.1 mrg emit_insn (gen_movsi_push (stack_pointer_rtx,
1746 1.1 mrg gen_rtx_REG (Pmode, RETURN_ADDR_REGNUM)));
1747 1.1 mrg
1748 1.1 mrg if (pic_reg_used)
1749 1.1 mrg {
1750 1.1 mrg m32r_load_pic_register ();
1751 1.1 mrg m32r_reload_lr (stack_pointer_rtx,
1752 1.1 mrg (crtl->profile ? 0 : frame_size));
1753 1.1 mrg }
1754 1.1 mrg
1755 1.1 mrg if (crtl->profile && !pic_reg_used)
1756 1.1 mrg emit_insn (gen_blockage ());
1757 1.1 mrg }
1758 1.1 mrg
1759 1.1 mrg
1760 1.1 mrg /* Set up the stack and frame pointer (if desired) for the function.
1762 1.1 mrg Note, if this is changed, you need to mirror the changes in
1763 1.1 mrg m32r_compute_frame_size which calculates the prolog size. */
1764 1.1 mrg
1765 1.1 mrg static void
1766 1.1 mrg m32r_output_function_prologue (FILE * file)
1767 1.1 mrg {
1768 1.1 mrg enum m32r_function_type fn_type = m32r_compute_function_type (current_function_decl);
1769 1.1 mrg
1770 1.1 mrg /* If this is an interrupt handler, mark it as such. */
1771 1.1 mrg if (M32R_INTERRUPT_P (fn_type))
1772 1.1 mrg fprintf (file, "\t%s interrupt handler\n", ASM_COMMENT_START);
1773 1.1 mrg
1774 1.1 mrg if (! current_frame_info.initialized)
1775 1.1 mrg m32r_compute_frame_size (get_frame_size ());
1776 1.1 mrg
1777 1.1 mrg /* This is only for the human reader. */
1778 1.1 mrg fprintf (file,
1779 1.1 mrg "\t%s PROLOGUE, vars= %d, regs= %d, args= %d, extra= %d\n",
1780 1.1 mrg ASM_COMMENT_START,
1781 1.1 mrg current_frame_info.var_size,
1782 1.1 mrg current_frame_info.reg_size / 4,
1783 1.1 mrg current_frame_info.args_size,
1784 1.1 mrg current_frame_info.extra_size);
1785 1.1 mrg }
1786 1.1 mrg
1787 1.1 mrg /* Output RTL to pop register REGNO from the stack. */
1789 1.1 mrg
1790 1.1 mrg static void
1791 1.1 mrg pop (int regno)
1792 1.1 mrg {
1793 1.1 mrg rtx x;
1794 1.1 mrg
1795 1.1 mrg x = emit_insn (gen_movsi_pop (gen_rtx_REG (Pmode, regno),
1796 1.1 mrg stack_pointer_rtx));
1797 1.1 mrg add_reg_note (x, REG_INC, stack_pointer_rtx);
1798 1.1 mrg }
1799 1.1 mrg
1800 1.1 mrg /* Expand the m32r epilogue as a series of insns. */
1801 1.1 mrg
1802 1.1 mrg void
1803 1.1 mrg m32r_expand_epilogue (void)
1804 1.1 mrg {
1805 1.1 mrg int regno;
1806 1.1 mrg int noepilogue = FALSE;
1807 1.1 mrg int total_size;
1808 1.1 mrg
1809 1.1 mrg gcc_assert (current_frame_info.initialized);
1810 1.1 mrg total_size = current_frame_info.total_size;
1811 1.1 mrg
1812 1.1 mrg if (total_size == 0)
1813 1.1 mrg {
1814 1.1 mrg rtx_insn *insn = get_last_insn ();
1815 1.1 mrg
1816 1.1 mrg /* If the last insn was a BARRIER, we don't have to write any code
1817 1.1 mrg because a jump (aka return) was put there. */
1818 1.1 mrg if (insn && NOTE_P (insn))
1819 1.1 mrg insn = prev_nonnote_insn (insn);
1820 1.1 mrg if (insn && BARRIER_P (insn))
1821 1.1 mrg noepilogue = TRUE;
1822 1.1 mrg }
1823 1.1 mrg
1824 1.1 mrg if (!noepilogue)
1825 1.1 mrg {
1826 1.1 mrg unsigned int var_size = current_frame_info.var_size;
1827 1.1 mrg unsigned int args_size = current_frame_info.args_size;
1828 1.1 mrg unsigned int gmask = current_frame_info.gmask;
1829 1.1 mrg int can_trust_sp_p = !cfun->calls_alloca;
1830 1.1 mrg
1831 1.1 mrg if (flag_exceptions)
1832 1.1 mrg emit_insn (gen_blockage ());
1833 1.1 mrg
1834 1.1 mrg /* The first thing to do is point the sp at the bottom of the register
1835 1.1 mrg save area. */
1836 1.1 mrg if (can_trust_sp_p)
1837 1.1 mrg {
1838 1.1 mrg unsigned int reg_offset = var_size + args_size;
1839 1.1 mrg
1840 1.1 mrg if (reg_offset == 0)
1841 1.1 mrg ; /* Nothing to do. */
1842 1.1 mrg else if (reg_offset < 32768)
1843 1.1 mrg emit_insn (gen_addsi3 (stack_pointer_rtx, stack_pointer_rtx,
1844 1.1 mrg GEN_INT (reg_offset)));
1845 1.1 mrg else
1846 1.1 mrg {
1847 1.1 mrg rtx tmp = gen_rtx_REG (Pmode, PROLOGUE_TMP_REGNUM);
1848 1.1 mrg
1849 1.1 mrg emit_insn (gen_movsi (tmp, GEN_INT (reg_offset)));
1850 1.1 mrg emit_insn (gen_addsi3 (stack_pointer_rtx, stack_pointer_rtx,
1851 1.1 mrg tmp));
1852 1.1 mrg }
1853 1.1 mrg }
1854 1.1 mrg else if (frame_pointer_needed)
1855 1.1 mrg {
1856 1.1 mrg unsigned int reg_offset = var_size + args_size;
1857 1.1 mrg
1858 1.1 mrg if (reg_offset == 0)
1859 1.1 mrg emit_insn (gen_movsi (stack_pointer_rtx, frame_pointer_rtx));
1860 1.1 mrg else if (reg_offset < 32768)
1861 1.1 mrg emit_insn (gen_addsi3 (stack_pointer_rtx, frame_pointer_rtx,
1862 1.1 mrg GEN_INT (reg_offset)));
1863 1.1 mrg else
1864 1.1 mrg {
1865 1.1 mrg rtx tmp = gen_rtx_REG (Pmode, PROLOGUE_TMP_REGNUM);
1866 1.1 mrg
1867 1.1 mrg emit_insn (gen_movsi (tmp, GEN_INT (reg_offset)));
1868 1.1 mrg emit_insn (gen_movsi (stack_pointer_rtx, frame_pointer_rtx));
1869 1.1 mrg emit_insn (gen_addsi3 (stack_pointer_rtx, stack_pointer_rtx,
1870 1.1 mrg tmp));
1871 1.1 mrg }
1872 1.1 mrg }
1873 1.1 mrg else
1874 1.1 mrg gcc_unreachable ();
1875 1.1 mrg
1876 1.1 mrg if (current_frame_info.save_lr)
1877 1.1 mrg pop (RETURN_ADDR_REGNUM);
1878 1.1 mrg
1879 1.1 mrg /* Restore any saved registers, in reverse order of course. */
1880 1.1 mrg gmask &= ~(FRAME_POINTER_MASK | RETURN_ADDR_MASK);
1881 1.1 mrg for (regno = M32R_MAX_INT_REGS - 1; regno >= 0; --regno)
1882 1.1 mrg {
1883 1.1 mrg if ((gmask & (1L << regno)) != 0)
1884 1.1 mrg pop (regno);
1885 1.1 mrg }
1886 1.1 mrg
1887 1.1 mrg if (current_frame_info.save_fp)
1888 1.1 mrg pop (FRAME_POINTER_REGNUM);
1889 1.1 mrg
1890 1.1 mrg /* Remove varargs area if present. */
1891 1.1 mrg if (current_frame_info.pretend_size != 0)
1892 1.1 mrg emit_insn (gen_addsi3 (stack_pointer_rtx, stack_pointer_rtx,
1893 1.1 mrg GEN_INT (current_frame_info.pretend_size)));
1894 1.1 mrg
1895 1.1 mrg emit_insn (gen_blockage ());
1896 1.1 mrg }
1897 1.1 mrg }
1898 1.1 mrg
1899 1.1 mrg /* Do any necessary cleanup after a function to restore stack, frame,
1900 1.1 mrg and regs. */
1901 1.1 mrg
1902 1.1 mrg static void
1903 1.1 mrg m32r_output_function_epilogue (FILE *)
1904 1.1 mrg {
1905 1.1 mrg /* Reset state info for each function. */
1906 1.1 mrg current_frame_info = zero_frame_info;
1907 1.1 mrg m32r_compute_function_type (NULL_TREE);
1908 1.1 mrg }
1909 1.1 mrg
1910 1.1 mrg /* Return nonzero if this function is known to have a null or 1 instruction
1912 1.1 mrg epilogue. */
1913 1.1 mrg
1914 1.1 mrg int
1915 1.1 mrg direct_return (void)
1916 1.1 mrg {
1917 1.1 mrg if (!reload_completed)
1918 1.1 mrg return FALSE;
1919 1.1 mrg
1920 1.1 mrg if (M32R_INTERRUPT_P (m32r_compute_function_type (current_function_decl)))
1921 1.1 mrg return FALSE;
1922 1.1 mrg
1923 1.1 mrg if (! current_frame_info.initialized)
1924 1.1 mrg m32r_compute_frame_size (get_frame_size ());
1925 1.1 mrg
1926 1.1 mrg return current_frame_info.total_size == 0;
1927 1.1 mrg }
1928 1.1 mrg
1929 1.1 mrg
1930 1.1 mrg /* PIC. */
1932 1.1 mrg
1933 1.1 mrg int
1934 1.1 mrg m32r_legitimate_pic_operand_p (rtx x)
1935 1.1 mrg {
1936 1.1 mrg if (GET_CODE (x) == SYMBOL_REF || GET_CODE (x) == LABEL_REF)
1937 1.1 mrg return 0;
1938 1.1 mrg
1939 1.1 mrg if (GET_CODE (x) == CONST
1940 1.1 mrg && GET_CODE (XEXP (x, 0)) == PLUS
1941 1.1 mrg && (GET_CODE (XEXP (XEXP (x, 0), 0)) == SYMBOL_REF
1942 1.1 mrg || GET_CODE (XEXP (XEXP (x, 0), 0)) == LABEL_REF)
1943 1.1 mrg && (CONST_INT_P (XEXP (XEXP (x, 0), 1))))
1944 1.1 mrg return 0;
1945 1.1 mrg
1946 1.1 mrg return 1;
1947 1.1 mrg }
1948 1.1 mrg
1949 1.1 mrg rtx
1950 1.1 mrg m32r_legitimize_pic_address (rtx orig, rtx reg)
1951 1.1 mrg {
1952 1.1 mrg #ifdef DEBUG_PIC
1953 1.1 mrg printf("m32r_legitimize_pic_address()\n");
1954 1.1 mrg #endif
1955 1.1 mrg
1956 1.1 mrg if (GET_CODE (orig) == SYMBOL_REF || GET_CODE (orig) == LABEL_REF)
1957 1.1 mrg {
1958 1.1 mrg rtx pic_ref, address;
1959 1.1 mrg int subregs = 0;
1960 1.1 mrg
1961 1.1 mrg if (reg == 0)
1962 1.1 mrg {
1963 1.1 mrg gcc_assert (!reload_in_progress && !reload_completed);
1964 1.1 mrg reg = gen_reg_rtx (Pmode);
1965 1.1 mrg
1966 1.1 mrg subregs = 1;
1967 1.1 mrg }
1968 1.1 mrg
1969 1.1 mrg if (subregs)
1970 1.1 mrg address = gen_reg_rtx (Pmode);
1971 1.1 mrg else
1972 1.1 mrg address = reg;
1973 1.1 mrg
1974 1.1 mrg crtl->uses_pic_offset_table = 1;
1975 1.1 mrg
1976 1.1 mrg if (GET_CODE (orig) == LABEL_REF
1977 1.1 mrg || (GET_CODE (orig) == SYMBOL_REF && SYMBOL_REF_LOCAL_P (orig)))
1978 1.1 mrg {
1979 1.1 mrg emit_insn (gen_gotoff_load_addr (reg, orig));
1980 1.1 mrg emit_insn (gen_addsi3 (reg, reg, pic_offset_table_rtx));
1981 1.1 mrg return reg;
1982 1.1 mrg }
1983 1.1 mrg
1984 1.1 mrg emit_insn (gen_pic_load_addr (address, orig));
1985 1.1 mrg
1986 1.1 mrg emit_insn (gen_addsi3 (address, address, pic_offset_table_rtx));
1987 1.1 mrg pic_ref = gen_const_mem (Pmode, address);
1988 1.1 mrg emit_move_insn (reg, pic_ref);
1989 1.1 mrg return reg;
1990 1.1 mrg }
1991 1.1 mrg else if (GET_CODE (orig) == CONST)
1992 1.1 mrg {
1993 1.1 mrg rtx base, offset;
1994 1.1 mrg
1995 1.1 mrg if (GET_CODE (XEXP (orig, 0)) == PLUS
1996 1.1 mrg && XEXP (XEXP (orig, 0), 1) == pic_offset_table_rtx)
1997 1.1 mrg return orig;
1998 1.1 mrg
1999 1.1 mrg if (reg == 0)
2000 1.1 mrg {
2001 1.1 mrg gcc_assert (!reload_in_progress && !reload_completed);
2002 1.1 mrg reg = gen_reg_rtx (Pmode);
2003 1.1 mrg }
2004 1.1 mrg
2005 1.1 mrg if (GET_CODE (XEXP (orig, 0)) == PLUS)
2006 1.1 mrg {
2007 1.1 mrg base = m32r_legitimize_pic_address (XEXP (XEXP (orig, 0), 0), reg);
2008 1.1 mrg if (base == reg)
2009 1.1 mrg offset = m32r_legitimize_pic_address (XEXP (XEXP (orig, 0), 1), NULL_RTX);
2010 1.1 mrg else
2011 1.1 mrg offset = m32r_legitimize_pic_address (XEXP (XEXP (orig, 0), 1), reg);
2012 1.1 mrg }
2013 1.1 mrg else
2014 1.1 mrg return orig;
2015 1.1 mrg
2016 1.1 mrg if (CONST_INT_P (offset))
2017 1.1 mrg {
2018 1.1 mrg if (INT16_P (INTVAL (offset)))
2019 1.1 mrg return plus_constant (Pmode, base, INTVAL (offset));
2020 1.1 mrg else
2021 1.1 mrg {
2022 1.1 mrg gcc_assert (! reload_in_progress && ! reload_completed);
2023 1.1 mrg offset = force_reg (Pmode, offset);
2024 1.1 mrg }
2025 1.1 mrg }
2026 1.1 mrg
2027 1.1 mrg return gen_rtx_PLUS (Pmode, base, offset);
2028 1.1 mrg }
2029 1.1 mrg
2030 1.1 mrg return orig;
2031 1.1 mrg }
2032 1.1 mrg
2033 1.1 mrg static rtx
2034 1.1 mrg m32r_legitimize_address (rtx x, rtx orig_x ATTRIBUTE_UNUSED,
2035 1.1 mrg machine_mode mode ATTRIBUTE_UNUSED)
2036 1.1 mrg {
2037 1.1 mrg if (flag_pic)
2038 1.1 mrg return m32r_legitimize_pic_address (x, NULL_RTX);
2039 1.1 mrg else
2040 1.1 mrg return x;
2041 1.1 mrg }
2042 1.1 mrg
2043 1.1 mrg /* Worker function for TARGET_MODE_DEPENDENT_ADDRESS_P. */
2044 1.1 mrg
2045 1.1 mrg static bool
2046 1.1 mrg m32r_mode_dependent_address_p (const_rtx addr, addr_space_t as ATTRIBUTE_UNUSED)
2047 1.1 mrg {
2048 1.1 mrg if (GET_CODE (addr) == LO_SUM)
2049 1.1 mrg return true;
2050 1.1 mrg
2051 1.1 mrg return false;
2052 1.1 mrg }
2053 1.1 mrg
2054 1.1 mrg /* Nested function support. */
2056 1.1 mrg
2057 1.1 mrg /* Emit RTL insns to initialize the variable parts of a trampoline.
2058 1.1 mrg FNADDR is an RTX for the address of the function's pure code.
2059 1.1 mrg CXT is an RTX for the static chain value for the function. */
2060 1.1 mrg
2061 1.1 mrg void
2062 1.1 mrg m32r_initialize_trampoline (rtx tramp ATTRIBUTE_UNUSED,
2063 1.1 mrg rtx fnaddr ATTRIBUTE_UNUSED,
2064 1.1 mrg rtx cxt ATTRIBUTE_UNUSED)
2065 1.1 mrg {
2066 1.1 mrg }
2067 1.1 mrg
2068 1.1 mrg static void
2070 1.1 mrg m32r_file_start (void)
2071 1.1 mrg {
2072 1.1 mrg default_file_start ();
2073 1.1 mrg
2074 1.1 mrg if (flag_verbose_asm)
2075 1.1 mrg fprintf (asm_out_file,
2076 1.1 mrg "%s M32R/D special options: -G %d\n",
2077 1.1 mrg ASM_COMMENT_START, g_switch_value);
2078 1.1 mrg
2079 1.1 mrg if (TARGET_LITTLE_ENDIAN)
2080 1.1 mrg fprintf (asm_out_file, "\t.little\n");
2081 1.1 mrg }
2082 1.1 mrg
2083 1.1 mrg /* Print operand X (an rtx) in assembler syntax to file FILE.
2085 1.1 mrg CODE is a letter or dot (`z' in `%z0') or 0 if no letter was specified.
2086 1.1 mrg For `%' followed by punctuation, CODE is the punctuation and X is null. */
2087 1.1 mrg
2088 1.1 mrg static void
2089 1.1 mrg m32r_print_operand (FILE * file, rtx x, int code)
2090 1.1 mrg {
2091 1.1 mrg rtx addr;
2092 1.1 mrg
2093 1.1 mrg switch (code)
2094 1.1 mrg {
2095 1.1 mrg /* The 's' and 'p' codes are used by output_block_move() to
2096 1.1 mrg indicate post-increment 's'tores and 'p're-increment loads. */
2097 1.1 mrg case 's':
2098 1.1 mrg if (REG_P (x))
2099 1.1 mrg fprintf (file, "@+%s", reg_names [REGNO (x)]);
2100 1.1 mrg else
2101 1.1 mrg output_operand_lossage ("invalid operand to %%s code");
2102 1.1 mrg return;
2103 1.1 mrg
2104 1.1 mrg case 'p':
2105 1.1 mrg if (REG_P (x))
2106 1.1 mrg fprintf (file, "@%s+", reg_names [REGNO (x)]);
2107 1.1 mrg else
2108 1.1 mrg output_operand_lossage ("invalid operand to %%p code");
2109 1.1 mrg return;
2110 1.1 mrg
2111 1.1 mrg case 'R' :
2112 1.1 mrg /* Write second word of DImode or DFmode reference,
2113 1.1 mrg register or memory. */
2114 1.1 mrg if (REG_P (x))
2115 1.1 mrg fputs (reg_names[REGNO (x)+1], file);
2116 1.1 mrg else if (MEM_P (x))
2117 1.1 mrg {
2118 1.1 mrg machine_mode mode = GET_MODE (x);
2119 1.1 mrg
2120 1.1 mrg fprintf (file, "@(");
2121 1.1 mrg /* Handle possible auto-increment. Since it is pre-increment and
2122 1.1 mrg we have already done it, we can just use an offset of four. */
2123 1.1 mrg /* ??? This is taken from rs6000.cc I think. I don't think it is
2124 1.1 mrg currently necessary, but keep it around. */
2125 1.1 mrg if (GET_CODE (XEXP (x, 0)) == PRE_INC
2126 1.1 mrg || GET_CODE (XEXP (x, 0)) == PRE_DEC)
2127 1.1 mrg output_address (mode, plus_constant (Pmode,
2128 1.1 mrg XEXP (XEXP (x, 0), 0), 4));
2129 1.1 mrg else
2130 1.1 mrg output_address (mode, plus_constant (Pmode, XEXP (x, 0), 4));
2131 1.1 mrg fputc (')', file);
2132 1.1 mrg }
2133 1.1 mrg else
2134 1.1 mrg output_operand_lossage ("invalid operand to %%R code");
2135 1.1 mrg return;
2136 1.1 mrg
2137 1.1 mrg case 'H' : /* High word. */
2138 1.1 mrg case 'L' : /* Low word. */
2139 1.1 mrg if (REG_P (x))
2140 1.1 mrg {
2141 1.1 mrg /* L = least significant word, H = most significant word. */
2142 1.1 mrg if ((WORDS_BIG_ENDIAN != 0) ^ (code == 'L'))
2143 1.1 mrg fputs (reg_names[REGNO (x)], file);
2144 1.1 mrg else
2145 1.1 mrg fputs (reg_names[REGNO (x)+1], file);
2146 1.1 mrg }
2147 1.1 mrg else if (CONST_INT_P (x)
2148 1.1 mrg || GET_CODE (x) == CONST_DOUBLE)
2149 1.1 mrg {
2150 1.1 mrg rtx first, second;
2151 1.1 mrg
2152 1.1 mrg split_double (x, &first, &second);
2153 1.1 mrg fprintf (file, HOST_WIDE_INT_PRINT_HEX,
2154 1.1 mrg code == 'L' ? INTVAL (first) : INTVAL (second));
2155 1.1 mrg }
2156 1.1 mrg else
2157 1.1 mrg output_operand_lossage ("invalid operand to %%H/%%L code");
2158 1.1 mrg return;
2159 1.1 mrg
2160 1.1 mrg case 'A' :
2161 1.1 mrg {
2162 1.1 mrg char str[30];
2163 1.1 mrg
2164 1.1 mrg if (GET_CODE (x) != CONST_DOUBLE
2165 1.1 mrg || GET_MODE_CLASS (GET_MODE (x)) != MODE_FLOAT)
2166 1.1 mrg fatal_insn ("bad insn for 'A'", x);
2167 1.1 mrg
2168 1.1 mrg real_to_decimal (str, CONST_DOUBLE_REAL_VALUE (x), sizeof (str), 0, 1);
2169 1.1 mrg fprintf (file, "%s", str);
2170 1.1 mrg return;
2171 1.1 mrg }
2172 1.1 mrg
2173 1.1 mrg case 'B' : /* Bottom half. */
2174 1.1 mrg case 'T' : /* Top half. */
2175 1.1 mrg /* Output the argument to a `seth' insn (sets the Top half-word).
2176 1.1 mrg For constants output arguments to a seth/or3 pair to set Top and
2177 1.1 mrg Bottom halves. For symbols output arguments to a seth/add3 pair to
2178 1.1 mrg set Top and Bottom halves. The difference exists because for
2179 1.1 mrg constants seth/or3 is more readable but for symbols we need to use
2180 1.1 mrg the same scheme as `ld' and `st' insns (16-bit addend is signed). */
2181 1.1 mrg switch (GET_CODE (x))
2182 1.1 mrg {
2183 1.1 mrg case CONST_INT :
2184 1.1 mrg case CONST_DOUBLE :
2185 1.1 mrg {
2186 1.1 mrg rtx first, second;
2187 1.1 mrg
2188 1.1 mrg split_double (x, &first, &second);
2189 1.1 mrg x = WORDS_BIG_ENDIAN ? second : first;
2190 1.1 mrg fprintf (file, HOST_WIDE_INT_PRINT_HEX,
2191 1.1 mrg (code == 'B'
2192 1.1 mrg ? INTVAL (x) & 0xffff
2193 1.1 mrg : (INTVAL (x) >> 16) & 0xffff));
2194 1.1 mrg }
2195 1.1 mrg return;
2196 1.1 mrg case CONST :
2197 1.1 mrg case SYMBOL_REF :
2198 1.1 mrg if (code == 'B'
2199 1.1 mrg && small_data_operand (x, VOIDmode))
2200 1.1 mrg {
2201 1.1 mrg fputs ("sda(", file);
2202 1.1 mrg output_addr_const (file, x);
2203 1.1 mrg fputc (')', file);
2204 1.1 mrg return;
2205 1.1 mrg }
2206 1.1 mrg /* fall through */
2207 1.1 mrg case LABEL_REF :
2208 1.1 mrg fputs (code == 'T' ? "shigh(" : "low(", file);
2209 1.1 mrg output_addr_const (file, x);
2210 1.1 mrg fputc (')', file);
2211 1.1 mrg return;
2212 1.1 mrg default :
2213 1.1 mrg output_operand_lossage ("invalid operand to %%T/%%B code");
2214 1.1 mrg return;
2215 1.1 mrg }
2216 1.1 mrg break;
2217 1.1 mrg
2218 1.1 mrg case 'U' :
2219 1.1 mrg /* ??? wip */
2220 1.1 mrg /* Output a load/store with update indicator if appropriate. */
2221 1.1 mrg if (MEM_P (x))
2222 1.1 mrg {
2223 1.1 mrg if (GET_CODE (XEXP (x, 0)) == PRE_INC
2224 1.1 mrg || GET_CODE (XEXP (x, 0)) == PRE_DEC)
2225 1.1 mrg fputs (".a", file);
2226 1.1 mrg }
2227 1.1 mrg else
2228 1.1 mrg output_operand_lossage ("invalid operand to %%U code");
2229 1.1 mrg return;
2230 1.1 mrg
2231 1.1 mrg case 'N' :
2232 1.1 mrg /* Print a constant value negated. */
2233 1.1 mrg if (CONST_INT_P (x))
2234 1.1 mrg output_addr_const (file, GEN_INT (- INTVAL (x)));
2235 1.1 mrg else
2236 1.1 mrg output_operand_lossage ("invalid operand to %%N code");
2237 1.1 mrg return;
2238 1.1 mrg
2239 1.1 mrg case 'X' :
2240 1.1 mrg /* Print a const_int in hex. Used in comments. */
2241 1.1 mrg if (CONST_INT_P (x))
2242 1.1 mrg fprintf (file, HOST_WIDE_INT_PRINT_HEX, INTVAL (x));
2243 1.1 mrg return;
2244 1.1 mrg
2245 1.1 mrg case '#' :
2246 1.1 mrg fputs (IMMEDIATE_PREFIX, file);
2247 1.1 mrg return;
2248 1.1 mrg
2249 1.1 mrg case 0 :
2250 1.1 mrg /* Do nothing special. */
2251 1.1 mrg break;
2252 1.1 mrg
2253 1.1 mrg default :
2254 1.1 mrg /* Unknown flag. */
2255 1.1 mrg output_operand_lossage ("invalid operand output code");
2256 1.1 mrg }
2257 1.1 mrg
2258 1.1 mrg switch (GET_CODE (x))
2259 1.1 mrg {
2260 1.1 mrg case REG :
2261 1.1 mrg fputs (reg_names[REGNO (x)], file);
2262 1.1 mrg break;
2263 1.1 mrg
2264 1.1 mrg case MEM :
2265 1.1 mrg addr = XEXP (x, 0);
2266 1.1 mrg if (GET_CODE (addr) == PRE_INC)
2267 1.1 mrg {
2268 1.1 mrg if (!REG_P (XEXP (addr, 0)))
2269 1.1 mrg fatal_insn ("pre-increment address is not a register", x);
2270 1.1 mrg
2271 1.1 mrg fprintf (file, "@+%s", reg_names[REGNO (XEXP (addr, 0))]);
2272 1.1 mrg }
2273 1.1 mrg else if (GET_CODE (addr) == PRE_DEC)
2274 1.1 mrg {
2275 1.1 mrg if (!REG_P (XEXP (addr, 0)))
2276 1.1 mrg fatal_insn ("pre-decrement address is not a register", x);
2277 1.1 mrg
2278 1.1 mrg fprintf (file, "@-%s", reg_names[REGNO (XEXP (addr, 0))]);
2279 1.1 mrg }
2280 1.1 mrg else if (GET_CODE (addr) == POST_INC)
2281 1.1 mrg {
2282 1.1 mrg if (!REG_P (XEXP (addr, 0)))
2283 1.1 mrg fatal_insn ("post-increment address is not a register", x);
2284 1.1 mrg
2285 1.1 mrg fprintf (file, "@%s+", reg_names[REGNO (XEXP (addr, 0))]);
2286 1.1 mrg }
2287 1.1 mrg else
2288 1.1 mrg {
2289 1.1 mrg fputs ("@(", file);
2290 1.1 mrg output_address (GET_MODE (x), addr);
2291 1.1 mrg fputc (')', file);
2292 1.1 mrg }
2293 1.1 mrg break;
2294 1.1 mrg
2295 1.1 mrg case CONST_DOUBLE :
2296 1.1 mrg /* We handle SFmode constants here as output_addr_const doesn't. */
2297 1.1 mrg if (GET_MODE (x) == SFmode)
2298 1.1 mrg {
2299 1.1 mrg long l;
2300 1.1 mrg
2301 1.1 mrg REAL_VALUE_TO_TARGET_SINGLE (*CONST_DOUBLE_REAL_VALUE (x), l);
2302 1.1 mrg fprintf (file, "0x%08lx", l);
2303 1.1 mrg break;
2304 1.1 mrg }
2305 1.1 mrg
2306 1.1 mrg /* FALLTHRU */
2307 1.1 mrg /* Let output_addr_const deal with it. */
2308 1.1 mrg
2309 1.1 mrg default :
2310 1.1 mrg output_addr_const (file, x);
2311 1.1 mrg break;
2312 1.1 mrg }
2313 1.1 mrg }
2314 1.1 mrg
2315 1.1 mrg /* Print a memory address as an operand to reference that memory location. */
2316 1.1 mrg
2317 1.1 mrg static void
2318 1.1 mrg m32r_print_operand_address (FILE * file, machine_mode /*mode*/, rtx addr)
2319 1.1 mrg {
2320 1.1 mrg rtx base;
2321 1.1 mrg rtx index = 0;
2322 1.1 mrg int offset = 0;
2323 1.1 mrg
2324 1.1 mrg switch (GET_CODE (addr))
2325 1.1 mrg {
2326 1.1 mrg case REG :
2327 1.1 mrg fputs (reg_names[REGNO (addr)], file);
2328 1.1 mrg break;
2329 1.1 mrg
2330 1.1 mrg case PLUS :
2331 1.1 mrg if (CONST_INT_P (XEXP (addr, 0)))
2332 1.1 mrg offset = INTVAL (XEXP (addr, 0)), base = XEXP (addr, 1);
2333 1.1 mrg else if (CONST_INT_P (XEXP (addr, 1)))
2334 1.1 mrg offset = INTVAL (XEXP (addr, 1)), base = XEXP (addr, 0);
2335 1.1 mrg else
2336 1.1 mrg base = XEXP (addr, 0), index = XEXP (addr, 1);
2337 1.1 mrg if (REG_P (base))
2338 1.1 mrg {
2339 1.1 mrg /* Print the offset first (if present) to conform to the manual. */
2340 1.1 mrg if (index == 0)
2341 1.1 mrg {
2342 1.1 mrg if (offset != 0)
2343 1.1 mrg fprintf (file, "%d,", offset);
2344 1.1 mrg fputs (reg_names[REGNO (base)], file);
2345 1.1 mrg }
2346 1.1 mrg /* The chip doesn't support this, but left in for generality. */
2347 1.1 mrg else if (REG_P (index))
2348 1.1 mrg fprintf (file, "%s,%s",
2349 1.1 mrg reg_names[REGNO (base)], reg_names[REGNO (index)]);
2350 1.1 mrg /* Not sure this can happen, but leave in for now. */
2351 1.1 mrg else if (GET_CODE (index) == SYMBOL_REF)
2352 1.1 mrg {
2353 1.1 mrg output_addr_const (file, index);
2354 1.1 mrg fputc (',', file);
2355 1.1 mrg fputs (reg_names[REGNO (base)], file);
2356 1.1 mrg }
2357 1.1 mrg else
2358 1.1 mrg fatal_insn ("bad address", addr);
2359 1.1 mrg }
2360 1.1 mrg else if (GET_CODE (base) == LO_SUM)
2361 1.1 mrg {
2362 1.1 mrg gcc_assert (!index && REG_P (XEXP (base, 0)));
2363 1.1 mrg if (small_data_operand (XEXP (base, 1), VOIDmode))
2364 1.1 mrg fputs ("sda(", file);
2365 1.1 mrg else
2366 1.1 mrg fputs ("low(", file);
2367 1.1 mrg output_addr_const (file, plus_constant (Pmode, XEXP (base, 1),
2368 1.1 mrg offset));
2369 1.1 mrg fputs ("),", file);
2370 1.1 mrg fputs (reg_names[REGNO (XEXP (base, 0))], file);
2371 1.1 mrg }
2372 1.1 mrg else
2373 1.1 mrg fatal_insn ("bad address", addr);
2374 1.1 mrg break;
2375 1.1 mrg
2376 1.1 mrg case LO_SUM :
2377 1.1 mrg if (!REG_P (XEXP (addr, 0)))
2378 1.1 mrg fatal_insn ("lo_sum not of register", addr);
2379 1.1 mrg if (small_data_operand (XEXP (addr, 1), VOIDmode))
2380 1.1 mrg fputs ("sda(", file);
2381 1.1 mrg else
2382 1.1 mrg fputs ("low(", file);
2383 1.1 mrg output_addr_const (file, XEXP (addr, 1));
2384 1.1 mrg fputs ("),", file);
2385 1.1 mrg fputs (reg_names[REGNO (XEXP (addr, 0))], file);
2386 1.1 mrg break;
2387 1.1 mrg
2388 1.1 mrg case PRE_INC : /* Assume SImode. */
2389 1.1 mrg fprintf (file, "+%s", reg_names[REGNO (XEXP (addr, 0))]);
2390 1.1 mrg break;
2391 1.1 mrg
2392 1.1 mrg case PRE_DEC : /* Assume SImode. */
2393 1.1 mrg fprintf (file, "-%s", reg_names[REGNO (XEXP (addr, 0))]);
2394 1.1 mrg break;
2395 1.1 mrg
2396 1.1 mrg case POST_INC : /* Assume SImode. */
2397 1.1 mrg fprintf (file, "%s+", reg_names[REGNO (XEXP (addr, 0))]);
2398 1.1 mrg break;
2399 1.1 mrg
2400 1.1 mrg default :
2401 1.1 mrg output_addr_const (file, addr);
2402 1.1 mrg break;
2403 1.1 mrg }
2404 1.1 mrg }
2405 1.1 mrg
2406 1.1 mrg static bool
2407 1.1 mrg m32r_print_operand_punct_valid_p (unsigned char code)
2408 1.1 mrg {
2409 1.1 mrg return m32r_punct_chars[code];
2410 1.1 mrg }
2411 1.1 mrg
2412 1.1 mrg /* Return true if the operands are the constants 0 and 1. */
2413 1.1 mrg
2414 1.1 mrg int
2415 1.1 mrg zero_and_one (rtx operand1, rtx operand2)
2416 1.1 mrg {
2417 1.1 mrg return
2418 1.1 mrg CONST_INT_P (operand1)
2419 1.1 mrg && CONST_INT_P (operand2)
2420 1.1 mrg && ( ((INTVAL (operand1) == 0) && (INTVAL (operand2) == 1))
2421 1.1 mrg ||((INTVAL (operand1) == 1) && (INTVAL (operand2) == 0)));
2422 1.1 mrg }
2423 1.1 mrg
2424 1.1 mrg /* Generate the correct assembler code to handle the conditional loading of a
2425 1.1 mrg value into a register. It is known that the operands satisfy the
2426 1.1 mrg conditional_move_operand() function above. The destination is operand[0].
2427 1.1 mrg The condition is operand [1]. The 'true' value is operand [2] and the
2428 1.1 mrg 'false' value is operand [3]. */
2429 1.1 mrg
2430 1.1 mrg char *
2431 1.1 mrg emit_cond_move (rtx * operands, rtx insn ATTRIBUTE_UNUSED)
2432 1.1 mrg {
2433 1.1 mrg static char buffer [100];
2434 1.1 mrg const char * dest = reg_names [REGNO (operands [0])];
2435 1.1 mrg
2436 1.1 mrg buffer [0] = 0;
2437 1.1 mrg
2438 1.1 mrg /* Destination must be a register. */
2439 1.1 mrg gcc_assert (REG_P (operands [0]));
2440 1.1 mrg gcc_assert (conditional_move_operand (operands [2], SImode));
2441 1.1 mrg gcc_assert (conditional_move_operand (operands [3], SImode));
2442 1.1 mrg
2443 1.1 mrg /* Check to see if the test is reversed. */
2444 1.1 mrg if (GET_CODE (operands [1]) == NE)
2445 1.1 mrg {
2446 1.1 mrg rtx tmp = operands [2];
2447 1.1 mrg operands [2] = operands [3];
2448 1.1 mrg operands [3] = tmp;
2449 1.1 mrg }
2450 1.1 mrg
2451 1.1 mrg sprintf (buffer, "mvfc %s, cbr", dest);
2452 1.1 mrg
2453 1.1 mrg /* If the true value was '0' then we need to invert the results of the move. */
2454 1.1 mrg if (INTVAL (operands [2]) == 0)
2455 1.1 mrg sprintf (buffer + strlen (buffer), "\n\txor3 %s, %s, #1",
2456 1.1 mrg dest, dest);
2457 1.1 mrg
2458 1.1 mrg return buffer;
2459 1.1 mrg }
2460 1.1 mrg
2461 1.1 mrg /* Returns true if the registers contained in the two
2462 1.1 mrg rtl expressions are different. */
2463 1.1 mrg
2464 1.1 mrg int
2465 1.1 mrg m32r_not_same_reg (rtx a, rtx b)
2466 1.1 mrg {
2467 1.1 mrg int reg_a = -1;
2468 1.1 mrg int reg_b = -2;
2469 1.1 mrg
2470 1.1 mrg while (GET_CODE (a) == SUBREG)
2471 1.1 mrg a = SUBREG_REG (a);
2472 1.1 mrg
2473 1.1 mrg if (REG_P (a))
2474 1.1 mrg reg_a = REGNO (a);
2475 1.1 mrg
2476 1.1 mrg while (GET_CODE (b) == SUBREG)
2477 1.1 mrg b = SUBREG_REG (b);
2478 1.1 mrg
2479 1.1 mrg if (REG_P (b))
2480 1.1 mrg reg_b = REGNO (b);
2481 1.1 mrg
2482 1.1 mrg return reg_a != reg_b;
2483 1.1 mrg }
2484 1.1 mrg
2485 1.1 mrg
2486 1.1 mrg rtx
2488 1.1 mrg m32r_function_symbol (const char *name)
2489 1.1 mrg {
2490 1.1 mrg int extra_flags = 0;
2491 1.1 mrg enum m32r_model model;
2492 1.1 mrg rtx sym = gen_rtx_SYMBOL_REF (Pmode, name);
2493 1.1 mrg
2494 1.1 mrg if (TARGET_MODEL_SMALL)
2495 1.1 mrg model = M32R_MODEL_SMALL;
2496 1.1 mrg else if (TARGET_MODEL_MEDIUM)
2497 1.1 mrg model = M32R_MODEL_MEDIUM;
2498 1.1 mrg else if (TARGET_MODEL_LARGE)
2499 1.1 mrg model = M32R_MODEL_LARGE;
2500 1.1 mrg else
2501 1.1 mrg gcc_unreachable (); /* Shouldn't happen. */
2502 1.1 mrg extra_flags |= model << SYMBOL_FLAG_MODEL_SHIFT;
2503 1.1 mrg
2504 1.1 mrg if (extra_flags)
2505 1.1 mrg SYMBOL_REF_FLAGS (sym) |= extra_flags;
2506 1.1 mrg
2507 1.1 mrg return sym;
2508 1.1 mrg }
2509 1.1 mrg
2510 1.1 mrg /* Use a library function to move some bytes. */
2511 1.1 mrg
2512 1.1 mrg static void
2513 1.1 mrg block_move_call (rtx dest_reg, rtx src_reg, rtx bytes_rtx)
2514 1.1 mrg {
2515 1.1 mrg /* We want to pass the size as Pmode, which will normally be SImode
2516 1.1 mrg but will be DImode if we are using 64-bit longs and pointers. */
2517 1.1 mrg if (GET_MODE (bytes_rtx) != VOIDmode
2518 1.1 mrg && GET_MODE (bytes_rtx) != Pmode)
2519 1.1 mrg bytes_rtx = convert_to_mode (Pmode, bytes_rtx, 1);
2520 1.1 mrg
2521 1.1 mrg emit_library_call (m32r_function_symbol ("memcpy"), LCT_NORMAL,
2522 1.1 mrg VOIDmode, dest_reg, Pmode, src_reg, Pmode,
2523 1.1 mrg convert_to_mode (TYPE_MODE (sizetype), bytes_rtx,
2524 1.1 mrg TYPE_UNSIGNED (sizetype)),
2525 1.1 mrg TYPE_MODE (sizetype));
2526 1.1 mrg }
2527 1.1 mrg
2528 1.1 mrg /* Expand string/block move operations.
2529 1.1 mrg
2530 1.1 mrg operands[0] is the pointer to the destination.
2531 1.1 mrg operands[1] is the pointer to the source.
2532 1.1 mrg operands[2] is the number of bytes to move.
2533 1.1 mrg operands[3] is the alignment.
2534 1.1 mrg
2535 1.1 mrg Returns 1 upon success, 0 otherwise. */
2536 1.1 mrg
2537 1.1 mrg int
2538 1.1 mrg m32r_expand_block_move (rtx operands[])
2539 1.1 mrg {
2540 1.1 mrg rtx orig_dst = operands[0];
2541 1.1 mrg rtx orig_src = operands[1];
2542 1.1 mrg rtx bytes_rtx = operands[2];
2543 1.1 mrg rtx align_rtx = operands[3];
2544 1.1 mrg int constp = CONST_INT_P (bytes_rtx);
2545 1.1 mrg HOST_WIDE_INT bytes = constp ? INTVAL (bytes_rtx) : 0;
2546 1.1 mrg int align = INTVAL (align_rtx);
2547 1.1 mrg int leftover;
2548 1.1 mrg rtx src_reg;
2549 1.1 mrg rtx dst_reg;
2550 1.1 mrg
2551 1.1 mrg if (constp && bytes <= 0)
2552 1.1 mrg return 1;
2553 1.1 mrg
2554 1.1 mrg /* Move the address into scratch registers. */
2555 1.1 mrg dst_reg = copy_addr_to_reg (XEXP (orig_dst, 0));
2556 1.1 mrg src_reg = copy_addr_to_reg (XEXP (orig_src, 0));
2557 1.1 mrg
2558 1.1 mrg if (align > UNITS_PER_WORD)
2559 1.1 mrg align = UNITS_PER_WORD;
2560 1.1 mrg
2561 1.1 mrg /* If we prefer size over speed, always use a function call.
2562 1.1 mrg If we do not know the size, use a function call.
2563 1.1 mrg If the blocks are not word aligned, use a function call. */
2564 1.1 mrg if (optimize_size || ! constp || align != UNITS_PER_WORD)
2565 1.1 mrg {
2566 1.1 mrg block_move_call (dst_reg, src_reg, bytes_rtx);
2567 1.1 mrg return 0;
2568 1.1 mrg }
2569 1.1 mrg
2570 1.1 mrg leftover = bytes % MAX_MOVE_BYTES;
2571 1.1 mrg bytes -= leftover;
2572 1.1 mrg
2573 1.1 mrg /* If necessary, generate a loop to handle the bulk of the copy. */
2574 1.1 mrg if (bytes)
2575 1.1 mrg {
2576 1.1 mrg rtx_code_label *label = NULL;
2577 1.1 mrg rtx final_src = NULL_RTX;
2578 1.1 mrg rtx at_a_time = GEN_INT (MAX_MOVE_BYTES);
2579 1.1 mrg rtx rounded_total = GEN_INT (bytes);
2580 1.1 mrg rtx new_dst_reg = gen_reg_rtx (SImode);
2581 1.1 mrg rtx new_src_reg = gen_reg_rtx (SImode);
2582 1.1 mrg
2583 1.1 mrg /* If we are going to have to perform this loop more than
2584 1.1 mrg once, then generate a label and compute the address the
2585 1.1 mrg source register will contain upon completion of the final
2586 1.1 mrg iteration. */
2587 1.1 mrg if (bytes > MAX_MOVE_BYTES)
2588 1.1 mrg {
2589 1.1 mrg final_src = gen_reg_rtx (Pmode);
2590 1.1 mrg
2591 1.1 mrg if (INT16_P(bytes))
2592 1.1 mrg emit_insn (gen_addsi3 (final_src, src_reg, rounded_total));
2593 1.1 mrg else
2594 1.1 mrg {
2595 1.1 mrg emit_insn (gen_movsi (final_src, rounded_total));
2596 1.1 mrg emit_insn (gen_addsi3 (final_src, final_src, src_reg));
2597 1.1 mrg }
2598 1.1 mrg
2599 1.1 mrg label = gen_label_rtx ();
2600 1.1 mrg emit_label (label);
2601 1.1 mrg }
2602 1.1 mrg
2603 1.1 mrg /* It is known that output_block_move() will update src_reg to point
2604 1.1 mrg to the word after the end of the source block, and dst_reg to point
2605 1.1 mrg to the last word of the destination block, provided that the block
2606 1.1 mrg is MAX_MOVE_BYTES long. */
2607 1.1 mrg emit_insn (gen_cpymemsi_internal (dst_reg, src_reg, at_a_time,
2608 1.1 mrg new_dst_reg, new_src_reg));
2609 1.1 mrg emit_move_insn (dst_reg, new_dst_reg);
2610 1.1 mrg emit_move_insn (src_reg, new_src_reg);
2611 1.1 mrg emit_insn (gen_addsi3 (dst_reg, dst_reg, GEN_INT (4)));
2612 1.1 mrg
2613 1.1 mrg if (bytes > MAX_MOVE_BYTES)
2614 1.1 mrg {
2615 1.1 mrg rtx test = gen_rtx_NE (VOIDmode, src_reg, final_src);
2616 1.1 mrg emit_jump_insn (gen_cbranchsi4 (test, src_reg, final_src, label));
2617 1.1 mrg }
2618 1.1 mrg }
2619 1.1 mrg
2620 1.1 mrg if (leftover)
2621 1.1 mrg emit_insn (gen_cpymemsi_internal (dst_reg, src_reg, GEN_INT (leftover),
2622 1.1 mrg gen_reg_rtx (SImode),
2623 1.1 mrg gen_reg_rtx (SImode)));
2624 1.1 mrg return 1;
2625 1.1 mrg }
2626 1.1 mrg
2627 1.1 mrg
2628 1.1 mrg /* Emit load/stores for a small constant word aligned block_move.
2630 1.1 mrg
2631 1.1 mrg operands[0] is the memory address of the destination.
2632 1.1 mrg operands[1] is the memory address of the source.
2633 1.1 mrg operands[2] is the number of bytes to move.
2634 1.1 mrg operands[3] is a temp register.
2635 1.1 mrg operands[4] is a temp register. */
2636 1.1 mrg
2637 1.1 mrg void
2638 1.1 mrg m32r_output_block_move (rtx insn ATTRIBUTE_UNUSED, rtx operands[])
2639 1.1 mrg {
2640 1.1 mrg HOST_WIDE_INT bytes = INTVAL (operands[2]);
2641 1.1 mrg int first_time;
2642 1.1 mrg int got_extra = 0;
2643 1.1 mrg
2644 1.1 mrg gcc_assert (bytes >= 1 && bytes <= MAX_MOVE_BYTES);
2645 1.1 mrg
2646 1.1 mrg /* We do not have a post-increment store available, so the first set of
2647 1.1 mrg stores are done without any increment, then the remaining ones can use
2648 1.1 mrg the pre-increment addressing mode.
2649 1.1 mrg
2650 1.1 mrg Note: expand_block_move() also relies upon this behavior when building
2651 1.1 mrg loops to copy large blocks. */
2652 1.1 mrg first_time = 1;
2653 1.1 mrg
2654 1.1 mrg while (bytes > 0)
2655 1.1 mrg {
2656 1.1 mrg if (bytes >= 8)
2657 1.1 mrg {
2658 1.1 mrg if (first_time)
2659 1.1 mrg {
2660 1.1 mrg output_asm_insn ("ld\t%5, %p1", operands);
2661 1.1 mrg output_asm_insn ("ld\t%6, %p1", operands);
2662 1.1 mrg output_asm_insn ("st\t%5, @%0", operands);
2663 1.1 mrg output_asm_insn ("st\t%6, %s0", operands);
2664 1.1 mrg }
2665 1.1 mrg else
2666 1.1 mrg {
2667 1.1 mrg output_asm_insn ("ld\t%5, %p1", operands);
2668 1.1 mrg output_asm_insn ("ld\t%6, %p1", operands);
2669 1.1 mrg output_asm_insn ("st\t%5, %s0", operands);
2670 1.1 mrg output_asm_insn ("st\t%6, %s0", operands);
2671 1.1 mrg }
2672 1.1 mrg
2673 1.1 mrg bytes -= 8;
2674 1.1 mrg }
2675 1.1 mrg else if (bytes >= 4)
2676 1.1 mrg {
2677 1.1 mrg if (bytes > 4)
2678 1.1 mrg got_extra = 1;
2679 1.1 mrg
2680 1.1 mrg output_asm_insn ("ld\t%5, %p1", operands);
2681 1.1 mrg
2682 1.1 mrg if (got_extra)
2683 1.1 mrg output_asm_insn ("ld\t%6, %p1", operands);
2684 1.1 mrg
2685 1.1 mrg if (first_time)
2686 1.1 mrg output_asm_insn ("st\t%5, @%0", operands);
2687 1.1 mrg else
2688 1.1 mrg output_asm_insn ("st\t%5, %s0", operands);
2689 1.1 mrg
2690 1.1 mrg bytes -= 4;
2691 1.1 mrg }
2692 1.1 mrg else
2693 1.1 mrg {
2694 1.1 mrg /* Get the entire next word, even though we do not want all of it.
2695 1.1 mrg The saves us from doing several smaller loads, and we assume that
2696 1.1 mrg we cannot cause a page fault when at least part of the word is in
2697 1.1 mrg valid memory [since we don't get called if things aren't properly
2698 1.1 mrg aligned]. */
2699 1.1 mrg int dst_offset = first_time ? 0 : 4;
2700 1.1 mrg /* The amount of increment we have to make to the
2701 1.1 mrg destination pointer. */
2702 1.1 mrg int dst_inc_amount = dst_offset + bytes - 4;
2703 1.1 mrg /* The same for the source pointer. */
2704 1.1 mrg int src_inc_amount = bytes - (got_extra ? 4 : 0);
2705 1.1 mrg int last_shift;
2706 1.1 mrg rtx my_operands[3];
2707 1.1 mrg
2708 1.1 mrg /* If got_extra is true then we have already loaded
2709 1.1 mrg the next word as part of loading and storing the previous word. */
2710 1.1 mrg if (! got_extra)
2711 1.1 mrg output_asm_insn ("ld\t%6, @%1", operands);
2712 1.1 mrg
2713 1.1 mrg if (bytes >= 2)
2714 1.1 mrg {
2715 1.1 mrg bytes -= 2;
2716 1.1 mrg
2717 1.1 mrg output_asm_insn ("sra3\t%5, %6, #16", operands);
2718 1.1 mrg my_operands[0] = operands[5];
2719 1.1 mrg my_operands[1] = GEN_INT (dst_offset);
2720 1.1 mrg my_operands[2] = operands[0];
2721 1.1 mrg output_asm_insn ("sth\t%0, @(%1,%2)", my_operands);
2722 1.1 mrg
2723 1.1 mrg /* If there is a byte left to store then increment the
2724 1.1 mrg destination address and shift the contents of the source
2725 1.1 mrg register down by 8 bits. We could not do the address
2726 1.1 mrg increment in the store half word instruction, because it does
2727 1.1 mrg not have an auto increment mode. */
2728 1.1 mrg if (bytes > 0) /* assert (bytes == 1) */
2729 1.1 mrg {
2730 1.1 mrg dst_offset += 2;
2731 1.1 mrg last_shift = 8;
2732 1.1 mrg }
2733 1.1 mrg }
2734 1.1 mrg else
2735 1.1 mrg last_shift = 24;
2736 1.1 mrg
2737 1.1 mrg if (bytes > 0)
2738 1.1 mrg {
2739 1.1 mrg my_operands[0] = operands[6];
2740 1.1 mrg my_operands[1] = GEN_INT (last_shift);
2741 1.1 mrg output_asm_insn ("srai\t%0, #%1", my_operands);
2742 1.1 mrg my_operands[0] = operands[6];
2743 1.1 mrg my_operands[1] = GEN_INT (dst_offset);
2744 1.1 mrg my_operands[2] = operands[0];
2745 1.1 mrg output_asm_insn ("stb\t%0, @(%1,%2)", my_operands);
2746 1.1 mrg }
2747 1.1 mrg
2748 1.1 mrg /* Update the destination pointer if needed. We have to do
2749 1.1 mrg this so that the patterns matches what we output in this
2750 1.1 mrg function. */
2751 1.1 mrg if (dst_inc_amount
2752 1.1 mrg && !find_reg_note (insn, REG_UNUSED, operands[0]))
2753 1.1 mrg {
2754 1.1 mrg my_operands[0] = operands[0];
2755 1.1 mrg my_operands[1] = GEN_INT (dst_inc_amount);
2756 1.1 mrg output_asm_insn ("addi\t%0, #%1", my_operands);
2757 1.1 mrg }
2758 1.1 mrg
2759 1.1 mrg /* Update the source pointer if needed. We have to do this
2760 1.1 mrg so that the patterns matches what we output in this
2761 1.1 mrg function. */
2762 1.1 mrg if (src_inc_amount
2763 1.1 mrg && !find_reg_note (insn, REG_UNUSED, operands[1]))
2764 1.1 mrg {
2765 1.1 mrg my_operands[0] = operands[1];
2766 1.1 mrg my_operands[1] = GEN_INT (src_inc_amount);
2767 1.1 mrg output_asm_insn ("addi\t%0, #%1", my_operands);
2768 1.1 mrg }
2769 1.1 mrg
2770 1.1 mrg bytes = 0;
2771 1.1 mrg }
2772 1.1 mrg
2773 1.1 mrg first_time = 0;
2774 1.1 mrg }
2775 1.1 mrg }
2776 1.1 mrg
2777 1.1 mrg /* Implement TARGET_HARD_REGNO_MODE_OK. */
2778 1.1 mrg
2779 1.1 mrg static bool
2780 1.1 mrg m32r_hard_regno_mode_ok (unsigned int regno, machine_mode mode)
2781 1.1 mrg {
2782 1.1 mrg return (m32r_hard_regno_modes[regno] & m32r_mode_class[mode]) != 0;
2783 1.1 mrg }
2784 1.1 mrg
2785 1.1 mrg /* Implement TARGET_MODES_TIEABLE_P. Tie QI/HI/SI modes together. */
2786 1.1 mrg
2787 1.1 mrg static bool
2788 1.1 mrg m32r_modes_tieable_p (machine_mode mode1, machine_mode mode2)
2789 1.1 mrg {
2790 1.1 mrg return (GET_MODE_CLASS (mode1) == MODE_INT
2791 1.1 mrg && GET_MODE_CLASS (mode2) == MODE_INT
2792 1.1 mrg && GET_MODE_SIZE (mode1) <= UNITS_PER_WORD
2793 1.1 mrg && GET_MODE_SIZE (mode2) <= UNITS_PER_WORD);
2794 1.1 mrg }
2795 1.1 mrg
2796 1.1 mrg /* Return true if using NEW_REG in place of OLD_REG is ok. */
2797 1.1 mrg
2798 1.1 mrg int
2799 1.1 mrg m32r_hard_regno_rename_ok (unsigned int old_reg ATTRIBUTE_UNUSED,
2800 1.1 mrg unsigned int new_reg)
2801 1.1 mrg {
2802 1.1 mrg /* Interrupt routines can't clobber any register that isn't already used. */
2803 1.1 mrg if (lookup_attribute ("interrupt", DECL_ATTRIBUTES (current_function_decl))
2804 1.1 mrg && !df_regs_ever_live_p (new_reg))
2805 1.1 mrg return 0;
2806 1.1 mrg
2807 1.1 mrg return 1;
2808 1.1 mrg }
2809 1.1 mrg
2810 1.1 mrg rtx
2811 1.1 mrg m32r_return_addr (int count)
2812 1.1 mrg {
2813 1.1 mrg if (count != 0)
2814 1.1 mrg return const0_rtx;
2815 1.1 mrg
2816 1.1 mrg return get_hard_reg_initial_val (Pmode, RETURN_ADDR_REGNUM);
2817 1.1 mrg }
2818 1.1 mrg
2819 1.1 mrg static void
2820 1.1 mrg m32r_trampoline_init (rtx m_tramp, tree fndecl, rtx chain_value)
2821 1.1 mrg {
2822 1.1 mrg emit_move_insn (adjust_address (m_tramp, SImode, 0),
2823 1.1 mrg gen_int_mode (TARGET_LITTLE_ENDIAN ?
2824 1.1 mrg 0x017e8e17 : 0x178e7e01, SImode));
2825 1.1 mrg emit_move_insn (adjust_address (m_tramp, SImode, 4),
2826 1.1 mrg gen_int_mode (TARGET_LITTLE_ENDIAN ?
2827 1.1 mrg 0x0c00ae86 : 0x86ae000c, SImode));
2828 1.1 mrg emit_move_insn (adjust_address (m_tramp, SImode, 8),
2829 1.1 mrg gen_int_mode (TARGET_LITTLE_ENDIAN ?
2830 1.1 mrg 0xe627871e : 0x1e8727e6, SImode));
2831 1.1 mrg emit_move_insn (adjust_address (m_tramp, SImode, 12),
2832 1.1 mrg gen_int_mode (TARGET_LITTLE_ENDIAN ?
2833 1.1 mrg 0xc616c626 : 0x26c61fc6, SImode));
2834 1.1 mrg emit_move_insn (adjust_address (m_tramp, SImode, 16),
2835 1.1 mrg chain_value);
2836 1.1 mrg emit_move_insn (adjust_address (m_tramp, SImode, 20),
2837 1.1 mrg XEXP (DECL_RTL (fndecl), 0));
2838 1.1 mrg
2839 1.1 mrg if (m32r_cache_flush_trap >= 0)
2840 1.1 mrg emit_insn (gen_flush_icache
2841 1.1 mrg (validize_mem (adjust_address (m_tramp, SImode, 0)),
2842 1.1 mrg gen_int_mode (m32r_cache_flush_trap, SImode)));
2843 1.1 mrg else if (m32r_cache_flush_func && m32r_cache_flush_func[0])
2844 1.1 mrg emit_library_call (m32r_function_symbol (m32r_cache_flush_func),
2845 1.1 mrg LCT_NORMAL, VOIDmode, XEXP (m_tramp, 0), Pmode,
2846 1.1 mrg gen_int_mode (TRAMPOLINE_SIZE, SImode), SImode,
2847 1.1 mrg GEN_INT (3), SImode);
2848 1.1 mrg }
2849 1.1 mrg
2850 1.1 mrg /* True if X is a reg that can be used as a base reg. */
2851 1.1 mrg
2852 1.1 mrg static bool
2853 1.1 mrg m32r_rtx_ok_for_base_p (const_rtx x, bool strict)
2854 1.1 mrg {
2855 1.1 mrg if (! REG_P (x))
2856 1.1 mrg return false;
2857 1.1 mrg
2858 1.1 mrg if (strict)
2859 1.1 mrg {
2860 1.1 mrg if (GPR_P (REGNO (x)))
2861 1.1 mrg return true;
2862 1.1 mrg }
2863 1.1 mrg else
2864 1.1 mrg {
2865 1.1 mrg if (GPR_P (REGNO (x))
2866 1.1 mrg || REGNO (x) == ARG_POINTER_REGNUM
2867 1.1 mrg || ! HARD_REGISTER_P (x))
2868 1.1 mrg return true;
2869 1.1 mrg }
2870 1.1 mrg
2871 1.1 mrg return false;
2872 1.1 mrg }
2873 1.1 mrg
2874 1.1 mrg static inline bool
2875 1.1 mrg m32r_rtx_ok_for_offset_p (const_rtx x)
2876 1.1 mrg {
2877 1.1 mrg return (CONST_INT_P (x) && INT16_P (INTVAL (x)));
2878 1.1 mrg }
2879 1.1 mrg
2880 1.1 mrg static inline bool
2881 1.1 mrg m32r_legitimate_offset_addres_p (machine_mode mode ATTRIBUTE_UNUSED,
2882 1.1 mrg const_rtx x, bool strict)
2883 1.1 mrg {
2884 1.1 mrg if (GET_CODE (x) == PLUS
2885 1.1 mrg && m32r_rtx_ok_for_base_p (XEXP (x, 0), strict)
2886 1.1 mrg && m32r_rtx_ok_for_offset_p (XEXP (x, 1)))
2887 1.1 mrg return true;
2888 1.1 mrg
2889 1.1 mrg return false;
2890 1.1 mrg }
2891 1.1 mrg
2892 1.1 mrg /* For LO_SUM addresses, do not allow them if the MODE is > 1 word,
2893 1.1 mrg since more than one instruction will be required. */
2894 1.1 mrg
2895 1.1 mrg static inline bool
2896 1.1 mrg m32r_legitimate_lo_sum_addres_p (machine_mode mode, const_rtx x,
2897 1.1 mrg bool strict)
2898 1.1 mrg {
2899 1.1 mrg if (GET_CODE (x) == LO_SUM
2900 1.1 mrg && (mode != BLKmode && GET_MODE_SIZE (mode) <= UNITS_PER_WORD)
2901 1.1 mrg && m32r_rtx_ok_for_base_p (XEXP (x, 0), strict)
2902 1.1 mrg && CONSTANT_P (XEXP (x, 1)))
2903 1.1 mrg return true;
2904 1.1 mrg
2905 1.1 mrg return false;
2906 1.1 mrg }
2907 1.1 mrg
2908 1.1 mrg /* Is this a load and increment operation. */
2909 1.1 mrg
2910 1.1 mrg static inline bool
2911 1.1 mrg m32r_load_postinc_p (machine_mode mode, const_rtx x, bool strict)
2912 1.1 mrg {
2913 1.1 mrg if ((mode == SImode || mode == SFmode)
2914 1.1 mrg && GET_CODE (x) == POST_INC
2915 1.1 mrg && REG_P (XEXP (x, 0))
2916 1.1 mrg && m32r_rtx_ok_for_base_p (XEXP (x, 0), strict))
2917 1.1 mrg return true;
2918 1.1 mrg
2919 1.1 mrg return false;
2920 1.1 mrg }
2921 1.1 mrg
2922 1.1 mrg /* Is this an increment/decrement and store operation. */
2923 1.1 mrg
2924 1.1 mrg static inline bool
2925 1.1 mrg m32r_store_preinc_predec_p (machine_mode mode, const_rtx x, bool strict)
2926 1.1 mrg {
2927 1.1 mrg if ((mode == SImode || mode == SFmode)
2928 1.1 mrg && (GET_CODE (x) == PRE_INC || GET_CODE (x) == PRE_DEC)
2929 1.1 mrg && REG_P (XEXP (x, 0)) \
2930 1.1 mrg && m32r_rtx_ok_for_base_p (XEXP (x, 0), strict))
2931 1.1 mrg return true;
2932 1.1 mrg
2933 1.1 mrg return false;
2934 1.1 mrg }
2935 1.1 mrg
2936 1.1 mrg /* Implement TARGET_LEGITIMATE_ADDRESS_P. */
2937 1.1 mrg
2938 1.1 mrg static bool
2939 1.1 mrg m32r_legitimate_address_p (machine_mode mode, rtx x, bool strict)
2940 1.1 mrg {
2941 1.1 mrg if (m32r_rtx_ok_for_base_p (x, strict)
2942 1.1 mrg || m32r_legitimate_offset_addres_p (mode, x, strict)
2943 1.1 mrg || m32r_legitimate_lo_sum_addres_p (mode, x, strict)
2944 1.1 mrg || m32r_load_postinc_p (mode, x, strict)
2945 1.1 mrg || m32r_store_preinc_predec_p (mode, x, strict))
2946 1.1 mrg return true;
2947 1.1 mrg
2948 1.1 mrg return false;
2949 1.1 mrg }
2950 1.1 mrg
2951 1.1 mrg static void
2952 1.1 mrg m32r_conditional_register_usage (void)
2953 1.1 mrg {
2954 1.1 mrg if (flag_pic)
2955 1.1 mrg fixed_regs[PIC_OFFSET_TABLE_REGNUM] = 1;
2956 1.1 mrg }
2957 1.1 mrg
2958 1.1 mrg /* Implement TARGET_LEGITIMATE_CONSTANT_P
2959 1.1 mrg
2960 We don't allow (plus symbol large-constant) as the relocations can't
2961 describe it. INTVAL > 32767 handles both 16-bit and 24-bit relocations.
2962 We allow all CONST_DOUBLE's as the md file patterns will force the
2963 constant to memory if they can't handle them. */
2964
2965 static bool
2966 m32r_legitimate_constant_p (machine_mode mode ATTRIBUTE_UNUSED, rtx x)
2967 {
2968 return !(GET_CODE (x) == CONST
2969 && GET_CODE (XEXP (x, 0)) == PLUS
2970 && (GET_CODE (XEXP (XEXP (x, 0), 0)) == SYMBOL_REF
2971 || GET_CODE (XEXP (XEXP (x, 0), 0)) == LABEL_REF)
2972 && CONST_INT_P (XEXP (XEXP (x, 0), 1))
2973 && UINTVAL (XEXP (XEXP (x, 0), 1)) > 32767);
2974 }
2975
2976 /* Implement TARGET_STARTING_FRAME_OFFSET. The frame pointer points at
2977 the same place as the stack pointer, except if alloca has been called. */
2978
2979 static HOST_WIDE_INT
2980 m32r_starting_frame_offset (void)
2981 {
2982 return M32R_STACK_ALIGN (crtl->outgoing_args_size);
2983 }
2984