1 1.1 mrg /* Subroutines used for code generation on TI MSP430 processors. 2 1.1 mrg Copyright (C) 2012-2022 Free Software Foundation, Inc. 3 1.1 mrg Contributed by Red Hat. 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 8 1.1 mrg it under the terms of the GNU General Public License as published by 9 1.1 mrg the Free Software Foundation; either version 3, or (at your option) 10 1.1 mrg any later version. 11 1.1 mrg 12 1.1 mrg GCC is distributed in the hope that it will be useful, 13 1.1 mrg but WITHOUT ANY WARRANTY; without even the implied warranty of 14 1.1 mrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 1.1 mrg GNU General Public 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 "gimple-expr.h" 33 1.1 mrg #include "df.h" 34 1.1 mrg #include "memmodel.h" 35 1.1 mrg #include "tm_p.h" 36 1.1 mrg #include "regs.h" 37 1.1 mrg #include "emit-rtl.h" 38 1.1 mrg #include "varasm.h" 39 1.1 mrg #include "diagnostic-core.h" 40 1.1 mrg #include "fold-const.h" 41 1.1 mrg #include "stor-layout.h" 42 1.1 mrg #include "calls.h" 43 1.1 mrg #include "output.h" 44 1.1 mrg #include "explow.h" 45 1.1 mrg #include "expr.h" 46 1.1 mrg #include "langhooks.h" 47 1.1 mrg #include "builtins.h" 48 1.1 mrg #include "intl.h" 49 1.1 mrg #include "msp430-devices.h" 50 1.1 mrg #include "incpath.h" 51 1.1 mrg #include "prefix.h" 52 1.1 mrg #include "insn-config.h" 53 1.1 mrg #include "insn-attr.h" 54 1.1 mrg #include "recog.h" 55 1.1 mrg 56 1.1 mrg /* This file should be included last. */ 57 1.1 mrg #include "target-def.h" 58 1.1 mrg 59 1.1 mrg 61 1.1 mrg static void msp430_compute_frame_info (void); 62 1.1 mrg static bool msp430_use_16bit_hwmult (void); 63 1.1 mrg static bool msp430_use_32bit_hwmult (void); 64 1.1 mrg static bool use_helper_for_const_shift (machine_mode mode, HOST_WIDE_INT amt); 65 1.1 mrg 66 1.1 mrg 67 1.1 mrg 69 1.1 mrg /* Run-time Target Specification. */ 70 1.1 mrg 71 1.1 mrg bool msp430x = true; 72 1.1 mrg 73 1.1 mrg struct GTY(()) machine_function 74 1.1 mrg { 75 1.1 mrg /* If set, the rest of the fields have been computed. */ 76 1.1 mrg int computed; 77 1.1 mrg /* Which registers need to be saved in the pro/epilogue. */ 78 1.1 mrg int need_to_save[FIRST_PSEUDO_REGISTER]; 79 1.1 mrg 80 1.1 mrg /* These fields describe the frame layout... */ 81 1.1 mrg /* arg pointer */ 82 1.1 mrg /* 2/4 bytes for saved PC */ 83 1.1 mrg int framesize_regs; 84 1.1 mrg /* frame pointer */ 85 1.1 mrg int framesize_locals; 86 1.1 mrg int framesize_outgoing; 87 1.1 mrg /* stack pointer */ 88 1.1 mrg int framesize; 89 1.1 mrg 90 1.1 mrg /* How much we adjust the stack when returning from an exception 91 1.1 mrg handler. */ 92 1.1 mrg rtx eh_stack_adjust; 93 1.1 mrg }; 94 1.1 mrg 95 1.1 mrg /* This is our init_machine_status, as set in 96 1.1 mrg msp430_option_override. */ 97 1.1 mrg static struct machine_function * 98 1.1 mrg msp430_init_machine_status (void) 99 1.1 mrg { 100 1.1 mrg struct machine_function *m; 101 1.1 mrg 102 1.1 mrg m = ggc_cleared_alloc<machine_function> (); 103 1.1 mrg 104 1.1 mrg return m; 105 1.1 mrg } 106 1.1 mrg 107 1.1 mrg #undef TARGET_OPTION_OVERRIDE 108 1.1 mrg #define TARGET_OPTION_OVERRIDE msp430_option_override 109 1.1 mrg 110 1.1 mrg /* Generate a C preprocessor symbol based upon the MCU selected by the user. 111 1.1 mrg If a specific MCU has not been selected then return a generic symbol 112 1.1 mrg instead. */ 113 1.1 mrg 114 1.1 mrg const char * 115 1.1 mrg msp430_mcu_name (void) 116 1.1 mrg { 117 1.1 mrg if (target_mcu) 118 1.1 mrg { 119 1.1 mrg msp430_extract_mcu_data (target_mcu); 120 1.1 mrg unsigned int i; 121 1.1 mrg unsigned int start_upper; 122 1.1 mrg unsigned int end_upper; 123 1.1 mrg static char mcu_name[64]; 124 1.1 mrg 125 1.1 mrg /* The 'i' in the device name symbol for msp430i* devices must be lower 126 1.1 mrg case, to match the expected symbol in msp430.h. */ 127 1.1 mrg if (startswith (target_mcu, "msp430i")) 128 1.1 mrg { 129 1.1 mrg snprintf (mcu_name, sizeof (mcu_name) - 1, "__MSP430i%s__", 130 1.1 mrg target_mcu + 7); 131 1.1 mrg start_upper = 9; 132 1.1 mrg } 133 1.1 mrg else 134 1.1 mrg { 135 1.1 mrg snprintf (mcu_name, sizeof (mcu_name) - 1, "__%s__", target_mcu); 136 1.1 mrg start_upper = 2; 137 1.1 mrg } 138 1.1 mrg end_upper = strlen (mcu_name) - 2; 139 1.1 mrg for (i = start_upper; i < end_upper; i++) 140 1.1 mrg mcu_name[i] = TOUPPER (mcu_name[i]); 141 1.1 mrg return mcu_name; 142 1.1 mrg } 143 1.1 mrg 144 1.1 mrg return msp430x ? "__MSP430XGENERIC__" : "__MSP430GENERIC__"; 145 1.1 mrg } 146 1.1 mrg 147 1.1 mrg static const char * 148 1.1 mrg hwmult_name (unsigned int val) 149 1.1 mrg { 150 1.1 mrg switch (val) 151 1.1 mrg { 152 1.1 mrg case 0: return "none"; 153 1.1 mrg case 1: return "16-bit"; 154 1.1 mrg case 2: return "16-bit"; 155 1.1 mrg case 4: return "32-bit"; 156 1.1 mrg case 8: return "32-bit (5xx)"; 157 1.1 mrg default: gcc_unreachable (); 158 1.1 mrg } 159 1.1 mrg } 160 1.1 mrg 161 1.1 mrg static void 162 1.1 mrg msp430_option_override (void) 163 1.1 mrg { 164 1.1 mrg /* The MSP430 architecture can safely dereference a NULL pointer. In fact, 165 1.1 mrg there are memory mapped registers there. */ 166 1.1 mrg flag_delete_null_pointer_checks = 0; 167 1.1 mrg 168 1.1 mrg init_machine_status = msp430_init_machine_status; 169 1.1 mrg 170 1.1 mrg msp430x = target_cpu >= MSP430_CPU_MSP430X_DEFAULT; 171 1.1 mrg 172 1.1 mrg if (target_mcu) 173 1.1 mrg { 174 1.1 mrg msp430_extract_mcu_data (target_mcu); 175 1.1 mrg 176 1.1 mrg if (extracted_mcu_data.name != NULL) 177 1.1 mrg { 178 1.1 mrg bool xisa = extracted_mcu_data.revision >= 1; 179 1.1 mrg 180 1.1 mrg if (msp430_warn_mcu) 181 1.1 mrg { 182 1.1 mrg if (target_cpu != MSP430_CPU_MSP430X_DEFAULT && msp430x != xisa) 183 1.1 mrg warning (0, "MCU %qs supports %s ISA but %<-mcpu%> option " 184 1.1 mrg "is set to %s", 185 1.1 mrg target_mcu, xisa ? "430X" : "430", 186 1.1 mrg msp430x ? "430X" : "430"); 187 1.1 mrg 188 1.1 mrg if (extracted_mcu_data.hwmpy == 0 189 1.1 mrg && msp430_hwmult_type != MSP430_HWMULT_AUTO 190 1.1 mrg && msp430_hwmult_type != MSP430_HWMULT_NONE) 191 1.1 mrg warning (0, "MCU %qs does not have hardware multiply " 192 1.1 mrg "support, but %<-mhwmult%> is set to %s", 193 1.1 mrg target_mcu, 194 1.1 mrg msp430_hwmult_type == MSP430_HWMULT_SMALL ? "16-bit" 195 1.1 mrg : msp430_hwmult_type == MSP430_HWMULT_LARGE 196 1.1 mrg ? "32-bit" : "f5series"); 197 1.1 mrg else if (msp430_hwmult_type == MSP430_HWMULT_SMALL 198 1.1 mrg && extracted_mcu_data.hwmpy != 1 199 1.1 mrg && extracted_mcu_data.hwmpy != 2) 200 1.1 mrg warning (0, "MCU %qs supports %s hardware multiply, " 201 1.1 mrg "but %<-mhwmult%> is set to 16-bit", 202 1.1 mrg target_mcu, hwmult_name (extracted_mcu_data.hwmpy)); 203 1.1 mrg else if (msp430_hwmult_type == MSP430_HWMULT_LARGE 204 1.1 mrg && extracted_mcu_data.hwmpy != 4) 205 1.1 mrg warning (0, "MCU %qs supports %s hardware multiply, " 206 1.1 mrg "but %<-mhwmult%> is set to 32-bit", 207 1.1 mrg target_mcu, hwmult_name (extracted_mcu_data.hwmpy)); 208 1.1 mrg else if (msp430_hwmult_type == MSP430_HWMULT_F5SERIES 209 1.1 mrg && extracted_mcu_data.hwmpy != 8) 210 1.1 mrg warning (0, "MCU %qs supports %s hardware multiply, " 211 1.1 mrg "but %<-mhwmult%> is set to f5series", 212 1.1 mrg target_mcu, hwmult_name (extracted_mcu_data.hwmpy)); 213 1.1 mrg } 214 1.1 mrg /* Only override the default setting with the extracted ISA value if 215 1.1 mrg the user has not passed -mcpu=. */ 216 1.1 mrg if (target_cpu == MSP430_CPU_MSP430X_DEFAULT) 217 1.1 mrg msp430x = xisa; 218 1.1 mrg } 219 1.1 mrg else 220 1.1 mrg { 221 1.1 mrg if (msp430_hwmult_type == MSP430_HWMULT_AUTO) 222 1.1 mrg { 223 1.1 mrg if (msp430_warn_mcu) 224 1.1 mrg { 225 1.1 mrg if (target_cpu == MSP430_CPU_MSP430X_DEFAULT) 226 1.1 mrg warning (0, 227 1.1 mrg "unrecognized MCU name %qs, assuming that it is " 228 1.1 mrg "just a MSP430X with no hardware multiply; " 229 1.1 mrg "use the %<-mcpu%> and %<-mhwmult%> options to " 230 1.1 mrg "set these explicitly", 231 1.1 mrg target_mcu); 232 1.1 mrg else 233 1.1 mrg warning (0, 234 1.1 mrg "unrecognized MCU name %qs, assuming that it " 235 1.1 mrg "has no hardware multiply; use the %<-mhwmult%> " 236 1.1 mrg "option to set this explicitly", 237 1.1 mrg target_mcu); 238 1.1 mrg } 239 1.1 mrg 240 1.1 mrg msp430_hwmult_type = MSP430_HWMULT_NONE; 241 1.1 mrg } 242 1.1 mrg else if (target_cpu == MSP430_CPU_MSP430X_DEFAULT) 243 1.1 mrg { 244 1.1 mrg if (msp430_warn_mcu) 245 1.1 mrg warning (0, 246 1.1 mrg "unrecognized MCU name %qs, assuming that it just " 247 1.1 mrg "supports the MSP430X ISA; use the %<-mcpu%> option " 248 1.1 mrg "to set the ISA explicitly", 249 1.1 mrg target_mcu); 250 1.1 mrg } 251 1.1 mrg else if (msp430_warn_mcu) 252 1.1 mrg warning (0, "Unrecognized MCU name %qs.", target_mcu); 253 1.1 mrg } 254 1.1 mrg } 255 1.1 mrg 256 1.1 mrg if (TARGET_LARGE && !msp430x) 257 1.1 mrg error ("%<-mlarge%> requires a 430X-compatible %<-mmcu=%>"); 258 1.1 mrg 259 1.1 mrg if (!TARGET_LARGE && msp430_code_region == MSP430_REGION_EITHER) 260 1.1 mrg error ("%<-mcode-region=either%> requires the large memory model " 261 1.1 mrg "(%<-mlarge%>)"); 262 1.1 mrg else if (!TARGET_LARGE && msp430_code_region == MSP430_REGION_UPPER) 263 1.1 mrg error ("%<-mcode-region=upper%> requires the large memory model " 264 1.1 mrg "(%<-mlarge%>)"); 265 1.1 mrg 266 1.1 mrg if (!TARGET_LARGE && msp430_data_region == MSP430_REGION_EITHER) 267 1.1 mrg error ("%<-mdata-region=either%> requires the large memory model " 268 1.1 mrg "(%<-mlarge%>)"); 269 1.1 mrg else if (!TARGET_LARGE && msp430_data_region == MSP430_REGION_UPPER) 270 1.1 mrg error ("%<-mdata-region=upper%> requires the large memory model " 271 1.1 mrg "(%<-mlarge%>)"); 272 1.1 mrg 273 1.1 mrg if (flag_exceptions || flag_non_call_exceptions 274 1.1 mrg || flag_unwind_tables || flag_asynchronous_unwind_tables) 275 1.1 mrg flag_omit_frame_pointer = false; 276 1.1 mrg else 277 1.1 mrg flag_omit_frame_pointer = true; 278 1.1 mrg 279 1.1 mrg /* This is a hack to work around a problem with the newlib build 280 1.1 mrg mechanism. Newlib always appends CFLAGS to the end of the GCC 281 1.1 mrg command line and always sets -O2 in CFLAGS. Thus it is not 282 1.1 mrg possible to build newlib with -Os enabled. Until now... */ 283 1.1 mrg if (TARGET_OPT_SPACE && optimize < 3) 284 1.1 mrg optimize_size = 1; 285 1.1 mrg 286 1.1 mrg #if !DEFAULT_USE_CXA_ATEXIT 287 1.1 mrg /* For some configurations, we use atexit () instead of __cxa_atexit () by 288 1.1 mrg default to save on code size and remove the declaration of __dso_handle 289 1.1 mrg from the CRT library. 290 1.1 mrg Configuring GCC with --enable-__cxa-atexit re-enables it by defining 291 1.1 mrg DEFAULT_USE_CXA_ATEXIT to 1. */ 292 1.1 mrg if (flag_use_cxa_atexit) 293 1.1 mrg error ("%<-fuse-cxa-atexit%> is not supported for msp430-elf"); 294 1.1 mrg #endif 295 1.1 mrg 296 1.1 mrg #ifndef HAVE_NEWLIB_NANO_FORMATTED_IO 297 1.1 mrg if (TARGET_TINY_PRINTF) 298 1.1 mrg error ("GCC must be configured with %<--enable-newlib-nano-formatted-io%> " 299 1.1 mrg "to use %<-mtiny-printf%>"); 300 1.1 mrg #endif 301 1.1 mrg } 302 1.1 mrg 303 1.1 mrg #undef TARGET_SCALAR_MODE_SUPPORTED_P 304 1.1 mrg #define TARGET_SCALAR_MODE_SUPPORTED_P msp430_scalar_mode_supported_p 305 1.1 mrg 306 1.1 mrg static bool 307 1.1 mrg msp430_scalar_mode_supported_p (scalar_mode m) 308 1.1 mrg { 309 1.1 mrg if (m == PSImode && msp430x) 310 1.1 mrg return true; 311 1.1 mrg #if 0 312 1.1 mrg if (m == TImode) 313 1.1 mrg return true; 314 1.1 mrg #endif 315 1.1 mrg return default_scalar_mode_supported_p (m); 316 1.1 mrg } 317 1.1 mrg 318 1.1 mrg 319 1.1 mrg 321 1.1 mrg /* Storage Layout */ 322 1.1 mrg 323 1.1 mrg #undef TARGET_MS_BITFIELD_LAYOUT_P 324 1.1 mrg #define TARGET_MS_BITFIELD_LAYOUT_P msp430_ms_bitfield_layout_p 325 1.1 mrg 326 1.1 mrg bool 327 1.1 mrg msp430_ms_bitfield_layout_p (const_tree record_type ATTRIBUTE_UNUSED) 328 1.1 mrg { 329 1.1 mrg return false; 330 1.1 mrg } 331 1.1 mrg 332 1.1 mrg 333 1.1 mrg 335 1.1 mrg /* Register Usage */ 336 1.1 mrg 337 1.1 mrg #undef TARGET_HARD_REGNO_NREGS 338 1.1 mrg #define TARGET_HARD_REGNO_NREGS msp430_hard_regno_nregs 339 1.1 mrg 340 1.1 mrg static unsigned int 341 1.1 mrg msp430_hard_regno_nregs (unsigned int, machine_mode mode) 342 1.1 mrg { 343 1.1 mrg if (mode == PSImode && msp430x) 344 1.1 mrg return 1; 345 1.1 mrg if (mode == CPSImode && msp430x) 346 1.1 mrg return 2; 347 1.1 mrg return ((GET_MODE_SIZE (mode) + UNITS_PER_WORD - 1) 348 1.1 mrg / UNITS_PER_WORD); 349 1.1 mrg } 350 1.1 mrg 351 1.1 mrg /* subreg_get_info correctly handles PSImode registers, so defining 352 1.1 mrg HARD_REGNO_NREGS_HAS_PADDING and HARD_REGNO_NREGS_WITH_PADDING 353 1.1 mrg has no effect. */ 354 1.1 mrg 355 1.1 mrg #undef TARGET_HARD_REGNO_MODE_OK 356 1.1 mrg #define TARGET_HARD_REGNO_MODE_OK msp430_hard_regno_mode_ok 357 1.1 mrg 358 1.1 mrg static bool 359 1.1 mrg msp430_hard_regno_mode_ok (unsigned int regno, machine_mode mode) 360 1.1 mrg { 361 1.1 mrg return regno <= (ARG_POINTER_REGNUM 362 1.1 mrg - (unsigned int) msp430_hard_regno_nregs (regno, mode)); 363 1.1 mrg } 364 1.1 mrg 365 1.1 mrg #undef TARGET_MODES_TIEABLE_P 366 1.1 mrg #define TARGET_MODES_TIEABLE_P msp430_modes_tieable_p 367 1.1 mrg 368 1.1 mrg static bool 369 1.1 mrg msp430_modes_tieable_p (machine_mode mode1, machine_mode mode2) 370 1.1 mrg { 371 1.1 mrg if ((mode1 == PSImode || mode2 == SImode) 372 1.1 mrg || (mode1 == SImode || mode2 == PSImode)) 373 1.1 mrg return false; 374 1.1 mrg 375 1.1 mrg return ((GET_MODE_CLASS (mode1) == MODE_FLOAT 376 1.1 mrg || GET_MODE_CLASS (mode1) == MODE_COMPLEX_FLOAT) 377 1.1 mrg == (GET_MODE_CLASS (mode2) == MODE_FLOAT 378 1.1 mrg || GET_MODE_CLASS (mode2) == MODE_COMPLEX_FLOAT)); 379 1.1 mrg } 380 1.1 mrg 381 1.1 mrg #undef TARGET_FRAME_POINTER_REQUIRED 382 1.1 mrg #define TARGET_FRAME_POINTER_REQUIRED msp430_frame_pointer_required 383 1.1 mrg 384 1.1 mrg static bool 385 1.1 mrg msp430_frame_pointer_required (void) 386 1.1 mrg { 387 1.1 mrg return false; 388 1.1 mrg } 389 1.1 mrg 390 1.1 mrg #undef TARGET_CAN_ELIMINATE 391 1.1 mrg #define TARGET_CAN_ELIMINATE msp430_can_eliminate 392 1.1 mrg 393 1.1 mrg static bool 394 1.1 mrg msp430_can_eliminate (const int from_reg ATTRIBUTE_UNUSED, 395 1.1 mrg const int to_reg ATTRIBUTE_UNUSED) 396 1.1 mrg { 397 1.1 mrg return true; 398 1.1 mrg } 399 1.1 mrg 400 1.1 mrg /* Implements INITIAL_ELIMINATION_OFFSET. */ 401 1.1 mrg int 402 1.1 mrg msp430_initial_elimination_offset (int from, int to) 403 1.1 mrg { 404 1.1 mrg int rv = 0; /* As if arg to arg. */ 405 1.1 mrg 406 1.1 mrg msp430_compute_frame_info (); 407 1.1 mrg 408 1.1 mrg switch (to) 409 1.1 mrg { 410 1.1 mrg case STACK_POINTER_REGNUM: 411 1.1 mrg rv += cfun->machine->framesize_outgoing; 412 1.1 mrg rv += cfun->machine->framesize_locals; 413 1.1 mrg /* Fall through. */ 414 1.1 mrg case FRAME_POINTER_REGNUM: 415 1.1 mrg rv += cfun->machine->framesize_regs; 416 1.1 mrg /* Allow for the saved return address. */ 417 1.1 mrg rv += (TARGET_LARGE ? 4 : 2); 418 1.1 mrg /* NB/ No need to allow for crtl->args.pretend_args_size. 419 1.1 mrg GCC does that for us. */ 420 1.1 mrg break; 421 1.1 mrg default: 422 1.1 mrg gcc_unreachable (); 423 1.1 mrg } 424 1.1 mrg 425 1.1 mrg switch (from) 426 1.1 mrg { 427 1.1 mrg case FRAME_POINTER_REGNUM: 428 1.1 mrg /* Allow for the fall through above. */ 429 1.1 mrg rv -= (TARGET_LARGE ? 4 : 2); 430 1.1 mrg rv -= cfun->machine->framesize_regs; 431 1.1 mrg case ARG_POINTER_REGNUM: 432 1.1 mrg break; 433 1.1 mrg default: 434 1.1 mrg gcc_unreachable (); 435 1.1 mrg } 436 1.1 mrg 437 1.1 mrg return rv; 438 1.1 mrg } 439 1.1 mrg 440 1.1 mrg /* Named Address Space support */ 442 1.1 mrg 443 1.1 mrg 444 1.1 mrg /* Return the appropriate mode for a named address pointer. */ 445 1.1 mrg #undef TARGET_ADDR_SPACE_POINTER_MODE 446 1.1 mrg #define TARGET_ADDR_SPACE_POINTER_MODE msp430_addr_space_pointer_mode 447 1.1 mrg #undef TARGET_ADDR_SPACE_ADDRESS_MODE 448 1.1 mrg #define TARGET_ADDR_SPACE_ADDRESS_MODE msp430_addr_space_pointer_mode 449 1.1 mrg 450 1.1 mrg static scalar_int_mode 451 1.1 mrg msp430_addr_space_pointer_mode (addr_space_t addrspace) 452 1.1 mrg { 453 1.1 mrg switch (addrspace) 454 1.1 mrg { 455 1.1 mrg default: 456 1.1 mrg case ADDR_SPACE_GENERIC: 457 1.1 mrg return Pmode; 458 1.1 mrg case ADDR_SPACE_NEAR: 459 1.1 mrg return HImode; 460 1.1 mrg case ADDR_SPACE_FAR: 461 1.1 mrg return PSImode; 462 1.1 mrg } 463 1.1 mrg } 464 1.1 mrg 465 1.1 mrg /* Function pointers are stored in unwind_word sized 466 1.1 mrg variables, so make sure that unwind_word is big enough. */ 467 1.1 mrg #undef TARGET_UNWIND_WORD_MODE 468 1.1 mrg #define TARGET_UNWIND_WORD_MODE msp430_unwind_word_mode 469 1.1 mrg 470 1.1 mrg static scalar_int_mode 471 1.1 mrg msp430_unwind_word_mode (void) 472 1.1 mrg { 473 1.1 mrg /* This needs to match msp430_init_dwarf_reg_sizes_extra (below). */ 474 1.1 mrg return msp430x ? PSImode : HImode; 475 1.1 mrg } 476 1.1 mrg 477 1.1 mrg /* Determine if one named address space is a subset of another. */ 478 1.1 mrg #undef TARGET_ADDR_SPACE_SUBSET_P 479 1.1 mrg #define TARGET_ADDR_SPACE_SUBSET_P msp430_addr_space_subset_p 480 1.1 mrg static bool 481 1.1 mrg msp430_addr_space_subset_p (addr_space_t subset, addr_space_t superset) 482 1.1 mrg { 483 1.1 mrg if (subset == superset) 484 1.1 mrg return true; 485 1.1 mrg else 486 1.1 mrg return (subset != ADDR_SPACE_FAR && superset == ADDR_SPACE_FAR); 487 1.1 mrg } 488 1.1 mrg 489 1.1 mrg #undef TARGET_ADDR_SPACE_CONVERT 490 1.1 mrg #define TARGET_ADDR_SPACE_CONVERT msp430_addr_space_convert 491 1.1 mrg /* Convert from one address space to another. */ 492 1.1 mrg static rtx 493 1.1 mrg msp430_addr_space_convert (rtx op, tree from_type, tree to_type) 494 1.1 mrg { 495 1.1 mrg addr_space_t from_as = TYPE_ADDR_SPACE (TREE_TYPE (from_type)); 496 1.1 mrg addr_space_t to_as = TYPE_ADDR_SPACE (TREE_TYPE (to_type)); 497 1.1 mrg rtx result; 498 1.1 mrg 499 1.1 mrg if (to_as != ADDR_SPACE_FAR && from_as == ADDR_SPACE_FAR) 500 1.1 mrg { 501 1.1 mrg /* This is unpredictable, as we're truncating off usable address 502 1.1 mrg bits. */ 503 1.1 mrg 504 1.1 mrg if (CONSTANT_P (op)) 505 1.1 mrg return gen_rtx_CONST (HImode, op); 506 1.1 mrg 507 1.1 mrg result = gen_reg_rtx (HImode); 508 1.1 mrg emit_insn (gen_truncpsihi2 (result, op)); 509 1.1 mrg return result; 510 1.1 mrg } 511 1.1 mrg else if (to_as == ADDR_SPACE_FAR && from_as != ADDR_SPACE_FAR) 512 1.1 mrg { 513 1.1 mrg /* This always works. */ 514 1.1 mrg 515 1.1 mrg if (CONSTANT_P (op)) 516 1.1 mrg return gen_rtx_CONST (PSImode, op); 517 1.1 mrg 518 1.1 mrg result = gen_reg_rtx (PSImode); 519 1.1 mrg emit_insn (gen_zero_extendhipsi2 (result, op)); 520 1.1 mrg return result; 521 1.1 mrg } 522 1.1 mrg else 523 1.1 mrg gcc_unreachable (); 524 1.1 mrg } 525 1.1 mrg 526 1.1 mrg /* Stack Layout and Calling Conventions. */ 528 1.1 mrg 529 1.1 mrg /* For each function, we list the gcc version and the TI version on 530 1.1 mrg each line, where we're converting the function names. */ 531 1.1 mrg static char const * const special_convention_function_names[] = 532 1.1 mrg { 533 1.1 mrg "__muldi3", "__mspabi_mpyll", 534 1.1 mrg "__udivdi3", "__mspabi_divull", 535 1.1 mrg "__umoddi3", "__mspabi_remull", 536 1.1 mrg "__divdi3", "__mspabi_divlli", 537 1.1 mrg "__moddi3", "__mspabi_remlli", 538 1.1 mrg "__mspabi_srall", 539 1.1 mrg "__mspabi_srlll", 540 1.1 mrg "__mspabi_sllll", 541 1.1 mrg "__adddf3", "__mspabi_addd", 542 1.1 mrg "__subdf3", "__mspabi_subd", 543 1.1 mrg "__muldf3", "__mspabi_mpyd", 544 1.1 mrg "__divdf3", "__mspabi_divd", 545 1.1 mrg "__mspabi_cmpd", 546 1.1 mrg NULL 547 1.1 mrg }; 548 1.1 mrg 549 1.1 mrg /* TRUE if the function passed is a "speical" function. Special 550 1.1 mrg functions pass two DImode parameters in registers. */ 551 1.1 mrg static bool 552 1.1 mrg msp430_special_register_convention_p (const char *name) 553 1.1 mrg { 554 1.1 mrg int i; 555 1.1 mrg 556 1.1 mrg for (i = 0; special_convention_function_names[i]; i++) 557 1.1 mrg if (!strcmp (name, special_convention_function_names[i])) 558 1.1 mrg return true; 559 1.1 mrg 560 1.1 mrg return false; 561 1.1 mrg } 562 1.1 mrg 563 1.1 mrg #undef TARGET_FUNCTION_VALUE_REGNO_P 564 1.1 mrg #define TARGET_FUNCTION_VALUE_REGNO_P msp430_function_value_regno_p 565 1.1 mrg 566 1.1 mrg bool 567 1.1 mrg msp430_function_value_regno_p (unsigned int regno) 568 1.1 mrg { 569 1.1 mrg return regno == 12; 570 1.1 mrg } 571 1.1 mrg 572 1.1 mrg 573 1.1 mrg #undef TARGET_FUNCTION_VALUE 574 1.1 mrg #define TARGET_FUNCTION_VALUE msp430_function_value 575 1.1 mrg 576 1.1 mrg rtx 577 1.1 mrg msp430_function_value (const_tree ret_type, 578 1.1 mrg const_tree fn_decl_or_type ATTRIBUTE_UNUSED, 579 1.1 mrg bool outgoing ATTRIBUTE_UNUSED) 580 1.1 mrg { 581 1.1 mrg return gen_rtx_REG (TYPE_MODE (ret_type), 12); 582 1.1 mrg } 583 1.1 mrg 584 1.1 mrg #undef TARGET_LIBCALL_VALUE 585 1.1 mrg #define TARGET_LIBCALL_VALUE msp430_libcall_value 586 1.1 mrg 587 1.1 mrg rtx 588 1.1 mrg msp430_libcall_value (machine_mode mode, const_rtx fun ATTRIBUTE_UNUSED) 589 1.1 mrg { 590 1.1 mrg return gen_rtx_REG (mode, 12); 591 1.1 mrg } 592 1.1 mrg 593 1.1 mrg /* Implements INIT_CUMULATIVE_ARGS. */ 594 1.1 mrg void 595 1.1 mrg msp430_init_cumulative_args (CUMULATIVE_ARGS *ca, 596 1.1 mrg tree fntype ATTRIBUTE_UNUSED, 597 1.1 mrg rtx libname ATTRIBUTE_UNUSED, 598 1.1 mrg tree fndecl ATTRIBUTE_UNUSED, 599 1.1 mrg int n_named_args ATTRIBUTE_UNUSED) 600 1.1 mrg { 601 1.1 mrg const char *fname; 602 1.1 mrg memset (ca, 0, sizeof(*ca)); 603 1.1 mrg 604 1.1 mrg ca->can_split = 1; 605 1.1 mrg 606 1.1 mrg if (fndecl) 607 1.1 mrg fname = IDENTIFIER_POINTER (DECL_NAME (fndecl)); 608 1.1 mrg else if (libname) 609 1.1 mrg fname = XSTR (libname, 0); 610 1.1 mrg else 611 1.1 mrg fname = NULL; 612 1.1 mrg 613 1.1 mrg if (fname && msp430_special_register_convention_p (fname)) 614 1.1 mrg ca->special_p = 1; 615 1.1 mrg } 616 1.1 mrg 617 1.1 mrg /* Helper function for argument passing; this function is the common 618 1.1 mrg code that determines where an argument will be passed. */ 619 1.1 mrg static void 620 1.1 mrg msp430_evaluate_arg (cumulative_args_t cap, 621 1.1 mrg machine_mode mode, 622 1.1 mrg const_tree type ATTRIBUTE_UNUSED, 623 1.1 mrg bool named) 624 1.1 mrg { 625 1.1 mrg CUMULATIVE_ARGS *ca = get_cumulative_args (cap); 626 1.1 mrg int nregs = GET_MODE_SIZE (mode); 627 1.1 mrg int i; 628 1.1 mrg 629 1.1 mrg ca->reg_count = 0; 630 1.1 mrg ca->mem_count = 0; 631 1.1 mrg 632 1.1 mrg if (!named) 633 1.1 mrg return; 634 1.1 mrg 635 1.1 mrg if (mode == PSImode) 636 1.1 mrg nregs = 1; 637 1.1 mrg else 638 1.1 mrg nregs = (nregs + 1) / 2; 639 1.1 mrg 640 1.1 mrg if (ca->special_p) 641 1.1 mrg { 642 1.1 mrg /* Function is passed two DImode operands, in R8:R11 and 643 1.1 mrg R12:15. */ 644 1.1 mrg ca->start_reg = 8; 645 1.1 mrg ca->reg_count = 4; 646 1.1 mrg return; 647 1.1 mrg } 648 1.1 mrg 649 1.1 mrg switch (nregs) 650 1.1 mrg { 651 1.1 mrg case 1: 652 1.1 mrg for (i = 0; i < 4; i++) 653 1.1 mrg if (!ca->reg_used[i]) 654 1.1 mrg { 655 1.1 mrg ca->reg_count = 1; 656 1.1 mrg ca->start_reg = CA_FIRST_REG + i; 657 1.1 mrg return; 658 1.1 mrg } 659 1.1 mrg break; 660 1.1 mrg case 2: 661 1.1 mrg for (i = 0; i < 3; i++) 662 1.1 mrg if (!ca->reg_used[i] && !ca->reg_used[i + 1]) 663 1.1 mrg { 664 1.1 mrg ca->reg_count = 2; 665 1.1 mrg ca->start_reg = CA_FIRST_REG + i; 666 1.1 mrg return; 667 1.1 mrg } 668 1.1 mrg if (!ca->reg_used[3] && ca->can_split) 669 1.1 mrg { 670 1.1 mrg ca->reg_count = 1; 671 1.1 mrg ca->mem_count = 2; 672 1.1 mrg ca->start_reg = CA_FIRST_REG + 3; 673 1.1 mrg return; 674 1.1 mrg } 675 1.1 mrg break; 676 1.1 mrg case 3: 677 1.1 mrg case 4: 678 1.1 mrg ca->can_split = 0; 679 1.1 mrg if (!ca->reg_used[0] 680 1.1 mrg && !ca->reg_used[1] 681 1.1 mrg && !ca->reg_used[2] 682 1.1 mrg && !ca->reg_used[3]) 683 1.1 mrg { 684 1.1 mrg ca->reg_count = 4; 685 1.1 mrg ca->start_reg = CA_FIRST_REG; 686 1.1 mrg return; 687 1.1 mrg } 688 1.1 mrg break; 689 1.1 mrg } 690 1.1 mrg } 691 1.1 mrg 692 1.1 mrg #undef TARGET_PROMOTE_PROTOTYPES 693 1.1 mrg #define TARGET_PROMOTE_PROTOTYPES msp430_promote_prototypes 694 1.1 mrg 695 1.1 mrg bool 696 1.1 mrg msp430_promote_prototypes (const_tree fntype ATTRIBUTE_UNUSED) 697 1.1 mrg { 698 1.1 mrg return false; 699 1.1 mrg } 700 1.1 mrg 701 1.1 mrg #undef TARGET_FUNCTION_ARG 702 1.1 mrg #define TARGET_FUNCTION_ARG msp430_function_arg 703 1.1 mrg 704 1.1 mrg rtx 705 1.1 mrg msp430_function_arg (cumulative_args_t cap, 706 1.1 mrg const function_arg_info &arg) 707 1.1 mrg { 708 1.1 mrg CUMULATIVE_ARGS *ca = get_cumulative_args (cap); 709 1.1 mrg 710 1.1 mrg msp430_evaluate_arg (cap, arg.mode, arg.type, arg.named); 711 1.1 mrg 712 1.1 mrg if (ca->reg_count) 713 1.1 mrg return gen_rtx_REG (arg.mode, ca->start_reg); 714 1.1 mrg 715 1.1 mrg return 0; 716 1.1 mrg } 717 1.1 mrg 718 1.1 mrg #undef TARGET_ARG_PARTIAL_BYTES 719 1.1 mrg #define TARGET_ARG_PARTIAL_BYTES msp430_arg_partial_bytes 720 1.1 mrg 721 1.1 mrg int 722 1.1 mrg msp430_arg_partial_bytes (cumulative_args_t cap, const function_arg_info &arg) 723 1.1 mrg { 724 1.1 mrg CUMULATIVE_ARGS *ca = get_cumulative_args (cap); 725 1.1 mrg 726 1.1 mrg msp430_evaluate_arg (cap, arg.mode, arg.type, arg.named); 727 1.1 mrg 728 1.1 mrg if (ca->reg_count && ca->mem_count) 729 1.1 mrg return ca->reg_count * UNITS_PER_WORD; 730 1.1 mrg 731 1.1 mrg return 0; 732 1.1 mrg } 733 1.1 mrg 734 1.1 mrg #undef TARGET_PASS_BY_REFERENCE 735 1.1 mrg #define TARGET_PASS_BY_REFERENCE msp430_pass_by_reference 736 1.1 mrg 737 1.1 mrg static bool 738 1.1 mrg msp430_pass_by_reference (cumulative_args_t, const function_arg_info &arg) 739 1.1 mrg { 740 1.1 mrg return (arg.mode == BLKmode 741 1.1 mrg || (arg.type && TREE_CODE (arg.type) == RECORD_TYPE) 742 1.1 mrg || (arg.type && TREE_CODE (arg.type) == UNION_TYPE)); 743 1.1 mrg } 744 1.1 mrg 745 1.1 mrg #undef TARGET_CALLEE_COPIES 746 1.1 mrg #define TARGET_CALLEE_COPIES hook_bool_CUMULATIVE_ARGS_arg_info_true 747 1.1 mrg 748 1.1 mrg #undef TARGET_FUNCTION_ARG_ADVANCE 749 1.1 mrg #define TARGET_FUNCTION_ARG_ADVANCE msp430_function_arg_advance 750 1.1 mrg 751 1.1 mrg void 752 1.1 mrg msp430_function_arg_advance (cumulative_args_t cap, 753 1.1 mrg const function_arg_info &arg) 754 1.1 mrg { 755 1.1 mrg CUMULATIVE_ARGS *ca = get_cumulative_args (cap); 756 1.1 mrg int i; 757 1.1 mrg 758 1.1 mrg msp430_evaluate_arg (cap, arg.mode, arg.type, arg.named); 759 1.1 mrg 760 1.1 mrg if (ca->start_reg >= CA_FIRST_REG) 761 1.1 mrg for (i = 0; i < ca->reg_count; i ++) 762 1.1 mrg ca->reg_used[i + ca->start_reg - CA_FIRST_REG] = 1; 763 1.1 mrg 764 1.1 mrg ca->special_p = 0; 765 1.1 mrg } 766 1.1 mrg 767 1.1 mrg #undef TARGET_FUNCTION_ARG_BOUNDARY 768 1.1 mrg #define TARGET_FUNCTION_ARG_BOUNDARY msp430_function_arg_boundary 769 1.1 mrg 770 1.1 mrg static unsigned int 771 1.1 mrg msp430_function_arg_boundary (machine_mode mode, const_tree type) 772 1.1 mrg { 773 1.1 mrg if (mode == BLKmode 774 1.1 mrg && int_size_in_bytes (type) > 1) 775 1.1 mrg return 16; 776 1.1 mrg if (GET_MODE_BITSIZE (mode) > 8) 777 1.1 mrg return 16; 778 1.1 mrg return 8; 779 1.1 mrg } 780 1.1 mrg 781 1.1 mrg #undef TARGET_RETURN_IN_MEMORY 782 1.1 mrg #define TARGET_RETURN_IN_MEMORY msp430_return_in_memory 783 1.1 mrg 784 1.1 mrg static bool 785 1.1 mrg msp430_return_in_memory (const_tree ret_type, 786 1.1 mrg const_tree fntype ATTRIBUTE_UNUSED) 787 1.1 mrg { 788 1.1 mrg machine_mode mode = TYPE_MODE (ret_type); 789 1.1 mrg 790 1.1 mrg if (mode == BLKmode 791 1.1 mrg || (fntype && TREE_CODE (TREE_TYPE (fntype)) == RECORD_TYPE) 792 1.1 mrg || (fntype && TREE_CODE (TREE_TYPE (fntype)) == UNION_TYPE)) 793 1.1 mrg return true; 794 1.1 mrg 795 1.1 mrg if (GET_MODE_SIZE (mode) > 8) 796 1.1 mrg return true; 797 1.1 mrg 798 1.1 mrg return false; 799 1.1 mrg } 800 1.1 mrg 801 1.1 mrg #undef TARGET_GET_RAW_ARG_MODE 802 1.1 mrg #define TARGET_GET_RAW_ARG_MODE msp430_get_raw_arg_mode 803 1.1 mrg 804 1.1 mrg static fixed_size_mode 805 1.1 mrg msp430_get_raw_arg_mode (int regno) 806 1.1 mrg { 807 1.1 mrg return as_a <fixed_size_mode> (regno == ARG_POINTER_REGNUM 808 1.1 mrg ? VOIDmode : Pmode); 809 1.1 mrg } 810 1.1 mrg 811 1.1 mrg #undef TARGET_GET_RAW_RESULT_MODE 812 1.1 mrg #define TARGET_GET_RAW_RESULT_MODE msp430_get_raw_result_mode 813 1.1 mrg 814 1.1 mrg static fixed_size_mode 815 1.1 mrg msp430_get_raw_result_mode (int regno ATTRIBUTE_UNUSED) 816 1.1 mrg { 817 1.1 mrg return Pmode; 818 1.1 mrg } 819 1.1 mrg 820 1.1 mrg #undef TARGET_GIMPLIFY_VA_ARG_EXPR 821 1.1 mrg #define TARGET_GIMPLIFY_VA_ARG_EXPR msp430_gimplify_va_arg_expr 822 1.1 mrg 823 1.1 mrg #include "gimplify.h" 824 1.1 mrg 825 1.1 mrg static tree 826 1.1 mrg msp430_gimplify_va_arg_expr (tree valist, tree type, gimple_seq *pre_p, 827 1.1 mrg gimple_seq *post_p) 828 1.1 mrg { 829 1.1 mrg tree addr, t, type_size, rounded_size, valist_tmp; 830 1.1 mrg unsigned HOST_WIDE_INT align, boundary; 831 1.1 mrg bool indirect; 832 1.1 mrg 833 1.1 mrg indirect = pass_va_arg_by_reference (type); 834 1.1 mrg if (indirect) 835 1.1 mrg type = build_pointer_type (type); 836 1.1 mrg 837 1.1 mrg align = PARM_BOUNDARY / BITS_PER_UNIT; 838 1.1 mrg boundary = targetm.calls.function_arg_boundary (TYPE_MODE (type), type); 839 1.1 mrg 840 1.1 mrg /* When we align parameter on stack for caller, if the parameter 841 1.1 mrg alignment is beyond MAX_SUPPORTED_STACK_ALIGNMENT, it will be 842 1.1 mrg aligned at MAX_SUPPORTED_STACK_ALIGNMENT. We will match callee 843 1.1 mrg here with caller. */ 844 1.1 mrg if (boundary > MAX_SUPPORTED_STACK_ALIGNMENT) 845 1.1 mrg boundary = MAX_SUPPORTED_STACK_ALIGNMENT; 846 1.1 mrg 847 1.1 mrg boundary /= BITS_PER_UNIT; 848 1.1 mrg 849 1.1 mrg /* Hoist the valist value into a temporary for the moment. */ 850 1.1 mrg valist_tmp = get_initialized_tmp_var (valist, pre_p, NULL); 851 1.1 mrg 852 1.1 mrg /* va_list pointer is aligned to PARM_BOUNDARY. If argument actually 853 1.1 mrg requires greater alignment, we must perform dynamic alignment. */ 854 1.1 mrg if (boundary > align 855 1.1 mrg && !integer_zerop (TYPE_SIZE (type))) 856 1.1 mrg { 857 1.1 mrg /* FIXME: This is where this function diverts from targhooks.cc: 858 1.1 mrg std_gimplify_va_arg_expr(). It works, but I do not know why... */ 859 1.1 mrg if (! POINTER_TYPE_P (type)) 860 1.1 mrg { 861 1.1 mrg t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist_tmp, 862 1.1 mrg fold_build_pointer_plus_hwi (valist_tmp, boundary - 1)); 863 1.1 mrg gimplify_and_add (t, pre_p); 864 1.1 mrg 865 1.1 mrg t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist_tmp, 866 1.1 mrg fold_build2 (BIT_AND_EXPR, TREE_TYPE (valist), 867 1.1 mrg valist_tmp, 868 1.1 mrg build_int_cst (TREE_TYPE (valist), 869 1.1 mrg -boundary))); 870 1.1 mrg gimplify_and_add (t, pre_p); 871 1.1 mrg } 872 1.1 mrg } 873 1.1 mrg else 874 1.1 mrg boundary = align; 875 1.1 mrg 876 1.1 mrg /* If the actual alignment is less than the alignment of the type, 877 1.1 mrg adjust the type accordingly so that we don't assume strict alignment 878 1.1 mrg when dereferencing the pointer. */ 879 1.1 mrg boundary *= BITS_PER_UNIT; 880 1.1 mrg if (boundary < TYPE_ALIGN (type)) 881 1.1 mrg { 882 1.1 mrg type = build_variant_type_copy (type); 883 1.1 mrg SET_TYPE_ALIGN (type, boundary); 884 1.1 mrg } 885 1.1 mrg 886 1.1 mrg /* Compute the rounded size of the type. */ 887 1.1 mrg type_size = size_in_bytes (type); 888 1.1 mrg rounded_size = round_up (type_size, align); 889 1.1 mrg 890 1.1 mrg /* Reduce rounded_size so it's sharable with the postqueue. */ 891 1.1 mrg gimplify_expr (&rounded_size, pre_p, post_p, is_gimple_val, fb_rvalue); 892 1.1 mrg 893 1.1 mrg /* Get AP. */ 894 1.1 mrg addr = valist_tmp; 895 1.1 mrg 896 1.1 mrg /* Compute new value for AP. */ 897 1.1 mrg t = fold_build_pointer_plus (valist_tmp, rounded_size); 898 1.1 mrg t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist, t); 899 1.1 mrg gimplify_and_add (t, pre_p); 900 1.1 mrg 901 1.1 mrg addr = fold_convert (build_pointer_type (type), addr); 902 1.1 mrg 903 1.1 mrg if (indirect) 904 1.1 mrg addr = build_va_arg_indirect_ref (addr); 905 1.1 mrg 906 1.1 mrg addr = build_va_arg_indirect_ref (addr); 907 1.1 mrg 908 1.1 mrg return addr; 909 1.1 mrg } 910 1.1 mrg 911 1.1 mrg #undef TARGET_LRA_P 913 1.1 mrg #define TARGET_LRA_P hook_bool_void_false 914 1.1 mrg 915 1.1 mrg /* Addressing Modes */ 916 1.1 mrg 917 1.1 mrg #undef TARGET_LEGITIMATE_ADDRESS_P 918 1.1 mrg #define TARGET_LEGITIMATE_ADDRESS_P msp430_legitimate_address_p 919 1.1 mrg 920 1.1 mrg static bool 921 1.1 mrg reg_ok_for_addr (rtx r, bool strict) 922 1.1 mrg { 923 1.1 mrg int rn = REGNO (r); 924 1.1 mrg 925 1.1 mrg if (strict && rn >= FIRST_PSEUDO_REGISTER) 926 1.1 mrg rn = reg_renumber[rn]; 927 1.1 mrg if (strict && 0 <= rn && rn < FIRST_PSEUDO_REGISTER) 928 1.1 mrg return true; 929 1.1 mrg if (!strict) 930 1.1 mrg return true; 931 1.1 mrg return false; 932 1.1 mrg } 933 1.1 mrg 934 1.1 mrg bool 935 1.1 mrg msp430_legitimate_address_p (machine_mode mode ATTRIBUTE_UNUSED, 936 1.1 mrg rtx x ATTRIBUTE_UNUSED, 937 1.1 mrg bool strict ATTRIBUTE_UNUSED) 938 1.1 mrg { 939 1.1 mrg switch (GET_CODE (x)) 940 1.1 mrg { 941 1.1 mrg case MEM: 942 1.1 mrg return false; 943 1.1 mrg 944 1.1 mrg case PLUS: 945 1.1 mrg case POST_INC: 946 1.1 mrg if (REG_P (XEXP (x, 0))) 947 1.1 mrg { 948 1.1 mrg if (GET_MODE (x) != GET_MODE (XEXP (x, 0))) 949 1.1 mrg return false; 950 1.1 mrg if (!reg_ok_for_addr (XEXP (x, 0), strict)) 951 1.1 mrg return false; 952 1.1 mrg if (GET_CODE (x) == POST_INC) 953 1.1 mrg /* At this point, if the original rtx was a post_inc, we don't have 954 1.1 mrg anything further to check. */ 955 1.1 mrg return true; 956 1.1 mrg switch (GET_CODE (XEXP (x, 1))) 957 1.1 mrg { 958 1.1 mrg case CONST: 959 1.1 mrg case SYMBOL_REF: 960 1.1 mrg case CONST_INT: 961 1.1 mrg return true; 962 1.1 mrg default: 963 1.1 mrg return false; 964 1.1 mrg } 965 1.1 mrg } 966 1.1 mrg return false; 967 1.1 mrg 968 1.1 mrg case REG: 969 1.1 mrg if (!reg_ok_for_addr (x, strict)) 970 1.1 mrg return false; 971 1.1 mrg /* FALLTHRU */ 972 1.1 mrg case CONST: 973 1.1 mrg case SYMBOL_REF: 974 1.1 mrg case CONST_INT: 975 1.1 mrg return true; 976 1.1 mrg 977 1.1 mrg default: 978 1.1 mrg return false; 979 1.1 mrg } 980 1.1 mrg } 981 1.1 mrg 982 1.1 mrg #undef TARGET_ADDR_SPACE_LEGITIMATE_ADDRESS_P 983 1.1 mrg #define TARGET_ADDR_SPACE_LEGITIMATE_ADDRESS_P \ 984 1.1 mrg msp430_addr_space_legitimate_address_p 985 1.1 mrg 986 1.1 mrg bool 987 1.1 mrg msp430_addr_space_legitimate_address_p (machine_mode mode, 988 1.1 mrg rtx x, 989 1.1 mrg bool strict, 990 1.1 mrg addr_space_t as ATTRIBUTE_UNUSED) 991 1.1 mrg { 992 1.1 mrg return msp430_legitimate_address_p (mode, x, strict); 993 1.1 mrg } 994 1.1 mrg 995 1.1 mrg #undef TARGET_ASM_INTEGER 996 1.1 mrg #define TARGET_ASM_INTEGER msp430_asm_integer 997 1.1 mrg static bool 998 1.1 mrg msp430_asm_integer (rtx x, unsigned int size, int aligned_p) 999 1.1 mrg { 1000 1.1 mrg int c = GET_CODE (x); 1001 1.1 mrg 1002 1.1 mrg if (size == 3 && GET_MODE (x) == PSImode) 1003 1.1 mrg size = 4; 1004 1.1 mrg 1005 1.1 mrg switch (size) 1006 1.1 mrg { 1007 1.1 mrg case 4: 1008 1.1 mrg if (c == SYMBOL_REF || c == CONST || c == LABEL_REF || c == CONST_INT 1009 1.1 mrg || c == PLUS || c == MINUS) 1010 1.1 mrg { 1011 1.1 mrg fprintf (asm_out_file, "\t.long\t"); 1012 1.1 mrg output_addr_const (asm_out_file, x); 1013 1.1 mrg fputc ('\n', asm_out_file); 1014 1.1 mrg return true; 1015 1.1 mrg } 1016 1.1 mrg break; 1017 1.1 mrg } 1018 1.1 mrg return default_assemble_integer (x, size, aligned_p); 1019 1.1 mrg } 1020 1.1 mrg 1021 1.1 mrg #undef TARGET_ASM_OUTPUT_ADDR_CONST_EXTRA 1022 1.1 mrg #define TARGET_ASM_OUTPUT_ADDR_CONST_EXTRA msp430_asm_output_addr_const_extra 1023 1.1 mrg static bool 1024 1.1 mrg msp430_asm_output_addr_const_extra (FILE *file ATTRIBUTE_UNUSED, rtx x) 1025 1.1 mrg { 1026 1.1 mrg debug_rtx (x); 1027 1.1 mrg return false; 1028 1.1 mrg } 1029 1.1 mrg 1030 1.1 mrg #undef TARGET_LEGITIMATE_CONSTANT_P 1031 1.1 mrg #define TARGET_LEGITIMATE_CONSTANT_P msp430_legitimate_constant 1032 1.1 mrg 1033 1.1 mrg static bool 1034 1.1 mrg msp430_legitimate_constant (machine_mode mode, rtx x) 1035 1.1 mrg { 1036 1.1 mrg return ! CONST_INT_P (x) 1037 1.1 mrg || mode != PSImode 1038 1.1 mrg /* GCC does not know the width of the PSImode, so make 1039 1.1 mrg sure that it does not try to use a constant value that 1040 1.1 mrg is out of range. */ 1041 1.1 mrg || (INTVAL (x) < (1 << 20) 1042 1.1 mrg && INTVAL (x) >= (HOST_WIDE_INT)(HOST_WIDE_INT_M1U << 20)); 1043 1.1 mrg } 1044 1.1 mrg 1045 1.1 mrg 1046 1.1 mrg /* Describing Relative Costs of Operations 1048 1.1 mrg To model the cost of an instruction, use the number of cycles when 1049 1.1 mrg optimizing for speed, and the number of words when optimizing for size. 1050 1.1 mrg The cheapest instruction will execute in one cycle and cost one word. 1051 1.1 mrg The cycle and size costs correspond to 430 ISA instructions, not 430X 1052 1.1 mrg instructions or 430X "address" instructions. The relative costs of 430X 1053 1.1 mrg instructions is accurately modeled with the 430 costs. The relative costs 1054 1.1 mrg of some "address" instructions can differ, but these are not yet handled. 1055 1.1 mrg Adding support for this could improve performance/code size. */ 1056 1.1 mrg 1057 1.1 mrg struct single_op_cost 1058 1.1 mrg { 1059 1.1 mrg const int reg; 1060 1.1 mrg /* Indirect register (@Rn) or indirect autoincrement (@Rn+). */ 1061 1.1 mrg const int ind; 1062 1.1 mrg const int mem; 1063 1.1 mrg }; 1064 1.1 mrg 1065 1.1 mrg static const struct single_op_cost cycle_cost_single_op = 1066 1.1 mrg { 1067 1.1 mrg 1, 3, 4 1068 1.1 mrg }; 1069 1.1 mrg 1070 1.1 mrg static const struct single_op_cost size_cost_single_op = 1071 1.1 mrg { 1072 1.1 mrg 1, 1, 2 1073 1.1 mrg }; 1074 1.1 mrg 1075 1.1 mrg /* When the destination of an insn is memory, the cost is always the same 1076 1.1 mrg regardless of whether that memory is accessed using indirect register, 1077 1.1 mrg indexed or absolute addressing. 1078 1.1 mrg When the source operand is memory, indirect register and post-increment have 1079 1.1 mrg the same cost, which is lower than indexed and absolute, which also have 1080 1.1 mrg the same cost. */ 1081 1.1 mrg struct double_op_cost 1082 1.1 mrg { 1083 1.1 mrg /* Source operand is a register. */ 1084 1.1 mrg const int r2r; 1085 1.1 mrg const int r2pc; 1086 1.1 mrg const int r2m; 1087 1.1 mrg 1088 1.1 mrg /* Source operand is memory, using indirect register (@Rn) or indirect 1089 1.1 mrg autoincrement (@Rn+) addressing modes. */ 1090 1.1 mrg const int ind2r; 1091 1.1 mrg const int ind2pc; 1092 1.1 mrg const int ind2m; 1093 1.1 mrg 1094 1.1 mrg /* Source operand is an immediate. */ 1095 1.1 mrg const int imm2r; 1096 1.1 mrg const int imm2pc; 1097 1.1 mrg const int imm2m; 1098 1.1 mrg 1099 1.1 mrg /* Source operand is memory, using indexed (x(Rn)) or absolute (&ADDR) 1100 1.1 mrg addressing modes. */ 1101 1.1 mrg const int mem2r; 1102 1.1 mrg const int mem2pc; 1103 1.1 mrg const int mem2m; 1104 1.1 mrg }; 1105 1.1 mrg 1106 1.1 mrg /* These structures describe the cost of MOV, BIT and CMP instructions, in terms 1107 1.1 mrg of clock cycles or words. */ 1108 1.1 mrg static const struct double_op_cost cycle_cost_double_op_mov = 1109 1.1 mrg { 1110 1.1 mrg 1, 3, 3, 1111 1.1 mrg 2, 4, 4, 1112 1.1 mrg 2, 3, 4, 1113 1.1 mrg 3, 5, 5 1114 1.1 mrg }; 1115 1.1 mrg 1116 1.1 mrg /* Cycle count when memory is the destination operand is one larger than above 1117 1.1 mrg for instructions that aren't MOV, BIT or CMP. */ 1118 1.1 mrg static const struct double_op_cost cycle_cost_double_op = 1119 1.1 mrg { 1120 1.1 mrg 1, 3, 4, 1121 1.1 mrg 2, 4, 5, 1122 1.1 mrg 2, 3, 5, 1123 1.1 mrg 3, 5, 6 1124 1.1 mrg }; 1125 1.1 mrg 1126 1.1 mrg static const struct double_op_cost size_cost_double_op = 1127 1.1 mrg { 1128 1.1 mrg 1, 1, 2, 1129 1.1 mrg 1, 1, 2, 1130 1.1 mrg 2, 2, 3, 1131 1.1 mrg 2, 2, 3 1132 1.1 mrg }; 1133 1.1 mrg 1134 1.1 mrg struct msp430_multlib_costs 1135 1.1 mrg { 1136 1.1 mrg const int mulhi; 1137 1.1 mrg const int mulsi; 1138 1.1 mrg const int muldi; 1139 1.1 mrg }; 1140 1.1 mrg 1141 1.1 mrg /* There is no precise size cost when using libcalls, instead it is disparaged 1142 1.1 mrg relative to other instructions. 1143 1.1 mrg The cycle costs are from the CALL to the RET, inclusive. 1144 1.1 mrg FIXME muldi cost is not accurate. */ 1145 1.1 mrg static const struct msp430_multlib_costs cycle_cost_multlib_32bit = 1146 1.1 mrg { 1147 1.1 mrg 27, 33, 66 1148 1.1 mrg }; 1149 1.1 mrg 1150 1.1 mrg /* 32bit multiply takes a few more instructions on 16bit hwmult. */ 1151 1.1 mrg static const struct msp430_multlib_costs cycle_cost_multlib_16bit = 1152 1.1 mrg { 1153 1.1 mrg 27, 42, 66 1154 1.1 mrg }; 1155 1.1 mrg 1156 1.1 mrg /* TARGET_REGISTER_MOVE_COST 1157 1.1 mrg There is only one class of general-purpose, non-fixed registers, and the 1158 1.1 mrg relative cost of moving data between them is always the same. 1159 1.1 mrg Therefore, the default of 2 is optimal. */ 1160 1.1 mrg 1161 1.1 mrg #undef TARGET_MEMORY_MOVE_COST 1162 1.1 mrg #define TARGET_MEMORY_MOVE_COST msp430_memory_move_cost 1163 1.1 mrg 1164 1.1 mrg /* Return the cost of moving data between registers and memory. 1165 1.1 mrg The returned cost must be relative to the default TARGET_REGISTER_MOVE_COST 1166 1.1 mrg of 2. 1167 1.1 mrg IN is false if the value is to be written to memory. */ 1168 1.1 mrg static int 1169 1.1 mrg msp430_memory_move_cost (machine_mode mode ATTRIBUTE_UNUSED, 1170 1.1 mrg reg_class_t rclass ATTRIBUTE_UNUSED, 1171 1.1 mrg bool in) 1172 1.1 mrg { 1173 1.1 mrg int cost; 1174 1.1 mrg const struct double_op_cost *cost_p; 1175 1.1 mrg /* Optimize with a code size focus by default, unless -O2 or above is 1176 1.1 mrg specified. */ 1177 1.1 mrg bool speed = (!optimize_size && optimize >= 2); 1178 1.1 mrg 1179 1.1 mrg cost_p = (speed ? &cycle_cost_double_op_mov : &size_cost_double_op); 1180 1.1 mrg 1181 1.1 mrg if (in) 1182 1.1 mrg /* Reading from memory using indirect addressing is assumed to be the more 1183 1.1 mrg common case. */ 1184 1.1 mrg cost = cost_p->ind2r; 1185 1.1 mrg else 1186 1.1 mrg cost = cost_p->r2m; 1187 1.1 mrg 1188 1.1 mrg /* All register to register moves cost 1 cycle or 1 word, so multiply by 2 1189 1.1 mrg to get the costs relative to TARGET_REGISTER_MOVE_COST of 2. */ 1190 1.1 mrg return 2 * cost; 1191 1.1 mrg } 1192 1.1 mrg 1193 1.1 mrg /* For X, which must be a MEM RTX, return TRUE if it is an indirect memory 1194 1.1 mrg reference, @Rn or @Rn+. */ 1195 1.1 mrg static bool 1196 1.1 mrg msp430_is_mem_indirect (rtx x) 1197 1.1 mrg { 1198 1.1 mrg gcc_assert (GET_CODE (x) == MEM); 1199 1.1 mrg rtx op0 = XEXP (x, 0); 1200 1.1 mrg return (GET_CODE (op0) == REG || GET_CODE (op0) == POST_INC); 1201 1.1 mrg } 1202 1.1 mrg 1203 1.1 mrg /* Costs of MSP430 instructions are generally based on the addressing mode 1204 1.1 mrg combination of the source and destination operands. 1205 1.1 mrg Given source operand SRC (which may be NULL to indicate a single-operand 1206 1.1 mrg instruction) and destination operand DST return the cost of this 1207 1.1 mrg expression. */ 1208 1.1 mrg static int 1209 1.1 mrg msp430_costs (rtx src, rtx dst, bool speed, rtx outer_rtx) 1210 1.1 mrg { 1211 1.1 mrg enum rtx_code src_code = GET_CODE (src); 1212 1.1 mrg enum rtx_code dst_code = GET_CODE (dst); 1213 1.1 mrg enum rtx_code outer_code = GET_CODE (outer_rtx); 1214 1.1 mrg machine_mode outer_mode = GET_MODE (outer_rtx); 1215 1.1 mrg const struct double_op_cost *cost_p; 1216 1.1 mrg cost_p = (speed ? &cycle_cost_double_op : &size_cost_double_op); 1217 1.1 mrg 1218 1.1 mrg if (outer_code == TRUNCATE 1219 1.1 mrg && (outer_mode == QImode 1220 1.1 mrg || outer_mode == HImode 1221 1.1 mrg || outer_mode == PSImode)) 1222 1.1 mrg /* Truncation to these modes is normally free as a side effect of the 1223 1.1 mrg instructions themselves. */ 1224 1.1 mrg return 0; 1225 1.1 mrg 1226 1.1 mrg if (dst_code == SYMBOL_REF 1227 1.1 mrg || dst_code == LABEL_REF 1228 1.1 mrg || dst_code == CONST_INT) 1229 1.1 mrg /* Catch RTX like (minus (const_int 0) (reg)) but don't add any cost. */ 1230 1.1 mrg return 0; 1231 1.1 mrg 1232 1.1 mrg switch (src_code) 1233 1.1 mrg { 1234 1.1 mrg case REG: 1235 1.1 mrg return (dst_code == REG ? cost_p->r2r 1236 1.1 mrg : (dst_code == PC ? cost_p->r2pc : cost_p->r2m)); 1237 1.1 mrg 1238 1.1 mrg case CONST_INT: 1239 1.1 mrg case SYMBOL_REF: 1240 1.1 mrg case LABEL_REF: 1241 1.1 mrg case CONST: 1242 1.1 mrg return (dst_code == REG ? cost_p->imm2r 1243 1.1 mrg : (dst_code == PC ? cost_p->imm2pc : cost_p->imm2m)); 1244 1.1 mrg 1245 1.1 mrg 1246 1.1 mrg case MEM: 1247 1.1 mrg if (msp430_is_mem_indirect (src)) 1248 1.1 mrg return (dst_code == REG ? cost_p->ind2r : (dst_code == PC 1249 1.1 mrg ? cost_p->ind2pc 1250 1.1 mrg : cost_p->ind2m)); 1251 1.1 mrg else 1252 1.1 mrg return (dst_code == REG ? cost_p->mem2r : (dst_code == PC 1253 1.1 mrg ? cost_p->mem2pc 1254 1.1 mrg : cost_p->mem2m)); 1255 1.1 mrg default: 1256 1.1 mrg return cost_p->mem2m; 1257 1.1 mrg } 1258 1.1 mrg } 1259 1.1 mrg 1260 1.1 mrg /* Given source operand SRC and destination operand DST from the shift or 1261 1.1 mrg rotate RTX OUTER_RTX, return the cost of performing that shift, assuming 1262 1.1 mrg optimization for speed when SPEED is true. */ 1263 1.1 mrg static int 1264 1.1 mrg msp430_shift_costs (rtx src, rtx dst, bool speed, rtx outer_rtx) 1265 1.1 mrg { 1266 1.1 mrg int amt; 1267 1.1 mrg enum rtx_code src_code = GET_CODE (src); 1268 1.1 mrg enum rtx_code dst_code = GET_CODE (dst); 1269 1.1 mrg const struct single_op_cost *cost_p; 1270 1.1 mrg 1271 1.1 mrg cost_p = (speed ? &cycle_cost_single_op : &size_cost_single_op); 1272 1.1 mrg 1273 1.1 mrg if (src_code != CONST_INT) 1274 1.1 mrg /* The size or speed cost when the shift amount is unknown cannot be 1275 1.1 mrg accurately calculated, so just disparage it slightly. */ 1276 1.1 mrg return 2 * msp430_costs (src, dst, speed, outer_rtx); 1277 1.1 mrg 1278 1.1 mrg if (use_helper_for_const_shift (GET_MODE (outer_rtx), amt = INTVAL (src))) 1279 1.1 mrg { 1280 1.1 mrg /* GCC sometimes tries to perform shifts in some very inventive ways, 1281 1.1 mrg resulting in much larger code size usage than necessary, if 1282 1.1 mrg they are disparaged too much here. So in general, if 1283 1.1 mrg use_helper_for_const_shift thinks a helper should be used, obey 1284 1.1 mrg that and don't disparage the shift any more than a regular 1285 1.1 mrg instruction, even though the shift may actually cost more. 1286 1.1 mrg This ensures that the RTL generated at the initial expand pass has the 1287 1.1 mrg expected shift instructions, which can be mapped to the helper 1288 1.1 mrg functions. */ 1289 1.1 mrg return msp430_costs (src, dst, speed, outer_rtx); 1290 1.1 mrg } 1291 1.1 mrg 1292 1.1 mrg if (!msp430x) 1293 1.1 mrg { 1294 1.1 mrg /* Each shift by one place will be emitted individually. */ 1295 1.1 mrg switch (dst_code) 1296 1.1 mrg { 1297 1.1 mrg case REG: 1298 1.1 mrg case CONST_INT: 1299 1.1 mrg return amt * cost_p->reg; 1300 1.1 mrg case MEM: 1301 1.1 mrg if (msp430_is_mem_indirect (dst)) 1302 1.1 mrg return amt * cost_p->ind; 1303 1.1 mrg else 1304 1.1 mrg return amt * cost_p->mem; 1305 1.1 mrg default: 1306 1.1 mrg return amt * cost_p->mem; 1307 1.1 mrg } 1308 1.1 mrg } 1309 1.1 mrg 1310 1.1 mrg /* RRAM, RRCM, RRUM, RLAM are used for shift counts <= 4, otherwise, the 'X' 1311 1.1 mrg versions are used. 1312 1.1 mrg Instructions which shift a MEM operand will never actually be output. It 1313 1.1 mrg will always be copied into a register to allow for efficient shifting. So 1314 1.1 mrg the cost just takes into account the cost of an additional copy in that 1315 1.1 mrg case. */ 1316 1.1 mrg return (amt <= 4 ? (speed ? amt : 1) : (speed ? amt + 1 : 2) 1317 1.1 mrg + (dst_code == REG ? 0 1318 1.1 mrg : msp430_costs (dst, gen_rtx_REG (HImode, 10), speed, outer_rtx))); 1319 1.1 mrg } 1320 1.1 mrg 1321 1.1 mrg /* Given source operand SRC and destination operand DST from the MULT/DIV/MOD 1322 1.1 mrg RTX OUTER_RTX, return the cost of performing that operation, assuming 1323 1.1 mrg optimization for speed when SPEED is true. */ 1324 1.1 mrg static int 1325 1.1 mrg msp430_muldiv_costs (rtx src, rtx dst, bool speed, rtx outer_rtx, 1326 1.1 mrg machine_mode outer_mode) 1327 1.1 mrg { 1328 1.1 mrg enum rtx_code outer_code = GET_CODE (outer_rtx); 1329 1.1 mrg const struct msp430_multlib_costs *cost_p; 1330 1.1 mrg cost_p = (msp430_use_16bit_hwmult () 1331 1.1 mrg ? &cycle_cost_multlib_32bit 1332 1.1 mrg : &cycle_cost_multlib_16bit); 1333 1.1 mrg 1334 1.1 mrg int factor = 1; 1335 1.1 mrg /* Only used in some calculations. */ 1336 1.1 mrg int mode_factor = 1; 1337 1.1 mrg if (outer_mode == SImode) 1338 1.1 mrg mode_factor = 2; 1339 1.1 mrg else if (outer_mode == PSImode) 1340 1.1 mrg /* PSImode multiplication is performed using SImode operands, so has extra 1341 1.1 mrg cost to factor in the conversions necessary before/after the 1342 1.1 mrg operation. */ 1343 1.1 mrg mode_factor = 3; 1344 1.1 mrg else if (outer_mode == DImode) 1345 1.1 mrg mode_factor = 4; 1346 1.1 mrg 1347 1.1 mrg if (!speed) 1348 1.1 mrg { 1349 1.1 mrg /* The codesize cost of using a helper function to perform the 1350 1.1 mrg multiplication or division cannot be accurately calculated, since the 1351 1.1 mrg cost depends on how many times the operation is performed in the 1352 1.1 mrg entire program. */ 1353 1.1 mrg if (outer_code != MULT) 1354 1.1 mrg /* Division is always expensive. */ 1355 1.1 mrg factor = 7; 1356 1.1 mrg else if (((msp430_use_16bit_hwmult () && outer_mode != DImode) 1357 1.1 mrg || msp430_use_32bit_hwmult () 1358 1.1 mrg || msp430_use_f5_series_hwmult ())) 1359 1.1 mrg /* When the hardware multiplier is available, only disparage 1360 1.1 mrg slightly. */ 1361 1.1 mrg factor = 2; 1362 1.1 mrg else 1363 1.1 mrg factor = 5; 1364 1.1 mrg return factor * mode_factor * msp430_costs (src, dst, speed, outer_rtx); 1365 1.1 mrg } 1366 1.1 mrg 1367 1.1 mrg /* When there is hardware multiply support, there is a relatively low, fixed 1368 1.1 mrg cycle cost to performing any multiplication, but when there is no hardware 1369 1.1 mrg multiply support it is very costly. That precise cycle cost has not been 1370 1.1 mrg calculated here. 1371 1.1 mrg Division is extra slow since it always uses a software library. 1372 1.1 mrg The 16-bit hardware multiply library cannot be used to produce 64-bit 1373 1.1 mrg results. */ 1374 1.1 mrg if (outer_code != MULT || !msp430_has_hwmult () 1375 1.1 mrg || (outer_mode == DImode && msp430_use_16bit_hwmult ())) 1376 1.1 mrg { 1377 1.1 mrg factor = (outer_code == MULT ? 50 : 70); 1378 1.1 mrg return factor * mode_factor * msp430_costs (src, dst, speed, outer_rtx); 1379 1.1 mrg } 1380 1.1 mrg 1381 1.1 mrg switch (outer_mode) 1382 1.1 mrg { 1383 1.1 mrg case E_QImode: 1384 1.1 mrg case E_HImode: 1385 1.1 mrg /* Include the cost of copying the operands into and out of the hardware 1386 1.1 mrg multiply routine. */ 1387 1.1 mrg return cost_p->mulhi + (3 * msp430_costs (src, dst, speed, outer_rtx)); 1388 1.1 mrg 1389 1.1 mrg case E_PSImode: 1390 1.1 mrg /* Extra factor for the conversions necessary to do PSI->SI before the 1391 1.1 mrg operation. */ 1392 1.1 mrg factor = 2; 1393 1.1 mrg /* fallthru. */ 1394 1.1 mrg case E_SImode: 1395 1.1 mrg return factor * (cost_p->mulsi 1396 1.1 mrg + (6 * msp430_costs (src, dst, speed, outer_rtx))); 1397 1.1 mrg 1398 1.1 mrg case E_DImode: 1399 1.1 mrg default: 1400 1.1 mrg return cost_p->muldi + (12 * msp430_costs (src, dst, speed, outer_rtx)); 1401 1.1 mrg } 1402 1.1 mrg } 1403 1.1 mrg 1404 1.1 mrg /* Recurse within X to find the actual destination operand of the expression. 1405 1.1 mrg For example: 1406 1.1 mrg (plus (ashift (minus (ashift (reg) 1407 1.1 mrg (const_int) ...... 1408 1.1 mrg should return the reg RTX. */ 1409 1.1 mrg static rtx 1410 1.1 mrg msp430_get_inner_dest_code (rtx x) 1411 1.1 mrg { 1412 1.1 mrg enum rtx_code code = GET_CODE (x); 1413 1.1 mrg rtx op0 = XEXP (x, 0); 1414 1.1 mrg switch (code) 1415 1.1 mrg { 1416 1.1 mrg case REG: 1417 1.1 mrg case SYMBOL_REF: 1418 1.1 mrg case CONST_INT: 1419 1.1 mrg case CONST: 1420 1.1 mrg case LABEL_REF: 1421 1.1 mrg return x; 1422 1.1 mrg 1423 1.1 mrg case MEM: 1424 1.1 mrg /* Return the MEM expr not the inner REG for these cases. */ 1425 1.1 mrg switch (GET_CODE (op0)) 1426 1.1 mrg { 1427 1.1 mrg case REG: 1428 1.1 mrg case SYMBOL_REF: 1429 1.1 mrg case LABEL_REF: 1430 1.1 mrg case CONST: 1431 1.1 mrg case POST_INC: 1432 1.1 mrg return x; 1433 1.1 mrg 1434 1.1 mrg case PLUS: 1435 1.1 mrg /* return MEM (PLUS (REG) (CONST)) */ 1436 1.1 mrg if (GET_CODE (XEXP (op0, 0)) == REG) 1437 1.1 mrg { 1438 1.1 mrg if (GET_CODE (XEXP (op0, 1)) == CONST_INT 1439 1.1 mrg || GET_CODE (XEXP (op0, 1)) == CONST 1440 1.1 mrg || GET_CODE (XEXP (op0, 1)) == LABEL_REF 1441 1.1 mrg || GET_CODE (XEXP (op0, 1)) == SYMBOL_REF) 1442 1.1 mrg return x; 1443 1.1 mrg else 1444 1.1 mrg return msp430_get_inner_dest_code (op0); 1445 1.1 mrg } 1446 1.1 mrg return msp430_get_inner_dest_code (op0); 1447 1.1 mrg 1448 1.1 mrg default: 1449 1.1 mrg if (GET_RTX_FORMAT (code)[0] != 'e') 1450 1.1 mrg return x; 1451 1.1 mrg return msp430_get_inner_dest_code (op0); 1452 1.1 mrg } 1453 1.1 mrg break; 1454 1.1 mrg 1455 1.1 mrg default: 1456 1.1 mrg if (op0 == NULL_RTX) 1457 1.1 mrg gcc_unreachable (); 1458 1.1 mrg else 1459 1.1 mrg { 1460 1.1 mrg if (GET_RTX_FORMAT (code)[0] != 'e' 1461 1.1 mrg && code != ENTRY_VALUE) 1462 1.1 mrg return x; 1463 1.1 mrg return msp430_get_inner_dest_code (op0); 1464 1.1 mrg } 1465 1.1 mrg } 1466 1.1 mrg } 1467 1.1 mrg 1468 1.1 mrg /* Calculate the cost of an MSP430 single-operand instruction, for operand DST 1469 1.1 mrg within the RTX OUTER_RTX, optimizing for speed if SPEED is true. */ 1470 1.1 mrg static int 1471 1.1 mrg msp430_single_op_cost (rtx dst, bool speed, rtx outer_rtx) 1472 1.1 mrg { 1473 1.1 mrg enum rtx_code dst_code = GET_CODE (dst); 1474 1.1 mrg const struct single_op_cost *cost_p; 1475 1.1 mrg const struct double_op_cost *double_op_cost_p; 1476 1.1 mrg 1477 1.1 mrg cost_p = (speed ? &cycle_cost_single_op : &size_cost_single_op); 1478 1.1 mrg double_op_cost_p = (speed ? &cycle_cost_double_op : &size_cost_double_op); 1479 1.1 mrg 1480 1.1 mrg switch (dst_code) 1481 1.1 mrg { 1482 1.1 mrg case REG: 1483 1.1 mrg return cost_p->reg; 1484 1.1 mrg case MEM: 1485 1.1 mrg if (msp430_is_mem_indirect (dst)) 1486 1.1 mrg return cost_p->ind; 1487 1.1 mrg else 1488 1.1 mrg return cost_p->mem; 1489 1.1 mrg 1490 1.1 mrg case CONST_INT: 1491 1.1 mrg case CONST_FIXED: 1492 1.1 mrg case CONST_DOUBLE: 1493 1.1 mrg case SYMBOL_REF: 1494 1.1 mrg case CONST: 1495 1.1 mrg /* A constant value would need to be copied into a register first. */ 1496 1.1 mrg return double_op_cost_p->imm2r + cost_p->reg; 1497 1.1 mrg 1498 1.1 mrg default: 1499 1.1 mrg return cost_p->mem; 1500 1.1 mrg } 1501 1.1 mrg } 1502 1.1 mrg 1503 1.1 mrg #undef TARGET_RTX_COSTS 1504 1.1 mrg #define TARGET_RTX_COSTS msp430_rtx_costs 1505 1.1 mrg 1506 1.1 mrg /* This target hook describes the relative costs of RTL expressions. 1507 1.1 mrg The function recurses to just before the lowest level of the expression, 1508 1.1 mrg when both of the operands of the expression can be examined at the same time. 1509 1.1 mrg This is because the cost of the expression depends on the specific 1510 1.1 mrg addressing mode combination of the operands. 1511 1.1 mrg The hook returns true when all subexpressions of X have been processed, and 1512 1.1 mrg false when rtx_cost should recurse. */ 1513 1.1 mrg static bool 1514 1.1 mrg msp430_rtx_costs (rtx x, 1515 1.1 mrg machine_mode mode, 1516 1.1 mrg int outer_code ATTRIBUTE_UNUSED, 1517 1.1 mrg int opno ATTRIBUTE_UNUSED, 1518 1.1 mrg int * total, 1519 1.1 mrg bool speed) 1520 1.1 mrg { 1521 1.1 mrg enum rtx_code code = GET_CODE (x); 1522 1.1 mrg rtx dst, src; 1523 1.1 mrg rtx dst_inner, src_inner; 1524 1.1 mrg 1525 1.1 mrg *total = 0; 1526 1.1 mrg dst = XEXP (x, 0); 1527 1.1 mrg if (GET_RTX_LENGTH (code) == 1) 1528 1.1 mrg /* Some RTX that are single-op in GCC are double-op when translated to 1529 1.1 mrg MSP430 instructions e.g NOT, NEG, ZERO_EXTEND. */ 1530 1.1 mrg src = dst; 1531 1.1 mrg else 1532 1.1 mrg src = XEXP (x, 1); 1533 1.1 mrg 1534 1.1 mrg 1535 1.1 mrg switch (code) 1536 1.1 mrg { 1537 1.1 mrg case SET: 1538 1.1 mrg /* Ignoring SET improves codesize. */ 1539 1.1 mrg if (!speed) 1540 1.1 mrg return true; 1541 1.1 mrg /* fallthru. */ 1542 1.1 mrg case PLUS: 1543 1.1 mrg if (outer_code == MEM) 1544 1.1 mrg /* Do not add any cost for the plus itself, but recurse in case there 1545 1.1 mrg are more complicated RTX inside. */ 1546 1.1 mrg return false; 1547 1.1 mrg /* fallthru. */ 1548 1.1 mrg case MINUS: 1549 1.1 mrg case AND: 1550 1.1 mrg case IOR: 1551 1.1 mrg case XOR: 1552 1.1 mrg case NOT: 1553 1.1 mrg case ZERO_EXTEND: 1554 1.1 mrg case TRUNCATE: 1555 1.1 mrg case NEG: 1556 1.1 mrg case ZERO_EXTRACT: 1557 1.1 mrg case SIGN_EXTRACT: 1558 1.1 mrg case IF_THEN_ELSE: 1559 1.1 mrg dst_inner = msp430_get_inner_dest_code (dst); 1560 1.1 mrg src_inner = msp430_get_inner_dest_code (src); 1561 1.1 mrg *total = COSTS_N_INSNS (msp430_costs (src_inner, dst_inner, speed, x)); 1562 1.1 mrg if (mode == SImode) 1563 1.1 mrg *total *= 2; 1564 1.1 mrg if (mode == DImode) 1565 1.1 mrg *total *= 4; 1566 1.1 mrg return false; 1567 1.1 mrg 1568 1.1 mrg case ROTATE: 1569 1.1 mrg case ASHIFT: 1570 1.1 mrg case ASHIFTRT: 1571 1.1 mrg case LSHIFTRT: 1572 1.1 mrg dst_inner = msp430_get_inner_dest_code (dst); 1573 1.1 mrg src_inner = msp430_get_inner_dest_code (src); 1574 1.1 mrg *total = COSTS_N_INSNS (msp430_shift_costs (src_inner, dst_inner, 1575 1.1 mrg speed, x)); 1576 1.1 mrg if (mode == SImode) 1577 1.1 mrg *total *= 2; 1578 1.1 mrg if (mode == DImode) 1579 1.1 mrg *total *= 4; 1580 1.1 mrg return false; 1581 1.1 mrg 1582 1.1 mrg case MULT: 1583 1.1 mrg case DIV: 1584 1.1 mrg case MOD: 1585 1.1 mrg case UDIV: 1586 1.1 mrg case UMOD: 1587 1.1 mrg dst_inner = msp430_get_inner_dest_code (dst); 1588 1.1 mrg src_inner = msp430_get_inner_dest_code (src); 1589 1.1 mrg *total = COSTS_N_INSNS (msp430_muldiv_costs (src_inner, dst_inner, speed, 1590 1.1 mrg x, mode)); 1591 1.1 mrg return false; 1592 1.1 mrg 1593 1.1 mrg case CALL: 1594 1.1 mrg case SIGN_EXTEND: 1595 1.1 mrg dst_inner = msp430_get_inner_dest_code (dst); 1596 1.1 mrg *total = COSTS_N_INSNS (msp430_single_op_cost (dst_inner, speed, x)); 1597 1.1 mrg if (mode == SImode) 1598 1.1 mrg *total *= 2; 1599 1.1 mrg if (mode == DImode) 1600 1.1 mrg *total *= 4; 1601 1.1 mrg return false; 1602 1.1 mrg 1603 1.1 mrg case CONST_INT: 1604 1.1 mrg case CONST_FIXED: 1605 1.1 mrg case CONST_DOUBLE: 1606 1.1 mrg case SYMBOL_REF: 1607 1.1 mrg case CONST: 1608 1.1 mrg case LABEL_REF: 1609 1.1 mrg case REG: 1610 1.1 mrg case PC: 1611 1.1 mrg case POST_INC: 1612 1.1 mrg if (mode == SImode) 1613 1.1 mrg *total = COSTS_N_INSNS (2); 1614 1.1 mrg else if (mode == DImode) 1615 1.1 mrg *total = COSTS_N_INSNS (4); 1616 1.1 mrg return true; 1617 1.1 mrg 1618 1.1 mrg case MEM: 1619 1.1 mrg /* PSImode operands are expensive when in memory. */ 1620 1.1 mrg if (mode == PSImode) 1621 1.1 mrg *total = COSTS_N_INSNS (1); 1622 1.1 mrg else if (mode == SImode) 1623 1.1 mrg *total = COSTS_N_INSNS (2); 1624 1.1 mrg else if (mode == DImode) 1625 1.1 mrg *total = COSTS_N_INSNS (4); 1626 1.1 mrg /* Recurse into the MEM. */ 1627 1.1 mrg return false; 1628 1.1 mrg 1629 1.1 mrg case EQ: 1630 1.1 mrg case NE: 1631 1.1 mrg case GT: 1632 1.1 mrg case GTU: 1633 1.1 mrg case GE: 1634 1.1 mrg case GEU: 1635 1.1 mrg case LT: 1636 1.1 mrg case LTU: 1637 1.1 mrg case LE: 1638 1.1 mrg case LEU: 1639 1.1 mrg /* Conditions are mostly equivalent, changing their relative 1640 1.1 mrg costs has no effect. */ 1641 1.1 mrg return false; 1642 1.1 mrg 1643 1.1 mrg case ASM_OPERANDS: 1644 1.1 mrg case ASM_INPUT: 1645 1.1 mrg case CLOBBER: 1646 1.1 mrg case COMPARE: 1647 1.1 mrg case CONCAT: 1648 1.1 mrg case ENTRY_VALUE: 1649 1.1 mrg /* Other unhandled expressions. */ 1650 1.1 mrg return false; 1651 1.1 mrg 1652 1.1 mrg default: 1653 1.1 mrg return false; 1654 1.1 mrg } 1655 1.1 mrg } 1656 1.1 mrg 1657 1.1 mrg #undef TARGET_INSN_COST 1658 1.1 mrg #define TARGET_INSN_COST msp430_insn_cost 1659 1.1 mrg 1660 1.1 mrg static int 1661 1.1 mrg msp430_insn_cost (rtx_insn *insn, bool speed ATTRIBUTE_UNUSED) 1662 1.1 mrg { 1663 1.1 mrg if (recog_memoized (insn) < 0) 1664 1.1 mrg return 0; 1665 1.1 mrg 1666 1.1 mrg /* The returned cost must be relative to COSTS_N_INSNS (1). An insn with a 1667 1.1 mrg length of 2 bytes is the smallest possible size and so must be equivalent 1668 1.1 mrg to COSTS_N_INSNS (1). */ 1669 1.1 mrg return COSTS_N_INSNS (get_attr_length (insn) / 2); 1670 1.1 mrg 1671 1.1 mrg /* FIXME Add more detailed costs when optimizing for speed. 1672 1.1 mrg For now the length of the instruction is a good approximiation and roughly 1673 1.1 mrg correlates with cycle cost. */ 1674 1.1 mrg } 1675 1.1 mrg 1676 1.1 mrg 1677 1.1 mrg /* Function Entry and Exit */ 1679 1.1 mrg 1680 1.1 mrg /* The MSP430 call frame looks like this: 1681 1.1 mrg 1682 1.1 mrg <higher addresses> 1683 1.1 mrg +--------------------+ 1684 1.1 mrg | | 1685 1.1 mrg | Stack Arguments | 1686 1.1 mrg | | 1687 1.1 mrg +--------------------+ <-- "arg pointer" 1688 1.1 mrg | | 1689 1.1 mrg | PC from call | (2 bytes for 430, 4 for TARGET_LARGE) 1690 1.1 mrg | | 1691 1.1 mrg +--------------------+ 1692 1.1 mrg | SR if this func has| 1693 1.1 mrg | been called via an | 1694 1.1 mrg | interrupt. | 1695 1.1 mrg +--------------------+ <-- SP before prologue, also AP 1696 1.1 mrg | | 1697 1.1 mrg | Saved Regs | (2 bytes per reg for 430, 4 per for TARGET_LARGE) 1698 1.1 mrg | | 1699 1.1 mrg +--------------------+ <-- "frame pointer" 1700 1.1 mrg | | 1701 1.1 mrg | Locals | 1702 1.1 mrg | | 1703 1.1 mrg +--------------------+ 1704 1.1 mrg | | 1705 1.1 mrg | Outgoing Args | 1706 1.1 mrg | | 1707 1.1 mrg +--------------------+ <-- SP during function 1708 1.1 mrg <lower addresses> 1709 1.1 mrg 1710 1.1 mrg */ 1711 1.1 mrg 1712 1.1 mrg /* We use this to wrap all emitted insns in the prologue, so they get 1713 1.1 mrg the "frame-related" (/f) flag set. */ 1714 1.1 mrg static rtx 1715 1.1 mrg F (rtx x) 1716 1.1 mrg { 1717 1.1 mrg RTX_FRAME_RELATED_P (x) = 1; 1718 1.1 mrg return x; 1719 1.1 mrg } 1720 1.1 mrg 1721 1.1 mrg /* This is the one spot that decides if a register is to be saved and 1722 1.1 mrg restored in the prologue/epilogue. */ 1723 1.1 mrg static bool 1724 1.1 mrg msp430_preserve_reg_p (int regno) 1725 1.1 mrg { 1726 1.1 mrg /* PC, SP, SR, and the constant generator. */ 1727 1.1 mrg if (regno <= 3) 1728 1.1 mrg return false; 1729 1.1 mrg 1730 1.1 mrg /* FIXME: add interrupt, EH, etc. */ 1731 1.1 mrg if (crtl->calls_eh_return) 1732 1.1 mrg return true; 1733 1.1 mrg 1734 1.1 mrg /* Shouldn't be more than the above, but just in case... */ 1735 1.1 mrg if (fixed_regs[regno]) 1736 1.1 mrg return false; 1737 1.1 mrg 1738 1.1 mrg /* For interrupt functions we must save and restore the used regs that 1739 1.1 mrg would normally be caller-saved (R11->R15). */ 1740 1.1 mrg if (msp430_is_interrupt_func () && regno >= 11 && regno <= 15) 1741 1.1 mrg { 1742 1.1 mrg if (crtl->is_leaf && df_regs_ever_live_p (regno)) 1743 1.1 mrg /* If the interrupt func is a leaf then we only need to restore the 1744 1.1 mrg caller-saved regs that are used. */ 1745 1.1 mrg return true; 1746 1.1 mrg else if (!crtl->is_leaf) 1747 1.1 mrg /* If the interrupt function is not a leaf we must save all 1748 1.1 mrg caller-saved regs in case the callee modifies them. */ 1749 1.1 mrg return true; 1750 1.1 mrg } 1751 1.1 mrg 1752 1.1 mrg if (!call_used_or_fixed_reg_p (regno) 1753 1.1 mrg && df_regs_ever_live_p (regno)) 1754 1.1 mrg return true; 1755 1.1 mrg 1756 1.1 mrg return false; 1757 1.1 mrg } 1758 1.1 mrg 1759 1.1 mrg /* Compute all the frame-related fields in our machine_function 1760 1.1 mrg structure. */ 1761 1.1 mrg static void 1762 1.1 mrg msp430_compute_frame_info (void) 1763 1.1 mrg { 1764 1.1 mrg int i; 1765 1.1 mrg 1766 1.1 mrg cfun->machine->computed = 1; 1767 1.1 mrg cfun->machine->framesize_regs = 0; 1768 1.1 mrg cfun->machine->framesize_locals = get_frame_size (); 1769 1.1 mrg cfun->machine->framesize_outgoing = crtl->outgoing_args_size; 1770 1.1 mrg 1771 1.1 mrg for (i = 0; i < ARG_POINTER_REGNUM; i ++) 1772 1.1 mrg if (msp430_preserve_reg_p (i)) 1773 1.1 mrg { 1774 1.1 mrg cfun->machine->need_to_save[i] = 1; 1775 1.1 mrg cfun->machine->framesize_regs += (TARGET_LARGE ? 4 : 2); 1776 1.1 mrg } 1777 1.1 mrg else 1778 1.1 mrg cfun->machine->need_to_save[i] = 0; 1779 1.1 mrg 1780 1.1 mrg if ((cfun->machine->framesize_locals + cfun->machine->framesize_outgoing) & 1) 1781 1.1 mrg cfun->machine->framesize_locals ++; 1782 1.1 mrg 1783 1.1 mrg cfun->machine->framesize = (cfun->machine->framesize_regs 1784 1.1 mrg + cfun->machine->framesize_locals 1785 1.1 mrg + cfun->machine->framesize_outgoing); 1786 1.1 mrg } 1787 1.1 mrg 1788 1.1 mrg /* Attribute Handling. */ 1789 1.1 mrg 1790 1.1 mrg const char * const ATTR_INTR = "interrupt"; 1791 1.1 mrg const char * const ATTR_WAKEUP = "wakeup"; 1792 1.1 mrg const char * const ATTR_NAKED = "naked"; 1793 1.1 mrg const char * const ATTR_REENT = "reentrant"; 1794 1.1 mrg const char * const ATTR_CRIT = "critical"; 1795 1.1 mrg const char * const ATTR_LOWER = "lower"; 1796 1.1 mrg const char * const ATTR_UPPER = "upper"; 1797 1.1 mrg const char * const ATTR_EITHER = "either"; 1798 1.1 mrg const char * const ATTR_NOINIT = "noinit"; 1799 1.1 mrg const char * const ATTR_PERSIST = "persistent"; 1800 1.1 mrg 1801 1.1 mrg static inline bool 1802 1.1 mrg has_attr (const char * attr, tree decl) 1803 1.1 mrg { 1804 1.1 mrg if (decl == NULL_TREE) 1805 1.1 mrg return false; 1806 1.1 mrg return lookup_attribute (attr, DECL_ATTRIBUTES (decl)) != NULL_TREE; 1807 1.1 mrg } 1808 1.1 mrg 1809 1.1 mrg static bool 1810 1.1 mrg is_interrupt_func (tree decl = current_function_decl) 1811 1.1 mrg { 1812 1.1 mrg return has_attr (ATTR_INTR, decl); 1813 1.1 mrg } 1814 1.1 mrg 1815 1.1 mrg /* Returns true if the current function has the "interrupt" attribute. */ 1816 1.1 mrg 1817 1.1 mrg bool 1818 1.1 mrg msp430_is_interrupt_func (void) 1819 1.1 mrg { 1820 1.1 mrg return is_interrupt_func (current_function_decl); 1821 1.1 mrg } 1822 1.1 mrg 1823 1.1 mrg static bool 1824 1.1 mrg is_wakeup_func (tree decl = current_function_decl) 1825 1.1 mrg { 1826 1.1 mrg return is_interrupt_func (decl) && has_attr (ATTR_WAKEUP, decl); 1827 1.1 mrg } 1828 1.1 mrg 1829 1.1 mrg static inline bool 1830 1.1 mrg is_naked_func (tree decl = current_function_decl) 1831 1.1 mrg { 1832 1.1 mrg return has_attr (ATTR_NAKED, decl); 1833 1.1 mrg } 1834 1.1 mrg 1835 1.1 mrg static inline bool 1836 1.1 mrg is_reentrant_func (tree decl = current_function_decl) 1837 1.1 mrg { 1838 1.1 mrg return has_attr (ATTR_REENT, decl); 1839 1.1 mrg } 1840 1.1 mrg 1841 1.1 mrg static inline bool 1842 1.1 mrg is_critical_func (tree decl = current_function_decl) 1843 1.1 mrg { 1844 1.1 mrg return has_attr (ATTR_CRIT, decl); 1845 1.1 mrg } 1846 1.1 mrg 1847 1.1 mrg static bool 1848 1.1 mrg has_section_name (const char * name, tree decl = current_function_decl) 1849 1.1 mrg { 1850 1.1 mrg if (decl == NULL_TREE) 1851 1.1 mrg return false; 1852 1.1 mrg return (DECL_SECTION_NAME (decl) 1853 1.1 mrg && (strcmp (name, DECL_SECTION_NAME (decl)) == 0)); 1854 1.1 mrg } 1855 1.1 mrg 1856 1.1 mrg #undef TARGET_ALLOCATE_STACK_SLOTS_FOR_ARGS 1857 1.1 mrg #define TARGET_ALLOCATE_STACK_SLOTS_FOR_ARGS \ 1858 1.1 mrg msp430_allocate_stack_slots_for_args 1859 1.1 mrg 1860 1.1 mrg static bool 1861 1.1 mrg msp430_allocate_stack_slots_for_args (void) 1862 1.1 mrg { 1863 1.1 mrg /* Naked functions should not allocate stack slots for arguments. */ 1864 1.1 mrg return ! is_naked_func (); 1865 1.1 mrg } 1866 1.1 mrg 1867 1.1 mrg #undef TARGET_WARN_FUNC_RETURN 1868 1.1 mrg #define TARGET_WARN_FUNC_RETURN msp430_warn_func_return 1869 1.1 mrg 1870 1.1 mrg static bool 1871 1.1 mrg msp430_warn_func_return (tree decl) 1872 1.1 mrg { 1873 1.1 mrg /* Naked functions are implemented entirely in assembly, including the 1874 1.1 mrg return sequence, so suppress warnings about this. */ 1875 1.1 mrg return !is_naked_func (decl); 1876 1.1 mrg } 1877 1.1 mrg 1878 1.1 mrg /* Verify MSP430 specific attributes. */ 1879 1.1 mrg #define TREE_NAME_EQ(NAME, STR) (strcmp (IDENTIFIER_POINTER (NAME), (STR)) == 0) 1880 1.1 mrg 1881 1.1 mrg static tree 1882 1.1 mrg msp430_attr (tree * node, 1883 1.1 mrg tree name, 1884 1.1 mrg tree args, 1885 1.1 mrg int flags ATTRIBUTE_UNUSED, 1886 1.1 mrg bool * no_add_attrs) 1887 1.1 mrg { 1888 1.1 mrg gcc_assert (DECL_P (* node)); 1889 1.1 mrg 1890 1.1 mrg /* Only the interrupt attribute takes an argument. */ 1891 1.1 mrg if (args != NULL) 1892 1.1 mrg { 1893 1.1 mrg tree value = TREE_VALUE (args); 1894 1.1 mrg 1895 1.1 mrg switch (TREE_CODE (value)) 1896 1.1 mrg { 1897 1.1 mrg case STRING_CST: 1898 1.1 mrg if ( strcmp (TREE_STRING_POINTER (value), "reset") 1899 1.1 mrg && strcmp (TREE_STRING_POINTER (value), "nmi") 1900 1.1 mrg && strcmp (TREE_STRING_POINTER (value), "watchdog")) 1901 1.1 mrg /* Allow the attribute to be added - the linker script 1902 1.1 mrg being used may still recognise this name. */ 1903 1.1 mrg warning (OPT_Wattributes, 1904 1.1 mrg "unrecognized interrupt vector argument of %qE attribute", 1905 1.1 mrg name); 1906 1.1 mrg break; 1907 1.1 mrg 1908 1.1 mrg case INTEGER_CST: 1909 1.1 mrg if (wi::gtu_p (wi::to_wide (value), 63)) 1910 1.1 mrg /* Allow the attribute to be added - the linker script 1911 1.1 mrg being used may still recognise this value. */ 1912 1.1 mrg warning (OPT_Wattributes, 1913 1.1 mrg "numeric argument of %qE attribute must be in range [0-63]", 1914 1.1 mrg name); 1915 1.1 mrg break; 1916 1.1 mrg 1917 1.1 mrg default: 1918 1.1 mrg warning (OPT_Wattributes, 1919 1.1 mrg "argument of %qE attribute is not a string constant " 1920 1.1 mrg "or number", name); 1921 1.1 mrg *no_add_attrs = true; 1922 1.1 mrg break; 1923 1.1 mrg } 1924 1.1 mrg } 1925 1.1 mrg 1926 1.1 mrg const char * message = NULL; 1927 1.1 mrg 1928 1.1 mrg if (TREE_CODE (* node) != FUNCTION_DECL) 1929 1.1 mrg { 1930 1.1 mrg message = "%qE attribute only applies to functions"; 1931 1.1 mrg } 1932 1.1 mrg else if (TREE_NAME_EQ (name, ATTR_INTR)) 1933 1.1 mrg { 1934 1.1 mrg if (TREE_CODE (TREE_TYPE (* node)) == FUNCTION_TYPE 1935 1.1 mrg && ! VOID_TYPE_P (TREE_TYPE (TREE_TYPE (* node)))) 1936 1.1 mrg message = "interrupt handlers must be void"; 1937 1.1 mrg else 1938 1.1 mrg { 1939 1.1 mrg /* Ensure interrupt handlers never get optimised out. */ 1940 1.1 mrg TREE_USED (* node) = 1; 1941 1.1 mrg DECL_PRESERVE_P (* node) = 1; 1942 1.1 mrg } 1943 1.1 mrg if (is_critical_func (* node)) 1944 1.1 mrg { 1945 1.1 mrg /* We always ignore the critical attribute when interrupt and 1946 1.1 mrg critical are used together. */ 1947 1.1 mrg warning (OPT_Wattributes, 1948 1.1 mrg "critical attribute has no effect on interrupt functions"); 1949 1.1 mrg DECL_ATTRIBUTES (*node) = remove_attribute (ATTR_CRIT, 1950 1.1 mrg DECL_ATTRIBUTES (* node)); 1951 1.1 mrg } 1952 1.1 mrg } 1953 1.1 mrg else if (TREE_NAME_EQ (name, ATTR_CRIT)) 1954 1.1 mrg { 1955 1.1 mrg if (is_interrupt_func ( *node)) 1956 1.1 mrg message = "critical attribute has no effect on interrupt functions"; 1957 1.1 mrg } 1958 1.1 mrg 1959 1.1 mrg if (message) 1960 1.1 mrg { 1961 1.1 mrg warning (OPT_Wattributes, message, name); 1962 1.1 mrg * no_add_attrs = true; 1963 1.1 mrg } 1964 1.1 mrg 1965 1.1 mrg return NULL_TREE; 1966 1.1 mrg } 1967 1.1 mrg 1968 1.1 mrg static tree 1969 1.1 mrg msp430_section_attr (tree * node, 1970 1.1 mrg tree name, 1971 1.1 mrg tree args, 1972 1.1 mrg int flags ATTRIBUTE_UNUSED, 1973 1.1 mrg bool * no_add_attrs ATTRIBUTE_UNUSED) 1974 1.1 mrg { 1975 1.1 mrg gcc_assert (DECL_P (* node)); 1976 1.1 mrg gcc_assert (args == NULL); 1977 1.1 mrg 1978 1.1 mrg const char * message = NULL; 1979 1.1 mrg 1980 1.1 mrg /* The "noinit", "persistent", and "section" attributes are handled 1981 1.1 mrg generically, so we cannot set up additional target-specific attribute 1982 1.1 mrg exclusions using the existing mechanism. */ 1983 1.1 mrg if (has_attr (ATTR_NOINIT, *node) && !TREE_NAME_EQ (name, "lower")) 1984 1.1 mrg message = G_("ignoring attribute %qE because it conflicts with " 1985 1.1 mrg "attribute %<noinit%>"); 1986 1.1 mrg else if (has_attr ("section", *node) && !TREE_NAME_EQ (name, "lower")) 1987 1.1 mrg message = G_("ignoring attribute %qE because it conflicts with " 1988 1.1 mrg "attribute %<section%>"); 1989 1.1 mrg else if (has_attr (ATTR_PERSIST, *node) && !TREE_NAME_EQ (name, "lower")) 1990 1.1 mrg message = G_("ignoring attribute %qE because it conflicts with " 1991 1.1 mrg "attribute %<persistent%>"); 1992 1.1 mrg /* It does not make sense to use upper/lower/either attributes without 1993 1.1 mrg -mlarge. 1994 1.1 mrg Without -mlarge, "lower" is the default and only region, so is redundant. 1995 1.1 mrg Without -mlarge, "upper" will (and "either" might) place code/data in the 1996 1.1 mrg upper region, which for data could result in relocation overflows, and for 1997 1.1 mrg code could result in stack mismanagement and incorrect call/return 1998 1.1 mrg instructions. */ 1999 1.1 mrg else if (!TARGET_LARGE) 2000 1.1 mrg message = G_("%qE attribute ignored. Large memory model (%<-mlarge%>) " 2001 1.1 mrg "is required."); 2002 1.1 mrg 2003 1.1 mrg if (message) 2004 1.1 mrg { 2005 1.1 mrg warning (OPT_Wattributes, message, name); 2006 1.1 mrg * no_add_attrs = true; 2007 1.1 mrg } 2008 1.1 mrg 2009 1.1 mrg return NULL_TREE; 2010 1.1 mrg } 2011 1.1 mrg 2012 1.1 mrg /* Helper to define attribute exclusions. */ 2013 1.1 mrg #define ATTR_EXCL(name, function, type, variable) \ 2014 1.1 mrg { name, function, type, variable } 2015 1.1 mrg 2016 1.1 mrg /* "reentrant", "critical" and "naked" functions must conflict because 2017 1.1 mrg they all modify the prologue or epilogue of functions in mutually exclusive 2018 1.1 mrg ways. */ 2019 1.1 mrg static const struct attribute_spec::exclusions attr_reent_exclusions[] = 2020 1.1 mrg { 2021 1.1 mrg ATTR_EXCL (ATTR_NAKED, true, true, true), 2022 1.1 mrg ATTR_EXCL (ATTR_CRIT, true, true, true), 2023 1.1 mrg ATTR_EXCL (NULL, false, false, false) 2024 1.1 mrg }; 2025 1.1 mrg 2026 1.1 mrg static const struct attribute_spec::exclusions attr_naked_exclusions[] = 2027 1.1 mrg { 2028 1.1 mrg ATTR_EXCL (ATTR_REENT, true, true, true), 2029 1.1 mrg ATTR_EXCL (ATTR_CRIT, true, true, true), 2030 1.1 mrg ATTR_EXCL (NULL, false, false, false) 2031 1.1 mrg }; 2032 1.1 mrg 2033 1.1 mrg static const struct attribute_spec::exclusions attr_crit_exclusions[] = 2034 1.1 mrg { 2035 1.1 mrg ATTR_EXCL (ATTR_REENT, true, true, true), 2036 1.1 mrg ATTR_EXCL (ATTR_NAKED, true, true, true), 2037 1.1 mrg ATTR_EXCL (NULL, false, false, false) 2038 1.1 mrg }; 2039 1.1 mrg 2040 1.1 mrg /* Attributes which put the given object in a specific section must conflict 2041 1.1 mrg with one another. */ 2042 1.1 mrg static const struct attribute_spec::exclusions attr_lower_exclusions[] = 2043 1.1 mrg { 2044 1.1 mrg ATTR_EXCL (ATTR_UPPER, true, true, true), 2045 1.1 mrg ATTR_EXCL (ATTR_EITHER, true, true, true), 2046 1.1 mrg ATTR_EXCL (NULL, false, false, false) 2047 1.1 mrg }; 2048 1.1 mrg 2049 1.1 mrg static const struct attribute_spec::exclusions attr_upper_exclusions[] = 2050 1.1 mrg { 2051 1.1 mrg ATTR_EXCL (ATTR_LOWER, true, true, true), 2052 1.1 mrg ATTR_EXCL (ATTR_EITHER, true, true, true), 2053 1.1 mrg ATTR_EXCL (NULL, false, false, false) 2054 1.1 mrg }; 2055 1.1 mrg 2056 1.1 mrg static const struct attribute_spec::exclusions attr_either_exclusions[] = 2057 1.1 mrg { 2058 1.1 mrg ATTR_EXCL (ATTR_LOWER, true, true, true), 2059 1.1 mrg ATTR_EXCL (ATTR_UPPER, true, true, true), 2060 1.1 mrg ATTR_EXCL (NULL, false, false, false) 2061 1.1 mrg }; 2062 1.1 mrg 2063 1.1 mrg #undef TARGET_ATTRIBUTE_TABLE 2064 1.1 mrg #define TARGET_ATTRIBUTE_TABLE msp430_attribute_table 2065 1.1 mrg 2066 1.1 mrg /* Table of MSP430-specific attributes. */ 2067 1.1 mrg const struct attribute_spec msp430_attribute_table[] = 2068 1.1 mrg { 2069 1.1 mrg /* { name, min_num_args, max_num_args, decl_req, type_req, fn_type_req, 2070 1.1 mrg affects_type_identity, handler, exclude } */ 2071 1.1 mrg { ATTR_INTR, 0, 1, true, false, false, false, msp430_attr, NULL }, 2072 1.1 mrg { ATTR_NAKED, 0, 0, true, false, false, false, msp430_attr, 2073 1.1 mrg attr_naked_exclusions }, 2074 1.1 mrg { ATTR_REENT, 0, 0, true, false, false, false, msp430_attr, 2075 1.1 mrg attr_reent_exclusions }, 2076 1.1 mrg { ATTR_CRIT, 0, 0, true, false, false, false, msp430_attr, 2077 1.1 mrg attr_crit_exclusions }, 2078 1.1 mrg { ATTR_WAKEUP, 0, 0, true, false, false, false, msp430_attr, NULL }, 2079 1.1 mrg 2080 1.1 mrg { ATTR_LOWER, 0, 0, true, false, false, false, msp430_section_attr, 2081 1.1 mrg attr_lower_exclusions }, 2082 1.1 mrg { ATTR_UPPER, 0, 0, true, false, false, false, msp430_section_attr, 2083 1.1 mrg attr_upper_exclusions }, 2084 1.1 mrg { ATTR_EITHER, 0, 0, true, false, false, false, msp430_section_attr, 2085 1.1 mrg attr_either_exclusions }, 2086 1.1 mrg 2087 1.1 mrg { NULL, 0, 0, false, false, false, false, NULL, NULL } 2088 1.1 mrg }; 2089 1.1 mrg 2090 1.1 mrg #undef TARGET_HANDLE_GENERIC_ATTRIBUTE 2091 1.1 mrg #define TARGET_HANDLE_GENERIC_ATTRIBUTE msp430_handle_generic_attribute 2092 1.1 mrg 2093 1.1 mrg tree 2094 1.1 mrg msp430_handle_generic_attribute (tree *node, 2095 1.1 mrg tree name, 2096 1.1 mrg tree args ATTRIBUTE_UNUSED, 2097 1.1 mrg int flags ATTRIBUTE_UNUSED, 2098 1.1 mrg bool *no_add_attrs) 2099 1.1 mrg 2100 1.1 mrg { 2101 1.1 mrg const char *message = NULL; 2102 1.1 mrg 2103 1.1 mrg /* Permit the "lower" attribute to be set on variables with the "section", 2104 1.1 mrg "noinit" and "persistent" attributes. This is used to indicate that the 2105 1.1 mrg corresponding output section will be in lower memory, so a 430X 2106 1.1 mrg instruction is not required to handle it. */ 2107 1.1 mrg if (has_attr (ATTR_LOWER, *node) 2108 1.1 mrg && !(TREE_NAME_EQ (name, "section") || TREE_NAME_EQ (name, ATTR_PERSIST) 2109 1.1 mrg || TREE_NAME_EQ (name, ATTR_NOINIT))) 2110 1.1 mrg message = G_("ignoring attribute %qE because it conflicts with " 2111 1.1 mrg "attribute %<lower%>"); 2112 1.1 mrg else if (has_attr (ATTR_UPPER, *node)) 2113 1.1 mrg message = G_("ignoring attribute %qE because it conflicts with " 2114 1.1 mrg "attribute %<upper%>"); 2115 1.1 mrg else if (has_attr (ATTR_EITHER, *node)) 2116 1.1 mrg message = G_("ignoring attribute %qE because it conflicts with " 2117 1.1 mrg "attribute %<either%>"); 2118 1.1 mrg 2119 1.1 mrg if (message) 2120 1.1 mrg { 2121 1.1 mrg warning (OPT_Wattributes, message, name); 2122 1.1 mrg *no_add_attrs = true; 2123 1.1 mrg } 2124 1.1 mrg 2125 1.1 mrg return NULL_TREE; 2126 1.1 mrg } 2127 1.1 mrg 2128 1.1 mrg /* Given a non-automatic VAR_DECL which can possibly have a section, return 2129 1.1 mrg true if the variable will definitely be placed in the lower memory 2130 1.1 mrg region (below address 0x10000). */ 2131 1.1 mrg static bool 2132 1.1 mrg msp430_var_in_low_mem (tree decl) 2133 1.1 mrg { 2134 1.1 mrg gcc_assert (VAR_P (decl)); 2135 1.1 mrg 2136 1.1 mrg /* "noinit" variables are always placed in the lower memory region. */ 2137 1.1 mrg if (has_attr (ATTR_UPPER, decl) 2138 1.1 mrg || has_attr (ATTR_EITHER, decl) 2139 1.1 mrg || has_attr (ATTR_PERSIST, decl) 2140 1.1 mrg /* Unless the variable is marked with the lower or noinit attribute, we 2141 1.1 mrg cannot assume that it is in the lower region if it is marked with the 2142 1.1 mrg section attribute or -mdata-region={upper,either,none} have been 2143 1.1 mrg passed. 2144 1.1 mrg The noinit and section attributes conflict. */ 2145 1.1 mrg || (!has_attr (ATTR_LOWER, decl) && !has_attr (ATTR_NOINIT, decl) 2146 1.1 mrg && (has_attr ("section", decl) 2147 1.1 mrg || msp430_data_region == MSP430_REGION_UPPER 2148 1.1 mrg || msp430_data_region == MSP430_REGION_EITHER 2149 1.1 mrg || msp430_data_region == MSP430_REGION_ANY))) 2150 1.1 mrg return false; 2151 1.1 mrg return true; 2152 1.1 mrg } 2153 1.1 mrg 2154 1.1 mrg #undef TARGET_ENCODE_SECTION_INFO 2155 1.1 mrg #define TARGET_ENCODE_SECTION_INFO msp430_encode_section_info 2156 1.1 mrg 2157 1.1 mrg /* Encode whether a SYMBOL_REF is definitely in the lower memory region. */ 2158 1.1 mrg static void 2159 1.1 mrg msp430_encode_section_info (tree decl, rtx rtl, int first) 2160 1.1 mrg { 2161 1.1 mrg rtx symbol; 2162 1.1 mrg default_encode_section_info (decl, rtl, first); 2163 1.1 mrg 2164 1.1 mrg /* Careful not to prod global register variables. */ 2165 1.1 mrg if (!MEM_P (rtl)) 2166 1.1 mrg return; 2167 1.1 mrg symbol = XEXP (rtl, 0); 2168 1.1 mrg if (GET_CODE (symbol) != SYMBOL_REF) 2169 1.1 mrg return; 2170 1.1 mrg 2171 1.1 mrg if (VAR_P (decl) 2172 1.1 mrg && (TREE_STATIC (decl) || DECL_EXTERNAL (decl)) 2173 1.1 mrg && msp430_var_in_low_mem (decl)) 2174 1.1 mrg SYMBOL_REF_FLAGS (symbol) = SYMBOL_FLAG_LOW_MEM; 2175 1.1 mrg } 2176 1.1 mrg 2177 1.1 mrg #undef TARGET_ASM_FUNCTION_PROLOGUE 2178 1.1 mrg #define TARGET_ASM_FUNCTION_PROLOGUE msp430_start_function 2179 1.1 mrg 2180 1.1 mrg static void 2181 1.1 mrg msp430_start_function (FILE *outfile) 2182 1.1 mrg { 2183 1.1 mrg int r, n; 2184 1.1 mrg 2185 1.1 mrg fprintf (outfile, "; start of function\n"); 2186 1.1 mrg 2187 1.1 mrg if (DECL_ATTRIBUTES (current_function_decl) != NULL_TREE) 2188 1.1 mrg { 2189 1.1 mrg fprintf (outfile, "; attributes: "); 2190 1.1 mrg if (is_naked_func ()) 2191 1.1 mrg fprintf (outfile, "naked "); 2192 1.1 mrg if (msp430_is_interrupt_func ()) 2193 1.1 mrg fprintf (outfile, "interrupt "); 2194 1.1 mrg if (is_reentrant_func ()) 2195 1.1 mrg fprintf (outfile, "reentrant "); 2196 1.1 mrg if (is_critical_func ()) 2197 1.1 mrg fprintf (outfile, "critical "); 2198 1.1 mrg if (is_wakeup_func ()) 2199 1.1 mrg fprintf (outfile, "wakeup "); 2200 1.1 mrg fprintf (outfile, "\n"); 2201 1.1 mrg } 2202 1.1 mrg 2203 1.1 mrg fprintf (outfile, "; framesize_regs: %d\n", 2204 1.1 mrg cfun->machine->framesize_regs); 2205 1.1 mrg fprintf (outfile, "; framesize_locals: %d\n", 2206 1.1 mrg cfun->machine->framesize_locals); 2207 1.1 mrg fprintf (outfile, "; framesize_outgoing: %d\n", 2208 1.1 mrg cfun->machine->framesize_outgoing); 2209 1.1 mrg fprintf (outfile, "; framesize: %d\n", cfun->machine->framesize); 2210 1.1 mrg fprintf (outfile, "; elim ap -> fp %d\n", 2211 1.1 mrg msp430_initial_elimination_offset (ARG_POINTER_REGNUM, 2212 1.1 mrg FRAME_POINTER_REGNUM)); 2213 1.1 mrg fprintf (outfile, "; elim fp -> sp %d\n", 2214 1.1 mrg msp430_initial_elimination_offset (FRAME_POINTER_REGNUM, 2215 1.1 mrg STACK_POINTER_REGNUM)); 2216 1.1 mrg 2217 1.1 mrg n = 0; 2218 1.1 mrg fprintf (outfile, "; saved regs:"); 2219 1.1 mrg for (r = 0; r < ARG_POINTER_REGNUM; r++) 2220 1.1 mrg if (cfun->machine->need_to_save[r]) 2221 1.1 mrg { 2222 1.1 mrg fprintf (outfile, " %s", reg_names[r]); 2223 1.1 mrg n = 1; 2224 1.1 mrg } 2225 1.1 mrg if (n == 0) 2226 1.1 mrg fprintf (outfile, "(none)"); 2227 1.1 mrg fprintf (outfile, "\n"); 2228 1.1 mrg } 2229 1.1 mrg 2230 1.1 mrg /* Common code to change the stack pointer. */ 2231 1.1 mrg static void 2232 1.1 mrg increment_stack (HOST_WIDE_INT amount) 2233 1.1 mrg { 2234 1.1 mrg rtx inc; 2235 1.1 mrg rtx sp = stack_pointer_rtx; 2236 1.1 mrg 2237 1.1 mrg if (amount == 0) 2238 1.1 mrg return; 2239 1.1 mrg 2240 1.1 mrg if (amount < 0) 2241 1.1 mrg { 2242 1.1 mrg inc = GEN_INT (- amount); 2243 1.1 mrg if (TARGET_LARGE) 2244 1.1 mrg F (emit_insn (gen_subpsi3 (sp, sp, inc))); 2245 1.1 mrg else 2246 1.1 mrg F (emit_insn (gen_subhi3 (sp, sp, inc))); 2247 1.1 mrg } 2248 1.1 mrg else 2249 1.1 mrg { 2250 1.1 mrg inc = GEN_INT (amount); 2251 1.1 mrg if (TARGET_LARGE) 2252 1.1 mrg F (emit_insn (gen_addpsi3 (sp, sp, inc))); 2253 1.1 mrg else 2254 1.1 mrg F (emit_insn (gen_addhi3 (sp, sp, inc))); 2255 1.1 mrg } 2256 1.1 mrg } 2257 1.1 mrg 2258 1.1 mrg void 2259 1.1 mrg msp430_start_function (FILE *file, const char *name, tree decl) 2260 1.1 mrg { 2261 1.1 mrg tree int_attr; 2262 1.1 mrg 2263 1.1 mrg int_attr = lookup_attribute ("interrupt", DECL_ATTRIBUTES (decl)); 2264 1.1 mrg if (int_attr != NULL_TREE) 2265 1.1 mrg { 2266 1.1 mrg tree intr_vector = TREE_VALUE (int_attr); 2267 1.1 mrg 2268 1.1 mrg if (intr_vector != NULL_TREE) 2269 1.1 mrg { 2270 1.1 mrg char buf[101]; 2271 1.1 mrg 2272 1.1 mrg /* Interrupt vector sections should be unique, but use of weak 2273 1.1 mrg functions implies multiple definitions. */ 2274 1.1 mrg if (DECL_WEAK (decl)) 2275 1.1 mrg { 2276 1.1 mrg error ("argument to interrupt attribute is unsupported for weak " 2277 1.1 mrg "functions"); 2278 1.1 mrg } 2279 1.1 mrg 2280 1.1 mrg intr_vector = TREE_VALUE (intr_vector); 2281 1.1 mrg 2282 1.1 mrg /* The interrupt attribute has a vector value. Turn this into a 2283 1.1 mrg section name, switch to that section and put the address of 2284 1.1 mrg the current function into that vector slot. Note msp430_attr() 2285 1.1 mrg has already verified the vector name for us. */ 2286 1.1 mrg if (TREE_CODE (intr_vector) == STRING_CST) 2287 1.1 mrg sprintf (buf, "__interrupt_vector_%.80s", 2288 1.1 mrg TREE_STRING_POINTER (intr_vector)); 2289 1.1 mrg else /* TREE_CODE (intr_vector) == INTEGER_CST */ 2290 1.1 mrg sprintf (buf, "__interrupt_vector_%u", 2291 1.1 mrg (unsigned int) TREE_INT_CST_LOW (intr_vector)); 2292 1.1 mrg 2293 1.1 mrg switch_to_section (get_section (buf, SECTION_CODE, decl)); 2294 1.1 mrg fputs ("\t.word\t", file); 2295 1.1 mrg assemble_name (file, name); 2296 1.1 mrg fputc ('\n', file); 2297 1.1 mrg fputc ('\t', file); 2298 1.1 mrg } 2299 1.1 mrg } 2300 1.1 mrg 2301 1.1 mrg switch_to_section (function_section (decl)); 2302 1.1 mrg ASM_OUTPUT_TYPE_DIRECTIVE (file, name, "function"); 2303 1.1 mrg ASM_OUTPUT_FUNCTION_LABEL (file, name, decl); 2304 1.1 mrg } 2305 1.1 mrg 2306 1.1 mrg static const char * const lower_prefix = ".lower"; 2307 1.1 mrg static const char * const upper_prefix = ".upper"; 2308 1.1 mrg static const char * const either_prefix = ".either"; 2309 1.1 mrg 2310 1.1 mrg /* Generate a prefix for a section name, based upon 2311 1.1 mrg the region into which the object should be placed. */ 2312 1.1 mrg 2313 1.1 mrg static const char * 2314 1.1 mrg gen_prefix (tree decl) 2315 1.1 mrg { 2316 1.1 mrg if (DECL_ONE_ONLY (decl)) 2317 1.1 mrg return NULL; 2318 1.1 mrg 2319 1.1 mrg /* If the user has specified a particular section then do not use any 2320 1.1 mrg prefix. */ 2321 1.1 mrg if (has_attr ("section", decl)) 2322 1.1 mrg return NULL; 2323 1.1 mrg 2324 1.1 mrg /* If the function has been put in the .lowtext section (because it is an 2325 1.1 mrg interrupt handler, and the large memory model is used), then do not add 2326 1.1 mrg any prefixes. */ 2327 1.1 mrg if (has_section_name (".lowtext", decl)) 2328 1.1 mrg return NULL; 2329 1.1 mrg 2330 1.1 mrg /* Memory regions require the large memory model. */ 2331 1.1 mrg if (!TARGET_LARGE) 2332 1.1 mrg return NULL; 2333 1.1 mrg 2334 1.1 mrg /* Note that we always apply the lower prefix when the attribute has been 2335 1.1 mrg used. But we only apply the lower prefix when the lower region has been 2336 1.1 mrg specified by a command line option if -muse-lower-region-prefix has also 2337 1.1 mrg been passed. */ 2338 1.1 mrg if (has_attr (ATTR_LOWER, decl)) 2339 1.1 mrg return lower_prefix; 2340 1.1 mrg 2341 1.1 mrg if (has_attr (ATTR_UPPER, decl)) 2342 1.1 mrg return upper_prefix; 2343 1.1 mrg 2344 1.1 mrg if (has_attr (ATTR_EITHER, decl)) 2345 1.1 mrg return either_prefix; 2346 1.1 mrg 2347 1.1 mrg if (TREE_CODE (decl) == FUNCTION_DECL) 2348 1.1 mrg { 2349 1.1 mrg if ((msp430_code_region == MSP430_REGION_LOWER) 2350 1.1 mrg && TARGET_USE_LOWER_REGION_PREFIX) 2351 1.1 mrg return lower_prefix; 2352 1.1 mrg 2353 1.1 mrg if (msp430_code_region == MSP430_REGION_UPPER) 2354 1.1 mrg return upper_prefix; 2355 1.1 mrg 2356 1.1 mrg if (msp430_code_region == MSP430_REGION_EITHER) 2357 1.1 mrg return either_prefix; 2358 1.1 mrg } 2359 1.1 mrg else 2360 1.1 mrg { 2361 1.1 mrg if ((msp430_data_region == MSP430_REGION_LOWER) 2362 1.1 mrg && TARGET_USE_LOWER_REGION_PREFIX) 2363 1.1 mrg return lower_prefix; 2364 1.1 mrg 2365 1.1 mrg if (msp430_data_region == MSP430_REGION_UPPER) 2366 1.1 mrg return upper_prefix; 2367 1.1 mrg 2368 1.1 mrg if (msp430_data_region == MSP430_REGION_EITHER) 2369 1.1 mrg return either_prefix; 2370 1.1 mrg } 2371 1.1 mrg 2372 1.1 mrg return NULL; 2373 1.1 mrg } 2374 1.1 mrg 2375 1.1 mrg #undef TARGET_ASM_SELECT_SECTION 2376 1.1 mrg #define TARGET_ASM_SELECT_SECTION msp430_select_section 2377 1.1 mrg 2378 1.1 mrg static section * 2379 1.1 mrg msp430_select_section (tree decl, int reloc, unsigned HOST_WIDE_INT align) 2380 1.1 mrg { 2381 1.1 mrg const char *prefix; 2382 1.1 mrg const char *sec_name; 2383 1.1 mrg const char *base_sec_name; 2384 1.1 mrg 2385 1.1 mrg gcc_assert (decl != NULL_TREE); 2386 1.1 mrg 2387 1.1 mrg if (TREE_CODE (decl) == STRING_CST 2388 1.1 mrg || TREE_CODE (decl) == CONSTRUCTOR 2389 1.1 mrg || TREE_CODE (decl) == INTEGER_CST 2390 1.1 mrg || TREE_CODE (decl) == VECTOR_CST 2391 1.1 mrg || TREE_CODE (decl) == COMPLEX_CST) 2392 1.1 mrg return default_select_section (decl, reloc, align); 2393 1.1 mrg 2394 1.1 mrg /* In large mode we must make sure that interrupt handlers are put into 2395 1.1 mrg low memory as the vector table only accepts 16-bit addresses. */ 2396 1.1 mrg if (TARGET_LARGE && TREE_CODE (decl) == FUNCTION_DECL 2397 1.1 mrg && is_interrupt_func (decl)) 2398 1.1 mrg return get_section (".lowtext", SECTION_CODE | SECTION_WRITE , decl); 2399 1.1 mrg 2400 1.1 mrg /* The "noinit" and "persistent" attributes are handled generically. */ 2401 1.1 mrg if (has_attr (ATTR_NOINIT, decl) || has_attr (ATTR_PERSIST, decl)) 2402 1.1 mrg return default_elf_select_section (decl, reloc, align); 2403 1.1 mrg 2404 1.1 mrg prefix = gen_prefix (decl); 2405 1.1 mrg 2406 1.1 mrg switch (categorize_decl_for_section (decl, reloc)) 2407 1.1 mrg { 2408 1.1 mrg case SECCAT_TEXT: 2409 1.1 mrg if (!prefix) 2410 1.1 mrg return text_section; 2411 1.1 mrg base_sec_name = ".text"; 2412 1.1 mrg break; 2413 1.1 mrg case SECCAT_DATA: 2414 1.1 mrg if (!prefix) 2415 1.1 mrg return data_section; 2416 1.1 mrg base_sec_name = ".data"; 2417 1.1 mrg break; 2418 1.1 mrg case SECCAT_BSS: 2419 1.1 mrg if (!prefix) 2420 1.1 mrg return bss_section; 2421 1.1 mrg base_sec_name = ".bss"; 2422 1.1 mrg break; 2423 1.1 mrg case SECCAT_RODATA: 2424 1.1 mrg if (!prefix) 2425 1.1 mrg return readonly_data_section; 2426 1.1 mrg base_sec_name = ".rodata"; 2427 1.1 mrg break; 2428 1.1 mrg 2429 1.1 mrg /* Enable merging of constant data by the GNU linker using 2430 1.1 mrg default_elf_select_section and therefore enabling creation of 2431 1.1 mrg sections with the SHF_MERGE flag. */ 2432 1.1 mrg case SECCAT_RODATA_MERGE_STR: 2433 1.1 mrg case SECCAT_RODATA_MERGE_STR_INIT: 2434 1.1 mrg case SECCAT_RODATA_MERGE_CONST: 2435 1.1 mrg return default_elf_select_section (decl, reloc, align); 2436 1.1 mrg 2437 1.1 mrg /* The sections listed below are not supported for MSP430. 2438 1.1 mrg They should not be generated, but in case they are, we use 2439 1.1 mrg default_select_section so they get placed in sections 2440 1.1 mrg the msp430 assembler and linker understand. */ 2441 1.1 mrg /* "small data" sections are not supported. */ 2442 1.1 mrg case SECCAT_SRODATA: 2443 1.1 mrg case SECCAT_SDATA: 2444 1.1 mrg case SECCAT_SBSS: 2445 1.1 mrg /* Thread-local storage (TLS) is not supported. */ 2446 1.1 mrg case SECCAT_TDATA: 2447 1.1 mrg case SECCAT_TBSS: 2448 1.1 mrg /* Sections used by a dynamic linker are not supported. */ 2449 1.1 mrg case SECCAT_DATA_REL: 2450 1.1 mrg case SECCAT_DATA_REL_LOCAL: 2451 1.1 mrg case SECCAT_DATA_REL_RO: 2452 1.1 mrg case SECCAT_DATA_REL_RO_LOCAL: 2453 1.1 mrg return default_select_section (decl, reloc, align); 2454 1.1 mrg 2455 1.1 mrg default: 2456 1.1 mrg gcc_unreachable (); 2457 1.1 mrg } 2458 1.1 mrg 2459 1.1 mrg sec_name = ACONCAT ((prefix, base_sec_name, DECL_SECTION_NAME (decl), NULL)); 2460 1.1 mrg 2461 1.1 mrg return get_named_section (decl, sec_name, 0); 2462 1.1 mrg } 2463 1.1 mrg 2464 1.1 mrg #undef TARGET_ASM_FUNCTION_SECTION 2465 1.1 mrg #define TARGET_ASM_FUNCTION_SECTION msp430_function_section 2466 1.1 mrg 2467 1.1 mrg static section * 2468 1.1 mrg msp430_function_section (tree decl, enum node_frequency freq, bool startup, 2469 1.1 mrg bool exit) 2470 1.1 mrg { 2471 1.1 mrg const char * name; 2472 1.1 mrg 2473 1.1 mrg gcc_assert (DECL_SECTION_NAME (decl) != NULL); 2474 1.1 mrg name = DECL_SECTION_NAME (decl); 2475 1.1 mrg 2476 1.1 mrg const char * prefix = gen_prefix (decl); 2477 1.1 mrg if (prefix == NULL 2478 1.1 mrg || startswith (name, prefix)) 2479 1.1 mrg return default_function_section (decl, freq, startup, exit); 2480 1.1 mrg 2481 1.1 mrg name = ACONCAT ((prefix, name, NULL)); 2482 1.1 mrg return get_named_section (decl, name, 0); 2483 1.1 mrg } 2484 1.1 mrg 2485 1.1 mrg #undef TARGET_SECTION_TYPE_FLAGS 2486 1.1 mrg #define TARGET_SECTION_TYPE_FLAGS msp430_section_type_flags 2487 1.1 mrg 2488 1.1 mrg unsigned int 2489 1.1 mrg msp430_section_type_flags (tree decl, const char * name, int reloc) 2490 1.1 mrg { 2491 1.1 mrg if (startswith (name, lower_prefix)) 2492 1.1 mrg name += strlen (lower_prefix); 2493 1.1 mrg else if (startswith (name, upper_prefix)) 2494 1.1 mrg name += strlen (upper_prefix); 2495 1.1 mrg else if (startswith (name, either_prefix)) 2496 1.1 mrg name += strlen (either_prefix); 2497 1.1 mrg 2498 1.1 mrg return default_section_type_flags (decl, name, reloc); 2499 1.1 mrg } 2500 1.1 mrg 2501 1.1 mrg #undef TARGET_ASM_UNIQUE_SECTION 2502 1.1 mrg #define TARGET_ASM_UNIQUE_SECTION msp430_unique_section 2503 1.1 mrg 2504 1.1 mrg static void 2505 1.1 mrg msp430_unique_section (tree decl, int reloc) 2506 1.1 mrg { 2507 1.1 mrg gcc_assert (decl != NULL_TREE); 2508 1.1 mrg 2509 1.1 mrg /* In large mode we must make sure that interrupt handlers are put into 2510 1.1 mrg low memory as the vector table only accepts 16-bit addresses. */ 2511 1.1 mrg if (TARGET_LARGE && TREE_CODE (decl) == FUNCTION_DECL 2512 1.1 mrg && is_interrupt_func (decl)) 2513 1.1 mrg { 2514 1.1 mrg set_decl_section_name (decl, ".lowtext"); 2515 1.1 mrg return; 2516 1.1 mrg } 2517 1.1 mrg 2518 1.1 mrg default_unique_section (decl, reloc); 2519 1.1 mrg 2520 1.1 mrg const char * prefix; 2521 1.1 mrg 2522 1.1 mrg if ( TREE_CODE (decl) == STRING_CST 2523 1.1 mrg || TREE_CODE (decl) == CONSTRUCTOR 2524 1.1 mrg || TREE_CODE (decl) == INTEGER_CST 2525 1.1 mrg || TREE_CODE (decl) == VECTOR_CST 2526 1.1 mrg || TREE_CODE (decl) == COMPLEX_CST 2527 1.1 mrg || (prefix = gen_prefix (decl)) == NULL) 2528 1.1 mrg return; 2529 1.1 mrg 2530 1.1 mrg const char * dec_name = DECL_SECTION_NAME (decl); 2531 1.1 mrg char * name = ACONCAT ((prefix, dec_name, NULL)); 2532 1.1 mrg 2533 1.1 mrg set_decl_section_name (decl, name); 2534 1.1 mrg } 2535 1.1 mrg 2536 1.1 mrg /* Emit a declaration of a common symbol. 2537 1.1 mrg If a data region is in use then put the symbol into the 2538 1.1 mrg equivalent .bss section instead. 2539 1.1 mrg If LOCAL is 1, then DECL is for a local common variable. */ 2540 1.1 mrg void 2541 1.1 mrg msp430_output_aligned_decl_common (FILE * stream, 2542 1.1 mrg const tree decl, 2543 1.1 mrg const char * name, 2544 1.1 mrg unsigned HOST_WIDE_INT size, 2545 1.1 mrg unsigned int align, 2546 1.1 mrg int local) 2547 1.1 mrg { 2548 1.1 mrg /* Only emit a common symbol if the variable does not have a specific section 2549 1.1 mrg assigned. */ 2550 1.1 mrg if ((msp430_data_region == MSP430_REGION_ANY 2551 1.1 mrg || ((msp430_data_region == MSP430_REGION_LOWER) 2552 1.1 mrg && !TARGET_USE_LOWER_REGION_PREFIX)) 2553 1.1 mrg && !(decl != NULL_TREE && DECL_SECTION_NAME (decl)) 2554 1.1 mrg && !has_attr (ATTR_EITHER, decl) 2555 1.1 mrg && !has_attr (ATTR_LOWER, decl) 2556 1.1 mrg && !has_attr (ATTR_UPPER, decl) 2557 1.1 mrg && !has_attr (ATTR_PERSIST, decl) 2558 1.1 mrg && !has_attr (ATTR_NOINIT, decl)) 2559 1.1 mrg { 2560 1.1 mrg if (local) 2561 1.1 mrg { 2562 1.1 mrg fprintf (stream, LOCAL_ASM_OP); 2563 1.1 mrg assemble_name (stream, name); 2564 1.1 mrg fprintf (stream, "\n"); 2565 1.1 mrg } 2566 1.1 mrg fprintf (stream, COMMON_ASM_OP); 2567 1.1 mrg assemble_name (stream, name); 2568 1.1 mrg fprintf (stream, "," HOST_WIDE_INT_PRINT_UNSIGNED",%u\n", 2569 1.1 mrg size, align / BITS_PER_UNIT); 2570 1.1 mrg } 2571 1.1 mrg else 2572 1.1 mrg { 2573 1.1 mrg section * sec; 2574 1.1 mrg 2575 1.1 mrg if (decl) 2576 1.1 mrg sec = msp430_select_section (decl, 0, align); 2577 1.1 mrg else 2578 1.1 mrg switch (msp430_data_region) 2579 1.1 mrg { 2580 1.1 mrg case MSP430_REGION_UPPER: 2581 1.1 mrg sec = get_named_section (NULL, ".upper.bss", 0); 2582 1.1 mrg break; 2583 1.1 mrg case MSP430_REGION_LOWER: 2584 1.1 mrg sec = get_named_section (NULL, ".lower.bss", 0); 2585 1.1 mrg break; 2586 1.1 mrg case MSP430_REGION_EITHER: 2587 1.1 mrg sec = get_named_section (NULL, ".either.bss", 0); 2588 1.1 mrg break; 2589 1.1 mrg default: 2590 1.1 mrg gcc_unreachable (); 2591 1.1 mrg } 2592 1.1 mrg gcc_assert (sec != NULL); 2593 1.1 mrg 2594 1.1 mrg switch_to_section (sec); 2595 1.1 mrg ASM_OUTPUT_ALIGN (stream, floor_log2 (align / BITS_PER_UNIT)); 2596 1.1 mrg if (!local) 2597 1.1 mrg { 2598 1.1 mrg targetm.asm_out.globalize_label (stream, name); 2599 1.1 mrg ASM_WEAKEN_LABEL (stream, name); 2600 1.1 mrg } 2601 1.1 mrg ASM_OUTPUT_LABEL (stream, name); 2602 1.1 mrg ASM_OUTPUT_SKIP (stream, size ? size : 1); 2603 1.1 mrg } 2604 1.1 mrg } 2605 1.1 mrg 2606 1.1 mrg #undef TARGET_ASM_FILE_END 2607 1.1 mrg #define TARGET_ASM_FILE_END msp430_file_end 2608 1.1 mrg 2609 1.1 mrg /* Emit MSPABI and GNU object attributes. 2610 1.1 mrg Tags and values for MSPABI attributes are: 2611 1.1 mrg OFBA_MSPABI_Tag_ISA 4 2612 1.1 mrg MSP430 1 2613 1.1 mrg MSP430X 2 2614 1.1 mrg OFBA_MSPABI_Tag_Code_Model 6 2615 1.1 mrg Small 1 2616 1.1 mrg Large 2 2617 1.1 mrg OFBA_MSPABI_Tag_Data_Model 8 2618 1.1 mrg Small 1 2619 1.1 mrg Large 2 2620 1.1 mrg Restricted 3 (Unused by GNU) 2621 1.1 mrg OFBA_MSPABI_Tag_enum_size 10 (Unused by GNU) 2622 1.1 mrg Note that Code_Model and Data_Model are always equal for GNU. 2623 1.1 mrg We define a new .gnu_attribute to keep track of the data region used. 2624 1.1 mrg Tag_GNU_MSP430_Data_Region 4 2625 1.1 mrg LOWER 1 2626 1.1 mrg ANY 2 2627 1.1 mrg See binutils-gdb/include/elf/msp430.h for the full details. */ 2628 1.1 mrg static void 2629 1.1 mrg msp430_file_end (void) 2630 1.1 mrg { 2631 1.1 mrg #ifdef HAVE_AS_MSPABI_ATTRIBUTE 2632 1.1 mrg /* Enum for tag names. */ 2633 1.1 mrg enum 2634 1.1 mrg { 2635 1.1 mrg OFBA_MSPABI_Tag_ISA = 4, 2636 1.1 mrg OFBA_MSPABI_Tag_Code_Model = 6, 2637 1.1 mrg OFBA_MSPABI_Tag_Data_Model = 8, 2638 1.1 mrg Tag_GNU_MSP430_Data_Region = 4 2639 1.1 mrg }; 2640 1.1 mrg /* Enum for tag values. */ 2641 1.1 mrg enum 2642 1.1 mrg { 2643 1.1 mrg OFBA_MSPABI_Val_ISA_MSP430 = 1, 2644 1.1 mrg OFBA_MSPABI_Val_ISA_MSP430X = 2, 2645 1.1 mrg OFBA_MSPABI_Val_Model_Small = 1, 2646 1.1 mrg OFBA_MSPABI_Val_Model_Large = 2, 2647 1.1 mrg Tag_GNU_MSP430_Data_Region_Lower = 1, 2648 1.1 mrg Tag_GNU_MSP430_Data_Region_Any = 2 2649 1.1 mrg }; 2650 1.1 mrg /* .mspabi_attribute is a GNU assembler directive only. The assembler will 2651 1.1 mrg construct a .MSP430.attributes section based on the options it is invoked 2652 1.1 mrg with. The values it reads from these directives are used for validating 2653 1.1 mrg those options. */ 2654 1.1 mrg const char *msp430_attr = ".mspabi_attribute"; 2655 1.1 mrg const char *gnu_attr = ".gnu_attribute"; 2656 1.1 mrg 2657 1.1 mrg /* Emit .mspabi_attribute directive for OFBA_MSPABI_Tag_ISA. */ 2658 1.1 mrg fprintf (asm_out_file, "\t%s %d, %d\n", msp430_attr, OFBA_MSPABI_Tag_ISA, 2659 1.1 mrg msp430x ? OFBA_MSPABI_Val_ISA_MSP430X : OFBA_MSPABI_Val_ISA_MSP430); 2660 1.1 mrg /* Emit .mspabi_attribute directive for OFBA_MSPABI_Tag_Code_Model. */ 2661 1.1 mrg fprintf (asm_out_file, "\t%s %d, %d\n", msp430_attr, 2662 1.1 mrg OFBA_MSPABI_Tag_Code_Model, 2663 1.1 mrg TARGET_LARGE ? OFBA_MSPABI_Val_Model_Large 2664 1.1 mrg : OFBA_MSPABI_Val_Model_Small); 2665 1.1 mrg /* Emit .mspabi_attribute directive for OFBA_MSPABI_Tag_Data_Model. */ 2666 1.1 mrg fprintf (asm_out_file, "\t%s %d, %d\n", msp430_attr, 2667 1.1 mrg OFBA_MSPABI_Tag_Data_Model, 2668 1.1 mrg TARGET_LARGE ? OFBA_MSPABI_Val_Model_Large 2669 1.1 mrg : OFBA_MSPABI_Val_Model_Small); 2670 1.1 mrg #ifdef HAVE_AS_GNU_ATTRIBUTE 2671 1.1 mrg /* Emit .gnu_attribute directive for Tag_GNU_MSP430_Data_Region. */ 2672 1.1 mrg fprintf (asm_out_file, "\t%s %d, %d\n", gnu_attr, Tag_GNU_MSP430_Data_Region, 2673 1.1 mrg msp430_data_region == MSP430_REGION_LOWER 2674 1.1 mrg ? Tag_GNU_MSP430_Data_Region_Lower 2675 1.1 mrg : Tag_GNU_MSP430_Data_Region_Any); 2676 1.1 mrg #endif 2677 1.1 mrg #endif 2678 1.1 mrg } 2679 1.1 mrg 2680 1.1 mrg enum msp430_builtin 2681 1.1 mrg { 2682 1.1 mrg MSP430_BUILTIN_BIC_SR, 2683 1.1 mrg MSP430_BUILTIN_BIS_SR, 2684 1.1 mrg MSP430_BUILTIN_DELAY_CYCLES, 2685 1.1 mrg MSP430_BUILTIN_max 2686 1.1 mrg }; 2687 1.1 mrg 2688 1.1 mrg static GTY(()) tree msp430_builtins[(int) MSP430_BUILTIN_max]; 2689 1.1 mrg 2690 1.1 mrg static void 2691 1.1 mrg msp430_init_builtins (void) 2692 1.1 mrg { 2693 1.1 mrg tree void_ftype_int = build_function_type_list (void_type_node, 2694 1.1 mrg integer_type_node, NULL); 2695 1.1 mrg tree void_ftype_longlong 2696 1.1 mrg = build_function_type_list (void_type_node, long_long_integer_type_node, 2697 1.1 mrg NULL); 2698 1.1 mrg 2699 1.1 mrg msp430_builtins[MSP430_BUILTIN_BIC_SR] = 2700 1.1 mrg add_builtin_function ( "__bic_SR_register_on_exit", void_ftype_int, 2701 1.1 mrg MSP430_BUILTIN_BIC_SR, BUILT_IN_MD, NULL, NULL_TREE); 2702 1.1 mrg 2703 1.1 mrg msp430_builtins[MSP430_BUILTIN_BIS_SR] = 2704 1.1 mrg add_builtin_function ( "__bis_SR_register_on_exit", void_ftype_int, 2705 1.1 mrg MSP430_BUILTIN_BIS_SR, BUILT_IN_MD, NULL, NULL_TREE); 2706 1.1 mrg 2707 1.1 mrg msp430_builtins[MSP430_BUILTIN_DELAY_CYCLES] = 2708 1.1 mrg add_builtin_function ( "__delay_cycles", void_ftype_longlong, 2709 1.1 mrg MSP430_BUILTIN_DELAY_CYCLES, BUILT_IN_MD, NULL, 2710 1.1 mrg NULL_TREE); 2711 1.1 mrg } 2712 1.1 mrg 2713 1.1 mrg static tree 2714 1.1 mrg msp430_builtin_decl (unsigned code, bool initialize ATTRIBUTE_UNUSED) 2715 1.1 mrg { 2716 1.1 mrg switch (code) 2717 1.1 mrg { 2718 1.1 mrg case MSP430_BUILTIN_BIC_SR: 2719 1.1 mrg case MSP430_BUILTIN_BIS_SR: 2720 1.1 mrg case MSP430_BUILTIN_DELAY_CYCLES: 2721 1.1 mrg return msp430_builtins[code]; 2722 1.1 mrg default: 2723 1.1 mrg return error_mark_node; 2724 1.1 mrg } 2725 1.1 mrg } 2726 1.1 mrg 2727 1.1 mrg /* These constants are really register reads, which are faster than 2728 1.1 mrg regular constants. */ 2729 1.1 mrg static int 2730 1.1 mrg cg_magic_constant (HOST_WIDE_INT c) 2731 1.1 mrg { 2732 1.1 mrg switch (c) 2733 1.1 mrg { 2734 1.1 mrg case 0xffff: 2735 1.1 mrg case -1: 2736 1.1 mrg case 0: 2737 1.1 mrg case 1: 2738 1.1 mrg case 2: 2739 1.1 mrg case 4: 2740 1.1 mrg case 8: 2741 1.1 mrg return 1; 2742 1.1 mrg default: 2743 1.1 mrg return 0; 2744 1.1 mrg } 2745 1.1 mrg } 2746 1.1 mrg 2747 1.1 mrg static rtx 2748 1.1 mrg msp430_expand_delay_cycles (rtx arg) 2749 1.1 mrg { 2750 1.1 mrg HOST_WIDE_INT i, c, n; 2751 1.1 mrg /* extra cycles for MSP430X instructions */ 2752 1.1 mrg #define CYCX(M,X) (msp430x ? (X) : (M)) 2753 1.1 mrg 2754 1.1 mrg if (GET_CODE (arg) != CONST_INT) 2755 1.1 mrg { 2756 1.1 mrg error ("%<__delay_cycles%> only takes constant arguments"); 2757 1.1 mrg return NULL_RTX; 2758 1.1 mrg } 2759 1.1 mrg 2760 1.1 mrg c = INTVAL (arg); 2761 1.1 mrg 2762 1.1 mrg if (HOST_BITS_PER_WIDE_INT > 32) 2763 1.1 mrg { 2764 1.1 mrg if (c < 0) 2765 1.1 mrg { 2766 1.1 mrg error ("%<__delay_cycles%> only takes non-negative cycle counts"); 2767 1.1 mrg return NULL_RTX; 2768 1.1 mrg } 2769 1.1 mrg } 2770 1.1 mrg 2771 1.1 mrg emit_insn (gen_delay_cycles_start (arg)); 2772 1.1 mrg 2773 1.1 mrg /* For 32-bit loops, there's 13(16) + 5(min(x,0x10000) + 6x cycles. */ 2774 1.1 mrg if (c > 3 * 0xffff + CYCX (7, 10)) 2775 1.1 mrg { 2776 1.1 mrg n = c; 2777 1.1 mrg /* There's 4 cycles in the short (i>0xffff) loop and 7 in the long 2778 1.1 mrg (x<=0xffff) loop. */ 2779 1.1 mrg if (c >= 0x10000 * 7 + CYCX (14, 16)) 2780 1.1 mrg { 2781 1.1 mrg i = 0x10000; 2782 1.1 mrg c -= CYCX (14, 16) + 7 * 0x10000; 2783 1.1 mrg i += c / 4; 2784 1.1 mrg c %= 4; 2785 1.1 mrg if ((unsigned long long) i > 0xffffffffULL) 2786 1.1 mrg { 2787 1.1 mrg error ("%<__delay_cycles%> is limited to 32-bit loop counts"); 2788 1.1 mrg return NULL_RTX; 2789 1.1 mrg } 2790 1.1 mrg } 2791 1.1 mrg else 2792 1.1 mrg { 2793 1.1 mrg i = (c - CYCX (14, 16)) / 7; 2794 1.1 mrg c -= CYCX (14, 16) + i * 7; 2795 1.1 mrg } 2796 1.1 mrg 2797 1.1 mrg if (cg_magic_constant (i & 0xffff)) 2798 1.1 mrg c ++; 2799 1.1 mrg if (cg_magic_constant ((i >> 16) & 0xffff)) 2800 1.1 mrg c ++; 2801 1.1 mrg 2802 1.1 mrg if (msp430x) 2803 1.1 mrg emit_insn (gen_delay_cycles_32x (GEN_INT (i), GEN_INT (n - c))); 2804 1.1 mrg else 2805 1.1 mrg emit_insn (gen_delay_cycles_32 (GEN_INT (i), GEN_INT (n - c))); 2806 1.1 mrg } 2807 1.1 mrg 2808 1.1 mrg /* For 16-bit loops, there's 7(10) + 3x cycles - so the max cycles is 2809 1.1 mrg 0x30004(7). */ 2810 1.1 mrg if (c > 12) 2811 1.1 mrg { 2812 1.1 mrg n = c; 2813 1.1 mrg i = (c - CYCX (7, 10)) / 3; 2814 1.1 mrg c -= CYCX (7, 10) + i * 3; 2815 1.1 mrg 2816 1.1 mrg if (cg_magic_constant (i)) 2817 1.1 mrg c ++; 2818 1.1 mrg 2819 1.1 mrg if (msp430x) 2820 1.1 mrg emit_insn (gen_delay_cycles_16x (GEN_INT (i), GEN_INT (n - c))); 2821 1.1 mrg else 2822 1.1 mrg emit_insn (gen_delay_cycles_16 (GEN_INT (i), GEN_INT (n - c))); 2823 1.1 mrg } 2824 1.1 mrg 2825 1.1 mrg while (c > 1) 2826 1.1 mrg { 2827 1.1 mrg emit_insn (gen_delay_cycles_2 ()); 2828 1.1 mrg c -= 2; 2829 1.1 mrg } 2830 1.1 mrg 2831 1.1 mrg if (c) 2832 1.1 mrg { 2833 1.1 mrg emit_insn (gen_delay_cycles_1 ()); 2834 1.1 mrg c -= 1; 2835 1.1 mrg } 2836 1.1 mrg 2837 1.1 mrg emit_insn (gen_delay_cycles_end (arg)); 2838 1.1 mrg 2839 1.1 mrg return NULL_RTX; 2840 1.1 mrg } 2841 1.1 mrg 2842 1.1 mrg static rtx 2843 1.1 mrg msp430_expand_builtin (tree exp, 2844 1.1 mrg rtx target ATTRIBUTE_UNUSED, 2845 1.1 mrg rtx subtarget ATTRIBUTE_UNUSED, 2846 1.1 mrg machine_mode mode ATTRIBUTE_UNUSED, 2847 1.1 mrg int ignore ATTRIBUTE_UNUSED) 2848 1.1 mrg { 2849 1.1 mrg tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0); 2850 1.1 mrg unsigned int fcode = DECL_MD_FUNCTION_CODE (fndecl); 2851 1.1 mrg rtx arg1 = expand_normal (CALL_EXPR_ARG (exp, 0)); 2852 1.1 mrg 2853 1.1 mrg if (fcode == MSP430_BUILTIN_DELAY_CYCLES) 2854 1.1 mrg return msp430_expand_delay_cycles (arg1); 2855 1.1 mrg 2856 1.1 mrg if (! msp430_is_interrupt_func ()) 2857 1.1 mrg { 2858 1.1 mrg error ("MSP430 built-in functions only work inside interrupt handlers"); 2859 1.1 mrg return NULL_RTX; 2860 1.1 mrg } 2861 1.1 mrg 2862 1.1 mrg if (! REG_P (arg1) && ! CONSTANT_P (arg1)) 2863 1.1 mrg arg1 = force_reg (mode, arg1); 2864 1.1 mrg 2865 1.1 mrg switch (fcode) 2866 1.1 mrg { 2867 1.1 mrg case MSP430_BUILTIN_BIC_SR: emit_insn (gen_bic_SR (arg1)); break; 2868 1.1 mrg case MSP430_BUILTIN_BIS_SR: emit_insn (gen_bis_SR (arg1)); break; 2869 1.1 mrg default: 2870 1.1 mrg internal_error ("bad builtin code"); 2871 1.1 mrg break; 2872 1.1 mrg } 2873 1.1 mrg return NULL_RTX; 2874 1.1 mrg } 2875 1.1 mrg 2876 1.1 mrg #undef TARGET_INIT_BUILTINS 2877 1.1 mrg #define TARGET_INIT_BUILTINS msp430_init_builtins 2878 1.1 mrg 2879 1.1 mrg #undef TARGET_EXPAND_BUILTIN 2880 1.1 mrg #define TARGET_EXPAND_BUILTIN msp430_expand_builtin 2881 1.1 mrg 2882 1.1 mrg #undef TARGET_BUILTIN_DECL 2883 1.1 mrg #define TARGET_BUILTIN_DECL msp430_builtin_decl 2884 1.1 mrg 2885 1.1 mrg void 2886 1.1 mrg msp430_expand_prologue (void) 2887 1.1 mrg { 2888 1.1 mrg int i, j; 2889 1.1 mrg int fs; 2890 1.1 mrg /* Always use stack_pointer_rtx instead of calling 2891 1.1 mrg rtx_gen_REG ourselves. Code elsewhere in GCC assumes 2892 1.1 mrg that there is a single rtx representing the stack pointer, 2893 1.1 mrg namely stack_pointer_rtx, and uses == to recognize it. */ 2894 1.1 mrg rtx sp = stack_pointer_rtx; 2895 1.1 mrg rtx p; 2896 1.1 mrg 2897 1.1 mrg if (is_naked_func ()) 2898 1.1 mrg { 2899 1.1 mrg /* We must generate some RTX as thread_prologue_and_epilogue_insns() 2900 1.1 mrg examines the output of the gen_prologue() function. */ 2901 1.1 mrg emit_insn (gen_rtx_CLOBBER (VOIDmode, GEN_INT (0))); 2902 1.1 mrg return; 2903 1.1 mrg } 2904 1.1 mrg 2905 1.1 mrg emit_insn (gen_prologue_start_marker ()); 2906 1.1 mrg 2907 1.1 mrg if (is_critical_func ()) 2908 1.1 mrg { 2909 1.1 mrg emit_insn (gen_push_intr_state ()); 2910 1.1 mrg emit_insn (gen_disable_interrupts ()); 2911 1.1 mrg } 2912 1.1 mrg else if (is_reentrant_func ()) 2913 1.1 mrg emit_insn (gen_disable_interrupts ()); 2914 1.1 mrg 2915 1.1 mrg if (!cfun->machine->computed) 2916 1.1 mrg msp430_compute_frame_info (); 2917 1.1 mrg 2918 1.1 mrg if (flag_stack_usage_info) 2919 1.1 mrg current_function_static_stack_size = cfun->machine->framesize; 2920 1.1 mrg 2921 1.1 mrg if (crtl->args.pretend_args_size) 2922 1.1 mrg { 2923 1.1 mrg rtx note; 2924 1.1 mrg 2925 1.1 mrg gcc_assert (crtl->args.pretend_args_size == 2); 2926 1.1 mrg 2927 1.1 mrg p = emit_insn (gen_grow_and_swap ()); 2928 1.1 mrg 2929 1.1 mrg /* Document the stack decrement... */ 2930 1.1 mrg note = F (gen_rtx_SET (stack_pointer_rtx, 2931 1.1 mrg gen_rtx_MINUS (Pmode, 2932 1.1 mrg stack_pointer_rtx, GEN_INT (2)))); 2933 1.1 mrg add_reg_note (p, REG_FRAME_RELATED_EXPR, note); 2934 1.1 mrg 2935 1.1 mrg /* ...and the establishment of a new location for the return address. */ 2936 1.1 mrg note = F (gen_rtx_SET (gen_rtx_MEM (Pmode, 2937 1.1 mrg gen_rtx_PLUS (Pmode, 2938 1.1 mrg stack_pointer_rtx, 2939 1.1 mrg GEN_INT (-2))), 2940 1.1 mrg pc_rtx)); 2941 1.1 mrg add_reg_note (p, REG_CFA_OFFSET, note); 2942 1.1 mrg F (p); 2943 1.1 mrg } 2944 1.1 mrg 2945 1.1 mrg for (i = 15; i >= 4; i--) 2946 1.1 mrg if (cfun->machine->need_to_save[i]) 2947 1.1 mrg { 2948 1.1 mrg /* We need to save COUNT sequential registers starting from regnum 2949 1.1 mrg I. */ 2950 1.1 mrg int seq, count; 2951 1.1 mrg rtx note; 2952 1.1 mrg 2953 1.1 mrg for (seq = i - 1; seq >= 4 && cfun->machine->need_to_save[seq]; seq --) 2954 1.1 mrg ; 2955 1.1 mrg count = i - seq; 2956 1.1 mrg 2957 1.1 mrg if (msp430x) 2958 1.1 mrg { 2959 1.1 mrg /* Note: with TARGET_LARGE we still use PUSHM as PUSHX.A is two 2960 1.1 mrg bytes bigger. */ 2961 1.1 mrg p = F (emit_insn (gen_pushm (gen_rtx_REG (Pmode, i), 2962 1.1 mrg GEN_INT (count)))); 2963 1.1 mrg 2964 1.1 mrg /* Document the stack decrement as a result of PUSHM. */ 2965 1.1 mrg note = gen_rtx_SEQUENCE (VOIDmode, rtvec_alloc (count + 1)); 2966 1.1 mrg 2967 1.1 mrg XVECEXP (note, 0, 0) 2968 1.1 mrg = F (gen_rtx_SET (stack_pointer_rtx, 2969 1.1 mrg gen_rtx_PLUS (Pmode, 2970 1.1 mrg stack_pointer_rtx, 2971 1.1 mrg GEN_INT (count * (TARGET_LARGE 2972 1.1 mrg ? -4 : -2))))); 2973 1.1 mrg 2974 1.1 mrg /* *sp-- = R[i-j] */ 2975 1.1 mrg /* sp+N R10 2976 1.1 mrg ... 2977 1.1 mrg sp R4 */ 2978 1.1 mrg for (j = 0; j < count; j ++) 2979 1.1 mrg { 2980 1.1 mrg rtx addr; 2981 1.1 mrg int ofs = (count - j - 1) * (TARGET_LARGE ? 4 : 2); 2982 1.1 mrg 2983 1.1 mrg if (ofs) 2984 1.1 mrg addr = gen_rtx_PLUS (Pmode, sp, GEN_INT (ofs)); 2985 1.1 mrg else 2986 1.1 mrg addr = stack_pointer_rtx; 2987 1.1 mrg 2988 1.1 mrg XVECEXP (note, 0, j + 1) = 2989 1.1 mrg F (gen_rtx_SET (gen_rtx_MEM (Pmode, addr), 2990 1.1 mrg gen_rtx_REG (Pmode, i - j))); 2991 1.1 mrg } 2992 1.1 mrg 2993 1.1 mrg add_reg_note (p, REG_FRAME_RELATED_EXPR, note); 2994 1.1 mrg i -= count - 1; 2995 1.1 mrg } 2996 1.1 mrg else 2997 1.1 mrg F (emit_insn (gen_push (gen_rtx_REG (Pmode, i)))); 2998 1.1 mrg } 2999 1.1 mrg 3000 1.1 mrg if (frame_pointer_needed) 3001 1.1 mrg F (emit_move_insn (gen_rtx_REG (Pmode, FRAME_POINTER_REGNUM), sp)); 3002 1.1 mrg 3003 1.1 mrg fs = cfun->machine->framesize_locals + cfun->machine->framesize_outgoing; 3004 1.1 mrg 3005 1.1 mrg increment_stack (- fs); 3006 1.1 mrg 3007 1.1 mrg emit_insn (gen_prologue_end_marker ()); 3008 1.1 mrg } 3009 1.1 mrg 3010 1.1 mrg void 3011 1.1 mrg msp430_expand_epilogue (int is_eh) 3012 1.1 mrg { 3013 1.1 mrg int i, j; 3014 1.1 mrg int fs; 3015 1.1 mrg rtx sp = stack_pointer_rtx; 3016 1.1 mrg rtx p; 3017 1.1 mrg int helper_n = 0; 3018 1.1 mrg 3019 1.1 mrg if (is_naked_func ()) 3020 1.1 mrg { 3021 1.1 mrg /* We must generate some RTX as thread_prologue_and_epilogue_insns() 3022 1.1 mrg examines the output of the gen_epilogue() function. */ 3023 1.1 mrg emit_insn (gen_rtx_CLOBBER (VOIDmode, GEN_INT (0))); 3024 1.1 mrg return; 3025 1.1 mrg } 3026 1.1 mrg 3027 1.1 mrg if (cfun->machine->need_to_save[10]) 3028 1.1 mrg { 3029 1.1 mrg /* Check for a helper function. */ 3030 1.1 mrg helper_n = 7; /* For when the loop below never sees a match. */ 3031 1.1 mrg for (i = 9; i >= 4; i--) 3032 1.1 mrg if (!cfun->machine->need_to_save[i]) 3033 1.1 mrg { 3034 1.1 mrg helper_n = 10 - i; 3035 1.1 mrg for (; i >= 4; i--) 3036 1.1 mrg if (cfun->machine->need_to_save[i]) 3037 1.1 mrg { 3038 1.1 mrg helper_n = 0; 3039 1.1 mrg break; 3040 1.1 mrg } 3041 1.1 mrg break; 3042 1.1 mrg } 3043 1.1 mrg } 3044 1.1 mrg 3045 1.1 mrg emit_insn (gen_epilogue_start_marker ()); 3046 1.1 mrg 3047 1.1 mrg if (cfun->decl && strcmp (IDENTIFIER_POINTER (DECL_NAME (cfun->decl)), 3048 1.1 mrg "main") == 0) 3049 1.1 mrg emit_insn (gen_msp430_refsym_need_exit ()); 3050 1.1 mrg 3051 1.1 mrg if (is_wakeup_func ()) 3052 1.1 mrg /* Clear the SCG1, SCG0, OSCOFF and CPUOFF bits in the saved copy of the 3053 1.1 mrg status register current residing on the stack. When this function 3054 1.1 mrg executes its RETI instruction the SR will be updated with this saved 3055 1.1 mrg value, thus ensuring that the processor is woken up from any low power 3056 1.1 mrg state in which it may be residing. */ 3057 1.1 mrg emit_insn (gen_bic_SR (GEN_INT (0xf0))); 3058 1.1 mrg 3059 1.1 mrg fs = cfun->machine->framesize_locals + cfun->machine->framesize_outgoing; 3060 1.1 mrg 3061 1.1 mrg increment_stack (fs); 3062 1.1 mrg 3063 1.1 mrg if (is_eh) 3064 1.1 mrg { 3065 1.1 mrg /* We need to add the right "SP" register save just after the 3066 1.1 mrg regular ones, so that when we pop it off we're in the EH 3067 1.1 mrg return frame, not this one. This overwrites our own return 3068 1.1 mrg address, but we're not going to be returning anyway. */ 3069 1.1 mrg rtx r12 = gen_rtx_REG (Pmode, 12); 3070 1.1 mrg rtx (*addPmode)(rtx, rtx, rtx) = TARGET_LARGE ? gen_addpsi3 : gen_addhi3; 3071 1.1 mrg 3072 1.1 mrg /* R12 will hold the new SP. */ 3073 1.1 mrg i = cfun->machine->framesize_regs; 3074 1.1 mrg emit_move_insn (r12, stack_pointer_rtx); 3075 1.1 mrg emit_insn (addPmode (r12, r12, EH_RETURN_STACKADJ_RTX)); 3076 1.1 mrg emit_insn (addPmode (r12, r12, GEN_INT (i))); 3077 1.1 mrg emit_move_insn (gen_rtx_MEM (Pmode, plus_constant (Pmode, 3078 1.1 mrg stack_pointer_rtx, 3079 1.1 mrg i)), r12); 3080 1.1 mrg } 3081 1.1 mrg 3082 1.1 mrg for (i = 4; i <= 15; i++) 3083 1.1 mrg if (cfun->machine->need_to_save[i]) 3084 1.1 mrg { 3085 1.1 mrg /* We need to restore COUNT sequential registers starting from regnum 3086 1.1 mrg I. */ 3087 1.1 mrg int seq; 3088 1.1 mrg int count = 1; 3089 1.1 mrg int helper_used = 0; 3090 1.1 mrg rtx note, addr; 3091 1.1 mrg 3092 1.1 mrg if (msp430x) 3093 1.1 mrg { 3094 1.1 mrg for (seq = i + 1; seq <= 15 && cfun->machine->need_to_save[seq]; 3095 1.1 mrg seq++) 3096 1.1 mrg ; 3097 1.1 mrg count = seq - i; 3098 1.1 mrg } 3099 1.1 mrg 3100 1.1 mrg if (msp430x) 3101 1.1 mrg { 3102 1.1 mrg /* Note: With TARGET_LARGE we still use 3103 1.1 mrg POPM as POPX.A is two bytes bigger. */ 3104 1.1 mrg p = F (emit_insn (gen_popm (stack_pointer_rtx, GEN_INT (seq - 1), 3105 1.1 mrg GEN_INT (count)))); 3106 1.1 mrg } 3107 1.1 mrg else if (i == 11 - helper_n 3108 1.1 mrg && ! msp430_is_interrupt_func () 3109 1.1 mrg && ! is_reentrant_func () 3110 1.1 mrg && ! is_critical_func () 3111 1.1 mrg && crtl->args.pretend_args_size == 0 3112 1.1 mrg /* Calling the helper takes as many bytes as the POP;RET 3113 1.1 mrg sequence. */ 3114 1.1 mrg && helper_n > 1 3115 1.1 mrg && !is_eh) 3116 1.1 mrg { 3117 1.1 mrg p = F (emit_jump_insn (gen_epilogue_helper (GEN_INT (helper_n)))); 3118 1.1 mrg count = helper_n; 3119 1.1 mrg helper_used = 1; 3120 1.1 mrg } 3121 1.1 mrg else 3122 1.1 mrg p = F (emit_insn (gen_pop (gen_rtx_REG (Pmode, i)))); 3123 1.1 mrg 3124 1.1 mrg /* Document the stack increment as a result of POPM. */ 3125 1.1 mrg note = gen_rtx_SEQUENCE (VOIDmode, rtvec_alloc (count + 1)); 3126 1.1 mrg 3127 1.1 mrg addr = gen_rtx_PLUS (Pmode, stack_pointer_rtx, 3128 1.1 mrg GEN_INT (count * (TARGET_LARGE ? 4 : 2))); 3129 1.1 mrg 3130 1.1 mrg XVECEXP (note, 0, 0) = F (gen_rtx_SET (stack_pointer_rtx, addr)); 3131 1.1 mrg 3132 1.1 mrg 3133 1.1 mrg /* *sp++ = R[i+j] */ 3134 1.1 mrg /* sp R4 3135 1.1 mrg ... 3136 1.1 mrg sp+N R10. */ 3137 1.1 mrg for (j = 0; j < count; j++) 3138 1.1 mrg { 3139 1.1 mrg int ofs = j * (TARGET_LARGE ? 4 : 2); 3140 1.1 mrg 3141 1.1 mrg if (ofs) 3142 1.1 mrg addr = gen_rtx_PLUS (Pmode, sp, GEN_INT (ofs)); 3143 1.1 mrg else 3144 1.1 mrg addr = stack_pointer_rtx; 3145 1.1 mrg 3146 1.1 mrg XVECEXP (note, 0, j + 1) 3147 1.1 mrg = F (gen_rtx_SET (gen_rtx_MEM (Pmode, addr), 3148 1.1 mrg gen_rtx_REG (Pmode, i + j))); 3149 1.1 mrg } 3150 1.1 mrg add_reg_note (p, REG_FRAME_RELATED_EXPR, note); 3151 1.1 mrg i += count - 1; 3152 1.1 mrg 3153 1.1 mrg if (helper_used) 3154 1.1 mrg return; 3155 1.1 mrg } 3156 1.1 mrg 3157 1.1 mrg if (is_eh) 3158 1.1 mrg { 3159 1.1 mrg /* Also pop SP, which puts us into the EH return frame. Except 3160 1.1 mrg that you can't "pop" sp, you have to just load it off the 3161 1.1 mrg stack. */ 3162 1.1 mrg emit_move_insn (stack_pointer_rtx, gen_rtx_MEM (Pmode, 3163 1.1 mrg stack_pointer_rtx)); 3164 1.1 mrg } 3165 1.1 mrg 3166 1.1 mrg if (crtl->args.pretend_args_size) 3167 1.1 mrg emit_insn (gen_swap_and_shrink ()); 3168 1.1 mrg 3169 1.1 mrg if (is_critical_func ()) 3170 1.1 mrg emit_insn (gen_pop_intr_state ()); 3171 1.1 mrg else if (is_reentrant_func ()) 3172 1.1 mrg emit_insn (gen_enable_interrupts ()); 3173 1.1 mrg 3174 1.1 mrg emit_jump_insn (gen_msp430_return ()); 3175 1.1 mrg } 3176 1.1 mrg 3177 1.1 mrg /* Implements EH_RETURN_STACKADJ_RTX. Saved and used later in 3178 1.1 mrg m32c_emit_eh_epilogue. */ 3179 1.1 mrg rtx 3180 1.1 mrg msp430_eh_return_stackadj_rtx (void) 3181 1.1 mrg { 3182 1.1 mrg if (!cfun->machine->eh_stack_adjust) 3183 1.1 mrg { 3184 1.1 mrg rtx sa; 3185 1.1 mrg 3186 1.1 mrg sa = gen_rtx_REG (Pmode, 15); 3187 1.1 mrg cfun->machine->eh_stack_adjust = sa; 3188 1.1 mrg } 3189 1.1 mrg return cfun->machine->eh_stack_adjust; 3190 1.1 mrg } 3191 1.1 mrg 3192 1.1 mrg /* This function is called before reload, to "fix" the stack in 3193 1.1 mrg preparation for an EH return. */ 3194 1.1 mrg void 3195 1.1 mrg msp430_expand_eh_return (rtx eh_handler) 3196 1.1 mrg { 3197 1.1 mrg /* These are all Pmode */ 3198 1.1 mrg rtx ap, sa, ra, tmp; 3199 1.1 mrg 3200 1.1 mrg ap = arg_pointer_rtx; 3201 1.1 mrg sa = msp430_eh_return_stackadj_rtx (); 3202 1.1 mrg ra = eh_handler; 3203 1.1 mrg 3204 1.1 mrg tmp = ap; 3205 1.1 mrg tmp = gen_rtx_PLUS (Pmode, ap, sa); 3206 1.1 mrg tmp = plus_constant (Pmode, tmp, TARGET_LARGE ? -4 : -2); 3207 1.1 mrg tmp = gen_rtx_MEM (Pmode, tmp); 3208 1.1 mrg emit_move_insn (tmp, ra); 3209 1.1 mrg } 3210 1.1 mrg 3211 1.1 mrg #undef TARGET_INIT_DWARF_REG_SIZES_EXTRA 3212 1.1 mrg #define TARGET_INIT_DWARF_REG_SIZES_EXTRA msp430_init_dwarf_reg_sizes_extra 3213 1.1 mrg void 3214 1.1 mrg msp430_init_dwarf_reg_sizes_extra (tree address) 3215 1.1 mrg { 3216 1.1 mrg int i; 3217 1.1 mrg rtx addr = expand_normal (address); 3218 1.1 mrg rtx mem = gen_rtx_MEM (BLKmode, addr); 3219 1.1 mrg 3220 1.1 mrg /* This needs to match msp430_unwind_word_mode (above). */ 3221 1.1 mrg if (!msp430x) 3222 1.1 mrg return; 3223 1.1 mrg 3224 1.1 mrg for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) 3225 1.1 mrg { 3226 1.1 mrg unsigned int dnum = DWARF_FRAME_REGNUM (i); 3227 1.1 mrg unsigned int rnum = DWARF2_FRAME_REG_OUT (dnum, 1); 3228 1.1 mrg 3229 1.1 mrg if (rnum < DWARF_FRAME_REGISTERS) 3230 1.1 mrg { 3231 1.1 mrg HOST_WIDE_INT offset = rnum * GET_MODE_SIZE (QImode); 3232 1.1 mrg 3233 1.1 mrg emit_move_insn (adjust_address (mem, QImode, offset), 3234 1.1 mrg gen_int_mode (4, QImode)); 3235 1.1 mrg } 3236 1.1 mrg } 3237 1.1 mrg } 3238 1.1 mrg 3239 1.1 mrg /* The MSP430 ABI defines a number of helper functions that should be 3240 1.1 mrg used for, for example, 32-bit shifts. This function is called to 3241 1.1 mrg emit such a function, using the table above to optimize some 3242 1.1 mrg cases. */ 3243 1.1 mrg void 3244 1.1 mrg msp430_expand_helper (rtx *operands, const char *helper_name, 3245 1.1 mrg bool const_variants) 3246 1.1 mrg { 3247 1.1 mrg rtx c, fusage, fsym; 3248 1.1 mrg char *helper_const = NULL; 3249 1.1 mrg int arg1 = 12; 3250 1.1 mrg int arg2 = 13; 3251 1.1 mrg int arg1sz = 1; 3252 1.1 mrg machine_mode arg0mode = GET_MODE (operands[0]); 3253 1.1 mrg machine_mode arg1mode = GET_MODE (operands[1]); 3254 1.1 mrg machine_mode arg2mode = GET_MODE (operands[2]); 3255 1.1 mrg int expand_mpy = startswith (helper_name, "__mspabi_mpy"); 3256 1.1 mrg /* This function has been used incorrectly if CONST_VARIANTS is TRUE for a 3257 1.1 mrg hwmpy function. */ 3258 1.1 mrg gcc_assert (!(expand_mpy && const_variants)); 3259 1.1 mrg 3260 1.1 mrg if (arg1mode != VOIDmode && arg2mode != VOIDmode) 3261 1.1 mrg /* Modes of arguments must be equal if not constants. */ 3262 1.1 mrg gcc_assert (arg1mode == arg2mode); 3263 1.1 mrg 3264 1.1 mrg if (arg1mode == VOIDmode) 3265 1.1 mrg arg1mode = arg0mode; 3266 1.1 mrg if (arg2mode == VOIDmode) 3267 1.1 mrg arg2mode = arg0mode; 3268 1.1 mrg 3269 1.1 mrg if (arg1mode == SImode) 3270 1.1 mrg { 3271 1.1 mrg arg2 = 14; 3272 1.1 mrg arg1sz = 2; 3273 1.1 mrg } 3274 1.1 mrg else if (arg1mode == DImode) 3275 1.1 mrg { 3276 1.1 mrg arg1 = 8; 3277 1.1 mrg arg1sz = 4; 3278 1.1 mrg arg2 = 12; 3279 1.1 mrg } 3280 1.1 mrg 3281 1.1 mrg /* Use the "const_variant" of a shift library function if requested. 3282 1.1 mrg These are faster, but have larger code size. */ 3283 1.1 mrg if (const_variants 3284 1.1 mrg && CONST_INT_P (operands[2]) 3285 1.1 mrg && INTVAL (operands[2]) >= 1 3286 1.1 mrg && INTVAL (operands[2]) <= 15) 3287 1.1 mrg { 3288 1.1 mrg /* Note that the INTVAL is limited in value and length by the conditional 3289 1.1 mrg above. */ 3290 1.1 mrg int len = strlen (helper_name) + 4; 3291 1.1 mrg helper_const = (char *) xmalloc (len); 3292 1.1 mrg snprintf (helper_const, len, "%s_%d", helper_name, 3293 1.1 mrg (int) INTVAL (operands[2])); 3294 1.1 mrg } 3295 1.1 mrg 3296 1.1 mrg /* Setup the arguments to the helper function. */ 3297 1.1 mrg emit_move_insn (gen_rtx_REG (arg1mode, arg1), 3298 1.1 mrg operands[1]); 3299 1.1 mrg if (!helper_const) 3300 1.1 mrg emit_move_insn (gen_rtx_REG (arg2mode, arg2), 3301 1.1 mrg operands[2]); 3302 1.1 mrg 3303 1.1 mrg if (expand_mpy) 3304 1.1 mrg { 3305 1.1 mrg if (msp430_use_f5_series_hwmult ()) 3306 1.1 mrg fsym = gen_rtx_SYMBOL_REF (VOIDmode, concat (helper_name, 3307 1.1 mrg "_f5hw", NULL)); 3308 1.1 mrg else if (msp430_use_32bit_hwmult ()) 3309 1.1 mrg { 3310 1.1 mrg /* When the arguments are 16-bits, the 16-bit hardware multiplier is 3311 1.1 mrg used. */ 3312 1.1 mrg if (arg1mode == HImode) 3313 1.1 mrg fsym = gen_rtx_SYMBOL_REF (VOIDmode, concat (helper_name, 3314 1.1 mrg "_hw", NULL)); 3315 1.1 mrg else 3316 1.1 mrg fsym = gen_rtx_SYMBOL_REF (VOIDmode, concat (helper_name, 3317 1.1 mrg "_hw32", NULL)); 3318 1.1 mrg } 3319 1.1 mrg else if (msp430_use_16bit_hwmult ()) 3320 1.1 mrg fsym = gen_rtx_SYMBOL_REF (VOIDmode, concat (helper_name, 3321 1.1 mrg "_hw", NULL)); 3322 1.1 mrg else 3323 1.1 mrg fsym = gen_rtx_SYMBOL_REF (VOIDmode, helper_name); 3324 1.1 mrg } 3325 1.1 mrg else 3326 1.1 mrg fsym = gen_rtx_SYMBOL_REF (VOIDmode, 3327 1.1 mrg helper_const ? helper_const : helper_name); 3328 1.1 mrg 3329 1.1 mrg c = gen_call_value_internal (gen_rtx_REG (arg0mode, 12), fsym, GEN_INT (0)); 3330 1.1 mrg 3331 1.1 mrg c = emit_call_insn (c); 3332 1.1 mrg RTL_CONST_CALL_P (c) = 1; 3333 1.1 mrg 3334 1.1 mrg /* Add register usage information for the arguments to the call. */ 3335 1.1 mrg fusage = NULL; 3336 1.1 mrg use_regs (&fusage, arg1, arg1sz); 3337 1.1 mrg if (!helper_const) 3338 1.1 mrg { 3339 1.1 mrg /* If we are expanding a shift, we only need to use the low register 3340 1.1 mrg for the shift amount. */ 3341 1.1 mrg if (!expand_mpy) 3342 1.1 mrg use_regs (&fusage, arg2, 1); 3343 1.1 mrg else 3344 1.1 mrg use_regs (&fusage, arg2, arg1sz); 3345 1.1 mrg } 3346 1.1 mrg add_function_usage_to (c, fusage); 3347 1.1 mrg 3348 1.1 mrg emit_move_insn (operands[0], 3349 1.1 mrg /* Return value will always start in R12. */ 3350 1.1 mrg gen_rtx_REG (arg0mode, 12)); 3351 1.1 mrg } 3352 1.1 mrg 3353 1.1 mrg /* Return TRUE if the helper function should be used and FALSE if the shifts 3354 1.1 mrg insns should be emitted inline. */ 3355 1.1 mrg static bool 3356 1.1 mrg use_helper_for_const_shift (machine_mode mode, HOST_WIDE_INT amt) 3357 1.1 mrg { 3358 1.1 mrg const int default_inline_shift = 4; 3359 1.1 mrg /* We initialize the option to 65 so we know if the user set it or not. */ 3360 1.1 mrg int user_set_max_inline = (msp430_max_inline_shift == 65 ? 0 : 1); 3361 1.1 mrg int max_inline = (user_set_max_inline ? msp430_max_inline_shift 3362 1.1 mrg : default_inline_shift); 3363 1.1 mrg /* 32-bit shifts are roughly twice as costly as 16-bit shifts so we adjust 3364 1.1 mrg the heuristic accordingly. */ 3365 1.1 mrg int max_inline_32 = max_inline / 2; 3366 1.1 mrg 3367 1.1 mrg if (mode == E_DImode) 3368 1.1 mrg return true; 3369 1.1 mrg 3370 1.1 mrg /* Don't use helpers for these modes on 430X, when optimizing for speed, or 3371 1.1 mrg when emitting a small number of insns. */ 3372 1.1 mrg if ((mode == E_QImode || mode == E_HImode || mode == E_PSImode) 3373 1.1 mrg && (msp430x 3374 1.1 mrg /* If the user set max_inline then we always obey that number. 3375 1.1 mrg Otherwise we always emit the shifts inline at -O2 and above. */ 3376 1.1 mrg || amt <= max_inline 3377 1.1 mrg || (!user_set_max_inline 3378 1.1 mrg && (optimize >= 2 && !optimize_size)))) 3379 1.1 mrg return false; 3380 1.1 mrg 3381 1.1 mrg /* 430 and 430X codegen for SImode shifts is the same. 3382 1.1 mrg Set a hard limit of 15 for the number of shifts that will be emitted 3383 1.1 mrg inline by default, even at -O2 and above, to prevent code size 3384 1.1 mrg explosion. */ 3385 1.1 mrg if (mode == E_SImode 3386 1.1 mrg && (amt <= max_inline_32 3387 1.1 mrg || (!user_set_max_inline 3388 1.1 mrg && (optimize >= 2 && !optimize_size) 3389 1.1 mrg && amt <= 15))) 3390 1.1 mrg return false; 3391 1.1 mrg 3392 1.1 mrg return true; 3393 1.1 mrg } 3394 1.1 mrg 3395 1.1 mrg /* For shift operations which will use an mspabi helper function, setup the 3396 1.1 mrg call to msp430_expand helper. Return 1 to indicate we have finished with 3397 1.1 mrg this insn and invoke "DONE". 3398 1.1 mrg Otherwise return 0 to indicate the insn should fallthrough. 3399 1.1 mrg Never FAIL. */ 3400 1.1 mrg int 3401 1.1 mrg msp430_expand_shift (enum rtx_code code, machine_mode mode, rtx *operands) 3402 1.1 mrg { 3403 1.1 mrg /* Always use the helper function when the shift amount is not a 3404 1.1 mrg constant. */ 3405 1.1 mrg if (!CONST_INT_P (operands[2]) 3406 1.1 mrg || mode == E_DImode 3407 1.1 mrg || use_helper_for_const_shift (mode, INTVAL (operands[2]))) 3408 1.1 mrg { 3409 1.1 mrg const char *helper_name = NULL; 3410 1.1 mrg /* The const variants of mspabi shifts have significantly larger code 3411 1.1 mrg size than the generic version, so use the generic version if 3412 1.1 mrg optimizing for size. */ 3413 1.1 mrg bool const_variant = !optimize_size; 3414 1.1 mrg switch (mode) 3415 1.1 mrg { 3416 1.1 mrg case E_HImode: 3417 1.1 mrg helper_name = (code == ASHIFT ? "__mspabi_slli" : 3418 1.1 mrg (code == ASHIFTRT ? "__mspabi_srai" : 3419 1.1 mrg (code == LSHIFTRT ? "__mspabi_srli" : 3420 1.1 mrg NULL))); 3421 1.1 mrg break; 3422 1.1 mrg case E_PSImode: 3423 1.1 mrg helper_name = (code == ASHIFT ? "__gnu_mspabi_sllp" : 3424 1.1 mrg (code == ASHIFTRT ? "__gnu_mspabi_srap" : 3425 1.1 mrg (code == LSHIFTRT ? "__gnu_mspabi_srlp" : 3426 1.1 mrg NULL))); 3427 1.1 mrg /* No const variant for PSImode shifts FIXME. */ 3428 1.1 mrg const_variant = false; 3429 1.1 mrg break; 3430 1.1 mrg case E_SImode: 3431 1.1 mrg helper_name = (code == ASHIFT ? "__mspabi_slll" : 3432 1.1 mrg (code == ASHIFTRT ? "__mspabi_sral" : 3433 1.1 mrg (code == LSHIFTRT ? "__mspabi_srll" : 3434 1.1 mrg NULL))); 3435 1.1 mrg break; 3436 1.1 mrg case E_DImode: 3437 1.1 mrg helper_name = (code == ASHIFT ? "__mspabi_sllll" : 3438 1.1 mrg (code == ASHIFTRT ? "__mspabi_srall" : 3439 1.1 mrg (code == LSHIFTRT ? "__mspabi_srlll" : 3440 1.1 mrg NULL))); 3441 1.1 mrg /* No const variant for DImode shifts. */ 3442 1.1 mrg const_variant = false; 3443 1.1 mrg break; 3444 1.1 mrg default: 3445 1.1 mrg gcc_unreachable (); 3446 1.1 mrg break; 3447 1.1 mrg } 3448 1.1 mrg gcc_assert (helper_name); 3449 1.1 mrg msp430_expand_helper (operands, helper_name, const_variant); 3450 1.1 mrg return 1; 3451 1.1 mrg } 3452 1.1 mrg /* When returning 0, there must be an insn to match the RTL pattern 3453 1.1 mrg otherwise there will be an unrecognizeable insn. */ 3454 1.1 mrg return 0; 3455 1.1 mrg } 3456 1.1 mrg 3457 1.1 mrg /* Helper function to emit a sequence of shift instructions. The amount of 3458 1.1 mrg shift instructions to emit is in OPERANDS[2]. 3459 1.1 mrg For 430 we output copies of identical inline shifts for all modes. 3460 1.1 mrg For 430X it is inneficient to do so for any modes except SI and DI, since we 3461 1.1 mrg can make use of R*M insns or RPT with 430X insns, so this function is only 3462 1.1 mrg used for SImode in that case. */ 3463 1.1 mrg int 3464 1.1 mrg msp430_output_asm_shift_insns (enum rtx_code code, machine_mode mode, 3465 1.1 mrg rtx *operands, bool return_length) 3466 1.1 mrg { 3467 1.1 mrg int i; 3468 1.1 mrg int amt; 3469 1.1 mrg int max_shift = GET_MODE_BITSIZE (mode) - 1; 3470 1.1 mrg int length = 0; 3471 1.1 mrg 3472 1.1 mrg gcc_assert (CONST_INT_P (operands[2])); 3473 1.1 mrg amt = INTVAL (operands[2]); 3474 1.1 mrg 3475 1.1 mrg if (amt == 0 || amt > max_shift) 3476 1.1 mrg { 3477 1.1 mrg if (return_length) 3478 1.1 mrg return 0; 3479 1.1 mrg switch (code) 3480 1.1 mrg { 3481 1.1 mrg case ASHIFT: 3482 1.1 mrg output_asm_insn ("# ignored undefined behaviour left shift " 3483 1.1 mrg "of %1 by %2", operands); 3484 1.1 mrg break; 3485 1.1 mrg case ASHIFTRT: 3486 1.1 mrg output_asm_insn ("# ignored undefined behaviour arithmetic right " 3487 1.1 mrg "shift of %1 by %2", operands); 3488 1.1 mrg break; 3489 1.1 mrg case LSHIFTRT: 3490 1.1 mrg output_asm_insn ("# ignored undefined behaviour logical right shift " 3491 1.1 mrg "of %1 by %2", operands); 3492 1.1 mrg break; 3493 1.1 mrg default: 3494 1.1 mrg gcc_unreachable (); 3495 1.1 mrg } 3496 1.1 mrg return 0; 3497 1.1 mrg } 3498 1.1 mrg 3499 1.1 mrg if (code == ASHIFT) 3500 1.1 mrg { 3501 1.1 mrg if (!msp430x && mode == HImode) 3502 1.1 mrg { 3503 1.1 mrg if (return_length) 3504 1.1 mrg length = 2 + (MEM_P (operands[0]) ? 2 : 0); 3505 1.1 mrg else 3506 1.1 mrg for (i = 0; i < amt; i++) 3507 1.1 mrg output_asm_insn ("RLA.W\t%0", operands); 3508 1.1 mrg } 3509 1.1 mrg else if (mode == SImode) 3510 1.1 mrg { 3511 1.1 mrg if (return_length) 3512 1.1 mrg length = 4 + (MEM_P (operands[0]) ? 4 : 0) 3513 1.1 mrg + (4 * msp430x_insn_required (operands[0])); 3514 1.1 mrg else 3515 1.1 mrg for (i = 0; i < amt; i++) 3516 1.1 mrg output_asm_insn ("RLA%X0.W\t%L0 { RLC%X0.W\t%H0", operands); 3517 1.1 mrg } 3518 1.1 mrg else 3519 1.1 mrg /* Catch unhandled cases. */ 3520 1.1 mrg gcc_unreachable (); 3521 1.1 mrg } 3522 1.1 mrg else if (code == ASHIFTRT) 3523 1.1 mrg { 3524 1.1 mrg if (!msp430x && mode == HImode) 3525 1.1 mrg { 3526 1.1 mrg if (return_length) 3527 1.1 mrg length = 2 + (MEM_P (operands[0]) ? 2 : 0); 3528 1.1 mrg else 3529 1.1 mrg for (i = 0; i < amt; i++) 3530 1.1 mrg output_asm_insn ("RRA.W\t%0", operands); 3531 1.1 mrg } 3532 1.1 mrg else if (mode == SImode) 3533 1.1 mrg { 3534 1.1 mrg if (return_length) 3535 1.1 mrg length = 4 + (MEM_P (operands[0]) ? 4 : 0) 3536 1.1 mrg + (4 * msp430x_insn_required (operands[0])); 3537 1.1 mrg else 3538 1.1 mrg for (i = 0; i < amt; i++) 3539 1.1 mrg output_asm_insn ("RRA%X0.W\t%H0 { RRC%X0.W\t%L0", operands); 3540 1.1 mrg } 3541 1.1 mrg else 3542 1.1 mrg gcc_unreachable (); 3543 1.1 mrg } 3544 1.1 mrg else if (code == LSHIFTRT) 3545 1.1 mrg { 3546 1.1 mrg if (!msp430x && mode == HImode) 3547 1.1 mrg { 3548 1.1 mrg if (return_length) 3549 1.1 mrg length = 4 + (MEM_P (operands[0]) ? 2 : 0); 3550 1.1 mrg else 3551 1.1 mrg for (i = 0; i < amt; i++) 3552 1.1 mrg output_asm_insn ("CLRC { RRC.W\t%0", operands); 3553 1.1 mrg } 3554 1.1 mrg else if (mode == SImode) 3555 1.1 mrg { 3556 1.1 mrg if (return_length) 3557 1.1 mrg length = 6 + (MEM_P (operands[0]) ? 4 : 0) 3558 1.1 mrg + (4 * msp430x_insn_required (operands[0])); 3559 1.1 mrg else 3560 1.1 mrg for (i = 0; i < amt; i++) 3561 1.1 mrg output_asm_insn ("CLRC { RRC%X0.W\t%H0 { RRC%X0.W\t%L0", 3562 1.1 mrg operands); 3563 1.1 mrg } 3564 1.1 mrg /* FIXME: Why doesn't "RRUX.W\t%H0 { RRC%X0.W\t%L0" work for msp430x? 3565 1.1 mrg It causes execution timeouts e.g. pr41963.c. */ 3566 1.1 mrg #if 0 3567 1.1 mrg else if (msp430x && mode == SImode) 3568 1.1 mrg { 3569 1.1 mrg if (return_length) 3570 1.1 mrg length = 2; 3571 1.1 mrg else 3572 1.1 mrg for (i = 0; i < amt; i++) 3573 1.1 mrg output_asm_insn ("RRUX.W\t%H0 { RRC%X0.W\t%L0", operands); 3574 1.1 mrg } 3575 1.1 mrg #endif 3576 1.1 mrg else 3577 1.1 mrg gcc_unreachable (); 3578 1.1 mrg } 3579 1.1 mrg return length * amt; 3580 1.1 mrg } 3581 1.1 mrg 3582 1.1 mrg /* Called by cbranch<mode>4 to coerce operands into usable forms. */ 3583 1.1 mrg void 3584 1.1 mrg msp430_fixup_compare_operands (machine_mode my_mode, rtx * operands) 3585 1.1 mrg { 3586 1.1 mrg /* constants we're looking for, not constants which are allowed. */ 3587 1.1 mrg int const_op_idx = 1; 3588 1.1 mrg 3589 1.1 mrg if (msp430_reversible_cmp_operator (operands[0], VOIDmode)) 3590 1.1 mrg const_op_idx = 2; 3591 1.1 mrg 3592 1.1 mrg if (GET_CODE (operands[const_op_idx]) != REG 3593 1.1 mrg && GET_CODE (operands[const_op_idx]) != MEM) 3594 1.1 mrg operands[const_op_idx] = copy_to_mode_reg (my_mode, operands[const_op_idx]); 3595 1.1 mrg } 3596 1.1 mrg 3597 1.1 mrg /* Simplify_gen_subreg() doesn't handle memory references the way we 3598 1.1 mrg need it to below, so we use this function for when we must get a 3599 1.1 mrg valid subreg in a "natural" state. */ 3600 1.1 mrg rtx 3601 1.1 mrg msp430_subreg (machine_mode mode, rtx r, machine_mode omode, int byte) 3602 1.1 mrg { 3603 1.1 mrg rtx rv; 3604 1.1 mrg gcc_assert (mode == HImode); 3605 1.1 mrg 3606 1.1 mrg if (GET_CODE (r) == SUBREG 3607 1.1 mrg && SUBREG_BYTE (r) == 0) 3608 1.1 mrg { 3609 1.1 mrg rtx ireg = SUBREG_REG (r); 3610 1.1 mrg machine_mode imode = GET_MODE (ireg); 3611 1.1 mrg 3612 1.1 mrg /* special case for (HI (SI (PSI ...), 0)) */ 3613 1.1 mrg if (imode == PSImode 3614 1.1 mrg && mode == HImode 3615 1.1 mrg && byte == 0) 3616 1.1 mrg rv = gen_rtx_SUBREG (mode, ireg, byte); 3617 1.1 mrg else 3618 1.1 mrg rv = simplify_gen_subreg (mode, ireg, imode, byte); 3619 1.1 mrg } 3620 1.1 mrg else if (GET_CODE (r) == MEM) 3621 1.1 mrg { 3622 1.1 mrg /* When byte == 2, we can be certain that we were already called with an 3623 1.1 mrg identical rtx with byte == 0. So we don't need to do anything to 3624 1.1 mrg get a 2 byte offset of a (mem (post_inc)) rtx, since the address has 3625 1.1 mrg already been offset by the post_inc itself. */ 3626 1.1 mrg if (GET_CODE (XEXP (r, 0)) == POST_INC && byte == 2) 3627 1.1 mrg byte = 0; 3628 1.1 mrg rv = adjust_address (r, mode, byte); 3629 1.1 mrg } 3630 1.1 mrg else if (GET_CODE (r) == SYMBOL_REF 3631 1.1 mrg && (byte == 0 || byte == 2) 3632 1.1 mrg && mode == HImode) 3633 1.1 mrg { 3634 1.1 mrg rv = gen_rtx_ZERO_EXTRACT (HImode, r, GEN_INT (16), GEN_INT (8*byte)); 3635 1.1 mrg rv = gen_rtx_CONST (HImode, r); 3636 1.1 mrg } 3637 1.1 mrg else 3638 1.1 mrg rv = simplify_gen_subreg (mode, r, omode, byte); 3639 1.1 mrg 3640 1.1 mrg if (!rv) 3641 1.1 mrg gcc_unreachable (); 3642 1.1 mrg 3643 1.1 mrg return rv; 3644 1.1 mrg } 3645 1.1 mrg 3646 1.1 mrg int 3647 1.1 mrg msp430_split_addsi (rtx *operands) 3648 1.1 mrg { 3649 1.1 mrg operands[3] = msp430_subreg (HImode, operands[0], SImode, 0); 3650 1.1 mrg operands[4] = msp430_subreg (HImode, operands[1], SImode, 0); 3651 1.1 mrg operands[5] = msp430_subreg (HImode, operands[2], SImode, 0); 3652 1.1 mrg operands[6] = msp430_subreg (HImode, operands[0], SImode, 2); 3653 1.1 mrg operands[7] = msp430_subreg (HImode, operands[1], SImode, 2); 3654 1.1 mrg operands[8] = msp430_subreg (HImode, operands[2], SImode, 2); 3655 1.1 mrg 3656 1.1 mrg /* BZ 64160: Do not use this splitter when the dest partially overlaps the 3657 1.1 mrg source. */ 3658 1.1 mrg if (reg_overlap_mentioned_p (operands[3], operands[7]) 3659 1.1 mrg || reg_overlap_mentioned_p (operands[3], operands[8])) 3660 1.1 mrg return 1; 3661 1.1 mrg 3662 1.1 mrg if (GET_CODE (operands[5]) == CONST_INT) 3663 1.1 mrg operands[9] = GEN_INT (INTVAL (operands[5]) & 0xffff); 3664 1.1 mrg /* Handle post_inc, for example: 3665 1.1 mrg (set (reg:SI) 3666 1.1 mrg (plus:SI (reg:SI) 3667 1.1 mrg (mem:SI (post_inc:PSI (reg:PSI))))). */ 3668 1.1 mrg else if (MEM_P (operands[5]) && GET_CODE (XEXP (operands[5], 0)) == POST_INC) 3669 1.1 mrg { 3670 1.1 mrg /* Strip out the post_inc from (mem (post_inc (reg))). */ 3671 1.1 mrg operands[9] = XEXP (XEXP (operands[5], 0), 0); 3672 1.1 mrg operands[9] = gen_rtx_MEM (HImode, operands[9]); 3673 1.1 mrg /* Then zero extend as normal. */ 3674 1.1 mrg operands[9] = gen_rtx_ZERO_EXTEND (SImode, operands[9]); 3675 1.1 mrg } 3676 1.1 mrg else 3677 1.1 mrg operands[9] = gen_rtx_ZERO_EXTEND (SImode, operands[5]); 3678 1.1 mrg return 0; 3679 1.1 mrg } 3680 1.1 mrg 3681 1.1 mrg /* Called by movsi_x to generate the HImode operands. */ 3682 1.1 mrg void 3683 1.1 mrg msp430_split_movsi (rtx *operands) 3684 1.1 mrg { 3685 1.1 mrg rtx op00, op02, op10, op12; 3686 1.1 mrg 3687 1.1 mrg op00 = msp430_subreg (HImode, operands[0], SImode, 0); 3688 1.1 mrg op02 = msp430_subreg (HImode, operands[0], SImode, 2); 3689 1.1 mrg 3690 1.1 mrg if (GET_CODE (operands[1]) == CONST 3691 1.1 mrg || GET_CODE (operands[1]) == SYMBOL_REF) 3692 1.1 mrg { 3693 1.1 mrg op10 = gen_rtx_ZERO_EXTRACT (HImode, operands[1], GEN_INT (16), 3694 1.1 mrg GEN_INT (0)); 3695 1.1 mrg op10 = gen_rtx_CONST (HImode, op10); 3696 1.1 mrg op12 = gen_rtx_ZERO_EXTRACT (HImode, operands[1], GEN_INT (16), 3697 1.1 mrg GEN_INT (16)); 3698 1.1 mrg op12 = gen_rtx_CONST (HImode, op12); 3699 1.1 mrg } 3700 1.1 mrg else 3701 1.1 mrg { 3702 1.1 mrg op10 = msp430_subreg (HImode, operands[1], SImode, 0); 3703 1.1 mrg op12 = msp430_subreg (HImode, operands[1], SImode, 2); 3704 1.1 mrg } 3705 1.1 mrg 3706 1.1 mrg if (rtx_equal_p (operands[0], operands[1])) 3707 1.1 mrg { 3708 1.1 mrg operands[2] = op02; 3709 1.1 mrg operands[4] = op12; 3710 1.1 mrg operands[3] = op00; 3711 1.1 mrg operands[5] = op10; 3712 1.1 mrg } 3713 1.1 mrg else if (rtx_equal_p (op00, op12) 3714 1.1 mrg /* Catch the case where we are loading (rN, rN+1) from mem (rN). */ 3715 1.1 mrg || (REG_P (op00) && reg_mentioned_p (op00, op10)) 3716 1.1 mrg /* Or storing (rN) into mem (rN). */ 3717 1.1 mrg || (REG_P (op10) && reg_mentioned_p (op10, op00))) 3718 1.1 mrg { 3719 1.1 mrg operands[2] = op02; 3720 1.1 mrg operands[4] = op12; 3721 1.1 mrg operands[3] = op00; 3722 1.1 mrg operands[5] = op10; 3723 1.1 mrg } 3724 1.1 mrg else 3725 1.1 mrg { 3726 1.1 mrg operands[2] = op00; 3727 1.1 mrg operands[4] = op10; 3728 1.1 mrg operands[3] = op02; 3729 1.1 mrg operands[5] = op12; 3730 1.1 mrg } 3731 1.1 mrg } 3732 1.1 mrg 3733 1.1 mrg 3734 1.1 mrg /* The MSPABI specifies the names of various helper functions, many of 3736 1.1 mrg which are compatible with GCC's helpers. This table maps the GCC 3737 1.1 mrg name to the MSPABI name. */ 3738 1.1 mrg static const struct 3739 1.1 mrg { 3740 1.1 mrg char const * const gcc_name; 3741 1.1 mrg char const * const ti_name; 3742 1.1 mrg } 3743 1.1 mrg helper_function_name_mappings[] = 3744 1.1 mrg { 3745 1.1 mrg /* Floating point to/from integer conversions. */ 3746 1.1 mrg { "__truncdfsf2", "__mspabi_cvtdf" }, 3747 1.1 mrg { "__extendsfdf2", "__mspabi_cvtfd" }, 3748 1.1 mrg { "__fixdfhi", "__mspabi_fixdi" }, 3749 1.1 mrg { "__fixdfsi", "__mspabi_fixdli" }, 3750 1.1 mrg { "__fixdfdi", "__mspabi_fixdlli" }, 3751 1.1 mrg { "__fixunsdfhi", "__mspabi_fixdu" }, 3752 1.1 mrg { "__fixunsdfsi", "__mspabi_fixdul" }, 3753 1.1 mrg { "__fixunsdfdi", "__mspabi_fixdull" }, 3754 1.1 mrg { "__fixsfhi", "__mspabi_fixfi" }, 3755 1.1 mrg { "__fixsfsi", "__mspabi_fixfli" }, 3756 1.1 mrg { "__fixsfdi", "__mspabi_fixflli" }, 3757 1.1 mrg { "__fixunsfhi", "__mspabi_fixfu" }, 3758 1.1 mrg { "__fixunsfsi", "__mspabi_fixful" }, 3759 1.1 mrg { "__fixunsfdi", "__mspabi_fixfull" }, 3760 1.1 mrg { "__floathisf", "__mspabi_fltif" }, 3761 1.1 mrg { "__floatsisf", "__mspabi_fltlif" }, 3762 1.1 mrg { "__floatdisf", "__mspabi_fltllif" }, 3763 1.1 mrg { "__floathidf", "__mspabi_fltid" }, 3764 1.1 mrg { "__floatsidf", "__mspabi_fltlid" }, 3765 1.1 mrg { "__floatdidf", "__mspabi_fltllid" }, 3766 1.1 mrg { "__floatunhisf", "__mspabi_fltuf" }, 3767 1.1 mrg { "__floatunsisf", "__mspabi_fltulf" }, 3768 1.1 mrg { "__floatundisf", "__mspabi_fltullf" }, 3769 1.1 mrg { "__floatunhidf", "__mspabi_fltud" }, 3770 1.1 mrg { "__floatunsidf", "__mspabi_fltuld" }, 3771 1.1 mrg { "__floatundidf", "__mspabi_fltulld" }, 3772 1.1 mrg 3773 1.1 mrg /* Floating point comparisons. */ 3774 1.1 mrg /* GCC uses individual functions for each comparison, TI uses one 3775 1.1 mrg compare <=> function. */ 3776 1.1 mrg 3777 1.1 mrg /* Floating point arithmetic. */ 3778 1.1 mrg { "__adddf3", "__mspabi_addd" }, 3779 1.1 mrg { "__addsf3", "__mspabi_addf" }, 3780 1.1 mrg { "__divdf3", "__mspabi_divd" }, 3781 1.1 mrg { "__divsf3", "__mspabi_divf" }, 3782 1.1 mrg { "__muldf3", "__mspabi_mpyd" }, 3783 1.1 mrg { "__mulsf3", "__mspabi_mpyf" }, 3784 1.1 mrg { "__subdf3", "__mspabi_subd" }, 3785 1.1 mrg { "__subsf3", "__mspabi_subf" }, 3786 1.1 mrg /* GCC does not use helper functions for negation. */ 3787 1.1 mrg 3788 1.1 mrg /* Integer multiply, divide, remainder. */ 3789 1.1 mrg { "__mulhi3", "__mspabi_mpyi" }, 3790 1.1 mrg { "__mulsi3", "__mspabi_mpyl" }, 3791 1.1 mrg { "__muldi3", "__mspabi_mpyll" }, 3792 1.1 mrg #if 0 3793 1.1 mrg /* Clarify signed vs unsigned first. */ 3794 1.1 mrg { "__mulhisi3", "__mspabi_mpysl" }, /* gcc doesn't use widening multiply 3795 1.1 mrg (yet?) */ 3796 1.1 mrg { "__mulsidi3", "__mspabi_mpysll" }, /* gcc doesn't use widening multiply 3797 1.1 mrg (yet?) */ 3798 1.1 mrg #endif 3799 1.1 mrg 3800 1.1 mrg { "__divhi3", "__mspabi_divi" }, 3801 1.1 mrg { "__divsi3", "__mspabi_divli" }, 3802 1.1 mrg { "__divdi3", "__mspabi_divlli" }, 3803 1.1 mrg { "__udivhi3", "__mspabi_divu" }, 3804 1.1 mrg { "__udivsi3", "__mspabi_divul" }, 3805 1.1 mrg { "__udivdi3", "__mspabi_divull" }, 3806 1.1 mrg { "__modhi3", "__mspabi_remi" }, 3807 1.1 mrg { "__modsi3", "__mspabi_remli" }, 3808 1.1 mrg { "__moddi3", "__mspabi_remlli" }, 3809 1.1 mrg { "__umodhi3", "__mspabi_remu" }, 3810 1.1 mrg { "__umodsi3", "__mspabi_remul" }, 3811 1.1 mrg { "__umoddi3", "__mspabi_remull" }, 3812 1.1 mrg 3813 1.1 mrg /* Bitwise operations. */ 3814 1.1 mrg /* Rotation - no rotation support yet. */ 3815 1.1 mrg /* Logical left shift - gcc already does these itself. */ 3816 1.1 mrg /* Arithmetic left shift - gcc already does these itself. */ 3817 1.1 mrg /* Arithmetic right shift - gcc already does these itself. */ 3818 1.1 mrg 3819 1.1 mrg { NULL, NULL } 3820 1.1 mrg }; 3821 1.1 mrg 3822 1.1 mrg /* Returns true if the current MCU supports an F5xxx series 3823 1.1 mrg hardware multiper. */ 3824 1.1 mrg 3825 1.1 mrg bool 3826 1.1 mrg msp430_use_f5_series_hwmult (void) 3827 1.1 mrg { 3828 1.1 mrg static const char * cached_match = NULL; 3829 1.1 mrg static bool cached_result; 3830 1.1 mrg 3831 1.1 mrg if (msp430_hwmult_type == MSP430_HWMULT_F5SERIES) 3832 1.1 mrg return true; 3833 1.1 mrg 3834 1.1 mrg if (target_mcu == NULL || msp430_hwmult_type != MSP430_HWMULT_AUTO) 3835 1.1 mrg return false; 3836 1.1 mrg 3837 1.1 mrg if (target_mcu == cached_match) 3838 1.1 mrg return cached_result; 3839 1.1 mrg 3840 1.1 mrg cached_match = target_mcu; 3841 1.1 mrg 3842 1.1 mrg if (strncasecmp (target_mcu, "msp430f5", 8) == 0) 3843 1.1 mrg return cached_result = true; 3844 1.1 mrg if (strncasecmp (target_mcu, "msp430fr5", 9) == 0) 3845 1.1 mrg return cached_result = true; 3846 1.1 mrg if (strncasecmp (target_mcu, "msp430f6", 8) == 0) 3847 1.1 mrg return cached_result = true; 3848 1.1 mrg 3849 1.1 mrg msp430_extract_mcu_data (target_mcu); 3850 1.1 mrg 3851 1.1 mrg if (extracted_mcu_data.name != NULL) 3852 1.1 mrg return cached_result = extracted_mcu_data.hwmpy == 8; 3853 1.1 mrg 3854 1.1 mrg return cached_result = false; 3855 1.1 mrg } 3856 1.1 mrg 3857 1.1 mrg /* Returns true if the current MCU has a second generation 3858 1.1 mrg 32-bit hardware multiplier. */ 3859 1.1 mrg 3860 1.1 mrg static bool 3861 1.1 mrg msp430_use_32bit_hwmult (void) 3862 1.1 mrg { 3863 1.1 mrg static const char * cached_match = NULL; 3864 1.1 mrg static bool cached_result; 3865 1.1 mrg 3866 1.1 mrg if (msp430_hwmult_type == MSP430_HWMULT_LARGE) 3867 1.1 mrg return true; 3868 1.1 mrg 3869 1.1 mrg if (target_mcu == NULL || msp430_hwmult_type != MSP430_HWMULT_AUTO) 3870 1.1 mrg return false; 3871 1.1 mrg 3872 1.1 mrg if (target_mcu == cached_match) 3873 1.1 mrg return cached_result; 3874 1.1 mrg 3875 1.1 mrg cached_match = target_mcu; 3876 1.1 mrg 3877 1.1 mrg msp430_extract_mcu_data (target_mcu); 3878 1.1 mrg if (extracted_mcu_data.name != NULL) 3879 1.1 mrg return cached_result = extracted_mcu_data.hwmpy == 4; 3880 1.1 mrg 3881 1.1 mrg return cached_result = false; 3882 1.1 mrg } 3883 1.1 mrg 3884 1.1 mrg /* Returns true if the current MCU has a first generation 3885 1.1 mrg 16-bit hardware multiplier. */ 3886 1.1 mrg 3887 1.1 mrg static bool 3888 1.1 mrg msp430_use_16bit_hwmult (void) 3889 1.1 mrg { 3890 1.1 mrg static const char * cached_match = NULL; 3891 1.1 mrg static bool cached_result; 3892 1.1 mrg 3893 1.1 mrg if (msp430_hwmult_type == MSP430_HWMULT_SMALL) 3894 1.1 mrg return true; 3895 1.1 mrg 3896 1.1 mrg if (target_mcu == NULL || msp430_hwmult_type != MSP430_HWMULT_AUTO) 3897 1.1 mrg return false; 3898 1.1 mrg 3899 1.1 mrg if (target_mcu == cached_match) 3900 1.1 mrg return cached_result; 3901 1.1 mrg 3902 1.1 mrg cached_match = target_mcu; 3903 1.1 mrg 3904 1.1 mrg msp430_extract_mcu_data (target_mcu); 3905 1.1 mrg if (extracted_mcu_data.name != NULL) 3906 1.1 mrg return cached_result = (extracted_mcu_data.hwmpy == 1 3907 1.1 mrg || extracted_mcu_data.hwmpy == 2); 3908 1.1 mrg 3909 1.1 mrg return cached_result = false; 3910 1.1 mrg } 3911 1.1 mrg 3912 1.1 mrg /* Returns true if the current MCU does not have a 3913 1.1 mrg hardware multiplier of any kind. */ 3914 1.1 mrg 3915 1.1 mrg bool 3916 1.1 mrg msp430_has_hwmult (void) 3917 1.1 mrg { 3918 1.1 mrg static const char * cached_match = NULL; 3919 1.1 mrg static bool cached_result; 3920 1.1 mrg 3921 1.1 mrg if (msp430_hwmult_type == MSP430_HWMULT_NONE) 3922 1.1 mrg return false; 3923 1.1 mrg 3924 1.1 mrg /* TRUE for any other explicit hwmult specified. */ 3925 1.1 mrg if (msp430_hwmult_type != MSP430_HWMULT_AUTO) 3926 1.1 mrg return true; 3927 1.1 mrg 3928 1.1 mrg /* Now handle -mhwmult=auto. */ 3929 1.1 mrg if (target_mcu == NULL) 3930 1.1 mrg return false; 3931 1.1 mrg 3932 1.1 mrg if (target_mcu == cached_match) 3933 1.1 mrg return cached_result; 3934 1.1 mrg 3935 1.1 mrg cached_match = target_mcu; 3936 1.1 mrg 3937 1.1 mrg msp430_extract_mcu_data (target_mcu); 3938 1.1 mrg if (extracted_mcu_data.name != NULL) 3939 1.1 mrg return cached_result = extracted_mcu_data.hwmpy != 0; 3940 1.1 mrg 3941 1.1 mrg /* If we do not recognise the MCU name, we assume that it does not support 3942 1.1 mrg any kind of hardware multiply - this is the safest assumption to make. */ 3943 1.1 mrg return cached_result = false; 3944 1.1 mrg } 3945 1.1 mrg 3946 1.1 mrg /* This function does the same as the default, but it will replace GCC 3947 1.1 mrg function names with the MSPABI-specified ones. */ 3948 1.1 mrg 3949 1.1 mrg void 3950 1.1 mrg msp430_output_labelref (FILE *file, const char *name) 3951 1.1 mrg { 3952 1.1 mrg int i; 3953 1.1 mrg 3954 1.1 mrg for (i = 0; helper_function_name_mappings[i].gcc_name; i++) 3955 1.1 mrg if (strcmp (helper_function_name_mappings[i].gcc_name, name) == 0) 3956 1.1 mrg { 3957 1.1 mrg name = helper_function_name_mappings[i].ti_name; 3958 1.1 mrg break; 3959 1.1 mrg } 3960 1.1 mrg 3961 1.1 mrg if (user_label_prefix[0] != 0) 3962 1.1 mrg fputs (user_label_prefix, file); 3963 1.1 mrg 3964 1.1 mrg fputs (name, file); 3965 1.1 mrg } 3966 1.1 mrg 3967 1.1 mrg /* Common code for msp430_print_operand... */ 3968 1.1 mrg 3969 1.1 mrg static void 3970 1.1 mrg msp430_print_operand_raw (FILE * file, rtx op) 3971 1.1 mrg { 3972 1.1 mrg HOST_WIDE_INT i; 3973 1.1 mrg 3974 1.1 mrg switch (GET_CODE (op)) 3975 1.1 mrg { 3976 1.1 mrg case REG: 3977 1.1 mrg fprintf (file, "%s", reg_names[REGNO (op)]); 3978 1.1 mrg break; 3979 1.1 mrg 3980 1.1 mrg case CONST_INT: 3981 1.1 mrg i = INTVAL (op); 3982 1.1 mrg if (TARGET_ASM_HEX) 3983 1.1 mrg fprintf (file, "%#" HOST_WIDE_INT_PRINT "x", i); 3984 1.1 mrg else 3985 1.1 mrg fprintf (file, "%" HOST_WIDE_INT_PRINT "d", i); 3986 1.1 mrg break; 3987 1.1 mrg 3988 1.1 mrg case CONST: 3989 1.1 mrg case PLUS: 3990 1.1 mrg case MINUS: 3991 1.1 mrg case SYMBOL_REF: 3992 1.1 mrg case LABEL_REF: 3993 1.1 mrg output_addr_const (file, op); 3994 1.1 mrg break; 3995 1.1 mrg 3996 1.1 mrg default: 3997 1.1 mrg print_rtl (file, op); 3998 1.1 mrg break; 3999 1.1 mrg } 4000 1.1 mrg } 4001 1.1 mrg 4002 1.1 mrg #undef TARGET_ASM_ALIGNED_PSI_OP 4003 1.1 mrg #define TARGET_ASM_ALIGNED_PSI_OP "\t.long\t" 4004 1.1 mrg #undef TARGET_ASM_UNALIGNED_PSI_OP 4005 1.1 mrg #define TARGET_ASM_UNALIGNED_PSI_OP TARGET_ASM_ALIGNED_PSI_OP 4006 1.1 mrg 4007 1.1 mrg #undef TARGET_PRINT_OPERAND_ADDRESS 4008 1.1 mrg #define TARGET_PRINT_OPERAND_ADDRESS msp430_print_operand_addr 4009 1.1 mrg 4010 1.1 mrg /* Output to stdio stream FILE the assembler syntax for an 4011 1.1 mrg instruction operand that is a memory reference whose address 4012 1.1 mrg is ADDR. */ 4013 1.1 mrg 4014 1.1 mrg static void 4015 1.1 mrg msp430_print_operand_addr (FILE * file, machine_mode /*mode*/, rtx addr) 4016 1.1 mrg { 4017 1.1 mrg switch (GET_CODE (addr)) 4018 1.1 mrg { 4019 1.1 mrg case PLUS: 4020 1.1 mrg msp430_print_operand_raw (file, XEXP (addr, 1)); 4021 1.1 mrg gcc_assert (REG_P (XEXP (addr, 0))); 4022 1.1 mrg fprintf (file, "(%s)", reg_names[REGNO (XEXP (addr, 0))]); 4023 1.1 mrg return; 4024 1.1 mrg 4025 1.1 mrg case REG: 4026 1.1 mrg fprintf (file, "@"); 4027 1.1 mrg break; 4028 1.1 mrg 4029 1.1 mrg case POST_INC: 4030 1.1 mrg fprintf (file, "@%s+", reg_names[REGNO (XEXP (addr, 0))]); 4031 1.1 mrg return; 4032 1.1 mrg 4033 1.1 mrg case CONST: 4034 1.1 mrg case CONST_INT: 4035 1.1 mrg case SYMBOL_REF: 4036 1.1 mrg case LABEL_REF: 4037 1.1 mrg fprintf (file, "&"); 4038 1.1 mrg break; 4039 1.1 mrg 4040 1.1 mrg default: 4041 1.1 mrg break; 4042 1.1 mrg } 4043 1.1 mrg 4044 1.1 mrg msp430_print_operand_raw (file, addr); 4045 1.1 mrg } 4046 1.1 mrg 4047 1.1 mrg /* We can only allow signed 15-bit indexes i.e. +/-32K. */ 4048 1.1 mrg static bool 4049 1.1 mrg msp430_check_index_not_high_mem (rtx op) 4050 1.1 mrg { 4051 1.1 mrg if (CONST_INT_P (op) 4052 1.1 mrg && IN_RANGE (INTVAL (op), HOST_WIDE_INT_M1U << 15, (1 << 15) - 1)) 4053 1.1 mrg return true; 4054 1.1 mrg return false; 4055 1.1 mrg } 4056 1.1 mrg 4057 1.1 mrg /* If this returns true, we don't need a 430X insn. */ 4058 1.1 mrg static bool 4059 1.1 mrg msp430_check_plus_not_high_mem (rtx op) 4060 1.1 mrg { 4061 1.1 mrg if (GET_CODE (op) != PLUS) 4062 1.1 mrg return false; 4063 1.1 mrg rtx op0 = XEXP (op, 0); 4064 1.1 mrg rtx op1 = XEXP (op, 1); 4065 1.1 mrg if (SYMBOL_REF_P (op0) 4066 1.1 mrg && (SYMBOL_REF_FLAGS (op0) & SYMBOL_FLAG_LOW_MEM) 4067 1.1 mrg && msp430_check_index_not_high_mem (op1)) 4068 1.1 mrg return true; 4069 1.1 mrg return false; 4070 1.1 mrg } 4071 1.1 mrg 4072 1.1 mrg /* Determine whether an RTX is definitely not a MEM referencing an address in 4073 1.1 mrg the upper memory region. Returns true if we've decided the address will be 4074 1.1 mrg in the lower memory region, or the RTX is not a MEM. Returns false 4075 1.1 mrg otherwise. 4076 1.1 mrg The Ys constraint will catch (mem (plus (const/reg)) but we catch cases 4077 1.1 mrg involving a symbol_ref here. */ 4078 1.1 mrg bool 4079 1.1 mrg msp430_op_not_in_high_mem (rtx op) 4080 1.1 mrg { 4081 1.1 mrg rtx op0; 4082 1.1 mrg 4083 1.1 mrg if (!TARGET_LARGE || !MEM_P (op)) 4084 1.1 mrg return true; 4085 1.1 mrg 4086 1.1 mrg op0 = XEXP (op, 0); 4087 1.1 mrg 4088 1.1 mrg if (SYMBOL_REF_P (op0) && (SYMBOL_REF_FLAGS (op0) & SYMBOL_FLAG_LOW_MEM)) 4089 1.1 mrg /* msp430_encode_section_info decided this mem will be in lower 4090 1.1 mrg memory. */ 4091 1.1 mrg return true; 4092 1.1 mrg 4093 1.1 mrg /* Check possibilites for (mem (plus)). 4094 1.1 mrg e.g. (mem (const (plus ((symbol_ref) (const_int))))) : &addr+2. */ 4095 1.1 mrg if (msp430_check_plus_not_high_mem (op0) 4096 1.1 mrg || ((GET_CODE (op0) == CONST) 4097 1.1 mrg && msp430_check_plus_not_high_mem (XEXP (op0, 0)))) 4098 1.1 mrg return true; 4099 1.1 mrg 4100 1.1 mrg /* An absolute 16-bit address is allowed. */ 4101 1.1 mrg if ((CONST_INT_P (op0) && (IN_RANGE (INTVAL (op0), 0, (1 << 16) - 1)))) 4102 1.1 mrg return true; 4103 1.1 mrg 4104 1.1 mrg /* Return false when undecided. */ 4105 1.1 mrg return false; 4106 1.1 mrg } 4107 1.1 mrg 4108 1.1 mrg /* Based on the operand OP, is a 430X insn required to handle it? 4109 1.1 mrg There are only 3 conditions for which a 430X insn is required: 4110 1.1 mrg - PSImode operand 4111 1.1 mrg - memory reference to a symbol which could be in upper memory 4112 1.1 mrg (so its address is > 0xFFFF) 4113 1.1 mrg - absolute address which has VOIDmode, i.e. (mem:HI (const_int)) 4114 1.1 mrg Use a 430 insn if none of these conditions are true. */ 4115 1.1 mrg bool 4116 1.1 mrg msp430x_insn_required (rtx op) 4117 1.1 mrg { 4118 1.1 mrg return (GET_MODE (op) == PSImode 4119 1.1 mrg || !msp430_op_not_in_high_mem (op)); 4120 1.1 mrg } 4121 1.1 mrg 4122 1.1 mrg #undef TARGET_PRINT_OPERAND 4123 1.1 mrg #define TARGET_PRINT_OPERAND msp430_print_operand 4124 1.1 mrg 4125 1.1 mrg /* A Select low 16-bits of the constant/register/memory operand. 4126 1.1 mrg B Select high 16-bits of the constant/register/memory 4127 1.1 mrg operand. 4128 1.1 mrg C Select bits 32-47 of the constant/register/memory operand. 4129 1.1 mrg D Select bits 48-63 of the constant/register/memory operand. 4130 1.1 mrg H Equivalent to @code{B} (for backwards compatibility). 4131 1.1 mrg I Print the inverse (logical @code{NOT}) of the constant 4132 1.1 mrg value. 4133 1.1 mrg J Print an integer without a @code{#} prefix. 4134 1.1 mrg L Equivalent to @code{A} (for backwards compatibility). 4135 1.1 mrg O Offset of the current frame from the top of the stack. 4136 1.1 mrg Q Use the @code{A} instruction postfix. 4137 1.1 mrg R Inverse of condition code, for unsigned comparisons. 4138 1.1 mrg W Subtract 16 from the constant value. 4139 1.1 mrg X Use the @code{X} instruction postfix. 4140 1.1 mrg Y Subtract 4 from the constant value. 4141 1.1 mrg Z Subtract 1 from the constant value. 4142 1.1 mrg b Append @code{.B}, @code{.W} or @code{.A} to the 4143 1.1 mrg instruction, depending on the mode. 4144 1.1 mrg d Offset 1 byte of a memory reference or constant value. 4145 1.1 mrg e Offset 3 bytes of a memory reference or constant value. 4146 1.1 mrg f Offset 5 bytes of a memory reference or constant value. 4147 1.1 mrg g Offset 7 bytes of a memory reference or constant value. 4148 1.1 mrg p Print the value of 2, raised to the power of the given 4149 1.1 mrg constant. Used to select the specified bit position. 4150 1.1 mrg r Inverse of condition code, for signed comparisons. 4151 1.1 mrg x Equivialent to @code{X}, but only for pointers. */ 4152 1.1 mrg 4153 1.1 mrg static void 4154 1.1 mrg msp430_print_operand (FILE * file, rtx op, int letter) 4155 1.1 mrg { 4156 1.1 mrg rtx addr; 4157 1.1 mrg /* These are used by the 'A', 'B', 'C', 'D', 'd', 'e', 'f' and 'g' modifiers 4158 1.1 mrg to describe how to process the operand to get the requested value. */ 4159 1.1 mrg int mem_off = 0; 4160 1.1 mrg int reg_off = 0; 4161 1.1 mrg int const_shift = 0; 4162 1.1 mrg 4163 1.1 mrg /* We can't use c, n, a, or l. */ 4164 1.1 mrg switch (letter) 4165 1.1 mrg { 4166 1.1 mrg case 'Z': 4167 1.1 mrg gcc_assert (CONST_INT_P (op)); 4168 1.1 mrg /* Print the constant value, less one. */ 4169 1.1 mrg fprintf (file, "#%ld", (long) (INTVAL (op) - 1)); 4170 1.1 mrg return; 4171 1.1 mrg case 'Y': 4172 1.1 mrg gcc_assert (CONST_INT_P (op)); 4173 1.1 mrg /* Print the constant value, less four. */ 4174 1.1 mrg fprintf (file, "#%ld", (long) (INTVAL (op) - 4)); 4175 1.1 mrg return; 4176 1.1 mrg case 'W': 4177 1.1 mrg gcc_assert (CONST_INT_P (op)); 4178 1.1 mrg /* Print the constant value, less 16. */ 4179 1.1 mrg fprintf (file, "#%ld", (long) (INTVAL (op) - 16)); 4180 1.1 mrg return; 4181 1.1 mrg case 'I': 4182 1.1 mrg if (GET_CODE (op) == CONST_INT) 4183 1.1 mrg { 4184 1.1 mrg /* Inverse of constants */ 4185 1.1 mrg int i = INTVAL (op); 4186 1.1 mrg fprintf (file, "%d", ~i); 4187 1.1 mrg return; 4188 1.1 mrg } 4189 1.1 mrg op = XEXP (op, 0); 4190 1.1 mrg break; 4191 1.1 mrg case 'r': /* Conditional jump where the condition is reversed. */ 4192 1.1 mrg switch (GET_CODE (op)) 4193 1.1 mrg { 4194 1.1 mrg case EQ: fprintf (file, "NE"); break; 4195 1.1 mrg case NE: fprintf (file, "EQ"); break; 4196 1.1 mrg case GEU: fprintf (file, "LO"); break; 4197 1.1 mrg case LTU: fprintf (file, "HS"); break; 4198 1.1 mrg case GE: fprintf (file, "L"); break; 4199 1.1 mrg case LT: fprintf (file, "GE"); break; 4200 1.1 mrg /* Assume these have reversed operands. */ 4201 1.1 mrg case GTU: fprintf (file, "HS"); break; 4202 1.1 mrg case LEU: fprintf (file, "LO"); break; 4203 1.1 mrg case GT: fprintf (file, "GE"); break; 4204 1.1 mrg case LE: fprintf (file, "L"); break; 4205 1.1 mrg default: 4206 1.1 mrg msp430_print_operand_raw (file, op); 4207 1.1 mrg break; 4208 1.1 mrg } 4209 1.1 mrg return; 4210 1.1 mrg case 'R': /* Conditional jump where the operands are reversed. */ 4211 1.1 mrg switch (GET_CODE (op)) 4212 1.1 mrg { 4213 1.1 mrg case GTU: fprintf (file, "LO"); break; 4214 1.1 mrg case LEU: fprintf (file, "HS"); break; 4215 1.1 mrg case GT: fprintf (file, "L"); break; 4216 1.1 mrg case LE: fprintf (file, "GE"); break; 4217 1.1 mrg default: 4218 1.1 mrg msp430_print_operand_raw (file, op); 4219 1.1 mrg break; 4220 1.1 mrg } 4221 1.1 mrg return; 4222 1.1 mrg case 'p': /* Bit position. 0 == 0x01, 3 = 0x08 etc. */ 4223 1.1 mrg gcc_assert (CONST_INT_P (op)); 4224 1.1 mrg fprintf (file, "#%d", 1 << INTVAL (op)); 4225 1.1 mrg return; 4226 1.1 mrg case 'b': 4227 1.1 mrg switch (GET_MODE (op)) 4228 1.1 mrg { 4229 1.1 mrg case E_QImode: fprintf (file, ".B"); return; 4230 1.1 mrg case E_HImode: fprintf (file, ".W"); return; 4231 1.1 mrg case E_PSImode: fprintf (file, ".A"); return; 4232 1.1 mrg case E_SImode: fprintf (file, ".A"); return; 4233 1.1 mrg default: 4234 1.1 mrg return; 4235 1.1 mrg } 4236 1.1 mrg case 'd': case 'e': case 'f': case 'g': 4237 1.1 mrg if (REG_P (op)) 4238 1.1 mrg { 4239 1.1 mrg output_operand_lossage ("%%d, %%e, %%f, %%g operand modifiers are " 4240 1.1 mrg "for memory references or constant values " 4241 1.1 mrg "only"); 4242 1.1 mrg return; 4243 1.1 mrg } 4244 1.1 mrg /* fallthru */ 4245 1.1 mrg case 'B': case 'H': /* high half */ 4246 1.1 mrg case 'C': 4247 1.1 mrg case 'D': 4248 1.1 mrg switch (letter) 4249 1.1 mrg { 4250 1.1 mrg case 'd': 4251 1.1 mrg mem_off = 1; 4252 1.1 mrg const_shift = 8; 4253 1.1 mrg break; 4254 1.1 mrg case 'B': 4255 1.1 mrg case 'H': 4256 1.1 mrg mem_off = 2; 4257 1.1 mrg reg_off = 1; 4258 1.1 mrg const_shift = 16; 4259 1.1 mrg break; 4260 1.1 mrg case 'e': 4261 1.1 mrg mem_off = 3; 4262 1.1 mrg const_shift = 24; 4263 1.1 mrg break; 4264 1.1 mrg case 'C': 4265 1.1 mrg mem_off = 4; 4266 1.1 mrg reg_off = 2; 4267 1.1 mrg const_shift = 32; 4268 1.1 mrg break; 4269 1.1 mrg case 'f': 4270 1.1 mrg mem_off = 5; 4271 1.1 mrg const_shift = 40; 4272 1.1 mrg break; 4273 1.1 mrg case 'D': 4274 1.1 mrg mem_off = 6; 4275 1.1 mrg reg_off = 3; 4276 1.1 mrg const_shift = 48; 4277 1.1 mrg break; 4278 1.1 mrg case 'g': 4279 1.1 mrg mem_off = 7; 4280 1.1 mrg const_shift = 56; 4281 1.1 mrg break; 4282 1.1 mrg default: 4283 1.1 mrg gcc_unreachable (); 4284 1.1 mrg break; 4285 1.1 mrg } 4286 1.1 mrg /* fallthru */ 4287 1.1 mrg case 'A': case 'L': /* Low half. */ 4288 1.1 mrg switch (GET_CODE (op)) 4289 1.1 mrg { 4290 1.1 mrg case MEM: 4291 1.1 mrg /* We don't need to adjust the address for post_inc. */ 4292 1.1 mrg op = adjust_address (op, Pmode, 4293 1.1 mrg (GET_CODE (XEXP (op, 0)) == POST_INC) 4294 1.1 mrg ? 0 : mem_off); 4295 1.1 mrg break; 4296 1.1 mrg case REG: 4297 1.1 mrg op = gen_rtx_REG (Pmode, REGNO (op) + reg_off); 4298 1.1 mrg break; 4299 1.1 mrg case CONST_INT: 4300 1.1 mrg op = GEN_INT (((long long) INTVAL (op) >> const_shift) & 0xffff); 4301 1.1 mrg letter = 0; 4302 1.1 mrg break; 4303 1.1 mrg default: 4304 1.1 mrg /* If you get here, figure out a test case :-) */ 4305 1.1 mrg gcc_unreachable (); 4306 1.1 mrg } 4307 1.1 mrg break; 4308 1.1 mrg 4309 1.1 mrg case 'X': 4310 1.1 mrg /* This is used to turn, for example, an ADD opcode into an ADDX 4311 1.1 mrg opcode when we're using 20-bit addresses. 4312 1.1 mrg This can be used for insns which have only one operand which might be 4313 1.1 mrg a mem. 4314 1.1 mrg If an insn has two different operands which could be memory operands, 4315 1.1 mrg then the "Yx" constraint must be used to determine if the X suffix is 4316 1.1 mrg required by checking both operands. */ 4317 1.1 mrg if (GET_MODE (op) == PSImode 4318 1.1 mrg || !msp430_op_not_in_high_mem (op)) 4319 1.1 mrg fprintf (file, "X"); 4320 1.1 mrg return; 4321 1.1 mrg 4322 1.1 mrg case 'x': 4323 1.1 mrg /* Similarly, but only for PSImodes. BIC, and other insn patterns using 4324 1.1 mrg the QHI mode iterator (which includes, QI, HI, and PSImode) use 4325 1.1 mrg this. */ 4326 1.1 mrg if (GET_MODE (op) == PSImode) 4327 1.1 mrg fprintf (file, "X"); 4328 1.1 mrg return; 4329 1.1 mrg 4330 1.1 mrg case 'Q': 4331 1.1 mrg /* Likewise, for BR -> BRA. */ 4332 1.1 mrg if (TARGET_LARGE) 4333 1.1 mrg fprintf (file, "A"); 4334 1.1 mrg return; 4335 1.1 mrg 4336 1.1 mrg case 'O': 4337 1.1 mrg /* Computes the offset to the top of the stack for the current frame. 4338 1.1 mrg This has to be done here rather than in, say, msp430_expand_builtin() 4339 1.1 mrg because builtins are expanded before the frame layout is 4340 1.1 mrg determined. */ 4341 1.1 mrg fprintf (file, "%d", 4342 1.1 mrg msp430_initial_elimination_offset (ARG_POINTER_REGNUM, 4343 1.1 mrg STACK_POINTER_REGNUM) 4344 1.1 mrg - (TARGET_LARGE ? 4 : 2)); 4345 1.1 mrg return; 4346 1.1 mrg 4347 1.1 mrg case 'J': 4348 1.1 mrg gcc_assert (GET_CODE (op) == CONST_INT); 4349 1.1 mrg case 0: 4350 1.1 mrg break; 4351 1.1 mrg default: 4352 1.1 mrg output_operand_lossage ("invalid operand prefix"); 4353 1.1 mrg return; 4354 1.1 mrg } 4355 1.1 mrg 4356 1.1 mrg switch (GET_CODE (op)) 4357 1.1 mrg { 4358 1.1 mrg case REG: 4359 1.1 mrg msp430_print_operand_raw (file, op); 4360 1.1 mrg break; 4361 1.1 mrg 4362 1.1 mrg case MEM: 4363 1.1 mrg addr = XEXP (op, 0); 4364 1.1 mrg msp430_print_operand_addr (file, GET_MODE (op), addr); 4365 1.1 mrg break; 4366 1.1 mrg 4367 1.1 mrg case CONST: 4368 1.1 mrg if (GET_CODE (XEXP (op, 0)) == ZERO_EXTRACT) 4369 1.1 mrg { 4370 1.1 mrg op = XEXP (op, 0); 4371 1.1 mrg switch (INTVAL (XEXP (op, 2))) 4372 1.1 mrg { 4373 1.1 mrg case 0: 4374 1.1 mrg fprintf (file, "#lo ("); 4375 1.1 mrg msp430_print_operand_raw (file, XEXP (op, 0)); 4376 1.1 mrg fprintf (file, ")"); 4377 1.1 mrg break; 4378 1.1 mrg 4379 1.1 mrg case 16: 4380 1.1 mrg fprintf (file, "#hi ("); 4381 1.1 mrg msp430_print_operand_raw (file, XEXP (op, 0)); 4382 1.1 mrg fprintf (file, ")"); 4383 1.1 mrg break; 4384 1.1 mrg 4385 1.1 mrg default: 4386 1.1 mrg output_operand_lossage ("invalid zero extract"); 4387 1.1 mrg break; 4388 1.1 mrg } 4389 1.1 mrg break; 4390 1.1 mrg } 4391 1.1 mrg /* Fall through. */ 4392 1.1 mrg case CONST_INT: 4393 1.1 mrg case SYMBOL_REF: 4394 1.1 mrg case LABEL_REF: 4395 1.1 mrg if (letter == 0) 4396 1.1 mrg fprintf (file, "#"); 4397 1.1 mrg msp430_print_operand_raw (file, op); 4398 1.1 mrg break; 4399 1.1 mrg 4400 1.1 mrg case EQ: fprintf (file, "EQ"); break; 4401 1.1 mrg case NE: fprintf (file, "NE"); break; 4402 1.1 mrg case GEU: fprintf (file, "HS"); break; 4403 1.1 mrg case LTU: fprintf (file, "LO"); break; 4404 1.1 mrg case GE: fprintf (file, "GE"); break; 4405 1.1 mrg case LT: fprintf (file, "L"); break; 4406 1.1 mrg 4407 1.1 mrg default: 4408 1.1 mrg print_rtl (file, op); 4409 1.1 mrg break; 4410 1.1 mrg } 4411 1.1 mrg } 4412 1.1 mrg 4413 1.1 mrg 4414 1.1 mrg /* Frame stuff. */ 4416 1.1 mrg 4417 1.1 mrg rtx 4418 1.1 mrg msp430_return_addr_rtx (int count) 4419 1.1 mrg { 4420 1.1 mrg int ra_size; 4421 1.1 mrg if (count) 4422 1.1 mrg return NULL_RTX; 4423 1.1 mrg 4424 1.1 mrg ra_size = TARGET_LARGE ? 4 : 2; 4425 1.1 mrg if (crtl->args.pretend_args_size) 4426 1.1 mrg ra_size += 2; 4427 1.1 mrg 4428 1.1 mrg return gen_rtx_MEM (Pmode, gen_rtx_PLUS (Pmode, arg_pointer_rtx, 4429 1.1 mrg GEN_INT (- ra_size))); 4430 1.1 mrg } 4431 1.1 mrg 4432 1.1 mrg rtx 4433 1.1 mrg msp430_incoming_return_addr_rtx (void) 4434 1.1 mrg { 4435 1.1 mrg return gen_rtx_MEM (Pmode, stack_pointer_rtx); 4436 1.1 mrg } 4437 1.1 mrg 4438 1.1 mrg /* If the path to the MSP430-GCC support files has been found by examining 4439 1.1 mrg an environment variable (see msp430_check_env_var_for_devices in 4440 1.1 mrg msp430-devices.cc), or -mdevices-csv-loc=, register this path as an include 4441 1.1 mrg directory so the user can #include msp430.h without needing to specify the 4442 1.1 mrg path to the support files with -I. */ 4443 1.1 mrg void 4444 1.1 mrg msp430_register_pre_includes (const char *sysroot ATTRIBUTE_UNUSED, 4445 1.1 mrg const char *iprefix ATTRIBUTE_UNUSED, 4446 1.1 mrg int stdinc ATTRIBUTE_UNUSED) 4447 1.1 mrg { 4448 1.1 mrg char *include_dir; 4449 1.1 mrg if (msp430_devices_csv_loc) 4450 1.1 mrg include_dir = xstrdup (msp430_devices_csv_loc); 4451 1.1 mrg else if (msp430_check_env_var_for_devices (&include_dir)) 4452 1.1 mrg return; 4453 1.1 mrg include_dir = msp430_dirname (include_dir); 4454 1.1 mrg 4455 1.1 mrg include_dir = update_path (include_dir, ""); 4456 1.1 mrg add_path (include_dir, INC_SYSTEM, false, false); 4457 1.1 mrg } 4458 1.1 mrg 4459 1.1 mrg /* Instruction generation stuff. */ 4461 1.1 mrg 4462 1.1 mrg /* Generate a sequence of instructions to sign-extend an HI 4463 1.1 mrg value into an SI value. Handles the tricky case where 4464 1.1 mrg we are overwriting the destination. 4465 1.1 mrg Return the number of bytes used by the emitted instructions. 4466 1.1 mrg If RETURN_LENGTH is true then do not emit the assembly instruction 4467 1.1 mrg sequence. */ 4468 1.1 mrg int 4469 1.1 mrg msp430x_extendhisi (rtx * operands, bool return_length) 4470 1.1 mrg { 4471 1.1 mrg if (REGNO (operands[0]) == REGNO (operands[1])) 4472 1.1 mrg { 4473 1.1 mrg /* Low word of dest == source word. */ 4474 1.1 mrg if (!return_length) 4475 1.1 mrg output_asm_insn ("BIT.W\t#0x8000, %L0 { SUBC.W\t%H0, %H0 { INV.W\t%H0, %H0", 4476 1.1 mrg operands); 4477 1.1 mrg return 8; 4478 1.1 mrg } 4479 1.1 mrg else if (! msp430x) 4480 1.1 mrg { 4481 1.1 mrg /* Note: This sequence is approximately the same length as invoking a 4482 1.1 mrg helper function to perform the sign-extension, as in: 4483 1.1 mrg 4484 1.1 mrg MOV.W %1, %L0 4485 1.1 mrg MOV.W %1, r12 4486 1.1 mrg CALL __mspabi_srai_15 4487 1.1 mrg MOV.W r12, %H0 4488 1.1 mrg 4489 1.1 mrg but this version does not involve any function calls or using argument 4490 1.1 mrg registers, so it reduces register pressure. */ 4491 1.1 mrg if (!return_length) 4492 1.1 mrg output_asm_insn ("MOV.W\t%1, %L0 { BIT.W\t#0x8000, %L0 { SUBC.W\t%H0, %H0 { INV.W\t%H0, %H0", 4493 1.1 mrg operands); 4494 1.1 mrg return 10; 4495 1.1 mrg } 4496 1.1 mrg else if (REGNO (operands[0]) + 1 == REGNO (operands[1])) 4497 1.1 mrg { 4498 1.1 mrg /* High word of dest == source word. */ 4499 1.1 mrg if (!return_length) 4500 1.1 mrg output_asm_insn ("MOV.W\t%1, %L0 { RPT\t#15 { RRAX.W\t%H0", 4501 1.1 mrg operands); 4502 1.1 mrg return 6; 4503 1.1 mrg } 4504 1.1 mrg 4505 1.1 mrg /* No overlap between dest and source. */ 4506 1.1 mrg if (!return_length) 4507 1.1 mrg output_asm_insn ("MOV.W\t%1, %L0 { MOV.W\t%1, %H0 { RPT\t#15 { RRAX.W\t%H0", 4508 1.1 mrg operands); 4509 1.1 mrg return 8; 4510 1.1 mrg } 4511 1.1 mrg 4512 1.1 mrg /* Stop GCC from thinking that it can eliminate (SUBREG:PSI (SI)). */ 4513 1.1 mrg 4514 1.1 mrg #undef TARGET_CAN_CHANGE_MODE_CLASS 4515 1.1 mrg #define TARGET_CAN_CHANGE_MODE_CLASS msp430_can_change_mode_class 4516 1.1 mrg 4517 1.1 mrg static bool 4518 1.1 mrg msp430_can_change_mode_class (machine_mode from, machine_mode to, reg_class_t) 4519 1.1 mrg { 4520 1.1 mrg if ((to == PSImode && from == SImode) 4521 1.1 mrg || (to == SImode && from == PSImode) 4522 || (to == DImode && from == PSImode) 4523 || (to == PSImode && from == DImode)) 4524 return false; 4525 return true; 4526 } 4527 4528 #undef TARGET_HAVE_SPECULATION_SAFE_VALUE 4530 #define TARGET_HAVE_SPECULATION_SAFE_VALUE speculation_safe_value_not_needed 4531 4532 struct gcc_target targetm = TARGET_INITIALIZER; 4533 4534 #include "gt-msp430.h" 4535