msp430.cc revision 1.1 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