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