1 1.1 mrg /* Output routines for CR16 processor. 2 1.1 mrg Copyright (C) 2012-2022 Free Software Foundation, Inc. 3 1.1 mrg Contributed by KPIT Cummins Infosystems Limited. 4 1.1 mrg 5 1.1 mrg This file is part of GCC. 6 1.1 mrg 7 1.1 mrg GCC is free software; you can redistribute it and/or modify it 8 1.1 mrg under the terms of the GNU General Public License as published 9 1.1 mrg by the Free Software Foundation; either version 3, or (at your 10 1.1 mrg option) any later version. 11 1.1 mrg 12 1.1 mrg GCC is distributed in the hope that it will be useful, but WITHOUT 13 1.1 mrg ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 14 1.1 mrg or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public 15 1.1 mrg License for more details. 16 1.1 mrg 17 1.1 mrg You should have received a copy of the GNU General Public License 18 1.1 mrg along with GCC; see the file COPYING3. If not see 19 1.1 mrg <http://www.gnu.org/licenses/>. */ 20 1.1 mrg 21 1.1 mrg #define IN_TARGET_CODE 1 22 1.1 mrg 23 1.1 mrg #include "config.h" 24 1.1 mrg #include "system.h" 25 1.1 mrg #include "coretypes.h" 26 1.1 mrg #include "backend.h" 27 1.1 mrg #include "target.h" 28 1.1 mrg #include "rtl.h" 29 1.1 mrg #include "tree.h" 30 1.1 mrg #include "stringpool.h" 31 1.1 mrg #include "attribs.h" 32 1.1 mrg #include "df.h" 33 1.1 mrg #include "memmodel.h" 34 1.1 mrg #include "tm_p.h" 35 1.1 mrg #include "regs.h" 36 1.1 mrg #include "emit-rtl.h" 37 1.1 mrg #include "diagnostic-core.h" 38 1.1 mrg #include "stor-layout.h" 39 1.1 mrg #include "calls.h" 40 1.1 mrg #include "conditions.h" 41 1.1 mrg #include "output.h" 42 1.1 mrg #include "expr.h" 43 1.1 mrg #include "builtins.h" 44 1.1 mrg 45 1.1 mrg /* This file should be included last. */ 46 1.1 mrg #include "target-def.h" 47 1.1 mrg 48 1.1 mrg /* Definitions. */ 49 1.1 mrg 50 1.1 mrg /* Maximum number of register used for passing parameters. */ 51 1.1 mrg #define MAX_REG_FOR_PASSING_ARGS 6 52 1.1 mrg 53 1.1 mrg /* Minimum number register used for passing parameters. */ 54 1.1 mrg #define MIN_REG_FOR_PASSING_ARGS 2 55 1.1 mrg 56 1.1 mrg /* The maximum count of words supported in the assembly of the architecture in 57 1.1 mrg a push/pop instruction. */ 58 1.1 mrg #define MAX_COUNT 8 59 1.1 mrg 60 1.1 mrg /* Predicate is true if the current function is a 'noreturn' function, 61 1.1 mrg i.e. it is qualified as volatile. */ 62 1.1 mrg #define FUNC_IS_NORETURN_P(decl) (TREE_THIS_VOLATILE (decl)) 63 1.1 mrg 64 1.1 mrg /* Predicate that holds when we need to save registers even for 'noreturn' 65 1.1 mrg functions, to accommodate for unwinding. */ 66 1.1 mrg #define MUST_SAVE_REGS_P() \ 67 1.1 mrg (flag_unwind_tables || (flag_exceptions && !UI_SJLJ)) 68 1.1 mrg 69 1.1 mrg /* Nonzero if the rtx X is a signed const int of n bits. */ 70 1.1 mrg #define RTX_SIGNED_INT_FITS_N_BITS(X, n) \ 71 1.1 mrg ((GET_CODE (X) == CONST_INT \ 72 1.1 mrg && SIGNED_INT_FITS_N_BITS (INTVAL (X), n)) ? 1 : 0) 73 1.1 mrg 74 1.1 mrg /* Nonzero if the rtx X is an unsigned const int of n bits. */ 75 1.1 mrg #define RTX_UNSIGNED_INT_FITS_N_BITS(X, n) \ 76 1.1 mrg ((GET_CODE (X) == CONST_INT \ 77 1.1 mrg && UNSIGNED_INT_FITS_N_BITS (INTVAL (X), n)) ? 1 : 0) 78 1.1 mrg 79 1.1 mrg /* Structure for stack computations. */ 80 1.1 mrg 81 1.1 mrg /* variable definitions in the struture 82 1.1 mrg args_size Number of bytes saved on the stack for local 83 1.1 mrg variables 84 1.1 mrg 85 1.1 mrg reg_size Number of bytes saved on the stack for 86 1.1 mrg non-scratch registers 87 1.1 mrg 88 1.1 mrg total_size The sum of 2 sizes: locals vars and padding byte 89 1.1 mrg for saving the registers. Used in expand_prologue() 90 1.1 mrg and expand_epilogue() 91 1.1 mrg 92 1.1 mrg last_reg_to_save Will hold the number of the last register the 93 1.1 mrg prologue saves, -1 if no register is saved 94 1.1 mrg 95 1.1 mrg save_regs[16] Each object in the array is a register number. 96 1.1 mrg Mark 1 for registers that need to be saved 97 1.1 mrg 98 1.1 mrg num_regs Number of registers saved 99 1.1 mrg 100 1.1 mrg initialized Non-zero if frame size already calculated, not 101 1.1 mrg used yet 102 1.1 mrg 103 1.1 mrg function_makes_calls Does the function make calls ? not used yet. */ 104 1.1 mrg 105 1.1 mrg struct cr16_frame_info 106 1.1 mrg { 107 1.1 mrg unsigned long var_size; 108 1.1 mrg unsigned long args_size; 109 1.1 mrg unsigned int reg_size; 110 1.1 mrg unsigned long total_size; 111 1.1 mrg long last_reg_to_save; 112 1.1 mrg long save_regs[FIRST_PSEUDO_REGISTER]; 113 1.1 mrg int num_regs; 114 1.1 mrg int initialized; 115 1.1 mrg int function_makes_calls; 116 1.1 mrg }; 117 1.1 mrg 118 1.1 mrg /* Current frame information calculated by cr16_compute_frame_size. */ 119 1.1 mrg static struct cr16_frame_info current_frame_info; 120 1.1 mrg 121 1.1 mrg /* Static Variables. */ 122 1.1 mrg 123 1.1 mrg /* Data model that was supplied by user via command line option 124 1.1 mrg This will be overridden in case of invalid combination 125 1.1 mrg of core and data model options are supplied. */ 126 1.1 mrg static enum data_model_type data_model = DM_DEFAULT; 127 1.1 mrg 128 1.1 mrg /* TARGETM Function Prototypes and forward declarations */ 129 1.1 mrg static void cr16_print_operand (FILE *, rtx, int); 130 1.1 mrg static void cr16_print_operand_address (FILE *, machine_mode, rtx); 131 1.1 mrg 132 1.1 mrg /* Stack layout and calling conventions. */ 133 1.1 mrg #undef TARGET_STRUCT_VALUE_RTX 134 1.1 mrg #define TARGET_STRUCT_VALUE_RTX cr16_struct_value_rtx 135 1.1 mrg #undef TARGET_RETURN_IN_MEMORY 136 1.1 mrg #define TARGET_RETURN_IN_MEMORY cr16_return_in_memory 137 1.1 mrg 138 1.1 mrg /* Target-specific uses of '__attribute__'. */ 139 1.1 mrg #undef TARGET_ATTRIBUTE_TABLE 140 1.1 mrg #define TARGET_ATTRIBUTE_TABLE cr16_attribute_table 141 1.1 mrg #undef TARGET_NARROW_VOLATILE_BITFIELD 142 1.1 mrg #define TARGET_NARROW_VOLATILE_BITFIELD hook_bool_void_false 143 1.1 mrg 144 1.1 mrg /* EH related. */ 145 1.1 mrg #undef TARGET_UNWIND_WORD_MODE 146 1.1 mrg #define TARGET_UNWIND_WORD_MODE cr16_unwind_word_mode 147 1.1 mrg 148 1.1 mrg /* Override Options. */ 149 1.1 mrg #undef TARGET_OPTION_OVERRIDE 150 1.1 mrg #define TARGET_OPTION_OVERRIDE cr16_override_options 151 1.1 mrg 152 1.1 mrg /* Conditional register usuage. */ 153 1.1 mrg #undef TARGET_CONDITIONAL_REGISTER_USAGE 154 1.1 mrg #define TARGET_CONDITIONAL_REGISTER_USAGE cr16_conditional_register_usage 155 1.1 mrg 156 1.1 mrg /* Controlling register spills. */ 157 1.1 mrg #undef TARGET_CLASS_LIKELY_SPILLED_P 158 1.1 mrg #define TARGET_CLASS_LIKELY_SPILLED_P cr16_class_likely_spilled_p 159 1.1 mrg 160 1.1 mrg /* Passing function arguments. */ 161 1.1 mrg #undef TARGET_PUSH_ARGUMENT 162 1.1 mrg #define TARGET_PUSH_ARGUMENT hook_bool_uint_true 163 1.1 mrg #undef TARGET_FUNCTION_ARG 164 1.1 mrg #define TARGET_FUNCTION_ARG cr16_function_arg 165 1.1 mrg #undef TARGET_FUNCTION_ARG_ADVANCE 166 1.1 mrg #define TARGET_FUNCTION_ARG_ADVANCE cr16_function_arg_advance 167 1.1 mrg #undef TARGET_RETURN_POPS_ARGS 168 1.1 mrg #define TARGET_RETURN_POPS_ARGS cr16_return_pops_args 169 1.1 mrg 170 1.1 mrg /* Initialize the GCC target structure. */ 171 1.1 mrg #undef TARGET_FRAME_POINTER_REQUIRED 172 1.1 mrg #define TARGET_FRAME_POINTER_REQUIRED cr16_frame_pointer_required 173 1.1 mrg #undef TARGET_CAN_ELIMINATE 174 1.1 mrg #define TARGET_CAN_ELIMINATE cr16_can_eliminate 175 1.1 mrg #undef TARGET_LEGITIMIZE_ADDRESS 176 1.1 mrg #define TARGET_LEGITIMIZE_ADDRESS cr16_legitimize_address 177 1.1 mrg #undef TARGET_LEGITIMATE_CONSTANT_P 178 1.1 mrg #define TARGET_LEGITIMATE_CONSTANT_P cr16_legitimate_constant_p 179 1.1 mrg #undef TARGET_LEGITIMATE_ADDRESS_P 180 1.1 mrg #define TARGET_LEGITIMATE_ADDRESS_P cr16_legitimate_address_p 181 1.1 mrg 182 1.1 mrg #undef TARGET_LRA_P 183 1.1 mrg #define TARGET_LRA_P hook_bool_void_false 184 1.1 mrg 185 1.1 mrg /* Returning function value. */ 186 1.1 mrg #undef TARGET_FUNCTION_VALUE 187 1.1 mrg #define TARGET_FUNCTION_VALUE cr16_function_value 188 1.1 mrg #undef TARGET_LIBCALL_VALUE 189 1.1 mrg #define TARGET_LIBCALL_VALUE cr16_libcall_value 190 1.1 mrg #undef TARGET_FUNCTION_VALUE_REGNO_P 191 1.1 mrg #define TARGET_FUNCTION_VALUE_REGNO_P cr16_function_value_regno_p 192 1.1 mrg 193 1.1 mrg /* printing the values. */ 194 1.1 mrg #undef TARGET_PRINT_OPERAND 195 1.1 mrg #define TARGET_PRINT_OPERAND cr16_print_operand 196 1.1 mrg #undef TARGET_PRINT_OPERAND_ADDRESS 197 1.1 mrg #define TARGET_PRINT_OPERAND_ADDRESS cr16_print_operand_address 198 1.1 mrg 199 1.1 mrg /* Relative costs of operations. */ 200 1.1 mrg #undef TARGET_ADDRESS_COST 201 1.1 mrg #define TARGET_ADDRESS_COST cr16_address_cost 202 1.1 mrg #undef TARGET_REGISTER_MOVE_COST 203 1.1 mrg #define TARGET_REGISTER_MOVE_COST cr16_register_move_cost 204 1.1 mrg #undef TARGET_MEMORY_MOVE_COST 205 1.1 mrg #define TARGET_MEMORY_MOVE_COST cr16_memory_move_cost 206 1.1 mrg 207 1.1 mrg #undef TARGET_CONSTANT_ALIGNMENT 208 1.1 mrg #define TARGET_CONSTANT_ALIGNMENT constant_alignment_word_strings 209 1.1 mrg 210 1.1 mrg /* Table of machine attributes. */ 211 1.1 mrg static const struct attribute_spec cr16_attribute_table[] = { 212 1.1 mrg /* ISRs have special prologue and epilogue requirements. */ 213 1.1 mrg /* { name, min_len, max_len, decl_req, type_req, fn_type_req, 214 1.1 mrg affects_type_identity, handler, exclude }. */ 215 1.1 mrg {"interrupt", 0, 0, false, true, true, false, NULL, NULL}, 216 1.1 mrg {NULL, 0, 0, false, false, false, false, NULL, NULL} 217 1.1 mrg }; 218 1.1 mrg 219 1.1 mrg /* TARGET_ASM_UNALIGNED_xx_OP generates .?byte directive 220 1.1 mrg .?byte directive along with @c is not understood by assembler. 221 1.1 mrg Therefore, make all TARGET_ASM_UNALIGNED_xx_OP same 222 1.1 mrg as TARGET_ASM_ALIGNED_xx_OP. */ 223 1.1 mrg #undef TARGET_ASM_UNALIGNED_HI_OP 224 1.1 mrg #define TARGET_ASM_UNALIGNED_HI_OP TARGET_ASM_ALIGNED_HI_OP 225 1.1 mrg #undef TARGET_ASM_UNALIGNED_SI_OP 226 1.1 mrg #define TARGET_ASM_UNALIGNED_SI_OP TARGET_ASM_ALIGNED_SI_OP 227 1.1 mrg #undef TARGET_ASM_UNALIGNED_DI_OP 228 1.1 mrg #define TARGET_ASM_UNALIGNED_DI_OP TARGET_ASM_ALIGNED_DI_OP 229 1.1 mrg 230 1.1 mrg #undef TARGET_HARD_REGNO_NREGS 231 1.1 mrg #define TARGET_HARD_REGNO_NREGS cr16_hard_regno_nregs 232 1.1 mrg #undef TARGET_HARD_REGNO_MODE_OK 233 1.1 mrg #define TARGET_HARD_REGNO_MODE_OK cr16_hard_regno_mode_ok 234 1.1 mrg #undef TARGET_MODES_TIEABLE_P 235 1.1 mrg #define TARGET_MODES_TIEABLE_P cr16_modes_tieable_p 236 1.1 mrg 237 1.1 mrg /* Target hook implementations. */ 238 1.1 mrg 239 1.1 mrg /* Implements hook TARGET_RETURN_IN_MEMORY. */ 240 1.1 mrg static bool 241 1.1 mrg cr16_return_in_memory (const_tree type, const_tree fntype ATTRIBUTE_UNUSED) 242 1.1 mrg { 243 1.1 mrg const HOST_WIDE_INT size = int_size_in_bytes (type); 244 1.1 mrg return ((size == -1) || (size > 8)); 245 1.1 mrg } 246 1.1 mrg 247 1.1 mrg /* Implement TARGET_CLASS_LIKELY_SPILLED_P. */ 248 1.1 mrg static bool 249 1.1 mrg cr16_class_likely_spilled_p (reg_class_t rclass) 250 1.1 mrg { 251 1.1 mrg if ((rclass) == SHORT_REGS || (rclass) == DOUBLE_BASE_REGS 252 1.1 mrg || (rclass) == LONG_REGS || (rclass) == GENERAL_REGS) 253 1.1 mrg return true; 254 1.1 mrg 255 1.1 mrg return false; 256 1.1 mrg } 257 1.1 mrg 258 1.1 mrg static poly_int64 259 1.1 mrg cr16_return_pops_args (tree, tree, poly_int64) 260 1.1 mrg { 261 1.1 mrg return 0; 262 1.1 mrg } 263 1.1 mrg 264 1.1 mrg /* Returns true if data model selected via command line option 265 1.1 mrg is same as function argument. */ 266 1.1 mrg bool 267 1.1 mrg cr16_is_data_model (enum data_model_type model) 268 1.1 mrg { 269 1.1 mrg return (model == data_model); 270 1.1 mrg } 271 1.1 mrg 272 1.1 mrg /* Parse relevant options and override. */ 273 1.1 mrg static void 274 1.1 mrg cr16_override_options (void) 275 1.1 mrg { 276 1.1 mrg /* Disable -fdelete-null-pointer-checks option for CR16 target. 277 1.1 mrg Programs which rely on NULL pointer dereferences _not_ halting the 278 1.1 mrg program may not work properly with this option. So disable this 279 1.1 mrg option. */ 280 1.1 mrg flag_delete_null_pointer_checks = 0; 281 1.1 mrg 282 1.1 mrg /* FIXME: To avoid spill_failure ICE during exception handling, 283 1.1 mrg * disable cse_fllow_jumps. The spill error occurs when compiler 284 1.1 mrg * can't find a suitable candidate in GENERAL_REGS class to reload 285 1.1 mrg * a 32bit register. 286 1.1 mrg * Need to find a better way of avoiding this situation. */ 287 1.1 mrg if (flag_exceptions) 288 1.1 mrg flag_cse_follow_jumps = 0; 289 1.1 mrg 290 1.1 mrg /* If -fpic option, data_model == DM_FAR. */ 291 1.1 mrg if (flag_pic == NEAR_PIC) 292 1.1 mrg { 293 1.1 mrg data_model = DM_FAR; 294 1.1 mrg } 295 1.1 mrg 296 1.1 mrg /* The only option we want to examine is data model option. */ 297 1.1 mrg if (cr16_data_model) 298 1.1 mrg { 299 1.1 mrg if (strcmp (cr16_data_model, "medium") == 0) 300 1.1 mrg data_model = DM_DEFAULT; 301 1.1 mrg else if (strcmp (cr16_data_model, "near") == 0) 302 1.1 mrg data_model = DM_NEAR; 303 1.1 mrg else if (strcmp (cr16_data_model, "far") == 0) 304 1.1 mrg { 305 1.1 mrg if (TARGET_CR16CP) 306 1.1 mrg data_model = DM_FAR; 307 1.1 mrg else 308 1.1 mrg error ("data-model=far not valid for cr16c architecture"); 309 1.1 mrg } 310 1.1 mrg else 311 1.1 mrg error ("invalid data model option %<-mdata-model=%s%>", 312 1.1 mrg cr16_data_model); 313 1.1 mrg } 314 1.1 mrg else 315 1.1 mrg data_model = DM_DEFAULT; 316 1.1 mrg } 317 1.1 mrg 318 1.1 mrg /* Implements the macro TARGET_CONDITIONAL_REGISTER_USAGE. */ 319 1.1 mrg static void 320 1.1 mrg cr16_conditional_register_usage (void) 321 1.1 mrg { 322 1.1 mrg if (flag_pic) 323 1.1 mrg { 324 1.1 mrg fixed_regs[12] = call_used_regs[12] = 1; 325 1.1 mrg } 326 1.1 mrg } 327 1.1 mrg 328 1.1 mrg /* Stack layout and calling conventions routines. */ 329 1.1 mrg 330 1.1 mrg /* Return nonzero if the current function being compiled is an interrupt 331 1.1 mrg function as specified by the "interrupt" attribute. */ 332 1.1 mrg int 333 1.1 mrg cr16_interrupt_function_p (void) 334 1.1 mrg { 335 1.1 mrg tree attributes; 336 1.1 mrg 337 1.1 mrg attributes = TYPE_ATTRIBUTES (TREE_TYPE (current_function_decl)); 338 1.1 mrg return (lookup_attribute ("interrupt", attributes) != NULL_TREE); 339 1.1 mrg } 340 1.1 mrg 341 1.1 mrg /* Compute values for the array current_frame_info.save_regs and the variable 342 1.1 mrg current_frame_info.reg_size. The index of current_frame_info.save_regs 343 1.1 mrg is numbers of register, each will get 1 if we need to save it in the 344 1.1 mrg current function, 0 if not. current_frame_info.reg_size is the total sum 345 1.1 mrg of the registers being saved. */ 346 1.1 mrg static void 347 1.1 mrg cr16_compute_save_regs (void) 348 1.1 mrg { 349 1.1 mrg unsigned int regno; 350 1.1 mrg 351 1.1 mrg /* Initialize here so in case the function is no-return it will be -1. */ 352 1.1 mrg current_frame_info.last_reg_to_save = -1; 353 1.1 mrg 354 1.1 mrg /* Initialize the number of bytes to be saved. */ 355 1.1 mrg current_frame_info.reg_size = 0; 356 1.1 mrg 357 1.1 mrg /* No need to save any registers if the function never returns. */ 358 1.1 mrg if (FUNC_IS_NORETURN_P (current_function_decl) && !MUST_SAVE_REGS_P ()) 359 1.1 mrg return; 360 1.1 mrg 361 1.1 mrg for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++) 362 1.1 mrg { 363 1.1 mrg if (fixed_regs[regno]) 364 1.1 mrg { 365 1.1 mrg current_frame_info.save_regs[regno] = 0; 366 1.1 mrg continue; 367 1.1 mrg } 368 1.1 mrg 369 1.1 mrg /* If this reg is used and not call-used (except RA), save it. */ 370 1.1 mrg if (cr16_interrupt_function_p ()) 371 1.1 mrg { 372 1.1 mrg if (!crtl->is_leaf && call_used_or_fixed_reg_p (regno)) 373 1.1 mrg /* This is a volatile reg in a non-leaf interrupt routine - save 374 1.1 mrg it for the sake of its sons. */ 375 1.1 mrg current_frame_info.save_regs[regno] = 1; 376 1.1 mrg else if (df_regs_ever_live_p (regno)) 377 1.1 mrg /* This reg is used - save it. */ 378 1.1 mrg current_frame_info.save_regs[regno] = 1; 379 1.1 mrg else 380 1.1 mrg /* This reg is not used, and is not a volatile - don't save. */ 381 1.1 mrg current_frame_info.save_regs[regno] = 0; 382 1.1 mrg } 383 1.1 mrg else 384 1.1 mrg { 385 1.1 mrg /* If this reg is used and not call-used (except RA), save it. */ 386 1.1 mrg if (df_regs_ever_live_p (regno) 387 1.1 mrg && (!call_used_or_fixed_reg_p (regno) 388 1.1 mrg || regno == RETURN_ADDRESS_REGNUM)) 389 1.1 mrg current_frame_info.save_regs[regno] = 1; 390 1.1 mrg else 391 1.1 mrg current_frame_info.save_regs[regno] = 0; 392 1.1 mrg } 393 1.1 mrg } 394 1.1 mrg 395 1.1 mrg /* Save registers so the exception handler can modify them. */ 396 1.1 mrg if (crtl->calls_eh_return) 397 1.1 mrg { 398 1.1 mrg unsigned int i; 399 1.1 mrg 400 1.1 mrg for (i = 0;; ++i) 401 1.1 mrg { 402 1.1 mrg regno = EH_RETURN_DATA_REGNO (i); 403 1.1 mrg if (INVALID_REGNUM == regno) 404 1.1 mrg break; 405 1.1 mrg current_frame_info.save_regs[regno] = 1; 406 1.1 mrg } 407 1.1 mrg } 408 1.1 mrg 409 1.1 mrg for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++) 410 1.1 mrg if (current_frame_info.save_regs[regno] == 1) 411 1.1 mrg { 412 1.1 mrg current_frame_info.last_reg_to_save = regno; 413 1.1 mrg if (regno >= CR16_FIRST_DWORD_REGISTER) 414 1.1 mrg current_frame_info.reg_size += CR16_UNITS_PER_DWORD; 415 1.1 mrg else 416 1.1 mrg current_frame_info.reg_size += UNITS_PER_WORD; 417 1.1 mrg } 418 1.1 mrg } 419 1.1 mrg 420 1.1 mrg /* Compute the size of the local area and the size to be adjusted by the 421 1.1 mrg prologue and epilogue. */ 422 1.1 mrg static void 423 1.1 mrg cr16_compute_frame (void) 424 1.1 mrg { 425 1.1 mrg /* For aligning the local variables. */ 426 1.1 mrg int stack_alignment = STACK_BOUNDARY / BITS_PER_UNIT; 427 1.1 mrg int padding_locals; 428 1.1 mrg 429 1.1 mrg /* Padding needed for each element of the frame. */ 430 1.1 mrg current_frame_info.var_size = get_frame_size (); 431 1.1 mrg 432 1.1 mrg /* Align to the stack alignment. */ 433 1.1 mrg padding_locals = current_frame_info.var_size % stack_alignment; 434 1.1 mrg if (padding_locals) 435 1.1 mrg padding_locals = stack_alignment - padding_locals; 436 1.1 mrg 437 1.1 mrg current_frame_info.var_size += padding_locals; 438 1.1 mrg current_frame_info.total_size 439 1.1 mrg = (current_frame_info.var_size 440 1.1 mrg + (ACCUMULATE_OUTGOING_ARGS 441 1.1 mrg ? (HOST_WIDE_INT) crtl->outgoing_args_size : 0)); 442 1.1 mrg } 443 1.1 mrg 444 1.1 mrg /* Implements the macro INITIAL_ELIMINATION_OFFSET, return the OFFSET. */ 445 1.1 mrg int 446 1.1 mrg cr16_initial_elimination_offset (int from, int to) 447 1.1 mrg { 448 1.1 mrg /* Compute this since we need to use current_frame_info.reg_size. */ 449 1.1 mrg cr16_compute_save_regs (); 450 1.1 mrg 451 1.1 mrg /* Compute this since we need to use current_frame_info.var_size. */ 452 1.1 mrg cr16_compute_frame (); 453 1.1 mrg 454 1.1 mrg if (((from) == FRAME_POINTER_REGNUM) && ((to) == STACK_POINTER_REGNUM)) 455 1.1 mrg return (ACCUMULATE_OUTGOING_ARGS 456 1.1 mrg ? (HOST_WIDE_INT) crtl->outgoing_args_size : 0); 457 1.1 mrg else if (((from) == ARG_POINTER_REGNUM) && ((to) == FRAME_POINTER_REGNUM)) 458 1.1 mrg return (current_frame_info.reg_size + current_frame_info.var_size); 459 1.1 mrg else if (((from) == ARG_POINTER_REGNUM) && ((to) == STACK_POINTER_REGNUM)) 460 1.1 mrg return (current_frame_info.reg_size + current_frame_info.var_size 461 1.1 mrg + (ACCUMULATE_OUTGOING_ARGS 462 1.1 mrg ? (HOST_WIDE_INT) crtl->outgoing_args_size : 0)); 463 1.1 mrg else 464 1.1 mrg gcc_unreachable (); 465 1.1 mrg } 466 1.1 mrg 467 1.1 mrg /* Register Usage. */ 468 1.1 mrg 469 1.1 mrg /* Return the class number of the smallest class containing reg number REGNO. 470 1.1 mrg This could be a conditional expression or could index an array. */ 471 1.1 mrg enum reg_class 472 1.1 mrg cr16_regno_reg_class (int regno) 473 1.1 mrg { 474 1.1 mrg if ((regno >= 0) && (regno < CR16_FIRST_DWORD_REGISTER)) 475 1.1 mrg return SHORT_REGS; 476 1.1 mrg 477 1.1 mrg if ((regno >= CR16_FIRST_DWORD_REGISTER) && (regno < FIRST_PSEUDO_REGISTER)) 478 1.1 mrg return LONG_REGS; 479 1.1 mrg 480 1.1 mrg return NO_REGS; 481 1.1 mrg } 482 1.1 mrg 483 1.1 mrg /* Implement TARGET_HARD_REGNO_NREGS. */ 484 1.1 mrg 485 1.1 mrg static unsigned int 486 1.1 mrg cr16_hard_regno_nregs (unsigned int regno, machine_mode mode) 487 1.1 mrg { 488 1.1 mrg if (regno >= CR16_FIRST_DWORD_REGISTER) 489 1.1 mrg return CEIL (GET_MODE_SIZE (mode), CR16_UNITS_PER_DWORD); 490 1.1 mrg return CEIL (GET_MODE_SIZE (mode), UNITS_PER_WORD); 491 1.1 mrg } 492 1.1 mrg 493 1.1 mrg /* Implement TARGET_HARD_REGNO_MODE_OK. On the CR16 architecture, all 494 1.1 mrg registers can hold all modes, except that double precision floats 495 1.1 mrg (and double ints) must fall on even-register boundaries. */ 496 1.1 mrg 497 1.1 mrg static bool 498 1.1 mrg cr16_hard_regno_mode_ok (unsigned int regno, machine_mode mode) 499 1.1 mrg { 500 1.1 mrg if ((GET_MODE_SIZE (mode) >= 4) && (regno == 11)) 501 1.1 mrg return false; 502 1.1 mrg 503 1.1 mrg if (mode == DImode || mode == DFmode) 504 1.1 mrg { 505 1.1 mrg if ((regno > 8) || (regno & 1)) 506 1.1 mrg return false; 507 1.1 mrg return true; 508 1.1 mrg } 509 1.1 mrg 510 1.1 mrg if ((TARGET_INT32) 511 1.1 mrg && ((regno >= 12) && (GET_MODE_SIZE (mode) < 4 ))) 512 1.1 mrg return false; 513 1.1 mrg 514 1.1 mrg /* CC can only hold CCmode values. */ 515 1.1 mrg if (GET_MODE_CLASS (mode) == MODE_CC) 516 1.1 mrg return false; 517 1.1 mrg return true; 518 1.1 mrg } 519 1.1 mrg 520 1.1 mrg /* Implement TARGET_MODES_TIEABLE_P. */ 521 1.1 mrg static bool 522 1.1 mrg cr16_modes_tieable_p (machine_mode mode1, machine_mode mode2) 523 1.1 mrg { 524 1.1 mrg return GET_MODE_CLASS (mode1) == GET_MODE_CLASS (mode2); 525 1.1 mrg } 526 1.1 mrg 527 1.1 mrg /* Returns register number for function return value.*/ 528 1.1 mrg static inline unsigned int 529 1.1 mrg cr16_ret_register (void) 530 1.1 mrg { 531 1.1 mrg return 0; 532 1.1 mrg } 533 1.1 mrg 534 1.1 mrg /* Implements hook TARGET_STRUCT_VALUE_RTX. */ 535 1.1 mrg static rtx 536 1.1 mrg cr16_struct_value_rtx (tree fntype ATTRIBUTE_UNUSED, 537 1.1 mrg int incoming ATTRIBUTE_UNUSED) 538 1.1 mrg { 539 1.1 mrg return gen_rtx_REG (Pmode, cr16_ret_register ()); 540 1.1 mrg } 541 1.1 mrg 542 1.1 mrg /* Returning function value. */ 543 1.1 mrg 544 1.1 mrg /* Worker function for TARGET_FUNCTION_VALUE_REGNO_P. */ 545 1.1 mrg static bool 546 1.1 mrg cr16_function_value_regno_p (const unsigned int regno) 547 1.1 mrg { 548 1.1 mrg return (regno == cr16_ret_register ()); 549 1.1 mrg } 550 1.1 mrg 551 1.1 mrg /* Create an RTX representing the place where a 552 1.1 mrg library function returns a value of mode MODE. */ 553 1.1 mrg static rtx 554 1.1 mrg cr16_libcall_value (machine_mode mode, 555 1.1 mrg const_rtx func ATTRIBUTE_UNUSED) 556 1.1 mrg { 557 1.1 mrg return gen_rtx_REG (mode, cr16_ret_register ()); 558 1.1 mrg } 559 1.1 mrg 560 1.1 mrg /* Create an RTX representing the place where a 561 1.1 mrg function returns a value of data type VALTYPE. */ 562 1.1 mrg static rtx 563 1.1 mrg cr16_function_value (const_tree type, 564 1.1 mrg const_tree fn_decl_or_type ATTRIBUTE_UNUSED, 565 1.1 mrg bool outgoing ATTRIBUTE_UNUSED) 566 1.1 mrg { 567 1.1 mrg return gen_rtx_REG (TYPE_MODE (type), cr16_ret_register ()); 568 1.1 mrg } 569 1.1 mrg 570 1.1 mrg /* Passing function arguments. */ 571 1.1 mrg 572 1.1 mrg /* If enough param regs are available for passing the param of type TYPE return 573 1.1 mrg the number of registers needed else 0. */ 574 1.1 mrg static int 575 1.1 mrg enough_regs_for_param (CUMULATIVE_ARGS * cum, const_tree type, 576 1.1 mrg machine_mode mode) 577 1.1 mrg { 578 1.1 mrg int type_size; 579 1.1 mrg int remaining_size; 580 1.1 mrg 581 1.1 mrg if (mode != BLKmode) 582 1.1 mrg type_size = GET_MODE_BITSIZE (mode); 583 1.1 mrg else 584 1.1 mrg type_size = int_size_in_bytes (type) * BITS_PER_UNIT; 585 1.1 mrg 586 1.1 mrg remaining_size = BITS_PER_WORD * (MAX_REG_FOR_PASSING_ARGS 587 1.1 mrg - (MIN_REG_FOR_PASSING_ARGS + cum->ints) + 588 1.1 mrg 1); 589 1.1 mrg 590 1.1 mrg /* Any variable which is too big to pass in two registers, will pass on 591 1.1 mrg stack. */ 592 1.1 mrg if ((remaining_size >= type_size) && (type_size <= 2 * BITS_PER_WORD)) 593 1.1 mrg return (type_size + BITS_PER_WORD - 1) / BITS_PER_WORD; 594 1.1 mrg 595 1.1 mrg return 0; 596 1.1 mrg } 597 1.1 mrg 598 1.1 mrg /* Implement TARGET_FUNCTION_ARG. */ 599 1.1 mrg static rtx 600 1.1 mrg cr16_function_arg (cumulative_args_t cum_v, const function_arg_info &arg) 601 1.1 mrg { 602 1.1 mrg CUMULATIVE_ARGS *cum = get_cumulative_args (cum_v); 603 1.1 mrg cum->last_parm_in_reg = 0; 604 1.1 mrg 605 1.1 mrg /* function_arg () is called with this type just after all the args have 606 1.1 mrg had their registers assigned. The rtx that function_arg returns from 607 1.1 mrg this type is supposed to pass to 'gen_call' but currently it is not 608 1.1 mrg implemented. */ 609 1.1 mrg if (arg.end_marker_p ()) 610 1.1 mrg return NULL_RTX; 611 1.1 mrg 612 1.1 mrg if (targetm.calls.must_pass_in_stack (arg) || (cum->ints < 0)) 613 1.1 mrg return NULL_RTX; 614 1.1 mrg 615 1.1 mrg if (arg.mode == BLKmode) 616 1.1 mrg { 617 1.1 mrg /* Enable structures that need padding bytes at the end to pass to a 618 1.1 mrg function in registers. */ 619 1.1 mrg if (enough_regs_for_param (cum, arg.type, arg.mode) != 0) 620 1.1 mrg { 621 1.1 mrg cum->last_parm_in_reg = 1; 622 1.1 mrg return gen_rtx_REG (arg.mode, MIN_REG_FOR_PASSING_ARGS + cum->ints); 623 1.1 mrg } 624 1.1 mrg } 625 1.1 mrg 626 1.1 mrg if ((MIN_REG_FOR_PASSING_ARGS + cum->ints) > MAX_REG_FOR_PASSING_ARGS) 627 1.1 mrg return NULL_RTX; 628 1.1 mrg else 629 1.1 mrg { 630 1.1 mrg if (enough_regs_for_param (cum, arg.type, arg.mode) != 0) 631 1.1 mrg { 632 1.1 mrg cum->last_parm_in_reg = 1; 633 1.1 mrg return gen_rtx_REG (arg.mode, MIN_REG_FOR_PASSING_ARGS + cum->ints); 634 1.1 mrg } 635 1.1 mrg } 636 1.1 mrg 637 1.1 mrg return NULL_RTX; 638 1.1 mrg } 639 1.1 mrg 640 1.1 mrg /* Implements the macro INIT_CUMULATIVE_ARGS defined in cr16.h. */ 641 1.1 mrg void 642 1.1 mrg cr16_init_cumulative_args (CUMULATIVE_ARGS * cum, tree fntype, 643 1.1 mrg rtx libfunc ATTRIBUTE_UNUSED) 644 1.1 mrg { 645 1.1 mrg tree param, next_param; 646 1.1 mrg 647 1.1 mrg cum->ints = 0; 648 1.1 mrg 649 1.1 mrg /* Determine if this function has variable arguments. This is indicated by 650 1.1 mrg the last argument being 'void_type_mode' if there are no variable 651 1.1 mrg arguments. Change here for a different vararg. */ 652 1.1 mrg for (param = (fntype) ? TYPE_ARG_TYPES (fntype) : 0; 653 1.1 mrg param != NULL_TREE; param = next_param) 654 1.1 mrg { 655 1.1 mrg next_param = TREE_CHAIN (param); 656 1.1 mrg if ((next_param == NULL_TREE) && (TREE_VALUE (param) != void_type_node)) 657 1.1 mrg { 658 1.1 mrg cum->ints = -1; 659 1.1 mrg return; 660 1.1 mrg } 661 1.1 mrg } 662 1.1 mrg } 663 1.1 mrg 664 1.1 mrg /* Implements the macro FUNCTION_ARG_ADVANCE defined in cr16.h. */ 665 1.1 mrg static void 666 1.1 mrg cr16_function_arg_advance (cumulative_args_t cum_v, 667 1.1 mrg const function_arg_info &arg) 668 1.1 mrg { 669 1.1 mrg CUMULATIVE_ARGS * cum = get_cumulative_args (cum_v); 670 1.1 mrg 671 1.1 mrg /* l holds the number of registers required. */ 672 1.1 mrg int l = GET_MODE_BITSIZE (arg.mode) / BITS_PER_WORD; 673 1.1 mrg 674 1.1 mrg /* If the parameter isn't passed on a register don't advance cum. */ 675 1.1 mrg if (!cum->last_parm_in_reg) 676 1.1 mrg return; 677 1.1 mrg 678 1.1 mrg if (targetm.calls.must_pass_in_stack (arg) || (cum->ints < 0)) 679 1.1 mrg return; 680 1.1 mrg 681 1.1 mrg if ((arg.mode == SImode) || (arg.mode == HImode) 682 1.1 mrg || (arg.mode == QImode) || (arg.mode == DImode)) 683 1.1 mrg { 684 1.1 mrg if (l <= 1) 685 1.1 mrg cum->ints += 1; 686 1.1 mrg else 687 1.1 mrg cum->ints += l; 688 1.1 mrg } 689 1.1 mrg else if ((arg.mode == SFmode) || (arg.mode == DFmode)) 690 1.1 mrg cum->ints += l; 691 1.1 mrg else if (arg.mode == BLKmode) 692 1.1 mrg { 693 1.1 mrg if ((l = enough_regs_for_param (cum, arg.type, arg.mode)) != 0) 694 1.1 mrg cum->ints += l; 695 1.1 mrg } 696 1.1 mrg return; 697 1.1 mrg } 698 1.1 mrg 699 1.1 mrg /* Implements the macro FUNCTION_ARG_REGNO_P defined in cr16.h. 700 1.1 mrg Return nonzero if N is a register used for passing parameters. */ 701 1.1 mrg int 702 1.1 mrg cr16_function_arg_regno_p (int n) 703 1.1 mrg { 704 1.1 mrg return ((n <= MAX_REG_FOR_PASSING_ARGS) && (n >= MIN_REG_FOR_PASSING_ARGS)); 705 1.1 mrg } 706 1.1 mrg 707 1.1 mrg /* Addressing modes. 708 1.1 mrg Following set of function implement the macro GO_IF_LEGITIMATE_ADDRESS 709 1.1 mrg defined in cr16.h. */ 710 1.1 mrg 711 1.1 mrg /* Helper function to check if is a valid base register that can 712 1.1 mrg hold address. */ 713 1.1 mrg static int 714 1.1 mrg cr16_addr_reg_p (rtx addr_reg) 715 1.1 mrg { 716 1.1 mrg rtx reg; 717 1.1 mrg 718 1.1 mrg if (REG_P (addr_reg)) 719 1.1 mrg reg = addr_reg; 720 1.1 mrg else if ((GET_CODE (addr_reg) == SUBREG) 721 1.1 mrg && REG_P (SUBREG_REG (addr_reg)) 722 1.1 mrg && (GET_MODE_SIZE (GET_MODE (SUBREG_REG (addr_reg))) 723 1.1 mrg <= UNITS_PER_WORD)) 724 1.1 mrg reg = SUBREG_REG (addr_reg); 725 1.1 mrg else 726 1.1 mrg return FALSE; 727 1.1 mrg 728 1.1 mrg if (GET_MODE (reg) != Pmode) 729 1.1 mrg return FALSE; 730 1.1 mrg 731 1.1 mrg return TRUE; 732 1.1 mrg } 733 1.1 mrg 734 1.1 mrg /* Helper functions: Created specifically for decomposing operand of CONST 735 1.1 mrg Recursively look into expression x for code or data symbol. 736 1.1 mrg The function expects the expression to contain combination of 737 1.1 mrg SYMBOL_REF, CONST_INT, (PLUS or MINUS) 738 1.1 mrg LABEL_REF, CONST_INT, (PLUS or MINUS) 739 1.1 mrg SYMBOL_REF 740 1.1 mrg LABEL_REF 741 1.1 mrg All other combinations will result in code = -1 and data = ILLEGAL_DM 742 1.1 mrg code data 743 1.1 mrg -1 ILLEGAL_DM The expression did not contain SYMBOL_REF or LABEL_REF 744 1.1 mrg 0 DM_FAR SYMBOL_REF was found and it was far data reference. 745 1.1 mrg 0 DM_DEFAULT SYMBOL_REF was found and it was medium data reference. 746 1.1 mrg 1 ILLEGAL_DM LABEL_REF was found. 747 1.1 mrg 2 ILLEGAL_DM SYMBOL_REF was found and it was function reference. */ 748 1.1 mrg void 749 1.1 mrg cr16_decompose_const (rtx x, int *code, enum data_model_type *data, 750 1.1 mrg bool treat_as_const) 751 1.1 mrg { 752 1.1 mrg *code = -1; 753 1.1 mrg *data = ILLEGAL_DM; 754 1.1 mrg switch (GET_CODE (x)) 755 1.1 mrg { 756 1.1 mrg case SYMBOL_REF: 757 1.1 mrg *code = SYMBOL_REF_FUNCTION_P (x) ? 2 : 0; 758 1.1 mrg /* 2 indicates func sym. */ 759 1.1 mrg if (*code == 0) 760 1.1 mrg { 761 1.1 mrg if (CR16_TARGET_DATA_NEAR) 762 1.1 mrg *data = DM_DEFAULT; 763 1.1 mrg else if (CR16_TARGET_DATA_MEDIUM) 764 1.1 mrg *data = DM_FAR; 765 1.1 mrg else if (CR16_TARGET_DATA_FAR) 766 1.1 mrg { 767 1.1 mrg if (treat_as_const) 768 1.1 mrg /* This will be used only for printing 769 1.1 mrg the qualifier. This call is (may be) 770 1.1 mrg made by cr16_print_operand_address. */ 771 1.1 mrg *data = DM_FAR; 772 1.1 mrg else 773 1.1 mrg /* This call is (may be) made by 774 1.1 mrg cr16_legitimate_address_p. */ 775 1.1 mrg *data = ILLEGAL_DM; 776 1.1 mrg } 777 1.1 mrg } 778 1.1 mrg return; 779 1.1 mrg 780 1.1 mrg case LABEL_REF: 781 1.1 mrg /* 1 - indicates non-function symbol. */ 782 1.1 mrg *code = 1; 783 1.1 mrg return; 784 1.1 mrg 785 1.1 mrg case PLUS: 786 1.1 mrg case MINUS: 787 1.1 mrg /* Look into the tree nodes. */ 788 1.1 mrg if (GET_CODE (XEXP (x, 0)) == CONST_INT) 789 1.1 mrg cr16_decompose_const (XEXP (x, 1), code, data, treat_as_const); 790 1.1 mrg else if (GET_CODE (XEXP (x, 1)) == CONST_INT) 791 1.1 mrg cr16_decompose_const (XEXP (x, 0), code, data, treat_as_const); 792 1.1 mrg return; 793 1.1 mrg default: 794 1.1 mrg return; 795 1.1 mrg } 796 1.1 mrg } 797 1.1 mrg 798 1.1 mrg /* Decompose Address 799 1.1 mrg This function decomposes the address returns the type of address 800 1.1 mrg as defined in enum cr16_addrtype. It also fills the parameter *out. 801 1.1 mrg The decomposed address can be used for two purposes. One to 802 1.1 mrg check if the address is valid and second to print the address 803 1.1 mrg operand. 804 1.1 mrg 805 1.1 mrg Following tables list valid address supported in CR16C/C+ architectures. 806 1.1 mrg Legend: 807 1.1 mrg aN : Absoulte address N-bit address 808 1.1 mrg R : One 16-bit register 809 1.1 mrg RP : Consecutive two 16-bit registers or one 32-bit register 810 1.1 mrg I : One 32-bit register 811 1.1 mrg dispN : Signed displacement of N-bits 812 1.1 mrg 813 1.1 mrg ----Code addresses---- 814 1.1 mrg Branch operands: 815 1.1 mrg disp9 : CR16_ABSOLUTE (disp) 816 1.1 mrg disp17 : CR16_ABSOLUTE (disp) 817 1.1 mrg disp25 : CR16_ABSOLUTE (disp) 818 1.1 mrg RP + disp25 : CR16_REGP_REL (base, disp) 819 1.1 mrg 820 1.1 mrg Jump operands: 821 1.1 mrg RP : CR16_REGP_REL (base, disp=0) 822 1.1 mrg a24 : CR16_ABSOLUTE (disp) 823 1.1 mrg 824 1.1 mrg ----Data addresses---- 825 1.1 mrg a20 : CR16_ABSOLUTE (disp) near (1M) 826 1.1 mrg a24 : CR16_ABSOLUTE (disp) medium (16M) 827 1.1 mrg R + d20 : CR16_REG_REL (base, disp) near (1M+64K) 828 1.1 mrg RP + d4 : CR16_REGP_REL (base, disp) far (4G) 829 1.1 mrg RP + d16 : CR16_REGP_REL (base, disp) far (4G) 830 1.1 mrg RP + d20 : CR16_REGP_REL (base, disp) far (4G) 831 1.1 mrg I : *** Valid but port does not support this 832 1.1 mrg I + a20 : *** Valid but port does not support this 833 1.1 mrg I + RP + d14: CR16_INDEX_REGP_REL (base, index, disp) far (4G) 834 1.1 mrg I + RP + d20: CR16_INDEX_REGP_REL (base, index, disp) far (4G) 835 1.1 mrg 836 1.1 mrg Decomposing Data model in case of absolute address. 837 1.1 mrg 838 1.1 mrg Target Option Address type Resultant Data ref type 839 1.1 mrg ---------------------- ------------ ----------------------- 840 1.1 mrg CR16_TARGET_MODEL_NEAR ABS20 DM_DEFAULT 841 1.1 mrg CR16_TARGET_MODEL_NEAR IMM20 DM_DEFAULT 842 1.1 mrg CR16_TARGET_MODEL_NEAR ABS24 Invalid 843 1.1 mrg CR16_TARGET_MODEL_NEAR IMM32 Invalid 844 1.1 mrg 845 1.1 mrg CR16_TARGET_MODEL_MEDIUM ABS20 DM_DEFAULT 846 1.1 mrg CR16_TARGET_MODEL_MEDIUM IMM20 DM_DEFAULT 847 1.1 mrg CR16_TARGET_MODEL_MEDIUM ABS24 DM_FAR 848 1.1 mrg CR16_TARGET_MODEL_MEDIUM IMM32 Invalid 849 1.1 mrg 850 1.1 mrg CR16_TARGET_MODEL_FAR ABS20 DM_DEFAULT 851 1.1 mrg CR16_TARGET_MODEL_FAR IMM20 DM_DEFAULT 852 1.1 mrg CR16_TARGET_MODEL_FAR ABS24 DM_FAR 853 1.1 mrg CR16_TARGET_MODEL_FAR IMM32 DM_FAR. */ 854 1.1 mrg enum cr16_addrtype 855 1.1 mrg cr16_decompose_address (rtx addr, struct cr16_address *out, 856 1.1 mrg bool debug_print, bool treat_as_const) 857 1.1 mrg { 858 1.1 mrg rtx base = NULL_RTX, disp = NULL_RTX, index = NULL_RTX; 859 1.1 mrg enum data_model_type data = ILLEGAL_DM; 860 1.1 mrg int code = -1; 861 1.1 mrg enum cr16_addrtype retval = CR16_INVALID; 862 1.1 mrg 863 1.1 mrg switch (GET_CODE (addr)) 864 1.1 mrg { 865 1.1 mrg case CONST_INT: 866 1.1 mrg /* Absolute address (known at compile time). */ 867 1.1 mrg code = 0; 868 1.1 mrg if (debug_print) 869 1.1 mrg fprintf (stderr, "\ncode:%d", code); 870 1.1 mrg disp = addr; 871 1.1 mrg 872 1.1 mrg if (debug_print) 873 1.1 mrg { 874 1.1 mrg fprintf (stderr, "\ndisp:"); 875 1.1 mrg debug_rtx (disp); 876 1.1 mrg } 877 1.1 mrg 878 1.1 mrg if (UNSIGNED_INT_FITS_N_BITS (INTVAL (disp), 20)) 879 1.1 mrg { 880 1.1 mrg data = DM_DEFAULT; 881 1.1 mrg if (debug_print) 882 1.1 mrg fprintf (stderr, "\ndata:%d", data); 883 1.1 mrg retval = CR16_ABSOLUTE; 884 1.1 mrg } 885 1.1 mrg else if (UNSIGNED_INT_FITS_N_BITS (INTVAL (disp), 24)) 886 1.1 mrg { 887 1.1 mrg if (!CR16_TARGET_DATA_NEAR) 888 1.1 mrg { 889 1.1 mrg data = DM_FAR; 890 1.1 mrg if (debug_print) 891 1.1 mrg fprintf (stderr, "\ndata:%d", data); 892 1.1 mrg retval = CR16_ABSOLUTE; 893 1.1 mrg } 894 1.1 mrg else 895 1.1 mrg return CR16_INVALID; /* ABS24 is not support in NEAR model. */ 896 1.1 mrg } 897 1.1 mrg else 898 1.1 mrg return CR16_INVALID; 899 1.1 mrg break; 900 1.1 mrg 901 1.1 mrg case CONST: 902 1.1 mrg /* A CONST is an expression of PLUS or MINUS with 903 1.1 mrg CONST_INT, SYMBOL_REF or LABEL_REF. This is the 904 1.1 mrg result of assembly-time arithmetic computation. */ 905 1.1 mrg retval = CR16_ABSOLUTE; 906 1.1 mrg disp = addr; 907 1.1 mrg /* Call the helper function to check the validity. */ 908 1.1 mrg cr16_decompose_const (XEXP (addr, 0), &code, &data, treat_as_const); 909 1.1 mrg if ((code == 0) && (data == ILLEGAL_DM)) 910 1.1 mrg /* CONST is not valid code or data address. */ 911 1.1 mrg return CR16_INVALID; 912 1.1 mrg if (debug_print) 913 1.1 mrg { 914 1.1 mrg fprintf (stderr, "\ndisp:"); 915 1.1 mrg debug_rtx (disp); 916 1.1 mrg fprintf (stderr, "\ncode:%d", code); 917 1.1 mrg fprintf (stderr, "\ndata:%d", data); 918 1.1 mrg } 919 1.1 mrg break; 920 1.1 mrg 921 1.1 mrg case LABEL_REF: 922 1.1 mrg retval = CR16_ABSOLUTE; 923 1.1 mrg disp = addr; 924 1.1 mrg /* 1 - indicates non-function symbol. */ 925 1.1 mrg code = 1; 926 1.1 mrg if (debug_print) 927 1.1 mrg { 928 1.1 mrg fprintf (stderr, "\ndisp:"); 929 1.1 mrg debug_rtx (disp); 930 1.1 mrg fprintf (stderr, "\ncode:%d", code); 931 1.1 mrg } 932 1.1 mrg break; 933 1.1 mrg 934 1.1 mrg case SYMBOL_REF: 935 1.1 mrg /* Absolute address (known at link time). */ 936 1.1 mrg retval = CR16_ABSOLUTE; 937 1.1 mrg disp = addr; 938 1.1 mrg /* This is a code address if symbol_ref is a function. */ 939 1.1 mrg /* 2 indicates func sym. */ 940 1.1 mrg code = SYMBOL_REF_FUNCTION_P (addr) ? 2 : 0; 941 1.1 mrg if (debug_print) 942 1.1 mrg { 943 1.1 mrg fprintf (stderr, "\ndisp:"); 944 1.1 mrg debug_rtx (disp); 945 1.1 mrg fprintf (stderr, "\ncode:%d", code); 946 1.1 mrg } 947 1.1 mrg /* If not function ref then check if valid data ref. */ 948 1.1 mrg if (code == 0) 949 1.1 mrg { 950 1.1 mrg if (CR16_TARGET_DATA_NEAR) 951 1.1 mrg data = DM_DEFAULT; 952 1.1 mrg else if (CR16_TARGET_DATA_MEDIUM) 953 1.1 mrg data = DM_FAR; 954 1.1 mrg else if (CR16_TARGET_DATA_FAR) 955 1.1 mrg { 956 1.1 mrg if (treat_as_const) 957 1.1 mrg /* This will be used only for printing the 958 1.1 mrg qualifier. This call is (may be) made 959 1.1 mrg by cr16_print_operand_address. */ 960 1.1 mrg data = DM_FAR; 961 1.1 mrg else 962 1.1 mrg /* This call is (may be) made by 963 1.1 mrg cr16_legitimate_address_p. */ 964 1.1 mrg return CR16_INVALID; 965 1.1 mrg } 966 1.1 mrg else 967 1.1 mrg data = DM_DEFAULT; 968 1.1 mrg } 969 1.1 mrg if (debug_print) 970 1.1 mrg fprintf (stderr, "\ndata:%d", data); 971 1.1 mrg break; 972 1.1 mrg 973 1.1 mrg case REG: 974 1.1 mrg case SUBREG: 975 1.1 mrg /* Register relative address. */ 976 1.1 mrg /* Assume REG fits in a single register. */ 977 1.1 mrg retval = CR16_REG_REL; 978 1.1 mrg if (GET_MODE_BITSIZE (GET_MODE (addr)) > BITS_PER_WORD) 979 1.1 mrg if (!LONG_REG_P (REGNO (addr))) 980 1.1 mrg /* REG will result in reg pair. */ 981 1.1 mrg retval = CR16_REGP_REL; 982 1.1 mrg base = addr; 983 1.1 mrg if (debug_print) 984 1.1 mrg { 985 1.1 mrg fprintf (stderr, "\nbase:"); 986 1.1 mrg debug_rtx (base); 987 1.1 mrg } 988 1.1 mrg break; 989 1.1 mrg 990 1.1 mrg case PLUS: 991 1.1 mrg switch (GET_CODE (XEXP (addr, 0))) 992 1.1 mrg { 993 1.1 mrg case REG: 994 1.1 mrg case SUBREG: 995 1.1 mrg /* REG + DISP20. */ 996 1.1 mrg /* All Reg relative addresses having a displacement needs 997 1.1 mrg to fit in 20-bits. */ 998 1.1 mrg disp = XEXP (addr, 1); 999 1.1 mrg if (debug_print) 1000 1.1 mrg { 1001 1.1 mrg fprintf (stderr, "\ndisp:"); 1002 1.1 mrg debug_rtx (disp); 1003 1.1 mrg } 1004 1.1 mrg switch (GET_CODE (XEXP (addr, 1))) 1005 1.1 mrg { 1006 1.1 mrg case CONST_INT: 1007 1.1 mrg /* Shall fit in 20-bits. */ 1008 1.1 mrg if (!UNSIGNED_INT_FITS_N_BITS (INTVAL (disp), 20)) 1009 1.1 mrg return CR16_INVALID; 1010 1.1 mrg code = 0; 1011 1.1 mrg if (debug_print) 1012 1.1 mrg fprintf (stderr, "\ncode:%d", code); 1013 1.1 mrg break; 1014 1.1 mrg 1015 1.1 mrg case UNSPEC: 1016 1.1 mrg switch (XINT (XEXP (addr, 1), 1)) 1017 1.1 mrg { 1018 1.1 mrg case UNSPEC_LIBRARY_OFFSET: 1019 1.1 mrg default: 1020 1.1 mrg gcc_unreachable (); 1021 1.1 mrg } 1022 1.1 mrg break; 1023 1.1 mrg 1024 1.1 mrg case LABEL_REF: 1025 1.1 mrg case SYMBOL_REF: 1026 1.1 mrg case CONST: 1027 1.1 mrg /* This is also a valid expression for address. 1028 1.1 mrg However, we cannot ascertain if the resultant 1029 1.1 mrg displacement will be valid 20-bit value. Therefore, 1030 1.1 mrg lets not allow such an expression for now. This will 1031 1.1 mrg be updated when we find a way to validate this 1032 1.1 mrg expression as legitimate address. 1033 1.1 mrg Till then fall through CR16_INVALID. */ 1034 1.1 mrg default: 1035 1.1 mrg return CR16_INVALID; 1036 1.1 mrg } 1037 1.1 mrg 1038 1.1 mrg /* Now check if REG can fit into single or pair regs. */ 1039 1.1 mrg retval = CR16_REG_REL; 1040 1.1 mrg base = XEXP (addr, 0); 1041 1.1 mrg if (debug_print) 1042 1.1 mrg { 1043 1.1 mrg fprintf (stderr, "\nbase:"); 1044 1.1 mrg debug_rtx (base); 1045 1.1 mrg } 1046 1.1 mrg if (GET_MODE_BITSIZE (GET_MODE ((XEXP (addr, 0)))) > BITS_PER_WORD) 1047 1.1 mrg { 1048 1.1 mrg if (!LONG_REG_P (REGNO ((XEXP (addr, 0))))) 1049 1.1 mrg /* REG will result in reg pair. */ 1050 1.1 mrg retval = CR16_REGP_REL; 1051 1.1 mrg } 1052 1.1 mrg break; 1053 1.1 mrg 1054 1.1 mrg case PLUS: 1055 1.1 mrg /* Valid expr: 1056 1.1 mrg plus 1057 1.1 mrg /\ 1058 1.1 mrg / \ 1059 1.1 mrg plus idx 1060 1.1 mrg /\ 1061 1.1 mrg / \ 1062 1.1 mrg reg const_int 1063 1.1 mrg 1064 1.1 mrg Check if the operand 1 is valid index register. */ 1065 1.1 mrg data = ILLEGAL_DM; 1066 1.1 mrg if (debug_print) 1067 1.1 mrg fprintf (stderr, "\ndata:%d", data); 1068 1.1 mrg switch (GET_CODE (XEXP (addr, 1))) 1069 1.1 mrg { 1070 1.1 mrg case REG: 1071 1.1 mrg case SUBREG: 1072 1.1 mrg if (!REG_OK_FOR_INDEX_P (XEXP (addr, 1))) 1073 1.1 mrg return CR16_INVALID; 1074 1.1 mrg /* OK. REG is a valid index register. */ 1075 1.1 mrg index = XEXP (addr, 1); 1076 1.1 mrg if (debug_print) 1077 1.1 mrg { 1078 1.1 mrg fprintf (stderr, "\nindex:"); 1079 1.1 mrg debug_rtx (index); 1080 1.1 mrg } 1081 1.1 mrg break; 1082 1.1 mrg default: 1083 1.1 mrg return CR16_INVALID; 1084 1.1 mrg } 1085 1.1 mrg /* Check if operand 0 of operand 0 is REGP. */ 1086 1.1 mrg switch (GET_CODE (XEXP (XEXP (addr, 0), 0))) 1087 1.1 mrg { 1088 1.1 mrg case REG: 1089 1.1 mrg case SUBREG: 1090 1.1 mrg /* Now check if REG is a REGP and not in LONG regs. */ 1091 1.1 mrg if (GET_MODE_BITSIZE (GET_MODE (XEXP (XEXP (addr, 0), 0))) 1092 1.1 mrg > BITS_PER_WORD) 1093 1.1 mrg { 1094 1.1 mrg if (REGNO (XEXP (XEXP (addr, 0), 0)) 1095 1.1 mrg >= CR16_FIRST_DWORD_REGISTER) 1096 1.1 mrg return CR16_INVALID; 1097 1.1 mrg base = XEXP (XEXP (addr, 0), 0); 1098 1.1 mrg if (debug_print) 1099 1.1 mrg { 1100 1.1 mrg fprintf (stderr, "\nbase:"); 1101 1.1 mrg debug_rtx (base); 1102 1.1 mrg } 1103 1.1 mrg } 1104 1.1 mrg else 1105 1.1 mrg return CR16_INVALID; 1106 1.1 mrg break; 1107 1.1 mrg default: 1108 1.1 mrg return CR16_INVALID; 1109 1.1 mrg } 1110 1.1 mrg /* Now check if the operand 1 of operand 0 is const_int. */ 1111 1.1 mrg if (GET_CODE (XEXP (XEXP (addr, 0), 1)) == CONST_INT) 1112 1.1 mrg { 1113 1.1 mrg disp = XEXP (XEXP (addr, 0), 1); 1114 1.1 mrg if (debug_print) 1115 1.1 mrg { 1116 1.1 mrg fprintf (stderr, "\ndisp:"); 1117 1.1 mrg debug_rtx (disp); 1118 1.1 mrg } 1119 1.1 mrg if (!UNSIGNED_INT_FITS_N_BITS (INTVAL (disp), 20)) 1120 1.1 mrg return CR16_INVALID; 1121 1.1 mrg } 1122 1.1 mrg else 1123 1.1 mrg return CR16_INVALID; 1124 1.1 mrg retval = CR16_INDEX_REGP_REL; 1125 1.1 mrg break; 1126 1.1 mrg default: 1127 1.1 mrg return CR16_INVALID; 1128 1.1 mrg } 1129 1.1 mrg break; 1130 1.1 mrg 1131 1.1 mrg default: 1132 1.1 mrg return CR16_INVALID; 1133 1.1 mrg } 1134 1.1 mrg 1135 1.1 mrg /* Check if the base and index registers are valid. */ 1136 1.1 mrg if (base && !(cr16_addr_reg_p (base))) 1137 1.1 mrg return CR16_INVALID; 1138 1.1 mrg if (base && !(CR16_REG_OK_FOR_BASE_P (base))) 1139 1.1 mrg return CR16_INVALID; 1140 1.1 mrg if (index && !(REG_OK_FOR_INDEX_P (index))) 1141 1.1 mrg return CR16_INVALID; 1142 1.1 mrg 1143 1.1 mrg /* Write the decomposition to out parameter. */ 1144 1.1 mrg out->base = base; 1145 1.1 mrg out->disp = disp; 1146 1.1 mrg out->index = index; 1147 1.1 mrg out->data = data; 1148 1.1 mrg out->code = code; 1149 1.1 mrg 1150 1.1 mrg return retval; 1151 1.1 mrg } 1152 1.1 mrg 1153 1.1 mrg /* Return non-zero value if 'x' is legitimate PIC operand 1154 1.1 mrg when generating PIC code. */ 1155 1.1 mrg int 1156 1.1 mrg legitimate_pic_operand_p (rtx x) 1157 1.1 mrg { 1158 1.1 mrg switch (GET_CODE (x)) 1159 1.1 mrg { 1160 1.1 mrg case SYMBOL_REF: 1161 1.1 mrg return 0; 1162 1.1 mrg case LABEL_REF: 1163 1.1 mrg return 0; 1164 1.1 mrg case CONST: 1165 1.1 mrg /* REVISIT: Use something like symbol_referenced_p. */ 1166 1.1 mrg if (GET_CODE (XEXP (x, 0)) == PLUS 1167 1.1 mrg && (GET_CODE (XEXP (XEXP (x, 0), 0)) == SYMBOL_REF 1168 1.1 mrg || GET_CODE (XEXP (XEXP (x, 0), 0)) == LABEL_REF) 1169 1.1 mrg && (GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT)) 1170 1.1 mrg return 0; 1171 1.1 mrg break; 1172 1.1 mrg case MEM: 1173 1.1 mrg return legitimate_pic_operand_p (XEXP (x, 0)); 1174 1.1 mrg default: 1175 1.1 mrg break; 1176 1.1 mrg } 1177 1.1 mrg return 1; 1178 1.1 mrg } 1179 1.1 mrg 1180 1.1 mrg /* Convert a non-PIC address in `orig' to a PIC address in `reg'. 1181 1.1 mrg 1182 1.1 mrg Input Output (-f pic) Output (-f PIC) 1183 1.1 mrg orig reg 1184 1.1 mrg 1185 1.1 mrg C1 symbol symbol@BRO (r12) symbol@GOT (r12) 1186 1.1 mrg 1187 1.1 mrg C2 symbol + offset symbol+offset@BRO (r12) symbol+offset@GOT (r12) 1188 1.1 mrg 1189 1.1 mrg NOTE: @BRO is added using unspec:BRO 1190 1.1 mrg NOTE: @GOT is added using unspec:GOT. */ 1191 1.1 mrg rtx 1192 1.1 mrg legitimize_pic_address (rtx orig, machine_mode mode ATTRIBUTE_UNUSED, 1193 1.1 mrg rtx reg) 1194 1.1 mrg { 1195 1.1 mrg /* First handle a simple SYMBOL_REF or LABEL_REF. */ 1196 1.1 mrg if (GET_CODE (orig) == SYMBOL_REF || GET_CODE (orig) == LABEL_REF) 1197 1.1 mrg { 1198 1.1 mrg if (reg == 0) 1199 1.1 mrg reg = gen_reg_rtx (Pmode); 1200 1.1 mrg 1201 1.1 mrg if (flag_pic == NEAR_PIC) 1202 1.1 mrg { 1203 1.1 mrg /* Unspec to handle -fpic option. */ 1204 1.1 mrg emit_insn (gen_unspec_bro_addr (reg, orig)); 1205 1.1 mrg emit_insn (gen_addsi3 (reg, reg, pic_offset_table_rtx)); 1206 1.1 mrg } 1207 1.1 mrg else if (flag_pic == FAR_PIC) 1208 1.1 mrg { 1209 1.1 mrg /* Unspec to handle -fPIC option. */ 1210 1.1 mrg emit_insn (gen_unspec_got_addr (reg, orig)); 1211 1.1 mrg } 1212 1.1 mrg return reg; 1213 1.1 mrg } 1214 1.1 mrg else if (GET_CODE (orig) == CONST) 1215 1.1 mrg { 1216 1.1 mrg /* To handle (symbol + offset). */ 1217 1.1 mrg rtx base, offset; 1218 1.1 mrg 1219 1.1 mrg if (GET_CODE (XEXP (orig, 0)) == PLUS 1220 1.1 mrg && XEXP (XEXP (orig, 0), 0) == pic_offset_table_rtx) 1221 1.1 mrg return orig; 1222 1.1 mrg 1223 1.1 mrg if (reg == 0) 1224 1.1 mrg { 1225 1.1 mrg gcc_assert (can_create_pseudo_p ()); 1226 1.1 mrg reg = gen_reg_rtx (Pmode); 1227 1.1 mrg } 1228 1.1 mrg 1229 1.1 mrg gcc_assert (GET_CODE (XEXP (orig, 0)) == PLUS); 1230 1.1 mrg 1231 1.1 mrg base = legitimize_pic_address (XEXP (XEXP (orig, 0), 0), Pmode, reg); 1232 1.1 mrg offset = legitimize_pic_address (XEXP (XEXP (orig, 0), 1), Pmode, 1233 1.1 mrg base == reg ? 0 : reg); 1234 1.1 mrg 1235 1.1 mrg /* REVISIT: Optimize for const-offsets. */ 1236 1.1 mrg emit_insn (gen_addsi3 (reg, base, offset)); 1237 1.1 mrg 1238 1.1 mrg return reg; 1239 1.1 mrg } 1240 1.1 mrg return orig; 1241 1.1 mrg } 1242 1.1 mrg 1243 1.1 mrg /* Implementation of TARGET_LEGITIMATE_ADDRESS_P. */ 1244 1.1 mrg static bool 1245 1.1 mrg cr16_legitimate_address_p (machine_mode mode ATTRIBUTE_UNUSED, 1246 1.1 mrg rtx addr, bool strict) 1247 1.1 mrg { 1248 1.1 mrg enum cr16_addrtype addrtype; 1249 1.1 mrg struct cr16_address address; 1250 1.1 mrg 1251 1.1 mrg if (TARGET_DEBUG_ADDR) 1252 1.1 mrg { 1253 1.1 mrg fprintf (stderr, 1254 1.1 mrg "\n======\nTARGET_LEGITIMATE_ADDRESS_P, mode = %s, strict = %d", 1255 1.1 mrg GET_MODE_NAME (mode), strict); 1256 1.1 mrg debug_rtx (addr); 1257 1.1 mrg } 1258 1.1 mrg addrtype = cr16_decompose_address (addr, &address, 1259 1.1 mrg (TARGET_DEBUG_ADDR ? 1 : 0), FALSE); 1260 1.1 mrg 1261 1.1 mrg if (TARGET_DEBUG_ADDR) 1262 1.1 mrg { 1263 1.1 mrg const char *typestr; 1264 1.1 mrg 1265 1.1 mrg switch (addrtype) 1266 1.1 mrg { 1267 1.1 mrg case CR16_INVALID: 1268 1.1 mrg typestr = "invalid"; 1269 1.1 mrg break; 1270 1.1 mrg case CR16_ABSOLUTE: 1271 1.1 mrg typestr = "absolute"; 1272 1.1 mrg break; 1273 1.1 mrg case CR16_REG_REL: 1274 1.1 mrg typestr = "register relative"; 1275 1.1 mrg break; 1276 1.1 mrg case CR16_REGP_REL: 1277 1.1 mrg typestr = "register pair relative"; 1278 1.1 mrg break; 1279 1.1 mrg case CR16_INDEX_REGP_REL: 1280 1.1 mrg typestr = "index + register pair relative"; 1281 1.1 mrg break; 1282 1.1 mrg default: 1283 1.1 mrg gcc_unreachable (); 1284 1.1 mrg } 1285 1.1 mrg fprintf (stderr, "\ncr16 address type: %s\n", typestr); 1286 1.1 mrg } 1287 1.1 mrg 1288 1.1 mrg if (addrtype == CR16_INVALID) 1289 1.1 mrg return FALSE; 1290 1.1 mrg 1291 1.1 mrg if (strict) 1292 1.1 mrg { 1293 1.1 mrg if (address.base 1294 1.1 mrg && !REGNO_MODE_OK_FOR_BASE_P (REGNO (address.base), mode)) 1295 1.1 mrg { 1296 1.1 mrg if (TARGET_DEBUG_ADDR) 1297 1.1 mrg fprintf (stderr, "base register not strict\n"); 1298 1.1 mrg return FALSE; 1299 1.1 mrg } 1300 1.1 mrg if (address.index && !REGNO_OK_FOR_INDEX_P (REGNO (address.index))) 1301 1.1 mrg { 1302 1.1 mrg if (TARGET_DEBUG_ADDR) 1303 1.1 mrg fprintf (stderr, "index register not strict\n"); 1304 1.1 mrg return FALSE; 1305 1.1 mrg } 1306 1.1 mrg } 1307 1.1 mrg 1308 1.1 mrg /* Return true if addressing mode is register relative. */ 1309 1.1 mrg if (flag_pic) 1310 1.1 mrg { 1311 1.1 mrg if (addrtype == CR16_REG_REL || addrtype == CR16_REGP_REL) 1312 1.1 mrg return TRUE; 1313 1.1 mrg else 1314 1.1 mrg return FALSE; 1315 1.1 mrg } 1316 1.1 mrg 1317 1.1 mrg return TRUE; 1318 1.1 mrg } 1319 1.1 mrg 1320 1.1 mrg /* Routines to compute costs. */ 1321 1.1 mrg 1322 1.1 mrg /* Return cost of the memory address x. */ 1323 1.1 mrg static int 1324 1.1 mrg cr16_address_cost (rtx addr, machine_mode mode ATTRIBUTE_UNUSED, 1325 1.1 mrg addr_space_t as ATTRIBUTE_UNUSED, 1326 1.1 mrg bool speed ATTRIBUTE_UNUSED) 1327 1.1 mrg { 1328 1.1 mrg enum cr16_addrtype addrtype; 1329 1.1 mrg struct cr16_address address; 1330 1.1 mrg int cost = 2; 1331 1.1 mrg 1332 1.1 mrg addrtype = cr16_decompose_address (addr, &address, 0, FALSE); 1333 1.1 mrg 1334 1.1 mrg gcc_assert (addrtype != CR16_INVALID); 1335 1.1 mrg 1336 1.1 mrg /* CR16_ABSOLUTE : 3 1337 1.1 mrg CR16_REG_REL (disp !=0) : 4 1338 1.1 mrg CR16_REG_REL (disp ==0) : 5 1339 1.1 mrg CR16_REGP_REL (disp !=0) : 6 1340 1.1 mrg CR16_REGP_REL (disp ==0) : 7 1341 1.1 mrg CR16_INDEX_REGP_REL (disp !=0) : 8 1342 1.1 mrg CR16_INDEX_REGP_REL (disp ==0) : 9. */ 1343 1.1 mrg switch (addrtype) 1344 1.1 mrg { 1345 1.1 mrg case CR16_ABSOLUTE: 1346 1.1 mrg cost += 1; 1347 1.1 mrg break; 1348 1.1 mrg case CR16_REGP_REL: 1349 1.1 mrg cost += 2; 1350 1.1 mrg /* Fall through. */ 1351 1.1 mrg case CR16_REG_REL: 1352 1.1 mrg cost += 3; 1353 1.1 mrg if (address.disp) 1354 1.1 mrg cost -= 1; 1355 1.1 mrg break; 1356 1.1 mrg case CR16_INDEX_REGP_REL: 1357 1.1 mrg cost += 7; 1358 1.1 mrg if (address.disp) 1359 1.1 mrg cost -= 1; 1360 1.1 mrg default: 1361 1.1 mrg break; 1362 1.1 mrg } 1363 1.1 mrg 1364 1.1 mrg if (TARGET_DEBUG_ADDR) 1365 1.1 mrg { 1366 1.1 mrg fprintf (stderr, "\n======\nmacro TARGET_ADDRESS_COST = %d\n", cost); 1367 1.1 mrg debug_rtx (addr); 1368 1.1 mrg } 1369 1.1 mrg 1370 1.1 mrg return cost; 1371 1.1 mrg } 1372 1.1 mrg 1373 1.1 mrg 1374 1.1 mrg /* Implement `TARGET_REGISTER_MOVE_COST'. */ 1375 1.1 mrg static int 1376 1.1 mrg cr16_register_move_cost (machine_mode mode ATTRIBUTE_UNUSED, 1377 1.1 mrg reg_class_t from ATTRIBUTE_UNUSED, reg_class_t to) 1378 1.1 mrg { 1379 1.1 mrg return (to != GENERAL_REGS ? 8 : 2); 1380 1.1 mrg } 1381 1.1 mrg 1382 1.1 mrg /* Implement `TARGET_MEMORY_MOVE_COST'. */ 1383 1.1 mrg 1384 1.1 mrg /* Return the cost of moving data of mode MODE between a register of class 1385 1.1 mrg CLASS and memory; IN is zero if the value is to be written to memory, 1386 1.1 mrg nonzero if it is to be read in. This cost is relative to those in 1387 1.1 mrg REGISTER_MOVE_COST. */ 1388 1.1 mrg static int 1389 1.1 mrg cr16_memory_move_cost (machine_mode mode, 1390 1.1 mrg reg_class_t rclass ATTRIBUTE_UNUSED, 1391 1.1 mrg bool in ATTRIBUTE_UNUSED) 1392 1.1 mrg { 1393 1.1 mrg /* One LD or ST takes twice the time of a simple reg-reg move. */ 1394 1.1 mrg if (reg_classes_intersect_p (rclass, GENERAL_REGS)) 1395 1.1 mrg return (4 * cr16_hard_regno_nregs (0, mode)); 1396 1.1 mrg else 1397 1.1 mrg return (100); 1398 1.1 mrg } 1399 1.1 mrg 1400 1.1 mrg /* Instruction output. */ 1401 1.1 mrg 1402 1.1 mrg /* Check if a const_double is ok for cr16 store-immediate instructions. */ 1403 1.1 mrg int 1404 1.1 mrg cr16_const_double_ok (rtx op) 1405 1.1 mrg { 1406 1.1 mrg if (GET_MODE (op) == SFmode) 1407 1.1 mrg { 1408 1.1 mrg long l; 1409 1.1 mrg REAL_VALUE_TO_TARGET_SINGLE (*CONST_DOUBLE_REAL_VALUE (op), l); 1410 1.1 mrg return UNSIGNED_INT_FITS_N_BITS (l, 4) ? 1 : 0; 1411 1.1 mrg } 1412 1.1 mrg 1413 1.1 mrg return ((UNSIGNED_INT_FITS_N_BITS (CONST_DOUBLE_LOW (op), 4)) && 1414 1.1 mrg (UNSIGNED_INT_FITS_N_BITS (CONST_DOUBLE_HIGH (op), 4))) ? 1 : 0; 1415 1.1 mrg } 1416 1.1 mrg 1417 1.1 mrg /* Returns bit position of first 0 or 1 bit. 1418 1.1 mrg It is safe to assume val as 16-bit wide. */ 1419 1.1 mrg int 1420 1.1 mrg cr16_operand_bit_pos (int val, int bitval) 1421 1.1 mrg { 1422 1.1 mrg int i; 1423 1.1 mrg if (bitval == 0) 1424 1.1 mrg val = ~val; 1425 1.1 mrg 1426 1.1 mrg for (i = 0; i < 16; i++) 1427 1.1 mrg if (val & (1 << i)) 1428 1.1 mrg break; 1429 1.1 mrg return i; 1430 1.1 mrg } 1431 1.1 mrg 1432 1.1 mrg /* Implements the macro PRINT_OPERAND defined in cr16.h. */ 1433 1.1 mrg static void 1434 1.1 mrg cr16_print_operand (FILE * file, rtx x, int code) 1435 1.1 mrg { 1436 1.1 mrg int ptr_dereference = 0; 1437 1.1 mrg 1438 1.1 mrg switch (code) 1439 1.1 mrg { 1440 1.1 mrg case 'd': 1441 1.1 mrg { 1442 1.1 mrg const char *cr16_cmp_str; 1443 1.1 mrg switch (GET_CODE (x)) 1444 1.1 mrg { 1445 1.1 mrg /* MD: compare (reg, reg or imm) but CR16: cmp (reg or imm, reg) 1446 1.1 mrg -> swap all non symmetric ops. */ 1447 1.1 mrg case EQ: 1448 1.1 mrg cr16_cmp_str = "eq"; 1449 1.1 mrg break; 1450 1.1 mrg case NE: 1451 1.1 mrg cr16_cmp_str = "ne"; 1452 1.1 mrg break; 1453 1.1 mrg case GT: 1454 1.1 mrg cr16_cmp_str = "lt"; 1455 1.1 mrg break; 1456 1.1 mrg case GTU: 1457 1.1 mrg cr16_cmp_str = "lo"; 1458 1.1 mrg break; 1459 1.1 mrg case LT: 1460 1.1 mrg cr16_cmp_str = "gt"; 1461 1.1 mrg break; 1462 1.1 mrg case LTU: 1463 1.1 mrg cr16_cmp_str = "hi"; 1464 1.1 mrg break; 1465 1.1 mrg case GE: 1466 1.1 mrg cr16_cmp_str = "le"; 1467 1.1 mrg break; 1468 1.1 mrg case GEU: 1469 1.1 mrg cr16_cmp_str = "ls"; 1470 1.1 mrg break; 1471 1.1 mrg case LE: 1472 1.1 mrg cr16_cmp_str = "ge"; 1473 1.1 mrg break; 1474 1.1 mrg case LEU: 1475 1.1 mrg cr16_cmp_str = "hs"; 1476 1.1 mrg break; 1477 1.1 mrg default: 1478 1.1 mrg gcc_unreachable (); 1479 1.1 mrg } 1480 1.1 mrg fprintf (file, "%s", cr16_cmp_str); 1481 1.1 mrg return; 1482 1.1 mrg } 1483 1.1 mrg case '$': 1484 1.1 mrg putc ('$', file); 1485 1.1 mrg return; 1486 1.1 mrg 1487 1.1 mrg case 'p': 1488 1.1 mrg if (GET_CODE (x) == REG) 1489 1.1 mrg { 1490 1.1 mrg /* For Push instructions, we should not print register pairs. */ 1491 1.1 mrg fprintf (file, "%s", reg_names[REGNO (x)]); 1492 1.1 mrg return; 1493 1.1 mrg } 1494 1.1 mrg break; 1495 1.1 mrg 1496 1.1 mrg case 'b': 1497 1.1 mrg /* Print the immediate address for bal 1498 1.1 mrg 'b' is used instead of 'a' to avoid compiler calling 1499 1.1 mrg the GO_IF_LEGITIMATE_ADDRESS which cannot 1500 1.1 mrg perform checks on const_int code addresses as it 1501 1.1 mrg assumes all const_int are data addresses. */ 1502 1.1 mrg fprintf (file, "0x%lx", INTVAL (x)); 1503 1.1 mrg return; 1504 1.1 mrg 1505 1.1 mrg case 'r': 1506 1.1 mrg /* Print bit position of first 0. */ 1507 1.1 mrg fprintf (file, "%d", cr16_operand_bit_pos (INTVAL (x), 0)); 1508 1.1 mrg return; 1509 1.1 mrg 1510 1.1 mrg case 's': 1511 1.1 mrg /* Print bit position of first 1. */ 1512 1.1 mrg fprintf (file, "%d", cr16_operand_bit_pos (INTVAL (x), 1)); 1513 1.1 mrg return; 1514 1.1 mrg case 'g': 1515 1.1 mrg /* 'g' is used for implicit mem: dereference. */ 1516 1.1 mrg ptr_dereference = 1; 1517 1.1 mrg /* FALLTHRU */ 1518 1.1 mrg case 'f': 1519 1.1 mrg case 0: 1520 1.1 mrg /* default. */ 1521 1.1 mrg switch (GET_CODE (x)) 1522 1.1 mrg { 1523 1.1 mrg case REG: 1524 1.1 mrg if (GET_MODE_BITSIZE (GET_MODE (x)) > BITS_PER_WORD) 1525 1.1 mrg { 1526 1.1 mrg if (LONG_REG_P (REGNO (x))) 1527 1.1 mrg fprintf (file, "(%s)", reg_names[REGNO (x)]); 1528 1.1 mrg else 1529 1.1 mrg fprintf (file, "(%s,%s)", reg_names[REGNO (x) + 1], 1530 1.1 mrg reg_names[REGNO (x)]); 1531 1.1 mrg } 1532 1.1 mrg else 1533 1.1 mrg fprintf (file, "%s", reg_names[REGNO (x)]); 1534 1.1 mrg return; 1535 1.1 mrg 1536 1.1 mrg case MEM: 1537 1.1 mrg output_address (GET_MODE (x), XEXP (x, 0)); 1538 1.1 mrg return; 1539 1.1 mrg 1540 1.1 mrg case CONST_DOUBLE: 1541 1.1 mrg { 1542 1.1 mrg long l; 1543 1.1 mrg 1544 1.1 mrg REAL_VALUE_TO_TARGET_SINGLE (*CONST_DOUBLE_REAL_VALUE (x), l); 1545 1.1 mrg 1546 1.1 mrg fprintf (file, "$0x%lx", l); 1547 1.1 mrg return; 1548 1.1 mrg } 1549 1.1 mrg case CONST_INT: 1550 1.1 mrg { 1551 1.1 mrg fprintf (file, "$%ld", INTVAL (x)); 1552 1.1 mrg return; 1553 1.1 mrg } 1554 1.1 mrg case UNSPEC: 1555 1.1 mrg switch (XINT (x, 1)) 1556 1.1 mrg { 1557 1.1 mrg default: 1558 1.1 mrg gcc_unreachable (); 1559 1.1 mrg } 1560 1.1 mrg break; 1561 1.1 mrg 1562 1.1 mrg default: 1563 1.1 mrg if (!ptr_dereference) 1564 1.1 mrg { 1565 1.1 mrg putc ('$', file); 1566 1.1 mrg } 1567 1.1 mrg cr16_print_operand_address (file, VOIDmode, x); 1568 1.1 mrg return; 1569 1.1 mrg } 1570 1.1 mrg gcc_unreachable (); 1571 1.1 mrg default: 1572 1.1 mrg output_operand_lossage ("invalid %%xn code"); 1573 1.1 mrg } 1574 1.1 mrg 1575 1.1 mrg gcc_unreachable (); 1576 1.1 mrg } 1577 1.1 mrg 1578 1.1 mrg /* Implements the macro PRINT_OPERAND_ADDRESS defined in cr16.h. */ 1579 1.1 mrg 1580 1.1 mrg static void 1581 1.1 mrg cr16_print_operand_address (FILE * file, machine_mode /*mode*/, rtx addr) 1582 1.1 mrg { 1583 1.1 mrg enum cr16_addrtype addrtype; 1584 1.1 mrg struct cr16_address address; 1585 1.1 mrg 1586 1.1 mrg /* Decompose the address. Also ask it to treat address as constant. */ 1587 1.1 mrg addrtype = cr16_decompose_address (addr, &address, 0, TRUE); 1588 1.1 mrg 1589 1.1 mrg if (address.disp && GET_CODE (address.disp) == UNSPEC) 1590 1.1 mrg { 1591 1.1 mrg debug_rtx (addr); 1592 1.1 mrg } 1593 1.1 mrg 1594 1.1 mrg switch (addrtype) 1595 1.1 mrg { 1596 1.1 mrg case CR16_REG_REL: 1597 1.1 mrg if (address.disp) 1598 1.1 mrg { 1599 1.1 mrg if (GET_CODE (address.disp) == UNSPEC) 1600 1.1 mrg cr16_print_operand (file, address.disp, 0); 1601 1.1 mrg else 1602 1.1 mrg output_addr_const (file, address.disp); 1603 1.1 mrg } 1604 1.1 mrg else 1605 1.1 mrg fprintf (file, "0"); 1606 1.1 mrg fprintf (file, "(%s)", reg_names[REGNO (address.base)]); 1607 1.1 mrg break; 1608 1.1 mrg 1609 1.1 mrg case CR16_ABSOLUTE: 1610 1.1 mrg if (address.disp) 1611 1.1 mrg output_addr_const (file, address.disp); 1612 1.1 mrg else 1613 1.1 mrg fprintf (file, "0"); 1614 1.1 mrg break; 1615 1.1 mrg 1616 1.1 mrg case CR16_INDEX_REGP_REL: 1617 1.1 mrg fprintf (file, "[%s]", reg_names[REGNO (address.index)]); 1618 1.1 mrg /* Fall through. */ 1619 1.1 mrg case CR16_REGP_REL: 1620 1.1 mrg if (address.disp) 1621 1.1 mrg { 1622 1.1 mrg if (GET_CODE (address.disp) == UNSPEC) 1623 1.1 mrg cr16_print_operand (file, address.disp, 0); 1624 1.1 mrg else 1625 1.1 mrg output_addr_const (file, address.disp); 1626 1.1 mrg } 1627 1.1 mrg else 1628 1.1 mrg fprintf (file, "0"); 1629 1.1 mrg fprintf (file, "(%s,%s)", reg_names[REGNO (address.base) + 1], 1630 1.1 mrg reg_names[REGNO (address.base)]); 1631 1.1 mrg break; 1632 1.1 mrg default: 1633 1.1 mrg debug_rtx (addr); 1634 1.1 mrg gcc_unreachable (); 1635 1.1 mrg } 1636 1.1 mrg /* Add qualifiers to the address expression that was just printed. */ 1637 1.1 mrg if (flag_pic < NEAR_PIC && address.code == 0) 1638 1.1 mrg { 1639 1.1 mrg if (address.data == DM_FAR) 1640 1.1 mrg /* Addr contains SYMBOL_REF & far data ptr. */ 1641 1.1 mrg fprintf (file, "@l"); 1642 1.1 mrg else if (address.data == DM_DEFAULT) 1643 1.1 mrg /* Addr contains SYMBOL_REF & medium data ptr. */ 1644 1.1 mrg fprintf (file, "@m"); 1645 1.1 mrg /* Addr contains SYMBOL_REF & medium data ptr. */ 1646 1.1 mrg else if (address.data == DM_NEAR) 1647 1.1 mrg /* Addr contains SYMBOL_REF & near data ptr. */ 1648 1.1 mrg fprintf (file, "@s"); 1649 1.1 mrg } 1650 1.1 mrg else if (flag_pic == NEAR_PIC 1651 1.1 mrg && (address.code == 0) && (address.data == DM_FAR 1652 1.1 mrg || address.data == DM_DEFAULT 1653 1.1 mrg || address.data == DM_NEAR)) 1654 1.1 mrg { 1655 1.1 mrg fprintf (file, "@l"); 1656 1.1 mrg } 1657 1.1 mrg else if (flag_pic == NEAR_PIC && address.code == 2) 1658 1.1 mrg { 1659 1.1 mrg fprintf (file, "pic"); 1660 1.1 mrg } 1661 1.1 mrg else if (flag_pic == NEAR_PIC && address.code == 1) 1662 1.1 mrg { 1663 1.1 mrg fprintf (file, "@cpic"); 1664 1.1 mrg } 1665 1.1 mrg 1666 1.1 mrg else if (flag_pic == FAR_PIC && address.code == 2) 1667 1.1 mrg { 1668 1.1 mrg /* REVISIT: cr16 register indirect jump expects a 1-bit right shifted 1669 1.1 mrg address ! GOTc tells assembler this symbol is a text-address 1670 1.1 mrg This needs to be fixed in such a way that this offset is done 1671 1.1 mrg only in the case where an address is being used for indirect jump 1672 1.1 mrg or call. Determining the potential usage of loadd is of course not 1673 1.1 mrg possible always. Eventually, this has to be fixed in the 1674 1.1 mrg processor. */ 1675 1.1 mrg fprintf (file, "GOT (%s)", reg_names[PIC_OFFSET_TABLE_REGNUM]); 1676 1.1 mrg } 1677 1.1 mrg else if (flag_pic == FAR_PIC && address.code == 1) 1678 1.1 mrg { 1679 1.1 mrg fprintf (file, "@cGOT (%s)", reg_names[PIC_OFFSET_TABLE_REGNUM]); 1680 1.1 mrg } 1681 1.1 mrg 1682 1.1 mrg else if (flag_pic == FAR_PIC && 1683 1.1 mrg (address.data == DM_FAR || address.data == DM_DEFAULT 1684 1.1 mrg || address.data == DM_NEAR)) 1685 1.1 mrg { 1686 1.1 mrg fprintf (file, "@GOT (%s)", reg_names[PIC_OFFSET_TABLE_REGNUM]); 1687 1.1 mrg } 1688 1.1 mrg } 1689 1.1 mrg 1690 1.1 mrg /* Machine description helper functions. */ 1691 1.1 mrg 1692 1.1 mrg /* Called from cr16.md. The return value depends on the parameter push_or_pop: 1693 1.1 mrg When push_or_pop is zero -> string for push instructions of prologue. 1694 1.1 mrg When push_or_pop is nonzero -> string for pop/popret/retx in epilogue. 1695 1.1 mrg Relies on the assumptions: 1696 1.1 mrg 1. RA is the last register to be saved. 1697 1.1 mrg 2. The maximal value of the counter is MAX_COUNT. */ 1698 1.1 mrg char * 1699 1.1 mrg cr16_prepare_push_pop_string (int push_or_pop) 1700 1.1 mrg { 1701 1.1 mrg /* j is the number of registers being saved, takes care that there won't be 1702 1.1 mrg more than 8 in one push/pop instruction. */ 1703 1.1 mrg 1704 1.1 mrg /* For the register mask string. */ 1705 1.1 mrg static char one_inst_str[50]; 1706 1.1 mrg 1707 1.1 mrg /* i is the index of current_frame_info.save_regs[], going from 0 until 1708 1.1 mrg current_frame_info.last_reg_to_save. */ 1709 1.1 mrg int i, start_reg; 1710 1.1 mrg int word_cnt; 1711 1.1 mrg int print_ra; 1712 1.1 mrg char *return_str; 1713 1.1 mrg 1714 1.1 mrg /* For reversing on the push instructions if there are more than one. */ 1715 1.1 mrg char *temp_str; 1716 1.1 mrg 1717 1.1 mrg return_str = (char *) xmalloc (160); 1718 1.1 mrg temp_str = (char *) xmalloc (160); 1719 1.1 mrg 1720 1.1 mrg /* Initialize. */ 1721 1.1 mrg memset (return_str, 0, 3); 1722 1.1 mrg 1723 1.1 mrg i = 0; 1724 1.1 mrg while (i <= current_frame_info.last_reg_to_save) 1725 1.1 mrg { 1726 1.1 mrg /* Prepare mask for one instruction. */ 1727 1.1 mrg one_inst_str[0] = 0; 1728 1.1 mrg 1729 1.1 mrg /* To count number of words in one instruction. */ 1730 1.1 mrg word_cnt = 0; 1731 1.1 mrg start_reg = i; 1732 1.1 mrg print_ra = 0; 1733 1.1 mrg while ((word_cnt < MAX_COUNT) 1734 1.1 mrg && (i <= current_frame_info.last_reg_to_save)) 1735 1.1 mrg { 1736 1.1 mrg /* For each non consecutive save register, 1737 1.1 mrg a new instruction shall be generated. */ 1738 1.1 mrg if (!current_frame_info.save_regs[i]) 1739 1.1 mrg { 1740 1.1 mrg /* Move to next reg and break. */ 1741 1.1 mrg ++i; 1742 1.1 mrg break; 1743 1.1 mrg } 1744 1.1 mrg 1745 1.1 mrg if (i == RETURN_ADDRESS_REGNUM) 1746 1.1 mrg print_ra = 1; 1747 1.1 mrg else 1748 1.1 mrg { 1749 1.1 mrg /* Check especially if adding 2 does not cross the MAX_COUNT. */ 1750 1.1 mrg if ((word_cnt + ((i < CR16_FIRST_DWORD_REGISTER) ? 1 : 2)) 1751 1.1 mrg >= MAX_COUNT) 1752 1.1 mrg break; 1753 1.1 mrg /* Increase word count by 2 for long registers except RA. */ 1754 1.1 mrg word_cnt += ((i < CR16_FIRST_DWORD_REGISTER) ? 1 : 2); 1755 1.1 mrg } 1756 1.1 mrg ++i; 1757 1.1 mrg } 1758 1.1 mrg 1759 1.1 mrg /* No need to generate any instruction as 1760 1.1 mrg no register or RA needs to be saved. */ 1761 1.1 mrg if ((word_cnt == 0) && (print_ra == 0)) 1762 1.1 mrg continue; 1763 1.1 mrg 1764 1.1 mrg /* Now prepare the instruction operands. */ 1765 1.1 mrg if (word_cnt > 0) 1766 1.1 mrg { 1767 1.1 mrg sprintf (one_inst_str, "$%d, %s", word_cnt, reg_names[start_reg]); 1768 1.1 mrg if (print_ra) 1769 1.1 mrg strcat (one_inst_str, ", ra"); 1770 1.1 mrg } 1771 1.1 mrg else 1772 1.1 mrg strcat (one_inst_str, "ra"); 1773 1.1 mrg 1774 1.1 mrg if (push_or_pop == 1) 1775 1.1 mrg { 1776 1.1 mrg /* Pop instruction. */ 1777 1.1 mrg if (print_ra && !cr16_interrupt_function_p () 1778 1.1 mrg && !crtl->calls_eh_return) 1779 1.1 mrg /* Print popret if RA is saved and its not a interrupt 1780 1.1 mrg function. */ 1781 1.1 mrg strcpy (temp_str, "\n\tpopret\t"); 1782 1.1 mrg else 1783 1.1 mrg strcpy (temp_str, "\n\tpop\t"); 1784 1.1 mrg 1785 1.1 mrg strcat (temp_str, one_inst_str); 1786 1.1 mrg 1787 1.1 mrg /* Add the pop instruction list. */ 1788 1.1 mrg strcat (return_str, temp_str); 1789 1.1 mrg } 1790 1.1 mrg else 1791 1.1 mrg { 1792 1.1 mrg /* Push instruction. */ 1793 1.1 mrg strcpy (temp_str, "\n\tpush\t"); 1794 1.1 mrg strcat (temp_str, one_inst_str); 1795 1.1 mrg 1796 1.1 mrg /* We need to reverse the order of the instructions if there 1797 1.1 mrg are more than one. (since the pop will not be reversed in 1798 1.1 mrg the epilogue. */ 1799 1.1 mrg strcat (temp_str, return_str); 1800 1.1 mrg strcpy (return_str, temp_str); 1801 1.1 mrg } 1802 1.1 mrg } 1803 1.1 mrg 1804 1.1 mrg if (push_or_pop == 1) 1805 1.1 mrg { 1806 1.1 mrg /* POP. */ 1807 1.1 mrg if (cr16_interrupt_function_p ()) 1808 1.1 mrg strcat (return_str, "\n\tretx\n"); 1809 1.1 mrg else if (crtl->calls_eh_return) 1810 1.1 mrg { 1811 1.1 mrg /* Add stack adjustment before returning to exception handler 1812 1.1 mrg NOTE: EH_RETURN_STACKADJ_RTX must refer to (r5, r4). */ 1813 1.1 mrg strcat (return_str, "\n\taddd\t (r5, r4), (sp)\t\n"); 1814 1.1 mrg strcat (return_str, "\n\tjump\t (ra)\n"); 1815 1.1 mrg 1816 1.1 mrg /* But before anything else, undo the adjustment addition done in 1817 1.1 mrg cr16_expand_epilogue (). */ 1818 1.1 mrg strcpy (temp_str, "\n\tsubd\t (r5, r4), (sp)\t\n"); 1819 1.1 mrg strcat (temp_str, return_str); 1820 1.1 mrg strcpy (return_str, temp_str); 1821 1.1 mrg } 1822 1.1 mrg else if (!FUNC_IS_NORETURN_P (current_function_decl) 1823 1.1 mrg && !(current_frame_info.save_regs[RETURN_ADDRESS_REGNUM])) 1824 1.1 mrg strcat (return_str, "\n\tjump\t (ra)\n"); 1825 1.1 mrg } 1826 1.1 mrg 1827 1.1 mrg /* Skip the newline and the tab in the start of return_str. */ 1828 1.1 mrg return_str += 2; 1829 1.1 mrg return return_str; 1830 1.1 mrg } 1831 1.1 mrg 1832 1.1 mrg 1833 1.1 mrg /* Generate DWARF2 annotation for multi-push instruction. */ 1834 1.1 mrg static void 1835 1.1 mrg cr16_create_dwarf_for_multi_push (rtx insn) 1836 1.1 mrg { 1837 1.1 mrg rtx dwarf, reg, tmp; 1838 1.1 mrg int i, j, from, to, word_cnt, dwarf_par_index, inc; 1839 1.1 mrg machine_mode mode; 1840 1.1 mrg int num_regs = 0, offset = 0, split_here = 0, total_push_bytes = 0; 1841 1.1 mrg 1842 1.1 mrg for (i = 0; i <= current_frame_info.last_reg_to_save; ++i) 1843 1.1 mrg { 1844 1.1 mrg if (current_frame_info.save_regs[i]) 1845 1.1 mrg { 1846 1.1 mrg ++num_regs; 1847 1.1 mrg if (i < CR16_FIRST_DWORD_REGISTER) 1848 1.1 mrg total_push_bytes += 2; 1849 1.1 mrg else 1850 1.1 mrg total_push_bytes += 4; 1851 1.1 mrg } 1852 1.1 mrg } 1853 1.1 mrg 1854 1.1 mrg if (!num_regs) 1855 1.1 mrg return; 1856 1.1 mrg 1857 1.1 mrg dwarf = gen_rtx_SEQUENCE (VOIDmode, rtvec_alloc (num_regs + 1)); 1858 1.1 mrg dwarf_par_index = num_regs; 1859 1.1 mrg 1860 1.1 mrg from = current_frame_info.last_reg_to_save + 1; 1861 1.1 mrg to = current_frame_info.last_reg_to_save; 1862 1.1 mrg word_cnt = 0; 1863 1.1 mrg 1864 1.1 mrg for (i = current_frame_info.last_reg_to_save; i >= 0;) 1865 1.1 mrg { 1866 1.1 mrg if (!current_frame_info.save_regs[i] || i == 0 || split_here) 1867 1.1 mrg { 1868 1.1 mrg /* This block of regs is pushed in one instruction. */ 1869 1.1 mrg if (i == 0 && current_frame_info.save_regs[i]) 1870 1.1 mrg from = 0; 1871 1.1 mrg 1872 1.1 mrg for (j = to; j >= from; --j) 1873 1.1 mrg { 1874 1.1 mrg if (j < CR16_FIRST_DWORD_REGISTER) 1875 1.1 mrg { 1876 1.1 mrg mode = HImode; 1877 1.1 mrg inc = 1; 1878 1.1 mrg } 1879 1.1 mrg else 1880 1.1 mrg { 1881 1.1 mrg mode = SImode; 1882 1.1 mrg inc = 2; 1883 1.1 mrg } 1884 1.1 mrg reg = gen_rtx_REG (mode, j); 1885 1.1 mrg offset += 2 * inc; 1886 1.1 mrg tmp = gen_rtx_SET (gen_frame_mem (mode, 1887 1.1 mrg plus_constant 1888 1.1 mrg (Pmode, stack_pointer_rtx, 1889 1.1 mrg total_push_bytes - offset)), 1890 1.1 mrg reg); 1891 1.1 mrg RTX_FRAME_RELATED_P (tmp) = 1; 1892 1.1 mrg XVECEXP (dwarf, 0, dwarf_par_index--) = tmp; 1893 1.1 mrg } 1894 1.1 mrg from = i; 1895 1.1 mrg to = --i; 1896 1.1 mrg split_here = 0; 1897 1.1 mrg word_cnt = 0; 1898 1.1 mrg continue; 1899 1.1 mrg } 1900 1.1 mrg 1901 1.1 mrg if (i != RETURN_ADDRESS_REGNUM) 1902 1.1 mrg { 1903 1.1 mrg inc = (i < CR16_FIRST_DWORD_REGISTER) ? 1 : 2; 1904 1.1 mrg if (word_cnt + inc >= MAX_COUNT || FRAME_POINTER_REGNUM == i) 1905 1.1 mrg { 1906 1.1 mrg split_here = 1; 1907 1.1 mrg from = i; 1908 1.1 mrg continue; 1909 1.1 mrg } 1910 1.1 mrg word_cnt += inc; 1911 1.1 mrg } 1912 1.1 mrg 1913 1.1 mrg from = i--; 1914 1.1 mrg } 1915 1.1 mrg 1916 1.1 mrg tmp = gen_rtx_SET (stack_pointer_rtx, 1917 1.1 mrg gen_rtx_PLUS (SImode, stack_pointer_rtx, 1918 1.1 mrg GEN_INT (-offset))); 1919 1.1 mrg RTX_FRAME_RELATED_P (tmp) = 1; 1920 1.1 mrg XVECEXP (dwarf, 0, 0) = tmp; 1921 1.1 mrg 1922 1.1 mrg add_reg_note (insn, REG_FRAME_RELATED_EXPR, dwarf); 1923 1.1 mrg } 1924 1.1 mrg 1925 1.1 mrg /* 1926 1.1 mrg CompactRISC CR16 Architecture stack layout: 1927 1.1 mrg 1928 1.1 mrg 0 +--------------------- 1929 1.1 mrg | 1930 1.1 mrg . 1931 1.1 mrg . 1932 1.1 mrg | 1933 1.1 mrg +==================== Sp (x) = Ap (x+1) 1934 1.1 mrg A | Args for functions 1935 1.1 mrg | | called by X and Dynamically 1936 1.1 mrg | | Dynamic allocations allocated and 1937 1.1 mrg | | (alloca, variable deallocated 1938 1.1 mrg Stack | length arrays). 1939 1.1 mrg grows +-------------------- Fp (x) 1940 1.1 mrg down| | Local variables of X 1941 1.1 mrg ward| +-------------------- 1942 1.1 mrg | | Regs saved for X-1 1943 1.1 mrg | +==================== Sp (x-1) = Ap (x) 1944 1.1 mrg | Args for func X 1945 1.1 mrg | pushed by X-1 1946 1.1 mrg +-------------------- Fp (x-1) 1947 1.1 mrg | 1948 1.1 mrg | 1949 1.1 mrg V 1950 1.1 mrg */ 1951 1.1 mrg void 1952 1.1 mrg cr16_expand_prologue (void) 1953 1.1 mrg { 1954 1.1 mrg rtx insn; 1955 1.1 mrg 1956 1.1 mrg cr16_compute_frame (); 1957 1.1 mrg cr16_compute_save_regs (); 1958 1.1 mrg 1959 1.1 mrg /* If there is no need in push and adjustment to sp, return. */ 1960 1.1 mrg if ((current_frame_info.total_size + current_frame_info.reg_size) == 0) 1961 1.1 mrg return; 1962 1.1 mrg 1963 1.1 mrg if (current_frame_info.last_reg_to_save != -1) 1964 1.1 mrg { 1965 1.1 mrg /* If there are registers to push. */ 1966 1.1 mrg insn = emit_insn (gen_push_for_prologue 1967 1.1 mrg (GEN_INT (current_frame_info.reg_size))); 1968 1.1 mrg cr16_create_dwarf_for_multi_push (insn); 1969 1.1 mrg RTX_FRAME_RELATED_P (insn) = 1; 1970 1.1 mrg } 1971 1.1 mrg 1972 1.1 mrg 1973 1.1 mrg if (current_frame_info.total_size > 0) 1974 1.1 mrg { 1975 1.1 mrg insn = emit_insn (gen_addsi3 (stack_pointer_rtx, stack_pointer_rtx, 1976 1.1 mrg GEN_INT (-current_frame_info.total_size))); 1977 1.1 mrg RTX_FRAME_RELATED_P (insn) = 1; 1978 1.1 mrg } 1979 1.1 mrg 1980 1.1 mrg if (frame_pointer_needed) 1981 1.1 mrg { 1982 1.1 mrg /* Initialize the frame pointer with the value of the stack pointer 1983 1.1 mrg pointing now to the locals. */ 1984 1.1 mrg insn = emit_move_insn (frame_pointer_rtx, stack_pointer_rtx); 1985 1.1 mrg } 1986 1.1 mrg } 1987 1.1 mrg 1988 1.1 mrg /* Generate insn that updates the stack for local variables and padding 1989 1.1 mrg for registers we save. - Generate the appropriate return insn. */ 1990 1.1 mrg void 1991 1.1 mrg cr16_expand_epilogue (void) 1992 1.1 mrg { 1993 1.1 mrg rtx insn; 1994 1.1 mrg 1995 1.1 mrg /* Nonzero if we need to return and pop only RA. This will generate a 1996 1.1 mrg different insn. This differentiate is for the peepholes for call as 1997 1.1 mrg last statement in function. */ 1998 1.1 mrg int only_popret_RA = (current_frame_info.save_regs[RETURN_ADDRESS_REGNUM] 1999 1.1 mrg && (current_frame_info.reg_size 2000 1.1 mrg == CR16_UNITS_PER_DWORD)); 2001 1.1 mrg 2002 1.1 mrg if (frame_pointer_needed) 2003 1.1 mrg { 2004 1.1 mrg /* Restore the stack pointer with the frame pointers value. */ 2005 1.1 mrg insn = emit_move_insn (stack_pointer_rtx, frame_pointer_rtx); 2006 1.1 mrg } 2007 1.1 mrg 2008 1.1 mrg if (current_frame_info.total_size > 0) 2009 1.1 mrg { 2010 1.1 mrg insn = emit_insn (gen_addsi3 (stack_pointer_rtx, stack_pointer_rtx, 2011 1.1 mrg GEN_INT (current_frame_info.total_size))); 2012 1.1 mrg RTX_FRAME_RELATED_P (insn) = 1; 2013 1.1 mrg } 2014 1.1 mrg 2015 1.1 mrg if (crtl->calls_eh_return) 2016 1.1 mrg { 2017 1.1 mrg /* Add this here so that (r5, r4) is actually loaded with the adjustment 2018 1.1 mrg value; otherwise, the load might be optimized away... 2019 1.1 mrg NOTE: remember to subtract the adjustment before popping the regs 2020 1.1 mrg and add it back before returning. */ 2021 1.1 mrg insn = emit_insn (gen_addsi3 (stack_pointer_rtx, stack_pointer_rtx, 2022 1.1 mrg EH_RETURN_STACKADJ_RTX)); 2023 1.1 mrg } 2024 1.1 mrg 2025 1.1 mrg if (cr16_interrupt_function_p ()) 2026 1.1 mrg { 2027 1.1 mrg insn = emit_jump_insn (gen_interrupt_return ()); 2028 1.1 mrg RTX_FRAME_RELATED_P (insn) = 1; 2029 1.1 mrg } 2030 1.1 mrg else if (crtl->calls_eh_return) 2031 1.1 mrg { 2032 1.1 mrg /* Special case, pop what's necessary, adjust SP and jump to (RA). */ 2033 1.1 mrg insn = emit_jump_insn (gen_pop_and_popret_return 2034 1.1 mrg (GEN_INT (current_frame_info.reg_size))); 2035 1.1 mrg RTX_FRAME_RELATED_P (insn) = 1; 2036 1.1 mrg } 2037 1.1 mrg else if (current_frame_info.last_reg_to_save == -1) 2038 1.1 mrg /* Nothing to pop. */ 2039 1.1 mrg /* Don't output jump for interrupt routine, only retx. */ 2040 1.1 mrg emit_jump_insn (gen_jump_return ()); 2041 1.1 mrg else if (only_popret_RA) 2042 1.1 mrg { 2043 1.1 mrg insn = emit_jump_insn (gen_popret_RA_return ()); 2044 1.1 mrg RTX_FRAME_RELATED_P (insn) = 1; 2045 1.1 mrg } 2046 1.1 mrg else 2047 1.1 mrg { 2048 1.1 mrg insn = emit_jump_insn (gen_pop_and_popret_return 2049 1.1 mrg (GEN_INT (current_frame_info.reg_size))); 2050 1.1 mrg RTX_FRAME_RELATED_P (insn) = 1; 2051 1.1 mrg } 2052 1.1 mrg } 2053 1.1 mrg 2054 1.1 mrg /* Implements FRAME_POINTER_REQUIRED. */ 2055 1.1 mrg static bool 2056 1.1 mrg cr16_frame_pointer_required (void) 2057 1.1 mrg { 2058 1.1 mrg return (cfun->calls_alloca || crtl->calls_eh_return 2059 1.1 mrg || cfun->has_nonlocal_label || crtl->calls_eh_return); 2060 1.1 mrg } 2061 1.1 mrg 2062 1.1 mrg static bool 2063 1.1 mrg cr16_can_eliminate (const int from ATTRIBUTE_UNUSED, const int to) 2064 1.1 mrg { 2065 1.1 mrg return (to == STACK_POINTER_REGNUM ? !frame_pointer_needed : true); 2066 1.1 mrg } 2067 1.1 mrg 2068 1.1 mrg 2069 1.1 mrg /* A C compound statement that attempts to replace X with 2070 1.1 mrg a valid memory address for an operand of mode MODE. WIN 2071 1.1 mrg will be a C statement label elsewhere in the code. 2072 1.1 mrg X will always be the result of a call to break_out_memory_refs (), 2073 1.1 mrg and OLDX will be the operand that was given to that function to 2074 1.1 mrg produce X. 2075 1.1 mrg The code generated by this macro should not alter the 2076 1.1 mrg substructure of X. If it transforms X into a more legitimate form, 2077 1.1 mrg it should assign X (which will always be a C variable) a new value. */ 2078 1.1 mrg static rtx 2079 1.1 mrg cr16_legitimize_address (rtx x, rtx orig_x ATTRIBUTE_UNUSED, 2080 1.1 mrg machine_mode mode ATTRIBUTE_UNUSED) 2081 1.1 mrg { 2082 1.1 mrg if (flag_pic) 2083 1.1 mrg return legitimize_pic_address (orig_x, mode, NULL_RTX); 2084 1.1 mrg else 2085 1.1 mrg return x; 2086 1.1 mrg } 2087 1.1 mrg 2088 1.1 mrg /* Implement TARGET_LEGITIMATE_CONSTANT_P 2089 1.1 mrg Nonzero if X is a legitimate constant for an immediate 2090 1.1 mrg operand on the target machine. You can assume that X 2091 1.1 mrg satisfies CONSTANT_P. In cr16c treat legitimize float 2092 1.1 mrg constant as an immediate operand. */ 2093 1.1 mrg static bool 2094 1.1 mrg cr16_legitimate_constant_p (machine_mode mode ATTRIBUTE_UNUSED, 2095 1.1 mrg rtx x ATTRIBUTE_UNUSED) 2096 1.1 mrg { 2097 1.1 mrg return 1; 2098 1.1 mrg } 2099 1.1 mrg 2100 1.1 mrg static scalar_int_mode 2101 1.1 mrg cr16_unwind_word_mode (void) 2102 1.1 mrg { 2103 1.1 mrg return SImode; 2104 1.1 mrg } 2105 1.1 mrg 2106 1.1 mrg /* Helper function for md file. This function is used to emit arithmetic 2107 1.1 mrg DI instructions. The argument "num" decides which instruction to be 2108 1.1 mrg printed. */ 2109 1.1 mrg const char * 2110 1.1 mrg cr16_emit_add_sub_di (rtx *operands, enum rtx_code code) 2111 1.1 mrg { 2112 1.1 mrg rtx lo_op[2] ; 2113 1.1 mrg rtx hi0_op[2] ; 2114 1.1 mrg rtx hi1_op[2] ; 2115 1.1 mrg 2116 1.1 mrg lo_op[0] = gen_lowpart (SImode, operands[0]); 2117 1.1 mrg hi0_op[0] = simplify_gen_subreg (HImode, operands[0], DImode, 4); 2118 1.1 mrg hi1_op[0] = simplify_gen_subreg (HImode, operands[0], DImode, 6); 2119 1.1 mrg 2120 1.1 mrg lo_op[1] = gen_lowpart (SImode, operands[2]); 2121 1.1 mrg hi0_op[1] = simplify_gen_subreg (HImode, operands[2], DImode, 4); 2122 1.1 mrg hi1_op[1] = simplify_gen_subreg (HImode, operands[2], DImode, 6); 2123 1.1 mrg 2124 1.1 mrg switch (code) 2125 1.1 mrg { 2126 1.1 mrg case PLUS: 2127 1.1 mrg { 2128 1.1 mrg output_asm_insn ("addd\t%1, %0", lo_op) ; 2129 1.1 mrg output_asm_insn ("addcw\t%1, %0", hi0_op) ; 2130 1.1 mrg output_asm_insn ("addcw\t%1, %0", hi1_op) ; 2131 1.1 mrg break; 2132 1.1 mrg } 2133 1.1 mrg case MINUS: 2134 1.1 mrg { 2135 1.1 mrg output_asm_insn ("subd\t%1, %0", lo_op) ; 2136 1.1 mrg output_asm_insn ("subcw\t%1, %0", hi0_op) ; 2137 1.1 mrg output_asm_insn ("subcw\t%1, %0", hi1_op) ; 2138 1.1 mrg break; 2139 1.1 mrg } 2140 1.1 mrg default: 2141 1.1 mrg break; 2142 1.1 mrg } 2143 1.1 mrg 2144 1.1 mrg return ""; 2145 1.1 mrg } 2146 1.1 mrg 2147 1.1 mrg 2148 1.1 mrg /* Helper function for md file. This function is used to emit logical 2149 1.1 mrg DI instructions. The argument "num" decides which instruction to be 2150 1.1 mrg printed. */ 2151 1.1 mrg const char * 2152 1.1 mrg cr16_emit_logical_di (rtx *operands, enum rtx_code code) 2153 1.1 mrg { 2154 1.1 mrg rtx lo_op[2] ; 2155 1.1 mrg rtx hi_op[2] ; 2156 1.1 mrg 2157 1.1 mrg lo_op[0] = gen_lowpart (SImode, operands[0]); 2158 1.1 mrg hi_op[0] = simplify_gen_subreg (SImode, operands[0], DImode, 4); 2159 1.1 mrg 2160 1.1 mrg lo_op[1] = gen_lowpart (SImode, operands[2]); 2161 1.1 mrg hi_op[1] = simplify_gen_subreg (SImode, operands[2], DImode, 4); 2162 1.1 mrg 2163 1.1 mrg switch (code) 2164 1.1 mrg { 2165 1.1 mrg case AND: 2166 1.1 mrg { 2167 1.1 mrg output_asm_insn ("andd\t%1, %0", lo_op) ; 2168 1.1 mrg output_asm_insn ("andd\t%1, %0", hi_op) ; 2169 1.1 mrg return ""; 2170 1.1 mrg } 2171 1.1 mrg case IOR: 2172 1.1 mrg { 2173 1.1 mrg output_asm_insn ("ord\t%1, %0", lo_op) ; 2174 1.1 mrg output_asm_insn ("ord\t%1, %0", hi_op) ; 2175 1.1 mrg return ""; 2176 1.1 mrg } 2177 1.1 mrg case XOR: 2178 1.1 mrg { 2179 1.1 mrg output_asm_insn ("xord\t%1, %0", lo_op) ; 2180 1.1 mrg output_asm_insn ("xord\t%1, %0", hi_op) ; 2181 1.1 mrg return ""; 2182 1.1 mrg } 2183 1.1 mrg default: 2184 1.1 mrg break; 2185 1.1 mrg } 2186 1.1 mrg 2187 1.1 mrg return ""; 2188 1.1 mrg } 2189 1.1 mrg 2190 1.1 mrg /* Implement PUSH_ROUNDING. */ 2191 1.1 mrg 2192 1.1 mrg poly_int64 2193 1.1 mrg cr16_push_rounding (poly_int64 bytes) 2194 1.1 mrg { 2195 1.1 mrg return (bytes + 1) & ~1; 2196 1.1 mrg } 2197 1.1 mrg 2198 1.1 mrg /* Initialize 'targetm' variable which contains pointers to functions 2199 1.1 mrg and data relating to the target machine. */ 2200 1.1 mrg 2201 1.1 mrg struct gcc_target targetm = TARGET_INITIALIZER; 2202