200x-xx-xx Kazu Hirata <kazu@codesourcery.com> Richard Sandiford <richard@codesourcer...
[gcc.git] / gcc / config / m68k / m68k.c
1 /* Subroutines for insn-output.c for Motorola 68000 family.
2 Copyright (C) 1987, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
3 2001, 2003, 2004, 2005, 2006
4 Free Software Foundation, Inc.
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2, or (at your option)
11 any later version.
12
13 GCC is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING. If not, write to
20 the Free Software Foundation, 51 Franklin Street, Fifth Floor,
21 Boston, MA 02110-1301, USA. */
22
23 #include "config.h"
24 #include "system.h"
25 #include "coretypes.h"
26 #include "tm.h"
27 #include "tree.h"
28 #include "rtl.h"
29 #include "function.h"
30 #include "regs.h"
31 #include "hard-reg-set.h"
32 #include "real.h"
33 #include "insn-config.h"
34 #include "conditions.h"
35 #include "output.h"
36 #include "insn-attr.h"
37 #include "recog.h"
38 #include "toplev.h"
39 #include "expr.h"
40 #include "reload.h"
41 #include "tm_p.h"
42 #include "target.h"
43 #include "target-def.h"
44 #include "debug.h"
45 #include "flags.h"
46
47 enum reg_class regno_reg_class[] =
48 {
49 DATA_REGS, DATA_REGS, DATA_REGS, DATA_REGS,
50 DATA_REGS, DATA_REGS, DATA_REGS, DATA_REGS,
51 ADDR_REGS, ADDR_REGS, ADDR_REGS, ADDR_REGS,
52 ADDR_REGS, ADDR_REGS, ADDR_REGS, ADDR_REGS,
53 FP_REGS, FP_REGS, FP_REGS, FP_REGS,
54 FP_REGS, FP_REGS, FP_REGS, FP_REGS,
55 ADDR_REGS
56 };
57
58
59 /* The ASM_DOT macro allows easy string pasting to handle the differences
60 between MOTOROLA and MIT syntaxes in asm_fprintf(), which doesn't
61 support the %. option. */
62 #if MOTOROLA
63 # define ASM_DOT "."
64 # define ASM_DOTW ".w"
65 # define ASM_DOTL ".l"
66 #else
67 # define ASM_DOT ""
68 # define ASM_DOTW ""
69 # define ASM_DOTL ""
70 #endif
71
72
73 /* Structure describing stack frame layout. */
74 struct m68k_frame
75 {
76 /* Stack pointer to frame pointer offset. */
77 HOST_WIDE_INT offset;
78
79 /* Offset of FPU registers. */
80 HOST_WIDE_INT foffset;
81
82 /* Frame size in bytes (rounded up). */
83 HOST_WIDE_INT size;
84
85 /* Data and address register. */
86 int reg_no;
87 unsigned int reg_mask;
88 unsigned int reg_rev_mask;
89
90 /* FPU registers. */
91 int fpu_no;
92 unsigned int fpu_mask;
93 unsigned int fpu_rev_mask;
94
95 /* Offsets relative to ARG_POINTER. */
96 HOST_WIDE_INT frame_pointer_offset;
97 HOST_WIDE_INT stack_pointer_offset;
98
99 /* Function which the above information refers to. */
100 int funcdef_no;
101 };
102
103 /* Current frame information calculated by m68k_compute_frame_layout(). */
104 static struct m68k_frame current_frame;
105
106 static bool m68k_handle_option (size_t, const char *, int);
107 static rtx find_addr_reg (rtx);
108 static const char *singlemove_string (rtx *);
109 static void m68k_output_function_prologue (FILE *, HOST_WIDE_INT);
110 static void m68k_output_function_epilogue (FILE *, HOST_WIDE_INT);
111 #ifdef M68K_TARGET_COFF
112 static void m68k_coff_asm_named_section (const char *, unsigned int, tree);
113 #endif /* M68K_TARGET_COFF */
114 static void m68k_output_mi_thunk (FILE *, tree, HOST_WIDE_INT,
115 HOST_WIDE_INT, tree);
116 static rtx m68k_struct_value_rtx (tree, int);
117 static bool m68k_interrupt_function_p (tree func);
118 static tree m68k_handle_fndecl_attribute (tree *node, tree name,
119 tree args, int flags,
120 bool *no_add_attrs);
121 static void m68k_compute_frame_layout (void);
122 static bool m68k_save_reg (unsigned int regno, bool interrupt_handler);
123 static int const_int_cost (rtx);
124 static bool m68k_rtx_costs (rtx, int, int, int *);
125 \f
126
127 /* Specify the identification number of the library being built */
128 const char *m68k_library_id_string = "_current_shared_library_a5_offset_";
129
130 /* Nonzero if the last compare/test insn had FP operands. The
131 sCC expanders peek at this to determine what to do for the
132 68060, which has no fsCC instructions. */
133 int m68k_last_compare_had_fp_operands;
134 \f
135 /* Initialize the GCC target structure. */
136
137 #if INT_OP_GROUP == INT_OP_DOT_WORD
138 #undef TARGET_ASM_ALIGNED_HI_OP
139 #define TARGET_ASM_ALIGNED_HI_OP "\t.word\t"
140 #endif
141
142 #if INT_OP_GROUP == INT_OP_NO_DOT
143 #undef TARGET_ASM_BYTE_OP
144 #define TARGET_ASM_BYTE_OP "\tbyte\t"
145 #undef TARGET_ASM_ALIGNED_HI_OP
146 #define TARGET_ASM_ALIGNED_HI_OP "\tshort\t"
147 #undef TARGET_ASM_ALIGNED_SI_OP
148 #define TARGET_ASM_ALIGNED_SI_OP "\tlong\t"
149 #endif
150
151 #if INT_OP_GROUP == INT_OP_DC
152 #undef TARGET_ASM_BYTE_OP
153 #define TARGET_ASM_BYTE_OP "\tdc.b\t"
154 #undef TARGET_ASM_ALIGNED_HI_OP
155 #define TARGET_ASM_ALIGNED_HI_OP "\tdc.w\t"
156 #undef TARGET_ASM_ALIGNED_SI_OP
157 #define TARGET_ASM_ALIGNED_SI_OP "\tdc.l\t"
158 #endif
159
160 #undef TARGET_ASM_UNALIGNED_HI_OP
161 #define TARGET_ASM_UNALIGNED_HI_OP TARGET_ASM_ALIGNED_HI_OP
162 #undef TARGET_ASM_UNALIGNED_SI_OP
163 #define TARGET_ASM_UNALIGNED_SI_OP TARGET_ASM_ALIGNED_SI_OP
164
165 #undef TARGET_ASM_FUNCTION_PROLOGUE
166 #define TARGET_ASM_FUNCTION_PROLOGUE m68k_output_function_prologue
167 #undef TARGET_ASM_FUNCTION_EPILOGUE
168 #define TARGET_ASM_FUNCTION_EPILOGUE m68k_output_function_epilogue
169
170 #undef TARGET_ASM_OUTPUT_MI_THUNK
171 #define TARGET_ASM_OUTPUT_MI_THUNK m68k_output_mi_thunk
172 #undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
173 #define TARGET_ASM_CAN_OUTPUT_MI_THUNK default_can_output_mi_thunk_no_vcall
174
175 #undef TARGET_ASM_FILE_START_APP_OFF
176 #define TARGET_ASM_FILE_START_APP_OFF true
177
178 #undef TARGET_DEFAULT_TARGET_FLAGS
179 #define TARGET_DEFAULT_TARGET_FLAGS MASK_STRICT_ALIGNMENT
180 #undef TARGET_HANDLE_OPTION
181 #define TARGET_HANDLE_OPTION m68k_handle_option
182
183 #undef TARGET_RTX_COSTS
184 #define TARGET_RTX_COSTS m68k_rtx_costs
185
186 #undef TARGET_ATTRIBUTE_TABLE
187 #define TARGET_ATTRIBUTE_TABLE m68k_attribute_table
188
189 #undef TARGET_PROMOTE_PROTOTYPES
190 #define TARGET_PROMOTE_PROTOTYPES hook_bool_tree_true
191
192 #undef TARGET_STRUCT_VALUE_RTX
193 #define TARGET_STRUCT_VALUE_RTX m68k_struct_value_rtx
194
195 static const struct attribute_spec m68k_attribute_table[] =
196 {
197 /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler } */
198 { "interrupt_handler", 0, 0, true, false, false, m68k_handle_fndecl_attribute },
199 { NULL, 0, 0, false, false, false, NULL }
200 };
201
202 struct gcc_target targetm = TARGET_INITIALIZER;
203 \f
204 /* Base flags for 68k ISAs. */
205 #define FL_FOR_isa_00 FL_ISA_68000
206 #define FL_FOR_isa_10 (FL_FOR_isa_00 | FL_ISA_68010)
207 /* FL_68881 controls the default setting of -m68881. gcc has traditionally
208 generated 68881 code for 68020 and 68030 targets unless explicitly told
209 not to. */
210 #define FL_FOR_isa_20 (FL_FOR_isa_10 | FL_ISA_68020 \
211 | FL_BITFIELD | FL_68881)
212 #define FL_FOR_isa_40 (FL_FOR_isa_20 | FL_ISA_68040)
213 #define FL_FOR_isa_cpu32 (FL_FOR_isa_10 | FL_ISA_68020)
214
215 /* Base flags for ColdFire ISAs. */
216 #define FL_FOR_isa_a (FL_COLDFIRE | FL_ISA_A)
217 #define FL_FOR_isa_aplus (FL_FOR_isa_a | FL_ISA_APLUS | FL_CF_USP)
218 /* Note ISA_B doesn't necessarily include USP (user stack pointer) support. */
219 #define FL_FOR_isa_b (FL_FOR_isa_a | FL_ISA_B | FL_CF_HWDIV)
220 #define FL_FOR_isa_c (FL_FOR_isa_b | FL_ISA_C | FL_CF_USP)
221
222 enum m68k_isa
223 {
224 /* Traditional 68000 instruction sets. */
225 isa_00,
226 isa_10,
227 isa_20,
228 isa_40,
229 isa_cpu32,
230 /* ColdFire instruction set variants. */
231 isa_a,
232 isa_aplus,
233 isa_b,
234 isa_c,
235 isa_max
236 };
237
238 /* Information about one of the -march, -mcpu or -mtune arguments. */
239 struct m68k_target_selection
240 {
241 /* The argument being described. */
242 const char *name;
243
244 /* For -mcpu, this is the device selected by the option.
245 For -mtune and -march, it is a representative device
246 for the microarchitecture or ISA respectively. */
247 enum target_device device;
248
249 /* The M68K_DEVICE fields associated with DEVICE. See the comment
250 in m68k-devices.def for details. FAMILY is only valid for -mcpu. */
251 const char *family;
252 enum uarch_type microarch;
253 enum m68k_isa isa;
254 unsigned long flags;
255 };
256
257 /* A list of all devices in m68k-devices.def. Used for -mcpu selection. */
258 static const struct m68k_target_selection all_devices[] =
259 {
260 #define M68K_DEVICE(NAME,ENUM_VALUE,FAMILY,MULTILIB,MICROARCH,ISA,FLAGS) \
261 { NAME, ENUM_VALUE, FAMILY, u##MICROARCH, ISA, FLAGS | FL_FOR_##ISA },
262 #include "m68k-devices.def"
263 #undef M68K_DEVICE
264 { NULL, unk_device, NULL, unk_arch, isa_max, 0 }
265 };
266
267 /* A list of all ISAs, mapping each one to a representative device.
268 Used for -march selection. */
269 static const struct m68k_target_selection all_isas[] =
270 {
271 { "68000", m68000, NULL, u68000, isa_00, FL_FOR_isa_00 },
272 { "68010", m68010, NULL, u68010, isa_10, FL_FOR_isa_10 },
273 { "68020", m68020, NULL, u68020, isa_20, FL_FOR_isa_20 },
274 { "68030", m68030, NULL, u68030, isa_20, FL_FOR_isa_20 },
275 { "68040", m68040, NULL, u68040, isa_40, FL_FOR_isa_40 },
276 { "68060", m68060, NULL, u68060, isa_40, FL_FOR_isa_40 },
277 { "cpu32", cpu32, NULL, ucpu32, isa_20, FL_FOR_isa_cpu32 },
278 { "isaa", mcf5206e, NULL, ucfv2, isa_a, (FL_FOR_isa_a
279 | FL_CF_HWDIV) },
280 { "isaaplus", mcf5271, NULL, ucfv2, isa_aplus, (FL_FOR_isa_aplus
281 | FL_CF_HWDIV) },
282 { "isab", mcf5407, NULL, ucfv4, isa_b, FL_FOR_isa_b },
283 { "isac", unk_device, NULL, ucfv4, isa_c, (FL_FOR_isa_c
284 | FL_CF_FPU
285 | FL_CF_EMAC) },
286 { NULL, unk_device, NULL, unk_arch, isa_max, 0 }
287 };
288
289 /* A list of all microarchitectures, mapping each one to a representative
290 device. Used for -mtune selection. */
291 static const struct m68k_target_selection all_microarchs[] =
292 {
293 { "68000", m68000, NULL, u68000, isa_00, FL_FOR_isa_00 },
294 { "68010", m68010, NULL, u68010, isa_10, FL_FOR_isa_10 },
295 { "68020", m68020, NULL, u68020, isa_20, FL_FOR_isa_20 },
296 { "68020-40", m68020, NULL, u68020_40, isa_20, FL_FOR_isa_20 },
297 { "68020-60", m68020, NULL, u68020_60, isa_20, FL_FOR_isa_20 },
298 { "68030", m68030, NULL, u68030, isa_20, FL_FOR_isa_20 },
299 { "68040", m68040, NULL, u68040, isa_40, FL_FOR_isa_40 },
300 { "68060", m68060, NULL, u68060, isa_40, FL_FOR_isa_40 },
301 { "cpu32", cpu32, NULL, ucpu32, isa_20, FL_FOR_isa_cpu32 },
302 { "cfv2", mcf5206, NULL, ucfv2, isa_a, FL_FOR_isa_a },
303 { "cfv3", mcf5307, NULL, ucfv3, isa_a, (FL_FOR_isa_a
304 | FL_CF_HWDIV) },
305 { "cfv4", mcf5407, NULL, ucfv4, isa_b, FL_FOR_isa_b },
306 { "cfv4e", mcf547x, NULL, ucfv4e, isa_b, (FL_FOR_isa_b
307 | FL_CF_USP
308 | FL_CF_EMAC
309 | FL_CF_FPU) },
310 { NULL, unk_device, NULL, unk_arch, isa_max, 0 }
311 };
312 \f
313 /* The entries associated with the -mcpu, -march and -mtune settings,
314 or null for options that have not been used. */
315 const struct m68k_target_selection *m68k_cpu_entry;
316 const struct m68k_target_selection *m68k_arch_entry;
317 const struct m68k_target_selection *m68k_tune_entry;
318
319 /* Which CPU we are generating code for. */
320 enum target_device m68k_cpu;
321
322 /* Which microarchitecture to tune for. */
323 enum uarch_type m68k_tune;
324
325 /* Which FPU to use. */
326 enum fpu_type m68k_fpu;
327
328 /* The set of FL_* flags that apply to the target processor. */
329 unsigned int m68k_cpu_flags;
330
331 /* Asm templates for calling or jumping to an arbitrary symbolic address,
332 or NULL if such calls or jumps are not supported. The address is held
333 in operand 0. */
334 const char *m68k_symbolic_call;
335 const char *m68k_symbolic_jump;
336 \f
337 /* See whether TABLE has an entry with name NAME. Return true and
338 store the entry in *ENTRY if so, otherwise return false and
339 leave *ENTRY alone. */
340
341 static bool
342 m68k_find_selection (const struct m68k_target_selection **entry,
343 const struct m68k_target_selection *table,
344 const char *name)
345 {
346 size_t i;
347
348 for (i = 0; table[i].name; i++)
349 if (strcmp (table[i].name, name) == 0)
350 {
351 *entry = table + i;
352 return true;
353 }
354 return false;
355 }
356
357 /* Implement TARGET_HANDLE_OPTION. */
358
359 static bool
360 m68k_handle_option (size_t code, const char *arg, int value)
361 {
362 switch (code)
363 {
364 case OPT_march_:
365 return m68k_find_selection (&m68k_arch_entry, all_isas, arg);
366
367 case OPT_mcpu_:
368 return m68k_find_selection (&m68k_cpu_entry, all_devices, arg);
369
370 case OPT_mtune_:
371 return m68k_find_selection (&m68k_tune_entry, all_microarchs, arg);
372
373 case OPT_m5200:
374 return m68k_find_selection (&m68k_cpu_entry, all_devices, "5206");
375
376 case OPT_m5206e:
377 return m68k_find_selection (&m68k_cpu_entry, all_devices, "5206e");
378
379 case OPT_m528x:
380 return m68k_find_selection (&m68k_cpu_entry, all_devices, "528x");
381
382 case OPT_m5307:
383 return m68k_find_selection (&m68k_cpu_entry, all_devices, "5307");
384
385 case OPT_m5407:
386 return m68k_find_selection (&m68k_cpu_entry, all_devices, "5407");
387
388 case OPT_mcfv4e:
389 return m68k_find_selection (&m68k_cpu_entry, all_devices, "547x");
390
391 case OPT_m68000:
392 case OPT_mc68000:
393 return m68k_find_selection (&m68k_cpu_entry, all_devices, "68000");
394
395 case OPT_m68010:
396 return m68k_find_selection (&m68k_cpu_entry, all_devices, "68010");
397
398 case OPT_m68020:
399 case OPT_mc68020:
400 return m68k_find_selection (&m68k_cpu_entry, all_devices, "68020");
401
402 case OPT_m68020_40:
403 return (m68k_find_selection (&m68k_tune_entry, all_microarchs,
404 "68020-40")
405 && m68k_find_selection (&m68k_cpu_entry, all_devices, "68020"));
406
407 case OPT_m68020_60:
408 return (m68k_find_selection (&m68k_tune_entry, all_microarchs,
409 "68020-60")
410 && m68k_find_selection (&m68k_cpu_entry, all_devices, "68020"));
411
412 case OPT_m68030:
413 return m68k_find_selection (&m68k_cpu_entry, all_devices, "68030");
414
415 case OPT_m68040:
416 return m68k_find_selection (&m68k_cpu_entry, all_devices, "68040");
417
418 case OPT_m68060:
419 return m68k_find_selection (&m68k_cpu_entry, all_devices, "68060");
420
421 case OPT_m68302:
422 return m68k_find_selection (&m68k_cpu_entry, all_devices, "68302");
423
424 case OPT_m68332:
425 case OPT_mcpu32:
426 return m68k_find_selection (&m68k_cpu_entry, all_devices, "68332");
427
428 case OPT_mshared_library_id_:
429 if (value > MAX_LIBRARY_ID)
430 error ("-mshared-library-id=%s is not between 0 and %d",
431 arg, MAX_LIBRARY_ID);
432 else
433 asprintf ((char **) &m68k_library_id_string, "%d", (value * -4) - 4);
434 return true;
435
436 default:
437 return true;
438 }
439 }
440
441 /* Sometimes certain combinations of command options do not make
442 sense on a particular target machine. You can define a macro
443 `OVERRIDE_OPTIONS' to take account of this. This macro, if
444 defined, is executed once just after all the command options have
445 been parsed.
446
447 Don't use this macro to turn on various extra optimizations for
448 `-O'. That is what `OPTIMIZATION_OPTIONS' is for. */
449
450 void
451 override_options (void)
452 {
453 const struct m68k_target_selection *entry;
454 unsigned long target_mask;
455
456 /* User can choose:
457
458 -mcpu=
459 -march=
460 -mtune=
461
462 -march=ARCH should generate code that runs any processor
463 implementing architecture ARCH. -mcpu=CPU should override -march
464 and should generate code that runs on processor CPU, making free
465 use of any instructions that CPU understands. -mtune=UARCH applies
466 on top of -mcpu or -march and optimises the code for UARCH. It does
467 not change the target architecture. */
468 if (m68k_cpu_entry)
469 {
470 /* Complain if the -march setting is for a different microarchitecture,
471 or includes flags that the -mcpu setting doesn't. */
472 if (m68k_arch_entry
473 && (m68k_arch_entry->microarch != m68k_cpu_entry->microarch
474 || (m68k_arch_entry->flags & ~m68k_cpu_entry->flags) != 0))
475 warning (0, "-mcpu=%s conflicts with -march=%s",
476 m68k_cpu_entry->name, m68k_arch_entry->name);
477
478 entry = m68k_cpu_entry;
479 }
480 else
481 entry = m68k_arch_entry;
482
483 if (!entry)
484 entry = all_devices + TARGET_CPU_DEFAULT;
485
486 m68k_cpu_flags = entry->flags;
487
488 /* Use the architecture setting to derive default values for
489 certain flags. */
490 target_mask = 0;
491 if ((m68k_cpu_flags & FL_BITFIELD) != 0)
492 target_mask |= MASK_BITFIELD;
493 if ((m68k_cpu_flags & FL_CF_HWDIV) != 0)
494 target_mask |= MASK_CF_HWDIV;
495 if ((m68k_cpu_flags & (FL_68881 | FL_CF_FPU)) != 0)
496 target_mask |= MASK_HARD_FLOAT;
497 target_flags |= target_mask & ~target_flags_explicit;
498
499 /* Set the directly-usable versions of the -mcpu and -mtune settings. */
500 m68k_cpu = entry->device;
501 if (m68k_tune_entry)
502 m68k_tune = m68k_tune_entry->microarch;
503 #ifdef M68K_DEFAULT_TUNE
504 else if (!m68k_cpu_entry && !m68k_arch_entry)
505 m68k_tune = M68K_DEFAULT_TUNE;
506 #endif
507 else
508 m68k_tune = entry->microarch;
509
510 /* Set the type of FPU. */
511 m68k_fpu = (!TARGET_HARD_FLOAT ? FPUTYPE_NONE
512 : (m68k_cpu_flags & FL_COLDFIRE) != 0 ? FPUTYPE_COLDFIRE
513 : FPUTYPE_68881);
514
515 if (TARGET_COLDFIRE_FPU)
516 {
517 REAL_MODE_FORMAT (SFmode) = &coldfire_single_format;
518 REAL_MODE_FORMAT (DFmode) = &coldfire_double_format;
519 }
520
521 /* Sanity check to ensure that msep-data and mid-sahred-library are not
522 * both specified together. Doing so simply doesn't make sense.
523 */
524 if (TARGET_SEP_DATA && TARGET_ID_SHARED_LIBRARY)
525 error ("cannot specify both -msep-data and -mid-shared-library");
526
527 /* If we're generating code for a separate A5 relative data segment,
528 * we've got to enable -fPIC as well. This might be relaxable to
529 * -fpic but it hasn't been tested properly.
530 */
531 if (TARGET_SEP_DATA || TARGET_ID_SHARED_LIBRARY)
532 flag_pic = 2;
533
534 /* -mpcrel -fPIC uses 32-bit pc-relative displacements. Raise an
535 error if the target does not support them. */
536 if (TARGET_PCREL && !TARGET_68020 && flag_pic == 2)
537 error ("-mpcrel -fPIC is not currently supported on selected cpu");
538
539 /* ??? A historic way of turning on pic, or is this intended to
540 be an embedded thing that doesn't have the same name binding
541 significance that it does on hosted ELF systems? */
542 if (TARGET_PCREL && flag_pic == 0)
543 flag_pic = 1;
544
545 if (!flag_pic)
546 {
547 #if MOTOROLA && !defined (USE_GAS)
548 m68k_symbolic_call = "jsr %a0";
549 m68k_symbolic_jump = "jmp %a0";
550 #else
551 m68k_symbolic_call = "jbsr %a0";
552 m68k_symbolic_jump = "jra %a0";
553 #endif
554 }
555 else if (TARGET_ID_SHARED_LIBRARY)
556 /* All addresses must be loaded from the GOT. */
557 ;
558 else if (TARGET_68020 || TARGET_ISAB)
559 {
560 if (TARGET_PCREL)
561 {
562 m68k_symbolic_call = "bsr.l %c0";
563 m68k_symbolic_jump = "bra.l %c0";
564 }
565 else
566 {
567 #if defined(USE_GAS)
568 m68k_symbolic_call = "bsr.l %p0";
569 m68k_symbolic_jump = "bra.l %p0";
570 #else
571 m68k_symbolic_call = "bsr %p0";
572 m68k_symbolic_jump = "bra %p0";
573 #endif
574 }
575 /* Turn off function cse if we are doing PIC. We always want
576 function call to be done as `bsr foo@PLTPC'. */
577 /* ??? It's traditional to do this for -mpcrel too, but it isn't
578 clear how intentional that is. */
579 flag_no_function_cse = 1;
580 }
581
582 SUBTARGET_OVERRIDE_OPTIONS;
583 }
584
585 /* Generate a macro of the form __mPREFIX_cpu_NAME, where PREFIX is the
586 given argument and NAME is the argument passed to -mcpu. Return NULL
587 if -mcpu was not passed. */
588
589 const char *
590 m68k_cpp_cpu_ident (const char *prefix)
591 {
592 if (!m68k_cpu_entry)
593 return NULL;
594 return concat ("__m", prefix, "_cpu_", m68k_cpu_entry->name, NULL);
595 }
596
597 /* Generate a macro of the form __mPREFIX_family_NAME, where PREFIX is the
598 given argument and NAME is the name of the representative device for
599 the -mcpu argument's family. Return NULL if -mcpu was not passed. */
600
601 const char *
602 m68k_cpp_cpu_family (const char *prefix)
603 {
604 if (!m68k_cpu_entry)
605 return NULL;
606 return concat ("__m", prefix, "_family_", m68k_cpu_entry->family, NULL);
607 }
608 \f
609 /* Return nonzero if FUNC is an interrupt function as specified by the
610 "interrupt_handler" attribute. */
611 static bool
612 m68k_interrupt_function_p(tree func)
613 {
614 tree a;
615
616 if (TREE_CODE (func) != FUNCTION_DECL)
617 return false;
618
619 a = lookup_attribute ("interrupt_handler", DECL_ATTRIBUTES (func));
620 return (a != NULL_TREE);
621 }
622
623 /* Handle an attribute requiring a FUNCTION_DECL; arguments as in
624 struct attribute_spec.handler. */
625 static tree
626 m68k_handle_fndecl_attribute (tree *node, tree name,
627 tree args ATTRIBUTE_UNUSED,
628 int flags ATTRIBUTE_UNUSED,
629 bool *no_add_attrs)
630 {
631 if (TREE_CODE (*node) != FUNCTION_DECL)
632 {
633 warning (OPT_Wattributes, "%qs attribute only applies to functions",
634 IDENTIFIER_POINTER (name));
635 *no_add_attrs = true;
636 }
637
638 return NULL_TREE;
639 }
640
641 static void
642 m68k_compute_frame_layout (void)
643 {
644 int regno, saved;
645 unsigned int mask, rmask;
646 bool interrupt_handler = m68k_interrupt_function_p (current_function_decl);
647
648 /* Only compute the frame once per function.
649 Don't cache information until reload has been completed. */
650 if (current_frame.funcdef_no == current_function_funcdef_no
651 && reload_completed)
652 return;
653
654 current_frame.size = (get_frame_size () + 3) & -4;
655
656 mask = rmask = saved = 0;
657 for (regno = 0; regno < 16; regno++)
658 if (m68k_save_reg (regno, interrupt_handler))
659 {
660 mask |= 1 << regno;
661 rmask |= 1 << (15 - regno);
662 saved++;
663 }
664 current_frame.offset = saved * 4;
665 current_frame.reg_no = saved;
666 current_frame.reg_mask = mask;
667 current_frame.reg_rev_mask = rmask;
668
669 current_frame.foffset = 0;
670 mask = rmask = saved = 0;
671 if (TARGET_HARD_FLOAT)
672 {
673 for (regno = 16; regno < 24; regno++)
674 if (m68k_save_reg (regno, interrupt_handler))
675 {
676 mask |= 1 << (regno - 16);
677 rmask |= 1 << (23 - regno);
678 saved++;
679 }
680 current_frame.foffset = saved * TARGET_FP_REG_SIZE;
681 current_frame.offset += current_frame.foffset;
682 }
683 current_frame.fpu_no = saved;
684 current_frame.fpu_mask = mask;
685 current_frame.fpu_rev_mask = rmask;
686
687 /* Remember what function this frame refers to. */
688 current_frame.funcdef_no = current_function_funcdef_no;
689 }
690
691 HOST_WIDE_INT
692 m68k_initial_elimination_offset (int from, int to)
693 {
694 int argptr_offset;
695 /* The arg pointer points 8 bytes before the start of the arguments,
696 as defined by FIRST_PARM_OFFSET. This makes it coincident with the
697 frame pointer in most frames. */
698 argptr_offset = frame_pointer_needed ? 0 : UNITS_PER_WORD;
699 if (from == ARG_POINTER_REGNUM && to == FRAME_POINTER_REGNUM)
700 return argptr_offset;
701
702 m68k_compute_frame_layout ();
703
704 gcc_assert (to == STACK_POINTER_REGNUM);
705 switch (from)
706 {
707 case ARG_POINTER_REGNUM:
708 return current_frame.offset + current_frame.size - argptr_offset;
709 case FRAME_POINTER_REGNUM:
710 return current_frame.offset + current_frame.size;
711 default:
712 gcc_unreachable ();
713 }
714 }
715
716 /* Refer to the array `regs_ever_live' to determine which registers
717 to save; `regs_ever_live[I]' is nonzero if register number I
718 is ever used in the function. This function is responsible for
719 knowing which registers should not be saved even if used.
720 Return true if we need to save REGNO. */
721
722 static bool
723 m68k_save_reg (unsigned int regno, bool interrupt_handler)
724 {
725 if (flag_pic && regno == PIC_OFFSET_TABLE_REGNUM)
726 {
727 if (current_function_uses_pic_offset_table)
728 return true;
729 if (!current_function_is_leaf && TARGET_ID_SHARED_LIBRARY)
730 return true;
731 }
732
733 if (current_function_calls_eh_return)
734 {
735 unsigned int i;
736 for (i = 0; ; i++)
737 {
738 unsigned int test = EH_RETURN_DATA_REGNO (i);
739 if (test == INVALID_REGNUM)
740 break;
741 if (test == regno)
742 return true;
743 }
744 }
745
746 /* Fixed regs we never touch. */
747 if (fixed_regs[regno])
748 return false;
749
750 /* The frame pointer (if it is such) is handled specially. */
751 if (regno == FRAME_POINTER_REGNUM && frame_pointer_needed)
752 return false;
753
754 /* Interrupt handlers must also save call_used_regs
755 if they are live or when calling nested functions. */
756 if (interrupt_handler)
757 {
758 if (regs_ever_live[regno])
759 return true;
760
761 if (!current_function_is_leaf && call_used_regs[regno])
762 return true;
763 }
764
765 /* Never need to save registers that aren't touched. */
766 if (!regs_ever_live[regno])
767 return false;
768
769 /* Otherwise save everything that isn't call-clobbered. */
770 return !call_used_regs[regno];
771 }
772
773 /* This function generates the assembly code for function entry.
774 STREAM is a stdio stream to output the code to.
775 SIZE is an int: how many units of temporary storage to allocate. */
776
777 static void
778 m68k_output_function_prologue (FILE *stream,
779 HOST_WIDE_INT size ATTRIBUTE_UNUSED)
780 {
781 HOST_WIDE_INT fsize_with_regs;
782 HOST_WIDE_INT cfa_offset = INCOMING_FRAME_SP_OFFSET;
783
784 m68k_compute_frame_layout();
785
786 /* If the stack limit is a symbol, we can check it here,
787 before actually allocating the space. */
788 if (current_function_limit_stack
789 && GET_CODE (stack_limit_rtx) == SYMBOL_REF)
790 asm_fprintf (stream, "\tcmp" ASM_DOT "l %I%s+%wd,%Rsp\n\ttrapcs\n",
791 XSTR (stack_limit_rtx, 0), current_frame.size + 4);
792
793 /* On ColdFire add register save into initial stack frame setup, if possible. */
794 fsize_with_regs = current_frame.size;
795 if (TARGET_COLDFIRE)
796 {
797 if (current_frame.reg_no > 2)
798 fsize_with_regs += current_frame.reg_no * 4;
799 if (current_frame.fpu_no)
800 fsize_with_regs += current_frame.fpu_no * 8;
801 }
802
803 if (frame_pointer_needed)
804 {
805 if (current_frame.size == 0 && TUNE_68040)
806 /* on the 68040, pea + move is faster than link.w 0 */
807 fprintf (stream, (MOTOROLA
808 ? "\tpea (%s)\n\tmove.l %s,%s\n"
809 : "\tpea %s@\n\tmovel %s,%s\n"),
810 M68K_REGNAME (FRAME_POINTER_REGNUM),
811 M68K_REGNAME (STACK_POINTER_REGNUM),
812 M68K_REGNAME (FRAME_POINTER_REGNUM));
813 else if (fsize_with_regs < 0x8000)
814 asm_fprintf (stream, "\tlink" ASM_DOTW " %s,%I%wd\n",
815 M68K_REGNAME (FRAME_POINTER_REGNUM), -fsize_with_regs);
816 else if (TARGET_68020)
817 asm_fprintf (stream, "\tlink" ASM_DOTL " %s,%I%wd\n",
818 M68K_REGNAME (FRAME_POINTER_REGNUM), -fsize_with_regs);
819 else
820 /* Adding negative number is faster on the 68040. */
821 asm_fprintf (stream,
822 "\tlink" ASM_DOTW " %s,%I0\n"
823 "\tadd" ASM_DOT "l %I%wd,%Rsp\n",
824 M68K_REGNAME (FRAME_POINTER_REGNUM), -fsize_with_regs);
825 }
826 else if (fsize_with_regs) /* !frame_pointer_needed */
827 {
828 if (fsize_with_regs < 0x8000)
829 {
830 if (fsize_with_regs <= 8)
831 {
832 if (!TARGET_COLDFIRE)
833 asm_fprintf (stream, "\tsubq" ASM_DOT "w %I%wd,%Rsp\n",
834 fsize_with_regs);
835 else
836 asm_fprintf (stream, "\tsubq" ASM_DOT "l %I%wd,%Rsp\n",
837 fsize_with_regs);
838 }
839 else if (fsize_with_regs <= 16 && TUNE_CPU32)
840 /* On the CPU32 it is faster to use two subqw instructions to
841 subtract a small integer (8 < N <= 16) to a register. */
842 asm_fprintf (stream,
843 "\tsubq" ASM_DOT "w %I8,%Rsp\n"
844 "\tsubq" ASM_DOT "w %I%wd,%Rsp\n",
845 fsize_with_regs - 8);
846 else if (TUNE_68040)
847 /* Adding negative number is faster on the 68040. */
848 asm_fprintf (stream, "\tadd" ASM_DOT "w %I%wd,%Rsp\n",
849 -fsize_with_regs);
850 else
851 asm_fprintf (stream, (MOTOROLA
852 ? "\tlea (%wd,%Rsp),%Rsp\n"
853 : "\tlea %Rsp@(%wd),%Rsp\n"),
854 -fsize_with_regs);
855 }
856 else /* fsize_with_regs >= 0x8000 */
857 asm_fprintf (stream, "\tadd" ASM_DOT "l %I%wd,%Rsp\n",
858 -fsize_with_regs);
859 } /* !frame_pointer_needed */
860
861 if (dwarf2out_do_frame ())
862 {
863 if (frame_pointer_needed)
864 {
865 char *l;
866 l = (char *) dwarf2out_cfi_label ();
867 cfa_offset += 4;
868 dwarf2out_reg_save (l, FRAME_POINTER_REGNUM, -cfa_offset);
869 dwarf2out_def_cfa (l, FRAME_POINTER_REGNUM, cfa_offset);
870 cfa_offset += current_frame.size;
871 }
872 else
873 {
874 cfa_offset += current_frame.size;
875 dwarf2out_def_cfa ("", STACK_POINTER_REGNUM, cfa_offset);
876 }
877 }
878
879 if (current_frame.fpu_mask)
880 {
881 if (TARGET_68881)
882 {
883 asm_fprintf (stream, (MOTOROLA
884 ? "\tfmovm %I0x%x,-(%Rsp)\n"
885 : "\tfmovem %I0x%x,%Rsp@-\n"),
886 current_frame.fpu_mask);
887 }
888 else
889 {
890 int offset;
891
892 /* stack already has registers in it. Find the offset from
893 the bottom of stack to where the FP registers go */
894 if (current_frame.reg_no <= 2)
895 offset = 0;
896 else
897 offset = current_frame.reg_no * 4;
898 if (offset)
899 asm_fprintf (stream,
900 "\tfmovem %I0x%x,%d(%Rsp)\n",
901 current_frame.fpu_rev_mask,
902 offset);
903 else
904 asm_fprintf (stream,
905 "\tfmovem %I0x%x,(%Rsp)\n",
906 current_frame.fpu_rev_mask);
907 }
908
909 if (dwarf2out_do_frame ())
910 {
911 char *l = (char *) dwarf2out_cfi_label ();
912 int n_regs, regno;
913
914 cfa_offset += current_frame.fpu_no * TARGET_FP_REG_SIZE;
915 if (! frame_pointer_needed)
916 dwarf2out_def_cfa (l, STACK_POINTER_REGNUM, cfa_offset);
917 for (regno = 16, n_regs = 0; regno < 24; regno++)
918 if (current_frame.fpu_mask & (1 << (regno - 16)))
919 dwarf2out_reg_save (l, regno, -cfa_offset
920 + n_regs++ * TARGET_FP_REG_SIZE);
921 }
922 }
923
924 /* If the stack limit is not a symbol, check it here.
925 This has the disadvantage that it may be too late... */
926 if (current_function_limit_stack)
927 {
928 if (REG_P (stack_limit_rtx))
929 asm_fprintf (stream, "\tcmp" ASM_DOT "l %s,%Rsp\n\ttrapcs\n",
930 M68K_REGNAME (REGNO (stack_limit_rtx)));
931 else if (GET_CODE (stack_limit_rtx) != SYMBOL_REF)
932 warning (0, "stack limit expression is not supported");
933 }
934
935 if (current_frame.reg_no <= 2)
936 {
937 /* Store each separately in the same order moveml uses.
938 Using two movel instructions instead of a single moveml
939 is about 15% faster for the 68020 and 68030 at no expense
940 in code size. */
941
942 int i;
943
944 for (i = 0; i < 16; i++)
945 if (current_frame.reg_rev_mask & (1 << i))
946 {
947 asm_fprintf (stream, (MOTOROLA
948 ? "\t%Omove.l %s,-(%Rsp)\n"
949 : "\tmovel %s,%Rsp@-\n"),
950 M68K_REGNAME (15 - i));
951 if (dwarf2out_do_frame ())
952 {
953 char *l = (char *) dwarf2out_cfi_label ();
954
955 cfa_offset += 4;
956 if (! frame_pointer_needed)
957 dwarf2out_def_cfa (l, STACK_POINTER_REGNUM, cfa_offset);
958 dwarf2out_reg_save (l, 15 - i, -cfa_offset);
959 }
960 }
961 }
962 else if (current_frame.reg_rev_mask)
963 {
964 if (TARGET_COLDFIRE)
965 /* The ColdFire does not support the predecrement form of the
966 MOVEM instruction, so we must adjust the stack pointer and
967 then use the plain address register indirect mode.
968 The required register save space was combined earlier with
969 the fsize_with_regs amount. */
970
971 asm_fprintf (stream, (MOTOROLA
972 ? "\tmovm.l %I0x%x,(%Rsp)\n"
973 : "\tmoveml %I0x%x,%Rsp@\n"),
974 current_frame.reg_mask);
975 else
976 asm_fprintf (stream, (MOTOROLA
977 ? "\tmovm.l %I0x%x,-(%Rsp)\n"
978 : "\tmoveml %I0x%x,%Rsp@-\n"),
979 current_frame.reg_rev_mask);
980 if (dwarf2out_do_frame ())
981 {
982 char *l = (char *) dwarf2out_cfi_label ();
983 int n_regs, regno;
984
985 cfa_offset += current_frame.reg_no * 4;
986 if (! frame_pointer_needed)
987 dwarf2out_def_cfa (l, STACK_POINTER_REGNUM, cfa_offset);
988 for (regno = 0, n_regs = 0; regno < 16; regno++)
989 if (current_frame.reg_mask & (1 << regno))
990 dwarf2out_reg_save (l, regno, -cfa_offset + n_regs++ * 4);
991 }
992 }
993 if (!TARGET_SEP_DATA && flag_pic
994 && (current_function_uses_pic_offset_table
995 || (!current_function_is_leaf && TARGET_ID_SHARED_LIBRARY)))
996 {
997 if (TARGET_ID_SHARED_LIBRARY)
998 {
999 asm_fprintf (stream, "\tmovel %s@(%s), %s\n",
1000 M68K_REGNAME (PIC_OFFSET_TABLE_REGNUM),
1001 m68k_library_id_string,
1002 M68K_REGNAME (PIC_OFFSET_TABLE_REGNUM));
1003 }
1004 else
1005 {
1006 if (MOTOROLA)
1007 asm_fprintf (stream,
1008 "\t%Olea (%Rpc, %U_GLOBAL_OFFSET_TABLE_@GOTPC), %s\n",
1009 M68K_REGNAME (PIC_OFFSET_TABLE_REGNUM));
1010 else
1011 {
1012 asm_fprintf (stream, "\tmovel %I%U_GLOBAL_OFFSET_TABLE_, %s\n",
1013 M68K_REGNAME (PIC_OFFSET_TABLE_REGNUM));
1014 asm_fprintf (stream, "\tlea %Rpc@(0,%s:l),%s\n",
1015 M68K_REGNAME (PIC_OFFSET_TABLE_REGNUM),
1016 M68K_REGNAME (PIC_OFFSET_TABLE_REGNUM));
1017 }
1018 }
1019 }
1020 }
1021 \f
1022 /* Return true if a simple (return) instruction is sufficient for this
1023 instruction (i.e. if no epilogue is needed). */
1024
1025 bool
1026 m68k_use_return_insn (void)
1027 {
1028 if (!reload_completed || frame_pointer_needed || get_frame_size () != 0)
1029 return false;
1030
1031 m68k_compute_frame_layout ();
1032 return current_frame.offset == 0;
1033 }
1034
1035 /* This function generates the assembly code for function exit,
1036 on machines that need it.
1037
1038 The function epilogue should not depend on the current stack pointer!
1039 It should use the frame pointer only, if there is a frame pointer.
1040 This is mandatory because of alloca; we also take advantage of it to
1041 omit stack adjustments before returning. */
1042
1043 static void
1044 m68k_output_function_epilogue (FILE *stream,
1045 HOST_WIDE_INT size ATTRIBUTE_UNUSED)
1046 {
1047 HOST_WIDE_INT fsize, fsize_with_regs;
1048 bool big = false;
1049 bool restore_from_sp = false;
1050 rtx insn = get_last_insn ();
1051
1052 m68k_compute_frame_layout ();
1053
1054 /* If the last insn was a BARRIER, we don't have to write any code. */
1055 if (GET_CODE (insn) == NOTE)
1056 insn = prev_nonnote_insn (insn);
1057 if (insn && GET_CODE (insn) == BARRIER)
1058 return;
1059
1060 fsize = current_frame.size;
1061
1062 /* FIXME: leaf_function_p below is too strong.
1063 What we really need to know there is if there could be pending
1064 stack adjustment needed at that point. */
1065 restore_from_sp
1066 = (! frame_pointer_needed
1067 || (! current_function_calls_alloca && leaf_function_p ()));
1068
1069 /* fsize_with_regs is the size we need to adjust the sp when
1070 popping the frame. */
1071 fsize_with_regs = fsize;
1072
1073 /* Because the ColdFire doesn't support moveml with
1074 complex address modes, we must adjust the stack manually
1075 after restoring registers. When the frame pointer isn't used,
1076 we can merge movem adjustment into frame unlinking
1077 made immediately after it. */
1078 if (TARGET_COLDFIRE && restore_from_sp)
1079 {
1080 if (current_frame.reg_no > 2)
1081 fsize_with_regs += current_frame.reg_no * 4;
1082 if (current_frame.fpu_no)
1083 fsize_with_regs += current_frame.fpu_no * 8;
1084 }
1085
1086 if (current_frame.offset + fsize >= 0x8000
1087 && ! restore_from_sp
1088 && (current_frame.reg_mask || current_frame.fpu_mask))
1089 {
1090 /* Because the ColdFire doesn't support moveml with
1091 complex address modes we make an extra correction here. */
1092 if (TARGET_COLDFIRE)
1093 fsize += current_frame.offset;
1094
1095 asm_fprintf (stream, "\t%Omove" ASM_DOT "l %I%wd,%Ra1\n", -fsize);
1096 fsize = 0, big = true;
1097 }
1098 if (current_frame.reg_no <= 2)
1099 {
1100 /* Restore each separately in the same order moveml does.
1101 Using two movel instructions instead of a single moveml
1102 is about 15% faster for the 68020 and 68030 at no expense
1103 in code size. */
1104
1105 int i;
1106 HOST_WIDE_INT offset = current_frame.offset + fsize;
1107
1108 for (i = 0; i < 16; i++)
1109 if (current_frame.reg_mask & (1 << i))
1110 {
1111 if (big)
1112 {
1113 if (MOTOROLA)
1114 asm_fprintf (stream, "\t%Omove.l -%wd(%s,%Ra1.l),%s\n",
1115 offset,
1116 M68K_REGNAME (FRAME_POINTER_REGNUM),
1117 M68K_REGNAME (i));
1118 else
1119 asm_fprintf (stream, "\tmovel %s@(-%wd,%Ra1:l),%s\n",
1120 M68K_REGNAME (FRAME_POINTER_REGNUM),
1121 offset,
1122 M68K_REGNAME (i));
1123 }
1124 else if (restore_from_sp)
1125 asm_fprintf (stream, (MOTOROLA
1126 ? "\t%Omove.l (%Rsp)+,%s\n"
1127 : "\tmovel %Rsp@+,%s\n"),
1128 M68K_REGNAME (i));
1129 else
1130 {
1131 if (MOTOROLA)
1132 asm_fprintf (stream, "\t%Omove.l -%wd(%s),%s\n",
1133 offset,
1134 M68K_REGNAME (FRAME_POINTER_REGNUM),
1135 M68K_REGNAME (i));
1136 else
1137 asm_fprintf (stream, "\tmovel %s@(-%wd),%s\n",
1138 M68K_REGNAME (FRAME_POINTER_REGNUM),
1139 offset,
1140 M68K_REGNAME (i));
1141 }
1142 offset -= 4;
1143 }
1144 }
1145 else if (current_frame.reg_mask)
1146 {
1147 /* The ColdFire requires special handling due to its limited moveml
1148 insn. */
1149 if (TARGET_COLDFIRE)
1150 {
1151 if (big)
1152 {
1153 asm_fprintf (stream, "\tadd" ASM_DOT "l %s,%Ra1\n",
1154 M68K_REGNAME (FRAME_POINTER_REGNUM));
1155 asm_fprintf (stream, (MOTOROLA
1156 ? "\tmovm.l (%Ra1),%I0x%x\n"
1157 : "\tmoveml %Ra1@,%I0x%x\n"),
1158 current_frame.reg_mask);
1159 }
1160 else if (restore_from_sp)
1161 asm_fprintf (stream, (MOTOROLA
1162 ? "\tmovm.l (%Rsp),%I0x%x\n"
1163 : "\tmoveml %Rsp@,%I0x%x\n"),
1164 current_frame.reg_mask);
1165 else
1166 {
1167 if (MOTOROLA)
1168 asm_fprintf (stream, "\tmovm.l -%wd(%s),%I0x%x\n",
1169 current_frame.offset + fsize,
1170 M68K_REGNAME (FRAME_POINTER_REGNUM),
1171 current_frame.reg_mask);
1172 else
1173 asm_fprintf (stream, "\tmoveml %s@(-%wd),%I0x%x\n",
1174 M68K_REGNAME (FRAME_POINTER_REGNUM),
1175 current_frame.offset + fsize,
1176 current_frame.reg_mask);
1177 }
1178 }
1179 else /* !TARGET_COLDFIRE */
1180 {
1181 if (big)
1182 {
1183 if (MOTOROLA)
1184 asm_fprintf (stream, "\tmovm.l -%wd(%s,%Ra1.l),%I0x%x\n",
1185 current_frame.offset + fsize,
1186 M68K_REGNAME (FRAME_POINTER_REGNUM),
1187 current_frame.reg_mask);
1188 else
1189 asm_fprintf (stream, "\tmoveml %s@(-%wd,%Ra1:l),%I0x%x\n",
1190 M68K_REGNAME (FRAME_POINTER_REGNUM),
1191 current_frame.offset + fsize,
1192 current_frame.reg_mask);
1193 }
1194 else if (restore_from_sp)
1195 {
1196 asm_fprintf (stream, (MOTOROLA
1197 ? "\tmovm.l (%Rsp)+,%I0x%x\n"
1198 : "\tmoveml %Rsp@+,%I0x%x\n"),
1199 current_frame.reg_mask);
1200 }
1201 else
1202 {
1203 if (MOTOROLA)
1204 asm_fprintf (stream, "\tmovm.l -%wd(%s),%I0x%x\n",
1205 current_frame.offset + fsize,
1206 M68K_REGNAME (FRAME_POINTER_REGNUM),
1207 current_frame.reg_mask);
1208 else
1209 asm_fprintf (stream, "\tmoveml %s@(-%wd),%I0x%x\n",
1210 M68K_REGNAME (FRAME_POINTER_REGNUM),
1211 current_frame.offset + fsize,
1212 current_frame.reg_mask);
1213 }
1214 }
1215 }
1216 if (current_frame.fpu_rev_mask)
1217 {
1218 if (big)
1219 {
1220 if (TARGET_COLDFIRE)
1221 {
1222 if (current_frame.reg_no)
1223 asm_fprintf (stream, MOTOROLA ?
1224 "\tfmovem.d %d(%Ra1),%I0x%x\n" :
1225 "\tfmovmd (%d,%Ra1),%I0x%x\n",
1226 current_frame.reg_no * 4,
1227 current_frame.fpu_rev_mask);
1228 else
1229 asm_fprintf (stream, MOTOROLA ?
1230 "\tfmovem.d (%Ra1),%I0x%x\n" :
1231 "\tfmovmd (%Ra1),%I0x%x\n",
1232 current_frame.fpu_rev_mask);
1233 }
1234 else if (MOTOROLA)
1235 asm_fprintf (stream, "\tfmovm -%wd(%s,%Ra1.l),%I0x%x\n",
1236 current_frame.foffset + fsize,
1237 M68K_REGNAME (FRAME_POINTER_REGNUM),
1238 current_frame.fpu_rev_mask);
1239 else
1240 asm_fprintf (stream, "\tfmovem %s@(-%wd,%Ra1:l),%I0x%x\n",
1241 M68K_REGNAME (FRAME_POINTER_REGNUM),
1242 current_frame.foffset + fsize,
1243 current_frame.fpu_rev_mask);
1244 }
1245 else if (restore_from_sp)
1246 {
1247 if (TARGET_COLDFIRE)
1248 {
1249 int offset;
1250
1251 /* Stack already has registers in it. Find the offset from
1252 the bottom of stack to where the FP registers go. */
1253 if (current_frame.reg_no <= 2)
1254 offset = 0;
1255 else
1256 offset = current_frame.reg_no * 4;
1257 if (offset)
1258 asm_fprintf (stream,
1259 "\tfmovem %Rsp@(%d), %I0x%x\n",
1260 offset, current_frame.fpu_rev_mask);
1261 else
1262 asm_fprintf (stream,
1263 "\tfmovem %Rsp@, %I0x%x\n",
1264 current_frame.fpu_rev_mask);
1265 }
1266 else
1267 asm_fprintf (stream, MOTOROLA ?
1268 "\tfmovm (%Rsp)+,%I0x%x\n" :
1269 "\tfmovem %Rsp@+,%I0x%x\n",
1270 current_frame.fpu_rev_mask);
1271 }
1272 else
1273 {
1274 if (MOTOROLA && !TARGET_COLDFIRE)
1275 asm_fprintf (stream, "\tfmovm -%wd(%s),%I0x%x\n",
1276 current_frame.foffset + fsize,
1277 M68K_REGNAME (FRAME_POINTER_REGNUM),
1278 current_frame.fpu_rev_mask);
1279 else
1280 asm_fprintf (stream, "\tfmovem %s@(-%wd),%I0x%x\n",
1281 M68K_REGNAME (FRAME_POINTER_REGNUM),
1282 current_frame.foffset + fsize,
1283 current_frame.fpu_rev_mask);
1284 }
1285 }
1286 if (frame_pointer_needed)
1287 fprintf (stream, "\tunlk %s\n", M68K_REGNAME (FRAME_POINTER_REGNUM));
1288 else if (fsize_with_regs)
1289 {
1290 if (fsize_with_regs <= 8)
1291 {
1292 if (!TARGET_COLDFIRE)
1293 asm_fprintf (stream, "\taddq" ASM_DOT "w %I%wd,%Rsp\n",
1294 fsize_with_regs);
1295 else
1296 asm_fprintf (stream, "\taddq" ASM_DOT "l %I%wd,%Rsp\n",
1297 fsize_with_regs);
1298 }
1299 else if (fsize_with_regs <= 16 && TUNE_CPU32)
1300 {
1301 /* On the CPU32 it is faster to use two addqw instructions to
1302 add a small integer (8 < N <= 16) to a register. */
1303 asm_fprintf (stream,
1304 "\taddq" ASM_DOT "w %I8,%Rsp\n"
1305 "\taddq" ASM_DOT "w %I%wd,%Rsp\n",
1306 fsize_with_regs - 8);
1307 }
1308 else if (fsize_with_regs < 0x8000)
1309 {
1310 if (TUNE_68040)
1311 asm_fprintf (stream, "\tadd" ASM_DOT "w %I%wd,%Rsp\n",
1312 fsize_with_regs);
1313 else
1314 asm_fprintf (stream, (MOTOROLA
1315 ? "\tlea (%wd,%Rsp),%Rsp\n"
1316 : "\tlea %Rsp@(%wd),%Rsp\n"),
1317 fsize_with_regs);
1318 }
1319 else
1320 asm_fprintf (stream, "\tadd" ASM_DOT "l %I%wd,%Rsp\n", fsize_with_regs);
1321 }
1322 if (current_function_calls_eh_return)
1323 asm_fprintf (stream, "\tadd" ASM_DOT "l %Ra0,%Rsp\n");
1324 if (m68k_interrupt_function_p (current_function_decl))
1325 fprintf (stream, "\trte\n");
1326 else if (current_function_pops_args)
1327 asm_fprintf (stream, "\trtd %I%d\n", current_function_pops_args);
1328 else
1329 fprintf (stream, "\trts\n");
1330 }
1331 \f
1332 /* Return true if X is a valid comparison operator for the dbcc
1333 instruction.
1334
1335 Note it rejects floating point comparison operators.
1336 (In the future we could use Fdbcc).
1337
1338 It also rejects some comparisons when CC_NO_OVERFLOW is set. */
1339
1340 int
1341 valid_dbcc_comparison_p_2 (rtx x, enum machine_mode mode ATTRIBUTE_UNUSED)
1342 {
1343 switch (GET_CODE (x))
1344 {
1345 case EQ: case NE: case GTU: case LTU:
1346 case GEU: case LEU:
1347 return 1;
1348
1349 /* Reject some when CC_NO_OVERFLOW is set. This may be over
1350 conservative */
1351 case GT: case LT: case GE: case LE:
1352 return ! (cc_prev_status.flags & CC_NO_OVERFLOW);
1353 default:
1354 return 0;
1355 }
1356 }
1357
1358 /* Return nonzero if flags are currently in the 68881 flag register. */
1359 int
1360 flags_in_68881 (void)
1361 {
1362 /* We could add support for these in the future */
1363 return cc_status.flags & CC_IN_68881;
1364 }
1365
1366 /* Convert X to a legitimate function call memory reference and return the
1367 result. */
1368
1369 rtx
1370 m68k_legitimize_call_address (rtx x)
1371 {
1372 gcc_assert (MEM_P (x));
1373 if (call_operand (XEXP (x, 0), VOIDmode))
1374 return x;
1375 return replace_equiv_address (x, force_reg (Pmode, XEXP (x, 0)));
1376 }
1377
1378 /* Output a dbCC; jCC sequence. Note we do not handle the
1379 floating point version of this sequence (Fdbcc). We also
1380 do not handle alternative conditions when CC_NO_OVERFLOW is
1381 set. It is assumed that valid_dbcc_comparison_p and flags_in_68881 will
1382 kick those out before we get here. */
1383
1384 void
1385 output_dbcc_and_branch (rtx *operands)
1386 {
1387 switch (GET_CODE (operands[3]))
1388 {
1389 case EQ:
1390 output_asm_insn (MOTOROLA
1391 ? "dbeq %0,%l1\n\tjbeq %l2"
1392 : "dbeq %0,%l1\n\tjeq %l2",
1393 operands);
1394 break;
1395
1396 case NE:
1397 output_asm_insn (MOTOROLA
1398 ? "dbne %0,%l1\n\tjbne %l2"
1399 : "dbne %0,%l1\n\tjne %l2",
1400 operands);
1401 break;
1402
1403 case GT:
1404 output_asm_insn (MOTOROLA
1405 ? "dbgt %0,%l1\n\tjbgt %l2"
1406 : "dbgt %0,%l1\n\tjgt %l2",
1407 operands);
1408 break;
1409
1410 case GTU:
1411 output_asm_insn (MOTOROLA
1412 ? "dbhi %0,%l1\n\tjbhi %l2"
1413 : "dbhi %0,%l1\n\tjhi %l2",
1414 operands);
1415 break;
1416
1417 case LT:
1418 output_asm_insn (MOTOROLA
1419 ? "dblt %0,%l1\n\tjblt %l2"
1420 : "dblt %0,%l1\n\tjlt %l2",
1421 operands);
1422 break;
1423
1424 case LTU:
1425 output_asm_insn (MOTOROLA
1426 ? "dbcs %0,%l1\n\tjbcs %l2"
1427 : "dbcs %0,%l1\n\tjcs %l2",
1428 operands);
1429 break;
1430
1431 case GE:
1432 output_asm_insn (MOTOROLA
1433 ? "dbge %0,%l1\n\tjbge %l2"
1434 : "dbge %0,%l1\n\tjge %l2",
1435 operands);
1436 break;
1437
1438 case GEU:
1439 output_asm_insn (MOTOROLA
1440 ? "dbcc %0,%l1\n\tjbcc %l2"
1441 : "dbcc %0,%l1\n\tjcc %l2",
1442 operands);
1443 break;
1444
1445 case LE:
1446 output_asm_insn (MOTOROLA
1447 ? "dble %0,%l1\n\tjble %l2"
1448 : "dble %0,%l1\n\tjle %l2",
1449 operands);
1450 break;
1451
1452 case LEU:
1453 output_asm_insn (MOTOROLA
1454 ? "dbls %0,%l1\n\tjbls %l2"
1455 : "dbls %0,%l1\n\tjls %l2",
1456 operands);
1457 break;
1458
1459 default:
1460 gcc_unreachable ();
1461 }
1462
1463 /* If the decrement is to be done in SImode, then we have
1464 to compensate for the fact that dbcc decrements in HImode. */
1465 switch (GET_MODE (operands[0]))
1466 {
1467 case SImode:
1468 output_asm_insn (MOTOROLA
1469 ? "clr%.w %0\n\tsubq%.l #1,%0\n\tjbpl %l1"
1470 : "clr%.w %0\n\tsubq%.l #1,%0\n\tjpl %l1",
1471 operands);
1472 break;
1473
1474 case HImode:
1475 break;
1476
1477 default:
1478 gcc_unreachable ();
1479 }
1480 }
1481
1482 const char *
1483 output_scc_di (rtx op, rtx operand1, rtx operand2, rtx dest)
1484 {
1485 rtx loperands[7];
1486 enum rtx_code op_code = GET_CODE (op);
1487
1488 /* This does not produce a useful cc. */
1489 CC_STATUS_INIT;
1490
1491 /* The m68k cmp.l instruction requires operand1 to be a reg as used
1492 below. Swap the operands and change the op if these requirements
1493 are not fulfilled. */
1494 if (GET_CODE (operand2) == REG && GET_CODE (operand1) != REG)
1495 {
1496 rtx tmp = operand1;
1497
1498 operand1 = operand2;
1499 operand2 = tmp;
1500 op_code = swap_condition (op_code);
1501 }
1502 loperands[0] = operand1;
1503 if (GET_CODE (operand1) == REG)
1504 loperands[1] = gen_rtx_REG (SImode, REGNO (operand1) + 1);
1505 else
1506 loperands[1] = adjust_address (operand1, SImode, 4);
1507 if (operand2 != const0_rtx)
1508 {
1509 loperands[2] = operand2;
1510 if (GET_CODE (operand2) == REG)
1511 loperands[3] = gen_rtx_REG (SImode, REGNO (operand2) + 1);
1512 else
1513 loperands[3] = adjust_address (operand2, SImode, 4);
1514 }
1515 loperands[4] = gen_label_rtx ();
1516 if (operand2 != const0_rtx)
1517 {
1518 output_asm_insn (MOTOROLA
1519 ? "cmp%.l %2,%0\n\tjbne %l4\n\tcmp%.l %3,%1"
1520 : "cmp%.l %2,%0\n\tjne %l4\n\tcmp%.l %3,%1",
1521 loperands);
1522 }
1523 else
1524 {
1525 if (TARGET_68020 || TARGET_COLDFIRE || ! ADDRESS_REG_P (loperands[0]))
1526 output_asm_insn ("tst%.l %0", loperands);
1527 else
1528 output_asm_insn ("cmp%.w #0,%0", loperands);
1529
1530 output_asm_insn (MOTOROLA ? "jbne %l4" : "jne %l4", loperands);
1531
1532 if (TARGET_68020 || TARGET_COLDFIRE || ! ADDRESS_REG_P (loperands[1]))
1533 output_asm_insn ("tst%.l %1", loperands);
1534 else
1535 output_asm_insn ("cmp%.w #0,%1", loperands);
1536 }
1537
1538 loperands[5] = dest;
1539
1540 switch (op_code)
1541 {
1542 case EQ:
1543 (*targetm.asm_out.internal_label) (asm_out_file, "L",
1544 CODE_LABEL_NUMBER (loperands[4]));
1545 output_asm_insn ("seq %5", loperands);
1546 break;
1547
1548 case NE:
1549 (*targetm.asm_out.internal_label) (asm_out_file, "L",
1550 CODE_LABEL_NUMBER (loperands[4]));
1551 output_asm_insn ("sne %5", loperands);
1552 break;
1553
1554 case GT:
1555 loperands[6] = gen_label_rtx ();
1556 output_asm_insn (MOTOROLA ? "shi %5\n\tjbra %l6" : "shi %5\n\tjra %l6",
1557 loperands);
1558 (*targetm.asm_out.internal_label) (asm_out_file, "L",
1559 CODE_LABEL_NUMBER (loperands[4]));
1560 output_asm_insn ("sgt %5", loperands);
1561 (*targetm.asm_out.internal_label) (asm_out_file, "L",
1562 CODE_LABEL_NUMBER (loperands[6]));
1563 break;
1564
1565 case GTU:
1566 (*targetm.asm_out.internal_label) (asm_out_file, "L",
1567 CODE_LABEL_NUMBER (loperands[4]));
1568 output_asm_insn ("shi %5", loperands);
1569 break;
1570
1571 case LT:
1572 loperands[6] = gen_label_rtx ();
1573 output_asm_insn (MOTOROLA ? "scs %5\n\tjbra %l6" : "scs %5\n\tjra %l6",
1574 loperands);
1575 (*targetm.asm_out.internal_label) (asm_out_file, "L",
1576 CODE_LABEL_NUMBER (loperands[4]));
1577 output_asm_insn ("slt %5", loperands);
1578 (*targetm.asm_out.internal_label) (asm_out_file, "L",
1579 CODE_LABEL_NUMBER (loperands[6]));
1580 break;
1581
1582 case LTU:
1583 (*targetm.asm_out.internal_label) (asm_out_file, "L",
1584 CODE_LABEL_NUMBER (loperands[4]));
1585 output_asm_insn ("scs %5", loperands);
1586 break;
1587
1588 case GE:
1589 loperands[6] = gen_label_rtx ();
1590 output_asm_insn (MOTOROLA ? "scc %5\n\tjbra %l6" : "scc %5\n\tjra %l6",
1591 loperands);
1592 (*targetm.asm_out.internal_label) (asm_out_file, "L",
1593 CODE_LABEL_NUMBER (loperands[4]));
1594 output_asm_insn ("sge %5", loperands);
1595 (*targetm.asm_out.internal_label) (asm_out_file, "L",
1596 CODE_LABEL_NUMBER (loperands[6]));
1597 break;
1598
1599 case GEU:
1600 (*targetm.asm_out.internal_label) (asm_out_file, "L",
1601 CODE_LABEL_NUMBER (loperands[4]));
1602 output_asm_insn ("scc %5", loperands);
1603 break;
1604
1605 case LE:
1606 loperands[6] = gen_label_rtx ();
1607 output_asm_insn (MOTOROLA ? "sls %5\n\tjbra %l6" : "sls %5\n\tjra %l6",
1608 loperands);
1609 (*targetm.asm_out.internal_label) (asm_out_file, "L",
1610 CODE_LABEL_NUMBER (loperands[4]));
1611 output_asm_insn ("sle %5", loperands);
1612 (*targetm.asm_out.internal_label) (asm_out_file, "L",
1613 CODE_LABEL_NUMBER (loperands[6]));
1614 break;
1615
1616 case LEU:
1617 (*targetm.asm_out.internal_label) (asm_out_file, "L",
1618 CODE_LABEL_NUMBER (loperands[4]));
1619 output_asm_insn ("sls %5", loperands);
1620 break;
1621
1622 default:
1623 gcc_unreachable ();
1624 }
1625 return "";
1626 }
1627
1628 const char *
1629 output_btst (rtx *operands, rtx countop, rtx dataop, rtx insn, int signpos)
1630 {
1631 operands[0] = countop;
1632 operands[1] = dataop;
1633
1634 if (GET_CODE (countop) == CONST_INT)
1635 {
1636 register int count = INTVAL (countop);
1637 /* If COUNT is bigger than size of storage unit in use,
1638 advance to the containing unit of same size. */
1639 if (count > signpos)
1640 {
1641 int offset = (count & ~signpos) / 8;
1642 count = count & signpos;
1643 operands[1] = dataop = adjust_address (dataop, QImode, offset);
1644 }
1645 if (count == signpos)
1646 cc_status.flags = CC_NOT_POSITIVE | CC_Z_IN_NOT_N;
1647 else
1648 cc_status.flags = CC_NOT_NEGATIVE | CC_Z_IN_NOT_N;
1649
1650 /* These three statements used to use next_insns_test_no...
1651 but it appears that this should do the same job. */
1652 if (count == 31
1653 && next_insn_tests_no_inequality (insn))
1654 return "tst%.l %1";
1655 if (count == 15
1656 && next_insn_tests_no_inequality (insn))
1657 return "tst%.w %1";
1658 if (count == 7
1659 && next_insn_tests_no_inequality (insn))
1660 return "tst%.b %1";
1661
1662 cc_status.flags = CC_NOT_NEGATIVE;
1663 }
1664 return "btst %0,%1";
1665 }
1666 \f
1667 /* Legitimize PIC addresses. If the address is already
1668 position-independent, we return ORIG. Newly generated
1669 position-independent addresses go to REG. If we need more
1670 than one register, we lose.
1671
1672 An address is legitimized by making an indirect reference
1673 through the Global Offset Table with the name of the symbol
1674 used as an offset.
1675
1676 The assembler and linker are responsible for placing the
1677 address of the symbol in the GOT. The function prologue
1678 is responsible for initializing a5 to the starting address
1679 of the GOT.
1680
1681 The assembler is also responsible for translating a symbol name
1682 into a constant displacement from the start of the GOT.
1683
1684 A quick example may make things a little clearer:
1685
1686 When not generating PIC code to store the value 12345 into _foo
1687 we would generate the following code:
1688
1689 movel #12345, _foo
1690
1691 When generating PIC two transformations are made. First, the compiler
1692 loads the address of foo into a register. So the first transformation makes:
1693
1694 lea _foo, a0
1695 movel #12345, a0@
1696
1697 The code in movsi will intercept the lea instruction and call this
1698 routine which will transform the instructions into:
1699
1700 movel a5@(_foo:w), a0
1701 movel #12345, a0@
1702
1703
1704 That (in a nutshell) is how *all* symbol and label references are
1705 handled. */
1706
1707 rtx
1708 legitimize_pic_address (rtx orig, enum machine_mode mode ATTRIBUTE_UNUSED,
1709 rtx reg)
1710 {
1711 rtx pic_ref = orig;
1712
1713 /* First handle a simple SYMBOL_REF or LABEL_REF */
1714 if (GET_CODE (orig) == SYMBOL_REF || GET_CODE (orig) == LABEL_REF)
1715 {
1716 gcc_assert (reg);
1717
1718 pic_ref = gen_rtx_MEM (Pmode,
1719 gen_rtx_PLUS (Pmode,
1720 pic_offset_table_rtx, orig));
1721 current_function_uses_pic_offset_table = 1;
1722 MEM_READONLY_P (pic_ref) = 1;
1723 emit_move_insn (reg, pic_ref);
1724 return reg;
1725 }
1726 else if (GET_CODE (orig) == CONST)
1727 {
1728 rtx base;
1729
1730 /* Make sure this has not already been legitimized. */
1731 if (GET_CODE (XEXP (orig, 0)) == PLUS
1732 && XEXP (XEXP (orig, 0), 0) == pic_offset_table_rtx)
1733 return orig;
1734
1735 gcc_assert (reg);
1736
1737 /* legitimize both operands of the PLUS */
1738 gcc_assert (GET_CODE (XEXP (orig, 0)) == PLUS);
1739
1740 base = legitimize_pic_address (XEXP (XEXP (orig, 0), 0), Pmode, reg);
1741 orig = legitimize_pic_address (XEXP (XEXP (orig, 0), 1), Pmode,
1742 base == reg ? 0 : reg);
1743
1744 if (GET_CODE (orig) == CONST_INT)
1745 return plus_constant (base, INTVAL (orig));
1746 pic_ref = gen_rtx_PLUS (Pmode, base, orig);
1747 /* Likewise, should we set special REG_NOTEs here? */
1748 }
1749 return pic_ref;
1750 }
1751
1752 \f
1753 typedef enum { MOVL, SWAP, NEGW, NOTW, NOTB, MOVQ, MVS, MVZ } CONST_METHOD;
1754
1755 static CONST_METHOD const_method (rtx);
1756
1757 #define USE_MOVQ(i) ((unsigned) ((i) + 128) <= 255)
1758
1759 static CONST_METHOD
1760 const_method (rtx constant)
1761 {
1762 int i;
1763 unsigned u;
1764
1765 i = INTVAL (constant);
1766 if (USE_MOVQ (i))
1767 return MOVQ;
1768
1769 /* The ColdFire doesn't have byte or word operations. */
1770 /* FIXME: This may not be useful for the m68060 either. */
1771 if (!TARGET_COLDFIRE)
1772 {
1773 /* if -256 < N < 256 but N is not in range for a moveq
1774 N^ff will be, so use moveq #N^ff, dreg; not.b dreg. */
1775 if (USE_MOVQ (i ^ 0xff))
1776 return NOTB;
1777 /* Likewise, try with not.w */
1778 if (USE_MOVQ (i ^ 0xffff))
1779 return NOTW;
1780 /* This is the only value where neg.w is useful */
1781 if (i == -65408)
1782 return NEGW;
1783 }
1784
1785 /* Try also with swap. */
1786 u = i;
1787 if (USE_MOVQ ((u >> 16) | (u << 16)))
1788 return SWAP;
1789
1790 if (TARGET_ISAB)
1791 {
1792 /* Try using MVZ/MVS with an immediate value to load constants. */
1793 if (i >= 0 && i <= 65535)
1794 return MVZ;
1795 if (i >= -32768 && i <= 32767)
1796 return MVS;
1797 }
1798
1799 /* Otherwise, use move.l */
1800 return MOVL;
1801 }
1802
1803 static int
1804 const_int_cost (rtx constant)
1805 {
1806 switch (const_method (constant))
1807 {
1808 case MOVQ:
1809 /* Constants between -128 and 127 are cheap due to moveq. */
1810 return 0;
1811 case MVZ:
1812 case MVS:
1813 case NOTB:
1814 case NOTW:
1815 case NEGW:
1816 case SWAP:
1817 /* Constants easily generated by moveq + not.b/not.w/neg.w/swap. */
1818 return 1;
1819 case MOVL:
1820 return 2;
1821 default:
1822 gcc_unreachable ();
1823 }
1824 }
1825
1826 static bool
1827 m68k_rtx_costs (rtx x, int code, int outer_code, int *total)
1828 {
1829 switch (code)
1830 {
1831 case CONST_INT:
1832 /* Constant zero is super cheap due to clr instruction. */
1833 if (x == const0_rtx)
1834 *total = 0;
1835 else
1836 *total = const_int_cost (x);
1837 return true;
1838
1839 case CONST:
1840 case LABEL_REF:
1841 case SYMBOL_REF:
1842 *total = 3;
1843 return true;
1844
1845 case CONST_DOUBLE:
1846 /* Make 0.0 cheaper than other floating constants to
1847 encourage creating tstsf and tstdf insns. */
1848 if (outer_code == COMPARE
1849 && (x == CONST0_RTX (SFmode) || x == CONST0_RTX (DFmode)))
1850 *total = 4;
1851 else
1852 *total = 5;
1853 return true;
1854
1855 /* These are vaguely right for a 68020. */
1856 /* The costs for long multiply have been adjusted to work properly
1857 in synth_mult on the 68020, relative to an average of the time
1858 for add and the time for shift, taking away a little more because
1859 sometimes move insns are needed. */
1860 /* div?.w is relatively cheaper on 68000 counted in COSTS_N_INSNS
1861 terms. */
1862 #define MULL_COST \
1863 (TUNE_68060 ? 2 \
1864 : TUNE_68040 ? 5 \
1865 : TUNE_CFV2 ? 10 \
1866 : TARGET_COLDFIRE ? 3 : 13)
1867
1868 #define MULW_COST \
1869 (TUNE_68060 ? 2 \
1870 : TUNE_68040 ? 3 \
1871 : TUNE_68000_10 || TUNE_CFV2 ? 5 \
1872 : TARGET_COLDFIRE ? 2 : 8)
1873
1874 #define DIVW_COST \
1875 (TARGET_CF_HWDIV ? 11 \
1876 : TUNE_68000_10 || TARGET_COLDFIRE ? 12 : 27)
1877
1878 case PLUS:
1879 /* An lea costs about three times as much as a simple add. */
1880 if (GET_MODE (x) == SImode
1881 && GET_CODE (XEXP (x, 1)) == REG
1882 && GET_CODE (XEXP (x, 0)) == MULT
1883 && GET_CODE (XEXP (XEXP (x, 0), 0)) == REG
1884 && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
1885 && (INTVAL (XEXP (XEXP (x, 0), 1)) == 2
1886 || INTVAL (XEXP (XEXP (x, 0), 1)) == 4
1887 || INTVAL (XEXP (XEXP (x, 0), 1)) == 8))
1888 {
1889 /* lea an@(dx:l:i),am */
1890 *total = COSTS_N_INSNS (TARGET_COLDFIRE ? 2 : 3);
1891 return true;
1892 }
1893 return false;
1894
1895 case ASHIFT:
1896 case ASHIFTRT:
1897 case LSHIFTRT:
1898 if (TUNE_68060)
1899 {
1900 *total = COSTS_N_INSNS(1);
1901 return true;
1902 }
1903 if (TUNE_68000_10)
1904 {
1905 if (GET_CODE (XEXP (x, 1)) == CONST_INT)
1906 {
1907 if (INTVAL (XEXP (x, 1)) < 16)
1908 *total = COSTS_N_INSNS (2) + INTVAL (XEXP (x, 1)) / 2;
1909 else
1910 /* We're using clrw + swap for these cases. */
1911 *total = COSTS_N_INSNS (4) + (INTVAL (XEXP (x, 1)) - 16) / 2;
1912 }
1913 else
1914 *total = COSTS_N_INSNS (10); /* Worst case. */
1915 return true;
1916 }
1917 /* A shift by a big integer takes an extra instruction. */
1918 if (GET_CODE (XEXP (x, 1)) == CONST_INT
1919 && (INTVAL (XEXP (x, 1)) == 16))
1920 {
1921 *total = COSTS_N_INSNS (2); /* clrw;swap */
1922 return true;
1923 }
1924 if (GET_CODE (XEXP (x, 1)) == CONST_INT
1925 && !(INTVAL (XEXP (x, 1)) > 0
1926 && INTVAL (XEXP (x, 1)) <= 8))
1927 {
1928 *total = COSTS_N_INSNS (TARGET_COLDFIRE ? 1 : 3); /* lsr #i,dn */
1929 return true;
1930 }
1931 return false;
1932
1933 case MULT:
1934 if ((GET_CODE (XEXP (x, 0)) == ZERO_EXTEND
1935 || GET_CODE (XEXP (x, 0)) == SIGN_EXTEND)
1936 && GET_MODE (x) == SImode)
1937 *total = COSTS_N_INSNS (MULW_COST);
1938 else if (GET_MODE (x) == QImode || GET_MODE (x) == HImode)
1939 *total = COSTS_N_INSNS (MULW_COST);
1940 else
1941 *total = COSTS_N_INSNS (MULL_COST);
1942 return true;
1943
1944 case DIV:
1945 case UDIV:
1946 case MOD:
1947 case UMOD:
1948 if (GET_MODE (x) == QImode || GET_MODE (x) == HImode)
1949 *total = COSTS_N_INSNS (DIVW_COST); /* div.w */
1950 else if (TARGET_CF_HWDIV)
1951 *total = COSTS_N_INSNS (18);
1952 else
1953 *total = COSTS_N_INSNS (43); /* div.l */
1954 return true;
1955
1956 default:
1957 return false;
1958 }
1959 }
1960
1961 const char *
1962 output_move_const_into_data_reg (rtx *operands)
1963 {
1964 int i;
1965
1966 i = INTVAL (operands[1]);
1967 switch (const_method (operands[1]))
1968 {
1969 case MVZ:
1970 return "mvzw %1,%0";
1971 case MVS:
1972 return "mvsw %1,%0";
1973 case MOVQ:
1974 return "moveq %1,%0";
1975 case NOTB:
1976 CC_STATUS_INIT;
1977 operands[1] = GEN_INT (i ^ 0xff);
1978 return "moveq %1,%0\n\tnot%.b %0";
1979 case NOTW:
1980 CC_STATUS_INIT;
1981 operands[1] = GEN_INT (i ^ 0xffff);
1982 return "moveq %1,%0\n\tnot%.w %0";
1983 case NEGW:
1984 CC_STATUS_INIT;
1985 return "moveq #-128,%0\n\tneg%.w %0";
1986 case SWAP:
1987 {
1988 unsigned u = i;
1989
1990 operands[1] = GEN_INT ((u << 16) | (u >> 16));
1991 return "moveq %1,%0\n\tswap %0";
1992 }
1993 case MOVL:
1994 return "move%.l %1,%0";
1995 default:
1996 gcc_unreachable ();
1997 }
1998 }
1999
2000 /* Return 1 if 'constant' can be represented by
2001 mov3q on a ColdFire V4 core. */
2002 int
2003 valid_mov3q_const (rtx constant)
2004 {
2005 int i;
2006
2007 if (TARGET_ISAB && GET_CODE (constant) == CONST_INT)
2008 {
2009 i = INTVAL (constant);
2010 if (i == -1 || (i >= 1 && i <= 7))
2011 return 1;
2012 }
2013 return 0;
2014 }
2015
2016
2017 const char *
2018 output_move_simode_const (rtx *operands)
2019 {
2020 if (operands[1] == const0_rtx
2021 && (DATA_REG_P (operands[0])
2022 || GET_CODE (operands[0]) == MEM)
2023 /* clr insns on 68000 read before writing. */
2024 && ((TARGET_68010 || TARGET_COLDFIRE)
2025 || !(GET_CODE (operands[0]) == MEM
2026 && MEM_VOLATILE_P (operands[0]))))
2027 return "clr%.l %0";
2028 else if ((GET_MODE (operands[0]) == SImode)
2029 && valid_mov3q_const (operands[1]))
2030 return "mov3q%.l %1,%0";
2031 else if (operands[1] == const0_rtx
2032 && ADDRESS_REG_P (operands[0]))
2033 return "sub%.l %0,%0";
2034 else if (DATA_REG_P (operands[0]))
2035 return output_move_const_into_data_reg (operands);
2036 else if (ADDRESS_REG_P (operands[0])
2037 && INTVAL (operands[1]) < 0x8000
2038 && INTVAL (operands[1]) >= -0x8000)
2039 {
2040 if (valid_mov3q_const (operands[1]))
2041 return "mov3q%.l %1,%0";
2042 return "move%.w %1,%0";
2043 }
2044 else if (GET_CODE (operands[0]) == MEM
2045 && GET_CODE (XEXP (operands[0], 0)) == PRE_DEC
2046 && REGNO (XEXP (XEXP (operands[0], 0), 0)) == STACK_POINTER_REGNUM
2047 && INTVAL (operands[1]) < 0x8000
2048 && INTVAL (operands[1]) >= -0x8000)
2049 {
2050 if (valid_mov3q_const (operands[1]))
2051 return "mov3q%.l %1,%-";
2052 return "pea %a1";
2053 }
2054 return "move%.l %1,%0";
2055 }
2056
2057 const char *
2058 output_move_simode (rtx *operands)
2059 {
2060 if (GET_CODE (operands[1]) == CONST_INT)
2061 return output_move_simode_const (operands);
2062 else if ((GET_CODE (operands[1]) == SYMBOL_REF
2063 || GET_CODE (operands[1]) == CONST)
2064 && push_operand (operands[0], SImode))
2065 return "pea %a1";
2066 else if ((GET_CODE (operands[1]) == SYMBOL_REF
2067 || GET_CODE (operands[1]) == CONST)
2068 && ADDRESS_REG_P (operands[0]))
2069 return "lea %a1,%0";
2070 return "move%.l %1,%0";
2071 }
2072
2073 const char *
2074 output_move_himode (rtx *operands)
2075 {
2076 if (GET_CODE (operands[1]) == CONST_INT)
2077 {
2078 if (operands[1] == const0_rtx
2079 && (DATA_REG_P (operands[0])
2080 || GET_CODE (operands[0]) == MEM)
2081 /* clr insns on 68000 read before writing. */
2082 && ((TARGET_68010 || TARGET_COLDFIRE)
2083 || !(GET_CODE (operands[0]) == MEM
2084 && MEM_VOLATILE_P (operands[0]))))
2085 return "clr%.w %0";
2086 else if (operands[1] == const0_rtx
2087 && ADDRESS_REG_P (operands[0]))
2088 return "sub%.l %0,%0";
2089 else if (DATA_REG_P (operands[0])
2090 && INTVAL (operands[1]) < 128
2091 && INTVAL (operands[1]) >= -128)
2092 return "moveq %1,%0";
2093 else if (INTVAL (operands[1]) < 0x8000
2094 && INTVAL (operands[1]) >= -0x8000)
2095 return "move%.w %1,%0";
2096 }
2097 else if (CONSTANT_P (operands[1]))
2098 return "move%.l %1,%0";
2099 /* Recognize the insn before a tablejump, one that refers
2100 to a table of offsets. Such an insn will need to refer
2101 to a label on the insn. So output one. Use the label-number
2102 of the table of offsets to generate this label. This code,
2103 and similar code below, assumes that there will be at most one
2104 reference to each table. */
2105 if (GET_CODE (operands[1]) == MEM
2106 && GET_CODE (XEXP (operands[1], 0)) == PLUS
2107 && GET_CODE (XEXP (XEXP (operands[1], 0), 1)) == LABEL_REF
2108 && GET_CODE (XEXP (XEXP (operands[1], 0), 0)) != PLUS)
2109 {
2110 rtx labelref = XEXP (XEXP (operands[1], 0), 1);
2111 if (MOTOROLA)
2112 asm_fprintf (asm_out_file, "\t.set %LLI%d,.+2\n",
2113 CODE_LABEL_NUMBER (XEXP (labelref, 0)));
2114 else
2115 (*targetm.asm_out.internal_label) (asm_out_file, "LI",
2116 CODE_LABEL_NUMBER (XEXP (labelref, 0)));
2117 }
2118 return "move%.w %1,%0";
2119 }
2120
2121 const char *
2122 output_move_qimode (rtx *operands)
2123 {
2124 /* 68k family always modifies the stack pointer by at least 2, even for
2125 byte pushes. The 5200 (ColdFire) does not do this. */
2126
2127 /* This case is generated by pushqi1 pattern now. */
2128 gcc_assert (!(GET_CODE (operands[0]) == MEM
2129 && GET_CODE (XEXP (operands[0], 0)) == PRE_DEC
2130 && XEXP (XEXP (operands[0], 0), 0) == stack_pointer_rtx
2131 && ! ADDRESS_REG_P (operands[1])
2132 && ! TARGET_COLDFIRE));
2133
2134 /* clr and st insns on 68000 read before writing. */
2135 if (!ADDRESS_REG_P (operands[0])
2136 && ((TARGET_68010 || TARGET_COLDFIRE)
2137 || !(GET_CODE (operands[0]) == MEM && MEM_VOLATILE_P (operands[0]))))
2138 {
2139 if (operands[1] == const0_rtx)
2140 return "clr%.b %0";
2141 if ((!TARGET_COLDFIRE || DATA_REG_P (operands[0]))
2142 && GET_CODE (operands[1]) == CONST_INT
2143 && (INTVAL (operands[1]) & 255) == 255)
2144 {
2145 CC_STATUS_INIT;
2146 return "st %0";
2147 }
2148 }
2149 if (GET_CODE (operands[1]) == CONST_INT
2150 && DATA_REG_P (operands[0])
2151 && INTVAL (operands[1]) < 128
2152 && INTVAL (operands[1]) >= -128)
2153 return "moveq %1,%0";
2154 if (operands[1] == const0_rtx && ADDRESS_REG_P (operands[0]))
2155 return "sub%.l %0,%0";
2156 if (GET_CODE (operands[1]) != CONST_INT && CONSTANT_P (operands[1]))
2157 return "move%.l %1,%0";
2158 /* 68k family (including the 5200 ColdFire) does not support byte moves to
2159 from address registers. */
2160 if (ADDRESS_REG_P (operands[0]) || ADDRESS_REG_P (operands[1]))
2161 return "move%.w %1,%0";
2162 return "move%.b %1,%0";
2163 }
2164
2165 const char *
2166 output_move_stricthi (rtx *operands)
2167 {
2168 if (operands[1] == const0_rtx
2169 /* clr insns on 68000 read before writing. */
2170 && ((TARGET_68010 || TARGET_COLDFIRE)
2171 || !(GET_CODE (operands[0]) == MEM && MEM_VOLATILE_P (operands[0]))))
2172 return "clr%.w %0";
2173 return "move%.w %1,%0";
2174 }
2175
2176 const char *
2177 output_move_strictqi (rtx *operands)
2178 {
2179 if (operands[1] == const0_rtx
2180 /* clr insns on 68000 read before writing. */
2181 && ((TARGET_68010 || TARGET_COLDFIRE)
2182 || !(GET_CODE (operands[0]) == MEM && MEM_VOLATILE_P (operands[0]))))
2183 return "clr%.b %0";
2184 return "move%.b %1,%0";
2185 }
2186
2187 /* Return the best assembler insn template
2188 for moving operands[1] into operands[0] as a fullword. */
2189
2190 static const char *
2191 singlemove_string (rtx *operands)
2192 {
2193 if (GET_CODE (operands[1]) == CONST_INT)
2194 return output_move_simode_const (operands);
2195 return "move%.l %1,%0";
2196 }
2197
2198
2199 /* Output assembler code to perform a doubleword move insn
2200 with operands OPERANDS. */
2201
2202 const char *
2203 output_move_double (rtx *operands)
2204 {
2205 enum
2206 {
2207 REGOP, OFFSOP, MEMOP, PUSHOP, POPOP, CNSTOP, RNDOP
2208 } optype0, optype1;
2209 rtx latehalf[2];
2210 rtx middlehalf[2];
2211 rtx xops[2];
2212 rtx addreg0 = 0, addreg1 = 0;
2213 int dest_overlapped_low = 0;
2214 int size = GET_MODE_SIZE (GET_MODE (operands[0]));
2215
2216 middlehalf[0] = 0;
2217 middlehalf[1] = 0;
2218
2219 /* First classify both operands. */
2220
2221 if (REG_P (operands[0]))
2222 optype0 = REGOP;
2223 else if (offsettable_memref_p (operands[0]))
2224 optype0 = OFFSOP;
2225 else if (GET_CODE (XEXP (operands[0], 0)) == POST_INC)
2226 optype0 = POPOP;
2227 else if (GET_CODE (XEXP (operands[0], 0)) == PRE_DEC)
2228 optype0 = PUSHOP;
2229 else if (GET_CODE (operands[0]) == MEM)
2230 optype0 = MEMOP;
2231 else
2232 optype0 = RNDOP;
2233
2234 if (REG_P (operands[1]))
2235 optype1 = REGOP;
2236 else if (CONSTANT_P (operands[1]))
2237 optype1 = CNSTOP;
2238 else if (offsettable_memref_p (operands[1]))
2239 optype1 = OFFSOP;
2240 else if (GET_CODE (XEXP (operands[1], 0)) == POST_INC)
2241 optype1 = POPOP;
2242 else if (GET_CODE (XEXP (operands[1], 0)) == PRE_DEC)
2243 optype1 = PUSHOP;
2244 else if (GET_CODE (operands[1]) == MEM)
2245 optype1 = MEMOP;
2246 else
2247 optype1 = RNDOP;
2248
2249 /* Check for the cases that the operand constraints are not supposed
2250 to allow to happen. Generating code for these cases is
2251 painful. */
2252 gcc_assert (optype0 != RNDOP && optype1 != RNDOP);
2253
2254 /* If one operand is decrementing and one is incrementing
2255 decrement the former register explicitly
2256 and change that operand into ordinary indexing. */
2257
2258 if (optype0 == PUSHOP && optype1 == POPOP)
2259 {
2260 operands[0] = XEXP (XEXP (operands[0], 0), 0);
2261 if (size == 12)
2262 output_asm_insn ("sub%.l #12,%0", operands);
2263 else
2264 output_asm_insn ("subq%.l #8,%0", operands);
2265 if (GET_MODE (operands[1]) == XFmode)
2266 operands[0] = gen_rtx_MEM (XFmode, operands[0]);
2267 else if (GET_MODE (operands[0]) == DFmode)
2268 operands[0] = gen_rtx_MEM (DFmode, operands[0]);
2269 else
2270 operands[0] = gen_rtx_MEM (DImode, operands[0]);
2271 optype0 = OFFSOP;
2272 }
2273 if (optype0 == POPOP && optype1 == PUSHOP)
2274 {
2275 operands[1] = XEXP (XEXP (operands[1], 0), 0);
2276 if (size == 12)
2277 output_asm_insn ("sub%.l #12,%1", operands);
2278 else
2279 output_asm_insn ("subq%.l #8,%1", operands);
2280 if (GET_MODE (operands[1]) == XFmode)
2281 operands[1] = gen_rtx_MEM (XFmode, operands[1]);
2282 else if (GET_MODE (operands[1]) == DFmode)
2283 operands[1] = gen_rtx_MEM (DFmode, operands[1]);
2284 else
2285 operands[1] = gen_rtx_MEM (DImode, operands[1]);
2286 optype1 = OFFSOP;
2287 }
2288
2289 /* If an operand is an unoffsettable memory ref, find a register
2290 we can increment temporarily to make it refer to the second word. */
2291
2292 if (optype0 == MEMOP)
2293 addreg0 = find_addr_reg (XEXP (operands[0], 0));
2294
2295 if (optype1 == MEMOP)
2296 addreg1 = find_addr_reg (XEXP (operands[1], 0));
2297
2298 /* Ok, we can do one word at a time.
2299 Normally we do the low-numbered word first,
2300 but if either operand is autodecrementing then we
2301 do the high-numbered word first.
2302
2303 In either case, set up in LATEHALF the operands to use
2304 for the high-numbered word and in some cases alter the
2305 operands in OPERANDS to be suitable for the low-numbered word. */
2306
2307 if (size == 12)
2308 {
2309 if (optype0 == REGOP)
2310 {
2311 latehalf[0] = gen_rtx_REG (SImode, REGNO (operands[0]) + 2);
2312 middlehalf[0] = gen_rtx_REG (SImode, REGNO (operands[0]) + 1);
2313 }
2314 else if (optype0 == OFFSOP)
2315 {
2316 middlehalf[0] = adjust_address (operands[0], SImode, 4);
2317 latehalf[0] = adjust_address (operands[0], SImode, size - 4);
2318 }
2319 else
2320 {
2321 middlehalf[0] = operands[0];
2322 latehalf[0] = operands[0];
2323 }
2324
2325 if (optype1 == REGOP)
2326 {
2327 latehalf[1] = gen_rtx_REG (SImode, REGNO (operands[1]) + 2);
2328 middlehalf[1] = gen_rtx_REG (SImode, REGNO (operands[1]) + 1);
2329 }
2330 else if (optype1 == OFFSOP)
2331 {
2332 middlehalf[1] = adjust_address (operands[1], SImode, 4);
2333 latehalf[1] = adjust_address (operands[1], SImode, size - 4);
2334 }
2335 else if (optype1 == CNSTOP)
2336 {
2337 if (GET_CODE (operands[1]) == CONST_DOUBLE)
2338 {
2339 REAL_VALUE_TYPE r;
2340 long l[3];
2341
2342 REAL_VALUE_FROM_CONST_DOUBLE (r, operands[1]);
2343 REAL_VALUE_TO_TARGET_LONG_DOUBLE (r, l);
2344 operands[1] = GEN_INT (l[0]);
2345 middlehalf[1] = GEN_INT (l[1]);
2346 latehalf[1] = GEN_INT (l[2]);
2347 }
2348 else
2349 {
2350 /* No non-CONST_DOUBLE constant should ever appear
2351 here. */
2352 gcc_assert (!CONSTANT_P (operands[1]));
2353 }
2354 }
2355 else
2356 {
2357 middlehalf[1] = operands[1];
2358 latehalf[1] = operands[1];
2359 }
2360 }
2361 else
2362 /* size is not 12: */
2363 {
2364 if (optype0 == REGOP)
2365 latehalf[0] = gen_rtx_REG (SImode, REGNO (operands[0]) + 1);
2366 else if (optype0 == OFFSOP)
2367 latehalf[0] = adjust_address (operands[0], SImode, size - 4);
2368 else
2369 latehalf[0] = operands[0];
2370
2371 if (optype1 == REGOP)
2372 latehalf[1] = gen_rtx_REG (SImode, REGNO (operands[1]) + 1);
2373 else if (optype1 == OFFSOP)
2374 latehalf[1] = adjust_address (operands[1], SImode, size - 4);
2375 else if (optype1 == CNSTOP)
2376 split_double (operands[1], &operands[1], &latehalf[1]);
2377 else
2378 latehalf[1] = operands[1];
2379 }
2380
2381 /* If insn is effectively movd N(sp),-(sp) then we will do the
2382 high word first. We should use the adjusted operand 1 (which is N+4(sp))
2383 for the low word as well, to compensate for the first decrement of sp. */
2384 if (optype0 == PUSHOP
2385 && REGNO (XEXP (XEXP (operands[0], 0), 0)) == STACK_POINTER_REGNUM
2386 && reg_overlap_mentioned_p (stack_pointer_rtx, operands[1]))
2387 operands[1] = middlehalf[1] = latehalf[1];
2388
2389 /* For (set (reg:DI N) (mem:DI ... (reg:SI N) ...)),
2390 if the upper part of reg N does not appear in the MEM, arrange to
2391 emit the move late-half first. Otherwise, compute the MEM address
2392 into the upper part of N and use that as a pointer to the memory
2393 operand. */
2394 if (optype0 == REGOP
2395 && (optype1 == OFFSOP || optype1 == MEMOP))
2396 {
2397 rtx testlow = gen_rtx_REG (SImode, REGNO (operands[0]));
2398
2399 if (reg_overlap_mentioned_p (testlow, XEXP (operands[1], 0))
2400 && reg_overlap_mentioned_p (latehalf[0], XEXP (operands[1], 0)))
2401 {
2402 /* If both halves of dest are used in the src memory address,
2403 compute the address into latehalf of dest.
2404 Note that this can't happen if the dest is two data regs. */
2405 compadr:
2406 xops[0] = latehalf[0];
2407 xops[1] = XEXP (operands[1], 0);
2408 output_asm_insn ("lea %a1,%0", xops);
2409 if (GET_MODE (operands[1]) == XFmode )
2410 {
2411 operands[1] = gen_rtx_MEM (XFmode, latehalf[0]);
2412 middlehalf[1] = adjust_address (operands[1], DImode, size - 8);
2413 latehalf[1] = adjust_address (operands[1], DImode, size - 4);
2414 }
2415 else
2416 {
2417 operands[1] = gen_rtx_MEM (DImode, latehalf[0]);
2418 latehalf[1] = adjust_address (operands[1], DImode, size - 4);
2419 }
2420 }
2421 else if (size == 12
2422 && reg_overlap_mentioned_p (middlehalf[0],
2423 XEXP (operands[1], 0)))
2424 {
2425 /* Check for two regs used by both source and dest.
2426 Note that this can't happen if the dest is all data regs.
2427 It can happen if the dest is d6, d7, a0.
2428 But in that case, latehalf is an addr reg, so
2429 the code at compadr does ok. */
2430
2431 if (reg_overlap_mentioned_p (testlow, XEXP (operands[1], 0))
2432 || reg_overlap_mentioned_p (latehalf[0], XEXP (operands[1], 0)))
2433 goto compadr;
2434
2435 /* JRV says this can't happen: */
2436 gcc_assert (!addreg0 && !addreg1);
2437
2438 /* Only the middle reg conflicts; simply put it last. */
2439 output_asm_insn (singlemove_string (operands), operands);
2440 output_asm_insn (singlemove_string (latehalf), latehalf);
2441 output_asm_insn (singlemove_string (middlehalf), middlehalf);
2442 return "";
2443 }
2444 else if (reg_overlap_mentioned_p (testlow, XEXP (operands[1], 0)))
2445 /* If the low half of dest is mentioned in the source memory
2446 address, the arrange to emit the move late half first. */
2447 dest_overlapped_low = 1;
2448 }
2449
2450 /* If one or both operands autodecrementing,
2451 do the two words, high-numbered first. */
2452
2453 /* Likewise, the first move would clobber the source of the second one,
2454 do them in the other order. This happens only for registers;
2455 such overlap can't happen in memory unless the user explicitly
2456 sets it up, and that is an undefined circumstance. */
2457
2458 if (optype0 == PUSHOP || optype1 == PUSHOP
2459 || (optype0 == REGOP && optype1 == REGOP
2460 && ((middlehalf[1] && REGNO (operands[0]) == REGNO (middlehalf[1]))
2461 || REGNO (operands[0]) == REGNO (latehalf[1])))
2462 || dest_overlapped_low)
2463 {
2464 /* Make any unoffsettable addresses point at high-numbered word. */
2465 if (addreg0)
2466 {
2467 if (size == 12)
2468 output_asm_insn ("addq%.l #8,%0", &addreg0);
2469 else
2470 output_asm_insn ("addq%.l #4,%0", &addreg0);
2471 }
2472 if (addreg1)
2473 {
2474 if (size == 12)
2475 output_asm_insn ("addq%.l #8,%0", &addreg1);
2476 else
2477 output_asm_insn ("addq%.l #4,%0", &addreg1);
2478 }
2479
2480 /* Do that word. */
2481 output_asm_insn (singlemove_string (latehalf), latehalf);
2482
2483 /* Undo the adds we just did. */
2484 if (addreg0)
2485 output_asm_insn ("subq%.l #4,%0", &addreg0);
2486 if (addreg1)
2487 output_asm_insn ("subq%.l #4,%0", &addreg1);
2488
2489 if (size == 12)
2490 {
2491 output_asm_insn (singlemove_string (middlehalf), middlehalf);
2492 if (addreg0)
2493 output_asm_insn ("subq%.l #4,%0", &addreg0);
2494 if (addreg1)
2495 output_asm_insn ("subq%.l #4,%0", &addreg1);
2496 }
2497
2498 /* Do low-numbered word. */
2499 return singlemove_string (operands);
2500 }
2501
2502 /* Normal case: do the two words, low-numbered first. */
2503
2504 output_asm_insn (singlemove_string (operands), operands);
2505
2506 /* Do the middle one of the three words for long double */
2507 if (size == 12)
2508 {
2509 if (addreg0)
2510 output_asm_insn ("addq%.l #4,%0", &addreg0);
2511 if (addreg1)
2512 output_asm_insn ("addq%.l #4,%0", &addreg1);
2513
2514 output_asm_insn (singlemove_string (middlehalf), middlehalf);
2515 }
2516
2517 /* Make any unoffsettable addresses point at high-numbered word. */
2518 if (addreg0)
2519 output_asm_insn ("addq%.l #4,%0", &addreg0);
2520 if (addreg1)
2521 output_asm_insn ("addq%.l #4,%0", &addreg1);
2522
2523 /* Do that word. */
2524 output_asm_insn (singlemove_string (latehalf), latehalf);
2525
2526 /* Undo the adds we just did. */
2527 if (addreg0)
2528 {
2529 if (size == 12)
2530 output_asm_insn ("subq%.l #8,%0", &addreg0);
2531 else
2532 output_asm_insn ("subq%.l #4,%0", &addreg0);
2533 }
2534 if (addreg1)
2535 {
2536 if (size == 12)
2537 output_asm_insn ("subq%.l #8,%0", &addreg1);
2538 else
2539 output_asm_insn ("subq%.l #4,%0", &addreg1);
2540 }
2541
2542 return "";
2543 }
2544
2545
2546 /* Ensure mode of ORIG, a REG rtx, is MODE. Returns either ORIG or a
2547 new rtx with the correct mode. */
2548
2549 static rtx
2550 force_mode (enum machine_mode mode, rtx orig)
2551 {
2552 if (mode == GET_MODE (orig))
2553 return orig;
2554
2555 if (REGNO (orig) >= FIRST_PSEUDO_REGISTER)
2556 abort ();
2557
2558 return gen_rtx_REG (mode, REGNO (orig));
2559 }
2560
2561 static int
2562 fp_reg_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
2563 {
2564 return reg_renumber && FP_REG_P (op);
2565 }
2566
2567 /* Emit insns to move operands[1] into operands[0].
2568
2569 Return 1 if we have written out everything that needs to be done to
2570 do the move. Otherwise, return 0 and the caller will emit the move
2571 normally.
2572
2573 Note SCRATCH_REG may not be in the proper mode depending on how it
2574 will be used. This routine is responsible for creating a new copy
2575 of SCRATCH_REG in the proper mode. */
2576
2577 int
2578 emit_move_sequence (rtx *operands, enum machine_mode mode, rtx scratch_reg)
2579 {
2580 register rtx operand0 = operands[0];
2581 register rtx operand1 = operands[1];
2582 register rtx tem;
2583
2584 if (scratch_reg
2585 && reload_in_progress && GET_CODE (operand0) == REG
2586 && REGNO (operand0) >= FIRST_PSEUDO_REGISTER)
2587 operand0 = reg_equiv_mem[REGNO (operand0)];
2588 else if (scratch_reg
2589 && reload_in_progress && GET_CODE (operand0) == SUBREG
2590 && GET_CODE (SUBREG_REG (operand0)) == REG
2591 && REGNO (SUBREG_REG (operand0)) >= FIRST_PSEUDO_REGISTER)
2592 {
2593 /* We must not alter SUBREG_BYTE (operand0) since that would confuse
2594 the code which tracks sets/uses for delete_output_reload. */
2595 rtx temp = gen_rtx_SUBREG (GET_MODE (operand0),
2596 reg_equiv_mem [REGNO (SUBREG_REG (operand0))],
2597 SUBREG_BYTE (operand0));
2598 operand0 = alter_subreg (&temp);
2599 }
2600
2601 if (scratch_reg
2602 && reload_in_progress && GET_CODE (operand1) == REG
2603 && REGNO (operand1) >= FIRST_PSEUDO_REGISTER)
2604 operand1 = reg_equiv_mem[REGNO (operand1)];
2605 else if (scratch_reg
2606 && reload_in_progress && GET_CODE (operand1) == SUBREG
2607 && GET_CODE (SUBREG_REG (operand1)) == REG
2608 && REGNO (SUBREG_REG (operand1)) >= FIRST_PSEUDO_REGISTER)
2609 {
2610 /* We must not alter SUBREG_BYTE (operand0) since that would confuse
2611 the code which tracks sets/uses for delete_output_reload. */
2612 rtx temp = gen_rtx_SUBREG (GET_MODE (operand1),
2613 reg_equiv_mem [REGNO (SUBREG_REG (operand1))],
2614 SUBREG_BYTE (operand1));
2615 operand1 = alter_subreg (&temp);
2616 }
2617
2618 if (scratch_reg && reload_in_progress && GET_CODE (operand0) == MEM
2619 && ((tem = find_replacement (&XEXP (operand0, 0)))
2620 != XEXP (operand0, 0)))
2621 operand0 = gen_rtx_MEM (GET_MODE (operand0), tem);
2622 if (scratch_reg && reload_in_progress && GET_CODE (operand1) == MEM
2623 && ((tem = find_replacement (&XEXP (operand1, 0)))
2624 != XEXP (operand1, 0)))
2625 operand1 = gen_rtx_MEM (GET_MODE (operand1), tem);
2626
2627 /* Handle secondary reloads for loads/stores of FP registers where
2628 the address is symbolic by using the scratch register */
2629 if (fp_reg_operand (operand0, mode)
2630 && ((GET_CODE (operand1) == MEM
2631 && ! memory_address_p (DFmode, XEXP (operand1, 0)))
2632 || ((GET_CODE (operand1) == SUBREG
2633 && GET_CODE (XEXP (operand1, 0)) == MEM
2634 && !memory_address_p (DFmode, XEXP (XEXP (operand1, 0), 0)))))
2635 && scratch_reg)
2636 {
2637 if (GET_CODE (operand1) == SUBREG)
2638 operand1 = XEXP (operand1, 0);
2639
2640 /* SCRATCH_REG will hold an address. We want
2641 it in SImode regardless of what mode it was originally given
2642 to us. */
2643 scratch_reg = force_mode (SImode, scratch_reg);
2644
2645 /* D might not fit in 14 bits either; for such cases load D into
2646 scratch reg. */
2647 if (!memory_address_p (Pmode, XEXP (operand1, 0)))
2648 {
2649 emit_move_insn (scratch_reg, XEXP (XEXP (operand1, 0), 1));
2650 emit_move_insn (scratch_reg, gen_rtx_fmt_ee (GET_CODE (XEXP (operand1, 0)),
2651 Pmode,
2652 XEXP (XEXP (operand1, 0), 0),
2653 scratch_reg));
2654 }
2655 else
2656 emit_move_insn (scratch_reg, XEXP (operand1, 0));
2657 emit_insn (gen_rtx_SET (VOIDmode, operand0,
2658 gen_rtx_MEM (mode, scratch_reg)));
2659 return 1;
2660 }
2661 else if (fp_reg_operand (operand1, mode)
2662 && ((GET_CODE (operand0) == MEM
2663 && ! memory_address_p (DFmode, XEXP (operand0, 0)))
2664 || ((GET_CODE (operand0) == SUBREG)
2665 && GET_CODE (XEXP (operand0, 0)) == MEM
2666 && !memory_address_p (DFmode, XEXP (XEXP (operand0, 0), 0))))
2667 && scratch_reg)
2668 {
2669 if (GET_CODE (operand0) == SUBREG)
2670 operand0 = XEXP (operand0, 0);
2671
2672 /* SCRATCH_REG will hold an address and maybe the actual data. We want
2673 it in SIMODE regardless of what mode it was originally given
2674 to us. */
2675 scratch_reg = force_mode (SImode, scratch_reg);
2676
2677 /* D might not fit in 14 bits either; for such cases load D into
2678 scratch reg. */
2679 if (!memory_address_p (Pmode, XEXP (operand0, 0)))
2680 {
2681 emit_move_insn (scratch_reg, XEXP (XEXP (operand0, 0), 1));
2682 emit_move_insn (scratch_reg, gen_rtx_fmt_ee (GET_CODE (XEXP (operand0,
2683 0)),
2684 Pmode,
2685 XEXP (XEXP (operand0, 0),
2686 0),
2687 scratch_reg));
2688 }
2689 else
2690 emit_move_insn (scratch_reg, XEXP (operand0, 0));
2691 emit_insn (gen_rtx_SET (VOIDmode, gen_rtx_MEM (mode, scratch_reg),
2692 operand1));
2693 return 1;
2694 }
2695 /* Handle secondary reloads for loads of FP registers from constant
2696 expressions by forcing the constant into memory.
2697
2698 use scratch_reg to hold the address of the memory location.
2699
2700 The proper fix is to change PREFERRED_RELOAD_CLASS to return
2701 NO_REGS when presented with a const_int and an register class
2702 containing only FP registers. Doing so unfortunately creates
2703 more problems than it solves. Fix this for 2.5. */
2704 else if (fp_reg_operand (operand0, mode)
2705 && CONSTANT_P (operand1)
2706 && scratch_reg)
2707 {
2708 rtx xoperands[2];
2709
2710 /* SCRATCH_REG will hold an address and maybe the actual data. We want
2711 it in SIMODE regardless of what mode it was originally given
2712 to us. */
2713 scratch_reg = force_mode (SImode, scratch_reg);
2714
2715 /* Force the constant into memory and put the address of the
2716 memory location into scratch_reg. */
2717 xoperands[0] = scratch_reg;
2718 xoperands[1] = XEXP (force_const_mem (mode, operand1), 0);
2719 emit_insn (gen_rtx_SET (mode, scratch_reg, xoperands[1]));
2720
2721 /* Now load the destination register. */
2722 emit_insn (gen_rtx_SET (mode, operand0,
2723 gen_rtx_MEM (mode, scratch_reg)));
2724 return 1;
2725 }
2726
2727 /* Now have insn-emit do whatever it normally does. */
2728 return 0;
2729 }
2730
2731 /* Return a REG that occurs in ADDR with coefficient 1.
2732 ADDR can be effectively incremented by incrementing REG. */
2733
2734 static rtx
2735 find_addr_reg (rtx addr)
2736 {
2737 while (GET_CODE (addr) == PLUS)
2738 {
2739 if (GET_CODE (XEXP (addr, 0)) == REG)
2740 addr = XEXP (addr, 0);
2741 else if (GET_CODE (XEXP (addr, 1)) == REG)
2742 addr = XEXP (addr, 1);
2743 else if (CONSTANT_P (XEXP (addr, 0)))
2744 addr = XEXP (addr, 1);
2745 else if (CONSTANT_P (XEXP (addr, 1)))
2746 addr = XEXP (addr, 0);
2747 else
2748 gcc_unreachable ();
2749 }
2750 gcc_assert (GET_CODE (addr) == REG);
2751 return addr;
2752 }
2753
2754 /* Output assembler code to perform a 32-bit 3-operand add. */
2755
2756 const char *
2757 output_addsi3 (rtx *operands)
2758 {
2759 if (! operands_match_p (operands[0], operands[1]))
2760 {
2761 if (!ADDRESS_REG_P (operands[1]))
2762 {
2763 rtx tmp = operands[1];
2764
2765 operands[1] = operands[2];
2766 operands[2] = tmp;
2767 }
2768
2769 /* These insns can result from reloads to access
2770 stack slots over 64k from the frame pointer. */
2771 if (GET_CODE (operands[2]) == CONST_INT
2772 && (INTVAL (operands[2]) < -32768 || INTVAL (operands[2]) > 32767))
2773 return "move%.l %2,%0\n\tadd%.l %1,%0";
2774 if (GET_CODE (operands[2]) == REG)
2775 return MOTOROLA ? "lea (%1,%2.l),%0" : "lea %1@(0,%2:l),%0";
2776 return MOTOROLA ? "lea (%c2,%1),%0" : "lea %1@(%c2),%0";
2777 }
2778 if (GET_CODE (operands[2]) == CONST_INT)
2779 {
2780 if (INTVAL (operands[2]) > 0
2781 && INTVAL (operands[2]) <= 8)
2782 return "addq%.l %2,%0";
2783 if (INTVAL (operands[2]) < 0
2784 && INTVAL (operands[2]) >= -8)
2785 {
2786 operands[2] = GEN_INT (- INTVAL (operands[2]));
2787 return "subq%.l %2,%0";
2788 }
2789 /* On the CPU32 it is faster to use two addql instructions to
2790 add a small integer (8 < N <= 16) to a register.
2791 Likewise for subql. */
2792 if (TUNE_CPU32 && REG_P (operands[0]))
2793 {
2794 if (INTVAL (operands[2]) > 8
2795 && INTVAL (operands[2]) <= 16)
2796 {
2797 operands[2] = GEN_INT (INTVAL (operands[2]) - 8);
2798 return "addq%.l #8,%0\n\taddq%.l %2,%0";
2799 }
2800 if (INTVAL (operands[2]) < -8
2801 && INTVAL (operands[2]) >= -16)
2802 {
2803 operands[2] = GEN_INT (- INTVAL (operands[2]) - 8);
2804 return "subq%.l #8,%0\n\tsubq%.l %2,%0";
2805 }
2806 }
2807 if (ADDRESS_REG_P (operands[0])
2808 && INTVAL (operands[2]) >= -0x8000
2809 && INTVAL (operands[2]) < 0x8000)
2810 {
2811 if (TUNE_68040)
2812 return "add%.w %2,%0";
2813 else
2814 return MOTOROLA ? "lea (%c2,%0),%0" : "lea %0@(%c2),%0";
2815 }
2816 }
2817 return "add%.l %2,%0";
2818 }
2819 \f
2820 /* Store in cc_status the expressions that the condition codes will
2821 describe after execution of an instruction whose pattern is EXP.
2822 Do not alter them if the instruction would not alter the cc's. */
2823
2824 /* On the 68000, all the insns to store in an address register fail to
2825 set the cc's. However, in some cases these instructions can make it
2826 possibly invalid to use the saved cc's. In those cases we clear out
2827 some or all of the saved cc's so they won't be used. */
2828
2829 void
2830 notice_update_cc (rtx exp, rtx insn)
2831 {
2832 if (GET_CODE (exp) == SET)
2833 {
2834 if (GET_CODE (SET_SRC (exp)) == CALL)
2835 CC_STATUS_INIT;
2836 else if (ADDRESS_REG_P (SET_DEST (exp)))
2837 {
2838 if (cc_status.value1 && modified_in_p (cc_status.value1, insn))
2839 cc_status.value1 = 0;
2840 if (cc_status.value2 && modified_in_p (cc_status.value2, insn))
2841 cc_status.value2 = 0;
2842 }
2843 else if (!FP_REG_P (SET_DEST (exp))
2844 && SET_DEST (exp) != cc0_rtx
2845 && (FP_REG_P (SET_SRC (exp))
2846 || GET_CODE (SET_SRC (exp)) == FIX
2847 || GET_CODE (SET_SRC (exp)) == FLOAT_TRUNCATE
2848 || GET_CODE (SET_SRC (exp)) == FLOAT_EXTEND))
2849 CC_STATUS_INIT;
2850 /* A pair of move insns doesn't produce a useful overall cc. */
2851 else if (!FP_REG_P (SET_DEST (exp))
2852 && !FP_REG_P (SET_SRC (exp))
2853 && GET_MODE_SIZE (GET_MODE (SET_SRC (exp))) > 4
2854 && (GET_CODE (SET_SRC (exp)) == REG
2855 || GET_CODE (SET_SRC (exp)) == MEM
2856 || GET_CODE (SET_SRC (exp)) == CONST_DOUBLE))
2857 CC_STATUS_INIT;
2858 else if (SET_DEST (exp) != pc_rtx)
2859 {
2860 cc_status.flags = 0;
2861 cc_status.value1 = SET_DEST (exp);
2862 cc_status.value2 = SET_SRC (exp);
2863 }
2864 }
2865 else if (GET_CODE (exp) == PARALLEL
2866 && GET_CODE (XVECEXP (exp, 0, 0)) == SET)
2867 {
2868 rtx dest = SET_DEST (XVECEXP (exp, 0, 0));
2869 rtx src = SET_SRC (XVECEXP (exp, 0, 0));
2870
2871 if (ADDRESS_REG_P (dest))
2872 CC_STATUS_INIT;
2873 else if (dest != pc_rtx)
2874 {
2875 cc_status.flags = 0;
2876 cc_status.value1 = dest;
2877 cc_status.value2 = src;
2878 }
2879 }
2880 else
2881 CC_STATUS_INIT;
2882 if (cc_status.value2 != 0
2883 && ADDRESS_REG_P (cc_status.value2)
2884 && GET_MODE (cc_status.value2) == QImode)
2885 CC_STATUS_INIT;
2886 if (cc_status.value2 != 0)
2887 switch (GET_CODE (cc_status.value2))
2888 {
2889 case ASHIFT: case ASHIFTRT: case LSHIFTRT:
2890 case ROTATE: case ROTATERT:
2891 /* These instructions always clear the overflow bit, and set
2892 the carry to the bit shifted out. */
2893 /* ??? We don't currently have a way to signal carry not valid,
2894 nor do we check for it in the branch insns. */
2895 CC_STATUS_INIT;
2896 break;
2897
2898 case PLUS: case MINUS: case MULT:
2899 case DIV: case UDIV: case MOD: case UMOD: case NEG:
2900 if (GET_MODE (cc_status.value2) != VOIDmode)
2901 cc_status.flags |= CC_NO_OVERFLOW;
2902 break;
2903 case ZERO_EXTEND:
2904 /* (SET r1 (ZERO_EXTEND r2)) on this machine
2905 ends with a move insn moving r2 in r2's mode.
2906 Thus, the cc's are set for r2.
2907 This can set N bit spuriously. */
2908 cc_status.flags |= CC_NOT_NEGATIVE;
2909
2910 default:
2911 break;
2912 }
2913 if (cc_status.value1 && GET_CODE (cc_status.value1) == REG
2914 && cc_status.value2
2915 && reg_overlap_mentioned_p (cc_status.value1, cc_status.value2))
2916 cc_status.value2 = 0;
2917 if (((cc_status.value1 && FP_REG_P (cc_status.value1))
2918 || (cc_status.value2 && FP_REG_P (cc_status.value2))))
2919 cc_status.flags = CC_IN_68881;
2920 }
2921 \f
2922 const char *
2923 output_move_const_double (rtx *operands)
2924 {
2925 int code = standard_68881_constant_p (operands[1]);
2926
2927 if (code != 0)
2928 {
2929 static char buf[40];
2930
2931 sprintf (buf, "fmovecr #0x%x,%%0", code & 0xff);
2932 return buf;
2933 }
2934 return "fmove%.d %1,%0";
2935 }
2936
2937 const char *
2938 output_move_const_single (rtx *operands)
2939 {
2940 int code = standard_68881_constant_p (operands[1]);
2941
2942 if (code != 0)
2943 {
2944 static char buf[40];
2945
2946 sprintf (buf, "fmovecr #0x%x,%%0", code & 0xff);
2947 return buf;
2948 }
2949 return "fmove%.s %f1,%0";
2950 }
2951
2952 /* Return nonzero if X, a CONST_DOUBLE, has a value that we can get
2953 from the "fmovecr" instruction.
2954 The value, anded with 0xff, gives the code to use in fmovecr
2955 to get the desired constant. */
2956
2957 /* This code has been fixed for cross-compilation. */
2958
2959 static int inited_68881_table = 0;
2960
2961 static const char *const strings_68881[7] = {
2962 "0.0",
2963 "1.0",
2964 "10.0",
2965 "100.0",
2966 "10000.0",
2967 "1e8",
2968 "1e16"
2969 };
2970
2971 static const int codes_68881[7] = {
2972 0x0f,
2973 0x32,
2974 0x33,
2975 0x34,
2976 0x35,
2977 0x36,
2978 0x37
2979 };
2980
2981 REAL_VALUE_TYPE values_68881[7];
2982
2983 /* Set up values_68881 array by converting the decimal values
2984 strings_68881 to binary. */
2985
2986 void
2987 init_68881_table (void)
2988 {
2989 int i;
2990 REAL_VALUE_TYPE r;
2991 enum machine_mode mode;
2992
2993 mode = SFmode;
2994 for (i = 0; i < 7; i++)
2995 {
2996 if (i == 6)
2997 mode = DFmode;
2998 r = REAL_VALUE_ATOF (strings_68881[i], mode);
2999 values_68881[i] = r;
3000 }
3001 inited_68881_table = 1;
3002 }
3003
3004 int
3005 standard_68881_constant_p (rtx x)
3006 {
3007 REAL_VALUE_TYPE r;
3008 int i;
3009
3010 /* fmovecr must be emulated on the 68040 and 68060, so it shouldn't be
3011 used at all on those chips. */
3012 if (TUNE_68040_60)
3013 return 0;
3014
3015 if (! inited_68881_table)
3016 init_68881_table ();
3017
3018 REAL_VALUE_FROM_CONST_DOUBLE (r, x);
3019
3020 /* Use REAL_VALUES_IDENTICAL instead of REAL_VALUES_EQUAL so that -0.0
3021 is rejected. */
3022 for (i = 0; i < 6; i++)
3023 {
3024 if (REAL_VALUES_IDENTICAL (r, values_68881[i]))
3025 return (codes_68881[i]);
3026 }
3027
3028 if (GET_MODE (x) == SFmode)
3029 return 0;
3030
3031 if (REAL_VALUES_EQUAL (r, values_68881[6]))
3032 return (codes_68881[6]);
3033
3034 /* larger powers of ten in the constants ram are not used
3035 because they are not equal to a `double' C constant. */
3036 return 0;
3037 }
3038
3039 /* If X is a floating-point constant, return the logarithm of X base 2,
3040 or 0 if X is not a power of 2. */
3041
3042 int
3043 floating_exact_log2 (rtx x)
3044 {
3045 REAL_VALUE_TYPE r, r1;
3046 int exp;
3047
3048 REAL_VALUE_FROM_CONST_DOUBLE (r, x);
3049
3050 if (REAL_VALUES_LESS (r, dconst1))
3051 return 0;
3052
3053 exp = real_exponent (&r);
3054 real_2expN (&r1, exp);
3055 if (REAL_VALUES_EQUAL (r1, r))
3056 return exp;
3057
3058 return 0;
3059 }
3060 \f
3061 /* A C compound statement to output to stdio stream STREAM the
3062 assembler syntax for an instruction operand X. X is an RTL
3063 expression.
3064
3065 CODE is a value that can be used to specify one of several ways
3066 of printing the operand. It is used when identical operands
3067 must be printed differently depending on the context. CODE
3068 comes from the `%' specification that was used to request
3069 printing of the operand. If the specification was just `%DIGIT'
3070 then CODE is 0; if the specification was `%LTR DIGIT' then CODE
3071 is the ASCII code for LTR.
3072
3073 If X is a register, this macro should print the register's name.
3074 The names can be found in an array `reg_names' whose type is
3075 `char *[]'. `reg_names' is initialized from `REGISTER_NAMES'.
3076
3077 When the machine description has a specification `%PUNCT' (a `%'
3078 followed by a punctuation character), this macro is called with
3079 a null pointer for X and the punctuation character for CODE.
3080
3081 The m68k specific codes are:
3082
3083 '.' for dot needed in Motorola-style opcode names.
3084 '-' for an operand pushing on the stack:
3085 sp@-, -(sp) or -(%sp) depending on the style of syntax.
3086 '+' for an operand pushing on the stack:
3087 sp@+, (sp)+ or (%sp)+ depending on the style of syntax.
3088 '@' for a reference to the top word on the stack:
3089 sp@, (sp) or (%sp) depending on the style of syntax.
3090 '#' for an immediate operand prefix (# in MIT and Motorola syntax
3091 but & in SGS syntax).
3092 '!' for the cc register (used in an `and to cc' insn).
3093 '$' for the letter `s' in an op code, but only on the 68040.
3094 '&' for the letter `d' in an op code, but only on the 68040.
3095 '/' for register prefix needed by longlong.h.
3096
3097 'b' for byte insn (no effect, on the Sun; this is for the ISI).
3098 'd' to force memory addressing to be absolute, not relative.
3099 'f' for float insn (print a CONST_DOUBLE as a float rather than in hex)
3100 'x' for float insn (print a CONST_DOUBLE as a float rather than in hex),
3101 or print pair of registers as rx:ry.
3102 'p' print an address with @PLTPC attached, but only if the operand
3103 is not locally-bound. */
3104
3105 void
3106 print_operand (FILE *file, rtx op, int letter)
3107 {
3108 if (letter == '.')
3109 {
3110 if (MOTOROLA)
3111 fprintf (file, ".");
3112 }
3113 else if (letter == '#')
3114 asm_fprintf (file, "%I");
3115 else if (letter == '-')
3116 asm_fprintf (file, MOTOROLA ? "-(%Rsp)" : "%Rsp@-");
3117 else if (letter == '+')
3118 asm_fprintf (file, MOTOROLA ? "(%Rsp)+" : "%Rsp@+");
3119 else if (letter == '@')
3120 asm_fprintf (file, MOTOROLA ? "(%Rsp)" : "%Rsp@");
3121 else if (letter == '!')
3122 asm_fprintf (file, "%Rfpcr");
3123 else if (letter == '$')
3124 {
3125 if (TARGET_68040)
3126 fprintf (file, "s");
3127 }
3128 else if (letter == '&')
3129 {
3130 if (TARGET_68040)
3131 fprintf (file, "d");
3132 }
3133 else if (letter == '/')
3134 asm_fprintf (file, "%R");
3135 else if (letter == 'p')
3136 {
3137 output_addr_const (file, op);
3138 if (!(GET_CODE (op) == SYMBOL_REF && SYMBOL_REF_LOCAL_P (op)))
3139 fprintf (file, "@PLTPC");
3140 }
3141 else if (GET_CODE (op) == REG)
3142 {
3143 if (letter == 'R')
3144 /* Print out the second register name of a register pair.
3145 I.e., R (6) => 7. */
3146 fputs (M68K_REGNAME(REGNO (op) + 1), file);
3147 else
3148 fputs (M68K_REGNAME(REGNO (op)), file);
3149 }
3150 else if (GET_CODE (op) == MEM)
3151 {
3152 output_address (XEXP (op, 0));
3153 if (letter == 'd' && ! TARGET_68020
3154 && CONSTANT_ADDRESS_P (XEXP (op, 0))
3155 && !(GET_CODE (XEXP (op, 0)) == CONST_INT
3156 && INTVAL (XEXP (op, 0)) < 0x8000
3157 && INTVAL (XEXP (op, 0)) >= -0x8000))
3158 fprintf (file, MOTOROLA ? ".l" : ":l");
3159 }
3160 else if (GET_CODE (op) == CONST_DOUBLE && GET_MODE (op) == SFmode)
3161 {
3162 REAL_VALUE_TYPE r;
3163 REAL_VALUE_FROM_CONST_DOUBLE (r, op);
3164 ASM_OUTPUT_FLOAT_OPERAND (letter, file, r);
3165 }
3166 else if (GET_CODE (op) == CONST_DOUBLE && GET_MODE (op) == XFmode)
3167 {
3168 REAL_VALUE_TYPE r;
3169 REAL_VALUE_FROM_CONST_DOUBLE (r, op);
3170 ASM_OUTPUT_LONG_DOUBLE_OPERAND (file, r);
3171 }
3172 else if (GET_CODE (op) == CONST_DOUBLE && GET_MODE (op) == DFmode)
3173 {
3174 REAL_VALUE_TYPE r;
3175 REAL_VALUE_FROM_CONST_DOUBLE (r, op);
3176 ASM_OUTPUT_DOUBLE_OPERAND (file, r);
3177 }
3178 else
3179 {
3180 /* Use `print_operand_address' instead of `output_addr_const'
3181 to ensure that we print relevant PIC stuff. */
3182 asm_fprintf (file, "%I");
3183 if (TARGET_PCREL
3184 && (GET_CODE (op) == SYMBOL_REF || GET_CODE (op) == CONST))
3185 print_operand_address (file, op);
3186 else
3187 output_addr_const (file, op);
3188 }
3189 }
3190
3191 \f
3192 /* A C compound statement to output to stdio stream STREAM the
3193 assembler syntax for an instruction operand that is a memory
3194 reference whose address is ADDR. ADDR is an RTL expression.
3195
3196 Note that this contains a kludge that knows that the only reason
3197 we have an address (plus (label_ref...) (reg...)) when not generating
3198 PIC code is in the insn before a tablejump, and we know that m68k.md
3199 generates a label LInnn: on such an insn.
3200
3201 It is possible for PIC to generate a (plus (label_ref...) (reg...))
3202 and we handle that just like we would a (plus (symbol_ref...) (reg...)).
3203
3204 Some SGS assemblers have a bug such that "Lnnn-LInnn-2.b(pc,d0.l*2)"
3205 fails to assemble. Luckily "Lnnn(pc,d0.l*2)" produces the results
3206 we want. This difference can be accommodated by using an assembler
3207 define such "LDnnn" to be either "Lnnn-LInnn-2.b", "Lnnn", or any other
3208 string, as necessary. This is accomplished via the ASM_OUTPUT_CASE_END
3209 macro. See m68k/sgs.h for an example; for versions without the bug.
3210 Some assemblers refuse all the above solutions. The workaround is to
3211 emit "K(pc,d0.l*2)" with K being a small constant known to give the
3212 right behavior.
3213
3214 They also do not like things like "pea 1.w", so we simple leave off
3215 the .w on small constants.
3216
3217 This routine is responsible for distinguishing between -fpic and -fPIC
3218 style relocations in an address. When generating -fpic code the
3219 offset is output in word mode (e.g. movel a5@(_foo:w), a0). When generating
3220 -fPIC code the offset is output in long mode (e.g. movel a5@(_foo:l), a0) */
3221
3222 #if MOTOROLA
3223 # define ASM_OUTPUT_CASE_FETCH(file, labelno, regname) \
3224 asm_fprintf (file, "%LL%d-%LLI%d.b(%Rpc,%s.", labelno, labelno, regname)
3225 #else /* !MOTOROLA */
3226 # define ASM_OUTPUT_CASE_FETCH(file, labelno, regname) \
3227 asm_fprintf (file, "%Rpc@(%LL%d-%LLI%d-2:b,%s:", labelno, labelno, regname)
3228 #endif /* !MOTOROLA */
3229
3230 void
3231 print_operand_address (FILE *file, rtx addr)
3232 {
3233 register rtx reg1, reg2, breg, ireg;
3234 rtx offset;
3235
3236 switch (GET_CODE (addr))
3237 {
3238 case REG:
3239 fprintf (file, MOTOROLA ? "(%s)" : "%s@", M68K_REGNAME (REGNO (addr)));
3240 break;
3241 case PRE_DEC:
3242 fprintf (file, MOTOROLA ? "-(%s)" : "%s@-",
3243 M68K_REGNAME (REGNO (XEXP (addr, 0))));
3244 break;
3245 case POST_INC:
3246 fprintf (file, MOTOROLA ? "(%s)+" : "%s@+",
3247 M68K_REGNAME (REGNO (XEXP (addr, 0))));
3248 break;
3249 case PLUS:
3250 reg1 = reg2 = ireg = breg = offset = 0;
3251 if (CONSTANT_ADDRESS_P (XEXP (addr, 0)))
3252 {
3253 offset = XEXP (addr, 0);
3254 addr = XEXP (addr, 1);
3255 }
3256 else if (CONSTANT_ADDRESS_P (XEXP (addr, 1)))
3257 {
3258 offset = XEXP (addr, 1);
3259 addr = XEXP (addr, 0);
3260 }
3261 if (GET_CODE (addr) != PLUS)
3262 {
3263 ;
3264 }
3265 else if (GET_CODE (XEXP (addr, 0)) == SIGN_EXTEND)
3266 {
3267 reg1 = XEXP (addr, 0);
3268 addr = XEXP (addr, 1);
3269 }
3270 else if (GET_CODE (XEXP (addr, 1)) == SIGN_EXTEND)
3271 {
3272 reg1 = XEXP (addr, 1);
3273 addr = XEXP (addr, 0);
3274 }
3275 else if (GET_CODE (XEXP (addr, 0)) == MULT)
3276 {
3277 reg1 = XEXP (addr, 0);
3278 addr = XEXP (addr, 1);
3279 }
3280 else if (GET_CODE (XEXP (addr, 1)) == MULT)
3281 {
3282 reg1 = XEXP (addr, 1);
3283 addr = XEXP (addr, 0);
3284 }
3285 else if (GET_CODE (XEXP (addr, 0)) == REG)
3286 {
3287 reg1 = XEXP (addr, 0);
3288 addr = XEXP (addr, 1);
3289 }
3290 else if (GET_CODE (XEXP (addr, 1)) == REG)
3291 {
3292 reg1 = XEXP (addr, 1);
3293 addr = XEXP (addr, 0);
3294 }
3295 if (GET_CODE (addr) == REG || GET_CODE (addr) == MULT
3296 || GET_CODE (addr) == SIGN_EXTEND)
3297 {
3298 if (reg1 == 0)
3299 reg1 = addr;
3300 else
3301 reg2 = addr;
3302 addr = 0;
3303 }
3304 #if 0 /* for OLD_INDEXING */
3305 else if (GET_CODE (addr) == PLUS)
3306 {
3307 if (GET_CODE (XEXP (addr, 0)) == REG)
3308 {
3309 reg2 = XEXP (addr, 0);
3310 addr = XEXP (addr, 1);
3311 }
3312 else if (GET_CODE (XEXP (addr, 1)) == REG)
3313 {
3314 reg2 = XEXP (addr, 1);
3315 addr = XEXP (addr, 0);
3316 }
3317 }
3318 #endif
3319 if (offset != 0)
3320 {
3321 gcc_assert (!addr);
3322 addr = offset;
3323 }
3324 if ((reg1 && (GET_CODE (reg1) == SIGN_EXTEND
3325 || GET_CODE (reg1) == MULT))
3326 || (reg2 != 0 && REGNO_OK_FOR_BASE_P (REGNO (reg2))))
3327 {
3328 breg = reg2;
3329 ireg = reg1;
3330 }
3331 else if (reg1 != 0 && REGNO_OK_FOR_BASE_P (REGNO (reg1)))
3332 {
3333 breg = reg1;
3334 ireg = reg2;
3335 }
3336 if (ireg != 0 && breg == 0 && GET_CODE (addr) == LABEL_REF
3337 && ! (flag_pic && ireg == pic_offset_table_rtx))
3338 {
3339 int scale = 1;
3340 if (GET_CODE (ireg) == MULT)
3341 {
3342 scale = INTVAL (XEXP (ireg, 1));
3343 ireg = XEXP (ireg, 0);
3344 }
3345 if (GET_CODE (ireg) == SIGN_EXTEND)
3346 {
3347 ASM_OUTPUT_CASE_FETCH (file,
3348 CODE_LABEL_NUMBER (XEXP (addr, 0)),
3349 M68K_REGNAME (REGNO (XEXP (ireg, 0))));
3350 fprintf (file, "w");
3351 }
3352 else
3353 {
3354 ASM_OUTPUT_CASE_FETCH (file,
3355 CODE_LABEL_NUMBER (XEXP (addr, 0)),
3356 M68K_REGNAME (REGNO (ireg)));
3357 fprintf (file, "l");
3358 }
3359 if (scale != 1)
3360 fprintf (file, MOTOROLA ? "*%d" : ":%d", scale);
3361 putc (')', file);
3362 break;
3363 }
3364 if (breg != 0 && ireg == 0 && GET_CODE (addr) == LABEL_REF
3365 && ! (flag_pic && breg == pic_offset_table_rtx))
3366 {
3367 ASM_OUTPUT_CASE_FETCH (file,
3368 CODE_LABEL_NUMBER (XEXP (addr, 0)),
3369 M68K_REGNAME (REGNO (breg)));
3370 fprintf (file, "l)");
3371 break;
3372 }
3373 if (ireg != 0 || breg != 0)
3374 {
3375 int scale = 1;
3376
3377 gcc_assert (breg);
3378 gcc_assert (flag_pic || !addr || GET_CODE (addr) != LABEL_REF);
3379
3380 if (MOTOROLA)
3381 {
3382 if (addr != 0)
3383 {
3384 output_addr_const (file, addr);
3385 if (flag_pic && (breg == pic_offset_table_rtx))
3386 {
3387 fprintf (file, "@GOT");
3388 if (flag_pic == 1)
3389 fprintf (file, ".w");
3390 }
3391 }
3392 fprintf (file, "(%s", M68K_REGNAME (REGNO (breg)));
3393 if (ireg != 0)
3394 putc (',', file);
3395 }
3396 else /* !MOTOROLA */
3397 {
3398 fprintf (file, "%s@(", M68K_REGNAME (REGNO (breg)));
3399 if (addr != 0)
3400 {
3401 output_addr_const (file, addr);
3402 if (breg == pic_offset_table_rtx)
3403 switch (flag_pic)
3404 {
3405 case 1:
3406 fprintf (file, ":w");
3407 break;
3408 case 2:
3409 fprintf (file, ":l");
3410 break;
3411 default:
3412 break;
3413 }
3414 if (ireg != 0)
3415 putc (',', file);
3416 }
3417 } /* !MOTOROLA */
3418 if (ireg != 0 && GET_CODE (ireg) == MULT)
3419 {
3420 scale = INTVAL (XEXP (ireg, 1));
3421 ireg = XEXP (ireg, 0);
3422 }
3423 if (ireg != 0 && GET_CODE (ireg) == SIGN_EXTEND)
3424 fprintf (file, MOTOROLA ? "%s.w" : "%s:w",
3425 M68K_REGNAME (REGNO (XEXP (ireg, 0))));
3426 else if (ireg != 0)
3427 fprintf (file, MOTOROLA ? "%s.l" : "%s:l",
3428 M68K_REGNAME (REGNO (ireg)));
3429 if (scale != 1)
3430 fprintf (file, MOTOROLA ? "*%d" : ":%d", scale);
3431 putc (')', file);
3432 break;
3433 }
3434 else if (reg1 != 0 && GET_CODE (addr) == LABEL_REF
3435 && ! (flag_pic && reg1 == pic_offset_table_rtx))
3436 {
3437 ASM_OUTPUT_CASE_FETCH (file,
3438 CODE_LABEL_NUMBER (XEXP (addr, 0)),
3439 M68K_REGNAME (REGNO (reg1)));
3440 fprintf (file, "l)");
3441 break;
3442 }
3443 /* FALL-THROUGH (is this really what we want?) */
3444 default:
3445 if (GET_CODE (addr) == CONST_INT
3446 && INTVAL (addr) < 0x8000
3447 && INTVAL (addr) >= -0x8000)
3448 {
3449 fprintf (file, MOTOROLA ? "%d.w" : "%d:w", (int) INTVAL (addr));
3450 }
3451 else if (GET_CODE (addr) == CONST_INT)
3452 {
3453 fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (addr));
3454 }
3455 else if (TARGET_PCREL)
3456 {
3457 fputc ('(', file);
3458 output_addr_const (file, addr);
3459 if (flag_pic == 1)
3460 asm_fprintf (file, ":w,%Rpc)");
3461 else
3462 asm_fprintf (file, ":l,%Rpc)");
3463 }
3464 else
3465 {
3466 /* Special case for SYMBOL_REF if the symbol name ends in
3467 `.<letter>', this can be mistaken as a size suffix. Put
3468 the name in parentheses. */
3469 if (GET_CODE (addr) == SYMBOL_REF
3470 && strlen (XSTR (addr, 0)) > 2
3471 && XSTR (addr, 0)[strlen (XSTR (addr, 0)) - 2] == '.')
3472 {
3473 putc ('(', file);
3474 output_addr_const (file, addr);
3475 putc (')', file);
3476 }
3477 else
3478 output_addr_const (file, addr);
3479 }
3480 break;
3481 }
3482 }
3483 \f
3484 /* Check for cases where a clr insns can be omitted from code using
3485 strict_low_part sets. For example, the second clrl here is not needed:
3486 clrl d0; movw a0@+,d0; use d0; clrl d0; movw a0@+; use d0; ...
3487
3488 MODE is the mode of this STRICT_LOW_PART set. FIRST_INSN is the clear
3489 insn we are checking for redundancy. TARGET is the register set by the
3490 clear insn. */
3491
3492 bool
3493 strict_low_part_peephole_ok (enum machine_mode mode, rtx first_insn,
3494 rtx target)
3495 {
3496 rtx p;
3497
3498 p = prev_nonnote_insn (first_insn);
3499
3500 while (p)
3501 {
3502 /* If it isn't an insn, then give up. */
3503 if (GET_CODE (p) != INSN)
3504 return false;
3505
3506 if (reg_set_p (target, p))
3507 {
3508 rtx set = single_set (p);
3509 rtx dest;
3510
3511 /* If it isn't an easy to recognize insn, then give up. */
3512 if (! set)
3513 return false;
3514
3515 dest = SET_DEST (set);
3516
3517 /* If this sets the entire target register to zero, then our
3518 first_insn is redundant. */
3519 if (rtx_equal_p (dest, target)
3520 && SET_SRC (set) == const0_rtx)
3521 return true;
3522 else if (GET_CODE (dest) == STRICT_LOW_PART
3523 && GET_CODE (XEXP (dest, 0)) == REG
3524 && REGNO (XEXP (dest, 0)) == REGNO (target)
3525 && (GET_MODE_SIZE (GET_MODE (XEXP (dest, 0)))
3526 <= GET_MODE_SIZE (mode)))
3527 /* This is a strict low part set which modifies less than
3528 we are using, so it is safe. */
3529 ;
3530 else
3531 return false;
3532 }
3533
3534 p = prev_nonnote_insn (p);
3535 }
3536
3537 return false;
3538 }
3539
3540 /* Operand predicates for implementing asymmetric pc-relative addressing
3541 on m68k. The m68k supports pc-relative addressing (mode 7, register 2)
3542 when used as a source operand, but not as a destination operand.
3543
3544 We model this by restricting the meaning of the basic predicates
3545 (general_operand, memory_operand, etc) to forbid the use of this
3546 addressing mode, and then define the following predicates that permit
3547 this addressing mode. These predicates can then be used for the
3548 source operands of the appropriate instructions.
3549
3550 n.b. While it is theoretically possible to change all machine patterns
3551 to use this addressing more where permitted by the architecture,
3552 it has only been implemented for "common" cases: SImode, HImode, and
3553 QImode operands, and only for the principle operations that would
3554 require this addressing mode: data movement and simple integer operations.
3555
3556 In parallel with these new predicates, two new constraint letters
3557 were defined: 'S' and 'T'. 'S' is the -mpcrel analog of 'm'.
3558 'T' replaces 's' in the non-pcrel case. It is a no-op in the pcrel case.
3559 In the pcrel case 's' is only valid in combination with 'a' registers.
3560 See addsi3, subsi3, cmpsi, and movsi patterns for a better understanding
3561 of how these constraints are used.
3562
3563 The use of these predicates is strictly optional, though patterns that
3564 don't will cause an extra reload register to be allocated where one
3565 was not necessary:
3566
3567 lea (abc:w,%pc),%a0 ; need to reload address
3568 moveq &1,%d1 ; since write to pc-relative space
3569 movel %d1,%a0@ ; is not allowed
3570 ...
3571 lea (abc:w,%pc),%a1 ; no need to reload address here
3572 movel %a1@,%d0 ; since "movel (abc:w,%pc),%d0" is ok
3573
3574 For more info, consult tiemann@cygnus.com.
3575
3576
3577 All of the ugliness with predicates and constraints is due to the
3578 simple fact that the m68k does not allow a pc-relative addressing
3579 mode as a destination. gcc does not distinguish between source and
3580 destination addresses. Hence, if we claim that pc-relative address
3581 modes are valid, e.g. GO_IF_LEGITIMATE_ADDRESS accepts them, then we
3582 end up with invalid code. To get around this problem, we left
3583 pc-relative modes as invalid addresses, and then added special
3584 predicates and constraints to accept them.
3585
3586 A cleaner way to handle this is to modify gcc to distinguish
3587 between source and destination addresses. We can then say that
3588 pc-relative is a valid source address but not a valid destination
3589 address, and hopefully avoid a lot of the predicate and constraint
3590 hackery. Unfortunately, this would be a pretty big change. It would
3591 be a useful change for a number of ports, but there aren't any current
3592 plans to undertake this.
3593
3594 ***************************************************************************/
3595
3596
3597 const char *
3598 output_andsi3 (rtx *operands)
3599 {
3600 int logval;
3601 if (GET_CODE (operands[2]) == CONST_INT
3602 && (INTVAL (operands[2]) | 0xffff) == -1
3603 && (DATA_REG_P (operands[0])
3604 || offsettable_memref_p (operands[0]))
3605 && !TARGET_COLDFIRE)
3606 {
3607 if (GET_CODE (operands[0]) != REG)
3608 operands[0] = adjust_address (operands[0], HImode, 2);
3609 operands[2] = GEN_INT (INTVAL (operands[2]) & 0xffff);
3610 /* Do not delete a following tstl %0 insn; that would be incorrect. */
3611 CC_STATUS_INIT;
3612 if (operands[2] == const0_rtx)
3613 return "clr%.w %0";
3614 return "and%.w %2,%0";
3615 }
3616 if (GET_CODE (operands[2]) == CONST_INT
3617 && (logval = exact_log2 (~ INTVAL (operands[2]))) >= 0
3618 && (DATA_REG_P (operands[0])
3619 || offsettable_memref_p (operands[0])))
3620 {
3621 if (DATA_REG_P (operands[0]))
3622 operands[1] = GEN_INT (logval);
3623 else
3624 {
3625 operands[0] = adjust_address (operands[0], SImode, 3 - (logval / 8));
3626 operands[1] = GEN_INT (logval % 8);
3627 }
3628 /* This does not set condition codes in a standard way. */
3629 CC_STATUS_INIT;
3630 return "bclr %1,%0";
3631 }
3632 return "and%.l %2,%0";
3633 }
3634
3635 const char *
3636 output_iorsi3 (rtx *operands)
3637 {
3638 register int logval;
3639 if (GET_CODE (operands[2]) == CONST_INT
3640 && INTVAL (operands[2]) >> 16 == 0
3641 && (DATA_REG_P (operands[0])
3642 || offsettable_memref_p (operands[0]))
3643 && !TARGET_COLDFIRE)
3644 {
3645 if (GET_CODE (operands[0]) != REG)
3646 operands[0] = adjust_address (operands[0], HImode, 2);
3647 /* Do not delete a following tstl %0 insn; that would be incorrect. */
3648 CC_STATUS_INIT;
3649 if (INTVAL (operands[2]) == 0xffff)
3650 return "mov%.w %2,%0";
3651 return "or%.w %2,%0";
3652 }
3653 if (GET_CODE (operands[2]) == CONST_INT
3654 && (logval = exact_log2 (INTVAL (operands[2]))) >= 0
3655 && (DATA_REG_P (operands[0])
3656 || offsettable_memref_p (operands[0])))
3657 {
3658 if (DATA_REG_P (operands[0]))
3659 operands[1] = GEN_INT (logval);
3660 else
3661 {
3662 operands[0] = adjust_address (operands[0], SImode, 3 - (logval / 8));
3663 operands[1] = GEN_INT (logval % 8);
3664 }
3665 CC_STATUS_INIT;
3666 return "bset %1,%0";
3667 }
3668 return "or%.l %2,%0";
3669 }
3670
3671 const char *
3672 output_xorsi3 (rtx *operands)
3673 {
3674 register int logval;
3675 if (GET_CODE (operands[2]) == CONST_INT
3676 && INTVAL (operands[2]) >> 16 == 0
3677 && (offsettable_memref_p (operands[0]) || DATA_REG_P (operands[0]))
3678 && !TARGET_COLDFIRE)
3679 {
3680 if (! DATA_REG_P (operands[0]))
3681 operands[0] = adjust_address (operands[0], HImode, 2);
3682 /* Do not delete a following tstl %0 insn; that would be incorrect. */
3683 CC_STATUS_INIT;
3684 if (INTVAL (operands[2]) == 0xffff)
3685 return "not%.w %0";
3686 return "eor%.w %2,%0";
3687 }
3688 if (GET_CODE (operands[2]) == CONST_INT
3689 && (logval = exact_log2 (INTVAL (operands[2]))) >= 0
3690 && (DATA_REG_P (operands[0])
3691 || offsettable_memref_p (operands[0])))
3692 {
3693 if (DATA_REG_P (operands[0]))
3694 operands[1] = GEN_INT (logval);
3695 else
3696 {
3697 operands[0] = adjust_address (operands[0], SImode, 3 - (logval / 8));
3698 operands[1] = GEN_INT (logval % 8);
3699 }
3700 CC_STATUS_INIT;
3701 return "bchg %1,%0";
3702 }
3703 return "eor%.l %2,%0";
3704 }
3705
3706 /* Return the instruction that should be used for a call to address X,
3707 which is known to be in operand 0. */
3708
3709 const char *
3710 output_call (rtx x)
3711 {
3712 if (symbolic_operand (x, VOIDmode))
3713 return m68k_symbolic_call;
3714 else
3715 return "jsr %a0";
3716 }
3717
3718 #ifdef M68K_TARGET_COFF
3719
3720 /* Output assembly to switch to section NAME with attribute FLAGS. */
3721
3722 static void
3723 m68k_coff_asm_named_section (const char *name, unsigned int flags,
3724 tree decl ATTRIBUTE_UNUSED)
3725 {
3726 char flagchar;
3727
3728 if (flags & SECTION_WRITE)
3729 flagchar = 'd';
3730 else
3731 flagchar = 'x';
3732
3733 fprintf (asm_out_file, "\t.section\t%s,\"%c\"\n", name, flagchar);
3734 }
3735
3736 #endif /* M68K_TARGET_COFF */
3737
3738 static void
3739 m68k_output_mi_thunk (FILE *file, tree thunk ATTRIBUTE_UNUSED,
3740 HOST_WIDE_INT delta,
3741 HOST_WIDE_INT vcall_offset ATTRIBUTE_UNUSED,
3742 tree function)
3743 {
3744 rtx xops[1];
3745 const char *fmt;
3746
3747 if (delta > 0 && delta <= 8)
3748 asm_fprintf (file, (MOTOROLA
3749 ? "\taddq.l %I%d,4(%Rsp)\n"
3750 : "\taddql %I%d,%Rsp@(4)\n"),
3751 (int) delta);
3752 else if (delta < 0 && delta >= -8)
3753 asm_fprintf (file, (MOTOROLA
3754 ? "\tsubq.l %I%d,4(%Rsp)\n"
3755 : "\tsubql %I%d,%Rsp@(4)\n"),
3756 (int) -delta);
3757 else if (TARGET_COLDFIRE)
3758 {
3759 /* ColdFire can't add/sub a constant to memory unless it is in
3760 the range of addq/subq. So load the value into %d0 and
3761 then add it to 4(%sp). */
3762 if (delta >= -128 && delta <= 127)
3763 asm_fprintf (file, (MOTOROLA
3764 ? "\tmoveq.l %I%wd,%Rd0\n"
3765 : "\tmoveql %I%wd,%Rd0\n"),
3766 delta);
3767 else
3768 asm_fprintf (file, (MOTOROLA
3769 ? "\tmove.l %I%wd,%Rd0\n"
3770 : "\tmovel %I%wd,%Rd0\n"),
3771 delta);
3772 asm_fprintf (file, (MOTOROLA
3773 ? "\tadd.l %Rd0,4(%Rsp)\n"
3774 : "\taddl %Rd0,%Rsp@(4)\n"));
3775 }
3776 else
3777 asm_fprintf (file, (MOTOROLA
3778 ? "\tadd.l %I%wd,4(%Rsp)\n"
3779 : "\taddl %I%wd,%Rsp@(4)\n"),
3780 delta);
3781
3782 xops[0] = DECL_RTL (function);
3783
3784 gcc_assert (MEM_P (xops[0])
3785 && symbolic_operand (XEXP (xops[0], 0), VOIDmode));
3786 xops[0] = XEXP (xops[0], 0);
3787
3788 fmt = m68k_symbolic_jump;
3789 if (m68k_symbolic_jump == NULL)
3790 fmt = "move.l %%a1@GOT(%%a5), %%a1\n\tjmp (%%a1)";
3791
3792 output_asm_insn (fmt, xops);
3793 }
3794
3795 /* Worker function for TARGET_STRUCT_VALUE_RTX. */
3796
3797 static rtx
3798 m68k_struct_value_rtx (tree fntype ATTRIBUTE_UNUSED,
3799 int incoming ATTRIBUTE_UNUSED)
3800 {
3801 return gen_rtx_REG (Pmode, M68K_STRUCT_VALUE_REGNUM);
3802 }
3803
3804 /* Return nonzero if register old_reg can be renamed to register new_reg. */
3805 int
3806 m68k_hard_regno_rename_ok (unsigned int old_reg ATTRIBUTE_UNUSED,
3807 unsigned int new_reg)
3808 {
3809
3810 /* Interrupt functions can only use registers that have already been
3811 saved by the prologue, even if they would normally be
3812 call-clobbered. */
3813
3814 if (m68k_interrupt_function_p (current_function_decl)
3815 && !regs_ever_live[new_reg])
3816 return 0;
3817
3818 return 1;
3819 }
3820
3821 /* Value is true if hard register REGNO can hold a value of machine-mode MODE.
3822 On the 68000, the cpu registers can hold any mode except bytes in address
3823 registers, but the 68881 registers can hold only SFmode or DFmode. */
3824 bool
3825 m68k_regno_mode_ok (int regno, enum machine_mode mode)
3826 {
3827 if (DATA_REGNO_P (regno))
3828 {
3829 /* Data Registers, can hold aggregate if fits in. */
3830 if (regno + GET_MODE_SIZE (mode) / 4 <= 8)
3831 return true;
3832 }
3833 else if (ADDRESS_REGNO_P (regno))
3834 {
3835 /* Address Registers, can't hold bytes, can hold aggregate if
3836 fits in. */
3837 if (GET_MODE_SIZE (mode) == 1)
3838 return false;
3839 if (regno + GET_MODE_SIZE (mode) / 4 <= 16)
3840 return true;
3841 }
3842 else if (FP_REGNO_P (regno))
3843 {
3844 /* FPU registers, hold float or complex float of long double or
3845 smaller. */
3846 if ((GET_MODE_CLASS (mode) == MODE_FLOAT
3847 || GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT)
3848 && GET_MODE_UNIT_SIZE (mode) <= TARGET_FP_REG_SIZE)
3849 return true;
3850 }
3851 return false;
3852 }
3853
3854 /* Return floating point values in a 68881 register. This makes 68881 code
3855 a little bit faster. It also makes -msoft-float code incompatible with
3856 hard-float code, so people have to be careful not to mix the two.
3857 For ColdFire it was decided the ABI incompatibility is undesirable.
3858 If there is need for a hard-float ABI it is probably worth doing it
3859 properly and also passing function arguments in FP registers. */
3860 rtx
3861 m68k_libcall_value (enum machine_mode mode)
3862 {
3863 switch (mode) {
3864 case SFmode:
3865 case DFmode:
3866 case XFmode:
3867 if (TARGET_68881)
3868 return gen_rtx_REG (mode, 16);
3869 break;
3870 default:
3871 break;
3872 }
3873 return gen_rtx_REG (mode, 0);
3874 }
3875
3876 rtx
3877 m68k_function_value (tree valtype, tree func ATTRIBUTE_UNUSED)
3878 {
3879 enum machine_mode mode;
3880
3881 mode = TYPE_MODE (valtype);
3882 switch (mode) {
3883 case SFmode:
3884 case DFmode:
3885 case XFmode:
3886 if (TARGET_68881)
3887 return gen_rtx_REG (mode, 16);
3888 break;
3889 default:
3890 break;
3891 }
3892
3893 /* If the function returns a pointer, push that into %a0. */
3894 if (func && POINTER_TYPE_P (TREE_TYPE (TREE_TYPE (func))))
3895 /* For compatibility with the large body of existing code which
3896 does not always properly declare external functions returning
3897 pointer types, the m68k/SVR4 convention is to copy the value
3898 returned for pointer functions from a0 to d0 in the function
3899 epilogue, so that callers that have neglected to properly
3900 declare the callee can still find the correct return value in
3901 d0. */
3902 return gen_rtx_PARALLEL
3903 (mode,
3904 gen_rtvec (2,
3905 gen_rtx_EXPR_LIST (VOIDmode,
3906 gen_rtx_REG (mode, A0_REG),
3907 const0_rtx),
3908 gen_rtx_EXPR_LIST (VOIDmode,
3909 gen_rtx_REG (mode, D0_REG),
3910 const0_rtx)));
3911 else if (POINTER_TYPE_P (valtype))
3912 return gen_rtx_REG (mode, A0_REG);
3913 else
3914 return gen_rtx_REG (mode, D0_REG);
3915 }