Fix error when selecting number of memory pools
[official-gcc.git] / gcc / config / m32r / m32r.c
bloba2bd289b24c9a171c4c063d5ed894401eb06133d
1 /* Subroutines used for code generation on the Renesas M32R cpu.
2 Copyright (C) 1996-2018 Free Software Foundation, Inc.
4 This file is part of GCC.
6 GCC is free software; you can redistribute it and/or modify it
7 under the terms of the GNU General Public License as published
8 by the Free Software Foundation; either version 3, or (at your
9 option) any later version.
11 GCC is distributed in the hope that it will be useful, but WITHOUT
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
14 License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3. If not see
18 <http://www.gnu.org/licenses/>. */
20 #define IN_TARGET_CODE 1
22 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "backend.h"
26 #include "target.h"
27 #include "rtl.h"
28 #include "tree.h"
29 #include "df.h"
30 #include "memmodel.h"
31 #include "tm_p.h"
32 #include "stringpool.h"
33 #include "attribs.h"
34 #include "insn-config.h"
35 #include "emit-rtl.h"
36 #include "recog.h"
37 #include "diagnostic-core.h"
38 #include "alias.h"
39 #include "stor-layout.h"
40 #include "varasm.h"
41 #include "calls.h"
42 #include "output.h"
43 #include "insn-attr.h"
44 #include "explow.h"
45 #include "expr.h"
46 #include "tm-constrs.h"
47 #include "builtins.h"
49 /* This file should be included last. */
50 #include "target-def.h"
52 /* Array of valid operand punctuation characters. */
53 static char m32r_punct_chars[256];
55 /* Machine-specific symbol_ref flags. */
56 #define SYMBOL_FLAG_MODEL_SHIFT SYMBOL_FLAG_MACH_DEP_SHIFT
57 #define SYMBOL_REF_MODEL(X) \
58 ((enum m32r_model) ((SYMBOL_REF_FLAGS (X) >> SYMBOL_FLAG_MODEL_SHIFT) & 3))
60 /* For string literals, etc. */
61 #define LIT_NAME_P(NAME) ((NAME)[0] == '*' && (NAME)[1] == '.')
63 /* Forward declaration. */
64 static void m32r_option_override (void);
65 static void init_reg_tables (void);
66 static void block_move_call (rtx, rtx, rtx);
67 static int m32r_is_insn (rtx);
68 static bool m32r_legitimate_address_p (machine_mode, rtx, bool);
69 static rtx m32r_legitimize_address (rtx, rtx, machine_mode);
70 static bool m32r_mode_dependent_address_p (const_rtx, addr_space_t);
71 static tree m32r_handle_model_attribute (tree *, tree, tree, int, bool *);
72 static void m32r_print_operand (FILE *, rtx, int);
73 static void m32r_print_operand_address (FILE *, machine_mode, rtx);
74 static bool m32r_print_operand_punct_valid_p (unsigned char code);
75 static void m32r_output_function_prologue (FILE *);
76 static void m32r_output_function_epilogue (FILE *);
78 static void m32r_file_start (void);
80 static int m32r_adjust_priority (rtx_insn *, int);
81 static int m32r_issue_rate (void);
83 static void m32r_encode_section_info (tree, rtx, int);
84 static bool m32r_in_small_data_p (const_tree);
85 static bool m32r_return_in_memory (const_tree, const_tree);
86 static rtx m32r_function_value (const_tree, const_tree, bool);
87 static rtx m32r_libcall_value (machine_mode, const_rtx);
88 static bool m32r_function_value_regno_p (const unsigned int);
89 static void m32r_setup_incoming_varargs (cumulative_args_t, machine_mode,
90 tree, int *, int);
91 static void init_idents (void);
92 static bool m32r_rtx_costs (rtx, machine_mode, int, int, int *, bool speed);
93 static int m32r_memory_move_cost (machine_mode, reg_class_t, bool);
94 static bool m32r_pass_by_reference (cumulative_args_t, machine_mode,
95 const_tree, bool);
96 static int m32r_arg_partial_bytes (cumulative_args_t, machine_mode,
97 tree, bool);
98 static rtx m32r_function_arg (cumulative_args_t, machine_mode,
99 const_tree, bool);
100 static void m32r_function_arg_advance (cumulative_args_t, machine_mode,
101 const_tree, bool);
102 static bool m32r_can_eliminate (const int, const int);
103 static void m32r_conditional_register_usage (void);
104 static void m32r_trampoline_init (rtx, tree, rtx);
105 static bool m32r_legitimate_constant_p (machine_mode, rtx);
106 static bool m32r_attribute_identifier (const_tree);
107 static bool m32r_hard_regno_mode_ok (unsigned int, machine_mode);
108 static bool m32r_modes_tieable_p (machine_mode, machine_mode);
109 static HOST_WIDE_INT m32r_starting_frame_offset (void);
111 /* M32R specific attributes. */
113 static const struct attribute_spec m32r_attribute_table[] =
115 /* { name, min_len, max_len, decl_req, type_req, fn_type_req,
116 affects_type_identity, handler, exclude } */
117 { "interrupt", 0, 0, true, false, false, false, NULL, NULL },
118 { "model", 1, 1, true, false, false, false, m32r_handle_model_attribute,
119 NULL },
120 { NULL, 0, 0, false, false, false, false, NULL, NULL }
123 /* Initialize the GCC target structure. */
124 #undef TARGET_ATTRIBUTE_TABLE
125 #define TARGET_ATTRIBUTE_TABLE m32r_attribute_table
126 #undef TARGET_ATTRIBUTE_TAKES_IDENTIFIER_P
127 #define TARGET_ATTRIBUTE_TAKES_IDENTIFIER_P m32r_attribute_identifier
129 #undef TARGET_LRA_P
130 #define TARGET_LRA_P hook_bool_void_false
132 #undef TARGET_LEGITIMATE_ADDRESS_P
133 #define TARGET_LEGITIMATE_ADDRESS_P m32r_legitimate_address_p
134 #undef TARGET_LEGITIMIZE_ADDRESS
135 #define TARGET_LEGITIMIZE_ADDRESS m32r_legitimize_address
136 #undef TARGET_MODE_DEPENDENT_ADDRESS_P
137 #define TARGET_MODE_DEPENDENT_ADDRESS_P m32r_mode_dependent_address_p
139 #undef TARGET_ASM_ALIGNED_HI_OP
140 #define TARGET_ASM_ALIGNED_HI_OP "\t.hword\t"
141 #undef TARGET_ASM_ALIGNED_SI_OP
142 #define TARGET_ASM_ALIGNED_SI_OP "\t.word\t"
144 #undef TARGET_PRINT_OPERAND
145 #define TARGET_PRINT_OPERAND m32r_print_operand
146 #undef TARGET_PRINT_OPERAND_ADDRESS
147 #define TARGET_PRINT_OPERAND_ADDRESS m32r_print_operand_address
148 #undef TARGET_PRINT_OPERAND_PUNCT_VALID_P
149 #define TARGET_PRINT_OPERAND_PUNCT_VALID_P m32r_print_operand_punct_valid_p
151 #undef TARGET_ASM_FUNCTION_PROLOGUE
152 #define TARGET_ASM_FUNCTION_PROLOGUE m32r_output_function_prologue
153 #undef TARGET_ASM_FUNCTION_EPILOGUE
154 #define TARGET_ASM_FUNCTION_EPILOGUE m32r_output_function_epilogue
156 #undef TARGET_ASM_FILE_START
157 #define TARGET_ASM_FILE_START m32r_file_start
159 #undef TARGET_SCHED_ADJUST_PRIORITY
160 #define TARGET_SCHED_ADJUST_PRIORITY m32r_adjust_priority
161 #undef TARGET_SCHED_ISSUE_RATE
162 #define TARGET_SCHED_ISSUE_RATE m32r_issue_rate
164 #undef TARGET_OPTION_OVERRIDE
165 #define TARGET_OPTION_OVERRIDE m32r_option_override
167 #undef TARGET_ENCODE_SECTION_INFO
168 #define TARGET_ENCODE_SECTION_INFO m32r_encode_section_info
169 #undef TARGET_IN_SMALL_DATA_P
170 #define TARGET_IN_SMALL_DATA_P m32r_in_small_data_p
173 #undef TARGET_MEMORY_MOVE_COST
174 #define TARGET_MEMORY_MOVE_COST m32r_memory_move_cost
175 #undef TARGET_RTX_COSTS
176 #define TARGET_RTX_COSTS m32r_rtx_costs
177 #undef TARGET_ADDRESS_COST
178 #define TARGET_ADDRESS_COST hook_int_rtx_mode_as_bool_0
180 #undef TARGET_PROMOTE_PROTOTYPES
181 #define TARGET_PROMOTE_PROTOTYPES hook_bool_const_tree_true
182 #undef TARGET_RETURN_IN_MEMORY
183 #define TARGET_RETURN_IN_MEMORY m32r_return_in_memory
185 #undef TARGET_FUNCTION_VALUE
186 #define TARGET_FUNCTION_VALUE m32r_function_value
187 #undef TARGET_LIBCALL_VALUE
188 #define TARGET_LIBCALL_VALUE m32r_libcall_value
189 #undef TARGET_FUNCTION_VALUE_REGNO_P
190 #define TARGET_FUNCTION_VALUE_REGNO_P m32r_function_value_regno_p
192 #undef TARGET_SETUP_INCOMING_VARARGS
193 #define TARGET_SETUP_INCOMING_VARARGS m32r_setup_incoming_varargs
194 #undef TARGET_MUST_PASS_IN_STACK
195 #define TARGET_MUST_PASS_IN_STACK must_pass_in_stack_var_size
196 #undef TARGET_PASS_BY_REFERENCE
197 #define TARGET_PASS_BY_REFERENCE m32r_pass_by_reference
198 #undef TARGET_ARG_PARTIAL_BYTES
199 #define TARGET_ARG_PARTIAL_BYTES m32r_arg_partial_bytes
200 #undef TARGET_FUNCTION_ARG
201 #define TARGET_FUNCTION_ARG m32r_function_arg
202 #undef TARGET_FUNCTION_ARG_ADVANCE
203 #define TARGET_FUNCTION_ARG_ADVANCE m32r_function_arg_advance
205 #undef TARGET_CAN_ELIMINATE
206 #define TARGET_CAN_ELIMINATE m32r_can_eliminate
208 #undef TARGET_CONDITIONAL_REGISTER_USAGE
209 #define TARGET_CONDITIONAL_REGISTER_USAGE m32r_conditional_register_usage
211 #undef TARGET_TRAMPOLINE_INIT
212 #define TARGET_TRAMPOLINE_INIT m32r_trampoline_init
214 #undef TARGET_LEGITIMATE_CONSTANT_P
215 #define TARGET_LEGITIMATE_CONSTANT_P m32r_legitimate_constant_p
217 #undef TARGET_HARD_REGNO_MODE_OK
218 #define TARGET_HARD_REGNO_MODE_OK m32r_hard_regno_mode_ok
220 #undef TARGET_MODES_TIEABLE_P
221 #define TARGET_MODES_TIEABLE_P m32r_modes_tieable_p
223 #undef TARGET_CONSTANT_ALIGNMENT
224 #define TARGET_CONSTANT_ALIGNMENT constant_alignment_word_strings
226 #undef TARGET_STARTING_FRAME_OFFSET
227 #define TARGET_STARTING_FRAME_OFFSET m32r_starting_frame_offset
229 #undef TARGET_HAVE_SPECULATION_SAFE_VALUE
230 #define TARGET_HAVE_SPECULATION_SAFE_VALUE speculation_safe_value_not_needed
232 struct gcc_target targetm = TARGET_INITIALIZER;
234 /* Called by m32r_option_override to initialize various things. */
236 void
237 m32r_init (void)
239 init_reg_tables ();
241 /* Initialize array for TARGET_PRINT_OPERAND_PUNCT_VALID_P. */
242 memset (m32r_punct_chars, 0, sizeof (m32r_punct_chars));
243 m32r_punct_chars['#'] = 1;
244 m32r_punct_chars['@'] = 1; /* ??? no longer used */
246 /* Provide default value if not specified. */
247 if (!global_options_set.x_g_switch_value)
248 g_switch_value = SDATA_DEFAULT_SIZE;
251 static void
252 m32r_option_override (void)
254 /* These need to be done at start up.
255 It's convenient to do them here. */
256 m32r_init ();
257 SUBTARGET_OVERRIDE_OPTIONS;
260 /* Vectors to keep interesting information about registers where it can easily
261 be got. We use to use the actual mode value as the bit number, but there
262 is (or may be) more than 32 modes now. Instead we use two tables: one
263 indexed by hard register number, and one indexed by mode. */
265 /* The purpose of m32r_mode_class is to shrink the range of modes so that
266 they all fit (as bit numbers) in a 32-bit word (again). Each real mode is
267 mapped into one m32r_mode_class mode. */
269 enum m32r_mode_class
271 C_MODE,
272 S_MODE, D_MODE, T_MODE, O_MODE,
273 SF_MODE, DF_MODE, TF_MODE, OF_MODE, A_MODE
276 /* Modes for condition codes. */
277 #define C_MODES (1 << (int) C_MODE)
279 /* Modes for single-word and smaller quantities. */
280 #define S_MODES ((1 << (int) S_MODE) | (1 << (int) SF_MODE))
282 /* Modes for double-word and smaller quantities. */
283 #define D_MODES (S_MODES | (1 << (int) D_MODE) | (1 << DF_MODE))
285 /* Modes for quad-word and smaller quantities. */
286 #define T_MODES (D_MODES | (1 << (int) T_MODE) | (1 << (int) TF_MODE))
288 /* Modes for accumulators. */
289 #define A_MODES (1 << (int) A_MODE)
291 /* Value is 1 if register/mode pair is acceptable on arc. */
293 static const unsigned int m32r_hard_regno_modes[FIRST_PSEUDO_REGISTER] =
295 T_MODES, T_MODES, T_MODES, T_MODES, T_MODES, T_MODES, T_MODES, T_MODES,
296 T_MODES, T_MODES, T_MODES, T_MODES, T_MODES, S_MODES, S_MODES, S_MODES,
297 S_MODES, C_MODES, A_MODES, A_MODES
300 static unsigned int m32r_mode_class [NUM_MACHINE_MODES];
302 enum reg_class m32r_regno_reg_class[FIRST_PSEUDO_REGISTER];
304 static void
305 init_reg_tables (void)
307 int i;
309 for (i = 0; i < NUM_MACHINE_MODES; i++)
311 machine_mode m = (machine_mode) i;
313 switch (GET_MODE_CLASS (m))
315 case MODE_INT:
316 case MODE_PARTIAL_INT:
317 case MODE_COMPLEX_INT:
318 if (GET_MODE_SIZE (m) <= 4)
319 m32r_mode_class[i] = 1 << (int) S_MODE;
320 else if (GET_MODE_SIZE (m) == 8)
321 m32r_mode_class[i] = 1 << (int) D_MODE;
322 else if (GET_MODE_SIZE (m) == 16)
323 m32r_mode_class[i] = 1 << (int) T_MODE;
324 else if (GET_MODE_SIZE (m) == 32)
325 m32r_mode_class[i] = 1 << (int) O_MODE;
326 else
327 m32r_mode_class[i] = 0;
328 break;
329 case MODE_FLOAT:
330 case MODE_COMPLEX_FLOAT:
331 if (GET_MODE_SIZE (m) <= 4)
332 m32r_mode_class[i] = 1 << (int) SF_MODE;
333 else if (GET_MODE_SIZE (m) == 8)
334 m32r_mode_class[i] = 1 << (int) DF_MODE;
335 else if (GET_MODE_SIZE (m) == 16)
336 m32r_mode_class[i] = 1 << (int) TF_MODE;
337 else if (GET_MODE_SIZE (m) == 32)
338 m32r_mode_class[i] = 1 << (int) OF_MODE;
339 else
340 m32r_mode_class[i] = 0;
341 break;
342 case MODE_CC:
343 m32r_mode_class[i] = 1 << (int) C_MODE;
344 break;
345 default:
346 m32r_mode_class[i] = 0;
347 break;
351 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
353 if (GPR_P (i))
354 m32r_regno_reg_class[i] = GENERAL_REGS;
355 else if (i == ARG_POINTER_REGNUM)
356 m32r_regno_reg_class[i] = GENERAL_REGS;
357 else
358 m32r_regno_reg_class[i] = NO_REGS;
362 /* M32R specific attribute support.
364 interrupt - for interrupt functions
366 model - select code model used to access object
368 small: addresses use 24 bits, use bl to make calls
369 medium: addresses use 32 bits, use bl to make calls
370 large: addresses use 32 bits, use seth/add3/jl to make calls
372 Grep for MODEL in m32r.h for more info. */
374 static tree small_ident1;
375 static tree small_ident2;
376 static tree medium_ident1;
377 static tree medium_ident2;
378 static tree large_ident1;
379 static tree large_ident2;
381 static void
382 init_idents (void)
384 if (small_ident1 == 0)
386 small_ident1 = get_identifier ("small");
387 small_ident2 = get_identifier ("__small__");
388 medium_ident1 = get_identifier ("medium");
389 medium_ident2 = get_identifier ("__medium__");
390 large_ident1 = get_identifier ("large");
391 large_ident2 = get_identifier ("__large__");
395 /* Handle an "model" attribute; arguments as in
396 struct attribute_spec.handler. */
397 static tree
398 m32r_handle_model_attribute (tree *node ATTRIBUTE_UNUSED, tree name,
399 tree args, int flags ATTRIBUTE_UNUSED,
400 bool *no_add_attrs)
402 tree arg;
404 init_idents ();
405 arg = TREE_VALUE (args);
407 if (arg != small_ident1
408 && arg != small_ident2
409 && arg != medium_ident1
410 && arg != medium_ident2
411 && arg != large_ident1
412 && arg != large_ident2)
414 warning (OPT_Wattributes, "invalid argument of %qs attribute",
415 IDENTIFIER_POINTER (name));
416 *no_add_attrs = true;
419 return NULL_TREE;
422 static bool
423 m32r_attribute_identifier (const_tree name)
425 return strcmp (IDENTIFIER_POINTER (name), "model") == 0
426 || strcmp (IDENTIFIER_POINTER (name), "__model__") == 0;
429 /* Encode section information of DECL, which is either a VAR_DECL,
430 FUNCTION_DECL, STRING_CST, CONSTRUCTOR, or ???.
432 For the M32R we want to record:
434 - whether the object lives in .sdata/.sbss.
435 - what code model should be used to access the object
438 static void
439 m32r_encode_section_info (tree decl, rtx rtl, int first)
441 int extra_flags = 0;
442 tree model_attr;
443 enum m32r_model model;
445 default_encode_section_info (decl, rtl, first);
447 if (!DECL_P (decl))
448 return;
450 model_attr = lookup_attribute ("model", DECL_ATTRIBUTES (decl));
451 if (model_attr)
453 tree id;
455 init_idents ();
457 id = TREE_VALUE (TREE_VALUE (model_attr));
459 if (id == small_ident1 || id == small_ident2)
460 model = M32R_MODEL_SMALL;
461 else if (id == medium_ident1 || id == medium_ident2)
462 model = M32R_MODEL_MEDIUM;
463 else if (id == large_ident1 || id == large_ident2)
464 model = M32R_MODEL_LARGE;
465 else
466 gcc_unreachable (); /* shouldn't happen */
468 else
470 if (TARGET_MODEL_SMALL)
471 model = M32R_MODEL_SMALL;
472 else if (TARGET_MODEL_MEDIUM)
473 model = M32R_MODEL_MEDIUM;
474 else if (TARGET_MODEL_LARGE)
475 model = M32R_MODEL_LARGE;
476 else
477 gcc_unreachable (); /* shouldn't happen */
479 extra_flags |= model << SYMBOL_FLAG_MODEL_SHIFT;
481 if (extra_flags)
482 SYMBOL_REF_FLAGS (XEXP (rtl, 0)) |= extra_flags;
485 /* Only mark the object as being small data area addressable if
486 it hasn't been explicitly marked with a code model.
488 The user can explicitly put an object in the small data area with the
489 section attribute. If the object is in sdata/sbss and marked with a
490 code model do both [put the object in .sdata and mark it as being
491 addressed with a specific code model - don't mark it as being addressed
492 with an SDA reloc though]. This is ok and might be useful at times. If
493 the object doesn't fit the linker will give an error. */
495 static bool
496 m32r_in_small_data_p (const_tree decl)
498 const char *section;
500 if (TREE_CODE (decl) != VAR_DECL)
501 return false;
503 if (lookup_attribute ("model", DECL_ATTRIBUTES (decl)))
504 return false;
506 section = DECL_SECTION_NAME (decl);
507 if (section)
509 if (strcmp (section, ".sdata") == 0 || strcmp (section, ".sbss") == 0)
510 return true;
512 else
514 if (! TREE_READONLY (decl) && ! TARGET_SDATA_NONE)
516 int size = int_size_in_bytes (TREE_TYPE (decl));
518 if (size > 0 && size <= g_switch_value)
519 return true;
523 return false;
526 /* Do anything needed before RTL is emitted for each function. */
528 void
529 m32r_init_expanders (void)
531 /* ??? At one point there was code here. The function is left in
532 to make it easy to experiment. */
536 call_operand (rtx op, machine_mode mode)
538 if (!MEM_P (op))
539 return 0;
540 op = XEXP (op, 0);
541 return call_address_operand (op, mode);
544 /* Return 1 if OP is a reference to an object in .sdata/.sbss. */
547 small_data_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
549 if (! TARGET_SDATA_USE)
550 return 0;
552 if (GET_CODE (op) == SYMBOL_REF)
553 return SYMBOL_REF_SMALL_P (op);
555 if (GET_CODE (op) == CONST
556 && GET_CODE (XEXP (op, 0)) == PLUS
557 && GET_CODE (XEXP (XEXP (op, 0), 0)) == SYMBOL_REF
558 && satisfies_constraint_J (XEXP (XEXP (op, 0), 1)))
559 return SYMBOL_REF_SMALL_P (XEXP (XEXP (op, 0), 0));
561 return 0;
564 /* Return 1 if OP is a symbol that can use 24-bit addressing. */
567 addr24_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
569 rtx sym;
571 if (flag_pic)
572 return 0;
574 if (GET_CODE (op) == LABEL_REF)
575 return TARGET_ADDR24;
577 if (GET_CODE (op) == SYMBOL_REF)
578 sym = op;
579 else if (GET_CODE (op) == CONST
580 && GET_CODE (XEXP (op, 0)) == PLUS
581 && GET_CODE (XEXP (XEXP (op, 0), 0)) == SYMBOL_REF
582 && satisfies_constraint_M (XEXP (XEXP (op, 0), 1)))
583 sym = XEXP (XEXP (op, 0), 0);
584 else
585 return 0;
587 if (SYMBOL_REF_MODEL (sym) == M32R_MODEL_SMALL)
588 return 1;
590 if (TARGET_ADDR24
591 && (CONSTANT_POOL_ADDRESS_P (sym)
592 || LIT_NAME_P (XSTR (sym, 0))))
593 return 1;
595 return 0;
598 /* Return 1 if OP is a symbol that needs 32-bit addressing. */
601 addr32_operand (rtx op, machine_mode mode)
603 rtx sym;
605 if (GET_CODE (op) == LABEL_REF)
606 return TARGET_ADDR32;
608 if (GET_CODE (op) == SYMBOL_REF)
609 sym = op;
610 else if (GET_CODE (op) == CONST
611 && GET_CODE (XEXP (op, 0)) == PLUS
612 && GET_CODE (XEXP (XEXP (op, 0), 0)) == SYMBOL_REF
613 && CONST_INT_P (XEXP (XEXP (op, 0), 1))
614 && ! flag_pic)
615 sym = XEXP (XEXP (op, 0), 0);
616 else
617 return 0;
619 return (! addr24_operand (sym, mode)
620 && ! small_data_operand (sym, mode));
623 /* Return 1 if OP is a function that can be called with the `bl' insn. */
626 call26_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
628 if (flag_pic)
629 return 1;
631 if (GET_CODE (op) == SYMBOL_REF)
632 return SYMBOL_REF_MODEL (op) != M32R_MODEL_LARGE;
634 return TARGET_CALL26;
637 /* Return 1 if OP is a DImode const we want to handle inline.
638 This must match the code in the movdi pattern.
639 It is used by the 'G' constraint. */
642 easy_di_const (rtx op)
644 rtx high_rtx, low_rtx;
645 HOST_WIDE_INT high, low;
647 split_double (op, &high_rtx, &low_rtx);
648 high = INTVAL (high_rtx);
649 low = INTVAL (low_rtx);
650 /* Pick constants loadable with 2 16-bit `ldi' insns. */
651 if (high >= -128 && high <= 127
652 && low >= -128 && low <= 127)
653 return 1;
654 return 0;
657 /* Return 1 if OP is a DFmode const we want to handle inline.
658 This must match the code in the movdf pattern.
659 It is used by the 'H' constraint. */
662 easy_df_const (rtx op)
664 long l[2];
666 REAL_VALUE_TO_TARGET_DOUBLE (*CONST_DOUBLE_REAL_VALUE (op), l);
667 if (l[0] == 0 && l[1] == 0)
668 return 1;
669 if ((l[0] & 0xffff) == 0 && l[1] == 0)
670 return 1;
671 return 0;
674 /* Return 1 if OP is (mem (reg ...)).
675 This is used in insn length calcs. */
678 memreg_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
680 return MEM_P (op) && REG_P (XEXP (op, 0));
683 /* Return nonzero if TYPE must be passed by indirect reference. */
685 static bool
686 m32r_pass_by_reference (cumulative_args_t ca ATTRIBUTE_UNUSED,
687 machine_mode mode, const_tree type,
688 bool named ATTRIBUTE_UNUSED)
690 int size;
692 if (type)
693 size = int_size_in_bytes (type);
694 else
695 size = GET_MODE_SIZE (mode);
697 return (size < 0 || size > 8);
700 /* Comparisons. */
702 /* X and Y are two things to compare using CODE. Emit the compare insn and
703 return the rtx for compare [arg0 of the if_then_else].
704 If need_compare is true then the comparison insn must be generated, rather
705 than being subsumed into the following branch instruction. */
708 gen_compare (enum rtx_code code, rtx x, rtx y, int need_compare)
710 enum rtx_code compare_code;
711 enum rtx_code branch_code;
712 rtx cc_reg = gen_rtx_REG (CCmode, CARRY_REGNUM);
713 int must_swap = 0;
715 switch (code)
717 case EQ: compare_code = EQ; branch_code = NE; break;
718 case NE: compare_code = EQ; branch_code = EQ; break;
719 case LT: compare_code = LT; branch_code = NE; break;
720 case LE: compare_code = LT; branch_code = EQ; must_swap = 1; break;
721 case GT: compare_code = LT; branch_code = NE; must_swap = 1; break;
722 case GE: compare_code = LT; branch_code = EQ; break;
723 case LTU: compare_code = LTU; branch_code = NE; break;
724 case LEU: compare_code = LTU; branch_code = EQ; must_swap = 1; break;
725 case GTU: compare_code = LTU; branch_code = NE; must_swap = 1; break;
726 case GEU: compare_code = LTU; branch_code = EQ; break;
728 default:
729 gcc_unreachable ();
732 if (need_compare)
734 switch (compare_code)
736 case EQ:
737 if (satisfies_constraint_P (y) /* Reg equal to small const. */
738 && y != const0_rtx)
740 rtx tmp = gen_reg_rtx (SImode);
742 emit_insn (gen_addsi3 (tmp, x, GEN_INT (-INTVAL (y))));
743 x = tmp;
744 y = const0_rtx;
746 else if (CONSTANT_P (y)) /* Reg equal to const. */
748 rtx tmp = force_reg (GET_MODE (x), y);
749 y = tmp;
752 if (register_operand (y, SImode) /* Reg equal to reg. */
753 || y == const0_rtx) /* Reg equal to zero. */
755 emit_insn (gen_cmp_eqsi_insn (x, y));
757 return gen_rtx_fmt_ee (code, CCmode, cc_reg, const0_rtx);
759 break;
761 case LT:
762 if (register_operand (y, SImode)
763 || satisfies_constraint_P (y))
765 rtx tmp = gen_reg_rtx (SImode); /* Reg compared to reg. */
767 switch (code)
769 case LT:
770 emit_insn (gen_cmp_ltsi_insn (x, y));
771 code = EQ;
772 break;
773 case LE:
774 if (y == const0_rtx)
775 tmp = const1_rtx;
776 else
777 emit_insn (gen_addsi3 (tmp, y, constm1_rtx));
778 emit_insn (gen_cmp_ltsi_insn (x, tmp));
779 code = EQ;
780 break;
781 case GT:
782 if (CONST_INT_P (y))
783 tmp = gen_rtx_PLUS (SImode, y, const1_rtx);
784 else
785 emit_insn (gen_addsi3 (tmp, y, constm1_rtx));
786 emit_insn (gen_cmp_ltsi_insn (x, tmp));
787 code = NE;
788 break;
789 case GE:
790 emit_insn (gen_cmp_ltsi_insn (x, y));
791 code = NE;
792 break;
793 default:
794 gcc_unreachable ();
797 return gen_rtx_fmt_ee (code, CCmode, cc_reg, const0_rtx);
799 break;
801 case LTU:
802 if (register_operand (y, SImode)
803 || satisfies_constraint_P (y))
805 rtx tmp = gen_reg_rtx (SImode); /* Reg (unsigned) compared to reg. */
807 switch (code)
809 case LTU:
810 emit_insn (gen_cmp_ltusi_insn (x, y));
811 code = EQ;
812 break;
813 case LEU:
814 if (y == const0_rtx)
815 tmp = const1_rtx;
816 else
817 emit_insn (gen_addsi3 (tmp, y, constm1_rtx));
818 emit_insn (gen_cmp_ltusi_insn (x, tmp));
819 code = EQ;
820 break;
821 case GTU:
822 if (CONST_INT_P (y))
823 tmp = gen_rtx_PLUS (SImode, y, const1_rtx);
824 else
825 emit_insn (gen_addsi3 (tmp, y, constm1_rtx));
826 emit_insn (gen_cmp_ltusi_insn (x, tmp));
827 code = NE;
828 break;
829 case GEU:
830 emit_insn (gen_cmp_ltusi_insn (x, y));
831 code = NE;
832 break;
833 default:
834 gcc_unreachable ();
837 return gen_rtx_fmt_ee (code, CCmode, cc_reg, const0_rtx);
839 break;
841 default:
842 gcc_unreachable ();
845 else
847 /* Reg/reg equal comparison. */
848 if (compare_code == EQ
849 && register_operand (y, SImode))
850 return gen_rtx_fmt_ee (code, CCmode, x, y);
852 /* Reg/zero signed comparison. */
853 if ((compare_code == EQ || compare_code == LT)
854 && y == const0_rtx)
855 return gen_rtx_fmt_ee (code, CCmode, x, y);
857 /* Reg/smallconst equal comparison. */
858 if (compare_code == EQ
859 && satisfies_constraint_P (y))
861 rtx tmp = gen_reg_rtx (SImode);
863 emit_insn (gen_addsi3 (tmp, x, GEN_INT (-INTVAL (y))));
864 return gen_rtx_fmt_ee (code, CCmode, tmp, const0_rtx);
867 /* Reg/const equal comparison. */
868 if (compare_code == EQ
869 && CONSTANT_P (y))
871 rtx tmp = force_reg (GET_MODE (x), y);
873 return gen_rtx_fmt_ee (code, CCmode, x, tmp);
877 if (CONSTANT_P (y))
879 if (must_swap)
880 y = force_reg (GET_MODE (x), y);
881 else
883 int ok_const = reg_or_int16_operand (y, GET_MODE (y));
885 if (! ok_const)
886 y = force_reg (GET_MODE (x), y);
890 switch (compare_code)
892 case EQ :
893 emit_insn (gen_cmp_eqsi_insn (must_swap ? y : x, must_swap ? x : y));
894 break;
895 case LT :
896 emit_insn (gen_cmp_ltsi_insn (must_swap ? y : x, must_swap ? x : y));
897 break;
898 case LTU :
899 emit_insn (gen_cmp_ltusi_insn (must_swap ? y : x, must_swap ? x : y));
900 break;
902 default:
903 gcc_unreachable ();
906 return gen_rtx_fmt_ee (branch_code, VOIDmode, cc_reg, CONST0_RTX (CCmode));
909 bool
910 gen_cond_store (enum rtx_code code, rtx op0, rtx op1, rtx op2)
912 machine_mode mode = GET_MODE (op0);
914 gcc_assert (mode == SImode);
915 switch (code)
917 case EQ:
918 if (!register_operand (op1, mode))
919 op1 = force_reg (mode, op1);
921 if (TARGET_M32RX || TARGET_M32R2)
923 if (!reg_or_zero_operand (op2, mode))
924 op2 = force_reg (mode, op2);
926 emit_insn (gen_seq_insn_m32rx (op0, op1, op2));
927 return true;
929 if (CONST_INT_P (op2) && INTVAL (op2) == 0)
931 emit_insn (gen_seq_zero_insn (op0, op1));
932 return true;
935 if (!reg_or_eq_int16_operand (op2, mode))
936 op2 = force_reg (mode, op2);
938 emit_insn (gen_seq_insn (op0, op1, op2));
939 return true;
941 case NE:
942 if (!CONST_INT_P (op2)
943 || (INTVAL (op2) != 0 && satisfies_constraint_K (op2)))
945 rtx reg;
947 if (reload_completed || reload_in_progress)
948 return false;
950 reg = gen_reg_rtx (SImode);
951 emit_insn (gen_xorsi3 (reg, op1, op2));
952 op1 = reg;
954 if (!register_operand (op1, mode))
955 op1 = force_reg (mode, op1);
957 emit_insn (gen_sne_zero_insn (op0, op1));
958 return true;
960 return false;
962 case LT:
963 case GT:
964 if (code == GT)
966 rtx tmp = op2;
967 op2 = op1;
968 op1 = tmp;
969 code = LT;
972 if (!register_operand (op1, mode))
973 op1 = force_reg (mode, op1);
975 if (!reg_or_int16_operand (op2, mode))
976 op2 = force_reg (mode, op2);
978 emit_insn (gen_slt_insn (op0, op1, op2));
979 return true;
981 case LTU:
982 case GTU:
983 if (code == GTU)
985 rtx tmp = op2;
986 op2 = op1;
987 op1 = tmp;
988 code = LTU;
991 if (!register_operand (op1, mode))
992 op1 = force_reg (mode, op1);
994 if (!reg_or_int16_operand (op2, mode))
995 op2 = force_reg (mode, op2);
997 emit_insn (gen_sltu_insn (op0, op1, op2));
998 return true;
1000 case GE:
1001 case GEU:
1002 if (!register_operand (op1, mode))
1003 op1 = force_reg (mode, op1);
1005 if (!reg_or_int16_operand (op2, mode))
1006 op2 = force_reg (mode, op2);
1008 if (code == GE)
1009 emit_insn (gen_sge_insn (op0, op1, op2));
1010 else
1011 emit_insn (gen_sgeu_insn (op0, op1, op2));
1012 return true;
1014 case LE:
1015 case LEU:
1016 if (!register_operand (op1, mode))
1017 op1 = force_reg (mode, op1);
1019 if (CONST_INT_P (op2))
1021 HOST_WIDE_INT value = INTVAL (op2);
1022 if (value >= 2147483647)
1024 emit_move_insn (op0, const1_rtx);
1025 return true;
1028 op2 = GEN_INT (value + 1);
1029 if (value < -32768 || value >= 32767)
1030 op2 = force_reg (mode, op2);
1032 if (code == LEU)
1033 emit_insn (gen_sltu_insn (op0, op1, op2));
1034 else
1035 emit_insn (gen_slt_insn (op0, op1, op2));
1036 return true;
1039 if (!register_operand (op2, mode))
1040 op2 = force_reg (mode, op2);
1042 if (code == LEU)
1043 emit_insn (gen_sleu_insn (op0, op1, op2));
1044 else
1045 emit_insn (gen_sle_insn (op0, op1, op2));
1046 return true;
1048 default:
1049 gcc_unreachable ();
1054 /* Split a 2 word move (DI or DF) into component parts. */
1057 gen_split_move_double (rtx operands[])
1059 machine_mode mode = GET_MODE (operands[0]);
1060 rtx dest = operands[0];
1061 rtx src = operands[1];
1062 rtx val;
1064 /* We might have (SUBREG (MEM)) here, so just get rid of the
1065 subregs to make this code simpler. It is safe to call
1066 alter_subreg any time after reload. */
1067 if (GET_CODE (dest) == SUBREG)
1068 alter_subreg (&dest, true);
1069 if (GET_CODE (src) == SUBREG)
1070 alter_subreg (&src, true);
1072 start_sequence ();
1073 if (REG_P (dest))
1075 int dregno = REGNO (dest);
1077 /* Reg = reg. */
1078 if (REG_P (src))
1080 int sregno = REGNO (src);
1082 int reverse = (dregno == sregno + 1);
1084 /* We normally copy the low-numbered register first. However, if
1085 the first register operand 0 is the same as the second register of
1086 operand 1, we must copy in the opposite order. */
1087 emit_insn (gen_rtx_SET (operand_subword (dest, reverse, TRUE, mode),
1088 operand_subword (src, reverse, TRUE, mode)));
1090 emit_insn (gen_rtx_SET (operand_subword (dest, !reverse, TRUE, mode),
1091 operand_subword (src, !reverse, TRUE, mode)));
1094 /* Reg = constant. */
1095 else if (CONST_INT_P (src) || GET_CODE (src) == CONST_DOUBLE)
1097 rtx words[2];
1098 split_double (src, &words[0], &words[1]);
1099 emit_insn (gen_rtx_SET (operand_subword (dest, 0, TRUE, mode),
1100 words[0]));
1102 emit_insn (gen_rtx_SET (operand_subword (dest, 1, TRUE, mode),
1103 words[1]));
1106 /* Reg = mem. */
1107 else if (MEM_P (src))
1109 /* If the high-address word is used in the address, we must load it
1110 last. Otherwise, load it first. */
1111 int reverse = refers_to_regno_p (dregno, XEXP (src, 0));
1113 /* We used to optimize loads from single registers as
1115 ld r1,r3+; ld r2,r3
1117 if r3 were not used subsequently. However, the REG_NOTES aren't
1118 propagated correctly by the reload phase, and it can cause bad
1119 code to be generated. We could still try:
1121 ld r1,r3+; ld r2,r3; addi r3,-4
1123 which saves 2 bytes and doesn't force longword alignment. */
1124 emit_insn (gen_rtx_SET (operand_subword (dest, reverse, TRUE, mode),
1125 adjust_address (src, SImode,
1126 reverse * UNITS_PER_WORD)));
1128 emit_insn (gen_rtx_SET (operand_subword (dest, !reverse, TRUE, mode),
1129 adjust_address (src, SImode,
1130 !reverse * UNITS_PER_WORD)));
1132 else
1133 gcc_unreachable ();
1136 /* Mem = reg. */
1137 /* We used to optimize loads from single registers as
1139 st r1,r3; st r2,+r3
1141 if r3 were not used subsequently. However, the REG_NOTES aren't
1142 propagated correctly by the reload phase, and it can cause bad
1143 code to be generated. We could still try:
1145 st r1,r3; st r2,+r3; addi r3,-4
1147 which saves 2 bytes and doesn't force longword alignment. */
1148 else if (MEM_P (dest) && REG_P (src))
1150 emit_insn (gen_rtx_SET (adjust_address (dest, SImode, 0),
1151 operand_subword (src, 0, TRUE, mode)));
1153 emit_insn (gen_rtx_SET (adjust_address (dest, SImode, UNITS_PER_WORD),
1154 operand_subword (src, 1, TRUE, mode)));
1157 else
1158 gcc_unreachable ();
1160 val = get_insns ();
1161 end_sequence ();
1162 return val;
1166 static int
1167 m32r_arg_partial_bytes (cumulative_args_t cum_v, machine_mode mode,
1168 tree type, bool named ATTRIBUTE_UNUSED)
1170 CUMULATIVE_ARGS *cum = get_cumulative_args (cum_v);
1172 int words;
1173 unsigned int size =
1174 (((mode == BLKmode && type)
1175 ? (unsigned int) int_size_in_bytes (type)
1176 : GET_MODE_SIZE (mode)) + UNITS_PER_WORD - 1)
1177 / UNITS_PER_WORD;
1179 if (*cum >= M32R_MAX_PARM_REGS)
1180 words = 0;
1181 else if (*cum + size > M32R_MAX_PARM_REGS)
1182 words = (*cum + size) - M32R_MAX_PARM_REGS;
1183 else
1184 words = 0;
1186 return words * UNITS_PER_WORD;
1189 /* The ROUND_ADVANCE* macros are local to this file. */
1190 /* Round SIZE up to a word boundary. */
1191 #define ROUND_ADVANCE(SIZE) \
1192 (((SIZE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
1194 /* Round arg MODE/TYPE up to the next word boundary. */
1195 #define ROUND_ADVANCE_ARG(MODE, TYPE) \
1196 ((MODE) == BLKmode \
1197 ? ROUND_ADVANCE ((unsigned int) int_size_in_bytes (TYPE)) \
1198 : ROUND_ADVANCE ((unsigned int) GET_MODE_SIZE (MODE)))
1200 /* Round CUM up to the necessary point for argument MODE/TYPE. */
1201 #define ROUND_ADVANCE_CUM(CUM, MODE, TYPE) (CUM)
1203 /* Return boolean indicating arg of type TYPE and mode MODE will be passed in
1204 a reg. This includes arguments that have to be passed by reference as the
1205 pointer to them is passed in a reg if one is available (and that is what
1206 we're given).
1207 This macro is only used in this file. */
1208 #define PASS_IN_REG_P(CUM, MODE, TYPE) \
1209 (ROUND_ADVANCE_CUM ((CUM), (MODE), (TYPE)) < M32R_MAX_PARM_REGS)
1211 /* Determine where to put an argument to a function.
1212 Value is zero to push the argument on the stack,
1213 or a hard register in which to store the argument.
1215 MODE is the argument's machine mode.
1216 TYPE is the data type of the argument (as a tree).
1217 This is null for libcalls where that information may
1218 not be available.
1219 CUM is a variable of type CUMULATIVE_ARGS which gives info about
1220 the preceding args and about the function being called.
1221 NAMED is nonzero if this argument is a named parameter
1222 (otherwise it is an extra parameter matching an ellipsis). */
1223 /* On the M32R the first M32R_MAX_PARM_REGS args are normally in registers
1224 and the rest are pushed. */
1226 static rtx
1227 m32r_function_arg (cumulative_args_t cum_v, machine_mode mode,
1228 const_tree type ATTRIBUTE_UNUSED,
1229 bool named ATTRIBUTE_UNUSED)
1231 CUMULATIVE_ARGS *cum = get_cumulative_args (cum_v);
1233 return (PASS_IN_REG_P (*cum, mode, type)
1234 ? gen_rtx_REG (mode, ROUND_ADVANCE_CUM (*cum, mode, type))
1235 : NULL_RTX);
1238 /* Update the data in CUM to advance over an argument
1239 of mode MODE and data type TYPE.
1240 (TYPE is null for libcalls where that information may not be available.) */
1242 static void
1243 m32r_function_arg_advance (cumulative_args_t cum_v, machine_mode mode,
1244 const_tree type, bool named ATTRIBUTE_UNUSED)
1246 CUMULATIVE_ARGS *cum = get_cumulative_args (cum_v);
1248 *cum = (ROUND_ADVANCE_CUM (*cum, mode, type)
1249 + ROUND_ADVANCE_ARG (mode, type));
1252 /* Worker function for TARGET_RETURN_IN_MEMORY. */
1254 static bool
1255 m32r_return_in_memory (const_tree type, const_tree fntype ATTRIBUTE_UNUSED)
1257 cumulative_args_t dummy = pack_cumulative_args (NULL);
1259 return m32r_pass_by_reference (dummy, TYPE_MODE (type), type, false);
1262 /* Worker function for TARGET_FUNCTION_VALUE. */
1264 static rtx
1265 m32r_function_value (const_tree valtype,
1266 const_tree fn_decl_or_type ATTRIBUTE_UNUSED,
1267 bool outgoing ATTRIBUTE_UNUSED)
1269 return gen_rtx_REG (TYPE_MODE (valtype), 0);
1272 /* Worker function for TARGET_LIBCALL_VALUE. */
1274 static rtx
1275 m32r_libcall_value (machine_mode mode,
1276 const_rtx fun ATTRIBUTE_UNUSED)
1278 return gen_rtx_REG (mode, 0);
1281 /* Worker function for TARGET_FUNCTION_VALUE_REGNO_P.
1283 ??? What about r1 in DI/DF values. */
1285 static bool
1286 m32r_function_value_regno_p (const unsigned int regno)
1288 return (regno == 0);
1291 /* Do any needed setup for a variadic function. For the M32R, we must
1292 create a register parameter block, and then copy any anonymous arguments
1293 in registers to memory.
1295 CUM has not been updated for the last named argument which has type TYPE
1296 and mode MODE, and we rely on this fact. */
1298 static void
1299 m32r_setup_incoming_varargs (cumulative_args_t cum, machine_mode mode,
1300 tree type, int *pretend_size, int no_rtl)
1302 int first_anon_arg;
1304 if (no_rtl)
1305 return;
1307 /* All BLKmode values are passed by reference. */
1308 gcc_assert (mode != BLKmode);
1310 first_anon_arg = (ROUND_ADVANCE_CUM (*get_cumulative_args (cum), mode, type)
1311 + ROUND_ADVANCE_ARG (mode, type));
1313 if (first_anon_arg < M32R_MAX_PARM_REGS)
1315 /* Note that first_reg_offset < M32R_MAX_PARM_REGS. */
1316 int first_reg_offset = first_anon_arg;
1317 /* Size in words to "pretend" allocate. */
1318 int size = M32R_MAX_PARM_REGS - first_reg_offset;
1319 rtx regblock;
1321 regblock = gen_frame_mem (BLKmode,
1322 plus_constant (Pmode, arg_pointer_rtx,
1323 FIRST_PARM_OFFSET (0)));
1324 set_mem_alias_set (regblock, get_varargs_alias_set ());
1325 move_block_from_reg (first_reg_offset, regblock, size);
1327 *pretend_size = (size * UNITS_PER_WORD);
1332 /* Return true if INSN is real instruction bearing insn. */
1334 static int
1335 m32r_is_insn (rtx insn)
1337 return (NONDEBUG_INSN_P (insn)
1338 && GET_CODE (PATTERN (insn)) != USE
1339 && GET_CODE (PATTERN (insn)) != CLOBBER);
1342 /* Increase the priority of long instructions so that the
1343 short instructions are scheduled ahead of the long ones. */
1345 static int
1346 m32r_adjust_priority (rtx_insn *insn, int priority)
1348 if (m32r_is_insn (insn)
1349 && get_attr_insn_size (insn) != INSN_SIZE_SHORT)
1350 priority <<= 3;
1352 return priority;
1356 /* Indicate how many instructions can be issued at the same time.
1357 This is sort of a lie. The m32r can issue only 1 long insn at
1358 once, but it can issue 2 short insns. The default therefore is
1359 set at 2, but this can be overridden by the command line option
1360 -missue-rate=1. */
1362 static int
1363 m32r_issue_rate (void)
1365 return ((TARGET_LOW_ISSUE_RATE) ? 1 : 2);
1368 /* Cost functions. */
1369 /* Memory is 3 times as expensive as registers.
1370 ??? Is that the right way to look at it? */
1372 static int
1373 m32r_memory_move_cost (machine_mode mode,
1374 reg_class_t rclass ATTRIBUTE_UNUSED,
1375 bool in ATTRIBUTE_UNUSED)
1377 if (GET_MODE_SIZE (mode) <= UNITS_PER_WORD)
1378 return 6;
1379 else
1380 return 12;
1383 static bool
1384 m32r_rtx_costs (rtx x, machine_mode mode ATTRIBUTE_UNUSED,
1385 int outer_code ATTRIBUTE_UNUSED,
1386 int opno ATTRIBUTE_UNUSED, int *total,
1387 bool speed ATTRIBUTE_UNUSED)
1389 int code = GET_CODE (x);
1391 switch (code)
1393 /* Small integers are as cheap as registers. 4 byte values can be
1394 fetched as immediate constants - let's give that the cost of an
1395 extra insn. */
1396 case CONST_INT:
1397 if (INT16_P (INTVAL (x)))
1399 *total = 0;
1400 return true;
1402 /* FALLTHRU */
1404 case CONST:
1405 case LABEL_REF:
1406 case SYMBOL_REF:
1407 *total = COSTS_N_INSNS (1);
1408 return true;
1410 case CONST_DOUBLE:
1412 rtx high, low;
1414 split_double (x, &high, &low);
1415 *total = COSTS_N_INSNS (!INT16_P (INTVAL (high))
1416 + !INT16_P (INTVAL (low)));
1417 return true;
1420 case MULT:
1421 *total = COSTS_N_INSNS (3);
1422 return true;
1424 case DIV:
1425 case UDIV:
1426 case MOD:
1427 case UMOD:
1428 *total = COSTS_N_INSNS (10);
1429 return true;
1431 default:
1432 return false;
1436 /* Type of function DECL.
1438 The result is cached. To reset the cache at the end of a function,
1439 call with DECL = NULL_TREE. */
1441 enum m32r_function_type
1442 m32r_compute_function_type (tree decl)
1444 /* Cached value. */
1445 static enum m32r_function_type fn_type = M32R_FUNCTION_UNKNOWN;
1446 /* Last function we were called for. */
1447 static tree last_fn = NULL_TREE;
1449 /* Resetting the cached value? */
1450 if (decl == NULL_TREE)
1452 fn_type = M32R_FUNCTION_UNKNOWN;
1453 last_fn = NULL_TREE;
1454 return fn_type;
1457 if (decl == last_fn && fn_type != M32R_FUNCTION_UNKNOWN)
1458 return fn_type;
1460 /* Compute function type. */
1461 fn_type = (lookup_attribute ("interrupt", DECL_ATTRIBUTES (current_function_decl)) != NULL_TREE
1462 ? M32R_FUNCTION_INTERRUPT
1463 : M32R_FUNCTION_NORMAL);
1465 last_fn = decl;
1466 return fn_type;
1468 \f/* Function prologue/epilogue handlers. */
1470 /* M32R stack frames look like:
1472 Before call After call
1473 +-----------------------+ +-----------------------+
1474 | | | |
1475 high | local variables, | | local variables, |
1476 mem | reg save area, etc. | | reg save area, etc. |
1477 | | | |
1478 +-----------------------+ +-----------------------+
1479 | | | |
1480 | arguments on stack. | | arguments on stack. |
1481 | | | |
1482 SP+0->+-----------------------+ +-----------------------+
1483 | reg parm save area, |
1484 | only created for |
1485 | variable argument |
1486 | functions |
1487 +-----------------------+
1488 | previous frame ptr |
1489 +-----------------------+
1491 | register save area |
1493 +-----------------------+
1494 | return address |
1495 +-----------------------+
1497 | local variables |
1499 +-----------------------+
1501 | alloca allocations |
1503 +-----------------------+
1505 low | arguments on stack |
1506 memory | |
1507 SP+0->+-----------------------+
1509 Notes:
1510 1) The "reg parm save area" does not exist for non variable argument fns.
1511 2) The "reg parm save area" can be eliminated completely if we saved regs
1512 containing anonymous args separately but that complicates things too
1513 much (so it's not done).
1514 3) The return address is saved after the register save area so as to have as
1515 many insns as possible between the restoration of `lr' and the `jmp lr'. */
1517 /* Structure to be filled in by m32r_compute_frame_size with register
1518 save masks, and offsets for the current function. */
1519 struct m32r_frame_info
1521 unsigned int total_size; /* # bytes that the entire frame takes up. */
1522 unsigned int extra_size; /* # bytes of extra stuff. */
1523 unsigned int pretend_size; /* # bytes we push and pretend caller did. */
1524 unsigned int args_size; /* # bytes that outgoing arguments take up. */
1525 unsigned int reg_size; /* # bytes needed to store regs. */
1526 unsigned int var_size; /* # bytes that variables take up. */
1527 unsigned int gmask; /* Mask of saved gp registers. */
1528 unsigned int save_fp; /* Nonzero if fp must be saved. */
1529 unsigned int save_lr; /* Nonzero if lr (return addr) must be saved. */
1530 int initialized; /* Nonzero if frame size already calculated. */
1533 /* Current frame information calculated by m32r_compute_frame_size. */
1534 static struct m32r_frame_info current_frame_info;
1536 /* Zero structure to initialize current_frame_info. */
1537 static struct m32r_frame_info zero_frame_info;
1539 #define FRAME_POINTER_MASK (1 << (FRAME_POINTER_REGNUM))
1540 #define RETURN_ADDR_MASK (1 << (RETURN_ADDR_REGNUM))
1542 /* Tell prologue and epilogue if register REGNO should be saved / restored.
1543 The return address and frame pointer are treated separately.
1544 Don't consider them here. */
1545 #define MUST_SAVE_REGISTER(regno, interrupt_p) \
1546 ((regno) != RETURN_ADDR_REGNUM && (regno) != FRAME_POINTER_REGNUM \
1547 && (df_regs_ever_live_p (regno) && (!call_really_used_regs[regno] || interrupt_p)))
1549 #define MUST_SAVE_FRAME_POINTER (df_regs_ever_live_p (FRAME_POINTER_REGNUM))
1550 #define MUST_SAVE_RETURN_ADDR (df_regs_ever_live_p (RETURN_ADDR_REGNUM) || crtl->profile)
1552 #define SHORT_INSN_SIZE 2 /* Size of small instructions. */
1553 #define LONG_INSN_SIZE 4 /* Size of long instructions. */
1555 /* Return the bytes needed to compute the frame pointer from the current
1556 stack pointer.
1558 SIZE is the size needed for local variables. */
1560 unsigned int
1561 m32r_compute_frame_size (poly_int64 size) /* # of var. bytes allocated. */
1563 unsigned int regno;
1564 unsigned int total_size, var_size, args_size, pretend_size, extra_size;
1565 unsigned int reg_size;
1566 unsigned int gmask;
1567 enum m32r_function_type fn_type;
1568 int interrupt_p;
1569 int pic_reg_used = flag_pic && (crtl->uses_pic_offset_table
1570 | crtl->profile);
1572 var_size = M32R_STACK_ALIGN (size);
1573 args_size = M32R_STACK_ALIGN (crtl->outgoing_args_size);
1574 pretend_size = crtl->args.pretend_args_size;
1575 extra_size = FIRST_PARM_OFFSET (0);
1576 total_size = extra_size + pretend_size + args_size + var_size;
1577 reg_size = 0;
1578 gmask = 0;
1580 /* See if this is an interrupt handler. Call used registers must be saved
1581 for them too. */
1582 fn_type = m32r_compute_function_type (current_function_decl);
1583 interrupt_p = M32R_INTERRUPT_P (fn_type);
1585 /* Calculate space needed for registers. */
1586 for (regno = 0; regno < M32R_MAX_INT_REGS; regno++)
1588 if (MUST_SAVE_REGISTER (regno, interrupt_p)
1589 || (regno == PIC_OFFSET_TABLE_REGNUM && pic_reg_used))
1591 reg_size += UNITS_PER_WORD;
1592 gmask |= 1 << regno;
1596 current_frame_info.save_fp = MUST_SAVE_FRAME_POINTER;
1597 current_frame_info.save_lr = MUST_SAVE_RETURN_ADDR || pic_reg_used;
1599 reg_size += ((current_frame_info.save_fp + current_frame_info.save_lr)
1600 * UNITS_PER_WORD);
1601 total_size += reg_size;
1603 /* ??? Not sure this is necessary, and I don't think the epilogue
1604 handler will do the right thing if this changes total_size. */
1605 total_size = M32R_STACK_ALIGN (total_size);
1607 /* frame_size = total_size - (pretend_size + reg_size); */
1609 /* Save computed information. */
1610 current_frame_info.total_size = total_size;
1611 current_frame_info.extra_size = extra_size;
1612 current_frame_info.pretend_size = pretend_size;
1613 current_frame_info.var_size = var_size;
1614 current_frame_info.args_size = args_size;
1615 current_frame_info.reg_size = reg_size;
1616 current_frame_info.gmask = gmask;
1617 current_frame_info.initialized = reload_completed;
1619 /* Ok, we're done. */
1620 return total_size;
1623 /* Worker function for TARGET_CAN_ELIMINATE. */
1625 bool
1626 m32r_can_eliminate (const int from, const int to)
1628 return (from == ARG_POINTER_REGNUM && to == STACK_POINTER_REGNUM
1629 ? ! frame_pointer_needed
1630 : true);
1634 /* The table we use to reference PIC data. */
1635 static rtx global_offset_table;
1637 static void
1638 m32r_reload_lr (rtx sp, int size)
1640 rtx lr = gen_rtx_REG (Pmode, RETURN_ADDR_REGNUM);
1642 if (size == 0)
1643 emit_insn (gen_movsi (lr, gen_frame_mem (Pmode, sp)));
1644 else if (size < 32768)
1645 emit_insn (gen_movsi (lr, gen_frame_mem (Pmode,
1646 gen_rtx_PLUS (Pmode, sp,
1647 GEN_INT (size)))));
1648 else
1650 rtx tmp = gen_rtx_REG (Pmode, PROLOGUE_TMP_REGNUM);
1652 emit_insn (gen_movsi (tmp, GEN_INT (size)));
1653 emit_insn (gen_addsi3 (tmp, tmp, sp));
1654 emit_insn (gen_movsi (lr, gen_frame_mem (Pmode, tmp)));
1657 emit_use (lr);
1660 void
1661 m32r_load_pic_register (void)
1663 global_offset_table = gen_rtx_SYMBOL_REF (Pmode, "_GLOBAL_OFFSET_TABLE_");
1664 emit_insn (gen_get_pc (pic_offset_table_rtx, global_offset_table,
1665 GEN_INT (TARGET_MODEL_SMALL)));
1667 /* Need to emit this whether or not we obey regdecls,
1668 since setjmp/longjmp can cause life info to screw up. */
1669 emit_use (pic_offset_table_rtx);
1672 /* Expand the m32r prologue as a series of insns. */
1674 void
1675 m32r_expand_prologue (void)
1677 int regno;
1678 int frame_size;
1679 unsigned int gmask;
1680 int pic_reg_used = flag_pic && (crtl->uses_pic_offset_table
1681 | crtl->profile);
1683 if (! current_frame_info.initialized)
1684 m32r_compute_frame_size (get_frame_size ());
1686 if (flag_stack_usage_info)
1687 current_function_static_stack_size = current_frame_info.total_size;
1689 gmask = current_frame_info.gmask;
1691 /* These cases shouldn't happen. Catch them now. */
1692 gcc_assert (current_frame_info.total_size || !gmask);
1694 /* Allocate space for register arguments if this is a variadic function. */
1695 if (current_frame_info.pretend_size != 0)
1697 /* Use a HOST_WIDE_INT temporary, since negating an unsigned int gives
1698 the wrong result on a 64-bit host. */
1699 HOST_WIDE_INT pretend_size = current_frame_info.pretend_size;
1700 emit_insn (gen_addsi3 (stack_pointer_rtx,
1701 stack_pointer_rtx,
1702 GEN_INT (-pretend_size)));
1705 /* Save any registers we need to and set up fp. */
1706 if (current_frame_info.save_fp)
1707 emit_insn (gen_movsi_push (stack_pointer_rtx, frame_pointer_rtx));
1709 gmask &= ~(FRAME_POINTER_MASK | RETURN_ADDR_MASK);
1711 /* Save any needed call-saved regs (and call-used if this is an
1712 interrupt handler). */
1713 for (regno = 0; regno <= M32R_MAX_INT_REGS; ++regno)
1715 if ((gmask & (1 << regno)) != 0)
1716 emit_insn (gen_movsi_push (stack_pointer_rtx,
1717 gen_rtx_REG (Pmode, regno)));
1720 if (current_frame_info.save_lr)
1721 emit_insn (gen_movsi_push (stack_pointer_rtx,
1722 gen_rtx_REG (Pmode, RETURN_ADDR_REGNUM)));
1724 /* Allocate the stack frame. */
1725 frame_size = (current_frame_info.total_size
1726 - (current_frame_info.pretend_size
1727 + current_frame_info.reg_size));
1729 if (frame_size == 0)
1730 ; /* Nothing to do. */
1731 else if (frame_size <= 32768)
1732 emit_insn (gen_addsi3 (stack_pointer_rtx, stack_pointer_rtx,
1733 GEN_INT (-frame_size)));
1734 else
1736 rtx tmp = gen_rtx_REG (Pmode, PROLOGUE_TMP_REGNUM);
1738 emit_insn (gen_movsi (tmp, GEN_INT (frame_size)));
1739 emit_insn (gen_subsi3 (stack_pointer_rtx, stack_pointer_rtx, tmp));
1742 if (frame_pointer_needed)
1743 emit_insn (gen_movsi (frame_pointer_rtx, stack_pointer_rtx));
1745 if (crtl->profile)
1746 /* Push lr for mcount (form_pc, x). */
1747 emit_insn (gen_movsi_push (stack_pointer_rtx,
1748 gen_rtx_REG (Pmode, RETURN_ADDR_REGNUM)));
1750 if (pic_reg_used)
1752 m32r_load_pic_register ();
1753 m32r_reload_lr (stack_pointer_rtx,
1754 (crtl->profile ? 0 : frame_size));
1757 if (crtl->profile && !pic_reg_used)
1758 emit_insn (gen_blockage ());
1762 /* Set up the stack and frame pointer (if desired) for the function.
1763 Note, if this is changed, you need to mirror the changes in
1764 m32r_compute_frame_size which calculates the prolog size. */
1766 static void
1767 m32r_output_function_prologue (FILE * file)
1769 enum m32r_function_type fn_type = m32r_compute_function_type (current_function_decl);
1771 /* If this is an interrupt handler, mark it as such. */
1772 if (M32R_INTERRUPT_P (fn_type))
1773 fprintf (file, "\t%s interrupt handler\n", ASM_COMMENT_START);
1775 if (! current_frame_info.initialized)
1776 m32r_compute_frame_size (get_frame_size ());
1778 /* This is only for the human reader. */
1779 fprintf (file,
1780 "\t%s PROLOGUE, vars= %d, regs= %d, args= %d, extra= %d\n",
1781 ASM_COMMENT_START,
1782 current_frame_info.var_size,
1783 current_frame_info.reg_size / 4,
1784 current_frame_info.args_size,
1785 current_frame_info.extra_size);
1788 /* Output RTL to pop register REGNO from the stack. */
1790 static void
1791 pop (int regno)
1793 rtx x;
1795 x = emit_insn (gen_movsi_pop (gen_rtx_REG (Pmode, regno),
1796 stack_pointer_rtx));
1797 add_reg_note (x, REG_INC, stack_pointer_rtx);
1800 /* Expand the m32r epilogue as a series of insns. */
1802 void
1803 m32r_expand_epilogue (void)
1805 int regno;
1806 int noepilogue = FALSE;
1807 int total_size;
1809 gcc_assert (current_frame_info.initialized);
1810 total_size = current_frame_info.total_size;
1812 if (total_size == 0)
1814 rtx_insn *insn = get_last_insn ();
1816 /* If the last insn was a BARRIER, we don't have to write any code
1817 because a jump (aka return) was put there. */
1818 if (insn && NOTE_P (insn))
1819 insn = prev_nonnote_insn (insn);
1820 if (insn && BARRIER_P (insn))
1821 noepilogue = TRUE;
1824 if (!noepilogue)
1826 unsigned int var_size = current_frame_info.var_size;
1827 unsigned int args_size = current_frame_info.args_size;
1828 unsigned int gmask = current_frame_info.gmask;
1829 int can_trust_sp_p = !cfun->calls_alloca;
1831 if (flag_exceptions)
1832 emit_insn (gen_blockage ());
1834 /* The first thing to do is point the sp at the bottom of the register
1835 save area. */
1836 if (can_trust_sp_p)
1838 unsigned int reg_offset = var_size + args_size;
1840 if (reg_offset == 0)
1841 ; /* Nothing to do. */
1842 else if (reg_offset < 32768)
1843 emit_insn (gen_addsi3 (stack_pointer_rtx, stack_pointer_rtx,
1844 GEN_INT (reg_offset)));
1845 else
1847 rtx tmp = gen_rtx_REG (Pmode, PROLOGUE_TMP_REGNUM);
1849 emit_insn (gen_movsi (tmp, GEN_INT (reg_offset)));
1850 emit_insn (gen_addsi3 (stack_pointer_rtx, stack_pointer_rtx,
1851 tmp));
1854 else if (frame_pointer_needed)
1856 unsigned int reg_offset = var_size + args_size;
1858 if (reg_offset == 0)
1859 emit_insn (gen_movsi (stack_pointer_rtx, frame_pointer_rtx));
1860 else if (reg_offset < 32768)
1861 emit_insn (gen_addsi3 (stack_pointer_rtx, frame_pointer_rtx,
1862 GEN_INT (reg_offset)));
1863 else
1865 rtx tmp = gen_rtx_REG (Pmode, PROLOGUE_TMP_REGNUM);
1867 emit_insn (gen_movsi (tmp, GEN_INT (reg_offset)));
1868 emit_insn (gen_movsi (stack_pointer_rtx, frame_pointer_rtx));
1869 emit_insn (gen_addsi3 (stack_pointer_rtx, stack_pointer_rtx,
1870 tmp));
1873 else
1874 gcc_unreachable ();
1876 if (current_frame_info.save_lr)
1877 pop (RETURN_ADDR_REGNUM);
1879 /* Restore any saved registers, in reverse order of course. */
1880 gmask &= ~(FRAME_POINTER_MASK | RETURN_ADDR_MASK);
1881 for (regno = M32R_MAX_INT_REGS - 1; regno >= 0; --regno)
1883 if ((gmask & (1L << regno)) != 0)
1884 pop (regno);
1887 if (current_frame_info.save_fp)
1888 pop (FRAME_POINTER_REGNUM);
1890 /* Remove varargs area if present. */
1891 if (current_frame_info.pretend_size != 0)
1892 emit_insn (gen_addsi3 (stack_pointer_rtx, stack_pointer_rtx,
1893 GEN_INT (current_frame_info.pretend_size)));
1895 emit_insn (gen_blockage ());
1899 /* Do any necessary cleanup after a function to restore stack, frame,
1900 and regs. */
1902 static void
1903 m32r_output_function_epilogue (FILE *)
1905 /* Reset state info for each function. */
1906 current_frame_info = zero_frame_info;
1907 m32r_compute_function_type (NULL_TREE);
1910 /* Return nonzero if this function is known to have a null or 1 instruction
1911 epilogue. */
1914 direct_return (void)
1916 if (!reload_completed)
1917 return FALSE;
1919 if (M32R_INTERRUPT_P (m32r_compute_function_type (current_function_decl)))
1920 return FALSE;
1922 if (! current_frame_info.initialized)
1923 m32r_compute_frame_size (get_frame_size ());
1925 return current_frame_info.total_size == 0;
1929 /* PIC. */
1932 m32r_legitimate_pic_operand_p (rtx x)
1934 if (GET_CODE (x) == SYMBOL_REF || GET_CODE (x) == LABEL_REF)
1935 return 0;
1937 if (GET_CODE (x) == CONST
1938 && GET_CODE (XEXP (x, 0)) == PLUS
1939 && (GET_CODE (XEXP (XEXP (x, 0), 0)) == SYMBOL_REF
1940 || GET_CODE (XEXP (XEXP (x, 0), 0)) == LABEL_REF)
1941 && (CONST_INT_P (XEXP (XEXP (x, 0), 1))))
1942 return 0;
1944 return 1;
1948 m32r_legitimize_pic_address (rtx orig, rtx reg)
1950 #ifdef DEBUG_PIC
1951 printf("m32r_legitimize_pic_address()\n");
1952 #endif
1954 if (GET_CODE (orig) == SYMBOL_REF || GET_CODE (orig) == LABEL_REF)
1956 rtx pic_ref, address;
1957 int subregs = 0;
1959 if (reg == 0)
1961 gcc_assert (!reload_in_progress && !reload_completed);
1962 reg = gen_reg_rtx (Pmode);
1964 subregs = 1;
1967 if (subregs)
1968 address = gen_reg_rtx (Pmode);
1969 else
1970 address = reg;
1972 crtl->uses_pic_offset_table = 1;
1974 if (GET_CODE (orig) == LABEL_REF
1975 || (GET_CODE (orig) == SYMBOL_REF && SYMBOL_REF_LOCAL_P (orig)))
1977 emit_insn (gen_gotoff_load_addr (reg, orig));
1978 emit_insn (gen_addsi3 (reg, reg, pic_offset_table_rtx));
1979 return reg;
1982 emit_insn (gen_pic_load_addr (address, orig));
1984 emit_insn (gen_addsi3 (address, address, pic_offset_table_rtx));
1985 pic_ref = gen_const_mem (Pmode, address);
1986 emit_move_insn (reg, pic_ref);
1987 return reg;
1989 else if (GET_CODE (orig) == CONST)
1991 rtx base, offset;
1993 if (GET_CODE (XEXP (orig, 0)) == PLUS
1994 && XEXP (XEXP (orig, 0), 1) == pic_offset_table_rtx)
1995 return orig;
1997 if (reg == 0)
1999 gcc_assert (!reload_in_progress && !reload_completed);
2000 reg = gen_reg_rtx (Pmode);
2003 if (GET_CODE (XEXP (orig, 0)) == PLUS)
2005 base = m32r_legitimize_pic_address (XEXP (XEXP (orig, 0), 0), reg);
2006 if (base == reg)
2007 offset = m32r_legitimize_pic_address (XEXP (XEXP (orig, 0), 1), NULL_RTX);
2008 else
2009 offset = m32r_legitimize_pic_address (XEXP (XEXP (orig, 0), 1), reg);
2011 else
2012 return orig;
2014 if (CONST_INT_P (offset))
2016 if (INT16_P (INTVAL (offset)))
2017 return plus_constant (Pmode, base, INTVAL (offset));
2018 else
2020 gcc_assert (! reload_in_progress && ! reload_completed);
2021 offset = force_reg (Pmode, offset);
2025 return gen_rtx_PLUS (Pmode, base, offset);
2028 return orig;
2031 static rtx
2032 m32r_legitimize_address (rtx x, rtx orig_x ATTRIBUTE_UNUSED,
2033 machine_mode mode ATTRIBUTE_UNUSED)
2035 if (flag_pic)
2036 return m32r_legitimize_pic_address (x, NULL_RTX);
2037 else
2038 return x;
2041 /* Worker function for TARGET_MODE_DEPENDENT_ADDRESS_P. */
2043 static bool
2044 m32r_mode_dependent_address_p (const_rtx addr, addr_space_t as ATTRIBUTE_UNUSED)
2046 if (GET_CODE (addr) == LO_SUM)
2047 return true;
2049 return false;
2052 /* Nested function support. */
2054 /* Emit RTL insns to initialize the variable parts of a trampoline.
2055 FNADDR is an RTX for the address of the function's pure code.
2056 CXT is an RTX for the static chain value for the function. */
2058 void
2059 m32r_initialize_trampoline (rtx tramp ATTRIBUTE_UNUSED,
2060 rtx fnaddr ATTRIBUTE_UNUSED,
2061 rtx cxt ATTRIBUTE_UNUSED)
2065 static void
2066 m32r_file_start (void)
2068 default_file_start ();
2070 if (flag_verbose_asm)
2071 fprintf (asm_out_file,
2072 "%s M32R/D special options: -G %d\n",
2073 ASM_COMMENT_START, g_switch_value);
2075 if (TARGET_LITTLE_ENDIAN)
2076 fprintf (asm_out_file, "\t.little\n");
2079 /* Print operand X (an rtx) in assembler syntax to file FILE.
2080 CODE is a letter or dot (`z' in `%z0') or 0 if no letter was specified.
2081 For `%' followed by punctuation, CODE is the punctuation and X is null. */
2083 static void
2084 m32r_print_operand (FILE * file, rtx x, int code)
2086 rtx addr;
2088 switch (code)
2090 /* The 's' and 'p' codes are used by output_block_move() to
2091 indicate post-increment 's'tores and 'p're-increment loads. */
2092 case 's':
2093 if (REG_P (x))
2094 fprintf (file, "@+%s", reg_names [REGNO (x)]);
2095 else
2096 output_operand_lossage ("invalid operand to %%s code");
2097 return;
2099 case 'p':
2100 if (REG_P (x))
2101 fprintf (file, "@%s+", reg_names [REGNO (x)]);
2102 else
2103 output_operand_lossage ("invalid operand to %%p code");
2104 return;
2106 case 'R' :
2107 /* Write second word of DImode or DFmode reference,
2108 register or memory. */
2109 if (REG_P (x))
2110 fputs (reg_names[REGNO (x)+1], file);
2111 else if (MEM_P (x))
2113 machine_mode mode = GET_MODE (x);
2115 fprintf (file, "@(");
2116 /* Handle possible auto-increment. Since it is pre-increment and
2117 we have already done it, we can just use an offset of four. */
2118 /* ??? This is taken from rs6000.c I think. I don't think it is
2119 currently necessary, but keep it around. */
2120 if (GET_CODE (XEXP (x, 0)) == PRE_INC
2121 || GET_CODE (XEXP (x, 0)) == PRE_DEC)
2122 output_address (mode, plus_constant (Pmode,
2123 XEXP (XEXP (x, 0), 0), 4));
2124 else
2125 output_address (mode, plus_constant (Pmode, XEXP (x, 0), 4));
2126 fputc (')', file);
2128 else
2129 output_operand_lossage ("invalid operand to %%R code");
2130 return;
2132 case 'H' : /* High word. */
2133 case 'L' : /* Low word. */
2134 if (REG_P (x))
2136 /* L = least significant word, H = most significant word. */
2137 if ((WORDS_BIG_ENDIAN != 0) ^ (code == 'L'))
2138 fputs (reg_names[REGNO (x)], file);
2139 else
2140 fputs (reg_names[REGNO (x)+1], file);
2142 else if (CONST_INT_P (x)
2143 || GET_CODE (x) == CONST_DOUBLE)
2145 rtx first, second;
2147 split_double (x, &first, &second);
2148 fprintf (file, HOST_WIDE_INT_PRINT_HEX,
2149 code == 'L' ? INTVAL (first) : INTVAL (second));
2151 else
2152 output_operand_lossage ("invalid operand to %%H/%%L code");
2153 return;
2155 case 'A' :
2157 char str[30];
2159 if (GET_CODE (x) != CONST_DOUBLE
2160 || GET_MODE_CLASS (GET_MODE (x)) != MODE_FLOAT)
2161 fatal_insn ("bad insn for 'A'", x);
2163 real_to_decimal (str, CONST_DOUBLE_REAL_VALUE (x), sizeof (str), 0, 1);
2164 fprintf (file, "%s", str);
2165 return;
2168 case 'B' : /* Bottom half. */
2169 case 'T' : /* Top half. */
2170 /* Output the argument to a `seth' insn (sets the Top half-word).
2171 For constants output arguments to a seth/or3 pair to set Top and
2172 Bottom halves. For symbols output arguments to a seth/add3 pair to
2173 set Top and Bottom halves. The difference exists because for
2174 constants seth/or3 is more readable but for symbols we need to use
2175 the same scheme as `ld' and `st' insns (16-bit addend is signed). */
2176 switch (GET_CODE (x))
2178 case CONST_INT :
2179 case CONST_DOUBLE :
2181 rtx first, second;
2183 split_double (x, &first, &second);
2184 x = WORDS_BIG_ENDIAN ? second : first;
2185 fprintf (file, HOST_WIDE_INT_PRINT_HEX,
2186 (code == 'B'
2187 ? INTVAL (x) & 0xffff
2188 : (INTVAL (x) >> 16) & 0xffff));
2190 return;
2191 case CONST :
2192 case SYMBOL_REF :
2193 if (code == 'B'
2194 && small_data_operand (x, VOIDmode))
2196 fputs ("sda(", file);
2197 output_addr_const (file, x);
2198 fputc (')', file);
2199 return;
2201 /* fall through */
2202 case LABEL_REF :
2203 fputs (code == 'T' ? "shigh(" : "low(", file);
2204 output_addr_const (file, x);
2205 fputc (')', file);
2206 return;
2207 default :
2208 output_operand_lossage ("invalid operand to %%T/%%B code");
2209 return;
2211 break;
2213 case 'U' :
2214 /* ??? wip */
2215 /* Output a load/store with update indicator if appropriate. */
2216 if (MEM_P (x))
2218 if (GET_CODE (XEXP (x, 0)) == PRE_INC
2219 || GET_CODE (XEXP (x, 0)) == PRE_DEC)
2220 fputs (".a", file);
2222 else
2223 output_operand_lossage ("invalid operand to %%U code");
2224 return;
2226 case 'N' :
2227 /* Print a constant value negated. */
2228 if (CONST_INT_P (x))
2229 output_addr_const (file, GEN_INT (- INTVAL (x)));
2230 else
2231 output_operand_lossage ("invalid operand to %%N code");
2232 return;
2234 case 'X' :
2235 /* Print a const_int in hex. Used in comments. */
2236 if (CONST_INT_P (x))
2237 fprintf (file, HOST_WIDE_INT_PRINT_HEX, INTVAL (x));
2238 return;
2240 case '#' :
2241 fputs (IMMEDIATE_PREFIX, file);
2242 return;
2244 case 0 :
2245 /* Do nothing special. */
2246 break;
2248 default :
2249 /* Unknown flag. */
2250 output_operand_lossage ("invalid operand output code");
2253 switch (GET_CODE (x))
2255 case REG :
2256 fputs (reg_names[REGNO (x)], file);
2257 break;
2259 case MEM :
2260 addr = XEXP (x, 0);
2261 if (GET_CODE (addr) == PRE_INC)
2263 if (!REG_P (XEXP (addr, 0)))
2264 fatal_insn ("pre-increment address is not a register", x);
2266 fprintf (file, "@+%s", reg_names[REGNO (XEXP (addr, 0))]);
2268 else if (GET_CODE (addr) == PRE_DEC)
2270 if (!REG_P (XEXP (addr, 0)))
2271 fatal_insn ("pre-decrement address is not a register", x);
2273 fprintf (file, "@-%s", reg_names[REGNO (XEXP (addr, 0))]);
2275 else if (GET_CODE (addr) == POST_INC)
2277 if (!REG_P (XEXP (addr, 0)))
2278 fatal_insn ("post-increment address is not a register", x);
2280 fprintf (file, "@%s+", reg_names[REGNO (XEXP (addr, 0))]);
2282 else
2284 fputs ("@(", file);
2285 output_address (GET_MODE (x), addr);
2286 fputc (')', file);
2288 break;
2290 case CONST_DOUBLE :
2291 /* We handle SFmode constants here as output_addr_const doesn't. */
2292 if (GET_MODE (x) == SFmode)
2294 long l;
2296 REAL_VALUE_TO_TARGET_SINGLE (*CONST_DOUBLE_REAL_VALUE (x), l);
2297 fprintf (file, "0x%08lx", l);
2298 break;
2301 /* FALLTHRU */
2302 /* Let output_addr_const deal with it. */
2304 default :
2305 output_addr_const (file, x);
2306 break;
2310 /* Print a memory address as an operand to reference that memory location. */
2312 static void
2313 m32r_print_operand_address (FILE * file, machine_mode /*mode*/, rtx addr)
2315 rtx base;
2316 rtx index = 0;
2317 int offset = 0;
2319 switch (GET_CODE (addr))
2321 case REG :
2322 fputs (reg_names[REGNO (addr)], file);
2323 break;
2325 case PLUS :
2326 if (CONST_INT_P (XEXP (addr, 0)))
2327 offset = INTVAL (XEXP (addr, 0)), base = XEXP (addr, 1);
2328 else if (CONST_INT_P (XEXP (addr, 1)))
2329 offset = INTVAL (XEXP (addr, 1)), base = XEXP (addr, 0);
2330 else
2331 base = XEXP (addr, 0), index = XEXP (addr, 1);
2332 if (REG_P (base))
2334 /* Print the offset first (if present) to conform to the manual. */
2335 if (index == 0)
2337 if (offset != 0)
2338 fprintf (file, "%d,", offset);
2339 fputs (reg_names[REGNO (base)], file);
2341 /* The chip doesn't support this, but left in for generality. */
2342 else if (REG_P (index))
2343 fprintf (file, "%s,%s",
2344 reg_names[REGNO (base)], reg_names[REGNO (index)]);
2345 /* Not sure this can happen, but leave in for now. */
2346 else if (GET_CODE (index) == SYMBOL_REF)
2348 output_addr_const (file, index);
2349 fputc (',', file);
2350 fputs (reg_names[REGNO (base)], file);
2352 else
2353 fatal_insn ("bad address", addr);
2355 else if (GET_CODE (base) == LO_SUM)
2357 gcc_assert (!index && REG_P (XEXP (base, 0)));
2358 if (small_data_operand (XEXP (base, 1), VOIDmode))
2359 fputs ("sda(", file);
2360 else
2361 fputs ("low(", file);
2362 output_addr_const (file, plus_constant (Pmode, XEXP (base, 1),
2363 offset));
2364 fputs ("),", file);
2365 fputs (reg_names[REGNO (XEXP (base, 0))], file);
2367 else
2368 fatal_insn ("bad address", addr);
2369 break;
2371 case LO_SUM :
2372 if (!REG_P (XEXP (addr, 0)))
2373 fatal_insn ("lo_sum not of register", addr);
2374 if (small_data_operand (XEXP (addr, 1), VOIDmode))
2375 fputs ("sda(", file);
2376 else
2377 fputs ("low(", file);
2378 output_addr_const (file, XEXP (addr, 1));
2379 fputs ("),", file);
2380 fputs (reg_names[REGNO (XEXP (addr, 0))], file);
2381 break;
2383 case PRE_INC : /* Assume SImode. */
2384 fprintf (file, "+%s", reg_names[REGNO (XEXP (addr, 0))]);
2385 break;
2387 case PRE_DEC : /* Assume SImode. */
2388 fprintf (file, "-%s", reg_names[REGNO (XEXP (addr, 0))]);
2389 break;
2391 case POST_INC : /* Assume SImode. */
2392 fprintf (file, "%s+", reg_names[REGNO (XEXP (addr, 0))]);
2393 break;
2395 default :
2396 output_addr_const (file, addr);
2397 break;
2401 static bool
2402 m32r_print_operand_punct_valid_p (unsigned char code)
2404 return m32r_punct_chars[code];
2407 /* Return true if the operands are the constants 0 and 1. */
2410 zero_and_one (rtx operand1, rtx operand2)
2412 return
2413 CONST_INT_P (operand1)
2414 && CONST_INT_P (operand2)
2415 && ( ((INTVAL (operand1) == 0) && (INTVAL (operand2) == 1))
2416 ||((INTVAL (operand1) == 1) && (INTVAL (operand2) == 0)));
2419 /* Generate the correct assembler code to handle the conditional loading of a
2420 value into a register. It is known that the operands satisfy the
2421 conditional_move_operand() function above. The destination is operand[0].
2422 The condition is operand [1]. The 'true' value is operand [2] and the
2423 'false' value is operand [3]. */
2425 char *
2426 emit_cond_move (rtx * operands, rtx insn ATTRIBUTE_UNUSED)
2428 static char buffer [100];
2429 const char * dest = reg_names [REGNO (operands [0])];
2431 buffer [0] = 0;
2433 /* Destination must be a register. */
2434 gcc_assert (REG_P (operands [0]));
2435 gcc_assert (conditional_move_operand (operands [2], SImode));
2436 gcc_assert (conditional_move_operand (operands [3], SImode));
2438 /* Check to see if the test is reversed. */
2439 if (GET_CODE (operands [1]) == NE)
2441 rtx tmp = operands [2];
2442 operands [2] = operands [3];
2443 operands [3] = tmp;
2446 sprintf (buffer, "mvfc %s, cbr", dest);
2448 /* If the true value was '0' then we need to invert the results of the move. */
2449 if (INTVAL (operands [2]) == 0)
2450 sprintf (buffer + strlen (buffer), "\n\txor3 %s, %s, #1",
2451 dest, dest);
2453 return buffer;
2456 /* Returns true if the registers contained in the two
2457 rtl expressions are different. */
2460 m32r_not_same_reg (rtx a, rtx b)
2462 int reg_a = -1;
2463 int reg_b = -2;
2465 while (GET_CODE (a) == SUBREG)
2466 a = SUBREG_REG (a);
2468 if (REG_P (a))
2469 reg_a = REGNO (a);
2471 while (GET_CODE (b) == SUBREG)
2472 b = SUBREG_REG (b);
2474 if (REG_P (b))
2475 reg_b = REGNO (b);
2477 return reg_a != reg_b;
2482 m32r_function_symbol (const char *name)
2484 int extra_flags = 0;
2485 enum m32r_model model;
2486 rtx sym = gen_rtx_SYMBOL_REF (Pmode, name);
2488 if (TARGET_MODEL_SMALL)
2489 model = M32R_MODEL_SMALL;
2490 else if (TARGET_MODEL_MEDIUM)
2491 model = M32R_MODEL_MEDIUM;
2492 else if (TARGET_MODEL_LARGE)
2493 model = M32R_MODEL_LARGE;
2494 else
2495 gcc_unreachable (); /* Shouldn't happen. */
2496 extra_flags |= model << SYMBOL_FLAG_MODEL_SHIFT;
2498 if (extra_flags)
2499 SYMBOL_REF_FLAGS (sym) |= extra_flags;
2501 return sym;
2504 /* Use a library function to move some bytes. */
2506 static void
2507 block_move_call (rtx dest_reg, rtx src_reg, rtx bytes_rtx)
2509 /* We want to pass the size as Pmode, which will normally be SImode
2510 but will be DImode if we are using 64-bit longs and pointers. */
2511 if (GET_MODE (bytes_rtx) != VOIDmode
2512 && GET_MODE (bytes_rtx) != Pmode)
2513 bytes_rtx = convert_to_mode (Pmode, bytes_rtx, 1);
2515 emit_library_call (m32r_function_symbol ("memcpy"), LCT_NORMAL,
2516 VOIDmode, dest_reg, Pmode, src_reg, Pmode,
2517 convert_to_mode (TYPE_MODE (sizetype), bytes_rtx,
2518 TYPE_UNSIGNED (sizetype)),
2519 TYPE_MODE (sizetype));
2522 /* Expand string/block move operations.
2524 operands[0] is the pointer to the destination.
2525 operands[1] is the pointer to the source.
2526 operands[2] is the number of bytes to move.
2527 operands[3] is the alignment.
2529 Returns 1 upon success, 0 otherwise. */
2532 m32r_expand_block_move (rtx operands[])
2534 rtx orig_dst = operands[0];
2535 rtx orig_src = operands[1];
2536 rtx bytes_rtx = operands[2];
2537 rtx align_rtx = operands[3];
2538 int constp = CONST_INT_P (bytes_rtx);
2539 HOST_WIDE_INT bytes = constp ? INTVAL (bytes_rtx) : 0;
2540 int align = INTVAL (align_rtx);
2541 int leftover;
2542 rtx src_reg;
2543 rtx dst_reg;
2545 if (constp && bytes <= 0)
2546 return 1;
2548 /* Move the address into scratch registers. */
2549 dst_reg = copy_addr_to_reg (XEXP (orig_dst, 0));
2550 src_reg = copy_addr_to_reg (XEXP (orig_src, 0));
2552 if (align > UNITS_PER_WORD)
2553 align = UNITS_PER_WORD;
2555 /* If we prefer size over speed, always use a function call.
2556 If we do not know the size, use a function call.
2557 If the blocks are not word aligned, use a function call. */
2558 if (optimize_size || ! constp || align != UNITS_PER_WORD)
2560 block_move_call (dst_reg, src_reg, bytes_rtx);
2561 return 0;
2564 leftover = bytes % MAX_MOVE_BYTES;
2565 bytes -= leftover;
2567 /* If necessary, generate a loop to handle the bulk of the copy. */
2568 if (bytes)
2570 rtx_code_label *label = NULL;
2571 rtx final_src = NULL_RTX;
2572 rtx at_a_time = GEN_INT (MAX_MOVE_BYTES);
2573 rtx rounded_total = GEN_INT (bytes);
2574 rtx new_dst_reg = gen_reg_rtx (SImode);
2575 rtx new_src_reg = gen_reg_rtx (SImode);
2577 /* If we are going to have to perform this loop more than
2578 once, then generate a label and compute the address the
2579 source register will contain upon completion of the final
2580 iteration. */
2581 if (bytes > MAX_MOVE_BYTES)
2583 final_src = gen_reg_rtx (Pmode);
2585 if (INT16_P(bytes))
2586 emit_insn (gen_addsi3 (final_src, src_reg, rounded_total));
2587 else
2589 emit_insn (gen_movsi (final_src, rounded_total));
2590 emit_insn (gen_addsi3 (final_src, final_src, src_reg));
2593 label = gen_label_rtx ();
2594 emit_label (label);
2597 /* It is known that output_block_move() will update src_reg to point
2598 to the word after the end of the source block, and dst_reg to point
2599 to the last word of the destination block, provided that the block
2600 is MAX_MOVE_BYTES long. */
2601 emit_insn (gen_movmemsi_internal (dst_reg, src_reg, at_a_time,
2602 new_dst_reg, new_src_reg));
2603 emit_move_insn (dst_reg, new_dst_reg);
2604 emit_move_insn (src_reg, new_src_reg);
2605 emit_insn (gen_addsi3 (dst_reg, dst_reg, GEN_INT (4)));
2607 if (bytes > MAX_MOVE_BYTES)
2609 rtx test = gen_rtx_NE (VOIDmode, src_reg, final_src);
2610 emit_jump_insn (gen_cbranchsi4 (test, src_reg, final_src, label));
2614 if (leftover)
2615 emit_insn (gen_movmemsi_internal (dst_reg, src_reg, GEN_INT (leftover),
2616 gen_reg_rtx (SImode),
2617 gen_reg_rtx (SImode)));
2618 return 1;
2622 /* Emit load/stores for a small constant word aligned block_move.
2624 operands[0] is the memory address of the destination.
2625 operands[1] is the memory address of the source.
2626 operands[2] is the number of bytes to move.
2627 operands[3] is a temp register.
2628 operands[4] is a temp register. */
2630 void
2631 m32r_output_block_move (rtx insn ATTRIBUTE_UNUSED, rtx operands[])
2633 HOST_WIDE_INT bytes = INTVAL (operands[2]);
2634 int first_time;
2635 int got_extra = 0;
2637 gcc_assert (bytes >= 1 && bytes <= MAX_MOVE_BYTES);
2639 /* We do not have a post-increment store available, so the first set of
2640 stores are done without any increment, then the remaining ones can use
2641 the pre-increment addressing mode.
2643 Note: expand_block_move() also relies upon this behavior when building
2644 loops to copy large blocks. */
2645 first_time = 1;
2647 while (bytes > 0)
2649 if (bytes >= 8)
2651 if (first_time)
2653 output_asm_insn ("ld\t%5, %p1", operands);
2654 output_asm_insn ("ld\t%6, %p1", operands);
2655 output_asm_insn ("st\t%5, @%0", operands);
2656 output_asm_insn ("st\t%6, %s0", operands);
2658 else
2660 output_asm_insn ("ld\t%5, %p1", operands);
2661 output_asm_insn ("ld\t%6, %p1", operands);
2662 output_asm_insn ("st\t%5, %s0", operands);
2663 output_asm_insn ("st\t%6, %s0", operands);
2666 bytes -= 8;
2668 else if (bytes >= 4)
2670 if (bytes > 4)
2671 got_extra = 1;
2673 output_asm_insn ("ld\t%5, %p1", operands);
2675 if (got_extra)
2676 output_asm_insn ("ld\t%6, %p1", operands);
2678 if (first_time)
2679 output_asm_insn ("st\t%5, @%0", operands);
2680 else
2681 output_asm_insn ("st\t%5, %s0", operands);
2683 bytes -= 4;
2685 else
2687 /* Get the entire next word, even though we do not want all of it.
2688 The saves us from doing several smaller loads, and we assume that
2689 we cannot cause a page fault when at least part of the word is in
2690 valid memory [since we don't get called if things aren't properly
2691 aligned]. */
2692 int dst_offset = first_time ? 0 : 4;
2693 /* The amount of increment we have to make to the
2694 destination pointer. */
2695 int dst_inc_amount = dst_offset + bytes - 4;
2696 /* The same for the source pointer. */
2697 int src_inc_amount = bytes;
2698 int last_shift;
2699 rtx my_operands[3];
2701 /* If got_extra is true then we have already loaded
2702 the next word as part of loading and storing the previous word. */
2703 if (! got_extra)
2704 output_asm_insn ("ld\t%6, @%1", operands);
2706 if (bytes >= 2)
2708 bytes -= 2;
2710 output_asm_insn ("sra3\t%5, %6, #16", operands);
2711 my_operands[0] = operands[5];
2712 my_operands[1] = GEN_INT (dst_offset);
2713 my_operands[2] = operands[0];
2714 output_asm_insn ("sth\t%0, @(%1,%2)", my_operands);
2716 /* If there is a byte left to store then increment the
2717 destination address and shift the contents of the source
2718 register down by 8 bits. We could not do the address
2719 increment in the store half word instruction, because it does
2720 not have an auto increment mode. */
2721 if (bytes > 0) /* assert (bytes == 1) */
2723 dst_offset += 2;
2724 last_shift = 8;
2727 else
2728 last_shift = 24;
2730 if (bytes > 0)
2732 my_operands[0] = operands[6];
2733 my_operands[1] = GEN_INT (last_shift);
2734 output_asm_insn ("srai\t%0, #%1", my_operands);
2735 my_operands[0] = operands[6];
2736 my_operands[1] = GEN_INT (dst_offset);
2737 my_operands[2] = operands[0];
2738 output_asm_insn ("stb\t%0, @(%1,%2)", my_operands);
2741 /* Update the destination pointer if needed. We have to do
2742 this so that the patterns matches what we output in this
2743 function. */
2744 if (dst_inc_amount
2745 && !find_reg_note (insn, REG_UNUSED, operands[0]))
2747 my_operands[0] = operands[0];
2748 my_operands[1] = GEN_INT (dst_inc_amount);
2749 output_asm_insn ("addi\t%0, #%1", my_operands);
2752 /* Update the source pointer if needed. We have to do this
2753 so that the patterns matches what we output in this
2754 function. */
2755 if (src_inc_amount
2756 && !find_reg_note (insn, REG_UNUSED, operands[1]))
2758 my_operands[0] = operands[1];
2759 my_operands[1] = GEN_INT (src_inc_amount);
2760 output_asm_insn ("addi\t%0, #%1", my_operands);
2763 bytes = 0;
2766 first_time = 0;
2770 /* Implement TARGET_HARD_REGNO_MODE_OK. */
2772 static bool
2773 m32r_hard_regno_mode_ok (unsigned int regno, machine_mode mode)
2775 return (m32r_hard_regno_modes[regno] & m32r_mode_class[mode]) != 0;
2778 /* Implement TARGET_MODES_TIEABLE_P. Tie QI/HI/SI modes together. */
2780 static bool
2781 m32r_modes_tieable_p (machine_mode mode1, machine_mode mode2)
2783 return (GET_MODE_CLASS (mode1) == MODE_INT
2784 && GET_MODE_CLASS (mode2) == MODE_INT
2785 && GET_MODE_SIZE (mode1) <= UNITS_PER_WORD
2786 && GET_MODE_SIZE (mode2) <= UNITS_PER_WORD);
2789 /* Return true if using NEW_REG in place of OLD_REG is ok. */
2792 m32r_hard_regno_rename_ok (unsigned int old_reg ATTRIBUTE_UNUSED,
2793 unsigned int new_reg)
2795 /* Interrupt routines can't clobber any register that isn't already used. */
2796 if (lookup_attribute ("interrupt", DECL_ATTRIBUTES (current_function_decl))
2797 && !df_regs_ever_live_p (new_reg))
2798 return 0;
2800 return 1;
2804 m32r_return_addr (int count)
2806 if (count != 0)
2807 return const0_rtx;
2809 return get_hard_reg_initial_val (Pmode, RETURN_ADDR_REGNUM);
2812 static void
2813 m32r_trampoline_init (rtx m_tramp, tree fndecl, rtx chain_value)
2815 emit_move_insn (adjust_address (m_tramp, SImode, 0),
2816 gen_int_mode (TARGET_LITTLE_ENDIAN ?
2817 0x017e8e17 : 0x178e7e01, SImode));
2818 emit_move_insn (adjust_address (m_tramp, SImode, 4),
2819 gen_int_mode (TARGET_LITTLE_ENDIAN ?
2820 0x0c00ae86 : 0x86ae000c, SImode));
2821 emit_move_insn (adjust_address (m_tramp, SImode, 8),
2822 gen_int_mode (TARGET_LITTLE_ENDIAN ?
2823 0xe627871e : 0x1e8727e6, SImode));
2824 emit_move_insn (adjust_address (m_tramp, SImode, 12),
2825 gen_int_mode (TARGET_LITTLE_ENDIAN ?
2826 0xc616c626 : 0x26c61fc6, SImode));
2827 emit_move_insn (adjust_address (m_tramp, SImode, 16),
2828 chain_value);
2829 emit_move_insn (adjust_address (m_tramp, SImode, 20),
2830 XEXP (DECL_RTL (fndecl), 0));
2832 if (m32r_cache_flush_trap >= 0)
2833 emit_insn (gen_flush_icache
2834 (validize_mem (adjust_address (m_tramp, SImode, 0)),
2835 gen_int_mode (m32r_cache_flush_trap, SImode)));
2836 else if (m32r_cache_flush_func && m32r_cache_flush_func[0])
2837 emit_library_call (m32r_function_symbol (m32r_cache_flush_func),
2838 LCT_NORMAL, VOIDmode, XEXP (m_tramp, 0), Pmode,
2839 gen_int_mode (TRAMPOLINE_SIZE, SImode), SImode,
2840 GEN_INT (3), SImode);
2843 /* True if X is a reg that can be used as a base reg. */
2845 static bool
2846 m32r_rtx_ok_for_base_p (const_rtx x, bool strict)
2848 if (! REG_P (x))
2849 return false;
2851 if (strict)
2853 if (GPR_P (REGNO (x)))
2854 return true;
2856 else
2858 if (GPR_P (REGNO (x))
2859 || REGNO (x) == ARG_POINTER_REGNUM
2860 || ! HARD_REGISTER_P (x))
2861 return true;
2864 return false;
2867 static inline bool
2868 m32r_rtx_ok_for_offset_p (const_rtx x)
2870 return (CONST_INT_P (x) && INT16_P (INTVAL (x)));
2873 static inline bool
2874 m32r_legitimate_offset_addres_p (machine_mode mode ATTRIBUTE_UNUSED,
2875 const_rtx x, bool strict)
2877 if (GET_CODE (x) == PLUS
2878 && m32r_rtx_ok_for_base_p (XEXP (x, 0), strict)
2879 && m32r_rtx_ok_for_offset_p (XEXP (x, 1)))
2880 return true;
2882 return false;
2885 /* For LO_SUM addresses, do not allow them if the MODE is > 1 word,
2886 since more than one instruction will be required. */
2888 static inline bool
2889 m32r_legitimate_lo_sum_addres_p (machine_mode mode, const_rtx x,
2890 bool strict)
2892 if (GET_CODE (x) == LO_SUM
2893 && (mode != BLKmode && GET_MODE_SIZE (mode) <= UNITS_PER_WORD)
2894 && m32r_rtx_ok_for_base_p (XEXP (x, 0), strict)
2895 && CONSTANT_P (XEXP (x, 1)))
2896 return true;
2898 return false;
2901 /* Is this a load and increment operation. */
2903 static inline bool
2904 m32r_load_postinc_p (machine_mode mode, const_rtx x, bool strict)
2906 if ((mode == SImode || mode == SFmode)
2907 && GET_CODE (x) == POST_INC
2908 && REG_P (XEXP (x, 0))
2909 && m32r_rtx_ok_for_base_p (XEXP (x, 0), strict))
2910 return true;
2912 return false;
2915 /* Is this an increment/decrement and store operation. */
2917 static inline bool
2918 m32r_store_preinc_predec_p (machine_mode mode, const_rtx x, bool strict)
2920 if ((mode == SImode || mode == SFmode)
2921 && (GET_CODE (x) == PRE_INC || GET_CODE (x) == PRE_DEC)
2922 && REG_P (XEXP (x, 0)) \
2923 && m32r_rtx_ok_for_base_p (XEXP (x, 0), strict))
2924 return true;
2926 return false;
2929 /* Implement TARGET_LEGITIMATE_ADDRESS_P. */
2931 static bool
2932 m32r_legitimate_address_p (machine_mode mode, rtx x, bool strict)
2934 if (m32r_rtx_ok_for_base_p (x, strict)
2935 || m32r_legitimate_offset_addres_p (mode, x, strict)
2936 || m32r_legitimate_lo_sum_addres_p (mode, x, strict)
2937 || m32r_load_postinc_p (mode, x, strict)
2938 || m32r_store_preinc_predec_p (mode, x, strict))
2939 return true;
2941 return false;
2944 static void
2945 m32r_conditional_register_usage (void)
2947 if (flag_pic)
2949 fixed_regs[PIC_OFFSET_TABLE_REGNUM] = 1;
2950 call_used_regs[PIC_OFFSET_TABLE_REGNUM] = 1;
2954 /* Implement TARGET_LEGITIMATE_CONSTANT_P
2956 We don't allow (plus symbol large-constant) as the relocations can't
2957 describe it. INTVAL > 32767 handles both 16-bit and 24-bit relocations.
2958 We allow all CONST_DOUBLE's as the md file patterns will force the
2959 constant to memory if they can't handle them. */
2961 static bool
2962 m32r_legitimate_constant_p (machine_mode mode ATTRIBUTE_UNUSED, rtx x)
2964 return !(GET_CODE (x) == CONST
2965 && GET_CODE (XEXP (x, 0)) == PLUS
2966 && (GET_CODE (XEXP (XEXP (x, 0), 0)) == SYMBOL_REF
2967 || GET_CODE (XEXP (XEXP (x, 0), 0)) == LABEL_REF)
2968 && CONST_INT_P (XEXP (XEXP (x, 0), 1))
2969 && UINTVAL (XEXP (XEXP (x, 0), 1)) > 32767);
2972 /* Implement TARGET_STARTING_FRAME_OFFSET. The frame pointer points at
2973 the same place as the stack pointer, except if alloca has been called. */
2975 static HOST_WIDE_INT
2976 m32r_starting_frame_offset (void)
2978 return M32R_STACK_ALIGN (crtl->outgoing_args_size);